/* * Copyright 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #import "RTCRtpTransceiver+Private.h" #import "NSString+StdString.h" #import "RTCRtpEncodingParameters+Private.h" #import "RTCRtpParameters+Private.h" #import "RTCRtpReceiver+Private.h" #import "RTCRtpSender+Private.h" #import "WebRTC/RTCLogging.h" @implementation RTCRtpTransceiverInit @synthesize direction = _direction; @synthesize streamIds = _streamIds; @synthesize sendEncodings = _sendEncodings; - (instancetype)init { if (self = [super init]) { _direction = RTCRtpTransceiverDirectionSendRecv; } return self; } - (webrtc::RtpTransceiverInit)nativeInit { webrtc::RtpTransceiverInit init; init.direction = [RTCRtpTransceiver nativeRtpTransceiverDirectionFromDirection:_direction]; for (NSString *streamId in _streamIds) { init.stream_ids.push_back([streamId UTF8String]); } for (RTCRtpEncodingParameters *sendEncoding in _sendEncodings) { init.send_encodings.push_back(sendEncoding.nativeParameters); } return init; } @end @implementation RTCRtpTransceiver { RTCPeerConnectionFactory *_factory; rtc::scoped_refptr _nativeRtpTransceiver; } - (RTCRtpMediaType)mediaType { return [RTCRtpReceiver mediaTypeForNativeMediaType:_nativeRtpTransceiver->media_type()]; } - (NSString *)mid { if (_nativeRtpTransceiver->mid()) { return [NSString stringForStdString:*_nativeRtpTransceiver->mid()]; } else { return nil; } } @synthesize sender = _sender; @synthesize receiver = _receiver; - (BOOL)isStopped { return _nativeRtpTransceiver->stopped(); } - (RTCRtpTransceiverDirection)direction { return [RTCRtpTransceiver rtpTransceiverDirectionFromNativeDirection:_nativeRtpTransceiver->direction()]; } - (void)setDirection:(RTCRtpTransceiverDirection)direction { _nativeRtpTransceiver->SetDirection( [RTCRtpTransceiver nativeRtpTransceiverDirectionFromDirection:direction]); } - (BOOL)currentDirection:(RTCRtpTransceiverDirection *)currentDirectionOut { if (_nativeRtpTransceiver->current_direction()) { *currentDirectionOut = [RTCRtpTransceiver rtpTransceiverDirectionFromNativeDirection:*_nativeRtpTransceiver->current_direction()]; return YES; } else { return NO; } } - (void)stop { _nativeRtpTransceiver->Stop(); } - (NSString *)description { return [NSString stringWithFormat:@"RTCRtpTransceiver {\n sender: %@\n receiver: %@\n}", _sender, _receiver]; } - (BOOL)isEqual:(id)object { if (self == object) { return YES; } if (object == nil) { return NO; } if (![object isMemberOfClass:[self class]]) { return NO; } RTCRtpTransceiver *transceiver = (RTCRtpTransceiver *)object; return _nativeRtpTransceiver == transceiver.nativeRtpTransceiver; } - (NSUInteger)hash { return (NSUInteger)_nativeRtpTransceiver.get(); } #pragma mark - Private - (rtc::scoped_refptr)nativeRtpTransceiver { return _nativeRtpTransceiver; } - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory nativeRtpTransceiver: (rtc::scoped_refptr)nativeRtpTransceiver { NSParameterAssert(factory); NSParameterAssert(nativeRtpTransceiver); if (self = [super init]) { _factory = factory; _nativeRtpTransceiver = nativeRtpTransceiver; _sender = [[RTCRtpSender alloc] initWithFactory:_factory nativeRtpSender:nativeRtpTransceiver->sender()]; _receiver = [[RTCRtpReceiver alloc] initWithFactory:_factory nativeRtpReceiver:nativeRtpTransceiver->receiver()]; RTCLogInfo(@"RTCRtpTransceiver(%p): created transceiver: %@", self, self.description); } return self; } + (webrtc::RtpTransceiverDirection)nativeRtpTransceiverDirectionFromDirection: (RTCRtpTransceiverDirection)direction { switch (direction) { case RTCRtpTransceiverDirectionSendRecv: return webrtc::RtpTransceiverDirection::kSendRecv; case RTCRtpTransceiverDirectionSendOnly: return webrtc::RtpTransceiverDirection::kSendOnly; case RTCRtpTransceiverDirectionRecvOnly: return webrtc::RtpTransceiverDirection::kRecvOnly; case RTCRtpTransceiverDirectionInactive: return webrtc::RtpTransceiverDirection::kInactive; } } + (RTCRtpTransceiverDirection)rtpTransceiverDirectionFromNativeDirection: (webrtc::RtpTransceiverDirection)nativeDirection { switch (nativeDirection) { case webrtc::RtpTransceiverDirection::kSendRecv: return RTCRtpTransceiverDirectionSendRecv; case webrtc::RtpTransceiverDirection::kSendOnly: return RTCRtpTransceiverDirectionSendOnly; case webrtc::RtpTransceiverDirection::kRecvOnly: return RTCRtpTransceiverDirectionRecvOnly; case webrtc::RtpTransceiverDirection::kInactive: return RTCRtpTransceiverDirectionInactive; } } @end