8000 [Darwin/Android] `RtpSender` `setParameters` functionality, close #40… · next-coder/flutter-webrtc@013f037 · GitHub
[go: up one dir, main page]

Skip to content

Commit 013f037

Browse files
[Darwin/Android] RtpSender setParameters functionality, close flutter-webrtc#405. (flutter-webrtc#407)
* [Dart] Added `peerConnectionId` to `sender` in `addTrack` method to fix an issue with `peerConnection is null` * [Android] Implemented `updateRtpParameters` to update parameters before setting them in native side. * [Android] removed codec setting logic as it is readonly in iOS to maintain the same functionality across platforms. * [Darwin]] Added `updateRtpParameters` method and `rtpSenderSetParameters` is functional now, typo fix. Co-authored-by: Ayman-Barghout <ayman.a.barghout@gmail.com>
1 parent 1a51904 commit 013f037

File tree

3 files changed

+75
-21
lines changed

3 files changed

+75
-21
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -670,9 +670,35 @@ private RtpTransceiver.RtpTransceiverInit mapToRtpTransceiverInit(Map<String, Ob
670670
return init;
671671
}
672672

673-
private RtpParameters MapToRtpParameters(Map<String, Object> parameters) {
674-
RtpParameters rtpParameters = null;
675-
return rtpParameters;
673+
private RtpParameters updateRtpParameters(Map<String, Object> newParameters, RtpParameters parameters){
674+
List<Map<String, Object>> encodings = (List<Map<String, Object>>) newParameters.get("encodings");
675+
final Iterator encodingsIterator = encodings.iterator();
676+
final Iterator nativeEncodingsIterator = parameters.encodings.iterator();
677+
while(encodingsIterator.hasNext() && nativeEncodingsIterator.hasNext()){
678+
final RtpParameters.Encoding nativeEncoding = (RtpParameters.Encoding) nativeEncodingsIterator.next();
679+
final Map<String, Object> encoding = (Map<String, Object>) encodingsIterator.next();
680+
if(encoding.containsKey("active")){
681+
nativeEncoding.active = (Boolean) encoding.get("active");
682+
}
683+
if (encoding.containsKey("maxBitrateBps")) {
684+
nativeEncoding.maxBitrateBps = (Integer) encoding.get("maxBitrateBps");
685+
}
686+
if (encoding.containsKey("minBitrateBps")) {
687+
nativeEncoding.minBitrateBps = (Integer) encoding.get("minBitrateBps");
688+
}
689+
if (encoding.containsKey("maxFramerate")) {
690+
nativeEncoding.maxFramerate = (Integer) encoding.get("maxFramerate");
691+
}
692+
if (encoding.containsKey("numTemporalLayers")) {
693+
nativeEncoding.numTemporalLayers = (Integer) encoding.get("numTemporalLayers");
694+
}
695+
if (encoding.containsKey("scaleResolutionDownBy") ) {
696+
nativeEncoding.scaleResolutionDownBy = (Double) encoding.get("scaleResolutionDownBy");
697+
}
698+
}
699+
700+
701+
return parameters;
676702
}
677703

678704
private Map<String, Object> rtpParametersToMap(RtpParameters rtpParameters){
@@ -919,8 +945,11 @@ public void rtpSenderSetParameters(String rtpSenderId, Map<String, Object> param
919945
resultError("rtpSenderSetParameters", "sender is null", result);
920946
return;
921947
}
922-
sender.setParameters(MapToRtpParameters(parameters));
923-
result.success(null);
948+
final RtpParameters updatedParameters = updateRtpParameters(parameters, sender.getParameters());
949+
final Boolean success = sender.setParameters(updatedParameters);
950+
ConstraintsMap params = new ConstraintsMap();
951+
params.putBoolean("result", success);
952+
result.success(params.toMap());
924953
}
925954

926955
public void rtpSenderSetTrack(String rtpSenderId, MediaStreamTrack track, Result result, boolean replace) {

common/darwin/Classes/FlutterWebRTCPlugin.m

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
271271
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
272272
[queue addOperationWithBlock:^{
273273
double durationMs = duration / 1000.0;
274-
double interToneGapMs = interToneGap / 1000.0;
274+
double interToneGapMs = interToneGap / 1000.0;
275275
[audioSender.dtmfSender insertDtmf :(NSString *)tone
276276
duration:(NSTimeInterval) durationMs interToneGap:(NSTimeInterval)interToneGapMs];
277277
NSLog(@"DTMF Tone played ");
@@ -624,7 +624,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
624624
details:nil]);
625625
return;
626626
}
627-
RTCRtpSender *sender = [self getRtpSnderById:peerConnection Id:senderId];
627+
RTCRtpSender *sender = [self getRtpSenderById:peerConnection Id:senderId];
628628
if(sender == nil) {
629629
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
630630
message:[NSString stringWithFormat:@"Error: sender not found!"]
@@ -673,7 +673,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
673673
details:nil]);
674674
return;
675675
}
676-
RTCRtpSender *sender = [self getRtpSnderById:peerConnection Id:senderId];
676+
RTCRtpSender *sender = [self getRtpSenderById:peerConnection Id:senderId];
677677
if(sender == nil) {
678678
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
679679
message:[NSString stringWithFormat:@"Error: sender not found!"]
@@ -798,7 +798,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
798798
} else if ([@"rtpSenderSetParameters" isEqualToString:call.method]){
799799
NSDictionary* argsMap = call.arguments;
800800
NSString* peerConnectionId = argsMap[@"peerConnectionId"];
801-
NSString* senderId = argsMap[@"senderId"];
801+
NSString* senderId = argsMap[@"rtpSenderId"];
802802
NSDictionary* parameters = argsMap[@"parameters"];
803803
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
804804
if(peerConnection == nil) {
@@ -807,16 +807,16 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
807807
details:nil]);
808808
return;
809809
}
810-
RTCRtpSender *sender = [self getRtpSnderById:peerConnection Id:senderId];
810+
RTCRtpSender *sender = [self getRtpSenderById:peerConnection Id:senderId];
811811
if(sender == nil) {
812812
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
813813
message:[NSString stringWithFormat:@"Error: sender not found!"]
814814
details:nil]);
815815
return;
816816
}
817-
[sender setParameters:[self mapToRtpParameters:parameters]];
817+
[sender setParameters:[self updateRtpParameters: parameters : sender.parameters]];
818818

819-
result(nil);
819+
result(@{@"result": @(YES)});
820820
} else if ([@"rtpSenderReplaceTrack" isEqualToString:call.method]){
821821
NSDictionary* argsMap = call.arguments;
822822
NSString* peerConnectionId = argsMap[@"peerConnectionId"];
@@ -829,7 +829,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
829829
details:nil]);
830830
return;
831831
}
832-
RTCRtpSender *sender = [self getRtpSnderById:peerConnection Id:senderId];
832+
RTCRtpSender *sender = [self getRtpSenderById:peerConnection Id:senderId];
833833
if(sender == nil) {
834834
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
835835
message:[NSString stringWithFormat:@"Error: sender not found!"]
@@ -857,7 +857,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
857857
details:nil]);
858858
return;
859859
}
860-
RTCRtpSender *sender = [self getRtpSnderById:peerConnection Id:senderId];
860+
RTCRtpSender *sender = [self getRtpSenderById:peerConnection Id:senderId];
861861
if(sender == nil) {
862862
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
863863
message:[NSString stringWithFormat:@"Error: sender not found!"]
@@ -884,7 +884,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
884884
details:nil]);
885885
return;
886886
}
887-
RTCRtpSender *sender = [self getRtpSnderById:peerConnection Id:senderId];
887+
RTCRtpSender *sender = [self getRtpSenderById:peerConnection Id:senderId];
888888
if(sender == nil) {
889889
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
890890
message:[NSString stringWithFormat:@"Error: sender not found!"]
@@ -983,7 +983,7 @@ - (RTCMediaStreamTrack*)trackForId:(NSString*)trackId {
983983
}
984984
}
985985
}
986-
return track;
986+
return track;
987987
}
988988

989989

@@ -1278,7 +1278,7 @@ -(RTCRtpTransceiver*) getRtpTransceiverById:(RTCPeerConnection *)peerConnection
12781278
return nil;
12791279
}
12801280

1281-
-(RTCRtpSender*) getRtpSnderById:(RTCPeerConnection *)peerConnection Id:(NSString*)Id {
1281+
-(RTCRtpSender*) getRtpSenderById:(RTCPeerConnection *)peerConnection Id:(NSString*)Id {
12821282
for( RTCRtpSender* sender in peerConnection.senders) {
12831283
if([sender.senderId isEqualToString:Id]){
12841284
return sender;
@@ -1376,10 +1376,34 @@ -(RTCRtpTransceiverDirection)stringToTransceiverDirection:(NSString*)type {
13761376
return RTCRtpTransceiverDirectionInactive;
13771377
}
13781378

1379-
-(RTCRtpParameters *)mapToRtpParameters:(NSDictionary *)map {
1380-
//TODO:
1381-
return nil;
1382-
}
1379+
-(RTCRtpParameters *)updateRtpParameters :(NSDictionary *)newParameters : (RTCRtpParameters *)parameters {
1380+
NSArray* encodings = [newParameters objectForKey:@"encodings"];
1381+
NSArray<RTCRtpEncodingParameters *> *nativeEncodings = parameters.encodings;
1382+
for(int i = 0; i < [nativeEncodings count]; i++){
1383+
RTCRtpEncodingParameters *nativeEncoding = [nativeEncodings objectAtIndex:i];
1384+
NSDictionary *encoding = [encodings objectAtIndex:i];
1385+
if([encoding objectForKey:@"active"]){
1386+
nativeEncoding.isActive = [encoding objectForKey:@"active"];
1387+
}
1388+
if([encoding objectForKey:@"maxBitrateBps"]){
1389+
nativeEncoding.maxBitrateBps = [encoding objectForKey:@"maxBitrateBps"];
1390+
}
1391+
if([encoding objectForKey:@"minBitrateBps"]){
1392+
nativeEncoding.minBitrateBps = [encoding objectForKey:@"minBitrateBps"];
1393+
}
1394+
if([encoding objectForKey:@"maxFramerate"]){
1395+
nativeEncoding.maxFramerate = [encoding objectForKey:@"maxFramerate"];
1396+
}
1397+
if([encoding objectForKey:@"numTemporalLayers"]){
1398+
nativeEncoding.isActive = [encoding objectForKey:@"numTemporalLayers"];
1399+
}
1400+
if([encoding objectForKey:@"scaleResolutionDownBy"]){
1401+
nativeEncoding.scaleResolutionDownBy = [encoding objectForKey:@"scaleResolutionDownBy"];
1402+
}
1403+
}
1404+
1405+
return parameters;
1406+
}
13831407

13841408
-(NSString*)transceiverDirectionString:(RTCRtpTransceiverDirection)direction {
13851409
switch (direction) {

lib/src/native/rtc_peerconnection_impl.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,7 @@ class RTCPeerConnectionNative extends RTCPeerConnection {
472472
'streamIds': streams.map((e) => e.id).toList()
473473
});
474474
var sender = RTCRtpSenderNative.fromMap(response);
475+
sender.peerConnectionId = _peerConnectionId;
475476
_senders.add(sender);
476477
return sender;
477478
} on PlatformException catch (e) {

0 commit comments

Comments
 (0)
0