Skip to content

Commit

Permalink
ios: support more options in addTransceiver init
Browse files Browse the repository at this point in the history
Fixes: #1244
  • Loading branch information
8BallBomBom committed Dec 12, 2022
1 parent b1dd010 commit bd510c2
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 66 deletions.
3 changes: 2 additions & 1 deletion ios/RCTWebRTC/SerializeUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
+ (NSDictionary *_Nonnull)trackToJSONWithPeerConnectionId: (nonnull NSNumber *) id
track: (RTCMediaStreamTrack *_Nonnull) track;
+ (NSString *_Nonnull)serializeDirection: (RTCRtpTransceiverDirection) direction;
+ (RTCRtpTransceiverDirection) parseDirection: (NSString *_Nonnull) direction;
+ (RTCRtpTransceiverDirection)parseDirection: (NSString *_Nonnull) direction;
+ (RTCRtpTransceiverInit *_Nonnull)parseTransceiverOptions: (NSDictionary *_Nonnull) parameters;
+ (NSDictionary *_Nonnull)parametersToJSON: (RTCRtpParameters *_Nonnull) parameters;
+ (NSMutableArray *_Nonnull)constructTransceiversInfoArrayWithPeerConnection: (RTCPeerConnection *_Nonnull) peerConnection
peerConnectionId: (NSNumber *_Nonnull) peerConnectionId;
Expand Down
56 changes: 51 additions & 5 deletions ios/RCTWebRTC/SerializeUtils.m
Original file line number Diff line number Diff line change
Expand Up @@ -193,21 +193,67 @@ + (NSString *) serializeDirection: (RTCRtpTransceiverDirection) direction {
}

+ (RTCRtpTransceiverDirection) parseDirection: (NSString *) direction {
if ([direction isEqual: @"inactive"]) {
if ([direction isEqual: @"inactive"]) {
return RTCRtpTransceiverDirectionInactive;
} else if ([direction isEqual: @"recvonly"]) {
} else if ([direction isEqual: @"recvonly"]) {
return RTCRtpTransceiverDirectionRecvOnly;
} else if ([direction isEqual: @"sendonly"]) {
} else if ([direction isEqual: @"sendonly"]) {
return RTCRtpTransceiverDirectionSendOnly;
} else if ([direction isEqual: @"sendrecv"]) {
} else if ([direction isEqual: @"sendrecv"]) {
return RTCRtpTransceiverDirectionSendRecv;
} else if ([direction isEqual: @"stopped"]) {
} else if ([direction isEqual: @"stopped"]) {
return RTCRtpTransceiverDirectionStopped;
}

return RTCRtpTransceiverDirectionInactive;
}

+ (RTCRtpEncodingParameters *) parseEncoding: (NSDictionary *) params {
RTCRtpEncodingParameters *encoding = [RTCRtpEncodingParameters new];

if (params[@"rid"] != nil) {
[encoding setRid: params[@"rid"]];
}
if (params[@"active"] != nil) {
[encoding setIsActive: ((NSNumber *) params[@"active"]).boolValue];
}
if (params[@"maxBitrate"] != nil) {
[encoding setMaxBitrateBps: (NSNumber *) params[@"maxBitrate"]];
}
if (params[@"maxFramerate"] != nil) {
[encoding setMaxFramerate: (NSNumber *) params[@"maxFramerate"]];
}
if (params[@"scaleResolutionDownBy"] != nil) {
[encoding setScaleResolutionDownBy: (NSNumber *) params[@"scaleResolutionDownBy"]];
}

return encoding;
}

+ (RTCRtpTransceiverInit *) parseTransceiverOptions: (NSDictionary *) params {
RTCRtpTransceiverInit *transceiverInit = [RTCRtpTransceiverInit new];

NSString *direction = [params objectForKey: @"direction"];
if (direction) {
[transceiverInit setDirection: [SerializeUtils parseDirection: direction]];
}

NSArray *streamIds = [params objectForKey: @"streamIds"];
if (streamIds) {
[transceiverInit setStreamIds: streamIds];
}

NSArray *encodingsArray = [params objectForKey: @"sendEncodings"];
if (encodingsArray) {
NSMutableArray<RTCRtpEncodingParameters *> *sendEncodings = [NSMutableArray new];
for (NSDictionary* encoding in encodingsArray) {
[sendEncodings addObject: [self parseEncoding: encoding]];
}
[transceiverInit setSendEncodings: sendEncodings];
}

return transceiverInit;
}

+ (NSDictionary *)streamToJSONWithPeerConnectionId: (NSNumber *) id
stream: (RTCMediaStream *) stream
Expand Down
74 changes: 14 additions & 60 deletions ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m
Original file line number Diff line number Diff line change
Expand Up @@ -484,50 +484,27 @@ @implementation WebRTCModule (RTCPeerConnection)
RTCRtpMediaType type = RTCRtpMediaTypeUnsupported;

if (kind) {
if ([kind isEqual: @"audio"]) {
if ([kind isEqual: @"audio"]) {
type = RTCRtpMediaTypeAudio;
} else if ([kind isEqual: @"video"]) {
} else if ([kind isEqual: @"video"]) {
type = RTCRtpMediaTypeVideo;
}
transceiver = [peerConnection addTransceiverOfType:type];

NSDictionary *initOptions = [options objectForKey: @"init"];
RTCRtpTransceiverInit *transceiverInit = [SerializeUtils parseTransceiverOptions: initOptions];

transceiver = [peerConnection addTransceiverOfType: type init: transceiverInit];
} else if (trackId) {
RTCMediaStreamTrack *track = self.localTracks[trackId];

if(!track) {
if (!track) {
track = peerConnection.remoteTracks[trackId];
}

NSDictionary *initOptions = [options objectForKey:@"init"];
RTCRtpTransceiverInit *transceiverInit = [RTCRtpTransceiverInit new];

if (initOptions) {
NSString *dirrection = [initOptions objectForKey:@"direction"];
if ([dirrection isEqual: @"sendrecv"]) {
[transceiverInit setDirection:RTCRtpTransceiverDirectionSendRecv];
} else if ([dirrection isEqual: @"sendonly"]) {
[transceiverInit setDirection:RTCRtpTransceiverDirectionSendOnly];
} else if ([dirrection isEqual: @"recvonly"]) {
[transceiverInit setDirection:RTCRtpTransceiverDirectionRecvOnly];
} else if ([dirrection isEqual: @"inactive"]) {
[transceiverInit setDirection:RTCRtpTransceiverDirectionInactive];
}

NSArray *streamIds = [initOptions objectForKey:@"streamIds"];
if (streamIds) {
[transceiverInit setStreamIds:streamIds];
}
NSDictionary *initOptions = [options objectForKey: @"init"];
RTCRtpTransceiverInit *transceiverInit = [SerializeUtils parseTransceiverOptions: initOptions];

NSArray *encodingsArray = [initOptions objectForKey:@"sendEncodings"];
if (encodingsArray) {
NSMutableArray<RTCRtpEncodingParameters *> *sendEncodings = [NSMutableArray new];
for (NSDictionary* encoding in encodingsArray) {
[sendEncodings addObject:[self parseEncoding:encoding]];
}
[transceiverInit setSendEncodings:sendEncodings];
}
}

transceiver = [peerConnection addTransceiverWithTrack:track init:transceiverInit];
transceiver = [peerConnection addTransceiverWithTrack: track init: transceiverInit];
} else {
RCTLogWarn(@"peerConnectionAddTransceiver() no type nor trackId provided in options");
return;
Expand All @@ -539,8 +516,8 @@ @implementation WebRTCModule (RTCPeerConnection)
}

params = @{
@"transceiverOrder": [NSNumber numberWithInt:_transceiverNextId++],
@"transceiver": [SerializeUtils transceiverToJSONWithPeerConnectionId: objectID transceiver: transceiver ]
@"transceiverOrder": [NSNumber numberWithInt: _transceiverNextId++],
@"transceiver": [SerializeUtils transceiverToJSONWithPeerConnectionId: objectID transceiver: transceiver]
};
});

Expand Down Expand Up @@ -579,30 +556,7 @@ @implementation WebRTCModule (RTCPeerConnection)
return @(ret);
}

// TODO: move these below to some SerializeUrils file

- (RTCRtpEncodingParameters*)parseEncoding:(NSDictionary*)params
{
RTCRtpEncodingParameters *encoding = [RTCRtpEncodingParameters new];

if (params[@"rid"] != nil) {
[encoding setRid:params[@"rid"]];
}
if (params[@"active"] != nil) {
[encoding setIsActive:((NSNumber*)params[@"active"]).boolValue];
}
if (params[@"maxBitrate"] != nil) {
[encoding setMaxBitrateBps:(NSNumber*)params[@"maxBitrate"]];
}
if (params[@"maxFramerate"] != nil) {
[encoding setMaxFramerate:(NSNumber*)params[@"maxFramerate"]];
}
if (params[@"scaleResolutionDownBy"] != nil) {
[encoding setScaleResolutionDownBy:(NSNumber*)params[@"scaleResolutionDownBy"]];
}

return encoding;
}
// TODO: move these below to some SerializeUtils file

/**
* Constructs a JSON <tt>NSString</tt> representation of a specific
Expand Down

0 comments on commit bd510c2

Please sign in to comment.