Skip to content

Commit e2ca57f

Browse files
committed
feat: Add support for getCapabilities/setCodecPreferences.
1 parent 06f44bf commit e2ca57f

File tree

5 files changed

+98
-2
lines changed

5 files changed

+98
-2
lines changed

lib/src/factory_impl.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
import 'dart:async';
22
import 'dart:convert';
33
import 'dart:html' as html;
4+
import 'package:js/js.dart';
45
import 'package:webrtc_interface/webrtc_interface.dart';
56

67
import 'media_recorder_impl.dart';
78
import 'media_stream_impl.dart';
89
import 'navigator_impl.dart';
910
import 'rtc_peerconnection_impl.dart';
11+
import 'rtc_rtp_capailities_imp.dart';
12+
13+
@JS('RTCRtpSender')
14+
@anonymous
15+
class RTCRtpSenderJs {
16+
external static Object getCapabilities(String kind);
17+
}
18+
19+
@JS('RTCRtpReceiver')
20+
@anonymous
21+
class RTCRtpReceiverJs {
22+
external static Object getCapabilities(String kind);
23+
}
1024

1125
class RTCFactoryWeb extends RTCFactory {
1226
RTCFactoryWeb._internal();
@@ -47,6 +61,18 @@ class RTCFactoryWeb extends RTCFactory {
4761

4862
@override
4963
Navigator get navigator => NavigatorWeb();
64+
65+
@override
66+
Future<RTCRtpCapabilities> getRtpReceiverCapabilities(String kind) async {
67+
var caps = RTCRtpReceiverJs.getCapabilities(kind);
68+
return RTCRtpCapabilitiesWeb.fromJsObject(caps);
69+
}
70+
71+
@override
72+
Future<RTCRtpCapabilities> getRtpSenderCapabilities(String kind) async {
73+
var caps = RTCRtpSenderJs.getCapabilities(kind);
74+
return RTCRtpCapabilitiesWeb.fromJsObject(caps);
75+
}
5076
}
5177

5278
Future<RTCPeerConnection> createPeerConnection(
@@ -60,6 +86,14 @@ Future<MediaStream> createLocalMediaStream(String label) {
6086
return RTCFactoryWeb.instance.createLocalMediaStream(label);
6187
}
6288

89+
Future<RTCRtpCapabilities> getRtpReceiverCapabilities(String kind) async {
90+
return RTCFactoryWeb.instance.getRtpReceiverCapabilities(kind);
91+
}
92+
93+
Future<RTCRtpCapabilities> getRtpSenderCapabilities(String kind) async {
94+
return RTCFactoryWeb.instance.getRtpSenderCapabilities(kind);
95+
}
96+
6397
MediaRecorder mediaRecorder() {
6498
return RTCFactoryWeb.instance.mediaRecorder();
6599
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'dart:js_util' as jsutil;
2+
import 'package:webrtc_interface/webrtc_interface.dart';
3+
4+
class RTCRtpCapabilitiesWeb {
5+
static RTCRtpCapabilities fromJsObject(Object object) {
6+
return RTCRtpCapabilities.fromMap({
7+
'codecs': jsutil.dartify(jsutil.getProperty(object, 'codecs')),
8+
'headerExtensions':
9+
jsutil.dartify(jsutil.getProperty(object, 'headerExtensions')),
10+
'fecMechanisms':
11+
jsutil.dartify(jsutil.getProperty(object, 'fecMechanisms')) ?? []
12+
});
13+
}
14+
}

lib/src/rtc_rtp_transceiver_impl.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async';
22
import 'dart:js_util' as jsutil;
33

4+
import 'package:webrtc_interface/src/rtc_rtp_capabilities.dart';
45
import 'package:webrtc_interface/webrtc_interface.dart';
56

67
import 'media_stream_impl.dart';
@@ -53,6 +54,8 @@ extension RTCRtpTransceiverInitWebExt on RTCRtpTransceiverInit {
5354
});
5455
}
5556

57+
58+
5659
class RTCRtpTransceiverWeb extends RTCRtpTransceiver {
5760
RTCRtpTransceiverWeb(this._jsTransceiver, _peerConnectionId);
5861

@@ -109,4 +112,14 @@ class RTCRtpTransceiverWeb extends RTCRtpTransceiver {
109112
throw 'Unable to RTCRtpTransceiver::stop: ${e..toString()}';
110113
}
111114
}
115+
116+
@override
117+
Future<void> setCodecPreferences(List<RTCRtpCodecCapability> codecs) async {
118+
try {
119+
jsutil.callMethod(_jsTransceiver, 'setCodecPreferences',
120+
[jsutil.jsify(codecs.map((e) => e.toMap()).toList())]);
121+
} on Exception catch (e) {
122+
throw 'Unable to RTCRtpTransceiver::setCodecPreferences: ${e..toString()}';
123+
}
124+
}
112125
}

pubspec.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ environment:
77
sdk: '>=2.13.0 <3.0.0'
88

99
dependencies:
10+
js: ^0.6.4
1011
platform_detect: ^2.0.7
11-
webrtc_interface: ^1.0.10
12+
webrtc_interface: ^1.0.11
13+
1214

1315
dev_dependencies:
1416
build_runner: ^1.10.0

web/main.dart

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,20 @@ void loopBackTest() async {
2929
var remotelVideo = RTCVideoElement();
3030
remote!.append(remotelVideo.htmlElement);
3131

32+
var acaps = await getRtpSenderCapabilities('audio');
33+
print('sender audio capabilities: ${acaps.toMap()}');
34+
35+
var vcaps = await getRtpSenderCapabilities('video');
36+
print('sender video capabilities: ${vcaps.toMap()}');
37+
/*
38+
capabilities = await getRtpReceiverCapabilities('audio');
39+
print('receiver audio capabilities: ${capabilities.toMap()}');
40+
41+
capabilities = await getRtpReceiverCapabilities('video');
42+
print('receiver video capabilities: ${capabilities.toMap()}');
43+
*/
3244
var pc2 = await createPeerConnection({});
33-
pc2.onTrack = (event) {
45+
pc2.onTrack = (event) async {
3446
if (event.track.kind == 'video') {
3547
remotelVideo.srcObject = event.streams[0];
3648
}
@@ -81,6 +93,27 @@ void loopBackTest() async {
8193
await pc1.addTrack(track, stream);
8294
});
8395

96+
var transceivers = await pc1.getTransceivers();
97+
transceivers.forEach((transceiver) {
98+
print('transceiver: ${transceiver.sender.track!.kind!}');
99+
if (transceiver.sender.track!.kind! == 'video') {
100+
transceiver.setCodecPreferences([
101+
RTCRtpCodecCapability(
102+
mimeType: 'video/AV1',
103+
clockRate: 90000,
104+
)
105+
]);
106+
} else if (transceiver.sender.track!.kind! == 'audio') {
107+
transceiver.setCodecPreferences([
108+
RTCRtpCodecCapability(
109+
mimeType: 'audio/PCMA',
110+
clockRate: 8000,
111+
channels: 1,
112+
)
113+
]);
114+
}
115+
});
116+
84117
var offer = await pc1.createOffer();
85118

86119
await pc2.addTransceiver(

0 commit comments

Comments
 (0)