xref: /aosp_15_r20/external/webrtc/sdk/objc/api/peerconnection/RTCRtpTransceiver.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker/*
2*d9f75844SAndroid Build Coastguard Worker *  Copyright 2018 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 "RTCRtpTransceiver+Private.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpEncodingParameters+Private.h"
14*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpParameters+Private.h"
15*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpReceiver+Private.h"
16*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpSender+Private.h"
17*d9f75844SAndroid Build Coastguard Worker#import "base/RTCLogging.h"
18*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h"
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard WorkerNSString *const kRTCRtpTransceiverErrorDomain = @"org.webrtc.RTCRtpTranceiver";
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCRtpTransceiverInit)
23*d9f75844SAndroid Build Coastguard Worker
24*d9f75844SAndroid Build Coastguard Worker@synthesize direction = _direction;
25*d9f75844SAndroid Build Coastguard Worker@synthesize streamIds = _streamIds;
26*d9f75844SAndroid Build Coastguard Worker@synthesize sendEncodings = _sendEncodings;
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker- (instancetype)init {
29*d9f75844SAndroid Build Coastguard Worker  if (self = [super init]) {
30*d9f75844SAndroid Build Coastguard Worker    _direction = RTCRtpTransceiverDirectionSendRecv;
31*d9f75844SAndroid Build Coastguard Worker  }
32*d9f75844SAndroid Build Coastguard Worker  return self;
33*d9f75844SAndroid Build Coastguard Worker}
34*d9f75844SAndroid Build Coastguard Worker
35*d9f75844SAndroid Build Coastguard Worker- (webrtc::RtpTransceiverInit)nativeInit {
36*d9f75844SAndroid Build Coastguard Worker  webrtc::RtpTransceiverInit init;
37*d9f75844SAndroid Build Coastguard Worker  init.direction =
38*d9f75844SAndroid Build Coastguard Worker      [RTC_OBJC_TYPE(RTCRtpTransceiver) nativeRtpTransceiverDirectionFromDirection:_direction];
39*d9f75844SAndroid Build Coastguard Worker  for (NSString *streamId in _streamIds) {
40*d9f75844SAndroid Build Coastguard Worker    init.stream_ids.push_back([streamId UTF8String]);
41*d9f75844SAndroid Build Coastguard Worker  }
42*d9f75844SAndroid Build Coastguard Worker  for (RTC_OBJC_TYPE(RTCRtpEncodingParameters) * sendEncoding in _sendEncodings) {
43*d9f75844SAndroid Build Coastguard Worker    init.send_encodings.push_back(sendEncoding.nativeParameters);
44*d9f75844SAndroid Build Coastguard Worker  }
45*d9f75844SAndroid Build Coastguard Worker  return init;
46*d9f75844SAndroid Build Coastguard Worker}
47*d9f75844SAndroid Build Coastguard Worker
48*d9f75844SAndroid Build Coastguard Worker@end
49*d9f75844SAndroid Build Coastguard Worker
50*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCRtpTransceiver) {
51*d9f75844SAndroid Build Coastguard Worker  RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory;
52*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::RtpTransceiverInterface> _nativeRtpTransceiver;
53*d9f75844SAndroid Build Coastguard Worker}
54*d9f75844SAndroid Build Coastguard Worker
55*d9f75844SAndroid Build Coastguard Worker- (RTCRtpMediaType)mediaType {
56*d9f75844SAndroid Build Coastguard Worker  return [RTC_OBJC_TYPE(RTCRtpReceiver)
57*d9f75844SAndroid Build Coastguard Worker      mediaTypeForNativeMediaType:_nativeRtpTransceiver->media_type()];
58*d9f75844SAndroid Build Coastguard Worker}
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard Worker- (NSString *)mid {
61*d9f75844SAndroid Build Coastguard Worker  if (_nativeRtpTransceiver->mid()) {
62*d9f75844SAndroid Build Coastguard Worker    return [NSString stringForStdString:*_nativeRtpTransceiver->mid()];
63*d9f75844SAndroid Build Coastguard Worker  } else {
64*d9f75844SAndroid Build Coastguard Worker    return nil;
65*d9f75844SAndroid Build Coastguard Worker  }
66*d9f75844SAndroid Build Coastguard Worker}
67*d9f75844SAndroid Build Coastguard Worker
68*d9f75844SAndroid Build Coastguard Worker@synthesize sender = _sender;
69*d9f75844SAndroid Build Coastguard Worker@synthesize receiver = _receiver;
70*d9f75844SAndroid Build Coastguard Worker
71*d9f75844SAndroid Build Coastguard Worker- (BOOL)isStopped {
72*d9f75844SAndroid Build Coastguard Worker  return _nativeRtpTransceiver->stopped();
73*d9f75844SAndroid Build Coastguard Worker}
74*d9f75844SAndroid Build Coastguard Worker
75*d9f75844SAndroid Build Coastguard Worker- (RTCRtpTransceiverDirection)direction {
76*d9f75844SAndroid Build Coastguard Worker  return [RTC_OBJC_TYPE(RTCRtpTransceiver)
77*d9f75844SAndroid Build Coastguard Worker      rtpTransceiverDirectionFromNativeDirection:_nativeRtpTransceiver->direction()];
78*d9f75844SAndroid Build Coastguard Worker}
79*d9f75844SAndroid Build Coastguard Worker
80*d9f75844SAndroid Build Coastguard Worker- (void)setDirection:(RTCRtpTransceiverDirection)direction error:(NSError **)error {
81*d9f75844SAndroid Build Coastguard Worker  webrtc::RTCError nativeError = _nativeRtpTransceiver->SetDirectionWithError(
82*d9f75844SAndroid Build Coastguard Worker      [RTC_OBJC_TYPE(RTCRtpTransceiver) nativeRtpTransceiverDirectionFromDirection:direction]);
83*d9f75844SAndroid Build Coastguard Worker
84*d9f75844SAndroid Build Coastguard Worker  if (!nativeError.ok() && error) {
85*d9f75844SAndroid Build Coastguard Worker    *error = [NSError errorWithDomain:kRTCRtpTransceiverErrorDomain
86*d9f75844SAndroid Build Coastguard Worker                                 code:static_cast<int>(nativeError.type())
87*d9f75844SAndroid Build Coastguard Worker                             userInfo:@{
88*d9f75844SAndroid Build Coastguard Worker                               @"message" : [NSString stringWithCString:nativeError.message()
89*d9f75844SAndroid Build Coastguard Worker                                                               encoding:NSUTF8StringEncoding]
90*d9f75844SAndroid Build Coastguard Worker                             }];
91*d9f75844SAndroid Build Coastguard Worker  }
92*d9f75844SAndroid Build Coastguard Worker}
93*d9f75844SAndroid Build Coastguard Worker
94*d9f75844SAndroid Build Coastguard Worker- (BOOL)currentDirection:(RTCRtpTransceiverDirection *)currentDirectionOut {
95*d9f75844SAndroid Build Coastguard Worker  if (_nativeRtpTransceiver->current_direction()) {
96*d9f75844SAndroid Build Coastguard Worker    *currentDirectionOut = [RTC_OBJC_TYPE(RTCRtpTransceiver)
97*d9f75844SAndroid Build Coastguard Worker        rtpTransceiverDirectionFromNativeDirection:*_nativeRtpTransceiver->current_direction()];
98*d9f75844SAndroid Build Coastguard Worker    return YES;
99*d9f75844SAndroid Build Coastguard Worker  } else {
100*d9f75844SAndroid Build Coastguard Worker    return NO;
101*d9f75844SAndroid Build Coastguard Worker  }
102*d9f75844SAndroid Build Coastguard Worker}
103*d9f75844SAndroid Build Coastguard Worker
104*d9f75844SAndroid Build Coastguard Worker- (void)stopInternal {
105*d9f75844SAndroid Build Coastguard Worker  _nativeRtpTransceiver->StopInternal();
106*d9f75844SAndroid Build Coastguard Worker}
107*d9f75844SAndroid Build Coastguard Worker
108*d9f75844SAndroid Build Coastguard Worker- (NSString *)description {
109*d9f75844SAndroid Build Coastguard Worker  return [NSString
110*d9f75844SAndroid Build Coastguard Worker      stringWithFormat:@"RTC_OBJC_TYPE(RTCRtpTransceiver) {\n  sender: %@\n  receiver: %@\n}",
111*d9f75844SAndroid Build Coastguard Worker                       _sender,
112*d9f75844SAndroid Build Coastguard Worker                       _receiver];
113*d9f75844SAndroid Build Coastguard Worker}
114*d9f75844SAndroid Build Coastguard Worker
115*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)object {
116*d9f75844SAndroid Build Coastguard Worker  if (self == object) {
117*d9f75844SAndroid Build Coastguard Worker    return YES;
118*d9f75844SAndroid Build Coastguard Worker  }
119*d9f75844SAndroid Build Coastguard Worker  if (object == nil) {
120*d9f75844SAndroid Build Coastguard Worker    return NO;
121*d9f75844SAndroid Build Coastguard Worker  }
122*d9f75844SAndroid Build Coastguard Worker  if (![object isMemberOfClass:[self class]]) {
123*d9f75844SAndroid Build Coastguard Worker    return NO;
124*d9f75844SAndroid Build Coastguard Worker  }
125*d9f75844SAndroid Build Coastguard Worker  RTC_OBJC_TYPE(RTCRtpTransceiver) *transceiver = (RTC_OBJC_TYPE(RTCRtpTransceiver) *)object;
126*d9f75844SAndroid Build Coastguard Worker  return _nativeRtpTransceiver == transceiver.nativeRtpTransceiver;
127*d9f75844SAndroid Build Coastguard Worker}
128*d9f75844SAndroid Build Coastguard Worker
129*d9f75844SAndroid Build Coastguard Worker- (NSUInteger)hash {
130*d9f75844SAndroid Build Coastguard Worker  return (NSUInteger)_nativeRtpTransceiver.get();
131*d9f75844SAndroid Build Coastguard Worker}
132*d9f75844SAndroid Build Coastguard Worker
133*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private
134*d9f75844SAndroid Build Coastguard Worker
135*d9f75844SAndroid Build Coastguard Worker- (rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver {
136*d9f75844SAndroid Build Coastguard Worker  return _nativeRtpTransceiver;
137*d9f75844SAndroid Build Coastguard Worker}
138*d9f75844SAndroid Build Coastguard Worker
139*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
140*d9f75844SAndroid Build Coastguard Worker           nativeRtpTransceiver:
141*d9f75844SAndroid Build Coastguard Worker               (rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver {
142*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(factory);
143*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(nativeRtpTransceiver);
144*d9f75844SAndroid Build Coastguard Worker  if (self = [super init]) {
145*d9f75844SAndroid Build Coastguard Worker    _factory = factory;
146*d9f75844SAndroid Build Coastguard Worker    _nativeRtpTransceiver = nativeRtpTransceiver;
147*d9f75844SAndroid Build Coastguard Worker    _sender = [[RTC_OBJC_TYPE(RTCRtpSender) alloc] initWithFactory:_factory
148*d9f75844SAndroid Build Coastguard Worker                                                   nativeRtpSender:nativeRtpTransceiver->sender()];
149*d9f75844SAndroid Build Coastguard Worker    _receiver =
150*d9f75844SAndroid Build Coastguard Worker        [[RTC_OBJC_TYPE(RTCRtpReceiver) alloc] initWithFactory:_factory
151*d9f75844SAndroid Build Coastguard Worker                                             nativeRtpReceiver:nativeRtpTransceiver->receiver()];
152*d9f75844SAndroid Build Coastguard Worker    RTCLogInfo(
153*d9f75844SAndroid Build Coastguard Worker        @"RTC_OBJC_TYPE(RTCRtpTransceiver)(%p): created transceiver: %@", self, self.description);
154*d9f75844SAndroid Build Coastguard Worker  }
155*d9f75844SAndroid Build Coastguard Worker  return self;
156*d9f75844SAndroid Build Coastguard Worker}
157*d9f75844SAndroid Build Coastguard Worker
158*d9f75844SAndroid Build Coastguard Worker+ (webrtc::RtpTransceiverDirection)nativeRtpTransceiverDirectionFromDirection:
159*d9f75844SAndroid Build Coastguard Worker        (RTCRtpTransceiverDirection)direction {
160*d9f75844SAndroid Build Coastguard Worker  switch (direction) {
161*d9f75844SAndroid Build Coastguard Worker    case RTCRtpTransceiverDirectionSendRecv:
162*d9f75844SAndroid Build Coastguard Worker      return webrtc::RtpTransceiverDirection::kSendRecv;
163*d9f75844SAndroid Build Coastguard Worker    case RTCRtpTransceiverDirectionSendOnly:
164*d9f75844SAndroid Build Coastguard Worker      return webrtc::RtpTransceiverDirection::kSendOnly;
165*d9f75844SAndroid Build Coastguard Worker    case RTCRtpTransceiverDirectionRecvOnly:
166*d9f75844SAndroid Build Coastguard Worker      return webrtc::RtpTransceiverDirection::kRecvOnly;
167*d9f75844SAndroid Build Coastguard Worker    case RTCRtpTransceiverDirectionInactive:
168*d9f75844SAndroid Build Coastguard Worker      return webrtc::RtpTransceiverDirection::kInactive;
169*d9f75844SAndroid Build Coastguard Worker    case RTCRtpTransceiverDirectionStopped:
170*d9f75844SAndroid Build Coastguard Worker      return webrtc::RtpTransceiverDirection::kStopped;
171*d9f75844SAndroid Build Coastguard Worker  }
172*d9f75844SAndroid Build Coastguard Worker}
173*d9f75844SAndroid Build Coastguard Worker
174*d9f75844SAndroid Build Coastguard Worker+ (RTCRtpTransceiverDirection)rtpTransceiverDirectionFromNativeDirection:
175*d9f75844SAndroid Build Coastguard Worker        (webrtc::RtpTransceiverDirection)nativeDirection {
176*d9f75844SAndroid Build Coastguard Worker  switch (nativeDirection) {
177*d9f75844SAndroid Build Coastguard Worker    case webrtc::RtpTransceiverDirection::kSendRecv:
178*d9f75844SAndroid Build Coastguard Worker      return RTCRtpTransceiverDirectionSendRecv;
179*d9f75844SAndroid Build Coastguard Worker    case webrtc::RtpTransceiverDirection::kSendOnly:
180*d9f75844SAndroid Build Coastguard Worker      return RTCRtpTransceiverDirectionSendOnly;
181*d9f75844SAndroid Build Coastguard Worker    case webrtc::RtpTransceiverDirection::kRecvOnly:
182*d9f75844SAndroid Build Coastguard Worker      return RTCRtpTransceiverDirectionRecvOnly;
183*d9f75844SAndroid Build Coastguard Worker    case webrtc::RtpTransceiverDirection::kInactive:
184*d9f75844SAndroid Build Coastguard Worker      return RTCRtpTransceiverDirectionInactive;
185*d9f75844SAndroid Build Coastguard Worker    case webrtc::RtpTransceiverDirection::kStopped:
186*d9f75844SAndroid Build Coastguard Worker      return RTCRtpTransceiverDirectionStopped;
187*d9f75844SAndroid Build Coastguard Worker  }
188*d9f75844SAndroid Build Coastguard Worker}
189*d9f75844SAndroid Build Coastguard Worker
190*d9f75844SAndroid Build Coastguard Worker@end
191