1*d9f75844SAndroid Build Coastguard Worker/* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2018 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpTransceiver+Private.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpEncodingParameters+Private.h" 14*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpParameters+Private.h" 15*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpReceiver+Private.h" 16*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpSender+Private.h" 17*d9f75844SAndroid Build Coastguard Worker#import "base/RTCLogging.h" 18*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h" 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCRtpTransceiverErrorDomain = @"org.webrtc.RTCRtpTranceiver"; 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCRtpTransceiverInit) 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Worker@synthesize direction = _direction; 25*d9f75844SAndroid Build Coastguard Worker@synthesize streamIds = _streamIds; 26*d9f75844SAndroid Build Coastguard Worker@synthesize sendEncodings = _sendEncodings; 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker- (instancetype)init { 29*d9f75844SAndroid Build Coastguard Worker if (self = [super init]) { 30*d9f75844SAndroid Build Coastguard Worker _direction = RTCRtpTransceiverDirectionSendRecv; 31*d9f75844SAndroid Build Coastguard Worker } 32*d9f75844SAndroid Build Coastguard Worker return self; 33*d9f75844SAndroid Build Coastguard Worker} 34*d9f75844SAndroid Build Coastguard Worker 35*d9f75844SAndroid Build Coastguard Worker- (webrtc::RtpTransceiverInit)nativeInit { 36*d9f75844SAndroid Build Coastguard Worker webrtc::RtpTransceiverInit init; 37*d9f75844SAndroid Build Coastguard Worker init.direction = 38*d9f75844SAndroid Build Coastguard Worker [RTC_OBJC_TYPE(RTCRtpTransceiver) nativeRtpTransceiverDirectionFromDirection:_direction]; 39*d9f75844SAndroid Build Coastguard Worker for (NSString *streamId in _streamIds) { 40*d9f75844SAndroid Build Coastguard Worker init.stream_ids.push_back([streamId UTF8String]); 41*d9f75844SAndroid Build Coastguard Worker } 42*d9f75844SAndroid Build Coastguard Worker for (RTC_OBJC_TYPE(RTCRtpEncodingParameters) * sendEncoding in _sendEncodings) { 43*d9f75844SAndroid Build Coastguard Worker init.send_encodings.push_back(sendEncoding.nativeParameters); 44*d9f75844SAndroid Build Coastguard Worker } 45*d9f75844SAndroid Build Coastguard Worker return init; 46*d9f75844SAndroid Build Coastguard Worker} 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker@end 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCRtpTransceiver) { 51*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory; 52*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::RtpTransceiverInterface> _nativeRtpTransceiver; 53*d9f75844SAndroid Build Coastguard Worker} 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker- (RTCRtpMediaType)mediaType { 56*d9f75844SAndroid Build Coastguard Worker return [RTC_OBJC_TYPE(RTCRtpReceiver) 57*d9f75844SAndroid Build Coastguard Worker mediaTypeForNativeMediaType:_nativeRtpTransceiver->media_type()]; 58*d9f75844SAndroid Build Coastguard Worker} 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Worker- (NSString *)mid { 61*d9f75844SAndroid Build Coastguard Worker if (_nativeRtpTransceiver->mid()) { 62*d9f75844SAndroid Build Coastguard Worker return [NSString stringForStdString:*_nativeRtpTransceiver->mid()]; 63*d9f75844SAndroid Build Coastguard Worker } else { 64*d9f75844SAndroid Build Coastguard Worker return nil; 65*d9f75844SAndroid Build Coastguard Worker } 66*d9f75844SAndroid Build Coastguard Worker} 67*d9f75844SAndroid Build Coastguard Worker 68*d9f75844SAndroid Build Coastguard Worker@synthesize sender = _sender; 69*d9f75844SAndroid Build Coastguard Worker@synthesize receiver = _receiver; 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker- (BOOL)isStopped { 72*d9f75844SAndroid Build Coastguard Worker return _nativeRtpTransceiver->stopped(); 73*d9f75844SAndroid Build Coastguard Worker} 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker- (RTCRtpTransceiverDirection)direction { 76*d9f75844SAndroid Build Coastguard Worker return [RTC_OBJC_TYPE(RTCRtpTransceiver) 77*d9f75844SAndroid Build Coastguard Worker rtpTransceiverDirectionFromNativeDirection:_nativeRtpTransceiver->direction()]; 78*d9f75844SAndroid Build Coastguard Worker} 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker- (void)setDirection:(RTCRtpTransceiverDirection)direction error:(NSError **)error { 81*d9f75844SAndroid Build Coastguard Worker webrtc::RTCError nativeError = _nativeRtpTransceiver->SetDirectionWithError( 82*d9f75844SAndroid Build Coastguard Worker [RTC_OBJC_TYPE(RTCRtpTransceiver) nativeRtpTransceiverDirectionFromDirection:direction]); 83*d9f75844SAndroid Build Coastguard Worker 84*d9f75844SAndroid Build Coastguard Worker if (!nativeError.ok() && error) { 85*d9f75844SAndroid Build Coastguard Worker *error = [NSError errorWithDomain:kRTCRtpTransceiverErrorDomain 86*d9f75844SAndroid Build Coastguard Worker code:static_cast<int>(nativeError.type()) 87*d9f75844SAndroid Build Coastguard Worker userInfo:@{ 88*d9f75844SAndroid Build Coastguard Worker @"message" : [NSString stringWithCString:nativeError.message() 89*d9f75844SAndroid Build Coastguard Worker encoding:NSUTF8StringEncoding] 90*d9f75844SAndroid Build Coastguard Worker }]; 91*d9f75844SAndroid Build Coastguard Worker } 92*d9f75844SAndroid Build Coastguard Worker} 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker- (BOOL)currentDirection:(RTCRtpTransceiverDirection *)currentDirectionOut { 95*d9f75844SAndroid Build Coastguard Worker if (_nativeRtpTransceiver->current_direction()) { 96*d9f75844SAndroid Build Coastguard Worker *currentDirectionOut = [RTC_OBJC_TYPE(RTCRtpTransceiver) 97*d9f75844SAndroid Build Coastguard Worker rtpTransceiverDirectionFromNativeDirection:*_nativeRtpTransceiver->current_direction()]; 98*d9f75844SAndroid Build Coastguard Worker return YES; 99*d9f75844SAndroid Build Coastguard Worker } else { 100*d9f75844SAndroid Build Coastguard Worker return NO; 101*d9f75844SAndroid Build Coastguard Worker } 102*d9f75844SAndroid Build Coastguard Worker} 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker- (void)stopInternal { 105*d9f75844SAndroid Build Coastguard Worker _nativeRtpTransceiver->StopInternal(); 106*d9f75844SAndroid Build Coastguard Worker} 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker- (NSString *)description { 109*d9f75844SAndroid Build Coastguard Worker return [NSString 110*d9f75844SAndroid Build Coastguard Worker stringWithFormat:@"RTC_OBJC_TYPE(RTCRtpTransceiver) {\n sender: %@\n receiver: %@\n}", 111*d9f75844SAndroid Build Coastguard Worker _sender, 112*d9f75844SAndroid Build Coastguard Worker _receiver]; 113*d9f75844SAndroid Build Coastguard Worker} 114*d9f75844SAndroid Build Coastguard Worker 115*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)object { 116*d9f75844SAndroid Build Coastguard Worker if (self == object) { 117*d9f75844SAndroid Build Coastguard Worker return YES; 118*d9f75844SAndroid Build Coastguard Worker } 119*d9f75844SAndroid Build Coastguard Worker if (object == nil) { 120*d9f75844SAndroid Build Coastguard Worker return NO; 121*d9f75844SAndroid Build Coastguard Worker } 122*d9f75844SAndroid Build Coastguard Worker if (![object isMemberOfClass:[self class]]) { 123*d9f75844SAndroid Build Coastguard Worker return NO; 124*d9f75844SAndroid Build Coastguard Worker } 125*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCRtpTransceiver) *transceiver = (RTC_OBJC_TYPE(RTCRtpTransceiver) *)object; 126*d9f75844SAndroid Build Coastguard Worker return _nativeRtpTransceiver == transceiver.nativeRtpTransceiver; 127*d9f75844SAndroid Build Coastguard Worker} 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker- (NSUInteger)hash { 130*d9f75844SAndroid Build Coastguard Worker return (NSUInteger)_nativeRtpTransceiver.get(); 131*d9f75844SAndroid Build Coastguard Worker} 132*d9f75844SAndroid Build Coastguard Worker 133*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private 134*d9f75844SAndroid Build Coastguard Worker 135*d9f75844SAndroid Build Coastguard Worker- (rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver { 136*d9f75844SAndroid Build Coastguard Worker return _nativeRtpTransceiver; 137*d9f75844SAndroid Build Coastguard Worker} 138*d9f75844SAndroid Build Coastguard Worker 139*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory 140*d9f75844SAndroid Build Coastguard Worker nativeRtpTransceiver: 141*d9f75844SAndroid Build Coastguard Worker (rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver { 142*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(factory); 143*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(nativeRtpTransceiver); 144*d9f75844SAndroid Build Coastguard Worker if (self = [super init]) { 145*d9f75844SAndroid Build Coastguard Worker _factory = factory; 146*d9f75844SAndroid Build Coastguard Worker _nativeRtpTransceiver = nativeRtpTransceiver; 147*d9f75844SAndroid Build Coastguard Worker _sender = [[RTC_OBJC_TYPE(RTCRtpSender) alloc] initWithFactory:_factory 148*d9f75844SAndroid Build Coastguard Worker nativeRtpSender:nativeRtpTransceiver->sender()]; 149*d9f75844SAndroid Build Coastguard Worker _receiver = 150*d9f75844SAndroid Build Coastguard Worker [[RTC_OBJC_TYPE(RTCRtpReceiver) alloc] initWithFactory:_factory 151*d9f75844SAndroid Build Coastguard Worker nativeRtpReceiver:nativeRtpTransceiver->receiver()]; 152*d9f75844SAndroid Build Coastguard Worker RTCLogInfo( 153*d9f75844SAndroid Build Coastguard Worker @"RTC_OBJC_TYPE(RTCRtpTransceiver)(%p): created transceiver: %@", self, self.description); 154*d9f75844SAndroid Build Coastguard Worker } 155*d9f75844SAndroid Build Coastguard Worker return self; 156*d9f75844SAndroid Build Coastguard Worker} 157*d9f75844SAndroid Build Coastguard Worker 158*d9f75844SAndroid Build Coastguard Worker+ (webrtc::RtpTransceiverDirection)nativeRtpTransceiverDirectionFromDirection: 159*d9f75844SAndroid Build Coastguard Worker (RTCRtpTransceiverDirection)direction { 160*d9f75844SAndroid Build Coastguard Worker switch (direction) { 161*d9f75844SAndroid Build Coastguard Worker case RTCRtpTransceiverDirectionSendRecv: 162*d9f75844SAndroid Build Coastguard Worker return webrtc::RtpTransceiverDirection::kSendRecv; 163*d9f75844SAndroid Build Coastguard Worker case RTCRtpTransceiverDirectionSendOnly: 164*d9f75844SAndroid Build Coastguard Worker return webrtc::RtpTransceiverDirection::kSendOnly; 165*d9f75844SAndroid Build Coastguard Worker case RTCRtpTransceiverDirectionRecvOnly: 166*d9f75844SAndroid Build Coastguard Worker return webrtc::RtpTransceiverDirection::kRecvOnly; 167*d9f75844SAndroid Build Coastguard Worker case RTCRtpTransceiverDirectionInactive: 168*d9f75844SAndroid Build Coastguard Worker return webrtc::RtpTransceiverDirection::kInactive; 169*d9f75844SAndroid Build Coastguard Worker case RTCRtpTransceiverDirectionStopped: 170*d9f75844SAndroid Build Coastguard Worker return webrtc::RtpTransceiverDirection::kStopped; 171*d9f75844SAndroid Build Coastguard Worker } 172*d9f75844SAndroid Build Coastguard Worker} 173*d9f75844SAndroid Build Coastguard Worker 174*d9f75844SAndroid Build Coastguard Worker+ (RTCRtpTransceiverDirection)rtpTransceiverDirectionFromNativeDirection: 175*d9f75844SAndroid Build Coastguard Worker (webrtc::RtpTransceiverDirection)nativeDirection { 176*d9f75844SAndroid Build Coastguard Worker switch (nativeDirection) { 177*d9f75844SAndroid Build Coastguard Worker case webrtc::RtpTransceiverDirection::kSendRecv: 178*d9f75844SAndroid Build Coastguard Worker return RTCRtpTransceiverDirectionSendRecv; 179*d9f75844SAndroid Build Coastguard Worker case webrtc::RtpTransceiverDirection::kSendOnly: 180*d9f75844SAndroid Build Coastguard Worker return RTCRtpTransceiverDirectionSendOnly; 181*d9f75844SAndroid Build Coastguard Worker case webrtc::RtpTransceiverDirection::kRecvOnly: 182*d9f75844SAndroid Build Coastguard Worker return RTCRtpTransceiverDirectionRecvOnly; 183*d9f75844SAndroid Build Coastguard Worker case webrtc::RtpTransceiverDirection::kInactive: 184*d9f75844SAndroid Build Coastguard Worker return RTCRtpTransceiverDirectionInactive; 185*d9f75844SAndroid Build Coastguard Worker case webrtc::RtpTransceiverDirection::kStopped: 186*d9f75844SAndroid Build Coastguard Worker return RTCRtpTransceiverDirectionStopped; 187*d9f75844SAndroid Build Coastguard Worker } 188*d9f75844SAndroid Build Coastguard Worker} 189*d9f75844SAndroid Build Coastguard Worker 190*d9f75844SAndroid Build Coastguard Worker@end 191