8000 Fix bug for web. · next-coder/flutter-webrtc@b031ec4 · GitHub
[go: up one dir, main page]

Skip to content

Commit b031ec4

Browse files
committed
Fix bug for web.
1 parent 1d9f144 commit b031ec4

9 files changed

+181
-42
lines changed

example/lib/src/loopback_sample.dart

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class _MyAppState extends State<LoopBackSample> {
4242

4343
void handleStatsReport(Timer timer) async {
4444
if (_peerConnection != null) {
45+
/*
4546
var reports = await _peerConnection.getStats();
4647
reports.forEach((report) {
4748
print('report => { ');
@@ -55,13 +56,17 @@ class _MyAppState extends State<LoopBackSample> {
5556
print(' }');
5657
print('}');
5758
});
59+
*/
5860
/*
5961
var senders = await _peerConnection.getSenders();
60-
print(senders.toString());
62+
var canInsertDTMF = await senders[0].dtmfSender.canInsertDtmf();
63+
print(canInsertDTMF);
64+
await senders[0].dtmfSender.insertDTMF('1');
6165
var receivers = await _peerConnection.getReceivers();
62-
print(receivers.toString());
66+
print(receivers[0].track.id);
6367
var transceivers = await _peerConnection.getTransceivers();
64-
print(transceivers.toString());
68+
print(transceivers[0].sender.parameters);
69+
print(transceivers[0].receiver.parameters);
6570
*/
6671
}
6772
}
@@ -186,14 +191,15 @@ class _MyAppState extends State<LoopBackSample> {
186191
direction: TransceiverDirection.SendRecv, streams: [_localStream]),
187192
);
188193

194+
/*
189195
// ignore: unused_local_variable
190196
var transceiver = await _peerConnection.addTransceiver(
191197
track: _localStream.getVideoTracks()[0],
192198
init: RTCRtpTransceiverInit(
193199
direction: TransceiverDirection.SendRecv, streams: [_localStream]),
194200
);
201+
*/
195202

196-
/*
197203
// Unified-Plan Simulcast
198204
await _peerConnection.addTransceiver(
199205
track: _localStream.getVideoTracks()[0],
@@ -221,7 +227,7 @@ class _MyAppState extends State<LoopBackSample> {
221227
),
222228
],
223229
));
224-
230+
/*
225231
await _peerConnection.addTransceiver(
226232
kind: RTCRtpMediaType.RTCRtpMediaTypeVideo);
227233
await _peerConnection.addTransceiver(

lib/src/interface/rtc_dtmf_sender.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ abstract class RTCDTMFSender {
1717
Future<void> sendDtmf(String tones,
1818
{int duration = 100, int interToneGap = 70}) =>
1919
insertDTMF(tones, duration: duration, interToneGap: interToneGap);
20+
21+
Future<bool> canInsertDtmf();
2022
}

lib/src/interface/rtc_rtp_parameters.dart

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class RTCRtpEncoding {
104104
Map<String, dynamic> toMap() {
105105
return {
106106
if (rid != null) 'rid': rid,
107-
if (active != null) 'active': active,
107+
'active': active ?? true,
108108
if (maxBitrate != null) 'maxBitrate': maxBitrate,
109109
if (maxFramerate != null) 'maxFramerate': maxFramerate,
110110
if (minBitrate != null) 'minBitrate': minBitrate,
@@ -142,8 +142,12 @@ class RTCHeaderExtension {
142142
}
143143

144144
class RTCRtpParameters {
145-
RTCRtpParameters(this.transactionId, this.rtcp, this.headerExtensions,
146-
this.encodings, this.codecs);
145+
RTCRtpParameters(
146+
{this.transactionId,
147+
this.rtcp,
148+
this.headerExtensions,
149+
this.encodings,
150+
this.codecs});
147151

148152
factory RTCRtpParameters.fromMap(Map<dynamic, dynamic> map) {
149153
var encodings = <RTCRtpEncoding>[];
@@ -163,7 +167,11 @@ class RTCRtpParameters {
163167
});
164168
var rtcp = RTCRTCPParameters.fromMap(map['rtcp']);
165169
return RTCRtpParameters(
166-
map['transactionId'], rtcp, headerExtensions, encodings, codecs);
170+
transactionId: map['transactionId'],
171+
rtcp: rtcp,
172+
headerExtensions: headerExtensions,
173+
encodings: encodings,
174+
codecs: codecs);
167175
}
168176

169177
String transactionId;

lib/src/native/rtc_dtmf_sender_impl.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,12 @@ class RTCDTMFSenderNative extends RTCDTMFSender {
1919
'gap': interToneGap,
2020
});
2121
}
22+
23+
@override
24+
Future<bool> canInsertDtmf() async {
25+
return await _channel.invokeMethod('canInsertDtmf', <String, dynamic>{
26+
'peerConnectionId': _peerConnectionId,
27+
'rtpSenderId': _rtpSenderId
28+
});
29+
}
2230
}

lib/src/web/rtc_dtmf_sender_impl.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,9 @@ class RTCDTMFSenderWeb extends RTCDTMFSender {
1111
{int duration = 100, int interToneGap = 70}) async {
1212
return _jsDtmfSender.insertDtmf(tones, duration, interToneGap);
1313
}
14+
15+
@override
16+
Future<bool> canInsertDtmf() async {
17+
return _jsDtmfSender.canInsertDtmf;
18+
}
1419
}

lib/src/web/rtc_peerconnection_impl.dart

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -298,23 +298,37 @@ class RTCPeerConnectionWeb extends RTCPeerConnection {
298298
}
299299

300300
@override
301-
Future<List<RTCRtpSender>> getSenders() {
302-
var senders = jsutil.getProperty(_jsPc, 'senders');
303-
return senders.map((e) => RTCRtpSenderWeb.fromJsSender(e)).toList();
301+
Future<List<RTCRtpSender>> getSenders() async {
302+
var senders = jsutil.callMethod(_jsPc, 'getSenders', []);
303+
var list = <RTCRtpSender>[];
304+
senders.forEach((e) {
305+
list.add(RTCRtpSenderWeb.fromJsSender(e));
306+
});
307+
return list;
304308
}
305309

306310
@override
307-
Future<List<RTCRtpReceiver>> getReceivers() {
308-
var receivers = jsutil.getProperty(_jsPc, 'receivers');
309-
return receivers.map((e) => RTCRtpReceiverWeb(e)).toList();
311+
Future<List<RTCRtpReceiver>> getReceivers() async {
312+
var receivers = jsutil.callMethod(_jsPc, 'getReceivers', []);
313+
314+
var list = <RTCRtpReceiver>[];
315+
receivers.forEach((e) {
316+
list.add(RTCRtpReceiverWeb(e));
317+
});
318+
319+
return list;
310320
}
311321

312322
@override
313-
Future<List<RTCRtpTransceiver>> getTransceivers() {
314-
var transceivers = jsutil.getProperty(_jsPc, 'transceivers');
315-
return transceivers
316-
.map((e) => RTCRtpTransceiverWeb.fromJsObject(e))
317-
.toList();
323+
Future<List<RTCRtpTransceiver>> getTransceivers() async {
324+
var transceivers = jsutil.callMethod(_jsPc, 'getTransceivers', []);
325+
326+
var list = <RTCRtpTransceiver>[];
327+
transceivers.forEach((e) {
328+
list.add(RTCRtpTransceiverWeb.fromJsObject(e));
329+
});
330+
331+
return list;
318332
}
319333

320334
//'audio|video', { 'direction': 'recvonly|sendonly|sendrecv' }
Lines changed: 90 additions & 0 deletions
< 10000 tr class="diff-line-row">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import 'dart:js_util' as jsutil;
2+
import '../interface/rtc_rtcp_parameters.dart';
3+
import '../interface/rtc_rtp_parameters.dart';
4+
5+
class RTCRtpParametersWeb {
6+
static RTCRtpParameters fromJsObject(Object object) {
7+
return RTCRtpParameters(
8+
transactionId: jsutil.getProperty(object, 'transactionId'),
9+
rtcp: RTCRTCPParametersWeb.fromJsObject(
10+
jsutil.getProperty(object, 'rtcp')),
11+
headerExtensions: headerExtensionsFromJsObject(object),
12+
encodings: encodingsFromJsObject(object),
13+
codecs: codecsFromJsObject(object));
14+
}
15+
16+
static List<RTCHeaderExtension> headerExtensionsFromJsObject(Object object) {
17+
var headerExtensions = jsutil.getProperty(object, 'headerExtensions');
18+
var list = <RTCHeaderExtension>[];
19+
headerExtensions.forEach((e) {
20+
list.add(RTCHeaderExtensionWeb.fromJsObject(e));
21+
});
22+
return list;
23+
}
24+
25+
static List<RTCRtpEncoding> encodingsFromJsObject(Object object) {
26+
var encodings = jsutil.getProperty(object, 'encodings');
27+
var list = <RTCRtpEncoding>[];
28+
encodings.forEach((e) {
29+
list.add(RTCRtpEncodingWeb.fromJsObject(e));
30+
});
31+
return list;
32+
}
33+
34+
static List<RTCRTPCodec> codecsFromJsObject(Object object) {
35+
var encodings = jsutil.getProperty(object, 'codecs');
36+
var list = <RTCRTPCodec>[];
37+
encodings.forEach((e) {
38+
list.add(RTCRTPCodecWeb.fromJsObject(e));
39+
});
40+
return list;
41+
}
42+
}
43+
44+
class RTCRTCPParametersWeb {
45+
static RTCRTCPParameters fromJsObject(Object object) {
46+
return RTCRTCPParameters.fromMap({
47+
'cname': jsutil.getProperty(object, 'cname'),
48+
'reducedSize': jsutil.getProperty(object, 'reducedSize')
49+
});
50+
}
51+
}
52+
53+
class RTCHeaderExtensionWeb {
54+
static RTCHeaderExtension fromJsObject(Object object) {
55+
return RTCHeaderExtension.fromMap({
56+
'uri': jsutil.getProperty(object, 'uri'),
57+
'id': jsutil.getProperty(object, 'id'),
58+
'encrypted': jsutil.getProperty(object, 'encrypted')
59+
});
60+
}
61+
}
62+
63+
class RTCRtpEncodingWeb {
64+
static RTCRtpEncoding fromJsObject(Object object) {
65+
return RTCRtpEncoding.fromMap({
66+
'rid': jsutil.getProperty(object, 'rid'),
67+
'active': jsutil.getProperty(object, 'active'),
68+
'maxBitrate': jsutil.getProperty(object, 'maxBitrate'),
69+
'maxFramerate': jsutil.getProperty(object, 'maxFramerate'),
70+
'minBitrate': jsutil.getProperty(object, 'minBitrate'),
71+
'numTemporalLayers': jsutil.getProperty(object, 'numTemporalLayers'),
72+
'scaleResolutionDownBy':
73+
jsutil.getProperty(object, 'scaleResolutionDownBy'),
74+
'ssrc': jsutil.getProperty(object, 'ssrc')
75+
});
76+
}
77+
}
78+
79+
class RTCRTPCodecWeb {
80+
static RTCRTPCodec fromJsObject(Object object) {
81+
return RTCRTPCodec.fromMap({
82+
'payloadType': jsutil.getProperty(object, 'payloadType'),
83+
'name': jsutil.getProperty(object, 'name'),
84+
'kind': jsutil.getProperty(object, 'kind'),
85+
'clockRate': jsutil.getProperty(object, 'clockRate'),
86+
'numChannels': jsutil.getProperty(object, 'numChannels'),
87+
'parameters': jsutil.getProperty(object, 'parameters')
88+
});
89+
}
90+
}

lib/src/web/rtc_rtp_receiver_impl.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import '../interface/media_stream_track.dart';
44
import '../interface/rtc_rtp_parameters.dart';
55
import '../interface/rtc_rtp_receiver.dart';
66
import 'media_stream_track_impl.dart';
7+
import 'rtc_rtp_parameters_impl.dart';
78

89
class RTCRtpReceiverWeb extends RTCRtpReceiver {
910
RTCRtpReceiverWeb(this._jsRtpReceiver);
@@ -15,8 +16,10 @@ class RTCRtpReceiverWeb extends RTCRtpReceiver {
1516
/// but this API also applies them to receivers, similar to ORTC:
1617
/// http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*.
1718
@override
18-
RTCRtpParameters get parameters => RTCRtpParameters.fromMap(
19-
jsutil.callMethod(_jsRtpReceiver, 'getParameters', []));
19+
RTCRtpParameters get parameters {
20+
var parameters = jsutil.callMethod(_jsRtpReceiver, 'getParameters', []);
21+
return RTCRtpParametersWeb.fromJsObject(parameters);
22+
}
2023

2124
@override
2225
MediaStreamTrack get track =>

lib/src/web/rtc_rtp_sender_impl.dart

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async';
2-
2+
import 'dart:html';
33
import 'dart:js_util' as jsutil;
4+
45
import 'package:flutter/services.dart';
56

67
import '../interface/media_stream_track.dart';
@@ -9,31 +10,18 @@ import '../interface/rtc_rtp_parameters.dart';
910
import '../interface/rtc_rtp_sender.dart';
1011
import 'media_stream_track_impl.dart';
1112
import 'rtc_dtmf_sender_impl.dart';
13+
import 'rtc_rtp_parameters_impl.dart';
1214

1315
class RTCRtpSenderWeb extends RTCRtpSender {
1416
RTCRtpSenderWeb(this._jsRtpSender, this._ownsTrack);
1517

16-
factory RTCRtpSenderWeb.fromJsSender(Object jsRtpSender) {
17-
return RTCRtpSenderWeb(
18-
jsRtpSender, jsutil.getProperty(jsRtpSender, 'track') != null);
18+
factory RTCRtpSenderWeb.fromJsSender(RtcRtpSender jsRtpSender) {
19+
return RTCRtpSenderWeb(jsRtpSender, jsRtpSender.track != null);
1920
}
2021

21-
Object _jsRtpSender;
22+
RtcRtpSender _jsRtpSender;
2223
bool _ownsTrack = false;
2324

24-
Object get jsSender => _jsRtpSender;
25-
26-
@override
27-
Future<bool> setParameters(RTCRtpParameters parameters) async {
28-
try {
29-
var jsParameters = jsutil.callMethod(_jsRtpSender, 'getParameters', []);
30-
return await jsutil.promiseToFuture<bool>(jsutil.callMethod(
31-
_jsRtpSender, 'setParameters', [jsutil.jsify(jsParameters)]));
32-
} on PlatformException catch (e) {
33-
throw 'Unable to RTCRtpSender::setParameters: ${e.message}';
34-
}
35-
}
36-
3725
@override
3826
Future<void> replaceTrack(MediaStreamTrack track) async {
3927
try {
@@ -56,8 +44,23 @@ class RTCRtpSenderWeb extends RTCRtpSender {
5644
}
5745

5846
@override
59-
RTCRtpParameters get parameters => RTCRtpParameters.fromMap(
60-
jsutil.callMethod(_jsRtpSender, 'getParameters', []));
47+
RTCRtpParameters get parameters {
48+
var parameters = jsutil.callMethod(_jsRtpSender, 'getParameters', []);
49+
return RTCRtpParametersWeb.fromJsObject(parameters);
50+
}
51+
52+
@override
53+
Future<bool> setParameters(RTCRtpParameters parameters) async {
54+
try {
55+
var oldParameters = jsutil.callMethod(_jsRtpSender, 'getParameters', []);
56+
jsutil.setProperty(oldParameters, 'encodings',
57+
jsutil.jsify(parameters.encodings.map((e) => e.toMap()).toList()));
58+
return await jsutil.promiseToFuture<bool>(
59+
jsutil.callMethod(_jsRtpSender, 'setParameters', [oldParameters]));
60+
} on PlatformException catch (e) {
61+
throw 'Unable to RTCRtpSender::setParameters: ${e.message}';
62+
}
63+
}
6164

6265
@override
6366
MediaStreamTrack get track =>

0 commit comments

Comments
 (0)
0