xref: /aosp_15_r20/external/webrtc/sdk/objc/api/peerconnection/RTCRtpSender.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 "RTCRtpSender+Private.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker#import "RTCDtmfSender+Private.h"
14*d9f75844SAndroid Build Coastguard Worker#import "RTCMediaStreamTrack+Private.h"
15*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpParameters+Private.h"
16*d9f75844SAndroid Build Coastguard Worker#import "RTCRtpSender+Native.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 Worker#include "api/media_stream_interface.h"
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCRtpSender) {
23*d9f75844SAndroid Build Coastguard Worker  RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory;
24*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::RtpSenderInterface> _nativeRtpSender;
25*d9f75844SAndroid Build Coastguard Worker}
26*d9f75844SAndroid Build Coastguard Worker
27*d9f75844SAndroid Build Coastguard Worker@synthesize dtmfSender = _dtmfSender;
28*d9f75844SAndroid Build Coastguard Worker
29*d9f75844SAndroid Build Coastguard Worker- (NSString *)senderId {
30*d9f75844SAndroid Build Coastguard Worker  return [NSString stringForStdString:_nativeRtpSender->id()];
31*d9f75844SAndroid Build Coastguard Worker}
32*d9f75844SAndroid Build Coastguard Worker
33*d9f75844SAndroid Build Coastguard Worker- (RTC_OBJC_TYPE(RTCRtpParameters) *)parameters {
34*d9f75844SAndroid Build Coastguard Worker  return [[RTC_OBJC_TYPE(RTCRtpParameters) alloc]
35*d9f75844SAndroid Build Coastguard Worker      initWithNativeParameters:_nativeRtpSender->GetParameters()];
36*d9f75844SAndroid Build Coastguard Worker}
37*d9f75844SAndroid Build Coastguard Worker
38*d9f75844SAndroid Build Coastguard Worker- (void)setParameters:(RTC_OBJC_TYPE(RTCRtpParameters) *)parameters {
39*d9f75844SAndroid Build Coastguard Worker  if (!_nativeRtpSender->SetParameters(parameters.nativeParameters).ok()) {
40*d9f75844SAndroid Build Coastguard Worker    RTCLogError(@"RTC_OBJC_TYPE(RTCRtpSender)(%p): Failed to set parameters: %@", self, parameters);
41*d9f75844SAndroid Build Coastguard Worker  }
42*d9f75844SAndroid Build Coastguard Worker}
43*d9f75844SAndroid Build Coastguard Worker
44*d9f75844SAndroid Build Coastguard Worker- (RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track {
45*d9f75844SAndroid Build Coastguard Worker  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
46*d9f75844SAndroid Build Coastguard Worker    _nativeRtpSender->track());
47*d9f75844SAndroid Build Coastguard Worker  if (nativeTrack) {
48*d9f75844SAndroid Build Coastguard Worker    return [RTC_OBJC_TYPE(RTCMediaStreamTrack) mediaTrackForNativeTrack:nativeTrack
49*d9f75844SAndroid Build Coastguard Worker                                                                factory:_factory];
50*d9f75844SAndroid Build Coastguard Worker  }
51*d9f75844SAndroid Build Coastguard Worker  return nil;
52*d9f75844SAndroid Build Coastguard Worker}
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker- (void)setTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track {
55*d9f75844SAndroid Build Coastguard Worker  if (!_nativeRtpSender->SetTrack(track.nativeTrack.get())) {
56*d9f75844SAndroid Build Coastguard Worker    RTCLogError(@"RTC_OBJC_TYPE(RTCRtpSender)(%p): Failed to set track %@", self, track);
57*d9f75844SAndroid Build Coastguard Worker  }
58*d9f75844SAndroid Build Coastguard Worker}
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard Worker- (NSArray<NSString *> *)streamIds {
61*d9f75844SAndroid Build Coastguard Worker  std::vector<std::string> nativeStreamIds = _nativeRtpSender->stream_ids();
62*d9f75844SAndroid Build Coastguard Worker  NSMutableArray *streamIds = [NSMutableArray arrayWithCapacity:nativeStreamIds.size()];
63*d9f75844SAndroid Build Coastguard Worker  for (const auto &s : nativeStreamIds) {
64*d9f75844SAndroid Build Coastguard Worker    [streamIds addObject:[NSString stringForStdString:s]];
65*d9f75844SAndroid Build Coastguard Worker  }
66*d9f75844SAndroid Build Coastguard Worker  return streamIds;
67*d9f75844SAndroid Build Coastguard Worker}
68*d9f75844SAndroid Build Coastguard Worker
69*d9f75844SAndroid Build Coastguard Worker- (void)setStreamIds:(NSArray<NSString *> *)streamIds {
70*d9f75844SAndroid Build Coastguard Worker  std::vector<std::string> nativeStreamIds;
71*d9f75844SAndroid Build Coastguard Worker  for (NSString *streamId in streamIds) {
72*d9f75844SAndroid Build Coastguard Worker    nativeStreamIds.push_back([streamId UTF8String]);
73*d9f75844SAndroid Build Coastguard Worker  }
74*d9f75844SAndroid Build Coastguard Worker  _nativeRtpSender->SetStreams(nativeStreamIds);
75*d9f75844SAndroid Build Coastguard Worker}
76*d9f75844SAndroid Build Coastguard Worker
77*d9f75844SAndroid Build Coastguard Worker- (NSString *)description {
78*d9f75844SAndroid Build Coastguard Worker  return [NSString
79*d9f75844SAndroid Build Coastguard Worker      stringWithFormat:@"RTC_OBJC_TYPE(RTCRtpSender) {\n  senderId: %@\n}", self.senderId];
80*d9f75844SAndroid Build Coastguard Worker}
81*d9f75844SAndroid Build Coastguard Worker
82*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)object {
83*d9f75844SAndroid Build Coastguard Worker  if (self == object) {
84*d9f75844SAndroid Build Coastguard Worker    return YES;
85*d9f75844SAndroid Build Coastguard Worker  }
86*d9f75844SAndroid Build Coastguard Worker  if (object == nil) {
87*d9f75844SAndroid Build Coastguard Worker    return NO;
88*d9f75844SAndroid Build Coastguard Worker  }
89*d9f75844SAndroid Build Coastguard Worker  if (![object isMemberOfClass:[self class]]) {
90*d9f75844SAndroid Build Coastguard Worker    return NO;
91*d9f75844SAndroid Build Coastguard Worker  }
92*d9f75844SAndroid Build Coastguard Worker  RTC_OBJC_TYPE(RTCRtpSender) *sender = (RTC_OBJC_TYPE(RTCRtpSender) *)object;
93*d9f75844SAndroid Build Coastguard Worker  return _nativeRtpSender == sender.nativeRtpSender;
94*d9f75844SAndroid Build Coastguard Worker}
95*d9f75844SAndroid Build Coastguard Worker
96*d9f75844SAndroid Build Coastguard Worker- (NSUInteger)hash {
97*d9f75844SAndroid Build Coastguard Worker  return (NSUInteger)_nativeRtpSender.get();
98*d9f75844SAndroid Build Coastguard Worker}
99*d9f75844SAndroid Build Coastguard Worker
100*d9f75844SAndroid Build Coastguard Worker#pragma mark - Native
101*d9f75844SAndroid Build Coastguard Worker
102*d9f75844SAndroid Build Coastguard Worker- (void)setFrameEncryptor:(rtc::scoped_refptr<webrtc::FrameEncryptorInterface>)frameEncryptor {
103*d9f75844SAndroid Build Coastguard Worker  _nativeRtpSender->SetFrameEncryptor(frameEncryptor);
104*d9f75844SAndroid Build Coastguard Worker}
105*d9f75844SAndroid Build Coastguard Worker
106*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private
107*d9f75844SAndroid Build Coastguard Worker
108*d9f75844SAndroid Build Coastguard Worker- (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
109*d9f75844SAndroid Build Coastguard Worker  return _nativeRtpSender;
110*d9f75844SAndroid Build Coastguard Worker}
111*d9f75844SAndroid Build Coastguard Worker
112*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
113*d9f75844SAndroid Build Coastguard Worker                nativeRtpSender:(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
114*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(factory);
115*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(nativeRtpSender);
116*d9f75844SAndroid Build Coastguard Worker  if (self = [super init]) {
117*d9f75844SAndroid Build Coastguard Worker    _factory = factory;
118*d9f75844SAndroid Build Coastguard Worker    _nativeRtpSender = nativeRtpSender;
119*d9f75844SAndroid Build Coastguard Worker    if (_nativeRtpSender->media_type() == cricket::MEDIA_TYPE_AUDIO) {
120*d9f75844SAndroid Build Coastguard Worker      rtc::scoped_refptr<webrtc::DtmfSenderInterface> nativeDtmfSender(
121*d9f75844SAndroid Build Coastguard Worker          _nativeRtpSender->GetDtmfSender());
122*d9f75844SAndroid Build Coastguard Worker      if (nativeDtmfSender) {
123*d9f75844SAndroid Build Coastguard Worker        _dtmfSender =
124*d9f75844SAndroid Build Coastguard Worker            [[RTC_OBJC_TYPE(RTCDtmfSender) alloc] initWithNativeDtmfSender:nativeDtmfSender];
125*d9f75844SAndroid Build Coastguard Worker      }
126*d9f75844SAndroid Build Coastguard Worker    }
127*d9f75844SAndroid Build Coastguard Worker    RTCLogInfo(@"RTC_OBJC_TYPE(RTCRtpSender)(%p): created sender: %@", self, self.description);
128*d9f75844SAndroid Build Coastguard Worker  }
129*d9f75844SAndroid Build Coastguard Worker  return self;
130*d9f75844SAndroid Build Coastguard Worker}
131*d9f75844SAndroid Build Coastguard Worker
132*d9f75844SAndroid Build Coastguard Worker@end
133