blob: 6376ea042971c99e5e347b9fda6e1c24e271e4a6 [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
13#import "NSString+StdString.h"
14#import "RTCConfiguration+Private.h"
15#import "RTCDataChannel+Private.h"
16#import "RTCIceCandidate+Private.h"
hbosbd3dda62016-09-09 01:36:28 -070017#import "RTCLegacyStatsReport+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070018#import "RTCMediaConstraints+Private.h"
19#import "RTCMediaStream+Private.h"
Magnus Jedvert0af86d12017-10-28 16:26:55 +020020#import "RTCPeerConnection+Native.h"
tkchin9eeb6242016-04-27 01:54:20 -070021#import "RTCPeerConnectionFactory+Private.h"
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070022#import "RTCRtpReceiver+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070023#import "RTCRtpSender+Private.h"
24#import "RTCSessionDescription+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070025#import "WebRTC/RTCLogging.h"
hjonf396f602016-02-11 16:19:06 -080026
kwibergbfefb032016-05-01 14:53:46 -070027#include <memory>
28
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "api/jsepicecandidate.h"
30#include "rtc_base/checks.h"
hjonf396f602016-02-11 16:19:06 -080031
hjonf396f602016-02-11 16:19:06 -080032NSString * const kRTCPeerConnectionErrorDomain =
33 @"org.webrtc.RTCPeerConnection";
34int const kRTCPeerConnnectionSessionDescriptionError = -1;
35
36namespace webrtc {
37
38class CreateSessionDescriptionObserverAdapter
39 : public CreateSessionDescriptionObserver {
40 public:
41 CreateSessionDescriptionObserverAdapter(
42 void (^completionHandler)(RTCSessionDescription *sessionDescription,
43 NSError *error)) {
44 completion_handler_ = completionHandler;
45 }
46
47 ~CreateSessionDescriptionObserverAdapter() {
48 completion_handler_ = nil;
49 }
50
51 void OnSuccess(SessionDescriptionInterface *desc) override {
52 RTC_DCHECK(completion_handler_);
kwibergbfefb032016-05-01 14:53:46 -070053 std::unique_ptr<webrtc::SessionDescriptionInterface> description =
54 std::unique_ptr<webrtc::SessionDescriptionInterface>(desc);
hjonf396f602016-02-11 16:19:06 -080055 RTCSessionDescription* session =
56 [[RTCSessionDescription alloc] initWithNativeDescription:
57 description.get()];
58 completion_handler_(session, nil);
59 completion_handler_ = nil;
60 }
61
62 void OnFailure(const std::string& error) override {
63 RTC_DCHECK(completion_handler_);
64 NSString* str = [NSString stringForStdString:error];
65 NSError* err =
66 [NSError errorWithDomain:kRTCPeerConnectionErrorDomain
67 code:kRTCPeerConnnectionSessionDescriptionError
68 userInfo:@{ NSLocalizedDescriptionKey : str }];
69 completion_handler_(nil, err);
70 completion_handler_ = nil;
71 }
72
73 private:
74 void (^completion_handler_)
75 (RTCSessionDescription *sessionDescription, NSError *error);
76};
77
78class SetSessionDescriptionObserverAdapter :
79 public SetSessionDescriptionObserver {
80 public:
81 SetSessionDescriptionObserverAdapter(void (^completionHandler)
82 (NSError *error)) {
83 completion_handler_ = completionHandler;
84 }
85
86 ~SetSessionDescriptionObserverAdapter() {
87 completion_handler_ = nil;
88 }
89
90 void OnSuccess() override {
91 RTC_DCHECK(completion_handler_);
92 completion_handler_(nil);
93 completion_handler_ = nil;
94 }
95
96 void OnFailure(const std::string& error) override {
97 RTC_DCHECK(completion_handler_);
98 NSString* str = [NSString stringForStdString:error];
99 NSError* err =
100 [NSError errorWithDomain:kRTCPeerConnectionErrorDomain
101 code:kRTCPeerConnnectionSessionDescriptionError
102 userInfo:@{ NSLocalizedDescriptionKey : str }];
103 completion_handler_(err);
104 completion_handler_ = nil;
105 }
106
107 private:
108 void (^completion_handler_)(NSError *error);
109};
110
111PeerConnectionDelegateAdapter::PeerConnectionDelegateAdapter(
112 RTCPeerConnection *peerConnection) {
113 peer_connection_ = peerConnection;
114}
115
116PeerConnectionDelegateAdapter::~PeerConnectionDelegateAdapter() {
117 peer_connection_ = nil;
118}
119
120void PeerConnectionDelegateAdapter::OnSignalingChange(
121 PeerConnectionInterface::SignalingState new_state) {
122 RTCSignalingState state =
123 [[RTCPeerConnection class] signalingStateForNativeState:new_state];
124 RTCPeerConnection *peer_connection = peer_connection_;
125 [peer_connection.delegate peerConnection:peer_connection
126 didChangeSignalingState:state];
127}
128
129void PeerConnectionDelegateAdapter::OnAddStream(
deadbeefd5f41ce2016-06-08 13:31:45 -0700130 rtc::scoped_refptr<MediaStreamInterface> stream) {
magjed63bafd62017-02-27 07:04:25 -0800131 RTCMediaStream *mediaStream =
132 [[RTCMediaStream alloc] initWithNativeMediaStream:stream];
hjonf396f602016-02-11 16:19:06 -0800133 RTCPeerConnection *peer_connection = peer_connection_;
134 [peer_connection.delegate peerConnection:peer_connection
135 didAddStream:mediaStream];
136}
137
138void PeerConnectionDelegateAdapter::OnRemoveStream(
deadbeefd5f41ce2016-06-08 13:31:45 -0700139 rtc::scoped_refptr<MediaStreamInterface> stream) {
hjonf396f602016-02-11 16:19:06 -0800140 RTCMediaStream *mediaStream =
141 [[RTCMediaStream alloc] initWithNativeMediaStream:stream];
142 RTCPeerConnection *peer_connection = peer_connection_;
143 [peer_connection.delegate peerConnection:peer_connection
144 didRemoveStream:mediaStream];
145}
146
147void PeerConnectionDelegateAdapter::OnDataChannel(
deadbeefd5f41ce2016-06-08 13:31:45 -0700148 rtc::scoped_refptr<DataChannelInterface> data_channel) {
hjonf396f602016-02-11 16:19:06 -0800149 RTCDataChannel *dataChannel =
150 [[RTCDataChannel alloc] initWithNativeDataChannel:data_channel];
151 RTCPeerConnection *peer_connection = peer_connection_;
152 [peer_connection.delegate peerConnection:peer_connection
153 didOpenDataChannel:dataChannel];
154}
155
156void PeerConnectionDelegateAdapter::OnRenegotiationNeeded() {
157 RTCPeerConnection *peer_connection = peer_connection_;
158 [peer_connection.delegate peerConnectionShouldNegotiate:peer_connection];
159}
160
161void PeerConnectionDelegateAdapter::OnIceConnectionChange(
162 PeerConnectionInterface::IceConnectionState new_state) {
163 RTCIceConnectionState state =
164 [[RTCPeerConnection class] iceConnectionStateForNativeState:new_state];
165 RTCPeerConnection *peer_connection = peer_connection_;
166 [peer_connection.delegate peerConnection:peer_connection
167 didChangeIceConnectionState:state];
168}
169
170void PeerConnectionDelegateAdapter::OnIceGatheringChange(
171 PeerConnectionInterface::IceGatheringState new_state) {
172 RTCIceGatheringState state =
173 [[RTCPeerConnection class] iceGatheringStateForNativeState:new_state];
174 RTCPeerConnection *peer_connection = peer_connection_;
175 [peer_connection.delegate peerConnection:peer_connection
176 didChangeIceGatheringState:state];
177}
178
179void PeerConnectionDelegateAdapter::OnIceCandidate(
180 const IceCandidateInterface *candidate) {
181 RTCIceCandidate *iceCandidate =
182 [[RTCIceCandidate alloc] initWithNativeCandidate:candidate];
183 RTCPeerConnection *peer_connection = peer_connection_;
184 [peer_connection.delegate peerConnection:peer_connection
185 didGenerateIceCandidate:iceCandidate];
186}
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700187
188void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
189 const std::vector<cricket::Candidate>& candidates) {
190 NSMutableArray* ice_candidates =
191 [NSMutableArray arrayWithCapacity:candidates.size()];
192 for (const auto& candidate : candidates) {
193 std::unique_ptr<JsepIceCandidate> candidate_wrapper(
194 new JsepIceCandidate(candidate.transport_name(), -1, candidate));
195 RTCIceCandidate* ice_candidate = [[RTCIceCandidate alloc]
196 initWithNativeCandidate:candidate_wrapper.get()];
197 [ice_candidates addObject:ice_candidate];
198 }
199 RTCPeerConnection* peer_connection = peer_connection_;
200 [peer_connection.delegate peerConnection:peer_connection
201 didRemoveIceCandidates:ice_candidates];
202}
203
hjonf396f602016-02-11 16:19:06 -0800204} // namespace webrtc
205
206
207@implementation RTCPeerConnection {
vopatop.skam96b6b832016-08-18 14:21:20 -0700208 NSMutableArray<RTCMediaStream *> *_localStreams;
kwibergbfefb032016-05-01 14:53:46 -0700209 std::unique_ptr<webrtc::PeerConnectionDelegateAdapter> _observer;
hjonf396f602016-02-11 16:19:06 -0800210 rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
deadbeef5d0b6d82017-01-09 16:05:28 -0800211 std::unique_ptr<webrtc::MediaConstraints> _nativeConstraints;
ivoc14d5dbe2016-07-04 07:06:55 -0700212 BOOL _hasStartedRtcEventLog;
hjonf396f602016-02-11 16:19:06 -0800213}
214
215@synthesize delegate = _delegate;
216
217- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
218 configuration:(RTCConfiguration *)configuration
219 constraints:(RTCMediaConstraints *)constraints
220 delegate:(id<RTCPeerConnectionDelegate>)delegate {
221 NSParameterAssert(factory);
Henrik Boströme06c2dd2016-05-13 13:50:38 +0200222 std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
hbosa73ca562016-05-17 03:28:58 -0700223 [configuration createNativeConfiguration]);
224 if (!config) {
225 return nil;
226 }
hjonf396f602016-02-11 16:19:06 -0800227 if (self = [super init]) {
228 _observer.reset(new webrtc::PeerConnectionDelegateAdapter(self));
deadbeef5d0b6d82017-01-09 16:05:28 -0800229 _nativeConstraints = constraints.nativeConstraints;
230 CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
231 config.get());
hjonf396f602016-02-11 16:19:06 -0800232 _peerConnection =
hbosd7973cc2016-05-27 06:08:53 -0700233 factory.nativeFactory->CreatePeerConnection(*config,
hbosd7973cc2016-05-27 06:08:53 -0700234 nullptr,
235 nullptr,
236 _observer.get());
skvlad588783a2016-08-11 14:29:25 -0700237 if (!_peerConnection) {
238 return nil;
239 }
hjonf396f602016-02-11 16:19:06 -0800240 _localStreams = [[NSMutableArray alloc] init];
241 _delegate = delegate;
242 }
243 return self;
244}
245
vopatop.skam96b6b832016-08-18 14:21:20 -0700246- (NSArray<RTCMediaStream *> *)localStreams {
hjonf396f602016-02-11 16:19:06 -0800247 return [_localStreams copy];
248}
249
250- (RTCSessionDescription *)localDescription {
251 const webrtc::SessionDescriptionInterface *description =
252 _peerConnection->local_description();
253 return description ?
254 [[RTCSessionDescription alloc] initWithNativeDescription:description]
255 : nil;
256}
257
258- (RTCSessionDescription *)remoteDescription {
259 const webrtc::SessionDescriptionInterface *description =
260 _peerConnection->remote_description();
261 return description ?
262 [[RTCSessionDescription alloc] initWithNativeDescription:description]
263 : nil;
264}
265
266- (RTCSignalingState)signalingState {
267 return [[self class]
268 signalingStateForNativeState:_peerConnection->signaling_state()];
269}
270
271- (RTCIceConnectionState)iceConnectionState {
272 return [[self class] iceConnectionStateForNativeState:
273 _peerConnection->ice_connection_state()];
274}
275
276- (RTCIceGatheringState)iceGatheringState {
277 return [[self class] iceGatheringStateForNativeState:
278 _peerConnection->ice_gathering_state()];
279}
280
tkchinaac3eb22016-03-09 21:49:40 -0800281- (BOOL)setConfiguration:(RTCConfiguration *)configuration {
Henrik Boströme06c2dd2016-05-13 13:50:38 +0200282 std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
hbosa73ca562016-05-17 03:28:58 -0700283 [configuration createNativeConfiguration]);
284 if (!config) {
285 return NO;
286 }
deadbeef5d0b6d82017-01-09 16:05:28 -0800287 CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
288 config.get());
Henrik Boströme06c2dd2016-05-13 13:50:38 +0200289 return _peerConnection->SetConfiguration(*config);
tkchinaac3eb22016-03-09 21:49:40 -0800290}
291
jtteh4eeb5372017-04-03 15:06:37 -0700292- (RTCConfiguration *)configuration {
293 webrtc::PeerConnectionInterface::RTCConfiguration config =
294 _peerConnection->GetConfiguration();
jtteh465faf02017-04-04 14:00:16 -0700295 return [[RTCConfiguration alloc] initWithNativeConfiguration:config];
jtteh4eeb5372017-04-03 15:06:37 -0700296}
297
hjonf396f602016-02-11 16:19:06 -0800298- (void)close {
299 _peerConnection->Close();
300}
301
302- (void)addIceCandidate:(RTCIceCandidate *)candidate {
kwibergbfefb032016-05-01 14:53:46 -0700303 std::unique_ptr<const webrtc::IceCandidateInterface> iceCandidate(
hjonf396f602016-02-11 16:19:06 -0800304 candidate.nativeCandidate);
305 _peerConnection->AddIceCandidate(iceCandidate.get());
306}
307
Honghai Zhangda2ba4d2016-05-23 11:53:14 -0700308- (void)removeIceCandidates:(NSArray<RTCIceCandidate *> *)iceCandidates {
309 std::vector<cricket::Candidate> candidates;
310 for (RTCIceCandidate *iceCandidate in iceCandidates) {
311 std::unique_ptr<const webrtc::IceCandidateInterface> candidate(
312 iceCandidate.nativeCandidate);
313 if (candidate) {
314 candidates.push_back(candidate->candidate());
315 // Need to fill the transport name from the sdp_mid.
316 candidates.back().set_transport_name(candidate->sdp_mid());
317 }
318 }
319 if (!candidates.empty()) {
320 _peerConnection->RemoveIceCandidates(candidates);
321 }
322}
323
hjonf396f602016-02-11 16:19:06 -0800324- (void)addStream:(RTCMediaStream *)stream {
hjona2f77982016-03-04 07:09:09 -0800325 if (!_peerConnection->AddStream(stream.nativeMediaStream)) {
hjonf396f602016-02-11 16:19:06 -0800326 RTCLogError(@"Failed to add stream: %@", stream);
327 return;
328 }
329 [_localStreams addObject:stream];
330}
331
332- (void)removeStream:(RTCMediaStream *)stream {
333 _peerConnection->RemoveStream(stream.nativeMediaStream);
334 [_localStreams removeObject:stream];
335}
336
337- (void)offerForConstraints:(RTCMediaConstraints *)constraints
338 completionHandler:
339 (void (^)(RTCSessionDescription *sessionDescription,
340 NSError *error))completionHandler {
341 rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
342 observer(new rtc::RefCountedObject
343 <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
344 _peerConnection->CreateOffer(observer, constraints.nativeConstraints.get());
345}
346
347- (void)answerForConstraints:(RTCMediaConstraints *)constraints
348 completionHandler:
349 (void (^)(RTCSessionDescription *sessionDescription,
350 NSError *error))completionHandler {
351 rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
352 observer(new rtc::RefCountedObject
353 <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
354 _peerConnection->CreateAnswer(observer, constraints.nativeConstraints.get());
355}
356
357- (void)setLocalDescription:(RTCSessionDescription *)sdp
358 completionHandler:(void (^)(NSError *error))completionHandler {
359 rtc::scoped_refptr<webrtc::SetSessionDescriptionObserverAdapter> observer(
360 new rtc::RefCountedObject<webrtc::SetSessionDescriptionObserverAdapter>(
361 completionHandler));
362 _peerConnection->SetLocalDescription(observer, sdp.nativeDescription);
363}
364
365- (void)setRemoteDescription:(RTCSessionDescription *)sdp
366 completionHandler:(void (^)(NSError *error))completionHandler {
367 rtc::scoped_refptr<webrtc::SetSessionDescriptionObserverAdapter> observer(
368 new rtc::RefCountedObject<webrtc::SetSessionDescriptionObserverAdapter>(
369 completionHandler));
370 _peerConnection->SetRemoteDescription(observer, sdp.nativeDescription);
371}
372
zstein8b476172017-09-05 14:43:03 -0700373- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps
374 currentBitrateBps:(nullable NSNumber *)currentBitrateBps
375 maxBitrateBps:(nullable NSNumber *)maxBitrateBps {
zstein03adb7c2017-08-09 14:29:42 -0700376 webrtc::PeerConnectionInterface::BitrateParameters params;
377 if (minBitrateBps != nil) {
378 params.min_bitrate_bps = rtc::Optional<int>(minBitrateBps.intValue);
379 }
380 if (currentBitrateBps != nil) {
381 params.current_bitrate_bps = rtc::Optional<int>(currentBitrateBps.intValue);
382 }
383 if (maxBitrateBps != nil) {
384 params.max_bitrate_bps = rtc::Optional<int>(maxBitrateBps.intValue);
385 }
386 return _peerConnection->SetBitrate(params).ok();
387}
388
Magnus Jedvert0af86d12017-10-28 16:26:55 +0200389- (void)setBitrateAllocationStrategy:
390 (std::unique_ptr<rtc::BitrateAllocationStrategy>)bitrateAllocationStrategy {
391 _peerConnection->SetBitrateAllocationStrategy(std::move(bitrateAllocationStrategy));
392}
393
ivoc14d5dbe2016-07-04 07:06:55 -0700394- (BOOL)startRtcEventLogWithFilePath:(NSString *)filePath
395 maxSizeInBytes:(int64_t)maxSizeInBytes {
396 RTC_DCHECK(filePath.length);
397 RTC_DCHECK_GT(maxSizeInBytes, 0);
398 RTC_DCHECK(!_hasStartedRtcEventLog);
399 if (_hasStartedRtcEventLog) {
400 RTCLogError(@"Event logging already started.");
401 return NO;
402 }
403 int fd = open(filePath.UTF8String, O_WRONLY | O_CREAT | O_TRUNC,
404 S_IRUSR | S_IWUSR);
405 if (fd < 0) {
406 RTCLogError(@"Error opening file: %@. Error: %d", filePath, errno);
407 return NO;
408 }
409 _hasStartedRtcEventLog =
410 _peerConnection->StartRtcEventLog(fd, maxSizeInBytes);
411 return _hasStartedRtcEventLog;
412}
413
414- (void)stopRtcEventLog {
415 _peerConnection->StopRtcEventLog();
416 _hasStartedRtcEventLog = NO;
417}
418
skvladf3569c82016-04-29 15:30:16 -0700419- (RTCRtpSender *)senderWithKind:(NSString *)kind
420 streamId:(NSString *)streamId {
421 std::string nativeKind = [NSString stdStringForString:kind];
422 std::string nativeStreamId = [NSString stdStringForString:streamId];
423 rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeSender(
424 _peerConnection->CreateSender(nativeKind, nativeStreamId));
425 return nativeSender ?
426 [[RTCRtpSender alloc] initWithNativeRtpSender:nativeSender]
427 : nil;
428}
429
skvlad79b4b872016-04-08 17:28:55 -0700430- (NSArray<RTCRtpSender *> *)senders {
431 std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenders(
432 _peerConnection->GetSenders());
433 NSMutableArray *senders = [[NSMutableArray alloc] init];
434 for (const auto &nativeSender : nativeSenders) {
435 RTCRtpSender *sender =
436 [[RTCRtpSender alloc] initWithNativeRtpSender:nativeSender];
437 [senders addObject:sender];
438 }
439 return senders;
440}
441
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700442- (NSArray<RTCRtpReceiver *> *)receivers {
443 std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> nativeReceivers(
444 _peerConnection->GetReceivers());
445 NSMutableArray *receivers = [[NSMutableArray alloc] init];
446 for (const auto &nativeReceiver : nativeReceivers) {
447 RTCRtpReceiver *receiver =
448 [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:nativeReceiver];
449 [receivers addObject:receiver];
450 }
451 return receivers;
452}
453
hjonf396f602016-02-11 16:19:06 -0800454#pragma mark - Private
455
456+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
457 (RTCSignalingState)state {
458 switch (state) {
459 case RTCSignalingStateStable:
460 return webrtc::PeerConnectionInterface::kStable;
461 case RTCSignalingStateHaveLocalOffer:
462 return webrtc::PeerConnectionInterface::kHaveLocalOffer;
463 case RTCSignalingStateHaveLocalPrAnswer:
464 return webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
465 case RTCSignalingStateHaveRemoteOffer:
466 return webrtc::PeerConnectionInterface::kHaveRemoteOffer;
467 case RTCSignalingStateHaveRemotePrAnswer:
468 return webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
469 case RTCSignalingStateClosed:
470 return webrtc::PeerConnectionInterface::kClosed;
471 }
472}
473
474+ (RTCSignalingState)signalingStateForNativeState:
475 (webrtc::PeerConnectionInterface::SignalingState)nativeState {
476 switch (nativeState) {
477 case webrtc::PeerConnectionInterface::kStable:
478 return RTCSignalingStateStable;
479 case webrtc::PeerConnectionInterface::kHaveLocalOffer:
480 return RTCSignalingStateHaveLocalOffer;
481 case webrtc::PeerConnectionInterface::kHaveLocalPrAnswer:
482 return RTCSignalingStateHaveLocalPrAnswer;
483 case webrtc::PeerConnectionInterface::kHaveRemoteOffer:
484 return RTCSignalingStateHaveRemoteOffer;
485 case webrtc::PeerConnectionInterface::kHaveRemotePrAnswer:
486 return RTCSignalingStateHaveRemotePrAnswer;
487 case webrtc::PeerConnectionInterface::kClosed:
488 return RTCSignalingStateClosed;
489 }
490}
491
492+ (NSString *)stringForSignalingState:(RTCSignalingState)state {
493 switch (state) {
494 case RTCSignalingStateStable:
495 return @"STABLE";
496 case RTCSignalingStateHaveLocalOffer:
497 return @"HAVE_LOCAL_OFFER";
498 case RTCSignalingStateHaveLocalPrAnswer:
499 return @"HAVE_LOCAL_PRANSWER";
500 case RTCSignalingStateHaveRemoteOffer:
501 return @"HAVE_REMOTE_OFFER";
502 case RTCSignalingStateHaveRemotePrAnswer:
503 return @"HAVE_REMOTE_PRANSWER";
504 case RTCSignalingStateClosed:
505 return @"CLOSED";
506 }
507}
508
509+ (webrtc::PeerConnectionInterface::IceConnectionState)
510 nativeIceConnectionStateForState:(RTCIceConnectionState)state {
511 switch (state) {
512 case RTCIceConnectionStateNew:
513 return webrtc::PeerConnectionInterface::kIceConnectionNew;
514 case RTCIceConnectionStateChecking:
515 return webrtc::PeerConnectionInterface::kIceConnectionChecking;
516 case RTCIceConnectionStateConnected:
517 return webrtc::PeerConnectionInterface::kIceConnectionConnected;
518 case RTCIceConnectionStateCompleted:
519 return webrtc::PeerConnectionInterface::kIceConnectionCompleted;
520 case RTCIceConnectionStateFailed:
521 return webrtc::PeerConnectionInterface::kIceConnectionFailed;
522 case RTCIceConnectionStateDisconnected:
523 return webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
524 case RTCIceConnectionStateClosed:
525 return webrtc::PeerConnectionInterface::kIceConnectionClosed;
hjon8bbbf2c2016-03-14 13:15:44 -0700526 case RTCIceConnectionStateCount:
hjonf396f602016-02-11 16:19:06 -0800527 return webrtc::PeerConnectionInterface::kIceConnectionMax;
528 }
529}
530
531+ (RTCIceConnectionState)iceConnectionStateForNativeState:
532 (webrtc::PeerConnectionInterface::IceConnectionState)nativeState {
533 switch (nativeState) {
534 case webrtc::PeerConnectionInterface::kIceConnectionNew:
535 return RTCIceConnectionStateNew;
536 case webrtc::PeerConnectionInterface::kIceConnectionChecking:
537 return RTCIceConnectionStateChecking;
538 case webrtc::PeerConnectionInterface::kIceConnectionConnected:
539 return RTCIceConnectionStateConnected;
540 case webrtc::PeerConnectionInterface::kIceConnectionCompleted:
541 return RTCIceConnectionStateCompleted;
542 case webrtc::PeerConnectionInterface::kIceConnectionFailed:
543 return RTCIceConnectionStateFailed;
544 case webrtc::PeerConnectionInterface::kIceConnectionDisconnected:
545 return RTCIceConnectionStateDisconnected;
546 case webrtc::PeerConnectionInterface::kIceConnectionClosed:
547 return RTCIceConnectionStateClosed;
548 case webrtc::PeerConnectionInterface::kIceConnectionMax:
hjon8bbbf2c2016-03-14 13:15:44 -0700549 return RTCIceConnectionStateCount;
hjonf396f602016-02-11 16:19:06 -0800550 }
551}
552
553+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state {
554 switch (state) {
555 case RTCIceConnectionStateNew:
556 return @"NEW";
557 case RTCIceConnectionStateChecking:
558 return @"CHECKING";
559 case RTCIceConnectionStateConnected:
560 return @"CONNECTED";
561 case RTCIceConnectionStateCompleted:
562 return @"COMPLETED";
563 case RTCIceConnectionStateFailed:
564 return @"FAILED";
565 case RTCIceConnectionStateDisconnected:
566 return @"DISCONNECTED";
567 case RTCIceConnectionStateClosed:
568 return @"CLOSED";
hjon8bbbf2c2016-03-14 13:15:44 -0700569 case RTCIceConnectionStateCount:
570 return @"COUNT";
hjonf396f602016-02-11 16:19:06 -0800571 }
572}
573
574+ (webrtc::PeerConnectionInterface::IceGatheringState)
575 nativeIceGatheringStateForState:(RTCIceGatheringState)state {
576 switch (state) {
577 case RTCIceGatheringStateNew:
578 return webrtc::PeerConnectionInterface::kIceGatheringNew;
579 case RTCIceGatheringStateGathering:
580 return webrtc::PeerConnectionInterface::kIceGatheringGathering;
581 case RTCIceGatheringStateComplete:
582 return webrtc::PeerConnectionInterface::kIceGatheringComplete;
583 }
584}
585
586+ (RTCIceGatheringState)iceGatheringStateForNativeState:
587 (webrtc::PeerConnectionInterface::IceGatheringState)nativeState {
588 switch (nativeState) {
589 case webrtc::PeerConnectionInterface::kIceGatheringNew:
590 return RTCIceGatheringStateNew;
591 case webrtc::PeerConnectionInterface::kIceGatheringGathering:
592 return RTCIceGatheringStateGathering;
593 case webrtc::PeerConnectionInterface::kIceGatheringComplete:
594 return RTCIceGatheringStateComplete;
595 }
596}
597
598+ (NSString *)stringForIceGatheringState:(RTCIceGatheringState)state {
599 switch (state) {
600 case RTCIceGatheringStateNew:
601 return @"NEW";
602 case RTCIceGatheringStateGathering:
603 return @"GATHERING";
604 case RTCIceGatheringStateComplete:
605 return @"COMPLETE";
606 }
607}
608
609+ (webrtc::PeerConnectionInterface::StatsOutputLevel)
610 nativeStatsOutputLevelForLevel:(RTCStatsOutputLevel)level {
611 switch (level) {
612 case RTCStatsOutputLevelStandard:
613 return webrtc::PeerConnectionInterface::kStatsOutputLevelStandard;
614 case RTCStatsOutputLevelDebug:
615 return webrtc::PeerConnectionInterface::kStatsOutputLevelDebug;
616 }
617}
618
hjonf396f602016-02-11 16:19:06 -0800619- (rtc::scoped_refptr<webrtc::PeerConnectionInterface>)nativePeerConnection {
620 return _peerConnection;
621}
622
623@end