Skip to content

Commit e0e929c

Browse files
committed
Add setParameters support
1 parent 06d995e commit e0e929c

16 files changed

+219
-29
lines changed

CHANGELOG.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,24 @@ New Features
66

77
- Updated to WebRTC M79.
88
- Added support for Node 13.
9-
- Added support for `sendEncodings` to RTCRtpEncodingParameters, including
10-
`rid`, `ssrc`, `codecPayloadType`, `dtx`, `active`, `ptime`, `maxBitrate`,
11-
`maxFramerate`, and `scaleResolutionDownBy`.
12-
- Added support for `setStreams` to RTCRtpSender. At this time, up to one
13-
MediaStream argument is supported.
14-
- Added support for `restartIce` to RTCPeerConnection.
15-
- Added support for the "icecandidateerror" event to RTCPeerConnection.
16-
- Added support for `getRemoteCertificates` to RTCDtlsTransport.
9+
- Added support for a number of new standard APIs (see below).
10+
11+
### RTCPeerConnection
12+
13+
- Added support for `restartIce`.
14+
- Added support for "icecandidateerror" events.
15+
16+
### RTCDtlsTransport
17+
18+
- Added support for `getRemoteCertificates`.
19+
20+
### RTCRtpSender, RTCRtpReceiver & RTCRtpTransceiver
21+
1722
- Added support for `getCapabilities` to RTCRtpSender and RTCRtpReceiver.
23+
- Added support for `setParameters` to RTCRtpSender.
24+
- Added support for `setStreams` to RTCRtpSender (at this time, up to one
25+
MediaStream argument is supported).
26+
- Added support for `sendEncodings` to RTCRtpTransceiverInit.
1827
- Added support for `setCodecPreferences` to RTCRtpTransceiver.
1928

2029
0.4.2

src/dictionaries/webrtc/rtcp_parameters.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
#include <node-addon-api/napi.h>
88
#include <webrtc/api/rtp_parameters.h>
99

10+
#include "src/converters/object.h"
1011
#include "src/dictionaries/macros/napi.h"
12+
#include "src/functional/curry.h"
13+
#include "src/functional/operators.h"
1114
#include "src/functional/validation.h"
1215

1316
namespace node_webrtc {
@@ -24,4 +27,21 @@ TO_NAPI_IMPL(webrtc::RtcpParameters, pair) {
2427
return Pure(scope.Escape(object));
2528
}
2629

30+
static webrtc::RtcpParameters NapiToRtcpParameters(
31+
std::string cname,
32+
bool reducedSize) {
33+
webrtc::RtcpParameters parameters;
34+
parameters.cname = cname;
35+
parameters.reduced_size = reducedSize;
36+
return parameters;
37+
}
38+
39+
FROM_NAPI_IMPL(webrtc::RtcpParameters, value) {
40+
return From<Napi::Object>(value).FlatMap<webrtc::RtcpParameters>([](auto object) {
41+
return curry(NapiToRtcpParameters)
42+
% GetOptional<std::string>(object, "cname", "")
43+
* GetOptional<bool>(object, "reducedSize", false);
44+
});
45+
}
46+
2747
} // namespace node_webrtc

src/dictionaries/webrtc/rtcp_parameters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ namespace webrtc { struct RtcpParameters; }
66

77
namespace node_webrtc {
88

9-
DECLARE_TO_NAPI(webrtc::RtcpParameters)
9+
DECLARE_TO_AND_FROM_NAPI(webrtc::RtcpParameters)
1010

1111
} // namespace node_webrtc

src/dictionaries/webrtc/rtp_codec_parameters.cc

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
#include <node-addon-api/napi.h>
1111
#include <webrtc/api/rtp_parameters.h>
1212

13+
#include "src/converters.h"
14+
#include "src/converters/object.h"
1315
#include "src/dictionaries/macros/napi.h"
16+
#include "src/functional/curry.h"
17+
#include "src/functional/maybe.h"
18+
#include "src/functional/operators.h"
1419
#include "src/functional/validation.h"
1520

1621
namespace node_webrtc {
@@ -43,4 +48,48 @@ TO_NAPI_IMPL(webrtc::RtpCodecParameters, pair) {
4348
return Pure(scope.Escape(object));
4449
}
4550

51+
static webrtc::RtpCodecParameters NapiToRtpCodecParameters(
52+
const uint8_t payloadType,
53+
const std::string mimeType,
54+
const uint64_t clockRate,
55+
node_webrtc::Maybe<uint8_t> channels,
56+
node_webrtc::Maybe<std::string> maybeSdpFmtpLine) {
57+
webrtc::RtpCodecParameters result;
58+
auto indexOfSlash = mimeType.find("/");
59+
auto kindString = mimeType.substr(0, indexOfSlash);
60+
auto nameString = mimeType.substr(indexOfSlash + 1);
61+
result.kind = kindString == "audio" ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO;
62+
result.name = nameString;
63+
result.payload_type = payloadType;
64+
result.clock_rate = clockRate;
65+
if (channels.IsJust()) {
66+
result.num_channels = channels.UnsafeFromJust();
67+
}
68+
if (maybeSdpFmtpLine.IsJust()) {
69+
auto sdpFmtpLine = maybeSdpFmtpLine.UnsafeFromJust() + ";";
70+
size_t pos = 0;
71+
std::string keyValue;
72+
while ((pos = sdpFmtpLine.find(";")) != std::string::npos) {
73+
keyValue = sdpFmtpLine.substr(0, pos);
74+
sdpFmtpLine.erase(0, pos + 1);
75+
auto indexOfEquals = keyValue.find("=");
76+
auto key = keyValue.substr(0, indexOfEquals);
77+
auto value = keyValue.substr(indexOfEquals + 1);
78+
result.parameters[key] = value;
79+
}
80+
}
81+
return result;
82+
}
83+
84+
FROM_NAPI_IMPL(webrtc::RtpCodecParameters, value) {
85+
return From<Napi::Object>(value).FlatMap<webrtc::RtpCodecParameters>([](auto object) {
86+
return curry(NapiToRtpCodecParameters)
87+
% GetRequired<uint8_t>(object, "payloadType")
88+
* GetRequired<std::string>(object, "mimeType")
89+
* GetRequired<uint64_t>(object, "clockRate")
90+
* GetOptional<uint8_t>(object, "channels")
91+
* GetOptional<std::string>(object, "sdpFmtpLine");
92+
});
93+
}
94+
4695
} // namespace node_webrtc

src/dictionaries/webrtc/rtp_codec_parameters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ namespace webrtc { struct RtpCodecParameters; }
66

77
namespace node_webrtc {
88

9-
DECLARE_TO_NAPI(webrtc::RtpCodecParameters)
9+
DECLARE_TO_AND_FROM_NAPI(webrtc::RtpCodecParameters)
1010

1111
} // namespace node_webrtc

src/dictionaries/webrtc/rtp_encoding_parameters.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
#include <webrtc/api/rtp_parameters.h>
88

9+
#include "src/converters.h"
10+
#include "src/converters/absl.h"
11+
#include "src/converters/object.h"
12+
#include "src/dictionaries/macros/napi.h"
913
#include "src/enums/node_webrtc/rtc_dtx_status.h"
1014
#include "src/enums/node_webrtc/rtc_priority_type.h"
1115
#include "src/functional/maybe.h"
@@ -71,6 +75,24 @@ static Validation<webrtc::RtpEncodingParameters> RTP_ENCODING_PARAMETERS_FN(
7175
return Pure(parameters);
7276
}
7377

78+
TO_NAPI_IMPL(webrtc::RtpEncodingParameters, pair) {
79+
auto env = pair.first;
80+
Napi::EscapableHandleScope scope(env);
81+
auto parameters = pair.second;
82+
NODE_WEBRTC_CREATE_OBJECT_OR_RETURN(env, object)
83+
if (!parameters.rid.empty()) {
84+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "rid", parameters.rid)
85+
}
86+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "active", parameters.active)
87+
if (parameters.max_bitrate_bps) {
88+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "maxBitrate", parameters.max_bitrate_bps)
89+
}
90+
if (parameters.scale_resolution_down_by) {
91+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "scaleResolutionDownBy", parameters.scale_resolution_down_by)
92+
}
93+
return Pure(scope.Escape(object));
94+
}
95+
7496
} // namespace node_webrtc
7597

7698
#define DICT(X) RTP_ENCODING_PARAMETERS ## X

src/dictionaries/webrtc/rtp_header_extension_parameters.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
#include <node-addon-api/napi.h>
66
#include <webrtc/api/rtp_parameters.h>
77

8+
#include "src/converters/object.h"
89
#include "src/dictionaries/macros/napi.h"
10+
#include "src/functional/curry.h"
11+
#include "src/functional/operators.h"
912
#include "src/functional/validation.h"
1013

1114
namespace node_webrtc {
@@ -17,7 +20,28 @@ TO_NAPI_IMPL(webrtc::RtpHeaderExtensionParameters, pair) {
1720
NODE_WEBRTC_CREATE_OBJECT_OR_RETURN(env, object)
1821
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "uri", params.uri)
1922
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "id", params.id)
23+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "encrypted", params.encrypt)
2024
return Pure(scope.Escape(object));
2125
}
2226

27+
static webrtc::RtpHeaderExtensionParameters NapiToRtpHeaderExtensionParameters(
28+
std::string uri,
29+
int id,
30+
bool encrypted) {
31+
webrtc::RtpHeaderExtensionParameters parameters;
32+
parameters.uri = uri;
33+
parameters.id = id;
34+
parameters.encrypt = encrypted;
35+
return parameters;
36+
}
37+
38+
FROM_NAPI_IMPL(webrtc::RtpHeaderExtensionParameters, value) {
39+
return From<Napi::Object>(value).FlatMap<webrtc::RtpHeaderExtensionParameters>([](auto object) {
40+
return curry(NapiToRtpHeaderExtensionParameters)
41+
% GetRequired<std::string>(object, "uri")
42+
* GetRequired<uint8_t>(object, "id")
43+
* GetOptional<bool>(object, "encrypted", false);
44+
});
45+
}
46+
2347
} // namespace node_webrtc

src/dictionaries/webrtc/rtp_header_extension_parameters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ namespace webrtc { typedef RtpExtension RtpHeaderExtensionParameters; }
77

88
namespace node_webrtc {
99

10-
DECLARE_TO_NAPI(webrtc::RtpHeaderExtensionParameters)
10+
DECLARE_TO_AND_FROM_NAPI(webrtc::RtpHeaderExtensionParameters)
1111

1212
} // namespace node_webrtc

src/dictionaries/webrtc/rtp_parameters.cc

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,64 @@
22

33
#include <webrtc/api/rtp_parameters.h>
44

5+
#include "src/converters/object.h"
6+
#include "src/enums/webrtc/degradation_preference.h"
57
#include "src/dictionaries/macros/napi.h"
68
#include "src/dictionaries/webrtc/rtcp_parameters.h"
79
#include "src/dictionaries/webrtc/rtp_codec_parameters.h"
10+
#include "src/dictionaries/webrtc/rtp_encoding_parameters.h"
811
#include "src/dictionaries/webrtc/rtp_header_extension_parameters.h"
912
#include "src/functional/curry.h"
1013
#include "src/functional/operators.h"
1114
#include "src/functional/validation.h"
1215

1316
namespace node_webrtc {
1417

15-
static Validation<Napi::Value> CreateRtpParameters(Napi::Value headerExtensions, Napi::Value codecs, Napi::Value rtcp) {
16-
auto env = headerExtensions.Env();
18+
TO_NAPI_IMPL(webrtc::RtpParameters, pair) {
19+
auto env = pair.first;
20+
auto parameters = pair.second;
1721
Napi::EscapableHandleScope scope(env);
1822
NODE_WEBRTC_CREATE_OBJECT_OR_RETURN(env, object)
19-
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "headerExtensions", headerExtensions)
20-
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "codecs", codecs)
21-
// NOTE(mroberts): Unsupported at this time.
22-
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "encodings", std::vector<bool>())
23-
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "rtcp", rtcp)
23+
if (!parameters.transaction_id.empty()) {
24+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "transactionId", parameters.transaction_id)
25+
}
26+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "headerExtensions", parameters.header_extensions)
27+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "codecs", parameters.codecs)
28+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "rtcp", parameters.rtcp)
29+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "encodings", parameters.encodings)
30+
if (parameters.degradation_preference != webrtc::DegradationPreference::BALANCED) {
31+
NODE_WEBRTC_CONVERT_AND_SET_OR_RETURN(env, object, "degradationPreference", parameters.degradation_preference)
32+
}
2433
return Pure(scope.Escape(object));
2534
}
2635

27-
TO_NAPI_IMPL(webrtc::RtpParameters, pair) {
28-
return Validation<Napi::Value>::Join(curry(CreateRtpParameters)
29-
% From<Napi::Value>(std::make_pair(pair.first, pair.second.header_extensions))
30-
* From<Napi::Value>(std::make_pair(pair.first, pair.second.codecs))
31-
* From<Napi::Value>(std::make_pair(pair.first, pair.second.rtcp)));
36+
static webrtc::RtpParameters NapiToRtpParameters(
37+
std::string transactionId,
38+
std::vector<webrtc::RtpHeaderExtensionParameters> headerExtensions,
39+
webrtc::RtcpParameters rtcp,
40+
std::vector<webrtc::RtpCodecParameters> codecs,
41+
std::vector<webrtc::RtpEncodingParameters> encodings,
42+
webrtc::DegradationPreference degradationPreference) {
43+
webrtc::RtpParameters parameters;
44+
parameters.transaction_id = transactionId;
45+
parameters.header_extensions = headerExtensions;
46+
parameters.rtcp = rtcp;
47+
parameters.codecs = codecs;
48+
parameters.encodings = encodings;
49+
parameters.degradation_preference = degradationPreference;
50+
return parameters;
51+
}
52+
53+
FROM_NAPI_IMPL(webrtc::RtpParameters, value) {
54+
return From<Napi::Object>(value).FlatMap<webrtc::RtpParameters>([](auto object) {
55+
return curry(NapiToRtpParameters)
56+
% GetRequired<std::string>(object, "transactionId")
57+
* GetRequired<std::vector<webrtc::RtpHeaderExtensionParameters>>(object, "headerExtensions")
58+
* GetRequired<webrtc::RtcpParameters>(object, "rtcp")
59+
* GetRequired<std::vector<webrtc::RtpCodecParameters>>(object, "codecs")
60+
* GetRequired<std::vector<webrtc::RtpEncodingParameters>>(object, "encodings")
61+
* GetOptional<webrtc::DegradationPreference>(object, "degradationPreference", webrtc::DegradationPreference::BALANCED);
62+
});
3263
}
3364

3465
} // namespace node_webrtc

src/dictionaries/webrtc/rtp_parameters.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ namespace webrtc { struct RtpParameters; }
66

77
namespace node_webrtc {
88

9-
DECLARE_TO_NAPI(webrtc::RtpParameters)
9+
DECLARE_TO_AND_FROM_NAPI(webrtc::RtpParameters)
1010

1111
} // namespace node_webrtc
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "src/enums/webrtc/degradation_preference.h"
2+
3+
#define ENUM(X) DEGRADATON_PREFERENCE ## X
4+
#include "src/enums/macros/impls.h"
5+
#undef ENUM
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include <webrtc/api/rtp_parameters.h>
4+
5+
// IWYU pragma: no_include "src/enums/macros/impls.h"
6+
7+
#define DEGRADATON_PREFERENCE webrtc::DegradationPreference
8+
#define DEGRADATON_PREFERENCE_NAME "RTCDegradationPreference"
9+
#define DEGRADATON_PREFERENCE_LIST \
10+
ENUM_UNSUPPORTED(DEGRADATON_PREFERENCE::DISABLED, "disabled", "\"disabled\" is not a valid RTCDegradationPreference") \
11+
ENUM_SUPPORTED(DEGRADATON_PREFERENCE::MAINTAIN_FRAMERATE, "maintain-framerate") \
12+
ENUM_SUPPORTED(DEGRADATON_PREFERENCE::MAINTAIN_RESOLUTION, "maintain-resolution") \
13+
ENUM_SUPPORTED(DEGRADATON_PREFERENCE::BALANCED, "balanced")
14+
15+
#define ENUM(X) DEGRADATON_PREFERENCE ## X
16+
#include "src/enums/macros/decls.h"
17+
#undef ENUM

src/interfaces/rtc_peer_connection/peer_connection_factory.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ PeerConnectionFactory::PeerConnectionFactory(const Napi::CallbackInfo& info)
8888
nullptr);
8989
assert(_factory);
9090

91+
webrtc::PeerConnectionFactoryInterface::Options options;
92+
options.network_ignore_mask = 0;
93+
_factory->SetOptions(options);
94+
9195
_networkManager = std::unique_ptr<rtc::NetworkManager>(new rtc::BasicNetworkManager());
9296
assert(_networkManager != nullptr);
9397

src/interfaces/rtc_rtp_sender.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
*/
88
#include "src/interfaces/rtc_rtp_sender.h"
99

10+
#include <webrtc/api/rtp_parameters.h>
11+
1012
#include "src/converters.h"
1113
#include "src/converters/arguments.h"
1214
#include "src/converters/interfaces.h"
1315
#include "src/converters/null.h"
16+
#include "src/dictionaries/webrtc/rtc_error.h"
1417
#include "src/dictionaries/webrtc/rtp_capabilities.h"
1518
#include "src/dictionaries/webrtc/rtp_parameters.h"
1619
#include "src/enums/webrtc/media_type.h"
@@ -93,7 +96,14 @@ Napi::Value RTCRtpSender::GetParameters(const Napi::CallbackInfo& info) {
9396

9497
Napi::Value RTCRtpSender::SetParameters(const Napi::CallbackInfo& info) {
9598
CREATE_DEFERRED(info.Env(), deffered)
96-
Reject(deferred, Napi::Error::New(info.Env(), "Not yet implemented; file a feature request against node-webrtc"));
99+
CONVERT_ARGS_OR_REJECT_AND_RETURN_NAPI(deferred, info, parameters, webrtc::RtpParameters)
100+
auto error = _sender->SetParameters(parameters);
101+
if (error.ok()) {
102+
deferred.Resolve(info.Env().Undefined());
103+
} else {
104+
CONVERT_OR_REJECT_AND_RETURN_NAPI(deferred, &error, reason, Napi::Value)
105+
deferred.Reject(reason);
106+
}
97107
return deferred.Promise();
98108
}
99109

test/rtcrtpreceiver.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ tape('applying a remote offer and then applying a local answer causes .getParame
208208
channels: 1
209209
}
210210
],
211-
encodings: []
211+
encodings: [{ active: true }]
212212
}, 'the audio RTCRtpReceiver\'s .getParameters() returns the expected RTCRtpParameters');
213213
compareParameters(t, receivers[1].getParameters(), {
214214
headerExtensions: [],
@@ -225,7 +225,7 @@ tape('applying a remote offer and then applying a local answer causes .getParame
225225
sdpFmtpLine: 'a=fmtp:121 profile-id=0'
226226
}
227227
],
228-
encodings: []
228+
encodings: [{ active: true }]
229229
}, 'the video RTCRtpReceiver\'s .getParameters() returns the expected RTCRtpParameters');
230230
pc.close();
231231
t.end();

0 commit comments

Comments
 (0)