blob: 1342c166c0e89e331c6a75ca5c9c10133247a758 [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
13#import "NSString+StdString.h"
14#import "RTCMediaStreamTrack+Private.h"
15#import "RTCRtpParameters+Private.h"
16#import "WebRTC/RTCLogging.h"
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/mediastreaminterface.h"
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070019
zhihuang4da058c2017-02-08 10:41:20 -080020namespace webrtc {
21
22RtpReceiverDelegateAdapter::RtpReceiverDelegateAdapter(
23 RTCRtpReceiver *receiver) {
24 RTC_CHECK(receiver);
25 receiver_ = receiver;
26}
27
28void RtpReceiverDelegateAdapter::OnFirstPacketReceived(
29 cricket::MediaType media_type) {
30 RTCRtpMediaType packet_media_type =
31 [RTCRtpReceiver mediaTypeForNativeMediaType:media_type];
32 RTCRtpReceiver *receiver = receiver_;
33 [receiver.delegate rtpReceiver:receiver didReceiveFirstPacketForMediaType:packet_media_type];
34}
35
36} // namespace webrtc
37
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070038@implementation RTCRtpReceiver {
Yura Yaroshevich7a16c542018-07-11 12:55:04 +030039 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
50- (RTCRtpParameters *)parameters {
51 return [[RTCRtpParameters alloc]
52 initWithNativeParameters:_nativeRtpReceiver->GetParameters()];
53}
54
55- (void)setParameters:(RTCRtpParameters *)parameters {
56 if (!_nativeRtpReceiver->SetParameters(parameters.nativeParameters)) {
57 RTCLogError(@"RTCRtpReceiver(%p): Failed to set parameters: %@", self,
58 parameters);
59 }
60}
61
Peter Hanspersd9b64cd2018-01-12 16:16:18 +010062- (nullable RTCMediaStreamTrack *)track {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070063 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
64 _nativeRtpReceiver->track());
65 if (nativeTrack) {
Yura Yaroshevich415920b2018-02-22 13:55:22 +030066 return [RTCMediaStreamTrack mediaTrackForNativeTrack:nativeTrack];
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070067 }
68 return nil;
69}
70
71- (NSString *)description {
72 return [NSString stringWithFormat:@"RTCRtpReceiver {\n receiverId: %@\n}",
73 self.receiverId];
74}
75
Yura Yaroshevicha5c735f2018-02-22 13:44:27 +030076- (void)dealloc {
77 if (_nativeRtpReceiver) {
78 _nativeRtpReceiver->SetObserver(nullptr);
79 }
80}
81
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070082- (BOOL)isEqual:(id)object {
83 if (self == object) {
84 return YES;
85 }
86 if (object == nil) {
87 return NO;
88 }
89 if (![object isMemberOfClass:[self class]]) {
90 return NO;
91 }
92 RTCRtpReceiver *receiver = (RTCRtpReceiver *)object;
93 return _nativeRtpReceiver == receiver.nativeRtpReceiver;
94}
95
96- (NSUInteger)hash {
97 return (NSUInteger)_nativeRtpReceiver.get();
98}
99
100#pragma mark - Private
101
102- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
103 return _nativeRtpReceiver;
104}
105
Yura Yaroshevich7a16c542018-07-11 12:55:04 +0300106- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
107 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;
112 RTCLogInfo(
113 @"RTCRtpReceiver(%p): created receiver: %@", self, self.description);
zhihuang4da058c2017-02-08 10:41:20 -0800114 _observer.reset(new webrtc::RtpReceiverDelegateAdapter(self));
115 _nativeRtpReceiver->SetObserver(_observer.get());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700116 }
117 return self;
118}
119
zhihuang4da058c2017-02-08 10:41:20 -0800120+ (RTCRtpMediaType)mediaTypeForNativeMediaType:
121 (cricket::MediaType)nativeMediaType {
122 switch (nativeMediaType) {
123 case cricket::MEDIA_TYPE_AUDIO:
124 return RTCRtpMediaTypeAudio;
125 case cricket::MEDIA_TYPE_VIDEO:
126 return RTCRtpMediaTypeVideo;
127 case cricket::MEDIA_TYPE_DATA:
128 return RTCRtpMediaTypeData;
129 }
130}
131
Steve Anton8cb344a2018-02-27 15:34:53 -0800132+ (cricket::MediaType)nativeMediaTypeForMediaType:(RTCRtpMediaType)mediaType {
133 switch (mediaType) {
134 case RTCRtpMediaTypeAudio:
135 return cricket::MEDIA_TYPE_AUDIO;
136 case RTCRtpMediaTypeVideo:
137 return cricket::MEDIA_TYPE_VIDEO;
138 case RTCRtpMediaTypeData:
139 return cricket::MEDIA_TYPE_DATA;
140 }
141}
142
143+ (NSString *)stringForMediaType:(RTCRtpMediaType)mediaType {
144 switch (mediaType) {
145 case RTCRtpMediaTypeAudio:
146 return @"AUDIO";
147 case RTCRtpMediaTypeVideo:
148 return @"VIDEO";
149 case RTCRtpMediaTypeData:
150 return @"DATA";
151 }
152}
153
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700154@end