From 3bf99981fc51c1bcf616c841f22d857e86bf9ccb Mon Sep 17 00:00:00 2001 From: yonatannaor Date: Sun, 16 Feb 2020 23:37:42 +0200 Subject: [PATCH] enabled addTrack API for android and ios --- .../webrtc/PeerConnectionObserver.java | 27 ++++++++---- ios/Classes/FlutterWebRTCPlugin.m | 42 +++++++++++++++++++ ios/flutter_webrtc.podspec | 2 +- lib/media_stream_track.dart | 2 +- lib/rtc_rtp_receiver.dart | 2 +- lib/rtc_rtp_sender.dart | 2 +- 6 files changed, 66 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java b/android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java index 1ab98dfc4c..ff002cbadf 100755 --- a/android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java +++ b/android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java @@ -540,11 +540,21 @@ private Map rtpParametersToMap(RtpParameters rtpParameters){ for(RtpParameters.Encoding encoding : rtpParameters.encodings){ ConstraintsMap map = new ConstraintsMap(); map.putBoolean("active",encoding.active); - map.putInt("maxBitrateBps", encoding.maxBitrateBps); - map.putInt("minBitrateBps", encoding.minBitrateBps); - map.putInt("maxFramerate", encoding.maxFramerate); - map.putInt("numTemporalLayers", encoding.numTemporalLayers); - map.putDouble("scaleResolutionDownBy", encoding.scaleResolutionDownBy); + if (encoding.maxBitrateBps != null) { + map.putInt("maxBitrateBps", encoding.maxBitrateBps); + } + if (encoding.minBitrateBps != null) { + map.putInt("minBitrateBps", encoding.minBitrateBps); + } + if (encoding.maxFramerate != null) { + map.putInt("maxFramerate", encoding.maxFramerate); + } + if (encoding.numTemporalLayers != null) { + map.putInt("numTemporalLayers", encoding.numTemporalLayers); + } + if (encoding.scaleResolutionDownBy != null) { + map.putDouble("scaleResolutionDownBy", encoding.scaleResolutionDownBy); + } map.putLong("ssrc", encoding.ssrc); encodings.pushMap(map); } @@ -581,8 +591,10 @@ private Map mediaTrackToMap(MediaStreamTrack track){ private Map dtmfSenderToMap(DtmfSender dtmfSender, String id){ ConstraintsMap info = new ConstraintsMap(); info.putString("dtmfSenderId",id); - info.putInt("interToneGap", dtmfSender.interToneGap()); - info.putInt("duration",dtmfSender.duration()); + if (dtmfSender != null) { + info.putInt("interToneGap", dtmfSender.interToneGap()); + info.putInt("duration", dtmfSender.duration()); + } return info.toMap(); } @@ -599,6 +611,7 @@ private Map rtpSenderToMap(RtpSender sender){ private Map rtpReceiverToMap(RtpReceiver receiver){ ConstraintsMap info = new ConstraintsMap(); info.putString("receiverId", receiver.id()); + info.putMap("rtpParameters", rtpParametersToMap(receiver.getParameters())); info.putMap("track", mediaTrackToMap(receiver.track())); return info.toMap(); } diff --git a/ios/Classes/FlutterWebRTCPlugin.m b/ios/Classes/FlutterWebRTCPlugin.m index cbfab980e5..a3c6d08ed8 100644 --- a/ios/Classes/FlutterWebRTCPlugin.m +++ b/ios/Classes/FlutterWebRTCPlugin.m @@ -149,6 +149,48 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result message:[NSString stringWithFormat:@"Error: peerConnection or mediaStream not found!"] details:nil]); } + } else if ([@"addTrack" isEqualToString:call.method]) { + NSDictionary* argsMap = call.arguments; + + NSString* peerConnectionId = ((NSString*)argsMap[@"peerConnectionId"]); + NSString* trackId = ((NSString*)argsMap[@"trackId"]); + NSArray *streamIds = ((NSArray*)argsMap[@"streamIds"]); + + RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId]; + RTCMediaStreamTrack *track = self.localTracks[trackId]; + + if (peerConnection && track) { + RTCRtpSender* sender = [peerConnection addTrack:track streamIds:streamIds]; + + // TODO: properly map sender + result(@{ + @"senderId": sender.senderId, + @"ownsTrack": @(YES), + @"dtmfSender": @{ + @"dtmfSenderId": sender.senderId, + }, + @"rtpParameters": @{ + @"encodings": @[], + @"headerExtensions": @[], + @"codecs": @[], + @"rtcp": @{ + + }, + }, + @"track": @{ + @"id": sender.track.trackId, + @"kind": sender.track.kind, + @"label": sender.track.trackId, + @"enabled": @(sender.track.isEnabled), + @"remote": @(YES), + @"readyState": @"live" + } + }); + } else { + result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method] + message:[NSString stringWithFormat:@"Error: peerConnection or track not found!"] + details:nil]); + } } else if ([@"removeStream" isEqualToString:call.method]) { NSDictionary* argsMap = call.arguments; diff --git a/ios/flutter_webrtc.podspec b/ios/flutter_webrtc.podspec index 773f521058..d8c4267c5f 100644 --- a/ios/flutter_webrtc.podspec +++ b/ios/flutter_webrtc.podspec @@ -16,7 +16,7 @@ A new flutter plugin project. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' s.dependency 'libyuv-iOS' - s.dependency 'GoogleWebRTC', '1.1.27299' + s.dependency 'GoogleWebRTC', '1.1.29229' s.ios.deployment_target = '9.0' s.static_framework = true end diff --git a/lib/media_stream_track.dart b/lib/media_stream_track.dart index 66096cd944..256fa42e31 100644 --- a/lib/media_stream_track.dart +++ b/lib/media_stream_track.dart @@ -14,7 +14,7 @@ class MediaStreamTrack { /// public: factory MediaStreamTrack.fromMap(Map map) { return new MediaStreamTrack( - map['trackId'], map['label'], map['kind'], map['enabled']); + map['id'], map['label'], map['kind'], map['enabled']); } MediaStreamTrack(this._trackId, this._label, this._kind, this._enabled); diff --git a/lib/rtc_rtp_receiver.dart b/lib/rtc_rtp_receiver.dart index e55de9d8ec..788af24d84 100644 --- a/lib/rtc_rtp_receiver.dart +++ b/lib/rtc_rtp_receiver.dart @@ -39,7 +39,7 @@ class RTCRtpReceiver { OnFirstPacketReceivedCallback onFirstPacketReceived; factory RTCRtpReceiver.fromMap(Map map) { - MediaStreamTrack track = MediaStreamTrack.fromMap(map['trackInfo']); + MediaStreamTrack track = MediaStreamTrack.fromMap(map['track']); RTCRtpParameters parameters = RTCRtpParameters.fromMap(map['rtpParameters']); return RTCRtpReceiver(map['receiverId'], track, parameters); diff --git a/lib/rtc_rtp_sender.dart b/lib/rtc_rtp_sender.dart index 72c3227724..ebbbc8239d 100644 --- a/lib/rtc_rtp_sender.dart +++ b/lib/rtc_rtp_sender.dart @@ -19,7 +19,7 @@ class RTCRtpSender { return new RTCRtpSender( map['senderId'], MediaStreamTrack.fromMap(map['track']), - RTCDTMFSender.fromMap(map['dtmfSender']), + RTCDTMFSender.fromMap(Map.from(map['dtmfSender'])), RTCRtpParameters.fromMap(map['rtpParameters']), map['ownsTrack']); }