blob: e3ab65ae306dfcb3a247d2424be2c1ad577392e9 [file] [log] [blame]
hjonf396f602016-02-11 16:19:06 -08001/*
2 * Copyright 2015 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
tkchin9eeb6242016-04-27 01:54:20 -070011#import "RTCPeerConnection+Private.h"
12
tkchin9eeb6242016-04-27 01:54:20 -070013#import "RTCConfiguration+Private.h"
14#import "RTCDataChannel+Private.h"
15#import "RTCIceCandidate+Private.h"
hbosbd3dda62016-09-09 01:36:28 -070016#import "RTCLegacyStatsReport+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070017#import "RTCMediaConstraints+Private.h"
18#import "RTCMediaStream+Private.h"
Steve Anton8cb344a2018-02-27 15:34:53 -080019#import "RTCMediaStreamTrack+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070020#import "RTCPeerConnectionFactory+Private.h"
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070021#import "RTCRtpReceiver+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070022#import "RTCRtpSender+Private.h"
Steve Anton8cb344a2018-02-27 15:34:53 -080023#import "RTCRtpTransceiver+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070024#import "RTCSessionDescription+Private.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020025#import "base/RTCLogging.h"
26#import "helpers/NSString+StdString.h"
hjonf396f602016-02-11 16:19:06 -080027
kwibergbfefb032016-05-01 14:53:46 -070028#include <memory>
29
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/jsep_ice_candidate.h"
Niels Möller695cf6a2019-05-13 12:27:23 +020031#include "api/rtc_event_log_output_file.h"
Yura Yaroshevichd6725352021-03-05 18:21:16 +030032#include "api/set_local_description_observer_interface.h"
33#include "api/set_remote_description_observer_interface.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "rtc_base/checks.h"
Niels Möller695cf6a2019-05-13 12:27:23 +020035#include "rtc_base/numerics/safe_conversions.h"
hjonf396f602016-02-11 16:19:06 -080036
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020037NSString *const kRTCPeerConnectionErrorDomain = @"org.webrtc.RTC_OBJC_TYPE(RTCPeerConnection)";
hjonf396f602016-02-11 16:19:06 -080038int const kRTCPeerConnnectionSessionDescriptionError = -1;
39
Yura Yaroshevichd6725352021-03-05 18:21:16 +030040typedef void (^RTCSetSessionDescriptionCompletionHandler)(NSError *_Nullable error);
41
42namespace {
43
44class SetSessionDescriptionObserver : public webrtc::SetLocalDescriptionObserverInterface,
45 public webrtc::SetRemoteDescriptionObserverInterface {
46 public:
47 SetSessionDescriptionObserver(
48 RTCSetSessionDescriptionCompletionHandler _Nullable completionHandler) {
49 completion_handler_ = completionHandler;
50 }
51
52 virtual void OnSetLocalDescriptionComplete(webrtc::RTCError error) override {
53 if (completion_handler_ != nil) {
54 OnCompelete(error);
55 }
56 }
57
58 virtual void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override {
59 if (completion_handler_ != nil) {
60 OnCompelete(error);
61 }
62 }
63
64 private:
65 void OnCompelete(webrtc::RTCError error) {
66 RTC_DCHECK(completion_handler_);
67 if (error.ok()) {
68 completion_handler_(nil);
69 } else {
70 // TODO(hta): Add handling of error.type()
71 NSString *str = [NSString stringForStdString:error.message()];
72 NSError *err = [NSError errorWithDomain:kRTCPeerConnectionErrorDomain
73 code:kRTCPeerConnnectionSessionDescriptionError
74 userInfo:@{NSLocalizedDescriptionKey : str}];
75 completion_handler_(err);
76 }
77 completion_handler_ = nil;
78 }
79 RTCSetSessionDescriptionCompletionHandler completion_handler_;
80};
81
82} // anonymous namespace
83
hjonf396f602016-02-11 16:19:06 -080084namespace webrtc {
85
86class CreateSessionDescriptionObserverAdapter
87 : public CreateSessionDescriptionObserver {
88 public:
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020089 CreateSessionDescriptionObserverAdapter(void (^completionHandler)(
90 RTC_OBJC_TYPE(RTCSessionDescription) * sessionDescription, NSError *error)) {
hjonf396f602016-02-11 16:19:06 -080091 completion_handler_ = completionHandler;
92 }
93
Mirko Bonadei17aff352018-07-26 12:20:40 +020094 ~CreateSessionDescriptionObserverAdapter() override { completion_handler_ = nil; }
hjonf396f602016-02-11 16:19:06 -080095
96 void OnSuccess(SessionDescriptionInterface *desc) override {
97 RTC_DCHECK(completion_handler_);
kwibergbfefb032016-05-01 14:53:46 -070098 std::unique_ptr<webrtc::SessionDescriptionInterface> description =
99 std::unique_ptr<webrtc::SessionDescriptionInterface>(desc);
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200100 RTC_OBJC_TYPE(RTCSessionDescription) *session =
101 [[RTC_OBJC_TYPE(RTCSessionDescription) alloc] initWithNativeDescription:description.get()];
hjonf396f602016-02-11 16:19:06 -0800102 completion_handler_(session, nil);
103 completion_handler_ = nil;
104 }
105
Harald Alvestrand73771a82018-05-24 10:53:49 +0200106 void OnFailure(RTCError error) override {
hjonf396f602016-02-11 16:19:06 -0800107 RTC_DCHECK(completion_handler_);
Harald Alvestrand73771a82018-05-24 10:53:49 +0200108 // TODO(hta): Add handling of error.type()
109 NSString *str = [NSString stringForStdString:error.message()];
hjonf396f602016-02-11 16:19:06 -0800110 NSError* err =
111 [NSError errorWithDomain:kRTCPeerConnectionErrorDomain
112 code:kRTCPeerConnnectionSessionDescriptionError
113 userInfo:@{ NSLocalizedDescriptionKey : str }];
114 completion_handler_(nil, err);
115 completion_handler_ = nil;
116 }
117
118 private:
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200119 void (^completion_handler_)(RTC_OBJC_TYPE(RTCSessionDescription) * sessionDescription,
120 NSError *error);
hjonf396f602016-02-11 16:19:06 -0800121};
122
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200123PeerConnectionDelegateAdapter::PeerConnectionDelegateAdapter(RTC_OBJC_TYPE(RTCPeerConnection) *
124 peerConnection) {
hjonf396f602016-02-11 16:19:06 -0800125 peer_connection_ = peerConnection;
126}
127
128PeerConnectionDelegateAdapter::~PeerConnectionDelegateAdapter() {
129 peer_connection_ = nil;
130}
131
132void PeerConnectionDelegateAdapter::OnSignalingChange(
133 PeerConnectionInterface::SignalingState new_state) {
134 RTCSignalingState state =
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200135 [[RTC_OBJC_TYPE(RTCPeerConnection) class] signalingStateForNativeState:new_state];
136 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
hjonf396f602016-02-11 16:19:06 -0800137 [peer_connection.delegate peerConnection:peer_connection
138 didChangeSignalingState:state];
139}
140
141void PeerConnectionDelegateAdapter::OnAddStream(
deadbeefd5f41ce2016-06-08 13:31:45 -0700142 rtc::scoped_refptr<MediaStreamInterface> stream) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200143 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
144 RTC_OBJC_TYPE(RTCMediaStream) *mediaStream =
145 [[RTC_OBJC_TYPE(RTCMediaStream) alloc] initWithFactory:peer_connection.factory
146 nativeMediaStream:stream];
hjonf396f602016-02-11 16:19:06 -0800147 [peer_connection.delegate peerConnection:peer_connection
148 didAddStream:mediaStream];
149}
150
151void PeerConnectionDelegateAdapter::OnRemoveStream(
deadbeefd5f41ce2016-06-08 13:31:45 -0700152 rtc::scoped_refptr<MediaStreamInterface> stream) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200153 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
154 RTC_OBJC_TYPE(RTCMediaStream) *mediaStream =
155 [[RTC_OBJC_TYPE(RTCMediaStream) alloc] initWithFactory:peer_connection.factory
156 nativeMediaStream:stream];
Yura Yaroshevichc806c1d2018-06-21 12:51:11 +0300157
hjonf396f602016-02-11 16:19:06 -0800158 [peer_connection.delegate peerConnection:peer_connection
159 didRemoveStream:mediaStream];
160}
161
Steve Anton8cb344a2018-02-27 15:34:53 -0800162void PeerConnectionDelegateAdapter::OnTrack(
163 rtc::scoped_refptr<RtpTransceiverInterface> nativeTransceiver) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200164 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
165 RTC_OBJC_TYPE(RTCRtpTransceiver) *transceiver =
166 [[RTC_OBJC_TYPE(RTCRtpTransceiver) alloc] initWithFactory:peer_connection.factory
167 nativeRtpTransceiver:nativeTransceiver];
Steve Anton8cb344a2018-02-27 15:34:53 -0800168 if ([peer_connection.delegate
169 respondsToSelector:@selector(peerConnection:didStartReceivingOnTransceiver:)]) {
170 [peer_connection.delegate peerConnection:peer_connection
171 didStartReceivingOnTransceiver:transceiver];
172 }
173}
174
hjonf396f602016-02-11 16:19:06 -0800175void PeerConnectionDelegateAdapter::OnDataChannel(
deadbeefd5f41ce2016-06-08 13:31:45 -0700176 rtc::scoped_refptr<DataChannelInterface> data_channel) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200177 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
178 RTC_OBJC_TYPE(RTCDataChannel) *dataChannel =
179 [[RTC_OBJC_TYPE(RTCDataChannel) alloc] initWithFactory:peer_connection.factory
180 nativeDataChannel:data_channel];
hjonf396f602016-02-11 16:19:06 -0800181 [peer_connection.delegate peerConnection:peer_connection
182 didOpenDataChannel:dataChannel];
183}
184
185void PeerConnectionDelegateAdapter::OnRenegotiationNeeded() {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200186 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
hjonf396f602016-02-11 16:19:06 -0800187 [peer_connection.delegate peerConnectionShouldNegotiate:peer_connection];
188}
189
190void PeerConnectionDelegateAdapter::OnIceConnectionChange(
191 PeerConnectionInterface::IceConnectionState new_state) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200192 RTCIceConnectionState state =
193 [RTC_OBJC_TYPE(RTCPeerConnection) iceConnectionStateForNativeState:new_state];
Jonas Olssoncfddbb72018-11-15 16:52:45 +0100194 [peer_connection_.delegate peerConnection:peer_connection_ didChangeIceConnectionState:state];
195}
196
Qingsi Wang36e31472019-05-29 11:37:26 -0700197void PeerConnectionDelegateAdapter::OnStandardizedIceConnectionChange(
198 PeerConnectionInterface::IceConnectionState new_state) {
199 if ([peer_connection_.delegate
200 respondsToSelector:@selector(peerConnection:didChangeStandardizedIceConnectionState:)]) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200201 RTCIceConnectionState state =
202 [RTC_OBJC_TYPE(RTCPeerConnection) iceConnectionStateForNativeState:new_state];
Qingsi Wang36e31472019-05-29 11:37:26 -0700203 [peer_connection_.delegate peerConnection:peer_connection_
204 didChangeStandardizedIceConnectionState:state];
205 }
206}
207
Jonas Olssoncfddbb72018-11-15 16:52:45 +0100208void PeerConnectionDelegateAdapter::OnConnectionChange(
209 PeerConnectionInterface::PeerConnectionState new_state) {
210 if ([peer_connection_.delegate
211 respondsToSelector:@selector(peerConnection:didChangeConnectionState:)]) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200212 RTCPeerConnectionState state =
213 [RTC_OBJC_TYPE(RTCPeerConnection) connectionStateForNativeState:new_state];
Jonas Olssoncfddbb72018-11-15 16:52:45 +0100214 [peer_connection_.delegate peerConnection:peer_connection_ didChangeConnectionState:state];
215 }
hjonf396f602016-02-11 16:19:06 -0800216}
217
218void PeerConnectionDelegateAdapter::OnIceGatheringChange(
219 PeerConnectionInterface::IceGatheringState new_state) {
220 RTCIceGatheringState state =
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200221 [[RTC_OBJC_TYPE(RTCPeerConnection) class] iceGatheringStateForNativeState:new_state];
222 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
hjonf396f602016-02-11 16:19:06 -0800223 [peer_connection.delegate peerConnection:peer_connection
224 didChangeIceGatheringState:state];
225}
226
227void PeerConnectionDelegateAdapter::OnIceCandidate(
228 const IceCandidateInterface *candidate) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200229 RTC_OBJC_TYPE(RTCIceCandidate) *iceCandidate =
230 [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:candidate];
231 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
hjonf396f602016-02-11 16:19:06 -0800232 [peer_connection.delegate peerConnection:peer_connection
233 didGenerateIceCandidate:iceCandidate];
234}
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700235
236void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
237 const std::vector<cricket::Candidate>& candidates) {
238 NSMutableArray* ice_candidates =
239 [NSMutableArray arrayWithCapacity:candidates.size()];
240 for (const auto& candidate : candidates) {
241 std::unique_ptr<JsepIceCandidate> candidate_wrapper(
242 new JsepIceCandidate(candidate.transport_name(), -1, candidate));
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200243 RTC_OBJC_TYPE(RTCIceCandidate) *ice_candidate =
244 [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:candidate_wrapper.get()];
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700245 [ice_candidates addObject:ice_candidate];
246 }
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200247 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700248 [peer_connection.delegate peerConnection:peer_connection
249 didRemoveIceCandidates:ice_candidates];
250}
251
Alex Drake43faee02019-08-12 16:27:34 -0700252void PeerConnectionDelegateAdapter::OnIceSelectedCandidatePairChanged(
253 const cricket::CandidatePairChangeEvent &event) {
Qingsi Wang7cdcda92019-08-28 09:18:37 -0700254 const auto &selected_pair = event.selected_candidate_pair;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200255 auto local_candidate_wrapper = std::make_unique<JsepIceCandidate>(
Qingsi Wang7cdcda92019-08-28 09:18:37 -0700256 selected_pair.local_candidate().transport_name(), -1, selected_pair.local_candidate());
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200257 RTC_OBJC_TYPE(RTCIceCandidate) *local_candidate = [[RTC_OBJC_TYPE(RTCIceCandidate) alloc]
258 initWithNativeCandidate:local_candidate_wrapper.release()];
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200259 auto remote_candidate_wrapper = std::make_unique<JsepIceCandidate>(
Qingsi Wang7cdcda92019-08-28 09:18:37 -0700260 selected_pair.remote_candidate().transport_name(), -1, selected_pair.remote_candidate());
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200261 RTC_OBJC_TYPE(RTCIceCandidate) *remote_candidate = [[RTC_OBJC_TYPE(RTCIceCandidate) alloc]
262 initWithNativeCandidate:remote_candidate_wrapper.release()];
263 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
Alex Drake43faee02019-08-12 16:27:34 -0700264 NSString *nsstr_reason = [NSString stringForStdString:event.reason];
265 if ([peer_connection.delegate
266 respondsToSelector:@selector
267 (peerConnection:didChangeLocalCandidate:remoteCandidate:lastReceivedMs:changeReason:)]) {
268 [peer_connection.delegate peerConnection:peer_connection
269 didChangeLocalCandidate:local_candidate
270 remoteCandidate:remote_candidate
271 lastReceivedMs:event.last_data_received_ms
272 changeReason:nsstr_reason];
273 }
274}
275
Yura Yaroshevich546d7f92018-02-28 21:06:34 +0300276void PeerConnectionDelegateAdapter::OnAddTrack(
277 rtc::scoped_refptr<RtpReceiverInterface> receiver,
Alex Drake43faee02019-08-12 16:27:34 -0700278 const std::vector<rtc::scoped_refptr<MediaStreamInterface>> &streams) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200279 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
Alex Drake43faee02019-08-12 16:27:34 -0700280 if ([peer_connection.delegate respondsToSelector:@selector(peerConnection:
281 didAddReceiver:streams:)]) {
Yura Yaroshevich546d7f92018-02-28 21:06:34 +0300282 NSMutableArray *mediaStreams = [NSMutableArray arrayWithCapacity:streams.size()];
Alex Drake43faee02019-08-12 16:27:34 -0700283 for (const auto &nativeStream : streams) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200284 RTC_OBJC_TYPE(RTCMediaStream) *mediaStream =
285 [[RTC_OBJC_TYPE(RTCMediaStream) alloc] initWithFactory:peer_connection.factory
286 nativeMediaStream:nativeStream];
Yura Yaroshevich546d7f92018-02-28 21:06:34 +0300287 [mediaStreams addObject:mediaStream];
288 }
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200289 RTC_OBJC_TYPE(RTCRtpReceiver) *rtpReceiver =
290 [[RTC_OBJC_TYPE(RTCRtpReceiver) alloc] initWithFactory:peer_connection.factory
291 nativeRtpReceiver:receiver];
Yura Yaroshevich546d7f92018-02-28 21:06:34 +0300292
293 [peer_connection.delegate peerConnection:peer_connection
294 didAddReceiver:rtpReceiver
295 streams:mediaStreams];
296 }
297}
298
Zeke Chin8de502b2018-08-21 11:41:07 -0700299void PeerConnectionDelegateAdapter::OnRemoveTrack(
300 rtc::scoped_refptr<RtpReceiverInterface> receiver) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200301 RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
Zeke Chin8de502b2018-08-21 11:41:07 -0700302 if ([peer_connection.delegate respondsToSelector:@selector(peerConnection:didRemoveReceiver:)]) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200303 RTC_OBJC_TYPE(RTCRtpReceiver) *rtpReceiver =
304 [[RTC_OBJC_TYPE(RTCRtpReceiver) alloc] initWithFactory:peer_connection.factory
305 nativeRtpReceiver:receiver];
Zeke Chin8de502b2018-08-21 11:41:07 -0700306 [peer_connection.delegate peerConnection:peer_connection didRemoveReceiver:rtpReceiver];
307 }
308}
309
hjonf396f602016-02-11 16:19:06 -0800310} // namespace webrtc
311
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200312@implementation RTC_OBJC_TYPE (RTCPeerConnection) {
313 RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory;
314 NSMutableArray<RTC_OBJC_TYPE(RTCMediaStream) *> *_localStreams;
kwibergbfefb032016-05-01 14:53:46 -0700315 std::unique_ptr<webrtc::PeerConnectionDelegateAdapter> _observer;
hjonf396f602016-02-11 16:19:06 -0800316 rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
deadbeef5d0b6d82017-01-09 16:05:28 -0800317 std::unique_ptr<webrtc::MediaConstraints> _nativeConstraints;
ivoc14d5dbe2016-07-04 07:06:55 -0700318 BOOL _hasStartedRtcEventLog;
hjonf396f602016-02-11 16:19:06 -0800319}
320
321@synthesize delegate = _delegate;
Yura Yaroshevichc806c1d2018-06-21 12:51:11 +0300322@synthesize factory = _factory;
hjonf396f602016-02-11 16:19:06 -0800323
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300324- (nullable instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
325 configuration:(RTC_OBJC_TYPE(RTCConfiguration) *)configuration
326 constraints:(RTC_OBJC_TYPE(RTCMediaConstraints) *)constraints
327 delegate:(id<RTC_OBJC_TYPE(RTCPeerConnectionDelegate)>)delegate {
hjonf396f602016-02-11 16:19:06 -0800328 NSParameterAssert(factory);
Jonas Oreland285f83d2020-02-07 10:30:08 +0100329 std::unique_ptr<webrtc::PeerConnectionDependencies> dependencies =
330 std::make_unique<webrtc::PeerConnectionDependencies>(nullptr);
331 return [self initWithDependencies:factory
332 configuration:configuration
333 constraints:constraints
334 dependencies:std::move(dependencies)
335 delegate:delegate];
336}
337
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300338- (nullable instancetype)
339 initWithDependencies:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory
340 configuration:(RTC_OBJC_TYPE(RTCConfiguration) *)configuration
341 constraints:(RTC_OBJC_TYPE(RTCMediaConstraints) *)constraints
342 dependencies:(std::unique_ptr<webrtc::PeerConnectionDependencies>)dependencies
343 delegate:(id<RTC_OBJC_TYPE(RTCPeerConnectionDelegate)>)delegate {
Jonas Oreland285f83d2020-02-07 10:30:08 +0100344 NSParameterAssert(factory);
345 NSParameterAssert(dependencies.get());
Henrik Boströme06c2dd2016-05-13 13:50:38 +0200346 std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
hbosa73ca562016-05-17 03:28:58 -0700347 [configuration createNativeConfiguration]);
348 if (!config) {
349 return nil;
350 }
hjonf396f602016-02-11 16:19:06 -0800351 if (self = [super init]) {
352 _observer.reset(new webrtc::PeerConnectionDelegateAdapter(self));
deadbeef5d0b6d82017-01-09 16:05:28 -0800353 _nativeConstraints = constraints.nativeConstraints;
Jonas Oreland285f83d2020-02-07 10:30:08 +0100354 CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(), config.get());
355
356 webrtc::PeerConnectionDependencies deps = std::move(*dependencies.release());
357 deps.observer = _observer.get();
358 _peerConnection = factory.nativeFactory->CreatePeerConnection(*config, std::move(deps));
359
skvlad588783a2016-08-11 14:29:25 -0700360 if (!_peerConnection) {
361 return nil;
362 }
Yura Yaroshevich5297bd22018-06-19 12:51:51 +0300363 _factory = factory;
hjonf396f602016-02-11 16:19:06 -0800364 _localStreams = [[NSMutableArray alloc] init];
365 _delegate = delegate;
366 }
367 return self;
368}
369
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200370- (NSArray<RTC_OBJC_TYPE(RTCMediaStream) *> *)localStreams {
hjonf396f602016-02-11 16:19:06 -0800371 return [_localStreams copy];
372}
373
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200374- (RTC_OBJC_TYPE(RTCSessionDescription) *)localDescription {
Taylor Brandstetterc88fe702020-08-03 16:36:16 -0700375 // It's only safe to operate on SessionDescriptionInterface on the signaling thread.
376 return _peerConnection->signaling_thread()->Invoke<RTC_OBJC_TYPE(RTCSessionDescription) *>(
377 RTC_FROM_HERE, [self] {
378 const webrtc::SessionDescriptionInterface *description =
379 _peerConnection->local_description();
380 return description ?
381 [[RTC_OBJC_TYPE(RTCSessionDescription) alloc] initWithNativeDescription:description] :
382 nil;
383 });
hjonf396f602016-02-11 16:19:06 -0800384}
385
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200386- (RTC_OBJC_TYPE(RTCSessionDescription) *)remoteDescription {
Taylor Brandstetterc88fe702020-08-03 16:36:16 -0700387 // It's only safe to operate on SessionDescriptionInterface on the signaling thread.
388 return _peerConnection->signaling_thread()->Invoke<RTC_OBJC_TYPE(RTCSessionDescription) *>(
389 RTC_FROM_HERE, [self] {
390 const webrtc::SessionDescriptionInterface *description =
391 _peerConnection->remote_description();
392 return description ?
393 [[RTC_OBJC_TYPE(RTCSessionDescription) alloc] initWithNativeDescription:description] :
394 nil;
395 });
hjonf396f602016-02-11 16:19:06 -0800396}
397
398- (RTCSignalingState)signalingState {
399 return [[self class]
400 signalingStateForNativeState:_peerConnection->signaling_state()];
401}
402
403- (RTCIceConnectionState)iceConnectionState {
404 return [[self class] iceConnectionStateForNativeState:
405 _peerConnection->ice_connection_state()];
406}
407
Jonas Olssoncfddbb72018-11-15 16:52:45 +0100408- (RTCPeerConnectionState)connectionState {
409 return [[self class] connectionStateForNativeState:_peerConnection->peer_connection_state()];
410}
411
hjonf396f602016-02-11 16:19:06 -0800412- (RTCIceGatheringState)iceGatheringState {
413 return [[self class] iceGatheringStateForNativeState:
414 _peerConnection->ice_gathering_state()];
415}
416
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200417- (BOOL)setConfiguration:(RTC_OBJC_TYPE(RTCConfiguration) *)configuration {
Henrik Boströme06c2dd2016-05-13 13:50:38 +0200418 std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
hbosa73ca562016-05-17 03:28:58 -0700419 [configuration createNativeConfiguration]);
420 if (!config) {
421 return NO;
422 }
deadbeef5d0b6d82017-01-09 16:05:28 -0800423 CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
424 config.get());
Niels Möller2579f0c2019-08-19 09:58:17 +0200425 return _peerConnection->SetConfiguration(*config).ok();
tkchinaac3eb22016-03-09 21:49:40 -0800426}
427
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200428- (RTC_OBJC_TYPE(RTCConfiguration) *)configuration {
jtteh4eeb5372017-04-03 15:06:37 -0700429 webrtc::PeerConnectionInterface::RTCConfiguration config =
430 _peerConnection->GetConfiguration();
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200431 return [[RTC_OBJC_TYPE(RTCConfiguration) alloc] initWithNativeConfiguration:config];
jtteh4eeb5372017-04-03 15:06:37 -0700432}
433
hjonf396f602016-02-11 16:19:06 -0800434- (void)close {
435 _peerConnection->Close();
436}
437
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200438- (void)addIceCandidate:(RTC_OBJC_TYPE(RTCIceCandidate) *)candidate {
kwibergbfefb032016-05-01 14:53:46 -0700439 std::unique_ptr<const webrtc::IceCandidateInterface> iceCandidate(
hjonf396f602016-02-11 16:19:06 -0800440 candidate.nativeCandidate);
441 _peerConnection->AddIceCandidate(iceCandidate.get());
442}
443
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200444- (void)removeIceCandidates:(NSArray<RTC_OBJC_TYPE(RTCIceCandidate) *> *)iceCandidates {
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700445 std::vector<cricket::Candidate> candidates;
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200446 for (RTC_OBJC_TYPE(RTCIceCandidate) * iceCandidate in iceCandidates) {
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700447 std::unique_ptr<const webrtc::IceCandidateInterface> candidate(
448 iceCandidate.nativeCandidate);
449 if (candidate) {
450 candidates.push_back(candidate->candidate());
451 // Need to fill the transport name from the sdp_mid.
452 candidates.back().set_transport_name(candidate->sdp_mid());
453 }
454 }
455 if (!candidates.empty()) {
456 _peerConnection->RemoveIceCandidates(candidates);
457 }
458}
459
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200460- (void)addStream:(RTC_OBJC_TYPE(RTCMediaStream) *)stream {
hjona2f77982016-03-04 07:09:09 -0800461 if (!_peerConnection->AddStream(stream.nativeMediaStream)) {
hjonf396f602016-02-11 16:19:06 -0800462 RTCLogError(@"Failed to add stream: %@", stream);
463 return;
464 }
465 [_localStreams addObject:stream];
466}
467
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200468- (void)removeStream:(RTC_OBJC_TYPE(RTCMediaStream) *)stream {
hjonf396f602016-02-11 16:19:06 -0800469 _peerConnection->RemoveStream(stream.nativeMediaStream);
470 [_localStreams removeObject:stream];
471}
472
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300473- (nullable RTC_OBJC_TYPE(RTCRtpSender) *)addTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track
474 streamIds:(NSArray<NSString *> *)streamIds {
Seth Hampson513449e2018-03-06 09:35:56 -0800475 std::vector<std::string> nativeStreamIds;
476 for (NSString *streamId in streamIds) {
477 nativeStreamIds.push_back([streamId UTF8String]);
Steve Anton8cb344a2018-02-27 15:34:53 -0800478 }
479 webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenderOrError =
Seth Hampson513449e2018-03-06 09:35:56 -0800480 _peerConnection->AddTrack(track.nativeTrack, nativeStreamIds);
Steve Anton8cb344a2018-02-27 15:34:53 -0800481 if (!nativeSenderOrError.ok()) {
482 RTCLogError(@"Failed to add track %@: %s", track, nativeSenderOrError.error().message());
483 return nil;
484 }
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200485 return [[RTC_OBJC_TYPE(RTCRtpSender) alloc] initWithFactory:self.factory
486 nativeRtpSender:nativeSenderOrError.MoveValue()];
Steve Anton8cb344a2018-02-27 15:34:53 -0800487}
488
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200489- (BOOL)removeTrack:(RTC_OBJC_TYPE(RTCRtpSender) *)sender {
Steve Anton8cb344a2018-02-27 15:34:53 -0800490 bool result = _peerConnection->RemoveTrack(sender.nativeRtpSender);
491 if (!result) {
492 RTCLogError(@"Failed to remote track %@", sender);
493 }
494 return result;
495}
496
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300497- (nullable RTC_OBJC_TYPE(RTCRtpTransceiver) *)addTransceiverWithTrack:
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200498 (RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track {
499 return [self addTransceiverWithTrack:track
500 init:[[RTC_OBJC_TYPE(RTCRtpTransceiverInit) alloc] init]];
Steve Anton8cb344a2018-02-27 15:34:53 -0800501}
502
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300503- (nullable RTC_OBJC_TYPE(RTCRtpTransceiver) *)
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200504 addTransceiverWithTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track
505 init:(RTC_OBJC_TYPE(RTCRtpTransceiverInit) *)init {
Steve Anton8cb344a2018-02-27 15:34:53 -0800506 webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceiverOrError =
507 _peerConnection->AddTransceiver(track.nativeTrack, init.nativeInit);
508 if (!nativeTransceiverOrError.ok()) {
509 RTCLogError(
510 @"Failed to add transceiver %@: %s", track, nativeTransceiverOrError.error().message());
511 return nil;
512 }
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200513 return [[RTC_OBJC_TYPE(RTCRtpTransceiver) alloc]
514 initWithFactory:self.factory
515 nativeRtpTransceiver:nativeTransceiverOrError.MoveValue()];
Steve Anton8cb344a2018-02-27 15:34:53 -0800516}
517
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300518- (nullable RTC_OBJC_TYPE(RTCRtpTransceiver) *)addTransceiverOfType:(RTCRtpMediaType)mediaType {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200519 return [self addTransceiverOfType:mediaType
520 init:[[RTC_OBJC_TYPE(RTCRtpTransceiverInit) alloc] init]];
Steve Anton8cb344a2018-02-27 15:34:53 -0800521}
522
Yura Yaroshevichd140c8f2021-03-02 23:25:10 +0300523- (nullable RTC_OBJC_TYPE(RTCRtpTransceiver) *)
524 addTransceiverOfType:(RTCRtpMediaType)mediaType
525 init:(RTC_OBJC_TYPE(RTCRtpTransceiverInit) *)init {
Steve Anton8cb344a2018-02-27 15:34:53 -0800526 webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceiverOrError =
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200527 _peerConnection->AddTransceiver(
528 [RTC_OBJC_TYPE(RTCRtpReceiver) nativeMediaTypeForMediaType:mediaType], init.nativeInit);
Steve Anton8cb344a2018-02-27 15:34:53 -0800529 if (!nativeTransceiverOrError.ok()) {
530 RTCLogError(@"Failed to add transceiver %@: %s",
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200531 [RTC_OBJC_TYPE(RTCRtpReceiver) stringForMediaType:mediaType],
Steve Anton8cb344a2018-02-27 15:34:53 -0800532 nativeTransceiverOrError.error().message());
533 return nil;
534 }
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200535 return [[RTC_OBJC_TYPE(RTCRtpTransceiver) alloc]
536 initWithFactory:self.factory
537 nativeRtpTransceiver:nativeTransceiverOrError.MoveValue()];
Steve Anton8cb344a2018-02-27 15:34:53 -0800538}
539
Yura Yaroshevich92d12702021-03-06 23:55:17 +0300540- (void)restartIce {
541 _peerConnection->RestartIce();
542}
543
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200544- (void)offerForConstraints:(RTC_OBJC_TYPE(RTCMediaConstraints) *)constraints
545 completionHandler:(void (^)(RTC_OBJC_TYPE(RTCSessionDescription) * sessionDescription,
546 NSError *error))completionHandler {
hjonf396f602016-02-11 16:19:06 -0800547 rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
548 observer(new rtc::RefCountedObject
549 <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
Niels Möllerf06f9232018-08-07 12:32:18 +0200550 webrtc::PeerConnectionInterface::RTCOfferAnswerOptions options;
551 CopyConstraintsIntoOfferAnswerOptions(constraints.nativeConstraints.get(), &options);
552
553 _peerConnection->CreateOffer(observer, options);
hjonf396f602016-02-11 16:19:06 -0800554}
555
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200556- (void)answerForConstraints:(RTC_OBJC_TYPE(RTCMediaConstraints) *)constraints
557 completionHandler:(void (^)(RTC_OBJC_TYPE(RTCSessionDescription) * sessionDescription,
558 NSError *error))completionHandler {
hjonf396f602016-02-11 16:19:06 -0800559 rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
560 observer(new rtc::RefCountedObject
561 <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
Niels Möllerf06f9232018-08-07 12:32:18 +0200562 webrtc::PeerConnectionInterface::RTCOfferAnswerOptions options;
563 CopyConstraintsIntoOfferAnswerOptions(constraints.nativeConstraints.get(), &options);
564
565 _peerConnection->CreateAnswer(observer, options);
hjonf396f602016-02-11 16:19:06 -0800566}
567
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200568- (void)setLocalDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)sdp
Yura Yaroshevichd6725352021-03-05 18:21:16 +0300569 completionHandler:(nullable void (^)(NSError *error))completionHandler {
570 rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface> observer(
571 new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler));
572 _peerConnection->SetLocalDescription(sdp.nativeDescription->Clone(), observer);
573}
574
575- (void)setLocalDescriptionWithCompletionHandler:
576 (nullable void (^)(NSError *error))completionHandler {
577 rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface> observer(
578 new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler));
579 _peerConnection->SetLocalDescription(observer);
hjonf396f602016-02-11 16:19:06 -0800580}
581
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200582- (void)setRemoteDescription:(RTC_OBJC_TYPE(RTCSessionDescription) *)sdp
Yura Yaroshevichd6725352021-03-05 18:21:16 +0300583 completionHandler:(nullable void (^)(NSError *error))completionHandler {
584 rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface> observer(
585 new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler));
586 _peerConnection->SetRemoteDescription(sdp.nativeDescription->Clone(), observer);
hjonf396f602016-02-11 16:19:06 -0800587}
588
zstein8b476172017-09-05 14:43:03 -0700589- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps
590 currentBitrateBps:(nullable NSNumber *)currentBitrateBps
591 maxBitrateBps:(nullable NSNumber *)maxBitrateBps {
Niels Möller9ad1f6f2020-07-13 10:25:41 +0200592 webrtc::BitrateSettings params;
zstein03adb7c2017-08-09 14:29:42 -0700593 if (minBitrateBps != nil) {
Danil Chapovalov196100e2018-06-21 10:17:24 +0200594 params.min_bitrate_bps = absl::optional<int>(minBitrateBps.intValue);
zstein03adb7c2017-08-09 14:29:42 -0700595 }
596 if (currentBitrateBps != nil) {
Niels Möller9ad1f6f2020-07-13 10:25:41 +0200597 params.start_bitrate_bps = absl::optional<int>(currentBitrateBps.intValue);
zstein03adb7c2017-08-09 14:29:42 -0700598 }
599 if (maxBitrateBps != nil) {
Danil Chapovalov196100e2018-06-21 10:17:24 +0200600 params.max_bitrate_bps = absl::optional<int>(maxBitrateBps.intValue);
zstein03adb7c2017-08-09 14:29:42 -0700601 }
602 return _peerConnection->SetBitrate(params).ok();
603}
604
ivoc14d5dbe2016-07-04 07:06:55 -0700605- (BOOL)startRtcEventLogWithFilePath:(NSString *)filePath
606 maxSizeInBytes:(int64_t)maxSizeInBytes {
607 RTC_DCHECK(filePath.length);
608 RTC_DCHECK_GT(maxSizeInBytes, 0);
609 RTC_DCHECK(!_hasStartedRtcEventLog);
610 if (_hasStartedRtcEventLog) {
611 RTCLogError(@"Event logging already started.");
612 return NO;
613 }
Niels Möllerdec9f742019-06-03 15:25:20 +0200614 FILE *f = fopen(filePath.UTF8String, "wb");
615 if (!f) {
ivoc14d5dbe2016-07-04 07:06:55 -0700616 RTCLogError(@"Error opening file: %@. Error: %d", filePath, errno);
617 return NO;
618 }
Niels Möller695cf6a2019-05-13 12:27:23 +0200619 // TODO(eladalon): It would be better to not allow negative values into PC.
620 const size_t max_size = (maxSizeInBytes < 0) ? webrtc::RtcEventLog::kUnlimitedOutput :
621 rtc::saturated_cast<size_t>(maxSizeInBytes);
622
623 _hasStartedRtcEventLog = _peerConnection->StartRtcEventLog(
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200624 std::make_unique<webrtc::RtcEventLogOutputFile>(f, max_size));
ivoc14d5dbe2016-07-04 07:06:55 -0700625 return _hasStartedRtcEventLog;
626}
627
628- (void)stopRtcEventLog {
629 _peerConnection->StopRtcEventLog();
630 _hasStartedRtcEventLog = NO;
631}
632
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200633- (RTC_OBJC_TYPE(RTCRtpSender) *)senderWithKind:(NSString *)kind streamId:(NSString *)streamId {
skvladf3569c82016-04-29 15:30:16 -0700634 std::string nativeKind = [NSString stdStringForString:kind];
635 std::string nativeStreamId = [NSString stdStringForString:streamId];
636 rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeSender(
637 _peerConnection->CreateSender(nativeKind, nativeStreamId));
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200638 return nativeSender ? [[RTC_OBJC_TYPE(RTCRtpSender) alloc] initWithFactory:self.factory
639 nativeRtpSender:nativeSender] :
640 nil;
skvladf3569c82016-04-29 15:30:16 -0700641}
642
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200643- (NSArray<RTC_OBJC_TYPE(RTCRtpSender) *> *)senders {
skvlad79b4b872016-04-08 17:28:55 -0700644 std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenders(
645 _peerConnection->GetSenders());
646 NSMutableArray *senders = [[NSMutableArray alloc] init];
647 for (const auto &nativeSender : nativeSenders) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200648 RTC_OBJC_TYPE(RTCRtpSender) *sender =
649 [[RTC_OBJC_TYPE(RTCRtpSender) alloc] initWithFactory:self.factory
650 nativeRtpSender:nativeSender];
skvlad79b4b872016-04-08 17:28:55 -0700651 [senders addObject:sender];
652 }
653 return senders;
654}
655
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200656- (NSArray<RTC_OBJC_TYPE(RTCRtpReceiver) *> *)receivers {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700657 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> nativeReceivers(
658 _peerConnection->GetReceivers());
659 NSMutableArray *receivers = [[NSMutableArray alloc] init];
660 for (const auto &nativeReceiver : nativeReceivers) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200661 RTC_OBJC_TYPE(RTCRtpReceiver) *receiver =
662 [[RTC_OBJC_TYPE(RTCRtpReceiver) alloc] initWithFactory:self.factory
663 nativeRtpReceiver:nativeReceiver];
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700664 [receivers addObject:receiver];
665 }
666 return receivers;
667}
668
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200669- (NSArray<RTC_OBJC_TYPE(RTCRtpTransceiver) *> *)transceivers {
Steve Anton8cb344a2018-02-27 15:34:53 -0800670 std::vector<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceivers(
671 _peerConnection->GetTransceivers());
672 NSMutableArray *transceivers = [[NSMutableArray alloc] init];
Mirko Bonadei739baf02019-01-27 17:29:42 +0100673 for (const auto &nativeTransceiver : nativeTransceivers) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +0200674 RTC_OBJC_TYPE(RTCRtpTransceiver) *transceiver =
675 [[RTC_OBJC_TYPE(RTCRtpTransceiver) alloc] initWithFactory:self.factory
676 nativeRtpTransceiver:nativeTransceiver];
Steve Anton8cb344a2018-02-27 15:34:53 -0800677 [transceivers addObject:transceiver];
678 }
679 return transceivers;
680}
681
hjonf396f602016-02-11 16:19:06 -0800682#pragma mark - Private
683
684+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
685 (RTCSignalingState)state {
686 switch (state) {
687 case RTCSignalingStateStable:
688 return webrtc::PeerConnectionInterface::kStable;
689 case RTCSignalingStateHaveLocalOffer:
690 return webrtc::PeerConnectionInterface::kHaveLocalOffer;
691 case RTCSignalingStateHaveLocalPrAnswer:
692 return webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
693 case RTCSignalingStateHaveRemoteOffer:
694 return webrtc::PeerConnectionInterface::kHaveRemoteOffer;
695 case RTCSignalingStateHaveRemotePrAnswer:
696 return webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
697 case RTCSignalingStateClosed:
698 return webrtc::PeerConnectionInterface::kClosed;
699 }
700}
701
702+ (RTCSignalingState)signalingStateForNativeState:
703 (webrtc::PeerConnectionInterface::SignalingState)nativeState {
704 switch (nativeState) {
705 case webrtc::PeerConnectionInterface::kStable:
706 return RTCSignalingStateStable;
707 case webrtc::PeerConnectionInterface::kHaveLocalOffer:
708 return RTCSignalingStateHaveLocalOffer;
709 case webrtc::PeerConnectionInterface::kHaveLocalPrAnswer:
710 return RTCSignalingStateHaveLocalPrAnswer;
711 case webrtc::PeerConnectionInterface::kHaveRemoteOffer:
712 return RTCSignalingStateHaveRemoteOffer;
713 case webrtc::PeerConnectionInterface::kHaveRemotePrAnswer:
714 return RTCSignalingStateHaveRemotePrAnswer;
715 case webrtc::PeerConnectionInterface::kClosed:
716 return RTCSignalingStateClosed;
717 }
718}
719
720+ (NSString *)stringForSignalingState:(RTCSignalingState)state {
721 switch (state) {
722 case RTCSignalingStateStable:
723 return @"STABLE";
724 case RTCSignalingStateHaveLocalOffer:
725 return @"HAVE_LOCAL_OFFER";
726 case RTCSignalingStateHaveLocalPrAnswer:
727 return @"HAVE_LOCAL_PRANSWER";
728 case RTCSignalingStateHaveRemoteOffer:
729 return @"HAVE_REMOTE_OFFER";
730 case RTCSignalingStateHaveRemotePrAnswer:
731 return @"HAVE_REMOTE_PRANSWER";
732 case RTCSignalingStateClosed:
733 return @"CLOSED";
734 }
735}
736
Jonas Olssoncfddbb72018-11-15 16:52:45 +0100737+ (webrtc::PeerConnectionInterface::PeerConnectionState)nativeConnectionStateForState:
738 (RTCPeerConnectionState)state {
739 switch (state) {
740 case RTCPeerConnectionStateNew:
741 return webrtc::PeerConnectionInterface::PeerConnectionState::kNew;
742 case RTCPeerConnectionStateConnecting:
743 return webrtc::PeerConnectionInterface::PeerConnectionState::kConnecting;
744 case RTCPeerConnectionStateConnected:
745 return webrtc::PeerConnectionInterface::PeerConnectionState::kConnected;
746 case RTCPeerConnectionStateFailed:
747 return webrtc::PeerConnectionInterface::PeerConnectionState::kFailed;
748 case RTCPeerConnectionStateDisconnected:
749 return webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected;
750 case RTCPeerConnectionStateClosed:
751 return webrtc::PeerConnectionInterface::PeerConnectionState::kClosed;
752 }
753}
754
755+ (RTCPeerConnectionState)connectionStateForNativeState:
756 (webrtc::PeerConnectionInterface::PeerConnectionState)nativeState {
757 switch (nativeState) {
758 case webrtc::PeerConnectionInterface::PeerConnectionState::kNew:
759 return RTCPeerConnectionStateNew;
760 case webrtc::PeerConnectionInterface::PeerConnectionState::kConnecting:
761 return RTCPeerConnectionStateConnecting;
762 case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected:
763 return RTCPeerConnectionStateConnected;
764 case webrtc::PeerConnectionInterface::PeerConnectionState::kFailed:
765 return RTCPeerConnectionStateFailed;
766 case webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected:
767 return RTCPeerConnectionStateDisconnected;
768 case webrtc::PeerConnectionInterface::PeerConnectionState::kClosed:
769 return RTCPeerConnectionStateClosed;
770 }
771}
772
773+ (NSString *)stringForConnectionState:(RTCPeerConnectionState)state {
774 switch (state) {
775 case RTCPeerConnectionStateNew:
776 return @"NEW";
777 case RTCPeerConnectionStateConnecting:
778 return @"CONNECTING";
779 case RTCPeerConnectionStateConnected:
780 return @"CONNECTED";
781 case RTCPeerConnectionStateFailed:
782 return @"FAILED";
783 case RTCPeerConnectionStateDisconnected:
784 return @"DISCONNECTED";
785 case RTCPeerConnectionStateClosed:
786 return @"CLOSED";
787 }
788}
789
hjonf396f602016-02-11 16:19:06 -0800790+ (webrtc::PeerConnectionInterface::IceConnectionState)
791 nativeIceConnectionStateForState:(RTCIceConnectionState)state {
792 switch (state) {
793 case RTCIceConnectionStateNew:
794 return webrtc::PeerConnectionInterface::kIceConnectionNew;
795 case RTCIceConnectionStateChecking:
796 return webrtc::PeerConnectionInterface::kIceConnectionChecking;
797 case RTCIceConnectionStateConnected:
798 return webrtc::PeerConnectionInterface::kIceConnectionConnected;
799 case RTCIceConnectionStateCompleted:
800 return webrtc::PeerConnectionInterface::kIceConnectionCompleted;
801 case RTCIceConnectionStateFailed:
802 return webrtc::PeerConnectionInterface::kIceConnectionFailed;
803 case RTCIceConnectionStateDisconnected:
804 return webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
805 case RTCIceConnectionStateClosed:
806 return webrtc::PeerConnectionInterface::kIceConnectionClosed;
hjon8bbbf2c2016-03-14 13:15:44 -0700807 case RTCIceConnectionStateCount:
hjonf396f602016-02-11 16:19:06 -0800808 return webrtc::PeerConnectionInterface::kIceConnectionMax;
809 }
810}
811
812+ (RTCIceConnectionState)iceConnectionStateForNativeState:
813 (webrtc::PeerConnectionInterface::IceConnectionState)nativeState {
814 switch (nativeState) {
815 case webrtc::PeerConnectionInterface::kIceConnectionNew:
816 return RTCIceConnectionStateNew;
817 case webrtc::PeerConnectionInterface::kIceConnectionChecking:
818 return RTCIceConnectionStateChecking;
819 case webrtc::PeerConnectionInterface::kIceConnectionConnected:
820 return RTCIceConnectionStateConnected;
821 case webrtc::PeerConnectionInterface::kIceConnectionCompleted:
822 return RTCIceConnectionStateCompleted;
823 case webrtc::PeerConnectionInterface::kIceConnectionFailed:
824 return RTCIceConnectionStateFailed;
825 case webrtc::PeerConnectionInterface::kIceConnectionDisconnected:
826 return RTCIceConnectionStateDisconnected;
827 case webrtc::PeerConnectionInterface::kIceConnectionClosed:
828 return RTCIceConnectionStateClosed;
829 case webrtc::PeerConnectionInterface::kIceConnectionMax:
hjon8bbbf2c2016-03-14 13:15:44 -0700830 return RTCIceConnectionStateCount;
hjonf396f602016-02-11 16:19:06 -0800831 }
832}
833
834+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state {
835 switch (state) {
836 case RTCIceConnectionStateNew:
837 return @"NEW";
838 case RTCIceConnectionStateChecking:
839 return @"CHECKING";
840 case RTCIceConnectionStateConnected:
841 return @"CONNECTED";
842 case RTCIceConnectionStateCompleted:
843 return @"COMPLETED";
844 case RTCIceConnectionStateFailed:
845 return @"FAILED";
846 case RTCIceConnectionStateDisconnected:
847 return @"DISCONNECTED";
848 case RTCIceConnectionStateClosed:
849 return @"CLOSED";
hjon8bbbf2c2016-03-14 13:15:44 -0700850 case RTCIceConnectionStateCount:
851 return @"COUNT";
hjonf396f602016-02-11 16:19:06 -0800852 }
853}
854
855+ (webrtc::PeerConnectionInterface::IceGatheringState)
856 nativeIceGatheringStateForState:(RTCIceGatheringState)state {
857 switch (state) {
858 case RTCIceGatheringStateNew:
859 return webrtc::PeerConnectionInterface::kIceGatheringNew;
860 case RTCIceGatheringStateGathering:
861 return webrtc::PeerConnectionInterface::kIceGatheringGathering;
862 case RTCIceGatheringStateComplete:
863 return webrtc::PeerConnectionInterface::kIceGatheringComplete;
864 }
865}
866
867+ (RTCIceGatheringState)iceGatheringStateForNativeState:
868 (webrtc::PeerConnectionInterface::IceGatheringState)nativeState {
869 switch (nativeState) {
870 case webrtc::PeerConnectionInterface::kIceGatheringNew:
871 return RTCIceGatheringStateNew;
872 case webrtc::PeerConnectionInterface::kIceGatheringGathering:
873 return RTCIceGatheringStateGathering;
874 case webrtc::PeerConnectionInterface::kIceGatheringComplete:
875 return RTCIceGatheringStateComplete;
876 }
877}
878
879+ (NSString *)stringForIceGatheringState:(RTCIceGatheringState)state {
880 switch (state) {
881 case RTCIceGatheringStateNew:
882 return @"NEW";
883 case RTCIceGatheringStateGathering:
884 return @"GATHERING";
885 case RTCIceGatheringStateComplete:
886 return @"COMPLETE";
887 }
888}
889
890+ (webrtc::PeerConnectionInterface::StatsOutputLevel)
891 nativeStatsOutputLevelForLevel:(RTCStatsOutputLevel)level {
892 switch (level) {
893 case RTCStatsOutputLevelStandard:
894 return webrtc::PeerConnectionInterface::kStatsOutputLevelStandard;
895 case RTCStatsOutputLevelDebug:
896 return webrtc::PeerConnectionInterface::kStatsOutputLevelDebug;
897 }
898}
899
hjonf396f602016-02-11 16:19:06 -0800900- (rtc::scoped_refptr<webrtc::PeerConnectionInterface>)nativePeerConnection {
901 return _peerConnection;
902}
903
904@end