@lng2004/node-datachannel 0.31.0-20251228
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clang-format +17 -0
- package/.editorconfig +12 -0
- package/.eslintignore +8 -0
- package/.eslintrc.json +27 -0
- package/.gitmodules +3 -0
- package/.prettierignore +7 -0
- package/.prettierrc +13 -0
- package/API.md +247 -0
- package/BULDING.md +33 -0
- package/CMakeLists.txt +134 -0
- package/LICENSE +373 -0
- package/README.md +130 -0
- package/dist/cjs/index.cjs +11 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/lib/datachannel-stream.cjs +101 -0
- package/dist/cjs/lib/datachannel-stream.cjs.map +1 -0
- package/dist/cjs/lib/index.cjs +88 -0
- package/dist/cjs/lib/index.cjs.map +1 -0
- package/dist/cjs/lib/node-datachannel.cjs +8 -0
- package/dist/cjs/lib/node-datachannel.cjs.map +1 -0
- package/dist/cjs/lib/websocket-server.cjs +45 -0
- package/dist/cjs/lib/websocket-server.cjs.map +1 -0
- package/dist/cjs/lib/websocket.cjs +8 -0
- package/dist/cjs/lib/websocket.cjs.map +1 -0
- package/dist/cjs/polyfill/Events.cjs +86 -0
- package/dist/cjs/polyfill/Events.cjs.map +1 -0
- package/dist/cjs/polyfill/Exception.cjs +34 -0
- package/dist/cjs/polyfill/Exception.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCCertificate.cjs +34 -0
- package/dist/cjs/polyfill/RTCCertificate.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCDataChannel.cjs +214 -0
- package/dist/cjs/polyfill/RTCDataChannel.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCDtlsTransport.cjs +53 -0
- package/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCError.cjs +83 -0
- package/dist/cjs/polyfill/RTCError.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCIceCandidate.cjs +132 -0
- package/dist/cjs/polyfill/RTCIceCandidate.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCIceTransport.cjs +94 -0
- package/dist/cjs/polyfill/RTCIceTransport.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCPeerConnection.cjs +434 -0
- package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCSctpTransport.cjs +59 -0
- package/dist/cjs/polyfill/RTCSctpTransport.cjs.map +1 -0
- package/dist/cjs/polyfill/RTCSessionDescription.cjs +45 -0
- package/dist/cjs/polyfill/RTCSessionDescription.cjs.map +1 -0
- package/dist/cjs/polyfill/index.cjs +42 -0
- package/dist/cjs/polyfill/index.cjs.map +1 -0
- package/dist/esm/index.mjs +8 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/lib/datachannel-stream.mjs +78 -0
- package/dist/esm/lib/datachannel-stream.mjs.map +1 -0
- package/dist/esm/lib/index.mjs +62 -0
- package/dist/esm/lib/index.mjs.map +1 -0
- package/dist/esm/lib/node-datachannel.mjs +12 -0
- package/dist/esm/lib/node-datachannel.mjs.map +1 -0
- package/dist/esm/lib/websocket-server.mjs +43 -0
- package/dist/esm/lib/websocket-server.mjs.map +1 -0
- package/dist/esm/lib/websocket.mjs +6 -0
- package/dist/esm/lib/websocket.mjs.map +1 -0
- package/dist/esm/polyfill/Events.mjs +82 -0
- package/dist/esm/polyfill/Events.mjs.map +1 -0
- package/dist/esm/polyfill/Exception.mjs +28 -0
- package/dist/esm/polyfill/Exception.mjs.map +1 -0
- package/dist/esm/polyfill/RTCCertificate.mjs +30 -0
- package/dist/esm/polyfill/RTCCertificate.mjs.map +1 -0
- package/dist/esm/polyfill/RTCDataChannel.mjs +210 -0
- package/dist/esm/polyfill/RTCDataChannel.mjs.map +1 -0
- package/dist/esm/polyfill/RTCDtlsTransport.mjs +49 -0
- package/dist/esm/polyfill/RTCDtlsTransport.mjs.map +1 -0
- package/dist/esm/polyfill/RTCError.mjs +79 -0
- package/dist/esm/polyfill/RTCError.mjs.map +1 -0
- package/dist/esm/polyfill/RTCIceCandidate.mjs +128 -0
- package/dist/esm/polyfill/RTCIceCandidate.mjs.map +1 -0
- package/dist/esm/polyfill/RTCIceTransport.mjs +89 -0
- package/dist/esm/polyfill/RTCIceTransport.mjs.map +1 -0
- package/dist/esm/polyfill/RTCPeerConnection.mjs +430 -0
- package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -0
- package/dist/esm/polyfill/RTCSctpTransport.mjs +55 -0
- package/dist/esm/polyfill/RTCSctpTransport.mjs.map +1 -0
- package/dist/esm/polyfill/RTCSessionDescription.mjs +41 -0
- package/dist/esm/polyfill/RTCSessionDescription.mjs.map +1 -0
- package/dist/esm/polyfill/index.mjs +27 -0
- package/dist/esm/polyfill/index.mjs.map +1 -0
- package/dist/types/lib/datachannel-stream.d.ts +24 -0
- package/dist/types/lib/index.d.ts +235 -0
- package/dist/types/lib/types.d.ts +118 -0
- package/dist/types/lib/websocket-server.d.ts +13 -0
- package/dist/types/lib/websocket.d.ts +25 -0
- package/dist/types/polyfill/Events.d.ts +15 -0
- package/dist/types/polyfill/RTCCertificate.d.ts +9 -0
- package/dist/types/polyfill/RTCDataChannel.d.ts +29 -0
- package/dist/types/polyfill/RTCDtlsTransport.d.ts +15 -0
- package/dist/types/polyfill/RTCError.d.ts +17 -0
- package/dist/types/polyfill/RTCIceCandidate.d.ts +21 -0
- package/dist/types/polyfill/RTCIceTransport.d.ts +30 -0
- package/dist/types/polyfill/RTCPeerConnection.d.ts +64 -0
- package/dist/types/polyfill/RTCSctpTransport.d.ts +15 -0
- package/dist/types/polyfill/RTCSessionDescription.d.ts +10 -0
- package/dist/types/polyfill/index.d.ts +26 -0
- package/jest.config.ts +14 -0
- package/package.json +121 -0
- package/rollup.config.mjs +72 -0
- package/src/cpp/data-channel-wrapper.cpp +530 -0
- package/src/cpp/data-channel-wrapper.h +63 -0
- package/src/cpp/ice-udp-mux-listener-wrapper.cpp +157 -0
- package/src/cpp/ice-udp-mux-listener-wrapper.h +43 -0
- package/src/cpp/main.cpp +58 -0
- package/src/cpp/media-audio-wrapper.cpp +457 -0
- package/src/cpp/media-audio-wrapper.h +52 -0
- package/src/cpp/media-av1packetization.cpp +24 -0
- package/src/cpp/media-av1packetization.h +11 -0
- package/src/cpp/media-av1rtppacketizer-wrapper.cpp +126 -0
- package/src/cpp/media-av1rtppacketizer-wrapper.h +29 -0
- package/src/cpp/media-direction.cpp +43 -0
- package/src/cpp/media-direction.h +10 -0
- package/src/cpp/media-h264rtppacketizer-wrapper.cpp +126 -0
- package/src/cpp/media-h264rtppacketizer-wrapper.h +30 -0
- package/src/cpp/media-h265rtppacketizer-wrapper.cpp +126 -0
- package/src/cpp/media-h265rtppacketizer-wrapper.h +30 -0
- package/src/cpp/media-h26xseparator.cpp +32 -0
- package/src/cpp/media-h26xseparator.h +11 -0
- package/src/cpp/media-mediahandler-helper.cpp +31 -0
- package/src/cpp/media-mediahandler-helper.h +11 -0
- package/src/cpp/media-pacinghandler-wrapper.cpp +79 -0
- package/src/cpp/media-pacinghandler-wrapper.h +28 -0
- package/src/cpp/media-rtcpnackresponder-wrapper.cpp +68 -0
- package/src/cpp/media-rtcpnackresponder-wrapper.h +28 -0
- package/src/cpp/media-rtcpreceivingsession-wrapper.cpp +57 -0
- package/src/cpp/media-rtcpreceivingsession-wrapper.h +28 -0
- package/src/cpp/media-rtcpsrreporter-wrapper.cpp +93 -0
- package/src/cpp/media-rtcpsrreporter-wrapper.h +30 -0
- package/src/cpp/media-rtppacketizationconfig-wrapper.cpp +167 -0
- package/src/cpp/media-rtppacketizationconfig-wrapper.h +35 -0
- package/src/cpp/media-rtppacketizer-wrapper.cpp +95 -0
- package/src/cpp/media-rtppacketizer-wrapper.h +30 -0
- package/src/cpp/media-track-wrapper.cpp +458 -0
- package/src/cpp/media-track-wrapper.h +61 -0
- package/src/cpp/media-video-wrapper.cpp +526 -0
- package/src/cpp/media-video-wrapper.h +56 -0
- package/src/cpp/peer-connection-wrapper.cpp +1298 -0
- package/src/cpp/peer-connection-wrapper.h +89 -0
- package/src/cpp/rtc-wrapper.cpp +205 -0
- package/src/cpp/rtc-wrapper.h +24 -0
- package/src/cpp/thread-safe-callback.cpp +57 -0
- package/src/cpp/thread-safe-callback.h +47 -0
- package/src/cpp/web-socket-server-wrapper.cpp +275 -0
- package/src/cpp/web-socket-server-wrapper.h +41 -0
- package/src/cpp/web-socket-wrapper.cpp +796 -0
- package/src/cpp/web-socket-wrapper.h +63 -0
- package/src/index.ts +9 -0
- package/src/lib/datachannel-stream.ts +100 -0
- package/src/lib/index.ts +283 -0
- package/src/lib/node-datachannel.ts +3 -0
- package/src/lib/types.ts +168 -0
- package/src/lib/websocket-server.ts +37 -0
- package/src/lib/websocket.ts +26 -0
- package/src/polyfill/Events.ts +82 -0
- package/src/polyfill/Exception.ts +37 -0
- package/src/polyfill/README.md +41 -0
- package/src/polyfill/RTCCertificate.ts +21 -0
- package/src/polyfill/RTCDataChannel.ts +225 -0
- package/src/polyfill/RTCDtlsTransport.ts +46 -0
- package/src/polyfill/RTCError.ts +78 -0
- package/src/polyfill/RTCIceCandidate.ts +128 -0
- package/src/polyfill/RTCIceTransport.ts +90 -0
- package/src/polyfill/RTCPeerConnection.ts +527 -0
- package/src/polyfill/RTCSctpTransport.ts +51 -0
- package/src/polyfill/RTCSessionDescription.ts +41 -0
- package/src/polyfill/index.ts +38 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#ifndef MEDIA_AUDIO_WRAPPER_H
|
|
2
|
+
#define MEDIA_AUDIO_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
#include <unordered_set>
|
|
5
|
+
|
|
6
|
+
#include <napi.h>
|
|
7
|
+
#include <rtc/rtc.hpp>
|
|
8
|
+
|
|
9
|
+
class AudioWrapper : public Napi::ObjectWrap<AudioWrapper>
|
|
10
|
+
{
|
|
11
|
+
public:
|
|
12
|
+
static Napi::FunctionReference constructor;
|
|
13
|
+
static Napi::Object Init(Napi::Env env, Napi::Object exports);
|
|
14
|
+
AudioWrapper(const Napi::CallbackInfo &info);
|
|
15
|
+
~AudioWrapper();
|
|
16
|
+
|
|
17
|
+
rtc::Description::Audio getAudioInstance();
|
|
18
|
+
|
|
19
|
+
// Functions
|
|
20
|
+
void addAudioCodec(const Napi::CallbackInfo &info);
|
|
21
|
+
void addOpusCodec(const Napi::CallbackInfo &info);
|
|
22
|
+
|
|
23
|
+
// class Entry
|
|
24
|
+
Napi::Value direction(const Napi::CallbackInfo &info);
|
|
25
|
+
Napi::Value generateSdp(const Napi::CallbackInfo &info);
|
|
26
|
+
Napi::Value mid(const Napi::CallbackInfo &info);
|
|
27
|
+
void setDirection(const Napi::CallbackInfo &info);
|
|
28
|
+
|
|
29
|
+
// class Media
|
|
30
|
+
Napi::Value description(const Napi::CallbackInfo &info);
|
|
31
|
+
void removeFormat(const Napi::CallbackInfo &info);
|
|
32
|
+
void addSSRC(const Napi::CallbackInfo &info);
|
|
33
|
+
void removeSSRC(const Napi::CallbackInfo &info);
|
|
34
|
+
void replaceSSRC(const Napi::CallbackInfo &info);
|
|
35
|
+
Napi::Value hasSSRC(const Napi::CallbackInfo &info);
|
|
36
|
+
Napi::Value getSSRCs(const Napi::CallbackInfo &info);
|
|
37
|
+
Napi::Value getCNameForSsrc(const Napi::CallbackInfo &info);
|
|
38
|
+
void setBitrate(const Napi::CallbackInfo &info);
|
|
39
|
+
Napi::Value getBitrate(const Napi::CallbackInfo &info);
|
|
40
|
+
Napi::Value hasPayloadType(const Napi::CallbackInfo &info);
|
|
41
|
+
void addRTXCodec(const Napi::CallbackInfo &info);
|
|
42
|
+
void addRTPMap(const Napi::CallbackInfo &info);
|
|
43
|
+
void parseSdpLine(const Napi::CallbackInfo &info);
|
|
44
|
+
|
|
45
|
+
// Callbacks
|
|
46
|
+
|
|
47
|
+
private:
|
|
48
|
+
static std::unordered_set<AudioWrapper *> instances;
|
|
49
|
+
std::shared_ptr<rtc::Description::Audio> mAudioPtr = nullptr;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
#endif // MEDIA_AUDIO_WRAPPER_H
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#include "media-av1packetization.h"
|
|
2
|
+
|
|
3
|
+
using Packetization = rtc::AV1RtpPacketizer::Packetization;
|
|
4
|
+
|
|
5
|
+
std::optional<Packetization> strToPacketization(const std::string &packAsStr)
|
|
6
|
+
{
|
|
7
|
+
if (packAsStr == "Obu")
|
|
8
|
+
return Packetization::Obu;
|
|
9
|
+
if (packAsStr == "TemporalUnit")
|
|
10
|
+
return Packetization::TemporalUnit;
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
std::string packetizationToStr(rtc::AV1RtpPacketizer::Packetization pack)
|
|
15
|
+
{
|
|
16
|
+
switch (pack)
|
|
17
|
+
{
|
|
18
|
+
case Packetization::Obu:
|
|
19
|
+
return "Obu";
|
|
20
|
+
case Packetization::TemporalUnit:
|
|
21
|
+
return "TemporalUnit";
|
|
22
|
+
}
|
|
23
|
+
return "Unknown";
|
|
24
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#ifndef MEDIA_AV1PACKETIZATION_H
|
|
2
|
+
#define MEDIA_AV1PACKETIZATION_H
|
|
3
|
+
|
|
4
|
+
#include <napi.h>
|
|
5
|
+
#include <rtc/rtc.hpp>
|
|
6
|
+
#include <optional>
|
|
7
|
+
|
|
8
|
+
std::optional<rtc::AV1RtpPacketizer::Packetization> strToPacketization(const std::string &pktAsStr);
|
|
9
|
+
std::string packetizationToStr(rtc::AV1RtpPacketizer::Packetization pkt);
|
|
10
|
+
|
|
11
|
+
#endif // MEDIA_AV1PACKETIZATION_H
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#include "media-av1rtppacketizer-wrapper.h"
|
|
2
|
+
#include "media-av1packetization.h"
|
|
3
|
+
#include "media-rtppacketizationconfig-wrapper.h"
|
|
4
|
+
#include "media-mediahandler-helper.h"
|
|
5
|
+
|
|
6
|
+
Napi::FunctionReference AV1RtpPacketizerWrapper::constructor = Napi::FunctionReference();
|
|
7
|
+
|
|
8
|
+
Napi::Object AV1RtpPacketizerWrapper::Init(Napi::Env env, Napi::Object exports)
|
|
9
|
+
{
|
|
10
|
+
Napi::HandleScope scope(env);
|
|
11
|
+
|
|
12
|
+
Napi::Function func = Napi::ObjectWrap<AV1RtpPacketizerWrapper>::DefineClass(env, "AV1RtpPacketizer",
|
|
13
|
+
{
|
|
14
|
+
// Instance Methods
|
|
15
|
+
InstanceMethod("addToChain", &AV1RtpPacketizerWrapper::addToChain),
|
|
16
|
+
// Accessors
|
|
17
|
+
InstanceAccessor("rtpConfig", &AV1RtpPacketizerWrapper::getRtpPacketizationConfig, nullptr),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
|
|
21
|
+
if (constructor.IsEmpty())
|
|
22
|
+
{
|
|
23
|
+
constructor = Napi::Persistent(func);
|
|
24
|
+
constructor.SuppressDestruct();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.Set("AV1RtpPacketizer", func);
|
|
28
|
+
return exports;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
AV1RtpPacketizerWrapper::AV1RtpPacketizerWrapper(const Napi::CallbackInfo &info)
|
|
32
|
+
: Napi::ObjectWrap<AV1RtpPacketizerWrapper>(info)
|
|
33
|
+
{
|
|
34
|
+
Napi::Env env = info.Env();
|
|
35
|
+
|
|
36
|
+
if (info.Length() < 2)
|
|
37
|
+
{
|
|
38
|
+
Napi::Error::New(env, "Expected 2 or 3 parameters").ThrowAsJavaScriptException();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!info[0].IsString())
|
|
43
|
+
{
|
|
44
|
+
Napi::TypeError::New(env, "packetization must be \"Obu\" or \"TemporalUnit\"")
|
|
45
|
+
.ThrowAsJavaScriptException();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
auto packetizationOpt = strToPacketization(info[0].As<Napi::String>().Utf8Value());
|
|
49
|
+
if (!packetizationOpt.has_value())
|
|
50
|
+
{
|
|
51
|
+
Napi::TypeError::New(env, "packetization must be \"Obu\" or \"TemporalUnit\"")
|
|
52
|
+
.ThrowAsJavaScriptException();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
auto packetization = packetizationOpt.value();
|
|
56
|
+
|
|
57
|
+
if (!info[1].IsObject())
|
|
58
|
+
{
|
|
59
|
+
Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
auto obj = info[1].As<Napi::Object>();
|
|
63
|
+
if (!obj.InstanceOf(RtpPacketizationConfigWrapper::constructor.Value()))
|
|
64
|
+
{
|
|
65
|
+
Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// store original JS object so we can return it later
|
|
69
|
+
mRtpConfigObject = Napi::Persistent(obj);
|
|
70
|
+
mRtpConfigObject.SuppressDestruct();
|
|
71
|
+
auto rtpConfig = RtpPacketizationConfigWrapper::Unwrap(obj)->getConfigInstance();
|
|
72
|
+
|
|
73
|
+
size_t maxFragmentSize = rtc::RtpPacketizer::DefaultMaxFragmentSize;
|
|
74
|
+
if (info.Length() >= 3)
|
|
75
|
+
{
|
|
76
|
+
if (!info[2].IsNumber())
|
|
77
|
+
{
|
|
78
|
+
Napi::TypeError::New(env, "maxFragmentSize must be a number").ThrowAsJavaScriptException();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
maxFragmentSize = info[2].As<Napi::Number>().Uint32Value();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
mPacketizerPtr = std::make_unique<rtc::AV1RtpPacketizer>(packetization, rtpConfig, maxFragmentSize);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
AV1RtpPacketizerWrapper::~AV1RtpPacketizerWrapper()
|
|
88
|
+
{
|
|
89
|
+
mPacketizerPtr.reset();
|
|
90
|
+
mRtpConfigObject.Reset();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
std::shared_ptr<rtc::AV1RtpPacketizer> AV1RtpPacketizerWrapper::getPacketizerInstance() { return mPacketizerPtr; }
|
|
94
|
+
|
|
95
|
+
void AV1RtpPacketizerWrapper::addToChain(const Napi::CallbackInfo &info)
|
|
96
|
+
{
|
|
97
|
+
auto env = info.Env();
|
|
98
|
+
if (info.Length() < 1 || !info[0].IsObject())
|
|
99
|
+
{
|
|
100
|
+
Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
|
|
104
|
+
if (!mediaHandler)
|
|
105
|
+
{
|
|
106
|
+
Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
|
|
107
|
+
.ThrowAsJavaScriptException();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
mPacketizerPtr->addToChain(mediaHandler);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
Napi::Value AV1RtpPacketizerWrapper::getRtpPacketizationConfig(const Napi::CallbackInfo &info)
|
|
114
|
+
{
|
|
115
|
+
Napi::Env env = info.Env();
|
|
116
|
+
if (!mPacketizerPtr)
|
|
117
|
+
{
|
|
118
|
+
Napi::Error::New(env, "getRtpPacketizationConfig() called on destroyed packetizer").ThrowAsJavaScriptException();
|
|
119
|
+
return env.Null();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (mRtpConfigObject.IsEmpty())
|
|
123
|
+
return env.Null();
|
|
124
|
+
|
|
125
|
+
return mRtpConfigObject.Value();
|
|
126
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#ifndef MEDIA_AV1RTPPACKETIZER_WRAPPER_H
|
|
2
|
+
#define MEDIA_AV1RTPPACKETIZER_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <unordered_set>
|
|
6
|
+
|
|
7
|
+
#include <napi.h>
|
|
8
|
+
#include <rtc/rtc.hpp>
|
|
9
|
+
|
|
10
|
+
class AV1RtpPacketizerWrapper : public Napi::ObjectWrap<AV1RtpPacketizerWrapper>
|
|
11
|
+
{
|
|
12
|
+
public:
|
|
13
|
+
static Napi::FunctionReference constructor;
|
|
14
|
+
static Napi::Object Init(Napi::Env env, Napi::Object exports);
|
|
15
|
+
AV1RtpPacketizerWrapper(const Napi::CallbackInfo &info);
|
|
16
|
+
~AV1RtpPacketizerWrapper();
|
|
17
|
+
std::shared_ptr<rtc::AV1RtpPacketizer> getPacketizerInstance();
|
|
18
|
+
|
|
19
|
+
// Functions
|
|
20
|
+
Napi::Value getRtpPacketizationConfig(const Napi::CallbackInfo &info);
|
|
21
|
+
void addToChain(const Napi::CallbackInfo &info);
|
|
22
|
+
// Callbacks
|
|
23
|
+
|
|
24
|
+
private:
|
|
25
|
+
std::shared_ptr<rtc::AV1RtpPacketizer> mPacketizerPtr = nullptr;
|
|
26
|
+
Napi::ObjectReference mRtpConfigObject;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
#endif // MEDIA_AV1RTPPACKETIZER_WRAPPER_H
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#include "media-direction.h"
|
|
2
|
+
|
|
3
|
+
rtc::Description::Direction strToDirection(const std::string dirAsStr)
|
|
4
|
+
{
|
|
5
|
+
rtc::Description::Direction dir = rtc::Description::Direction::Unknown;
|
|
6
|
+
|
|
7
|
+
if (dirAsStr == "SendOnly")
|
|
8
|
+
dir = rtc::Description::Direction::SendOnly;
|
|
9
|
+
if (dirAsStr == "SendRecv")
|
|
10
|
+
dir = rtc::Description::Direction::SendRecv;
|
|
11
|
+
if (dirAsStr == "RecvOnly")
|
|
12
|
+
dir = rtc::Description::Direction::RecvOnly;
|
|
13
|
+
if (dirAsStr == "Inactive")
|
|
14
|
+
dir = rtc::Description::Direction::Inactive;
|
|
15
|
+
|
|
16
|
+
return dir;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
std::string directionToStr(rtc::Description::Direction dir)
|
|
20
|
+
{
|
|
21
|
+
std::string dirAsStr;
|
|
22
|
+
switch (dir)
|
|
23
|
+
{
|
|
24
|
+
case rtc::Description::Direction::Unknown:
|
|
25
|
+
dirAsStr = "Unknown";
|
|
26
|
+
break;
|
|
27
|
+
case rtc::Description::Direction::SendOnly:
|
|
28
|
+
dirAsStr = "SendOnly";
|
|
29
|
+
break;
|
|
30
|
+
case rtc::Description::Direction::RecvOnly:
|
|
31
|
+
dirAsStr = "RecvOnly";
|
|
32
|
+
break;
|
|
33
|
+
case rtc::Description::Direction::SendRecv:
|
|
34
|
+
dirAsStr = "SendRecv";
|
|
35
|
+
break;
|
|
36
|
+
case rtc::Description::Direction::Inactive:
|
|
37
|
+
dirAsStr = "Inactive";
|
|
38
|
+
break;
|
|
39
|
+
default:
|
|
40
|
+
dirAsStr = "UNKNOWN_DIR_TYPE";
|
|
41
|
+
}
|
|
42
|
+
return dirAsStr;
|
|
43
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#ifndef MEDIA_DIRECTION_H
|
|
2
|
+
#define MEDIA_DIRECTION_H
|
|
3
|
+
|
|
4
|
+
#include <napi.h>
|
|
5
|
+
#include <rtc/rtc.hpp>
|
|
6
|
+
|
|
7
|
+
rtc::Description::Direction strToDirection(const std::string dirAsStr);
|
|
8
|
+
std::string directionToStr(rtc::Description::Direction dir);
|
|
9
|
+
|
|
10
|
+
#endif // MEDIA_DIRECTION_H
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#include "media-h264rtppacketizer-wrapper.h"
|
|
2
|
+
#include "media-h26xseparator.h"
|
|
3
|
+
#include "media-rtppacketizationconfig-wrapper.h"
|
|
4
|
+
#include "media-mediahandler-helper.h"
|
|
5
|
+
|
|
6
|
+
Napi::FunctionReference H264RtpPacketizerWrapper::constructor = Napi::FunctionReference();
|
|
7
|
+
|
|
8
|
+
Napi::Object H264RtpPacketizerWrapper::Init(Napi::Env env, Napi::Object exports)
|
|
9
|
+
{
|
|
10
|
+
Napi::HandleScope scope(env);
|
|
11
|
+
|
|
12
|
+
Napi::Function func = Napi::ObjectWrap<H264RtpPacketizerWrapper>::DefineClass(env, "H264RtpPacketizer",
|
|
13
|
+
{
|
|
14
|
+
// Instance Methods
|
|
15
|
+
InstanceMethod("addToChain", &H264RtpPacketizerWrapper::addToChain),
|
|
16
|
+
// Accessors
|
|
17
|
+
InstanceAccessor("rtpConfig", &H264RtpPacketizerWrapper::getRtpPacketizationConfig, nullptr),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
|
|
21
|
+
if (constructor.IsEmpty())
|
|
22
|
+
{
|
|
23
|
+
constructor = Napi::Persistent(func);
|
|
24
|
+
constructor.SuppressDestruct();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.Set("H264RtpPacketizer", func);
|
|
28
|
+
return exports;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
H264RtpPacketizerWrapper::H264RtpPacketizerWrapper(const Napi::CallbackInfo &info)
|
|
32
|
+
: Napi::ObjectWrap<H264RtpPacketizerWrapper>(info)
|
|
33
|
+
{
|
|
34
|
+
Napi::Env env = info.Env();
|
|
35
|
+
|
|
36
|
+
if (info.Length() < 2)
|
|
37
|
+
{
|
|
38
|
+
Napi::Error::New(env, "Expected 2 or 3 parameters").ThrowAsJavaScriptException();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!info[0].IsString())
|
|
43
|
+
{
|
|
44
|
+
Napi::TypeError::New(env, "separator must be \"Length\", \"ShortStartSequence\", \"LongStartSequence\" or \"StartSequence\"")
|
|
45
|
+
.ThrowAsJavaScriptException();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
auto separatorOpt = strToSeparator(info[0].As<Napi::String>().Utf8Value());
|
|
49
|
+
if (!separatorOpt.has_value())
|
|
50
|
+
{
|
|
51
|
+
Napi::TypeError::New(env, "separator must be \"Length\", \"ShortStartSequence\", \"LongStartSequence\" or \"StartSequence\"")
|
|
52
|
+
.ThrowAsJavaScriptException();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
auto separator = separatorOpt.value();
|
|
56
|
+
|
|
57
|
+
if (!info[1].IsObject())
|
|
58
|
+
{
|
|
59
|
+
Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
auto obj = info[1].As<Napi::Object>();
|
|
63
|
+
if (!obj.InstanceOf(RtpPacketizationConfigWrapper::constructor.Value()))
|
|
64
|
+
{
|
|
65
|
+
Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// store original JS object so we can return it later
|
|
69
|
+
mRtpConfigObject = Napi::Persistent(obj);
|
|
70
|
+
mRtpConfigObject.SuppressDestruct();
|
|
71
|
+
auto rtpConfig = RtpPacketizationConfigWrapper::Unwrap(obj)->getConfigInstance();
|
|
72
|
+
|
|
73
|
+
size_t maxFragmentSize = rtc::RtpPacketizer::DefaultMaxFragmentSize;
|
|
74
|
+
if (info.Length() >= 3)
|
|
75
|
+
{
|
|
76
|
+
if (!info[2].IsNumber())
|
|
77
|
+
{
|
|
78
|
+
Napi::TypeError::New(env, "maxFragmentSize must be a number").ThrowAsJavaScriptException();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
maxFragmentSize = info[2].As<Napi::Number>().Uint32Value();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
mPacketizerPtr = std::make_unique<rtc::H264RtpPacketizer>(separator, rtpConfig, maxFragmentSize);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
H264RtpPacketizerWrapper::~H264RtpPacketizerWrapper()
|
|
88
|
+
{
|
|
89
|
+
mPacketizerPtr.reset();
|
|
90
|
+
mRtpConfigObject.Reset();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
std::shared_ptr<rtc::H264RtpPacketizer> H264RtpPacketizerWrapper::getPacketizerInstance() { return mPacketizerPtr; }
|
|
94
|
+
|
|
95
|
+
void H264RtpPacketizerWrapper::addToChain(const Napi::CallbackInfo &info)
|
|
96
|
+
{
|
|
97
|
+
auto env = info.Env();
|
|
98
|
+
if (info.Length() < 1 || !info[0].IsObject())
|
|
99
|
+
{
|
|
100
|
+
Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
|
|
104
|
+
if (!mediaHandler)
|
|
105
|
+
{
|
|
106
|
+
Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
|
|
107
|
+
.ThrowAsJavaScriptException();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
mPacketizerPtr->addToChain(mediaHandler);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
Napi::Value H264RtpPacketizerWrapper::getRtpPacketizationConfig(const Napi::CallbackInfo &info)
|
|
114
|
+
{
|
|
115
|
+
Napi::Env env = info.Env();
|
|
116
|
+
if (!mPacketizerPtr)
|
|
117
|
+
{
|
|
118
|
+
Napi::Error::New(env, "getRtpPacketizationConfig() called on destroyed packetizer").ThrowAsJavaScriptException();
|
|
119
|
+
return env.Null();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (mRtpConfigObject.IsEmpty())
|
|
123
|
+
return env.Null();
|
|
124
|
+
|
|
125
|
+
return mRtpConfigObject.Value();
|
|
126
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#ifndef MEDIA_H264RTPPACKETIZER_WRAPPER_H
|
|
2
|
+
#define MEDIA_H264RTPPACKETIZER_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <unordered_set>
|
|
6
|
+
|
|
7
|
+
#include <napi.h>
|
|
8
|
+
#include <rtc/rtc.hpp>
|
|
9
|
+
|
|
10
|
+
class H264RtpPacketizerWrapper : public Napi::ObjectWrap<H264RtpPacketizerWrapper>
|
|
11
|
+
{
|
|
12
|
+
public:
|
|
13
|
+
static Napi::FunctionReference constructor;
|
|
14
|
+
static Napi::Object Init(Napi::Env env, Napi::Object exports);
|
|
15
|
+
H264RtpPacketizerWrapper(const Napi::CallbackInfo &info);
|
|
16
|
+
~H264RtpPacketizerWrapper();
|
|
17
|
+
std::shared_ptr<rtc::H264RtpPacketizer> getPacketizerInstance();
|
|
18
|
+
|
|
19
|
+
// Functions
|
|
20
|
+
Napi::Value getRtpPacketizationConfig(const Napi::CallbackInfo &info);
|
|
21
|
+
void addToChain(const Napi::CallbackInfo &info);
|
|
22
|
+
|
|
23
|
+
// Callbacks
|
|
24
|
+
|
|
25
|
+
private:
|
|
26
|
+
std::shared_ptr<rtc::H264RtpPacketizer> mPacketizerPtr = nullptr;
|
|
27
|
+
Napi::ObjectReference mRtpConfigObject;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
#endif // MEDIA_H264RTPPACKETIZER_WRAPPER_H
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#include "media-h265rtppacketizer-wrapper.h"
|
|
2
|
+
#include "media-h26xseparator.h"
|
|
3
|
+
#include "media-rtppacketizationconfig-wrapper.h"
|
|
4
|
+
#include "media-mediahandler-helper.h"
|
|
5
|
+
|
|
6
|
+
Napi::FunctionReference H265RtpPacketizerWrapper::constructor = Napi::FunctionReference();
|
|
7
|
+
|
|
8
|
+
Napi::Object H265RtpPacketizerWrapper::Init(Napi::Env env, Napi::Object exports)
|
|
9
|
+
{
|
|
10
|
+
Napi::HandleScope scope(env);
|
|
11
|
+
|
|
12
|
+
Napi::Function func = Napi::ObjectWrap<H265RtpPacketizerWrapper>::DefineClass(env, "H265RtpPacketizer",
|
|
13
|
+
{
|
|
14
|
+
// Instance Methods
|
|
15
|
+
InstanceMethod("addToChain", &H265RtpPacketizerWrapper::addToChain),
|
|
16
|
+
// Accessors
|
|
17
|
+
InstanceAccessor("rtpConfig", &H265RtpPacketizerWrapper::getRtpPacketizationConfig, nullptr),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
|
|
21
|
+
if (constructor.IsEmpty())
|
|
22
|
+
{
|
|
23
|
+
constructor = Napi::Persistent(func);
|
|
24
|
+
constructor.SuppressDestruct();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.Set("H265RtpPacketizer", func);
|
|
28
|
+
return exports;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
H265RtpPacketizerWrapper::H265RtpPacketizerWrapper(const Napi::CallbackInfo &info)
|
|
32
|
+
: Napi::ObjectWrap<H265RtpPacketizerWrapper>(info)
|
|
33
|
+
{
|
|
34
|
+
Napi::Env env = info.Env();
|
|
35
|
+
|
|
36
|
+
if (info.Length() < 2)
|
|
37
|
+
{
|
|
38
|
+
Napi::Error::New(env, "Expected 2 or 3 parameters").ThrowAsJavaScriptException();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!info[0].IsString())
|
|
43
|
+
{
|
|
44
|
+
Napi::TypeError::New(env, "separator must be \"Length\", \"ShortStartSequence\", \"LongStartSequence\" or \"StartSequence\"")
|
|
45
|
+
.ThrowAsJavaScriptException();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
auto separatorOpt = strToSeparator(info[0].As<Napi::String>().Utf8Value());
|
|
49
|
+
if (!separatorOpt.has_value())
|
|
50
|
+
{
|
|
51
|
+
Napi::TypeError::New(env, "separator must be \"Length\", \"ShortStartSequence\", \"LongStartSequence\" or \"StartSequence\"")
|
|
52
|
+
.ThrowAsJavaScriptException();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
auto separator = separatorOpt.value();
|
|
56
|
+
|
|
57
|
+
if (!info[1].IsObject())
|
|
58
|
+
{
|
|
59
|
+
Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
auto obj = info[1].As<Napi::Object>();
|
|
63
|
+
if (!obj.InstanceOf(RtpPacketizationConfigWrapper::constructor.Value()))
|
|
64
|
+
{
|
|
65
|
+
Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// store original JS object so we can return it later
|
|
69
|
+
mRtpConfigObject = Napi::Persistent(obj);
|
|
70
|
+
mRtpConfigObject.SuppressDestruct();
|
|
71
|
+
auto rtpConfig = RtpPacketizationConfigWrapper::Unwrap(obj)->getConfigInstance();
|
|
72
|
+
|
|
73
|
+
size_t maxFragmentSize = rtc::RtpPacketizer::DefaultMaxFragmentSize;
|
|
74
|
+
if (info.Length() >= 3)
|
|
75
|
+
{
|
|
76
|
+
if (!info[2].IsNumber())
|
|
77
|
+
{
|
|
78
|
+
Napi::TypeError::New(env, "maxFragmentSize must be a number").ThrowAsJavaScriptException();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
maxFragmentSize = info[2].As<Napi::Number>().Uint32Value();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
mPacketizerPtr = std::make_unique<rtc::H265RtpPacketizer>(separator, rtpConfig, maxFragmentSize);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
H265RtpPacketizerWrapper::~H265RtpPacketizerWrapper()
|
|
88
|
+
{
|
|
89
|
+
mPacketizerPtr.reset();
|
|
90
|
+
mRtpConfigObject.Reset();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
std::shared_ptr<rtc::H265RtpPacketizer> H265RtpPacketizerWrapper::getPacketizerInstance() { return mPacketizerPtr; }
|
|
94
|
+
|
|
95
|
+
void H265RtpPacketizerWrapper::addToChain(const Napi::CallbackInfo &info)
|
|
96
|
+
{
|
|
97
|
+
auto env = info.Env();
|
|
98
|
+
if (info.Length() < 1 || !info[0].IsObject())
|
|
99
|
+
{
|
|
100
|
+
Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
|
|
104
|
+
if (!mediaHandler)
|
|
105
|
+
{
|
|
106
|
+
Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
|
|
107
|
+
.ThrowAsJavaScriptException();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
mPacketizerPtr->addToChain(mediaHandler);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
Napi::Value H265RtpPacketizerWrapper::getRtpPacketizationConfig(const Napi::CallbackInfo &info)
|
|
114
|
+
{
|
|
115
|
+
Napi::Env env = info.Env();
|
|
116
|
+
if (!mPacketizerPtr)
|
|
117
|
+
{
|
|
118
|
+
Napi::Error::New(env, "getRtpPacketizationConfig() called on destroyed packetizer").ThrowAsJavaScriptException();
|
|
119
|
+
return env.Null();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (mRtpConfigObject.IsEmpty())
|
|
123
|
+
return env.Null();
|
|
124
|
+
|
|
125
|
+
return mRtpConfigObject.Value();
|
|
126
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#ifndef MEDIA_H265RTPPACKETIZER_WRAPPER_H
|
|
2
|
+
#define MEDIA_H265RTPPACKETIZER_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <unordered_set>
|
|
6
|
+
|
|
7
|
+
#include <napi.h>
|
|
8
|
+
#include <rtc/rtc.hpp>
|
|
9
|
+
|
|
10
|
+
class H265RtpPacketizerWrapper : public Napi::ObjectWrap<H265RtpPacketizerWrapper>
|
|
11
|
+
{
|
|
12
|
+
public:
|
|
13
|
+
static Napi::FunctionReference constructor;
|
|
14
|
+
static Napi::Object Init(Napi::Env env, Napi::Object exports);
|
|
15
|
+
H265RtpPacketizerWrapper(const Napi::CallbackInfo &info);
|
|
16
|
+
~H265RtpPacketizerWrapper();
|
|
17
|
+
std::shared_ptr<rtc::H265RtpPacketizer> getPacketizerInstance();
|
|
18
|
+
|
|
19
|
+
// Functions
|
|
20
|
+
Napi::Value getRtpPacketizationConfig(const Napi::CallbackInfo &info);
|
|
21
|
+
void addToChain(const Napi::CallbackInfo &info);
|
|
22
|
+
|
|
23
|
+
// Callbacks
|
|
24
|
+
|
|
25
|
+
private:
|
|
26
|
+
std::shared_ptr<rtc::H265RtpPacketizer> mPacketizerPtr = nullptr;
|
|
27
|
+
Napi::ObjectReference mRtpConfigObject;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
#endif // MEDIA_H265RTPPACKETIZER_WRAPPER_H
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#include "media-h26xseparator.h"
|
|
2
|
+
|
|
3
|
+
using Separator = rtc::NalUnit::Separator;
|
|
4
|
+
|
|
5
|
+
std::optional<Separator> strToSeparator(const std::string &sepAsStr)
|
|
6
|
+
{
|
|
7
|
+
if (sepAsStr == "Length")
|
|
8
|
+
return Separator::Length;
|
|
9
|
+
if (sepAsStr == "ShortStartSequence")
|
|
10
|
+
return Separator::ShortStartSequence;
|
|
11
|
+
if (sepAsStr == "LongStartSequence")
|
|
12
|
+
return Separator::LongStartSequence;
|
|
13
|
+
if (sepAsStr == "StartSequence")
|
|
14
|
+
return Separator::StartSequence;
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
std::string separatorToStr(rtc::NalUnit::Separator sep)
|
|
19
|
+
{
|
|
20
|
+
switch (sep)
|
|
21
|
+
{
|
|
22
|
+
case Separator::Length:
|
|
23
|
+
return "Length";
|
|
24
|
+
case Separator::ShortStartSequence:
|
|
25
|
+
return "ShortStartSequence";
|
|
26
|
+
case Separator::LongStartSequence:
|
|
27
|
+
return "LongStartSequence";
|
|
28
|
+
case Separator::StartSequence:
|
|
29
|
+
return "StartSequence";
|
|
30
|
+
}
|
|
31
|
+
return "Unknown";
|
|
32
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#ifndef MEDIA_H26XSEPARATOR_H
|
|
2
|
+
#define MEDIA_H26XSEPARATOR_H
|
|
3
|
+
|
|
4
|
+
#include <napi.h>
|
|
5
|
+
#include <rtc/rtc.hpp>
|
|
6
|
+
#include <optional>
|
|
7
|
+
|
|
8
|
+
std::optional<rtc::NalUnit::Separator> strToSeparator(const std::string &sepAsStr);
|
|
9
|
+
std::string separatorToStr(rtc::NalUnit::Separator sep);
|
|
10
|
+
|
|
11
|
+
#endif // MEDIA_H26XSEPARATOR_H
|