1*d9f75844SAndroid Build Coastguard Worker/* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2016 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 "RTCRtpReceiver+Private.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker#import "RTCMediaStreamTrack+Private.h" 14*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpParameters+Private.h" 15*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpReceiver+Native.h" 16*d9f75844SAndroid Build Coastguard Worker#import "base/RTCLogging.h" 17*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h" 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker#include "api/media_stream_interface.h" 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Workernamespace webrtc { 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard WorkerRtpReceiverDelegateAdapter::RtpReceiverDelegateAdapter(RTC_OBJC_TYPE(RTCRtpReceiver) * receiver) { 24*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(receiver); 25*d9f75844SAndroid Build Coastguard Worker receiver_ = receiver; 26*d9f75844SAndroid Build Coastguard Worker} 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Workervoid RtpReceiverDelegateAdapter::OnFirstPacketReceived( 29*d9f75844SAndroid Build Coastguard Worker cricket::MediaType media_type) { 30*d9f75844SAndroid Build Coastguard Worker RTCRtpMediaType packet_media_type = 31*d9f75844SAndroid Build Coastguard Worker [RTC_OBJC_TYPE(RTCRtpReceiver) mediaTypeForNativeMediaType:media_type]; 32*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCRtpReceiver) *receiver = receiver_; 33*d9f75844SAndroid Build Coastguard Worker [receiver.delegate rtpReceiver:receiver didReceiveFirstPacketForMediaType:packet_media_type]; 34*d9f75844SAndroid Build Coastguard Worker} 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker} // namespace webrtc 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCRtpReceiver) { 39*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory; 40*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::RtpReceiverInterface> _nativeRtpReceiver; 41*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::RtpReceiverDelegateAdapter> _observer; 42*d9f75844SAndroid Build Coastguard Worker} 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker@synthesize delegate = _delegate; 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker- (NSString *)receiverId { 47*d9f75844SAndroid Build Coastguard Worker return [NSString stringForStdString:_nativeRtpReceiver->id()]; 48*d9f75844SAndroid Build Coastguard Worker} 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker- (RTC_OBJC_TYPE(RTCRtpParameters) *)parameters { 51*d9f75844SAndroid Build Coastguard Worker return [[RTC_OBJC_TYPE(RTCRtpParameters) alloc] 52*d9f75844SAndroid Build Coastguard Worker initWithNativeParameters:_nativeRtpReceiver->GetParameters()]; 53*d9f75844SAndroid Build Coastguard Worker} 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker- (nullable RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track { 56*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack( 57*d9f75844SAndroid Build Coastguard Worker _nativeRtpReceiver->track()); 58*d9f75844SAndroid Build Coastguard Worker if (nativeTrack) { 59*d9f75844SAndroid Build Coastguard Worker return [RTC_OBJC_TYPE(RTCMediaStreamTrack) mediaTrackForNativeTrack:nativeTrack 60*d9f75844SAndroid Build Coastguard Worker factory:_factory]; 61*d9f75844SAndroid Build Coastguard Worker } 62*d9f75844SAndroid Build Coastguard Worker return nil; 63*d9f75844SAndroid Build Coastguard Worker} 64*d9f75844SAndroid Build Coastguard Worker 65*d9f75844SAndroid Build Coastguard Worker- (NSString *)description { 66*d9f75844SAndroid Build Coastguard Worker return [NSString 67*d9f75844SAndroid Build Coastguard Worker stringWithFormat:@"RTC_OBJC_TYPE(RTCRtpReceiver) {\n receiverId: %@\n}", self.receiverId]; 68*d9f75844SAndroid Build Coastguard Worker} 69*d9f75844SAndroid Build Coastguard Worker 70*d9f75844SAndroid Build Coastguard Worker- (void)dealloc { 71*d9f75844SAndroid Build Coastguard Worker if (_nativeRtpReceiver) { 72*d9f75844SAndroid Build Coastguard Worker _nativeRtpReceiver->SetObserver(nullptr); 73*d9f75844SAndroid Build Coastguard Worker } 74*d9f75844SAndroid Build Coastguard Worker} 75*d9f75844SAndroid Build Coastguard Worker 76*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)object { 77*d9f75844SAndroid Build Coastguard Worker if (self == object) { 78*d9f75844SAndroid Build Coastguard Worker return YES; 79*d9f75844SAndroid Build Coastguard Worker } 80*d9f75844SAndroid Build Coastguard Worker if (object == nil) { 81*d9f75844SAndroid Build Coastguard Worker return NO; 82*d9f75844SAndroid Build Coastguard Worker } 83*d9f75844SAndroid Build Coastguard Worker if (![object isMemberOfClass:[self class]]) { 84*d9f75844SAndroid Build Coastguard Worker return NO; 85*d9f75844SAndroid Build Coastguard Worker } 86*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCRtpReceiver) *receiver = (RTC_OBJC_TYPE(RTCRtpReceiver) *)object; 87*d9f75844SAndroid Build Coastguard Worker return _nativeRtpReceiver == receiver.nativeRtpReceiver; 88*d9f75844SAndroid Build Coastguard Worker} 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker- (NSUInteger)hash { 91*d9f75844SAndroid Build Coastguard Worker return (NSUInteger)_nativeRtpReceiver.get(); 92*d9f75844SAndroid Build Coastguard Worker} 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker#pragma mark - Native 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker- (void)setFrameDecryptor:(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>)frameDecryptor { 97*d9f75844SAndroid Build Coastguard Worker _nativeRtpReceiver->SetFrameDecryptor(frameDecryptor); 98*d9f75844SAndroid Build Coastguard Worker} 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private 101*d9f75844SAndroid Build Coastguard Worker 102*d9f75844SAndroid Build Coastguard Worker- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver { 103*d9f75844SAndroid Build Coastguard Worker return _nativeRtpReceiver; 104*d9f75844SAndroid Build Coastguard Worker} 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory 107*d9f75844SAndroid Build Coastguard Worker nativeRtpReceiver: 108*d9f75844SAndroid Build Coastguard Worker (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver { 109*d9f75844SAndroid Build Coastguard Worker if (self = [super init]) { 110*d9f75844SAndroid Build Coastguard Worker _factory = factory; 111*d9f75844SAndroid Build Coastguard Worker _nativeRtpReceiver = nativeRtpReceiver; 112*d9f75844SAndroid Build Coastguard Worker RTCLogInfo(@"RTC_OBJC_TYPE(RTCRtpReceiver)(%p): created receiver: %@", self, self.description); 113*d9f75844SAndroid Build Coastguard Worker _observer.reset(new webrtc::RtpReceiverDelegateAdapter(self)); 114*d9f75844SAndroid Build Coastguard Worker _nativeRtpReceiver->SetObserver(_observer.get()); 115*d9f75844SAndroid Build Coastguard Worker } 116*d9f75844SAndroid Build Coastguard Worker return self; 117*d9f75844SAndroid Build Coastguard Worker} 118*d9f75844SAndroid Build Coastguard Worker 119*d9f75844SAndroid Build Coastguard Worker+ (RTCRtpMediaType)mediaTypeForNativeMediaType: 120*d9f75844SAndroid Build Coastguard Worker (cricket::MediaType)nativeMediaType { 121*d9f75844SAndroid Build Coastguard Worker switch (nativeMediaType) { 122*d9f75844SAndroid Build Coastguard Worker case cricket::MEDIA_TYPE_AUDIO: 123*d9f75844SAndroid Build Coastguard Worker return RTCRtpMediaTypeAudio; 124*d9f75844SAndroid Build Coastguard Worker case cricket::MEDIA_TYPE_VIDEO: 125*d9f75844SAndroid Build Coastguard Worker return RTCRtpMediaTypeVideo; 126*d9f75844SAndroid Build Coastguard Worker case cricket::MEDIA_TYPE_DATA: 127*d9f75844SAndroid Build Coastguard Worker return RTCRtpMediaTypeData; 128*d9f75844SAndroid Build Coastguard Worker case cricket::MEDIA_TYPE_UNSUPPORTED: 129*d9f75844SAndroid Build Coastguard Worker return RTCRtpMediaTypeUnsupported; 130*d9f75844SAndroid Build Coastguard Worker } 131*d9f75844SAndroid Build Coastguard Worker} 132*d9f75844SAndroid Build Coastguard Worker 133*d9f75844SAndroid Build Coastguard Worker+ (cricket::MediaType)nativeMediaTypeForMediaType:(RTCRtpMediaType)mediaType { 134*d9f75844SAndroid Build Coastguard Worker switch (mediaType) { 135*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeAudio: 136*d9f75844SAndroid Build Coastguard Worker return cricket::MEDIA_TYPE_AUDIO; 137*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeVideo: 138*d9f75844SAndroid Build Coastguard Worker return cricket::MEDIA_TYPE_VIDEO; 139*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeData: 140*d9f75844SAndroid Build Coastguard Worker return cricket::MEDIA_TYPE_DATA; 141*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeUnsupported: 142*d9f75844SAndroid Build Coastguard Worker return cricket::MEDIA_TYPE_UNSUPPORTED; 143*d9f75844SAndroid Build Coastguard Worker } 144*d9f75844SAndroid Build Coastguard Worker} 145*d9f75844SAndroid Build Coastguard Worker 146*d9f75844SAndroid Build Coastguard Worker+ (NSString *)stringForMediaType:(RTCRtpMediaType)mediaType { 147*d9f75844SAndroid Build Coastguard Worker switch (mediaType) { 148*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeAudio: 149*d9f75844SAndroid Build Coastguard Worker return @"AUDIO"; 150*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeVideo: 151*d9f75844SAndroid Build Coastguard Worker return @"VIDEO"; 152*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeData: 153*d9f75844SAndroid Build Coastguard Worker return @"DATA"; 154*d9f75844SAndroid Build Coastguard Worker case RTCRtpMediaTypeUnsupported: 155*d9f75844SAndroid Build Coastguard Worker return @"UNSUPPORTED"; 156*d9f75844SAndroid Build Coastguard Worker } 157*d9f75844SAndroid Build Coastguard Worker} 158*d9f75844SAndroid Build Coastguard Worker 159*d9f75844SAndroid Build Coastguard Worker@end 160