blob: 5d444782c2084c55c63dc18b4af288b27452a89b [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
23RtpReceiverDelegateAdapter::RtpReceiverDelegateAdapter(
24 RTCRtpReceiver *receiver) {
25 RTC_CHECK(receiver);
26 receiver_ = receiver;
27}
28
29void RtpReceiverDelegateAdapter::OnFirstPacketReceived(
30 cricket::MediaType media_type) {
31 RTCRtpMediaType packet_media_type =
32 [RTCRtpReceiver mediaTypeForNativeMediaType:media_type];
33 RTCRtpReceiver *receiver = receiver_;
34 [receiver.delegate rtpReceiver:receiver didReceiveFirstPacketForMediaType:packet_media_type];
35}
36
37} // namespace webrtc
38
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070039@implementation RTCRtpReceiver {
Yura Yaroshevich7a16c542018-07-11 12:55:04 +030040 RTCPeerConnectionFactory *_factory;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070041 rtc::scoped_refptr<webrtc::RtpReceiverInterface> _nativeRtpReceiver;
zhihuang4da058c2017-02-08 10:41:20 -080042 std::unique_ptr<webrtc::RtpReceiverDelegateAdapter> _observer;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070043}
44
zhihuang4da058c2017-02-08 10:41:20 -080045@synthesize delegate = _delegate;
46
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070047- (NSString *)receiverId {
48 return [NSString stringForStdString:_nativeRtpReceiver->id()];
49}
50
51- (RTCRtpParameters *)parameters {
52 return [[RTCRtpParameters alloc]
53 initWithNativeParameters:_nativeRtpReceiver->GetParameters()];
54}
55
56- (void)setParameters:(RTCRtpParameters *)parameters {
57 if (!_nativeRtpReceiver->SetParameters(parameters.nativeParameters)) {
58 RTCLogError(@"RTCRtpReceiver(%p): Failed to set parameters: %@", self,
59 parameters);
60 }
61}
62
Peter Hanspersd9b64cd2018-01-12 16:16:18 +010063- (nullable RTCMediaStreamTrack *)track {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070064 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
65 _nativeRtpReceiver->track());
66 if (nativeTrack) {
Yura Yaroshevich01cee072018-07-11 15:35:40 +030067 return [RTCMediaStreamTrack mediaTrackForNativeTrack:nativeTrack factory:_factory];
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070068 }
69 return nil;
70}
71
72- (NSString *)description {
73 return [NSString stringWithFormat:@"RTCRtpReceiver {\n receiverId: %@\n}",
74 self.receiverId];
75}
76
Yura Yaroshevicha5c735f2018-02-22 13:44:27 +030077- (void)dealloc {
78 if (_nativeRtpReceiver) {
79 _nativeRtpReceiver->SetObserver(nullptr);
80 }
81}
82
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070083- (BOOL)isEqual:(id)object {
84 if (self == object) {
85 return YES;
86 }
87 if (object == nil) {
88 return NO;
89 }
90 if (![object isMemberOfClass:[self class]]) {
91 return NO;
92 }
93 RTCRtpReceiver *receiver = (RTCRtpReceiver *)object;
94 return _nativeRtpReceiver == receiver.nativeRtpReceiver;
95}
96
97- (NSUInteger)hash {
98 return (NSUInteger)_nativeRtpReceiver.get();
99}
100
Benjamin Wrightddf1a3e2018-10-02 10:20:58 -0700101#pragma mark - Native
102
103- (void)setFrameDecryptor:(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>)frameDecryptor {
104 _nativeRtpReceiver->SetFrameDecryptor(frameDecryptor);
105}
106
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700107#pragma mark - Private
108
109- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
110 return _nativeRtpReceiver;
111}
112
Yura Yaroshevich7a16c542018-07-11 12:55:04 +0300113- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
114 nativeRtpReceiver:
115 (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700116 if (self = [super init]) {
Yura Yaroshevich7a16c542018-07-11 12:55:04 +0300117 _factory = factory;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700118 _nativeRtpReceiver = nativeRtpReceiver;
119 RTCLogInfo(
120 @"RTCRtpReceiver(%p): created receiver: %@", self, self.description);
zhihuang4da058c2017-02-08 10:41:20 -0800121 _observer.reset(new webrtc::RtpReceiverDelegateAdapter(self));
122 _nativeRtpReceiver->SetObserver(_observer.get());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700123 }
124 return self;
125}
126
zhihuang4da058c2017-02-08 10:41:20 -0800127+ (RTCRtpMediaType)mediaTypeForNativeMediaType:
128 (cricket::MediaType)nativeMediaType {
129 switch (nativeMediaType) {
130 case cricket::MEDIA_TYPE_AUDIO:
131 return RTCRtpMediaTypeAudio;
132 case cricket::MEDIA_TYPE_VIDEO:
133 return RTCRtpMediaTypeVideo;
134 case cricket::MEDIA_TYPE_DATA:
135 return RTCRtpMediaTypeData;
136 }
137}
138
Steve Anton8cb344a2018-02-27 15:34:53 -0800139+ (cricket::MediaType)nativeMediaTypeForMediaType:(RTCRtpMediaType)mediaType {
140 switch (mediaType) {
141 case RTCRtpMediaTypeAudio:
142 return cricket::MEDIA_TYPE_AUDIO;
143 case RTCRtpMediaTypeVideo:
144 return cricket::MEDIA_TYPE_VIDEO;
145 case RTCRtpMediaTypeData:
146 return cricket::MEDIA_TYPE_DATA;
147 }
148}
149
150+ (NSString *)stringForMediaType:(RTCRtpMediaType)mediaType {
151 switch (mediaType) {
152 case RTCRtpMediaTypeAudio:
153 return @"AUDIO";
154 case RTCRtpMediaTypeVideo:
155 return @"VIDEO";
156 case RTCRtpMediaTypeData:
157 return @"DATA";
158 }
159}
160
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700161@end