xref: /aosp_15_r20/external/webrtc/sdk/objc/api/peerconnection/RTCRtpReceiver.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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