blob: 60af86ac1b4fce15ca068269cc800d2f16d11c95 [file] [log] [blame]
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001/*
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#import "RTCRtpReceiver+Private.h"
12
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070013#import "RTCMediaStreamTrack+Private.h"
14#import "RTCRtpParameters+Private.h"
Benjamin Wrightddf1a3e2018-10-02 10:20:58 -070015#import "RTCRtpReceiver+Native.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020016#import "base/RTCLogging.h"
17#import "helpers/NSString+StdString.h"
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070018
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/media_stream_interface.h"
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070020
zhihuang4da058c2017-02-08 10:41:20 -080021namespace webrtc {
22
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020023RtpReceiverDelegateAdapter::RtpReceiverDelegateAdapter(RTC_OBJC_TYPE(RTCRtpReceiver) * receiver) {
zhihuang4da058c2017-02-08 10:41:20 -080024 RTC_CHECK(receiver);
25 receiver_ = receiver;
26}
27
28void RtpReceiverDelegateAdapter::OnFirstPacketReceived(
29 cricket::MediaType media_type) {
30 RTCRtpMediaType packet_media_type =
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020031 [RTC_OBJC_TYPE(RTCRtpReceiver) mediaTypeForNativeMediaType:media_type];
32 RTC_OBJC_TYPE(RTCRtpReceiver) *receiver = receiver_;
zhihuang4da058c2017-02-08 10:41:20 -080033 [receiver.delegate rtpReceiver:receiver didReceiveFirstPacketForMediaType:packet_media_type];
34}
35
36} // namespace webrtc
37
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020038@implementation RTC_OBJC_TYPE (RTCRtpReceiver) {
39 RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070040 rtc::scoped_refptr<webrtc::RtpReceiverInterface> _nativeRtpReceiver;
zhihuang4da058c2017-02-08 10:41:20 -080041 std::unique_ptr<webrtc::RtpReceiverDelegateAdapter> _observer;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070042}
43
zhihuang4da058c2017-02-08 10:41:20 -080044@synthesize delegate = _delegate;
45
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070046- (NSString *)receiverId {
47 return [NSString stringForStdString:_nativeRtpReceiver->id()];
48}
49
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020050- (RTC_OBJC_TYPE(RTCRtpParameters) *)parameters {
51 return [[RTC_OBJC_TYPE(RTCRtpParameters) alloc]
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070052 initWithNativeParameters:_nativeRtpReceiver->GetParameters()];
53}
54
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020055- (nullable RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070056 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
57 _nativeRtpReceiver->track());
58 if (nativeTrack) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020059 return [RTC_OBJC_TYPE(RTCMediaStreamTrack) mediaTrackForNativeTrack:nativeTrack
60 factory:_factory];
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070061 }
62 return nil;
63}
64
65- (NSString *)description {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020066 return [NSString
67 stringWithFormat:@"RTC_OBJC_TYPE(RTCRtpReceiver) {\n receiverId: %@\n}", self.receiverId];
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070068}
69
Yura Yaroshevicha5c735f2018-02-22 13:44:27 +030070- (void)dealloc {
71 if (_nativeRtpReceiver) {
72 _nativeRtpReceiver->SetObserver(nullptr);
73 }
74}
75
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070076- (BOOL)isEqual:(id)object {
77 if (self == object) {
78 return YES;
79 }
80 if (object == nil) {
81 return NO;
82 }
83 if (![object isMemberOfClass:[self class]]) {
84 return NO;
85 }
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020086 RTC_OBJC_TYPE(RTCRtpReceiver) *receiver = (RTC_OBJC_TYPE(RTCRtpReceiver) *)object;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070087 return _nativeRtpReceiver == receiver.nativeRtpReceiver;
88}
89
90- (NSUInteger)hash {
91 return (NSUInteger)_nativeRtpReceiver.get();
92}
93
Benjamin Wrightddf1a3e2018-10-02 10:20:58 -070094#pragma mark - Native
95
96- (void)setFrameDecryptor:(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>)frameDecryptor {
97 _nativeRtpReceiver->SetFrameDecryptor(frameDecryptor);
98}
99
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700100#pragma mark - Private
101
102- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
103 return _nativeRtpReceiver;
104}
105
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200106- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
Yura Yaroshevich7a16c542018-07-11 12:55:04 +0300107 nativeRtpReceiver:
108 (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700109 if (self = [super init]) {
Yura Yaroshevich7a16c542018-07-11 12:55:04 +0300110 _factory = factory;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700111 _nativeRtpReceiver = nativeRtpReceiver;
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200112 RTCLogInfo(@"RTC_OBJC_TYPE(RTCRtpReceiver)(%p): created receiver: %@", self, self.description);
zhihuang4da058c2017-02-08 10:41:20 -0800113 _observer.reset(new webrtc::RtpReceiverDelegateAdapter(self));
114 _nativeRtpReceiver->SetObserver(_observer.get());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700115 }
116 return self;
117}
118
zhihuang4da058c2017-02-08 10:41:20 -0800119+ (RTCRtpMediaType)mediaTypeForNativeMediaType:
120 (cricket::MediaType)nativeMediaType {
121 switch (nativeMediaType) {
122 case cricket::MEDIA_TYPE_AUDIO:
123 return RTCRtpMediaTypeAudio;
124 case cricket::MEDIA_TYPE_VIDEO:
125 return RTCRtpMediaTypeVideo;
126 case cricket::MEDIA_TYPE_DATA:
127 return RTCRtpMediaTypeData;
Philipp Hancke4e8c1152020-10-13 12:43:15 +0200128 case cricket::MEDIA_TYPE_UNSUPPORTED:
129 return RTCRtpMediaTypeUnsupported;
zhihuang4da058c2017-02-08 10:41:20 -0800130 }
131}
132
Steve Anton8cb344a2018-02-27 15:34:53 -0800133+ (cricket::MediaType)nativeMediaTypeForMediaType:(RTCRtpMediaType)mediaType {
134 switch (mediaType) {
135 case RTCRtpMediaTypeAudio:
136 return cricket::MEDIA_TYPE_AUDIO;
137 case RTCRtpMediaTypeVideo:
138 return cricket::MEDIA_TYPE_VIDEO;
139 case RTCRtpMediaTypeData:
140 return cricket::MEDIA_TYPE_DATA;
Philipp Hancke4e8c1152020-10-13 12:43:15 +0200141 case RTCRtpMediaTypeUnsupported:
142 return cricket::MEDIA_TYPE_UNSUPPORTED;
Steve Anton8cb344a2018-02-27 15:34:53 -0800143 }
144}
145
146+ (NSString *)stringForMediaType:(RTCRtpMediaType)mediaType {
147 switch (mediaType) {
148 case RTCRtpMediaTypeAudio:
149 return @"AUDIO";
150 case RTCRtpMediaTypeVideo:
151 return @"VIDEO";
152 case RTCRtpMediaTypeData:
153 return @"DATA";
Philipp Hancke4e8c1152020-10-13 12:43:15 +0200154 case RTCRtpMediaTypeUnsupported:
155 return @"UNSUPPORTED";
Steve Anton8cb344a2018-02-27 15:34:53 -0800156 }
157}
158
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700159@end