From 6c9a62d31ec81fec7725493de529f5eb9f56fe71 Mon Sep 17 00:00:00 2001 From: "duanweiwei1982@gmail.com" Date: Fri, 20 Jan 2023 13:48:06 +0800 Subject: [PATCH 1/8] feat: Add RTCRtpCapabilities interface. --- lib/src/rtc_rtp_capabilities.dart | 23 +++++++++++++++++++++++ lib/src/rtc_rtp_receiver.dart | 3 +++ lib/src/rtc_rtp_sender.dart | 4 ++++ lib/src/rtc_rtp_transceiver.dart | 3 +++ 4 files changed, 33 insertions(+) create mode 100644 lib/src/rtc_rtp_capabilities.dart diff --git a/lib/src/rtc_rtp_capabilities.dart b/lib/src/rtc_rtp_capabilities.dart new file mode 100644 index 0000000..9ca5ccf --- /dev/null +++ b/lib/src/rtc_rtp_capabilities.dart @@ -0,0 +1,23 @@ +class RTCRtpCodecCapability { + RTCRtpCodecCapability( + {this.channels, + required this.clockRate, + required this.mimeType, + this.sdpFmtpLine}); + num? channels; + num clockRate; + String mimeType; + String? sdpFmtpLine; +} + +class RTCRtpHeaderExtensionCapability { + RTCRtpHeaderExtensionCapability(this.uri); + String uri; +} + +class RTCRtpCapabilities { + RTCRtpCapabilities({this.codecs, this.headerExtensions, this.fecMechanisms}); + List? codecs; + List? headerExtensions; + List? fecMechanisms; +} diff --git a/lib/src/rtc_rtp_receiver.dart b/lib/src/rtc_rtp_receiver.dart index 3241537..b1a5e3e 100644 --- a/lib/src/rtc_rtp_receiver.dart +++ b/lib/src/rtc_rtp_receiver.dart @@ -1,5 +1,6 @@ import 'enums.dart'; import 'media_stream_track.dart'; +import 'rtc_rtp_capabilities.dart'; import 'rtc_rtp_parameters.dart'; import 'rtc_stats_report.dart'; @@ -17,6 +18,8 @@ abstract class RTCRtpReceiver { /// http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*. RTCRtpParameters get parameters; + Future getCapabilities(); + MediaStreamTrack? get track; String get receiverId; diff --git a/lib/src/rtc_rtp_sender.dart b/lib/src/rtc_rtp_sender.dart index 9fade5a..14ef425 100644 --- a/lib/src/rtc_rtp_sender.dart +++ b/lib/src/rtc_rtp_sender.dart @@ -1,5 +1,7 @@ import 'dart:async'; +import 'package:webrtc_interface/src/rtc_rtp_capabilities.dart'; + import 'media_stream_track.dart'; import 'rtc_dtmf_sender.dart'; import 'rtc_rtp_parameters.dart'; @@ -16,6 +18,8 @@ abstract class RTCRtpSender { Future> getStats(); + Future getCapabilities(); + RTCRtpParameters get parameters; MediaStreamTrack? get track; diff --git a/lib/src/rtc_rtp_transceiver.dart b/lib/src/rtc_rtp_transceiver.dart index 6e36824..2f0727b 100644 --- a/lib/src/rtc_rtp_transceiver.dart +++ b/lib/src/rtc_rtp_transceiver.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'enums.dart'; import 'media_stream.dart'; +import 'rtc_rtp_capabilities.dart'; import 'rtc_rtp_parameters.dart'; import 'rtc_rtp_receiver.dart'; import 'rtc_rtp_sender.dart'; @@ -30,6 +31,8 @@ abstract class RTCRtpTransceiver { Future getDirection(); + Future setCodecPreferences(List codecs); + String get mid; RTCRtpSender get sender; From 684bde26f7709091471d3310e810c492708879f7 Mon Sep 17 00:00:00 2001 From: "duanweiwei1982@gmail.com" Date: Fri, 20 Jan 2023 15:40:18 +0800 Subject: [PATCH 2/8] Add scalabilityMode to RTCRtpEncoding. --- lib/src/rtc_rtp_parameters.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/src/rtc_rtp_parameters.dart b/lib/src/rtc_rtp_parameters.dart index ecb511d..41d3300 100644 --- a/lib/src/rtc_rtp_parameters.dart +++ b/lib/src/rtc_rtp_parameters.dart @@ -58,6 +58,7 @@ class RTCRtpEncoding { this.numTemporalLayers = 1, this.scaleResolutionDownBy = 1.0, this.ssrc, + this.scalabilityMode, }); factory RTCRtpEncoding.fromMap(Map map) => RTCRtpEncoding( @@ -69,6 +70,7 @@ class RTCRtpEncoding { numTemporalLayers: map['numTemporalLayers'], scaleResolutionDownBy: map['scaleResolutionDownBy'], ssrc: map['ssrc'], + scalabilityMode: map['scalabilityMode'], ); /// If non-null, this represents the RID that identifies this encoding layer. @@ -101,6 +103,8 @@ class RTCRtpEncoding { /// Can't be changed between getParameters/setParameters. int? ssrc; + String? scalabilityMode; + Map toMap() => { 'active': active, if (rid != null) 'rid': rid, @@ -110,6 +114,7 @@ class RTCRtpEncoding { if (numTemporalLayers != null) 'numTemporalLayers': numTemporalLayers, if (scaleResolutionDownBy != null) 'scaleResolutionDownBy': scaleResolutionDownBy, + if (scalabilityMode != null) 'scalabilityMode': scalabilityMode, if (ssrc != null) 'ssrc': ssrc, }; } From 0a64f334eb0c5a1371165a37352b8d3648b3a02f Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 30 Jan 2023 12:47:21 +0800 Subject: [PATCH 3/8] bump version. --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 522d448..9cc8489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog -------------------------------------------- +[1.0.11] - 2023-01-30 + +* Add RTCRtpCapabilities interface. + [1.0.10] - 2022-11-12 * Change MediaStream.clone to async. diff --git a/pubspec.yaml b/pubspec.yaml index a98dd85..46ccbe3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: webrtc_interface description: WebRTC Interface for Dart-Web/Flutter. -version: 1.0.10 +version: 1.0.11 homepage: https://flutter-webrtc.org environment: From c082ac3151869bc129cc467c4858412c928d7f5d Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 30 Jan 2023 13:02:00 +0800 Subject: [PATCH 4/8] chore: add fromMap/toMap. --- lib/src/rtc_rtp_capabilities.dart | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/lib/src/rtc_rtp_capabilities.dart b/lib/src/rtc_rtp_capabilities.dart index 9ca5ccf..d8aa392 100644 --- a/lib/src/rtc_rtp_capabilities.dart +++ b/lib/src/rtc_rtp_capabilities.dart @@ -4,20 +4,73 @@ class RTCRtpCodecCapability { required this.clockRate, required this.mimeType, this.sdpFmtpLine}); + factory RTCRtpCodecCapability.fromMap(Map map) { + return RTCRtpCodecCapability( + channels: map['channels'], + clockRate: map['clockRate'], + mimeType: map['mimeType'], + sdpFmtpLine: map['sdpFmtpLine'], + ); + } num? channels; num clockRate; String mimeType; String? sdpFmtpLine; + Map toMap() { + return { + 'channels': channels, + 'clockRate': clockRate, + 'mimeType': mimeType, + if (sdpFmtpLine != null) 'sdpFmtpLine': sdpFmtpLine, + }; + } } class RTCRtpHeaderExtensionCapability { RTCRtpHeaderExtensionCapability(this.uri); + factory RTCRtpHeaderExtensionCapability.fromMap(Map map) { + return RTCRtpHeaderExtensionCapability(map['uri']); + } String uri; + Map toMap() { + return { + 'uri': uri, + }; + } } class RTCRtpCapabilities { RTCRtpCapabilities({this.codecs, this.headerExtensions, this.fecMechanisms}); + factory RTCRtpCapabilities.fromMap(Map map) { + var codecs = []; + dynamic codecsMap = map['codecs']; + codecsMap.forEach((params) { + codecs.add(RTCRtpCodecCapability.fromMap(params)); + }); + var headerExtensions = []; + dynamic headerExtensionsMap = map['headerExtensions']; + headerExtensionsMap.forEach((params) { + headerExtensions.add(RTCRtpHeaderExtensionCapability.fromMap(params)); + }); + var fecMechanisms = []; + dynamic fecMechanismsMap = map['fecMechanisms']; + fecMechanismsMap.forEach((params) { + fecMechanisms.add(params); + }); + return RTCRtpCapabilities( + codecs: codecs, + headerExtensions: headerExtensions, + fecMechanisms: fecMechanisms); + } List? codecs; List? headerExtensions; List? fecMechanisms; + + Map toMap() { + return { + 'codecs': codecs?.map((e) => e.toMap()).toList(), + 'headerExtensions': headerExtensions?.map((e) => e.toMap()).toList(), + 'fecMechanisms': fecMechanisms, + }; + } } From 39b9228d95bd5d15ecaa301893ea74f098a202ff Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 30 Jan 2023 13:05:54 +0800 Subject: [PATCH 5/8] update. --- lib/webrtc_interface.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/webrtc_interface.dart b/lib/webrtc_interface.dart index ab3a871..e5d5338 100644 --- a/lib/webrtc_interface.dart +++ b/lib/webrtc_interface.dart @@ -12,6 +12,7 @@ export 'src/rtc_dtmf_sender.dart'; export 'src/rtc_ice_candidate.dart'; export 'src/rtc_peerconnection.dart'; export 'src/rtc_rtcp_parameters.dart'; +export 'src/rtc_rtp_capabilities.dart'; export 'src/rtc_rtp_parameters.dart'; export 'src/rtc_rtp_receiver.dart'; export 'src/rtc_rtp_sender.dart'; From f9d4a523efe46e45fa2d9572030c3d7e44285e8a Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 30 Jan 2023 14:02:13 +0800 Subject: [PATCH 6/8] update. --- lib/src/factory.dart | 5 +++++ lib/src/rtc_rtp_receiver.dart | 3 --- lib/src/rtc_rtp_sender.dart | 4 ---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/src/factory.dart b/lib/src/factory.dart index 729b2f0..71474d4 100644 --- a/lib/src/factory.dart +++ b/lib/src/factory.dart @@ -2,6 +2,7 @@ import 'media_recorder.dart'; import 'media_stream.dart'; import 'navigator.dart'; import 'rtc_peerconnection.dart'; +import 'rtc_rtp_capabilities.dart'; import 'rtc_video_renderer.dart'; abstract class RTCFactory { @@ -11,6 +12,10 @@ abstract class RTCFactory { Future createLocalMediaStream(String label); + Future getRtpSenderCapabilities(String kind); + + Future getRtpReceiverCapabilities(String kind); + MediaRecorder mediaRecorder(); VideoRenderer videoRenderer(); diff --git a/lib/src/rtc_rtp_receiver.dart b/lib/src/rtc_rtp_receiver.dart index b1a5e3e..3241537 100644 --- a/lib/src/rtc_rtp_receiver.dart +++ b/lib/src/rtc_rtp_receiver.dart @@ -1,6 +1,5 @@ import 'enums.dart'; import 'media_stream_track.dart'; -import 'rtc_rtp_capabilities.dart'; import 'rtc_rtp_parameters.dart'; import 'rtc_stats_report.dart'; @@ -18,8 +17,6 @@ abstract class RTCRtpReceiver { /// http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*. RTCRtpParameters get parameters; - Future getCapabilities(); - MediaStreamTrack? get track; String get receiverId; diff --git a/lib/src/rtc_rtp_sender.dart b/lib/src/rtc_rtp_sender.dart index 14ef425..9fade5a 100644 --- a/lib/src/rtc_rtp_sender.dart +++ b/lib/src/rtc_rtp_sender.dart @@ -1,7 +1,5 @@ import 'dart:async'; -import 'package:webrtc_interface/src/rtc_rtp_capabilities.dart'; - import 'media_stream_track.dart'; import 'rtc_dtmf_sender.dart'; import 'rtc_rtp_parameters.dart'; @@ -18,8 +16,6 @@ abstract class RTCRtpSender { Future> getStats(); - Future getCapabilities(); - RTCRtpParameters get parameters; MediaStreamTrack? get track; From 310f5f80b83bcb2252247aa40f6e394fec03fdba Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 30 Jan 2023 14:09:34 +0800 Subject: [PATCH 7/8] update. --- lib/src/rtc_rtp_capabilities.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/rtc_rtp_capabilities.dart b/lib/src/rtc_rtp_capabilities.dart index d8aa392..9daccf0 100644 --- a/lib/src/rtc_rtp_capabilities.dart +++ b/lib/src/rtc_rtp_capabilities.dart @@ -32,7 +32,7 @@ class RTCRtpHeaderExtensionCapability { return RTCRtpHeaderExtensionCapability(map['uri']); } String uri; - Map toMap() { + Map toMap() { return { 'uri': uri, }; From b5b1994f41e1cb720ef535ac43f22812520ca417 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Mon, 30 Jan 2023 14:53:33 +0800 Subject: [PATCH 8/8] update. --- lib/src/rtc_rtp_capabilities.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/rtc_rtp_capabilities.dart b/lib/src/rtc_rtp_capabilities.dart index 9daccf0..2e3e924 100644 --- a/lib/src/rtc_rtp_capabilities.dart +++ b/lib/src/rtc_rtp_capabilities.dart @@ -18,7 +18,7 @@ class RTCRtpCodecCapability { String? sdpFmtpLine; Map toMap() { return { - 'channels': channels, + if (channels != null) 'channels': channels, 'clockRate': clockRate, 'mimeType': mimeType, if (sdpFmtpLine != null) 'sdpFmtpLine': sdpFmtpLine, @@ -70,7 +70,7 @@ class RTCRtpCapabilities { return { 'codecs': codecs?.map((e) => e.toMap()).toList(), 'headerExtensions': headerExtensions?.map((e) => e.toMap()).toList(), - 'fecMechanisms': fecMechanisms, + if (fecMechanisms != null) 'fecMechanisms': fecMechanisms, }; } }