Obj-C SDK Cleanup
This CL separates the files under sdk/objc into logical directories, replacing the previous file layout under Framework/. A long term goal is to have some system set up to generate the files under sdk/objc/api (the PeerConnection API wrappers) from the C++ code. In the shorter term the goal is to abstract out shared concepts from these classes in order to make them as uniform as possible. The separation into base/, components/, and helpers/ are to differentiate between the base layer's common protocols, various utilities and the actual platform specific components. The old directory layout that resembled a framework's internal layout is not necessary, since it is generated by the framework target when building it. Bug: webrtc:9627 Change-Id: Ib084fd83f050ae980649ca99e841f4fb0580bd8f Reviewed-on: https://webrtc-review.googlesource.com/94142 Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Reviewed-by: Henrik Andreassson <henrika@webrtc.org> Commit-Queue: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24493}
This commit is contained in:
committed by
Commit Bot
parent
9ea5765f78
commit
7bca8ca4e2
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCAudioSource.h"
|
||||
|
||||
#import "RTCMediaSource+Private.h"
|
||||
|
||||
@interface RTCAudioSource ()
|
||||
|
||||
/**
|
||||
* The AudioSourceInterface object passed to this RTCAudioSource during
|
||||
* construction.
|
||||
*/
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::AudioSourceInterface> nativeAudioSource;
|
||||
|
||||
/** Initialize an RTCAudioSource from a native AudioSourceInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory
|
||||
nativeAudioSource:(rtc::scoped_refptr<webrtc::AudioSourceInterface>)nativeAudioSource
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory
|
||||
nativeMediaSource:(rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
|
||||
type:(RTCMediaSourceType)type NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCAudioSource+Private.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
@implementation RTCAudioSource {
|
||||
}
|
||||
|
||||
@synthesize volume = _volume;
|
||||
@synthesize nativeAudioSource = _nativeAudioSource;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeAudioSource:
|
||||
(rtc::scoped_refptr<webrtc::AudioSourceInterface>)nativeAudioSource {
|
||||
RTC_DCHECK(factory);
|
||||
RTC_DCHECK(nativeAudioSource);
|
||||
|
||||
if (self = [super initWithFactory:factory
|
||||
nativeMediaSource:nativeAudioSource
|
||||
type:RTCMediaSourceTypeAudio]) {
|
||||
_nativeAudioSource = nativeAudioSource;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaSource:(rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
|
||||
type:(RTCMediaSourceType)type {
|
||||
RTC_NOTREACHED();
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
NSString *stateString = [[self class] stringForState:self.state];
|
||||
return [NSString stringWithFormat:@"RTCAudioSource( %p ): %@", self, stateString];
|
||||
}
|
||||
|
||||
- (void)setVolume:(double)volume {
|
||||
_volume = volume;
|
||||
_nativeAudioSource->SetVolume(volume);
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCAudioTrack.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
@interface RTCAudioTrack ()
|
||||
|
||||
/** AudioTrackInterface created or passed in at construction. */
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::AudioTrackInterface> nativeAudioTrack;
|
||||
|
||||
/** Initialize an RTCAudioTrack with an id. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
source:(RTCAudioSource *)source
|
||||
trackId:(NSString *)trackId;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,68 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCAudioTrack+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCAudioSource+Private.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCPeerConnectionFactory+Private.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
@implementation RTCAudioTrack
|
||||
|
||||
@synthesize source = _source;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
source:(RTCAudioSource *)source
|
||||
trackId:(NSString *)trackId {
|
||||
RTC_DCHECK(factory);
|
||||
RTC_DCHECK(source);
|
||||
RTC_DCHECK(trackId.length);
|
||||
|
||||
std::string nativeId = [NSString stdStringForString:trackId];
|
||||
rtc::scoped_refptr<webrtc::AudioTrackInterface> track =
|
||||
factory.nativeFactory->CreateAudioTrack(nativeId, source.nativeAudioSource);
|
||||
if (self = [self initWithFactory:factory nativeTrack:track type:RTCMediaStreamTrackTypeAudio]) {
|
||||
_source = source;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
|
||||
type:(RTCMediaStreamTrackType)type {
|
||||
NSParameterAssert(factory);
|
||||
NSParameterAssert(nativeTrack);
|
||||
NSParameterAssert(type == RTCMediaStreamTrackTypeAudio);
|
||||
return [super initWithFactory:factory nativeTrack:nativeTrack type:type];
|
||||
}
|
||||
|
||||
|
||||
- (RTCAudioSource *)source {
|
||||
if (!_source) {
|
||||
rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
|
||||
self.nativeAudioTrack->GetSource();
|
||||
if (source) {
|
||||
_source =
|
||||
[[RTCAudioSource alloc] initWithFactory:self.factory nativeAudioSource:source.get()];
|
||||
}
|
||||
}
|
||||
return _source;
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::AudioTrackInterface>)nativeAudioTrack {
|
||||
return static_cast<webrtc::AudioTrackInterface *>(self.nativeTrack.get());
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,498 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "WebRTC/RTCCameraVideoCapturer.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
#import "WebRTC/RTCVideoFrameBuffer.h"
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
#import "WebRTC/UIDevice+RTCDevice.h"
|
||||
#endif
|
||||
|
||||
#import "AVCaptureSession+DevicePosition.h"
|
||||
#import "RTCDispatcher+Private.h"
|
||||
|
||||
const int64_t kNanosecondsPerSecond = 1000000000;
|
||||
|
||||
@interface RTCCameraVideoCapturer ()<AVCaptureVideoDataOutputSampleBufferDelegate>
|
||||
@property(nonatomic, readonly) dispatch_queue_t frameQueue;
|
||||
@end
|
||||
|
||||
@implementation RTCCameraVideoCapturer {
|
||||
AVCaptureVideoDataOutput *_videoDataOutput;
|
||||
AVCaptureSession *_captureSession;
|
||||
AVCaptureDevice *_currentDevice;
|
||||
FourCharCode _preferredOutputPixelFormat;
|
||||
FourCharCode _outputPixelFormat;
|
||||
BOOL _hasRetriedOnFatalError;
|
||||
BOOL _isRunning;
|
||||
// Will the session be running once all asynchronous operations have been completed?
|
||||
BOOL _willBeRunning;
|
||||
RTCVideoRotation _rotation;
|
||||
#if TARGET_OS_IPHONE
|
||||
UIDeviceOrientation _orientation;
|
||||
#endif
|
||||
}
|
||||
|
||||
@synthesize frameQueue = _frameQueue;
|
||||
@synthesize captureSession = _captureSession;
|
||||
|
||||
- (instancetype)init {
|
||||
return [self initWithDelegate:nil captureSession:[[AVCaptureSession alloc] init]];
|
||||
}
|
||||
|
||||
- (instancetype)initWithDelegate:(__weak id<RTCVideoCapturerDelegate>)delegate {
|
||||
return [self initWithDelegate:delegate captureSession:[[AVCaptureSession alloc] init]];
|
||||
}
|
||||
|
||||
// This initializer is used for testing.
|
||||
- (instancetype)initWithDelegate:(__weak id<RTCVideoCapturerDelegate>)delegate
|
||||
captureSession:(AVCaptureSession *)captureSession {
|
||||
if (self = [super initWithDelegate:delegate]) {
|
||||
// Create the capture session and all relevant inputs and outputs. We need
|
||||
// to do this in init because the application may want the capture session
|
||||
// before we start the capturer for e.g. AVCapturePreviewLayer. All objects
|
||||
// created here are retained until dealloc and never recreated.
|
||||
if (![self setupCaptureSession:captureSession]) {
|
||||
return nil;
|
||||
}
|
||||
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
||||
#if TARGET_OS_IPHONE
|
||||
_orientation = UIDeviceOrientationPortrait;
|
||||
_rotation = RTCVideoRotation_90;
|
||||
[center addObserver:self
|
||||
selector:@selector(deviceOrientationDidChange:)
|
||||
name:UIDeviceOrientationDidChangeNotification
|
||||
object:nil];
|
||||
[center addObserver:self
|
||||
selector:@selector(handleCaptureSessionInterruption:)
|
||||
name:AVCaptureSessionWasInterruptedNotification
|
||||
object:_captureSession];
|
||||
[center addObserver:self
|
||||
selector:@selector(handleCaptureSessionInterruptionEnded:)
|
||||
name:AVCaptureSessionInterruptionEndedNotification
|
||||
object:_captureSession];
|
||||
[center addObserver:self
|
||||
selector:@selector(handleApplicationDidBecomeActive:)
|
||||
name:UIApplicationDidBecomeActiveNotification
|
||||
object:[UIApplication sharedApplication]];
|
||||
#endif
|
||||
[center addObserver:self
|
||||
selector:@selector(handleCaptureSessionRuntimeError:)
|
||||
name:AVCaptureSessionRuntimeErrorNotification
|
||||
object:_captureSession];
|
||||
[center addObserver:self
|
||||
selector:@selector(handleCaptureSessionDidStartRunning:)
|
||||
name:AVCaptureSessionDidStartRunningNotification
|
||||
object:_captureSession];
|
||||
[center addObserver:self
|
||||
selector:@selector(handleCaptureSessionDidStopRunning:)
|
||||
name:AVCaptureSessionDidStopRunningNotification
|
||||
object:_captureSession];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
NSAssert(
|
||||
!_willBeRunning,
|
||||
@"Session was still running in RTCCameraVideoCapturer dealloc. Forgot to call stopCapture?");
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
+ (NSArray<AVCaptureDevice *> *)captureDevices {
|
||||
#if defined(WEBRTC_IOS) && defined(__IPHONE_10_0) && \
|
||||
__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0
|
||||
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
|
||||
discoverySessionWithDeviceTypes:@[ AVCaptureDeviceTypeBuiltInWideAngleCamera ]
|
||||
mediaType:AVMediaTypeVideo
|
||||
position:AVCaptureDevicePositionUnspecified];
|
||||
return session.devices;
|
||||
#else
|
||||
return [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
|
||||
#endif
|
||||
}
|
||||
|
||||
+ (NSArray<AVCaptureDeviceFormat *> *)supportedFormatsForDevice:(AVCaptureDevice *)device {
|
||||
// Support opening the device in any format. We make sure it's converted to a format we
|
||||
// can handle, if needed, in the method `-setupVideoDataOutput`.
|
||||
return device.formats;
|
||||
}
|
||||
|
||||
- (FourCharCode)preferredOutputPixelFormat {
|
||||
return _preferredOutputPixelFormat;
|
||||
}
|
||||
|
||||
- (void)startCaptureWithDevice:(AVCaptureDevice *)device
|
||||
format:(AVCaptureDeviceFormat *)format
|
||||
fps:(NSInteger)fps {
|
||||
[self startCaptureWithDevice:device format:format fps:fps completionHandler:nil];
|
||||
}
|
||||
|
||||
- (void)stopCapture {
|
||||
[self stopCaptureWithCompletionHandler:nil];
|
||||
}
|
||||
|
||||
- (void)startCaptureWithDevice:(AVCaptureDevice *)device
|
||||
format:(AVCaptureDeviceFormat *)format
|
||||
fps:(NSInteger)fps
|
||||
completionHandler:(nullable void (^)(NSError *))completionHandler {
|
||||
_willBeRunning = YES;
|
||||
[RTCDispatcher
|
||||
dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
RTCLogInfo("startCaptureWithDevice %@ @ %ld fps", format, (long)fps);
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
|
||||
#endif
|
||||
|
||||
_currentDevice = device;
|
||||
|
||||
NSError *error = nil;
|
||||
if (![_currentDevice lockForConfiguration:&error]) {
|
||||
RTCLogError(
|
||||
@"Failed to lock device %@. Error: %@", _currentDevice, error.userInfo);
|
||||
if (completionHandler) {
|
||||
completionHandler(error);
|
||||
}
|
||||
_willBeRunning = NO;
|
||||
return;
|
||||
}
|
||||
[self reconfigureCaptureSessionInput];
|
||||
[self updateOrientation];
|
||||
[self updateDeviceCaptureFormat:format fps:fps];
|
||||
[self updateVideoDataOutputPixelFormat:format];
|
||||
[_captureSession startRunning];
|
||||
[_currentDevice unlockForConfiguration];
|
||||
_isRunning = YES;
|
||||
if (completionHandler) {
|
||||
completionHandler(nil);
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)stopCaptureWithCompletionHandler:(nullable void (^)(void))completionHandler {
|
||||
_willBeRunning = NO;
|
||||
[RTCDispatcher
|
||||
dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
RTCLogInfo("Stop");
|
||||
_currentDevice = nil;
|
||||
for (AVCaptureDeviceInput *oldInput in [_captureSession.inputs copy]) {
|
||||
[_captureSession removeInput:oldInput];
|
||||
}
|
||||
[_captureSession stopRunning];
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
|
||||
#endif
|
||||
_isRunning = NO;
|
||||
if (completionHandler) {
|
||||
completionHandler();
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark iOS notifications
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
- (void)deviceOrientationDidChange:(NSNotification *)notification {
|
||||
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
[self updateOrientation];
|
||||
}];
|
||||
}
|
||||
#endif
|
||||
|
||||
#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate
|
||||
|
||||
- (void)captureOutput:(AVCaptureOutput *)captureOutput
|
||||
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
|
||||
fromConnection:(AVCaptureConnection *)connection {
|
||||
NSParameterAssert(captureOutput == _videoDataOutput);
|
||||
|
||||
if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) ||
|
||||
!CMSampleBufferDataIsReady(sampleBuffer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
|
||||
if (pixelBuffer == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
// Default to portrait orientation on iPhone.
|
||||
BOOL usingFrontCamera = NO;
|
||||
// Check the image's EXIF for the camera the image came from as the image could have been
|
||||
// delayed as we set alwaysDiscardsLateVideoFrames to NO.
|
||||
AVCaptureDevicePosition cameraPosition =
|
||||
[AVCaptureSession devicePositionForSampleBuffer:sampleBuffer];
|
||||
if (cameraPosition != AVCaptureDevicePositionUnspecified) {
|
||||
usingFrontCamera = AVCaptureDevicePositionFront == cameraPosition;
|
||||
} else {
|
||||
AVCaptureDeviceInput *deviceInput =
|
||||
(AVCaptureDeviceInput *)((AVCaptureInputPort *)connection.inputPorts.firstObject).input;
|
||||
usingFrontCamera = AVCaptureDevicePositionFront == deviceInput.device.position;
|
||||
}
|
||||
switch (_orientation) {
|
||||
case UIDeviceOrientationPortrait:
|
||||
_rotation = RTCVideoRotation_90;
|
||||
break;
|
||||
case UIDeviceOrientationPortraitUpsideDown:
|
||||
_rotation = RTCVideoRotation_270;
|
||||
break;
|
||||
case UIDeviceOrientationLandscapeLeft:
|
||||
_rotation = usingFrontCamera ? RTCVideoRotation_180 : RTCVideoRotation_0;
|
||||
break;
|
||||
case UIDeviceOrientationLandscapeRight:
|
||||
_rotation = usingFrontCamera ? RTCVideoRotation_0 : RTCVideoRotation_180;
|
||||
break;
|
||||
case UIDeviceOrientationFaceUp:
|
||||
case UIDeviceOrientationFaceDown:
|
||||
case UIDeviceOrientationUnknown:
|
||||
// Ignore.
|
||||
break;
|
||||
}
|
||||
#else
|
||||
// No rotation on Mac.
|
||||
_rotation = RTCVideoRotation_0;
|
||||
#endif
|
||||
|
||||
RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
|
||||
int64_t timeStampNs = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) *
|
||||
kNanosecondsPerSecond;
|
||||
RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer
|
||||
rotation:_rotation
|
||||
timeStampNs:timeStampNs];
|
||||
[self.delegate capturer:self didCaptureVideoFrame:videoFrame];
|
||||
}
|
||||
|
||||
- (void)captureOutput:(AVCaptureOutput *)captureOutput
|
||||
didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer
|
||||
fromConnection:(AVCaptureConnection *)connection {
|
||||
RTCLogError(@"Dropped sample buffer.");
|
||||
}
|
||||
|
||||
#pragma mark - AVCaptureSession notifications
|
||||
|
||||
- (void)handleCaptureSessionInterruption:(NSNotification *)notification {
|
||||
NSString *reasonString = nil;
|
||||
#if TARGET_OS_IPHONE
|
||||
NSNumber *reason = notification.userInfo[AVCaptureSessionInterruptionReasonKey];
|
||||
if (reason) {
|
||||
switch (reason.intValue) {
|
||||
case AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground:
|
||||
reasonString = @"VideoDeviceNotAvailableInBackground";
|
||||
break;
|
||||
case AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient:
|
||||
reasonString = @"AudioDeviceInUseByAnotherClient";
|
||||
break;
|
||||
case AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient:
|
||||
reasonString = @"VideoDeviceInUseByAnotherClient";
|
||||
break;
|
||||
case AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps:
|
||||
reasonString = @"VideoDeviceNotAvailableWithMultipleForegroundApps";
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
RTCLog(@"Capture session interrupted: %@", reasonString);
|
||||
}
|
||||
|
||||
- (void)handleCaptureSessionInterruptionEnded:(NSNotification *)notification {
|
||||
RTCLog(@"Capture session interruption ended.");
|
||||
}
|
||||
|
||||
- (void)handleCaptureSessionRuntimeError:(NSNotification *)notification {
|
||||
NSError *error = [notification.userInfo objectForKey:AVCaptureSessionErrorKey];
|
||||
RTCLogError(@"Capture session runtime error: %@", error);
|
||||
|
||||
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
#if TARGET_OS_IPHONE
|
||||
if (error.code == AVErrorMediaServicesWereReset) {
|
||||
[self handleNonFatalError];
|
||||
} else {
|
||||
[self handleFatalError];
|
||||
}
|
||||
#else
|
||||
[self handleFatalError];
|
||||
#endif
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)handleCaptureSessionDidStartRunning:(NSNotification *)notification {
|
||||
RTCLog(@"Capture session started.");
|
||||
|
||||
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
// If we successfully restarted after an unknown error,
|
||||
// allow future retries on fatal errors.
|
||||
_hasRetriedOnFatalError = NO;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)handleCaptureSessionDidStopRunning:(NSNotification *)notification {
|
||||
RTCLog(@"Capture session stopped.");
|
||||
}
|
||||
|
||||
- (void)handleFatalError {
|
||||
[RTCDispatcher
|
||||
dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
if (!_hasRetriedOnFatalError) {
|
||||
RTCLogWarning(@"Attempting to recover from fatal capture error.");
|
||||
[self handleNonFatalError];
|
||||
_hasRetriedOnFatalError = YES;
|
||||
} else {
|
||||
RTCLogError(@"Previous fatal error recovery failed.");
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)handleNonFatalError {
|
||||
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
RTCLog(@"Restarting capture session after error.");
|
||||
if (_isRunning) {
|
||||
[_captureSession startRunning];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
|
||||
#pragma mark - UIApplication notifications
|
||||
|
||||
- (void)handleApplicationDidBecomeActive:(NSNotification *)notification {
|
||||
[RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
|
||||
block:^{
|
||||
if (_isRunning && !_captureSession.isRunning) {
|
||||
RTCLog(@"Restarting capture session on active.");
|
||||
[_captureSession startRunning];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#endif // TARGET_OS_IPHONE
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (dispatch_queue_t)frameQueue {
|
||||
if (!_frameQueue) {
|
||||
_frameQueue =
|
||||
dispatch_queue_create("org.webrtc.cameravideocapturer.video", DISPATCH_QUEUE_SERIAL);
|
||||
dispatch_set_target_queue(_frameQueue,
|
||||
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));
|
||||
}
|
||||
return _frameQueue;
|
||||
}
|
||||
|
||||
- (BOOL)setupCaptureSession:(AVCaptureSession *)captureSession {
|
||||
NSAssert(_captureSession == nil, @"Setup capture session called twice.");
|
||||
_captureSession = captureSession;
|
||||
#if defined(WEBRTC_IOS)
|
||||
_captureSession.sessionPreset = AVCaptureSessionPresetInputPriority;
|
||||
_captureSession.usesApplicationAudioSession = NO;
|
||||
#endif
|
||||
[self setupVideoDataOutput];
|
||||
// Add the output.
|
||||
if (![_captureSession canAddOutput:_videoDataOutput]) {
|
||||
RTCLogError(@"Video data output unsupported.");
|
||||
return NO;
|
||||
}
|
||||
[_captureSession addOutput:_videoDataOutput];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)setupVideoDataOutput {
|
||||
NSAssert(_videoDataOutput == nil, @"Setup video data output called twice.");
|
||||
AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
|
||||
|
||||
// `videoDataOutput.availableVideoCVPixelFormatTypes` returns the pixel formats supported by the
|
||||
// device with the most efficient output format first. Find the first format that we support.
|
||||
NSSet<NSNumber *> *supportedPixelFormats = [RTCCVPixelBuffer supportedPixelFormats];
|
||||
NSMutableOrderedSet *availablePixelFormats =
|
||||
[NSMutableOrderedSet orderedSetWithArray:videoDataOutput.availableVideoCVPixelFormatTypes];
|
||||
[availablePixelFormats intersectSet:supportedPixelFormats];
|
||||
NSNumber *pixelFormat = availablePixelFormats.firstObject;
|
||||
NSAssert(pixelFormat, @"Output device has no supported formats.");
|
||||
|
||||
_preferredOutputPixelFormat = [pixelFormat unsignedIntValue];
|
||||
_outputPixelFormat = _preferredOutputPixelFormat;
|
||||
videoDataOutput.videoSettings = @{(NSString *)kCVPixelBufferPixelFormatTypeKey : pixelFormat};
|
||||
videoDataOutput.alwaysDiscardsLateVideoFrames = NO;
|
||||
[videoDataOutput setSampleBufferDelegate:self queue:self.frameQueue];
|
||||
_videoDataOutput = videoDataOutput;
|
||||
}
|
||||
|
||||
- (void)updateVideoDataOutputPixelFormat:(AVCaptureDeviceFormat *)format {
|
||||
FourCharCode mediaSubType = CMFormatDescriptionGetMediaSubType(format.formatDescription);
|
||||
if (![[RTCCVPixelBuffer supportedPixelFormats] containsObject:@(mediaSubType)]) {
|
||||
mediaSubType = _preferredOutputPixelFormat;
|
||||
}
|
||||
|
||||
if (mediaSubType != _outputPixelFormat) {
|
||||
_outputPixelFormat = mediaSubType;
|
||||
_videoDataOutput.videoSettings =
|
||||
@{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(mediaSubType) };
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Private, called inside capture queue
|
||||
|
||||
- (void)updateDeviceCaptureFormat:(AVCaptureDeviceFormat *)format fps:(NSInteger)fps {
|
||||
NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession],
|
||||
@"updateDeviceCaptureFormat must be called on the capture queue.");
|
||||
@try {
|
||||
_currentDevice.activeFormat = format;
|
||||
_currentDevice.activeVideoMinFrameDuration = CMTimeMake(1, fps);
|
||||
} @catch (NSException *exception) {
|
||||
RTCLogError(@"Failed to set active format!\n User info:%@", exception.userInfo);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)reconfigureCaptureSessionInput {
|
||||
NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession],
|
||||
@"reconfigureCaptureSessionInput must be called on the capture queue.");
|
||||
NSError *error = nil;
|
||||
AVCaptureDeviceInput *input =
|
||||
[AVCaptureDeviceInput deviceInputWithDevice:_currentDevice error:&error];
|
||||
if (!input) {
|
||||
RTCLogError(@"Failed to create front camera input: %@", error.localizedDescription);
|
||||
return;
|
||||
}
|
||||
[_captureSession beginConfiguration];
|
||||
for (AVCaptureDeviceInput *oldInput in [_captureSession.inputs copy]) {
|
||||
[_captureSession removeInput:oldInput];
|
||||
}
|
||||
if ([_captureSession canAddInput:input]) {
|
||||
[_captureSession addInput:input];
|
||||
} else {
|
||||
RTCLogError(@"Cannot add camera as an input to the session.");
|
||||
}
|
||||
[_captureSession commitConfiguration];
|
||||
}
|
||||
|
||||
- (void)updateOrientation {
|
||||
NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession],
|
||||
@"updateOrientation must be called on the capture queue.");
|
||||
#if TARGET_OS_IPHONE
|
||||
_orientation = [UIDevice currentDevice].orientation;
|
||||
#endif
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,70 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCCertificate.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/rtccertificategenerator.h"
|
||||
#include "rtc_base/sslidentity.h"
|
||||
|
||||
@implementation RTCCertificate
|
||||
|
||||
@synthesize private_key = _private_key;
|
||||
@synthesize certificate = _certificate;
|
||||
|
||||
- (id)copyWithZone:(NSZone *)zone {
|
||||
id copy = [[[self class] alloc] initWithPrivateKey:[self.private_key copyWithZone:zone]
|
||||
certificate:[self.certificate copyWithZone:zone]];
|
||||
return copy;
|
||||
}
|
||||
|
||||
- (instancetype)initWithPrivateKey:(NSString *)private_key certificate:(NSString *)certificate {
|
||||
if (self = [super init]) {
|
||||
_private_key = [private_key copy];
|
||||
_certificate = [certificate copy];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (nullable RTCCertificate *)generateCertificateWithParams:(NSDictionary *)params {
|
||||
rtc::KeyType keyType = rtc::KT_ECDSA;
|
||||
NSString *keyTypeString = [params valueForKey:@"name"];
|
||||
if (keyTypeString && [keyTypeString isEqualToString:@"RSASSA-PKCS1-v1_5"]) {
|
||||
keyType = rtc::KT_RSA;
|
||||
}
|
||||
|
||||
NSNumber *expires = [params valueForKey:@"expires"];
|
||||
rtc::scoped_refptr<rtc::RTCCertificate> cc_certificate = nullptr;
|
||||
if (expires != nil) {
|
||||
uint64_t expirationTimestamp = [expires unsignedLongLongValue];
|
||||
cc_certificate = rtc::RTCCertificateGenerator::GenerateCertificate(rtc::KeyParams(keyType),
|
||||
expirationTimestamp);
|
||||
} else {
|
||||
cc_certificate =
|
||||
rtc::RTCCertificateGenerator::GenerateCertificate(rtc::KeyParams(keyType), absl::nullopt);
|
||||
}
|
||||
if (!cc_certificate) {
|
||||
RTCLogError(@"Failed to generate certificate.");
|
||||
return nullptr;
|
||||
}
|
||||
// grab PEMs and create an NS RTCCerticicate
|
||||
rtc::RTCCertificatePEM pem = cc_certificate->ToPEM();
|
||||
std::string pem_private_key = pem.private_key();
|
||||
std::string pem_certificate = pem.certificate();
|
||||
RTC_LOG(LS_INFO) << "CERT PEM ";
|
||||
RTC_LOG(LS_INFO) << pem_certificate;
|
||||
|
||||
RTCCertificate *cert = [[RTCCertificate alloc] initWithPrivateKey:@(pem_private_key.c_str())
|
||||
certificate:@(pem_certificate.c_str())];
|
||||
return cert;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -8,21 +8,4 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCConfiguration.h"
|
||||
|
||||
#include "api/peerconnectioninterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCConfiguration ()
|
||||
|
||||
/** Optional TurnCustomizer.
|
||||
* With this class one can modify outgoing TURN messages.
|
||||
* The object passed in must remain valid until PeerConnection::Close() is
|
||||
* called.
|
||||
*/
|
||||
@property(nonatomic, nullable) webrtc::TurnCustomizer* turnCustomizer;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
#import "api/peerconnection/RTCConfiguration+Native.h"
|
||||
|
||||
@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCConfiguration.h"
|
||||
|
||||
#include "api/peerconnectioninterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCConfiguration ()
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::IceTransportsType)nativeTransportsTypeForTransportPolicy:
|
||||
(RTCIceTransportPolicy)policy;
|
||||
|
||||
+ (RTCIceTransportPolicy)transportPolicyForTransportsType:
|
||||
(webrtc::PeerConnectionInterface::IceTransportsType)nativeType;
|
||||
|
||||
+ (NSString *)stringForTransportPolicy:(RTCIceTransportPolicy)policy;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::BundlePolicy)nativeBundlePolicyForPolicy:
|
||||
(RTCBundlePolicy)policy;
|
||||
|
||||
+ (RTCBundlePolicy)bundlePolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::BundlePolicy)nativePolicy;
|
||||
|
||||
+ (NSString *)stringForBundlePolicy:(RTCBundlePolicy)policy;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativeRtcpMuxPolicyForPolicy:
|
||||
(RTCRtcpMuxPolicy)policy;
|
||||
|
||||
+ (RTCRtcpMuxPolicy)rtcpMuxPolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativePolicy;
|
||||
|
||||
+ (NSString *)stringForRtcpMuxPolicy:(RTCRtcpMuxPolicy)policy;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::TcpCandidatePolicy)nativeTcpCandidatePolicyForPolicy:
|
||||
(RTCTcpCandidatePolicy)policy;
|
||||
|
||||
+ (RTCTcpCandidatePolicy)tcpCandidatePolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::TcpCandidatePolicy)nativePolicy;
|
||||
|
||||
+ (NSString *)stringForTcpCandidatePolicy:(RTCTcpCandidatePolicy)policy;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::CandidateNetworkPolicy)nativeCandidateNetworkPolicyForPolicy:
|
||||
(RTCCandidateNetworkPolicy)policy;
|
||||
|
||||
+ (RTCCandidateNetworkPolicy)candidateNetworkPolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::CandidateNetworkPolicy)nativePolicy;
|
||||
|
||||
+ (NSString *)stringForCandidateNetworkPolicy:(RTCCandidateNetworkPolicy)policy;
|
||||
|
||||
+ (rtc::KeyType)nativeEncryptionKeyTypeForKeyType:(RTCEncryptionKeyType)keyType;
|
||||
|
||||
+ (webrtc::SdpSemantics)nativeSdpSemanticsForSdpSemantics:(RTCSdpSemantics)sdpSemantics;
|
||||
|
||||
+ (RTCSdpSemantics)sdpSemanticsForNativeSdpSemantics:(webrtc::SdpSemantics)sdpSemantics;
|
||||
|
||||
+ (NSString *)stringForSdpSemantics:(RTCSdpSemantics)sdpSemantics;
|
||||
|
||||
/**
|
||||
* RTCConfiguration struct representation of this RTCConfiguration. This is
|
||||
* needed to pass to the underlying C++ APIs.
|
||||
*/
|
||||
- (nullable webrtc::PeerConnectionInterface::RTCConfiguration *)createNativeConfiguration;
|
||||
|
||||
- (instancetype)initWithNativeConfiguration:
|
||||
(const webrtc::PeerConnectionInterface::RTCConfiguration &)config NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,460 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCConfiguration+Private.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#import "RTCConfiguration+Native.h"
|
||||
#import "RTCIceServer+Private.h"
|
||||
#import "RTCIntervalRange+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "rtc_base/rtccertificategenerator.h"
|
||||
#include "rtc_base/sslidentity.h"
|
||||
|
||||
@implementation RTCConfiguration
|
||||
|
||||
@synthesize iceServers = _iceServers;
|
||||
@synthesize certificate = _certificate;
|
||||
@synthesize iceTransportPolicy = _iceTransportPolicy;
|
||||
@synthesize bundlePolicy = _bundlePolicy;
|
||||
@synthesize rtcpMuxPolicy = _rtcpMuxPolicy;
|
||||
@synthesize tcpCandidatePolicy = _tcpCandidatePolicy;
|
||||
@synthesize candidateNetworkPolicy = _candidateNetworkPolicy;
|
||||
@synthesize continualGatheringPolicy = _continualGatheringPolicy;
|
||||
@synthesize maxIPv6Networks = _maxIPv6Networks;
|
||||
@synthesize disableLinkLocalNetworks = _disableLinkLocalNetworks;
|
||||
@synthesize audioJitterBufferMaxPackets = _audioJitterBufferMaxPackets;
|
||||
@synthesize audioJitterBufferFastAccelerate = _audioJitterBufferFastAccelerate;
|
||||
@synthesize iceConnectionReceivingTimeout = _iceConnectionReceivingTimeout;
|
||||
@synthesize iceBackupCandidatePairPingInterval =
|
||||
_iceBackupCandidatePairPingInterval;
|
||||
@synthesize keyType = _keyType;
|
||||
@synthesize iceCandidatePoolSize = _iceCandidatePoolSize;
|
||||
@synthesize shouldPruneTurnPorts = _shouldPruneTurnPorts;
|
||||
@synthesize shouldPresumeWritableWhenFullyRelayed =
|
||||
_shouldPresumeWritableWhenFullyRelayed;
|
||||
@synthesize iceCheckMinInterval = _iceCheckMinInterval;
|
||||
@synthesize iceRegatherIntervalRange = _iceRegatherIntervalRange;
|
||||
@synthesize sdpSemantics = _sdpSemantics;
|
||||
@synthesize turnCustomizer = _turnCustomizer;
|
||||
@synthesize activeResetSrtpParams = _activeResetSrtpParams;
|
||||
|
||||
- (instancetype)init {
|
||||
// Copy defaults.
|
||||
webrtc::PeerConnectionInterface::RTCConfiguration config(
|
||||
webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive);
|
||||
return [self initWithNativeConfiguration:config];
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeConfiguration:
|
||||
(const webrtc::PeerConnectionInterface::RTCConfiguration &)config {
|
||||
if (self = [super init]) {
|
||||
NSMutableArray *iceServers = [NSMutableArray array];
|
||||
for (const webrtc::PeerConnectionInterface::IceServer& server : config.servers) {
|
||||
RTCIceServer *iceServer = [[RTCIceServer alloc] initWithNativeServer:server];
|
||||
[iceServers addObject:iceServer];
|
||||
}
|
||||
_iceServers = iceServers;
|
||||
if (!config.certificates.empty()) {
|
||||
rtc::scoped_refptr<rtc::RTCCertificate> native_cert;
|
||||
native_cert = config.certificates[0];
|
||||
rtc::RTCCertificatePEM native_pem = native_cert->ToPEM();
|
||||
_certificate =
|
||||
[[RTCCertificate alloc] initWithPrivateKey:@(native_pem.private_key().c_str())
|
||||
certificate:@(native_pem.certificate().c_str())];
|
||||
}
|
||||
_iceTransportPolicy =
|
||||
[[self class] transportPolicyForTransportsType:config.type];
|
||||
_bundlePolicy =
|
||||
[[self class] bundlePolicyForNativePolicy:config.bundle_policy];
|
||||
_rtcpMuxPolicy =
|
||||
[[self class] rtcpMuxPolicyForNativePolicy:config.rtcp_mux_policy];
|
||||
_tcpCandidatePolicy = [[self class] tcpCandidatePolicyForNativePolicy:
|
||||
config.tcp_candidate_policy];
|
||||
_candidateNetworkPolicy = [[self class]
|
||||
candidateNetworkPolicyForNativePolicy:config.candidate_network_policy];
|
||||
webrtc::PeerConnectionInterface::ContinualGatheringPolicy nativePolicy =
|
||||
config.continual_gathering_policy;
|
||||
_continualGatheringPolicy =
|
||||
[[self class] continualGatheringPolicyForNativePolicy:nativePolicy];
|
||||
_maxIPv6Networks = config.max_ipv6_networks;
|
||||
_disableLinkLocalNetworks = config.disable_link_local_networks;
|
||||
_audioJitterBufferMaxPackets = config.audio_jitter_buffer_max_packets;
|
||||
_audioJitterBufferFastAccelerate = config.audio_jitter_buffer_fast_accelerate;
|
||||
_iceConnectionReceivingTimeout = config.ice_connection_receiving_timeout;
|
||||
_iceBackupCandidatePairPingInterval =
|
||||
config.ice_backup_candidate_pair_ping_interval;
|
||||
_keyType = RTCEncryptionKeyTypeECDSA;
|
||||
_iceCandidatePoolSize = config.ice_candidate_pool_size;
|
||||
_shouldPruneTurnPorts = config.prune_turn_ports;
|
||||
_shouldPresumeWritableWhenFullyRelayed =
|
||||
config.presume_writable_when_fully_relayed;
|
||||
if (config.ice_check_min_interval) {
|
||||
_iceCheckMinInterval =
|
||||
[NSNumber numberWithInt:*config.ice_check_min_interval];
|
||||
}
|
||||
if (config.ice_regather_interval_range) {
|
||||
const rtc::IntervalRange &nativeIntervalRange = config.ice_regather_interval_range.value();
|
||||
_iceRegatherIntervalRange =
|
||||
[[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeIntervalRange];
|
||||
}
|
||||
_sdpSemantics = [[self class] sdpSemanticsForNativeSdpSemantics:config.sdp_semantics];
|
||||
_turnCustomizer = config.turn_customizer;
|
||||
_activeResetSrtpParams = config.active_reset_srtp_params;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
static NSString *formatString =
|
||||
@"RTCConfiguration: "
|
||||
@"{\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%@\n%@\n%d\n%d\n%d\n}\n";
|
||||
|
||||
return [NSString
|
||||
stringWithFormat:formatString,
|
||||
_iceServers,
|
||||
[[self class] stringForTransportPolicy:_iceTransportPolicy],
|
||||
[[self class] stringForBundlePolicy:_bundlePolicy],
|
||||
[[self class] stringForRtcpMuxPolicy:_rtcpMuxPolicy],
|
||||
[[self class] stringForTcpCandidatePolicy:_tcpCandidatePolicy],
|
||||
[[self class] stringForCandidateNetworkPolicy:_candidateNetworkPolicy],
|
||||
[[self class] stringForContinualGatheringPolicy:_continualGatheringPolicy],
|
||||
[[self class] stringForSdpSemantics:_sdpSemantics],
|
||||
_audioJitterBufferMaxPackets,
|
||||
_audioJitterBufferFastAccelerate,
|
||||
_iceConnectionReceivingTimeout,
|
||||
_iceBackupCandidatePairPingInterval,
|
||||
_iceCandidatePoolSize,
|
||||
_shouldPruneTurnPorts,
|
||||
_shouldPresumeWritableWhenFullyRelayed,
|
||||
_iceCheckMinInterval,
|
||||
_iceRegatherIntervalRange,
|
||||
_disableLinkLocalNetworks,
|
||||
_maxIPv6Networks,
|
||||
_activeResetSrtpParams];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (webrtc::PeerConnectionInterface::RTCConfiguration *)
|
||||
createNativeConfiguration {
|
||||
std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration>
|
||||
nativeConfig(new webrtc::PeerConnectionInterface::RTCConfiguration(
|
||||
webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive));
|
||||
|
||||
for (RTCIceServer *iceServer in _iceServers) {
|
||||
nativeConfig->servers.push_back(iceServer.nativeServer);
|
||||
}
|
||||
nativeConfig->type =
|
||||
[[self class] nativeTransportsTypeForTransportPolicy:_iceTransportPolicy];
|
||||
nativeConfig->bundle_policy =
|
||||
[[self class] nativeBundlePolicyForPolicy:_bundlePolicy];
|
||||
nativeConfig->rtcp_mux_policy =
|
||||
[[self class] nativeRtcpMuxPolicyForPolicy:_rtcpMuxPolicy];
|
||||
nativeConfig->tcp_candidate_policy =
|
||||
[[self class] nativeTcpCandidatePolicyForPolicy:_tcpCandidatePolicy];
|
||||
nativeConfig->candidate_network_policy = [[self class]
|
||||
nativeCandidateNetworkPolicyForPolicy:_candidateNetworkPolicy];
|
||||
nativeConfig->continual_gathering_policy = [[self class]
|
||||
nativeContinualGatheringPolicyForPolicy:_continualGatheringPolicy];
|
||||
nativeConfig->max_ipv6_networks = _maxIPv6Networks;
|
||||
nativeConfig->disable_link_local_networks = _disableLinkLocalNetworks;
|
||||
nativeConfig->audio_jitter_buffer_max_packets = _audioJitterBufferMaxPackets;
|
||||
nativeConfig->audio_jitter_buffer_fast_accelerate =
|
||||
_audioJitterBufferFastAccelerate ? true : false;
|
||||
nativeConfig->ice_connection_receiving_timeout =
|
||||
_iceConnectionReceivingTimeout;
|
||||
nativeConfig->ice_backup_candidate_pair_ping_interval =
|
||||
_iceBackupCandidatePairPingInterval;
|
||||
rtc::KeyType keyType =
|
||||
[[self class] nativeEncryptionKeyTypeForKeyType:_keyType];
|
||||
if (_certificate != nullptr) {
|
||||
// if offered a pemcert use it...
|
||||
RTC_LOG(LS_INFO) << "Have configured cert - using it.";
|
||||
std::string pem_private_key = [[_certificate private_key] UTF8String];
|
||||
std::string pem_certificate = [[_certificate certificate] UTF8String];
|
||||
rtc::RTCCertificatePEM pem = rtc::RTCCertificatePEM(pem_private_key, pem_certificate);
|
||||
rtc::scoped_refptr<rtc::RTCCertificate> certificate = rtc::RTCCertificate::FromPEM(pem);
|
||||
RTC_LOG(LS_INFO) << "Created cert from PEM strings.";
|
||||
if (!certificate) {
|
||||
RTC_LOG(LS_ERROR) << "Failed to generate certificate from PEM.";
|
||||
return nullptr;
|
||||
}
|
||||
nativeConfig->certificates.push_back(certificate);
|
||||
} else {
|
||||
RTC_LOG(LS_INFO) << "Don't have configured cert.";
|
||||
// Generate non-default certificate.
|
||||
if (keyType != rtc::KT_DEFAULT) {
|
||||
rtc::scoped_refptr<rtc::RTCCertificate> certificate =
|
||||
rtc::RTCCertificateGenerator::GenerateCertificate(rtc::KeyParams(keyType),
|
||||
absl::optional<uint64_t>());
|
||||
if (!certificate) {
|
||||
RTCLogError(@"Failed to generate certificate.");
|
||||
return nullptr;
|
||||
}
|
||||
nativeConfig->certificates.push_back(certificate);
|
||||
}
|
||||
}
|
||||
nativeConfig->ice_candidate_pool_size = _iceCandidatePoolSize;
|
||||
nativeConfig->prune_turn_ports = _shouldPruneTurnPorts ? true : false;
|
||||
nativeConfig->presume_writable_when_fully_relayed =
|
||||
_shouldPresumeWritableWhenFullyRelayed ? true : false;
|
||||
if (_iceCheckMinInterval != nil) {
|
||||
nativeConfig->ice_check_min_interval = absl::optional<int>(_iceCheckMinInterval.intValue);
|
||||
}
|
||||
if (_iceRegatherIntervalRange != nil) {
|
||||
std::unique_ptr<rtc::IntervalRange> nativeIntervalRange(
|
||||
_iceRegatherIntervalRange.nativeIntervalRange);
|
||||
nativeConfig->ice_regather_interval_range =
|
||||
absl::optional<rtc::IntervalRange>(*nativeIntervalRange);
|
||||
}
|
||||
nativeConfig->sdp_semantics = [[self class] nativeSdpSemanticsForSdpSemantics:_sdpSemantics];
|
||||
if (_turnCustomizer) {
|
||||
nativeConfig->turn_customizer = _turnCustomizer;
|
||||
}
|
||||
nativeConfig->active_reset_srtp_params = _activeResetSrtpParams ? true : false;
|
||||
return nativeConfig.release();
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::IceTransportsType)
|
||||
nativeTransportsTypeForTransportPolicy:(RTCIceTransportPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCIceTransportPolicyNone:
|
||||
return webrtc::PeerConnectionInterface::kNone;
|
||||
case RTCIceTransportPolicyRelay:
|
||||
return webrtc::PeerConnectionInterface::kRelay;
|
||||
case RTCIceTransportPolicyNoHost:
|
||||
return webrtc::PeerConnectionInterface::kNoHost;
|
||||
case RTCIceTransportPolicyAll:
|
||||
return webrtc::PeerConnectionInterface::kAll;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCIceTransportPolicy)transportPolicyForTransportsType:
|
||||
(webrtc::PeerConnectionInterface::IceTransportsType)nativeType {
|
||||
switch (nativeType) {
|
||||
case webrtc::PeerConnectionInterface::kNone:
|
||||
return RTCIceTransportPolicyNone;
|
||||
case webrtc::PeerConnectionInterface::kRelay:
|
||||
return RTCIceTransportPolicyRelay;
|
||||
case webrtc::PeerConnectionInterface::kNoHost:
|
||||
return RTCIceTransportPolicyNoHost;
|
||||
case webrtc::PeerConnectionInterface::kAll:
|
||||
return RTCIceTransportPolicyAll;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForTransportPolicy:(RTCIceTransportPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCIceTransportPolicyNone:
|
||||
return @"NONE";
|
||||
case RTCIceTransportPolicyRelay:
|
||||
return @"RELAY";
|
||||
case RTCIceTransportPolicyNoHost:
|
||||
return @"NO_HOST";
|
||||
case RTCIceTransportPolicyAll:
|
||||
return @"ALL";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::BundlePolicy)nativeBundlePolicyForPolicy:
|
||||
(RTCBundlePolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCBundlePolicyBalanced:
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyBalanced;
|
||||
case RTCBundlePolicyMaxCompat:
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat;
|
||||
case RTCBundlePolicyMaxBundle:
|
||||
return webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCBundlePolicy)bundlePolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::BundlePolicy)nativePolicy {
|
||||
switch (nativePolicy) {
|
||||
case webrtc::PeerConnectionInterface::kBundlePolicyBalanced:
|
||||
return RTCBundlePolicyBalanced;
|
||||
case webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat:
|
||||
return RTCBundlePolicyMaxCompat;
|
||||
case webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle:
|
||||
return RTCBundlePolicyMaxBundle;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForBundlePolicy:(RTCBundlePolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCBundlePolicyBalanced:
|
||||
return @"BALANCED";
|
||||
case RTCBundlePolicyMaxCompat:
|
||||
return @"MAX_COMPAT";
|
||||
case RTCBundlePolicyMaxBundle:
|
||||
return @"MAX_BUNDLE";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativeRtcpMuxPolicyForPolicy:
|
||||
(RTCRtcpMuxPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCRtcpMuxPolicyNegotiate:
|
||||
return webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
|
||||
case RTCRtcpMuxPolicyRequire:
|
||||
return webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCRtcpMuxPolicy)rtcpMuxPolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativePolicy {
|
||||
switch (nativePolicy) {
|
||||
case webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate:
|
||||
return RTCRtcpMuxPolicyNegotiate;
|
||||
case webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire:
|
||||
return RTCRtcpMuxPolicyRequire;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForRtcpMuxPolicy:(RTCRtcpMuxPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCRtcpMuxPolicyNegotiate:
|
||||
return @"NEGOTIATE";
|
||||
case RTCRtcpMuxPolicyRequire:
|
||||
return @"REQUIRE";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::TcpCandidatePolicy)
|
||||
nativeTcpCandidatePolicyForPolicy:(RTCTcpCandidatePolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCTcpCandidatePolicyEnabled:
|
||||
return webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled;
|
||||
case RTCTcpCandidatePolicyDisabled:
|
||||
return webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled;
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::CandidateNetworkPolicy)
|
||||
nativeCandidateNetworkPolicyForPolicy:(RTCCandidateNetworkPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCCandidateNetworkPolicyAll:
|
||||
return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll;
|
||||
case RTCCandidateNetworkPolicyLowCost:
|
||||
return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCTcpCandidatePolicy)tcpCandidatePolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::TcpCandidatePolicy)nativePolicy {
|
||||
switch (nativePolicy) {
|
||||
case webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled:
|
||||
return RTCTcpCandidatePolicyEnabled;
|
||||
case webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled:
|
||||
return RTCTcpCandidatePolicyDisabled;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForTcpCandidatePolicy:(RTCTcpCandidatePolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCTcpCandidatePolicyEnabled:
|
||||
return @"TCP_ENABLED";
|
||||
case RTCTcpCandidatePolicyDisabled:
|
||||
return @"TCP_DISABLED";
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCCandidateNetworkPolicy)candidateNetworkPolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::CandidateNetworkPolicy)nativePolicy {
|
||||
switch (nativePolicy) {
|
||||
case webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll:
|
||||
return RTCCandidateNetworkPolicyAll;
|
||||
case webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost:
|
||||
return RTCCandidateNetworkPolicyLowCost;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForCandidateNetworkPolicy:
|
||||
(RTCCandidateNetworkPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCCandidateNetworkPolicyAll:
|
||||
return @"CANDIDATE_ALL_NETWORKS";
|
||||
case RTCCandidateNetworkPolicyLowCost:
|
||||
return @"CANDIDATE_LOW_COST_NETWORKS";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::ContinualGatheringPolicy)
|
||||
nativeContinualGatheringPolicyForPolicy:
|
||||
(RTCContinualGatheringPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCContinualGatheringPolicyGatherOnce:
|
||||
return webrtc::PeerConnectionInterface::GATHER_ONCE;
|
||||
case RTCContinualGatheringPolicyGatherContinually:
|
||||
return webrtc::PeerConnectionInterface::GATHER_CONTINUALLY;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCContinualGatheringPolicy)continualGatheringPolicyForNativePolicy:
|
||||
(webrtc::PeerConnectionInterface::ContinualGatheringPolicy)nativePolicy {
|
||||
switch (nativePolicy) {
|
||||
case webrtc::PeerConnectionInterface::GATHER_ONCE:
|
||||
return RTCContinualGatheringPolicyGatherOnce;
|
||||
case webrtc::PeerConnectionInterface::GATHER_CONTINUALLY:
|
||||
return RTCContinualGatheringPolicyGatherContinually;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForContinualGatheringPolicy:
|
||||
(RTCContinualGatheringPolicy)policy {
|
||||
switch (policy) {
|
||||
case RTCContinualGatheringPolicyGatherOnce:
|
||||
return @"GATHER_ONCE";
|
||||
case RTCContinualGatheringPolicyGatherContinually:
|
||||
return @"GATHER_CONTINUALLY";
|
||||
}
|
||||
}
|
||||
|
||||
+ (rtc::KeyType)nativeEncryptionKeyTypeForKeyType:
|
||||
(RTCEncryptionKeyType)keyType {
|
||||
switch (keyType) {
|
||||
case RTCEncryptionKeyTypeRSA:
|
||||
return rtc::KT_RSA;
|
||||
case RTCEncryptionKeyTypeECDSA:
|
||||
return rtc::KT_ECDSA;
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::SdpSemantics)nativeSdpSemanticsForSdpSemantics:(RTCSdpSemantics)sdpSemantics {
|
||||
switch (sdpSemantics) {
|
||||
case RTCSdpSemanticsPlanB:
|
||||
return webrtc::SdpSemantics::kPlanB;
|
||||
case RTCSdpSemanticsUnifiedPlan:
|
||||
return webrtc::SdpSemantics::kUnifiedPlan;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCSdpSemantics)sdpSemanticsForNativeSdpSemantics:(webrtc::SdpSemantics)sdpSemantics {
|
||||
switch (sdpSemantics) {
|
||||
case webrtc::SdpSemantics::kPlanB:
|
||||
return RTCSdpSemanticsPlanB;
|
||||
case webrtc::SdpSemantics::kUnifiedPlan:
|
||||
return RTCSdpSemanticsUnifiedPlan;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForSdpSemantics:(RTCSdpSemantics)sdpSemantics {
|
||||
switch (sdpSemantics) {
|
||||
case RTCSdpSemanticsPlanB:
|
||||
return @"PLAN_B";
|
||||
case RTCSdpSemanticsUnifiedPlan:
|
||||
return @"UNIFIED_PLAN";
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCDataChannel.h"
|
||||
|
||||
#include "api/datachannelinterface.h"
|
||||
#include "rtc_base/scoped_ref_ptr.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
|
||||
@interface RTCDataBuffer ()
|
||||
|
||||
/**
|
||||
* The native DataBuffer representation of this RTCDatabuffer object. This is
|
||||
* needed to pass to the underlying C++ APIs.
|
||||
*/
|
||||
@property(nonatomic, readonly) const webrtc::DataBuffer *nativeDataBuffer;
|
||||
|
||||
/** Initialize an RTCDataBuffer from a native DataBuffer. */
|
||||
- (instancetype)initWithNativeBuffer:(const webrtc::DataBuffer &)nativeBuffer;
|
||||
|
||||
@end
|
||||
|
||||
@interface RTCDataChannel ()
|
||||
|
||||
/** Initialize an RTCDataChannel from a native DataChannelInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeDataChannel:(rtc::scoped_refptr<webrtc::DataChannelInterface>)nativeDataChannel
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
+ (webrtc::DataChannelInterface::DataState)nativeDataChannelStateForState:
|
||||
(RTCDataChannelState)state;
|
||||
|
||||
+ (RTCDataChannelState)dataChannelStateForNativeState:
|
||||
(webrtc::DataChannelInterface::DataState)nativeState;
|
||||
|
||||
+ (NSString *)stringForState:(RTCDataChannelState)state;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,223 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCDataChannel+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class DataChannelDelegateAdapter : public DataChannelObserver {
|
||||
public:
|
||||
DataChannelDelegateAdapter(RTCDataChannel *channel) { channel_ = channel; }
|
||||
|
||||
void OnStateChange() override {
|
||||
[channel_.delegate dataChannelDidChangeState:channel_];
|
||||
}
|
||||
|
||||
void OnMessage(const DataBuffer& buffer) override {
|
||||
RTCDataBuffer *data_buffer =
|
||||
[[RTCDataBuffer alloc] initWithNativeBuffer:buffer];
|
||||
[channel_.delegate dataChannel:channel_
|
||||
didReceiveMessageWithBuffer:data_buffer];
|
||||
}
|
||||
|
||||
void OnBufferedAmountChange(uint64_t previousAmount) override {
|
||||
id<RTCDataChannelDelegate> delegate = channel_.delegate;
|
||||
SEL sel = @selector(dataChannel:didChangeBufferedAmount:);
|
||||
if ([delegate respondsToSelector:sel]) {
|
||||
[delegate dataChannel:channel_ didChangeBufferedAmount:previousAmount];
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
__weak RTCDataChannel *channel_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@implementation RTCDataBuffer {
|
||||
std::unique_ptr<webrtc::DataBuffer> _dataBuffer;
|
||||
}
|
||||
|
||||
- (instancetype)initWithData:(NSData *)data isBinary:(BOOL)isBinary {
|
||||
NSParameterAssert(data);
|
||||
if (self = [super init]) {
|
||||
rtc::CopyOnWriteBuffer buffer(
|
||||
reinterpret_cast<const uint8_t*>(data.bytes), data.length);
|
||||
_dataBuffer.reset(new webrtc::DataBuffer(buffer, isBinary));
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSData *)data {
|
||||
return [NSData dataWithBytes:_dataBuffer->data.data()
|
||||
length:_dataBuffer->data.size()];
|
||||
}
|
||||
|
||||
- (BOOL)isBinary {
|
||||
return _dataBuffer->binary;
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (instancetype)initWithNativeBuffer:(const webrtc::DataBuffer&)nativeBuffer {
|
||||
if (self = [super init]) {
|
||||
_dataBuffer.reset(new webrtc::DataBuffer(nativeBuffer));
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (const webrtc::DataBuffer *)nativeDataBuffer {
|
||||
return _dataBuffer.get();
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation RTCDataChannel {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> _nativeDataChannel;
|
||||
std::unique_ptr<webrtc::DataChannelDelegateAdapter> _observer;
|
||||
BOOL _isObserverRegistered;
|
||||
}
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
|
||||
- (void)dealloc {
|
||||
// Handles unregistering the observer properly. We need to do this because
|
||||
// there may still be other references to the underlying data channel.
|
||||
_nativeDataChannel->UnregisterObserver();
|
||||
}
|
||||
|
||||
- (NSString *)label {
|
||||
return [NSString stringForStdString:_nativeDataChannel->label()];
|
||||
}
|
||||
|
||||
- (BOOL)isReliable {
|
||||
return _nativeDataChannel->reliable();
|
||||
}
|
||||
|
||||
- (BOOL)isOrdered {
|
||||
return _nativeDataChannel->ordered();
|
||||
}
|
||||
|
||||
- (NSUInteger)maxRetransmitTime {
|
||||
return self.maxPacketLifeTime;
|
||||
}
|
||||
|
||||
- (uint16_t)maxPacketLifeTime {
|
||||
return _nativeDataChannel->maxRetransmitTime();
|
||||
}
|
||||
|
||||
- (uint16_t)maxRetransmits {
|
||||
return _nativeDataChannel->maxRetransmits();
|
||||
}
|
||||
|
||||
- (NSString *)protocol {
|
||||
return [NSString stringForStdString:_nativeDataChannel->protocol()];
|
||||
}
|
||||
|
||||
- (BOOL)isNegotiated {
|
||||
return _nativeDataChannel->negotiated();
|
||||
}
|
||||
|
||||
- (NSInteger)streamId {
|
||||
return self.channelId;
|
||||
}
|
||||
|
||||
- (int)channelId {
|
||||
return _nativeDataChannel->id();
|
||||
}
|
||||
|
||||
- (RTCDataChannelState)readyState {
|
||||
return [[self class] dataChannelStateForNativeState:
|
||||
_nativeDataChannel->state()];
|
||||
}
|
||||
|
||||
- (uint64_t)bufferedAmount {
|
||||
return _nativeDataChannel->buffered_amount();
|
||||
}
|
||||
|
||||
- (void)close {
|
||||
_nativeDataChannel->Close();
|
||||
}
|
||||
|
||||
- (BOOL)sendData:(RTCDataBuffer *)data {
|
||||
return _nativeDataChannel->Send(*data.nativeDataBuffer);
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCDataChannel:\n%ld\n%@\n%@",
|
||||
(long)self.channelId,
|
||||
self.label,
|
||||
[[self class]
|
||||
stringForState:self.readyState]];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeDataChannel:
|
||||
(rtc::scoped_refptr<webrtc::DataChannelInterface>)nativeDataChannel {
|
||||
NSParameterAssert(nativeDataChannel);
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
_nativeDataChannel = nativeDataChannel;
|
||||
_observer.reset(new webrtc::DataChannelDelegateAdapter(self));
|
||||
_nativeDataChannel->RegisterObserver(_observer.get());
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (webrtc::DataChannelInterface::DataState)
|
||||
nativeDataChannelStateForState:(RTCDataChannelState)state {
|
||||
switch (state) {
|
||||
case RTCDataChannelStateConnecting:
|
||||
return webrtc::DataChannelInterface::DataState::kConnecting;
|
||||
case RTCDataChannelStateOpen:
|
||||
return webrtc::DataChannelInterface::DataState::kOpen;
|
||||
case RTCDataChannelStateClosing:
|
||||
return webrtc::DataChannelInterface::DataState::kClosing;
|
||||
case RTCDataChannelStateClosed:
|
||||
return webrtc::DataChannelInterface::DataState::kClosed;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCDataChannelState)dataChannelStateForNativeState:
|
||||
(webrtc::DataChannelInterface::DataState)nativeState {
|
||||
switch (nativeState) {
|
||||
case webrtc::DataChannelInterface::DataState::kConnecting:
|
||||
return RTCDataChannelStateConnecting;
|
||||
case webrtc::DataChannelInterface::DataState::kOpen:
|
||||
return RTCDataChannelStateOpen;
|
||||
case webrtc::DataChannelInterface::DataState::kClosing:
|
||||
return RTCDataChannelStateClosing;
|
||||
case webrtc::DataChannelInterface::DataState::kClosed:
|
||||
return RTCDataChannelStateClosed;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForState:(RTCDataChannelState)state {
|
||||
switch (state) {
|
||||
case RTCDataChannelStateConnecting:
|
||||
return @"Connecting";
|
||||
case RTCDataChannelStateOpen:
|
||||
return @"Open";
|
||||
case RTCDataChannelStateClosing:
|
||||
return @"Closing";
|
||||
case RTCDataChannelStateClosed:
|
||||
return @"Closed";
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,23 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCDataChannelConfiguration.h"
|
||||
|
||||
#include "api/datachannelinterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCDataChannelConfiguration ()
|
||||
|
||||
@property(nonatomic, readonly) webrtc::DataChannelInit nativeDataChannelInit;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCDataChannelConfiguration+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
@implementation RTCDataChannelConfiguration
|
||||
|
||||
@synthesize nativeDataChannelInit = _nativeDataChannelInit;
|
||||
|
||||
- (BOOL)isOrdered {
|
||||
return _nativeDataChannelInit.ordered;
|
||||
}
|
||||
|
||||
- (void)setIsOrdered:(BOOL)isOrdered {
|
||||
_nativeDataChannelInit.ordered = isOrdered;
|
||||
}
|
||||
|
||||
- (NSInteger)maxRetransmitTimeMs {
|
||||
return self.maxPacketLifeTime;
|
||||
}
|
||||
|
||||
- (void)setMaxRetransmitTimeMs:(NSInteger)maxRetransmitTimeMs {
|
||||
self.maxPacketLifeTime = maxRetransmitTimeMs;
|
||||
}
|
||||
|
||||
- (int)maxPacketLifeTime {
|
||||
return _nativeDataChannelInit.maxRetransmitTime;
|
||||
}
|
||||
|
||||
- (void)setMaxPacketLifeTime:(int)maxPacketLifeTime {
|
||||
_nativeDataChannelInit.maxRetransmitTime = maxPacketLifeTime;
|
||||
}
|
||||
|
||||
- (int)maxRetransmits {
|
||||
return _nativeDataChannelInit.maxRetransmits;
|
||||
}
|
||||
|
||||
- (void)setMaxRetransmits:(int)maxRetransmits {
|
||||
_nativeDataChannelInit.maxRetransmits = maxRetransmits;
|
||||
}
|
||||
|
||||
- (NSString *)protocol {
|
||||
return [NSString stringForStdString:_nativeDataChannelInit.protocol];
|
||||
}
|
||||
|
||||
- (void)setProtocol:(NSString *)protocol {
|
||||
_nativeDataChannelInit.protocol = [NSString stdStringForString:protocol];
|
||||
}
|
||||
|
||||
- (BOOL)isNegotiated {
|
||||
return _nativeDataChannelInit.negotiated;
|
||||
}
|
||||
|
||||
- (void)setIsNegotiated:(BOOL)isNegotiated {
|
||||
_nativeDataChannelInit.negotiated = isNegotiated;
|
||||
}
|
||||
|
||||
- (int)streamId {
|
||||
return self.channelId;
|
||||
}
|
||||
|
||||
- (void)setStreamId:(int)streamId {
|
||||
self.channelId = streamId;
|
||||
}
|
||||
|
||||
- (int)channelId {
|
||||
return _nativeDataChannelInit.id;
|
||||
}
|
||||
|
||||
- (void)setChannelId:(int)channelId {
|
||||
_nativeDataChannelInit.id = channelId;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC Project Authors. All rights reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodecFactory.h"
|
||||
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
#import "WebRTC/RTCVideoDecoderVP8.h"
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
#import "WebRTC/RTCVideoDecoderVP9.h"
|
||||
#endif
|
||||
|
||||
@implementation RTCDefaultVideoDecoderFactory
|
||||
|
||||
- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info {
|
||||
if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
|
||||
return [[RTCVideoDecoderH264 alloc] init];
|
||||
} else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
|
||||
return [RTCVideoDecoderVP8 vp8Decoder];
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
} else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) {
|
||||
return [RTCVideoDecoderVP9 vp9Decoder];
|
||||
#endif
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
|
||||
return @[
|
||||
[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name],
|
||||
[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name],
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name],
|
||||
#endif
|
||||
];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC Project Authors. All rights reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodecFactory.h"
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
#import "WebRTC/RTCVideoEncoderVP8.h"
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
#import "WebRTC/RTCVideoEncoderVP9.h"
|
||||
#endif
|
||||
|
||||
@implementation RTCDefaultVideoEncoderFactory
|
||||
|
||||
@synthesize preferredCodec;
|
||||
|
||||
+ (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
|
||||
NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
|
||||
@"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedHigh,
|
||||
@"level-asymmetry-allowed" : @"1",
|
||||
@"packetization-mode" : @"1",
|
||||
};
|
||||
RTCVideoCodecInfo *constrainedHighInfo =
|
||||
[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name
|
||||
parameters:constrainedHighParams];
|
||||
|
||||
NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
|
||||
@"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedBaseline,
|
||||
@"level-asymmetry-allowed" : @"1",
|
||||
@"packetization-mode" : @"1",
|
||||
};
|
||||
RTCVideoCodecInfo *constrainedBaselineInfo =
|
||||
[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecH264Name
|
||||
parameters:constrainedBaselineParams];
|
||||
|
||||
RTCVideoCodecInfo *vp8Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp8Name];
|
||||
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
RTCVideoCodecInfo *vp9Info = [[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecVp9Name];
|
||||
#endif
|
||||
|
||||
return @[
|
||||
constrainedHighInfo,
|
||||
constrainedBaselineInfo,
|
||||
vp8Info,
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
vp9Info,
|
||||
#endif
|
||||
];
|
||||
}
|
||||
|
||||
- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
|
||||
if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
|
||||
return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
|
||||
} else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
|
||||
return [RTCVideoEncoderVP8 vp8Encoder];
|
||||
#if !defined(RTC_DISABLE_VP9)
|
||||
} else if ([info.name isEqualToString:kRTCVideoCodecVp9Name]) {
|
||||
return [RTCVideoEncoderVP9 vp9Encoder];
|
||||
#endif
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
|
||||
NSMutableArray<RTCVideoCodecInfo *> *codecs = [[[self class] supportedCodecs] mutableCopy];
|
||||
|
||||
NSMutableArray<RTCVideoCodecInfo *> *orderedCodecs = [NSMutableArray array];
|
||||
NSUInteger index = [codecs indexOfObject:self.preferredCodec];
|
||||
if (index != NSNotFound) {
|
||||
[orderedCodecs addObject:[codecs objectAtIndex:index]];
|
||||
[codecs removeObjectAtIndex:index];
|
||||
}
|
||||
[orderedCodecs addObjectsFromArray:codecs];
|
||||
|
||||
return [orderedCodecs copy];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCDtmfSender.h"
|
||||
|
||||
#include "api/dtmfsenderinterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCDtmfSender : NSObject <RTCDtmfSender>
|
||||
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::DtmfSenderInterface> nativeDtmfSender;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
/** Initialize an RTCDtmfSender with a native DtmfSenderInterface. */
|
||||
- (instancetype)initWithNativeDtmfSender:
|
||||
(rtc::scoped_refptr<webrtc::DtmfSenderInterface>)nativeDtmfSender NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,74 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCDtmfSender+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "rtc_base/timeutils.h"
|
||||
|
||||
@implementation RTCDtmfSender {
|
||||
rtc::scoped_refptr<webrtc::DtmfSenderInterface> _nativeDtmfSender;
|
||||
}
|
||||
|
||||
- (BOOL)canInsertDtmf {
|
||||
return _nativeDtmfSender->CanInsertDtmf();
|
||||
}
|
||||
|
||||
- (BOOL)insertDtmf:(nonnull NSString *)tones
|
||||
duration:(NSTimeInterval)duration
|
||||
interToneGap:(NSTimeInterval)interToneGap {
|
||||
RTC_DCHECK(tones != nil);
|
||||
|
||||
int durationMs = static_cast<int>(duration * rtc::kNumMillisecsPerSec);
|
||||
int interToneGapMs = static_cast<int>(interToneGap * rtc::kNumMillisecsPerSec);
|
||||
return _nativeDtmfSender->InsertDtmf(
|
||||
[NSString stdStringForString:tones], durationMs, interToneGapMs);
|
||||
}
|
||||
|
||||
- (nonnull NSString *)remainingTones {
|
||||
return [NSString stringForStdString:_nativeDtmfSender->tones()];
|
||||
}
|
||||
|
||||
- (NSTimeInterval)duration {
|
||||
return static_cast<NSTimeInterval>(_nativeDtmfSender->duration()) / rtc::kNumMillisecsPerSec;
|
||||
}
|
||||
|
||||
- (NSTimeInterval)interToneGap {
|
||||
return static_cast<NSTimeInterval>(_nativeDtmfSender->inter_tone_gap()) /
|
||||
rtc::kNumMillisecsPerSec;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString
|
||||
stringWithFormat:
|
||||
@"RTCDtmfSender {\n remainingTones: %@\n duration: %f sec\n interToneGap: %f sec\n}",
|
||||
[self remainingTones],
|
||||
[self duration],
|
||||
[self interToneGap]];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::DtmfSenderInterface>)nativeDtmfSender {
|
||||
return _nativeDtmfSender;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeDtmfSender:
|
||||
(rtc::scoped_refptr<webrtc::DtmfSenderInterface>)nativeDtmfSender {
|
||||
NSParameterAssert(nativeDtmfSender);
|
||||
if (self = [super init]) {
|
||||
_nativeDtmfSender = nativeDtmfSender;
|
||||
RTCLogInfo(@"RTCDtmfSender(%p): created DTMF sender: %@", self, self.description);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@end
|
||||
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
|
||||
#import "RTCVideoCodec+Private.h"
|
||||
|
||||
#include "rtc_base/numerics/safe_conversions.h"
|
||||
|
||||
@implementation RTCEncodedImage
|
||||
|
||||
@synthesize buffer = _buffer;
|
||||
@synthesize encodedWidth = _encodedWidth;
|
||||
@synthesize encodedHeight = _encodedHeight;
|
||||
@synthesize timeStamp = _timeStamp;
|
||||
@synthesize captureTimeMs = _captureTimeMs;
|
||||
@synthesize ntpTimeMs = _ntpTimeMs;
|
||||
@synthesize flags = _flags;
|
||||
@synthesize encodeStartMs = _encodeStartMs;
|
||||
@synthesize encodeFinishMs = _encodeFinishMs;
|
||||
@synthesize frameType = _frameType;
|
||||
@synthesize rotation = _rotation;
|
||||
@synthesize completeFrame = _completeFrame;
|
||||
@synthesize qp = _qp;
|
||||
@synthesize contentType = _contentType;
|
||||
|
||||
- (instancetype)initWithNativeEncodedImage:(webrtc::EncodedImage)encodedImage {
|
||||
if (self = [super init]) {
|
||||
// Wrap the buffer in NSData without copying, do not take ownership.
|
||||
_buffer = [NSData dataWithBytesNoCopy:encodedImage._buffer
|
||||
length:encodedImage._length
|
||||
freeWhenDone:NO];
|
||||
_encodedWidth = rtc::dchecked_cast<int32_t>(encodedImage._encodedWidth);
|
||||
_encodedHeight = rtc::dchecked_cast<int32_t>(encodedImage._encodedHeight);
|
||||
_timeStamp = encodedImage.Timestamp();
|
||||
_captureTimeMs = encodedImage.capture_time_ms_;
|
||||
_ntpTimeMs = encodedImage.ntp_time_ms_;
|
||||
_flags = encodedImage.timing_.flags;
|
||||
_encodeStartMs = encodedImage.timing_.encode_start_ms;
|
||||
_encodeFinishMs = encodedImage.timing_.encode_finish_ms;
|
||||
_frameType = static_cast<RTCFrameType>(encodedImage._frameType);
|
||||
_rotation = static_cast<RTCVideoRotation>(encodedImage.rotation_);
|
||||
_completeFrame = encodedImage._completeFrame;
|
||||
_qp = @(encodedImage.qp_);
|
||||
_contentType = (encodedImage.content_type_ == webrtc::VideoContentType::SCREENSHARE) ?
|
||||
RTCVideoContentTypeScreenshare :
|
||||
RTCVideoContentTypeUnspecified;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::EncodedImage)nativeEncodedImage {
|
||||
// Return the pointer without copying.
|
||||
webrtc::EncodedImage encodedImage(
|
||||
(uint8_t *)_buffer.bytes, (size_t)_buffer.length, (size_t)_buffer.length);
|
||||
encodedImage._encodedWidth = rtc::dchecked_cast<uint32_t>(_encodedWidth);
|
||||
encodedImage._encodedHeight = rtc::dchecked_cast<uint32_t>(_encodedHeight);
|
||||
encodedImage.SetTimestamp(_timeStamp);
|
||||
encodedImage.capture_time_ms_ = _captureTimeMs;
|
||||
encodedImage.ntp_time_ms_ = _ntpTimeMs;
|
||||
encodedImage.timing_.flags = _flags;
|
||||
encodedImage.timing_.encode_start_ms = _encodeStartMs;
|
||||
encodedImage.timing_.encode_finish_ms = _encodeFinishMs;
|
||||
encodedImage._frameType = webrtc::FrameType(_frameType);
|
||||
encodedImage.rotation_ = webrtc::VideoRotation(_rotation);
|
||||
encodedImage._completeFrame = _completeFrame;
|
||||
encodedImage.qp_ = _qp ? _qp.intValue : -1;
|
||||
encodedImage.content_type_ = (_contentType == RTCVideoContentTypeScreenshare) ?
|
||||
webrtc::VideoContentType::SCREENSHARE :
|
||||
webrtc::VideoContentType::UNSPECIFIED;
|
||||
|
||||
return encodedImage;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,202 +0,0 @@
|
||||
/**
|
||||
* Copyright 2017 The WebRTC Project Authors. All rights reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCFileVideoCapturer.h"
|
||||
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
#import "WebRTC/RTCVideoFrameBuffer.h"
|
||||
|
||||
NSString *const kRTCFileVideoCapturerErrorDomain = @"org.webrtc.RTCFileVideoCapturer";
|
||||
|
||||
typedef NS_ENUM(NSInteger, RTCFileVideoCapturerErrorCode) {
|
||||
RTCFileVideoCapturerErrorCode_CapturerRunning = 2000,
|
||||
RTCFileVideoCapturerErrorCode_FileNotFound
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSInteger, RTCFileVideoCapturerStatus) {
|
||||
RTCFileVideoCapturerStatusNotInitialized,
|
||||
RTCFileVideoCapturerStatusStarted,
|
||||
RTCFileVideoCapturerStatusStopped
|
||||
};
|
||||
|
||||
@implementation RTCFileVideoCapturer {
|
||||
AVAssetReader *_reader;
|
||||
AVAssetReaderTrackOutput *_outTrack;
|
||||
RTCFileVideoCapturerStatus _status;
|
||||
CMTime _lastPresentationTime;
|
||||
dispatch_queue_t _frameQueue;
|
||||
NSURL *_fileURL;
|
||||
}
|
||||
|
||||
- (void)startCapturingFromFileNamed:(NSString *)nameOfFile
|
||||
onError:(RTCFileVideoCapturerErrorBlock)errorBlock {
|
||||
if (_status == RTCFileVideoCapturerStatusStarted) {
|
||||
NSError *error =
|
||||
[NSError errorWithDomain:kRTCFileVideoCapturerErrorDomain
|
||||
code:RTCFileVideoCapturerErrorCode_CapturerRunning
|
||||
userInfo:@{NSUnderlyingErrorKey : @"Capturer has been started."}];
|
||||
|
||||
errorBlock(error);
|
||||
return;
|
||||
} else {
|
||||
_status = RTCFileVideoCapturerStatusStarted;
|
||||
}
|
||||
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
NSString *pathForFile = [self pathForFileName:nameOfFile];
|
||||
if (!pathForFile) {
|
||||
NSString *errorString =
|
||||
[NSString stringWithFormat:@"File %@ not found in bundle", nameOfFile];
|
||||
NSError *error = [NSError errorWithDomain:kRTCFileVideoCapturerErrorDomain
|
||||
code:RTCFileVideoCapturerErrorCode_FileNotFound
|
||||
userInfo:@{NSUnderlyingErrorKey : errorString}];
|
||||
errorBlock(error);
|
||||
return;
|
||||
}
|
||||
|
||||
_lastPresentationTime = CMTimeMake(0, 0);
|
||||
|
||||
_fileURL = [NSURL fileURLWithPath:pathForFile];
|
||||
[self setupReaderOnError:errorBlock];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)setupReaderOnError:(RTCFileVideoCapturerErrorBlock)errorBlock {
|
||||
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:_fileURL options:nil];
|
||||
|
||||
NSArray *allTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
|
||||
NSError *error = nil;
|
||||
|
||||
_reader = [[AVAssetReader alloc] initWithAsset:asset error:&error];
|
||||
if (error) {
|
||||
errorBlock(error);
|
||||
return;
|
||||
}
|
||||
|
||||
NSDictionary *options = @{
|
||||
(NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
|
||||
};
|
||||
_outTrack =
|
||||
[[AVAssetReaderTrackOutput alloc] initWithTrack:allTracks.firstObject outputSettings:options];
|
||||
[_reader addOutput:_outTrack];
|
||||
|
||||
[_reader startReading];
|
||||
RTCLog(@"File capturer started reading");
|
||||
[self readNextBuffer];
|
||||
}
|
||||
- (void)stopCapture {
|
||||
_status = RTCFileVideoCapturerStatusStopped;
|
||||
RTCLog(@"File capturer stopped.");
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (nullable NSString *)pathForFileName:(NSString *)fileName {
|
||||
NSArray *nameComponents = [fileName componentsSeparatedByString:@"."];
|
||||
if (nameComponents.count != 2) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSString *path =
|
||||
[[NSBundle mainBundle] pathForResource:nameComponents[0] ofType:nameComponents[1]];
|
||||
return path;
|
||||
}
|
||||
|
||||
- (dispatch_queue_t)frameQueue {
|
||||
if (!_frameQueue) {
|
||||
_frameQueue = dispatch_queue_create("org.webrtc.filecapturer.video", DISPATCH_QUEUE_SERIAL);
|
||||
dispatch_set_target_queue(_frameQueue,
|
||||
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0));
|
||||
}
|
||||
return _frameQueue;
|
||||
}
|
||||
|
||||
- (void)readNextBuffer {
|
||||
if (_status == RTCFileVideoCapturerStatusStopped) {
|
||||
[_reader cancelReading];
|
||||
_reader = nil;
|
||||
return;
|
||||
}
|
||||
|
||||
if (_reader.status == AVAssetReaderStatusCompleted) {
|
||||
[_reader cancelReading];
|
||||
_reader = nil;
|
||||
[self setupReaderOnError:nil];
|
||||
return;
|
||||
}
|
||||
|
||||
CMSampleBufferRef sampleBuffer = [_outTrack copyNextSampleBuffer];
|
||||
if (!sampleBuffer) {
|
||||
[self readNextBuffer];
|
||||
return;
|
||||
}
|
||||
if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) ||
|
||||
!CMSampleBufferDataIsReady(sampleBuffer)) {
|
||||
CFRelease(sampleBuffer);
|
||||
[self readNextBuffer];
|
||||
return;
|
||||
}
|
||||
|
||||
[self publishSampleBuffer:sampleBuffer];
|
||||
}
|
||||
|
||||
- (void)publishSampleBuffer:(CMSampleBufferRef)sampleBuffer {
|
||||
CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
|
||||
Float64 presentationDifference =
|
||||
CMTimeGetSeconds(CMTimeSubtract(presentationTime, _lastPresentationTime));
|
||||
_lastPresentationTime = presentationTime;
|
||||
int64_t presentationDifferenceRound = lroundf(presentationDifference * NSEC_PER_SEC);
|
||||
|
||||
__block dispatch_source_t timer = [self createStrictTimer];
|
||||
// Strict timer that will fire |presentationDifferenceRound| ns from now and never again.
|
||||
dispatch_source_set_timer(timer,
|
||||
dispatch_time(DISPATCH_TIME_NOW, presentationDifferenceRound),
|
||||
DISPATCH_TIME_FOREVER,
|
||||
0);
|
||||
dispatch_source_set_event_handler(timer, ^{
|
||||
dispatch_source_cancel(timer);
|
||||
timer = nil;
|
||||
|
||||
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
|
||||
if (!pixelBuffer) {
|
||||
CFRelease(sampleBuffer);
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
[self readNextBuffer];
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
|
||||
NSTimeInterval timeStampSeconds = CACurrentMediaTime();
|
||||
int64_t timeStampNs = lroundf(timeStampSeconds * NSEC_PER_SEC);
|
||||
RTCVideoFrame *videoFrame =
|
||||
[[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer rotation:0 timeStampNs:timeStampNs];
|
||||
CFRelease(sampleBuffer);
|
||||
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
[self readNextBuffer];
|
||||
});
|
||||
|
||||
[self.delegate capturer:self didCaptureVideoFrame:videoFrame];
|
||||
});
|
||||
dispatch_activate(timer);
|
||||
}
|
||||
|
||||
- (dispatch_source_t)createStrictTimer {
|
||||
dispatch_source_t timer = dispatch_source_create(
|
||||
DISPATCH_SOURCE_TYPE_TIMER, 0, DISPATCH_TIMER_STRICT, [self frameQueue]);
|
||||
return timer;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[self stopCapture];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
|
||||
#include "media/base/h264_profile_level_id.h"
|
||||
|
||||
@interface RTCH264ProfileLevelId ()
|
||||
|
||||
@property(nonatomic, assign) RTCH264Profile profile;
|
||||
@property(nonatomic, assign) RTCH264Level level;
|
||||
@property(nonatomic, strong) NSString *hexString;
|
||||
|
||||
@end
|
||||
|
||||
@implementation RTCH264ProfileLevelId
|
||||
|
||||
@synthesize profile = _profile;
|
||||
@synthesize level = _level;
|
||||
@synthesize hexString = _hexString;
|
||||
|
||||
- (instancetype)initWithHexString:(NSString *)hexString {
|
||||
if (self = [super init]) {
|
||||
self.hexString = hexString;
|
||||
|
||||
absl::optional<webrtc::H264::ProfileLevelId> profile_level_id =
|
||||
webrtc::H264::ParseProfileLevelId([hexString cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
if (profile_level_id.has_value()) {
|
||||
self.profile = static_cast<RTCH264Profile>(profile_level_id->profile);
|
||||
self.level = static_cast<RTCH264Level>(profile_level_id->level);
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithProfile:(RTCH264Profile)profile level:(RTCH264Level)level {
|
||||
if (self = [super init]) {
|
||||
self.profile = profile;
|
||||
self.level = level;
|
||||
|
||||
absl::optional<std::string> hex_string =
|
||||
webrtc::H264::ProfileLevelIdToString(webrtc::H264::ProfileLevelId(
|
||||
static_cast<webrtc::H264::Profile>(profile), static_cast<webrtc::H264::Level>(level)));
|
||||
self.hexString =
|
||||
[NSString stringWithCString:hex_string.value_or("").c_str() encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCIceCandidate.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "api/jsep.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCIceCandidate ()
|
||||
|
||||
/**
|
||||
* The native IceCandidateInterface representation of this RTCIceCandidate
|
||||
* object. This is needed to pass to the underlying C++ APIs.
|
||||
*/
|
||||
@property(nonatomic, readonly) std::unique_ptr<webrtc::IceCandidateInterface> nativeCandidate;
|
||||
|
||||
/**
|
||||
* Initialize an RTCIceCandidate from a native IceCandidateInterface. No
|
||||
* ownership is taken of the native candidate.
|
||||
*/
|
||||
- (instancetype)initWithNativeCandidate:(const webrtc::IceCandidateInterface *)candidate;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCIceCandidate+Private.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
@implementation RTCIceCandidate
|
||||
|
||||
@synthesize sdpMid = _sdpMid;
|
||||
@synthesize sdpMLineIndex = _sdpMLineIndex;
|
||||
@synthesize sdp = _sdp;
|
||||
@synthesize serverUrl = _serverUrl;
|
||||
|
||||
- (instancetype)initWithSdp:(NSString *)sdp
|
||||
sdpMLineIndex:(int)sdpMLineIndex
|
||||
sdpMid:(NSString *)sdpMid {
|
||||
NSParameterAssert(sdp.length);
|
||||
if (self = [super init]) {
|
||||
_sdpMid = [sdpMid copy];
|
||||
_sdpMLineIndex = sdpMLineIndex;
|
||||
_sdp = [sdp copy];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCIceCandidate:\n%@\n%d\n%@\n%@",
|
||||
_sdpMid,
|
||||
_sdpMLineIndex,
|
||||
_sdp,
|
||||
_serverUrl];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (instancetype)initWithNativeCandidate:
|
||||
(const webrtc::IceCandidateInterface *)candidate {
|
||||
NSParameterAssert(candidate);
|
||||
std::string sdp;
|
||||
candidate->ToString(&sdp);
|
||||
|
||||
RTCIceCandidate *rtcCandidate =
|
||||
[self initWithSdp:[NSString stringForStdString:sdp]
|
||||
sdpMLineIndex:candidate->sdp_mline_index()
|
||||
sdpMid:[NSString stringForStdString:candidate->sdp_mid()]];
|
||||
rtcCandidate->_serverUrl = [NSString stringForStdString:candidate->server_url()];
|
||||
return rtcCandidate;
|
||||
}
|
||||
|
||||
- (std::unique_ptr<webrtc::IceCandidateInterface>)nativeCandidate {
|
||||
webrtc::SdpParseError error;
|
||||
|
||||
webrtc::IceCandidateInterface *candidate = webrtc::CreateIceCandidate(
|
||||
_sdpMid.stdString, _sdpMLineIndex, _sdp.stdString, &error);
|
||||
|
||||
if (!candidate) {
|
||||
RTCLog(@"Failed to create ICE candidate: %s\nline: %s",
|
||||
error.description.c_str(),
|
||||
error.line.c_str());
|
||||
}
|
||||
|
||||
return std::unique_ptr<webrtc::IceCandidateInterface>(candidate);
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCIceServer.h"
|
||||
|
||||
#include "api/peerconnectioninterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCIceServer ()
|
||||
|
||||
/**
|
||||
* IceServer struct representation of this RTCIceServer object's data.
|
||||
* This is needed to pass to the underlying C++ APIs.
|
||||
*/
|
||||
@property(nonatomic, readonly) webrtc::PeerConnectionInterface::IceServer nativeServer;
|
||||
|
||||
/** Initialize an RTCIceServer from a native IceServer. */
|
||||
- (instancetype)initWithNativeServer:(webrtc::PeerConnectionInterface::IceServer)nativeServer;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,196 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCIceServer+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
@implementation RTCIceServer
|
||||
|
||||
@synthesize urlStrings = _urlStrings;
|
||||
@synthesize username = _username;
|
||||
@synthesize credential = _credential;
|
||||
@synthesize tlsCertPolicy = _tlsCertPolicy;
|
||||
@synthesize hostname = _hostname;
|
||||
@synthesize tlsAlpnProtocols = _tlsAlpnProtocols;
|
||||
@synthesize tlsEllipticCurves = _tlsEllipticCurves;
|
||||
|
||||
- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings {
|
||||
return [self initWithURLStrings:urlStrings
|
||||
username:nil
|
||||
credential:nil];
|
||||
}
|
||||
|
||||
- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
|
||||
username:(NSString *)username
|
||||
credential:(NSString *)credential {
|
||||
return [self initWithURLStrings:urlStrings
|
||||
username:username
|
||||
credential:credential
|
||||
tlsCertPolicy:RTCTlsCertPolicySecure];
|
||||
}
|
||||
|
||||
- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
|
||||
username:(NSString *)username
|
||||
credential:(NSString *)credential
|
||||
tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy {
|
||||
return [self initWithURLStrings:urlStrings
|
||||
username:username
|
||||
credential:credential
|
||||
tlsCertPolicy:tlsCertPolicy
|
||||
hostname:nil];
|
||||
}
|
||||
|
||||
- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
|
||||
username:(NSString *)username
|
||||
credential:(NSString *)credential
|
||||
tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
|
||||
hostname:(NSString *)hostname {
|
||||
return [self initWithURLStrings:urlStrings
|
||||
username:username
|
||||
credential:credential
|
||||
tlsCertPolicy:tlsCertPolicy
|
||||
hostname:hostname
|
||||
tlsAlpnProtocols:[NSArray array]];
|
||||
}
|
||||
|
||||
- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
|
||||
username:(NSString *)username
|
||||
credential:(NSString *)credential
|
||||
tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
|
||||
hostname:(NSString *)hostname
|
||||
tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols {
|
||||
return [self initWithURLStrings:urlStrings
|
||||
username:username
|
||||
credential:credential
|
||||
tlsCertPolicy:tlsCertPolicy
|
||||
hostname:hostname
|
||||
tlsAlpnProtocols:tlsAlpnProtocols
|
||||
tlsEllipticCurves:[NSArray array]];
|
||||
}
|
||||
|
||||
- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
|
||||
username:(NSString *)username
|
||||
credential:(NSString *)credential
|
||||
tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
|
||||
hostname:(NSString *)hostname
|
||||
tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols
|
||||
tlsEllipticCurves:(NSArray<NSString *> *)tlsEllipticCurves {
|
||||
NSParameterAssert(urlStrings.count);
|
||||
if (self = [super init]) {
|
||||
_urlStrings = [[NSArray alloc] initWithArray:urlStrings copyItems:YES];
|
||||
_username = [username copy];
|
||||
_credential = [credential copy];
|
||||
_tlsCertPolicy = tlsCertPolicy;
|
||||
_hostname = [hostname copy];
|
||||
_tlsAlpnProtocols = [[NSArray alloc] initWithArray:tlsAlpnProtocols copyItems:YES];
|
||||
_tlsEllipticCurves = [[NSArray alloc] initWithArray:tlsEllipticCurves copyItems:YES];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCIceServer:\n%@\n%@\n%@\n%@\n%@\n%@\n%@",
|
||||
_urlStrings,
|
||||
_username,
|
||||
_credential,
|
||||
[self stringForTlsCertPolicy:_tlsCertPolicy],
|
||||
_hostname,
|
||||
_tlsAlpnProtocols,
|
||||
_tlsEllipticCurves];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (NSString *)stringForTlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy {
|
||||
switch (tlsCertPolicy) {
|
||||
case RTCTlsCertPolicySecure:
|
||||
return @"RTCTlsCertPolicySecure";
|
||||
case RTCTlsCertPolicyInsecureNoCheck:
|
||||
return @"RTCTlsCertPolicyInsecureNoCheck";
|
||||
}
|
||||
}
|
||||
|
||||
- (webrtc::PeerConnectionInterface::IceServer)nativeServer {
|
||||
__block webrtc::PeerConnectionInterface::IceServer iceServer;
|
||||
|
||||
iceServer.username = [NSString stdStringForString:_username];
|
||||
iceServer.password = [NSString stdStringForString:_credential];
|
||||
iceServer.hostname = [NSString stdStringForString:_hostname];
|
||||
|
||||
[_tlsAlpnProtocols enumerateObjectsUsingBlock:^(NSString *proto, NSUInteger idx, BOOL *stop) {
|
||||
iceServer.tls_alpn_protocols.push_back(proto.stdString);
|
||||
}];
|
||||
|
||||
[_tlsEllipticCurves enumerateObjectsUsingBlock:^(NSString *curve, NSUInteger idx, BOOL *stop) {
|
||||
iceServer.tls_elliptic_curves.push_back(curve.stdString);
|
||||
}];
|
||||
|
||||
[_urlStrings enumerateObjectsUsingBlock:^(NSString *url,
|
||||
NSUInteger idx,
|
||||
BOOL *stop) {
|
||||
iceServer.urls.push_back(url.stdString);
|
||||
}];
|
||||
|
||||
switch (_tlsCertPolicy) {
|
||||
case RTCTlsCertPolicySecure:
|
||||
iceServer.tls_cert_policy =
|
||||
webrtc::PeerConnectionInterface::kTlsCertPolicySecure;
|
||||
break;
|
||||
case RTCTlsCertPolicyInsecureNoCheck:
|
||||
iceServer.tls_cert_policy =
|
||||
webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck;
|
||||
break;
|
||||
}
|
||||
return iceServer;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeServer:
|
||||
(webrtc::PeerConnectionInterface::IceServer)nativeServer {
|
||||
NSMutableArray *urls =
|
||||
[NSMutableArray arrayWithCapacity:nativeServer.urls.size()];
|
||||
for (auto const &url : nativeServer.urls) {
|
||||
[urls addObject:[NSString stringForStdString:url]];
|
||||
}
|
||||
NSString *username = [NSString stringForStdString:nativeServer.username];
|
||||
NSString *credential = [NSString stringForStdString:nativeServer.password];
|
||||
NSString *hostname = [NSString stringForStdString:nativeServer.hostname];
|
||||
NSMutableArray *tlsAlpnProtocols =
|
||||
[NSMutableArray arrayWithCapacity:nativeServer.tls_alpn_protocols.size()];
|
||||
for (auto const &proto : nativeServer.tls_alpn_protocols) {
|
||||
[tlsAlpnProtocols addObject:[NSString stringForStdString:proto]];
|
||||
}
|
||||
NSMutableArray *tlsEllipticCurves =
|
||||
[NSMutableArray arrayWithCapacity:nativeServer.tls_elliptic_curves.size()];
|
||||
for (auto const &curve : nativeServer.tls_elliptic_curves) {
|
||||
[tlsEllipticCurves addObject:[NSString stringForStdString:curve]];
|
||||
}
|
||||
RTCTlsCertPolicy tlsCertPolicy;
|
||||
|
||||
switch (nativeServer.tls_cert_policy) {
|
||||
case webrtc::PeerConnectionInterface::kTlsCertPolicySecure:
|
||||
tlsCertPolicy = RTCTlsCertPolicySecure;
|
||||
break;
|
||||
case webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck:
|
||||
tlsCertPolicy = RTCTlsCertPolicyInsecureNoCheck;
|
||||
break;
|
||||
}
|
||||
|
||||
self = [self initWithURLStrings:urls
|
||||
username:username
|
||||
credential:credential
|
||||
tlsCertPolicy:tlsCertPolicy
|
||||
hostname:hostname
|
||||
tlsAlpnProtocols:tlsAlpnProtocols
|
||||
tlsEllipticCurves:tlsEllipticCurves];
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCIntervalRange.h"
|
||||
|
||||
#include "rtc_base/timeutils.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCIntervalRange ()
|
||||
|
||||
@property(nonatomic, readonly) std::unique_ptr<rtc::IntervalRange> nativeIntervalRange;
|
||||
|
||||
- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCIntervalRange+Private.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
@implementation RTCIntervalRange
|
||||
|
||||
@synthesize min = _min;
|
||||
@synthesize max = _max;
|
||||
|
||||
- (instancetype)init {
|
||||
return [self initWithMin:0 max:0];
|
||||
}
|
||||
|
||||
- (instancetype)initWithMin:(NSInteger)min
|
||||
max:(NSInteger)max {
|
||||
RTC_DCHECK_LE(min, max);
|
||||
if (self = [super init]) {
|
||||
_min = min;
|
||||
_max = max;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config {
|
||||
return [self initWithMin:config.min() max:config.max()];
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"[%ld, %ld]", (long)_min, (long)_max];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (std::unique_ptr<rtc::IntervalRange>)nativeIntervalRange {
|
||||
std::unique_ptr<rtc::IntervalRange> nativeIntervalRange(
|
||||
new rtc::IntervalRange((int)_min, (int)_max));
|
||||
return nativeIntervalRange;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCLegacyStatsReport.h"
|
||||
|
||||
#include "api/statstypes.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCLegacyStatsReport ()
|
||||
|
||||
/** Initialize an RTCLegacyStatsReport object from a native StatsReport. */
|
||||
- (instancetype)initWithNativeReport:(const webrtc::StatsReport &)nativeReport;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCLegacyStatsReport+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
@implementation RTCLegacyStatsReport
|
||||
|
||||
@synthesize timestamp = _timestamp;
|
||||
@synthesize type = _type;
|
||||
@synthesize reportId = _reportId;
|
||||
@synthesize values = _values;
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCLegacyStatsReport:\n%@\n%@\n%f\n%@",
|
||||
_reportId,
|
||||
_type,
|
||||
_timestamp,
|
||||
_values];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (instancetype)initWithNativeReport:(const webrtc::StatsReport &)nativeReport {
|
||||
if (self = [super init]) {
|
||||
_timestamp = nativeReport.timestamp();
|
||||
_type = [NSString stringForStdString:nativeReport.TypeToString()];
|
||||
_reportId = [NSString stringForStdString:
|
||||
nativeReport.id()->ToString()];
|
||||
|
||||
NSUInteger capacity = nativeReport.values().size();
|
||||
NSMutableDictionary *values =
|
||||
[NSMutableDictionary dictionaryWithCapacity:capacity];
|
||||
for (auto const &valuePair : nativeReport.values()) {
|
||||
NSString *key = [NSString stringForStdString:
|
||||
valuePair.second->display_name()];
|
||||
NSString *value = [NSString stringForStdString:
|
||||
valuePair.second->ToString()];
|
||||
|
||||
// Not expecting duplicate keys.
|
||||
RTC_DCHECK(![values objectForKey:key]);
|
||||
[values setObject:value forKey:key];
|
||||
}
|
||||
_values = values;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCMediaConstraints.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "api/mediaconstraintsinterface.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class MediaConstraints : public MediaConstraintsInterface {
|
||||
public:
|
||||
~MediaConstraints() override;
|
||||
MediaConstraints();
|
||||
MediaConstraints(const MediaConstraintsInterface::Constraints& mandatory,
|
||||
const MediaConstraintsInterface::Constraints& optional);
|
||||
const Constraints& GetMandatory() const override;
|
||||
const Constraints& GetOptional() const override;
|
||||
|
||||
private:
|
||||
MediaConstraintsInterface::Constraints mandatory_;
|
||||
MediaConstraintsInterface::Constraints optional_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCMediaConstraints ()
|
||||
|
||||
/**
|
||||
* A MediaConstraints representation of this RTCMediaConstraints object. This is
|
||||
* needed to pass to the underlying C++ APIs.
|
||||
*/
|
||||
- (std::unique_ptr<webrtc::MediaConstraints>)nativeConstraints;
|
||||
|
||||
/** Return a native Constraints object representing these constraints */
|
||||
+ (webrtc::MediaConstraintsInterface::Constraints)nativeConstraintsForConstraints:
|
||||
(NSDictionary<NSString*, NSString*>*)constraints;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,136 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCMediaConstraints+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
NSString * const kRTCMediaConstraintsMinAspectRatio =
|
||||
@(webrtc::MediaConstraintsInterface::kMinAspectRatio);
|
||||
NSString * const kRTCMediaConstraintsMaxAspectRatio =
|
||||
@(webrtc::MediaConstraintsInterface::kMaxAspectRatio);
|
||||
NSString * const kRTCMediaConstraintsMinWidth =
|
||||
@(webrtc::MediaConstraintsInterface::kMinWidth);
|
||||
NSString * const kRTCMediaConstraintsMaxWidth =
|
||||
@(webrtc::MediaConstraintsInterface::kMaxWidth);
|
||||
NSString * const kRTCMediaConstraintsMinHeight =
|
||||
@(webrtc::MediaConstraintsInterface::kMinHeight);
|
||||
NSString * const kRTCMediaConstraintsMaxHeight =
|
||||
@(webrtc::MediaConstraintsInterface::kMaxHeight);
|
||||
NSString * const kRTCMediaConstraintsMinFrameRate =
|
||||
@(webrtc::MediaConstraintsInterface::kMinFrameRate);
|
||||
NSString * const kRTCMediaConstraintsMaxFrameRate =
|
||||
@(webrtc::MediaConstraintsInterface::kMaxFrameRate);
|
||||
NSString * const kRTCMediaConstraintsAudioNetworkAdaptorConfig =
|
||||
@(webrtc::MediaConstraintsInterface::kAudioNetworkAdaptorConfig);
|
||||
|
||||
NSString * const kRTCMediaConstraintsIceRestart =
|
||||
@(webrtc::MediaConstraintsInterface::kIceRestart);
|
||||
NSString * const kRTCMediaConstraintsOfferToReceiveAudio =
|
||||
@(webrtc::MediaConstraintsInterface::kOfferToReceiveAudio);
|
||||
NSString * const kRTCMediaConstraintsOfferToReceiveVideo =
|
||||
@(webrtc::MediaConstraintsInterface::kOfferToReceiveVideo);
|
||||
NSString * const kRTCMediaConstraintsVoiceActivityDetection =
|
||||
@(webrtc::MediaConstraintsInterface::kVoiceActivityDetection);
|
||||
|
||||
NSString * const kRTCMediaConstraintsValueTrue =
|
||||
@(webrtc::MediaConstraintsInterface::kValueTrue);
|
||||
NSString * const kRTCMediaConstraintsValueFalse =
|
||||
@(webrtc::MediaConstraintsInterface::kValueFalse);
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
MediaConstraints::~MediaConstraints() {}
|
||||
|
||||
MediaConstraints::MediaConstraints() {}
|
||||
|
||||
MediaConstraints::MediaConstraints(
|
||||
const MediaConstraintsInterface::Constraints& mandatory,
|
||||
const MediaConstraintsInterface::Constraints& optional)
|
||||
: mandatory_(mandatory), optional_(optional) {}
|
||||
|
||||
const MediaConstraintsInterface::Constraints&
|
||||
MediaConstraints::GetMandatory() const {
|
||||
return mandatory_;
|
||||
}
|
||||
|
||||
const MediaConstraintsInterface::Constraints&
|
||||
MediaConstraints::GetOptional() const {
|
||||
return optional_;
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
|
||||
@implementation RTCMediaConstraints {
|
||||
NSDictionary<NSString *, NSString *> *_mandatory;
|
||||
NSDictionary<NSString *, NSString *> *_optional;
|
||||
}
|
||||
|
||||
- (instancetype)initWithMandatoryConstraints:
|
||||
(NSDictionary<NSString *, NSString *> *)mandatory
|
||||
optionalConstraints:
|
||||
(NSDictionary<NSString *, NSString *> *)optional {
|
||||
if (self = [super init]) {
|
||||
_mandatory = [[NSDictionary alloc] initWithDictionary:mandatory
|
||||
copyItems:YES];
|
||||
_optional = [[NSDictionary alloc] initWithDictionary:optional
|
||||
copyItems:YES];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCMediaConstraints:\n%@\n%@",
|
||||
_mandatory,
|
||||
_optional];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (std::unique_ptr<webrtc::MediaConstraints>)nativeConstraints {
|
||||
webrtc::MediaConstraintsInterface::Constraints mandatory =
|
||||
[[self class] nativeConstraintsForConstraints:_mandatory];
|
||||
webrtc::MediaConstraintsInterface::Constraints optional =
|
||||
[[self class] nativeConstraintsForConstraints:_optional];
|
||||
|
||||
webrtc::MediaConstraints *nativeConstraints =
|
||||
new webrtc::MediaConstraints(mandatory, optional);
|
||||
return std::unique_ptr<webrtc::MediaConstraints>(nativeConstraints);
|
||||
}
|
||||
|
||||
+ (webrtc::MediaConstraintsInterface::Constraints)
|
||||
nativeConstraintsForConstraints:
|
||||
(NSDictionary<NSString *, NSString *> *)constraints {
|
||||
webrtc::MediaConstraintsInterface::Constraints nativeConstraints;
|
||||
for (NSString *key in constraints) {
|
||||
NSAssert([key isKindOfClass:[NSString class]],
|
||||
@"%@ is not an NSString.", key);
|
||||
NSString *value = [constraints objectForKey:key];
|
||||
NSAssert([value isKindOfClass:[NSString class]],
|
||||
@"%@ is not an NSString.", value);
|
||||
if ([kRTCMediaConstraintsAudioNetworkAdaptorConfig isEqualToString:key]) {
|
||||
// This value is base64 encoded.
|
||||
NSData *charData = [[NSData alloc] initWithBase64EncodedString:value options:0];
|
||||
std::string configValue =
|
||||
std::string(reinterpret_cast<const char *>(charData.bytes), charData.length);
|
||||
nativeConstraints.push_back(webrtc::MediaConstraintsInterface::Constraint(
|
||||
key.stdString, configValue));
|
||||
} else {
|
||||
nativeConstraints.push_back(webrtc::MediaConstraintsInterface::Constraint(
|
||||
key.stdString, value.stdString));
|
||||
}
|
||||
}
|
||||
return nativeConstraints;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCMediaSource.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
|
||||
typedef NS_ENUM(NSInteger, RTCMediaSourceType) {
|
||||
RTCMediaSourceTypeAudio,
|
||||
RTCMediaSourceTypeVideo,
|
||||
};
|
||||
|
||||
@interface RTCMediaSource ()
|
||||
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::MediaSourceInterface> nativeMediaSource;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaSource:(rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
|
||||
type:(RTCMediaSourceType)type NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
+ (webrtc::MediaSourceInterface::SourceState)nativeSourceStateForState:(RTCSourceState)state;
|
||||
|
||||
+ (RTCSourceState)sourceStateForNativeState:(webrtc::MediaSourceInterface::SourceState)nativeState;
|
||||
|
||||
+ (NSString *)stringForState:(RTCSourceState)state;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,82 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCMediaSource+Private.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
@implementation RTCMediaSource {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
RTCMediaSourceType _type;
|
||||
}
|
||||
|
||||
@synthesize nativeMediaSource = _nativeMediaSource;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaSource:(rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
|
||||
type:(RTCMediaSourceType)type {
|
||||
RTC_DCHECK(factory);
|
||||
RTC_DCHECK(nativeMediaSource);
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
_nativeMediaSource = nativeMediaSource;
|
||||
_type = type;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (RTCSourceState)state {
|
||||
return [[self class] sourceStateForNativeState:_nativeMediaSource->state()];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
+ (webrtc::MediaSourceInterface::SourceState)nativeSourceStateForState:
|
||||
(RTCSourceState)state {
|
||||
switch (state) {
|
||||
case RTCSourceStateInitializing:
|
||||
return webrtc::MediaSourceInterface::kInitializing;
|
||||
case RTCSourceStateLive:
|
||||
return webrtc::MediaSourceInterface::kLive;
|
||||
case RTCSourceStateEnded:
|
||||
return webrtc::MediaSourceInterface::kEnded;
|
||||
case RTCSourceStateMuted:
|
||||
return webrtc::MediaSourceInterface::kMuted;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCSourceState)sourceStateForNativeState:
|
||||
(webrtc::MediaSourceInterface::SourceState)nativeState {
|
||||
switch (nativeState) {
|
||||
case webrtc::MediaSourceInterface::kInitializing:
|
||||
return RTCSourceStateInitializing;
|
||||
case webrtc::MediaSourceInterface::kLive:
|
||||
return RTCSourceStateLive;
|
||||
case webrtc::MediaSourceInterface::kEnded:
|
||||
return RTCSourceStateEnded;
|
||||
case webrtc::MediaSourceInterface::kMuted:
|
||||
return RTCSourceStateMuted;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForState:(RTCSourceState)state {
|
||||
switch (state) {
|
||||
case RTCSourceStateInitializing:
|
||||
return @"Initializing";
|
||||
case RTCSourceStateLive:
|
||||
return @"Live";
|
||||
case RTCSourceStateEnded:
|
||||
return @"Ended";
|
||||
case RTCSourceStateMuted:
|
||||
return @"Muted";
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCMediaStream.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCMediaStream ()
|
||||
|
||||
/**
|
||||
* MediaStreamInterface representation of this RTCMediaStream object. This is
|
||||
* needed to pass to the underlying C++ APIs.
|
||||
*/
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::MediaStreamInterface> nativeMediaStream;
|
||||
|
||||
/** Initialize an RTCMediaStream with an id. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory streamId:(NSString *)streamId;
|
||||
|
||||
/** Initialize an RTCMediaStream from a native MediaStreamInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaStream:(rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,126 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCMediaStream+Private.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCAudioTrack+Private.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCPeerConnectionFactory+Private.h"
|
||||
#import "RTCVideoTrack+Private.h"
|
||||
|
||||
@implementation RTCMediaStream {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
NSMutableArray *_audioTracks;
|
||||
NSMutableArray *_videoTracks;
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> _nativeMediaStream;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
streamId:(NSString *)streamId {
|
||||
NSParameterAssert(factory);
|
||||
NSParameterAssert(streamId.length);
|
||||
std::string nativeId = [NSString stdStringForString:streamId];
|
||||
rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
|
||||
factory.nativeFactory->CreateLocalMediaStream(nativeId);
|
||||
return [self initWithFactory:factory nativeMediaStream:stream];
|
||||
}
|
||||
|
||||
- (NSArray<RTCAudioTrack *> *)audioTracks {
|
||||
return [_audioTracks copy];
|
||||
}
|
||||
|
||||
- (NSArray<RTCVideoTrack *> *)videoTracks {
|
||||
return [_videoTracks copy];
|
||||
}
|
||||
|
||||
- (NSString *)streamId {
|
||||
return [NSString stringForStdString:_nativeMediaStream->id()];
|
||||
}
|
||||
|
||||
- (void)addAudioTrack:(RTCAudioTrack *)audioTrack {
|
||||
if (_nativeMediaStream->AddTrack(audioTrack.nativeAudioTrack)) {
|
||||
[_audioTracks addObject:audioTrack];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)addVideoTrack:(RTCVideoTrack *)videoTrack {
|
||||
if (_nativeMediaStream->AddTrack(videoTrack.nativeVideoTrack)) {
|
||||
[_videoTracks addObject:videoTrack];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)removeAudioTrack:(RTCAudioTrack *)audioTrack {
|
||||
NSUInteger index = [_audioTracks indexOfObjectIdenticalTo:audioTrack];
|
||||
NSAssert(index != NSNotFound,
|
||||
@"|removeAudioTrack| called on unexpected RTCAudioTrack");
|
||||
if (index != NSNotFound &&
|
||||
_nativeMediaStream->RemoveTrack(audioTrack.nativeAudioTrack)) {
|
||||
[_audioTracks removeObjectAtIndex:index];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)removeVideoTrack:(RTCVideoTrack *)videoTrack {
|
||||
NSUInteger index = [_videoTracks indexOfObjectIdenticalTo:videoTrack];
|
||||
NSAssert(index != NSNotFound,
|
||||
@"|removeVideoTrack| called on unexpected RTCVideoTrack");
|
||||
if (index != NSNotFound &&
|
||||
_nativeMediaStream->RemoveTrack(videoTrack.nativeVideoTrack)) {
|
||||
[_videoTracks removeObjectAtIndex:index];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCMediaStream:\n%@\nA=%lu\nV=%lu",
|
||||
self.streamId,
|
||||
(unsigned long)self.audioTracks.count,
|
||||
(unsigned long)self.videoTracks.count];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
|
||||
return _nativeMediaStream;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaStream:
|
||||
(rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
|
||||
NSParameterAssert(nativeMediaStream);
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
|
||||
webrtc::AudioTrackVector audioTracks = nativeMediaStream->GetAudioTracks();
|
||||
webrtc::VideoTrackVector videoTracks = nativeMediaStream->GetVideoTracks();
|
||||
|
||||
_audioTracks = [NSMutableArray arrayWithCapacity:audioTracks.size()];
|
||||
_videoTracks = [NSMutableArray arrayWithCapacity:videoTracks.size()];
|
||||
_nativeMediaStream = nativeMediaStream;
|
||||
|
||||
for (auto &track : audioTracks) {
|
||||
RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeAudio;
|
||||
RTCAudioTrack *audioTrack =
|
||||
[[RTCAudioTrack alloc] initWithFactory:_factory nativeTrack:track type:type];
|
||||
[_audioTracks addObject:audioTrack];
|
||||
}
|
||||
|
||||
for (auto &track : videoTracks) {
|
||||
RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeVideo;
|
||||
RTCVideoTrack *videoTrack =
|
||||
[[RTCVideoTrack alloc] initWithFactory:_factory nativeTrack:track type:type];
|
||||
[_videoTracks addObject:videoTrack];
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCMediaStreamTrack.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
typedef NS_ENUM(NSInteger, RTCMediaStreamTrackType) {
|
||||
RTCMediaStreamTrackTypeAudio,
|
||||
RTCMediaStreamTrackTypeVideo,
|
||||
};
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
|
||||
@interface RTCMediaStreamTrack ()
|
||||
|
||||
@property(nonatomic, readonly) RTCPeerConnectionFactory *factory;
|
||||
|
||||
/**
|
||||
* The native MediaStreamTrackInterface passed in or created during
|
||||
* construction.
|
||||
*/
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack;
|
||||
|
||||
/**
|
||||
* Initialize an RTCMediaStreamTrack from a native MediaStreamTrackInterface.
|
||||
*/
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
|
||||
type:(RTCMediaStreamTrackType)type NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack;
|
||||
|
||||
- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track;
|
||||
|
||||
+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState:
|
||||
(RTCMediaStreamTrackState)state;
|
||||
|
||||
+ (RTCMediaStreamTrackState)trackStateForNativeState:
|
||||
(webrtc::MediaStreamTrackInterface::TrackState)nativeState;
|
||||
|
||||
+ (NSString *)stringForState:(RTCMediaStreamTrackState)state;
|
||||
|
||||
+ (RTCMediaStreamTrack *)mediaTrackForNativeTrack:
|
||||
(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
|
||||
factory:(RTCPeerConnectionFactory *)factory;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,160 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCAudioTrack+Private.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCVideoTrack+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
NSString * const kRTCMediaStreamTrackKindAudio =
|
||||
@(webrtc::MediaStreamTrackInterface::kAudioKind);
|
||||
NSString * const kRTCMediaStreamTrackKindVideo =
|
||||
@(webrtc::MediaStreamTrackInterface::kVideoKind);
|
||||
|
||||
@implementation RTCMediaStreamTrack {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> _nativeTrack;
|
||||
RTCMediaStreamTrackType _type;
|
||||
}
|
||||
|
||||
- (NSString *)kind {
|
||||
return [NSString stringForStdString:_nativeTrack->kind()];
|
||||
}
|
||||
|
||||
- (NSString *)trackId {
|
||||
return [NSString stringForStdString:_nativeTrack->id()];
|
||||
}
|
||||
|
||||
- (BOOL)isEnabled {
|
||||
return _nativeTrack->enabled();
|
||||
}
|
||||
|
||||
- (void)setIsEnabled:(BOOL)isEnabled {
|
||||
_nativeTrack->set_enabled(isEnabled);
|
||||
}
|
||||
|
||||
- (RTCMediaStreamTrackState)readyState {
|
||||
return [[self class] trackStateForNativeState:_nativeTrack->state()];
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
NSString *readyState = [[self class] stringForState:self.readyState];
|
||||
return [NSString stringWithFormat:@"RTCMediaStreamTrack:\n%@\n%@\n%@\n%@",
|
||||
self.kind,
|
||||
self.trackId,
|
||||
self.isEnabled ? @"enabled" : @"disabled",
|
||||
readyState];
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:(id)object {
|
||||
if (self == object) {
|
||||
return YES;
|
||||
}
|
||||
if (![object isMemberOfClass:[self class]]) {
|
||||
return NO;
|
||||
}
|
||||
return [self isEqualToTrack:(RTCMediaStreamTrack *)object];
|
||||
}
|
||||
|
||||
- (NSUInteger)hash {
|
||||
return (NSUInteger)_nativeTrack.get();
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
|
||||
return _nativeTrack;
|
||||
}
|
||||
|
||||
@synthesize factory = _factory;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
|
||||
type:(RTCMediaStreamTrackType)type {
|
||||
NSParameterAssert(nativeTrack);
|
||||
NSParameterAssert(factory);
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
_nativeTrack = nativeTrack;
|
||||
_type = type;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
|
||||
NSParameterAssert(nativeTrack);
|
||||
if (nativeTrack->kind() ==
|
||||
std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) {
|
||||
return [self initWithFactory:factory nativeTrack:nativeTrack type:RTCMediaStreamTrackTypeAudio];
|
||||
}
|
||||
if (nativeTrack->kind() ==
|
||||
std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) {
|
||||
return [self initWithFactory:factory nativeTrack:nativeTrack type:RTCMediaStreamTrackTypeVideo];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track {
|
||||
if (!track) {
|
||||
return NO;
|
||||
}
|
||||
return _nativeTrack == track.nativeTrack;
|
||||
}
|
||||
|
||||
+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState:
|
||||
(RTCMediaStreamTrackState)state {
|
||||
switch (state) {
|
||||
case RTCMediaStreamTrackStateLive:
|
||||
return webrtc::MediaStreamTrackInterface::kLive;
|
||||
case RTCMediaStreamTrackStateEnded:
|
||||
return webrtc::MediaStreamTrackInterface::kEnded;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCMediaStreamTrackState)trackStateForNativeState:
|
||||
(webrtc::MediaStreamTrackInterface::TrackState)nativeState {
|
||||
switch (nativeState) {
|
||||
case webrtc::MediaStreamTrackInterface::kLive:
|
||||
return RTCMediaStreamTrackStateLive;
|
||||
case webrtc::MediaStreamTrackInterface::kEnded:
|
||||
return RTCMediaStreamTrackStateEnded;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForState:(RTCMediaStreamTrackState)state {
|
||||
switch (state) {
|
||||
case RTCMediaStreamTrackStateLive:
|
||||
return @"Live";
|
||||
case RTCMediaStreamTrackStateEnded:
|
||||
return @"Ended";
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCMediaStreamTrack *)mediaTrackForNativeTrack:
|
||||
(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
|
||||
factory:(RTCPeerConnectionFactory *)factory {
|
||||
NSParameterAssert(nativeTrack);
|
||||
NSParameterAssert(factory);
|
||||
if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
|
||||
return [[RTCAudioTrack alloc] initWithFactory:factory
|
||||
nativeTrack:nativeTrack
|
||||
type:RTCMediaStreamTrackTypeAudio];
|
||||
} else if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
|
||||
return [[RTCVideoTrack alloc] initWithFactory:factory
|
||||
nativeTrack:nativeTrack
|
||||
type:RTCMediaStreamTrackTypeVideo];
|
||||
} else {
|
||||
return [[RTCMediaStreamTrack alloc] initWithFactory:factory nativeTrack:nativeTrack];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCMetrics.h"
|
||||
|
||||
#import "RTCMetricsSampleInfo+Private.h"
|
||||
|
||||
void RTCEnableMetrics(void) {
|
||||
webrtc::metrics::Enable();
|
||||
}
|
||||
|
||||
NSArray<RTCMetricsSampleInfo *> *RTCGetAndResetMetrics(void) {
|
||||
std::map<std::string, std::unique_ptr<webrtc::metrics::SampleInfo>>
|
||||
histograms;
|
||||
webrtc::metrics::GetAndReset(&histograms);
|
||||
|
||||
NSMutableArray *metrics =
|
||||
[NSMutableArray arrayWithCapacity:histograms.size()];
|
||||
for (auto const &histogram : histograms) {
|
||||
RTCMetricsSampleInfo *metric = [[RTCMetricsSampleInfo alloc]
|
||||
initWithNativeSampleInfo:*histogram.second];
|
||||
[metrics addObject:metric];
|
||||
}
|
||||
return metrics;
|
||||
}
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCMetricsSampleInfo.h"
|
||||
|
||||
// Adding 'nogncheck' to disable the gn include headers check.
|
||||
// We don't want to depend on 'system_wrappers:metrics_default' because
|
||||
// clients should be able to provide their own implementation.
|
||||
#include "system_wrappers/include/metrics_default.h" // nogncheck
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCMetricsSampleInfo ()
|
||||
|
||||
/** Initialize an RTCMetricsSampleInfo object from native SampleInfo. */
|
||||
- (instancetype)initWithNativeSampleInfo:(const webrtc::metrics::SampleInfo &)info;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCMetricsSampleInfo+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
@implementation RTCMetricsSampleInfo
|
||||
|
||||
@synthesize name = _name;
|
||||
@synthesize min = _min;
|
||||
@synthesize max = _max;
|
||||
@synthesize bucketCount = _bucketCount;
|
||||
@synthesize samples = _samples;
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (instancetype)initWithNativeSampleInfo:
|
||||
(const webrtc::metrics::SampleInfo &)info {
|
||||
if (self = [super init]) {
|
||||
_name = [NSString stringForStdString:info.name];
|
||||
_min = info.min;
|
||||
_max = info.max;
|
||||
_bucketCount = info.bucket_count;
|
||||
|
||||
NSMutableDictionary *samples =
|
||||
[NSMutableDictionary dictionaryWithCapacity:info.samples.size()];
|
||||
for (auto const &sample : info.samples) {
|
||||
[samples setObject:@(sample.second) forKey:@(sample.first)];
|
||||
}
|
||||
_samples = samples;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnection+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCDataChannel+Private.h"
|
||||
#import "RTCDataChannelConfiguration+Private.h"
|
||||
|
||||
@implementation RTCPeerConnection (DataChannel)
|
||||
|
||||
- (nullable RTCDataChannel *)dataChannelForLabel:(NSString *)label
|
||||
configuration:(RTCDataChannelConfiguration *)configuration {
|
||||
std::string labelString = [NSString stdStringForString:label];
|
||||
const webrtc::DataChannelInit nativeInit =
|
||||
configuration.nativeDataChannelInit;
|
||||
rtc::scoped_refptr<webrtc::DataChannelInterface> dataChannel =
|
||||
self.nativePeerConnection->CreateDataChannel(labelString,
|
||||
&nativeInit);
|
||||
if (!dataChannel) {
|
||||
return nil;
|
||||
}
|
||||
return [[RTCDataChannel alloc] initWithFactory:self.factory nativeDataChannel:dataChannel];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -8,27 +8,4 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCPeerConnection.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace rtc {
|
||||
class BitrateAllocationStrategy;
|
||||
} // namespace rtc
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* This class extension exposes methods that work directly with injectable C++ components.
|
||||
*/
|
||||
@interface RTCPeerConnection ()
|
||||
|
||||
/** Sets current strategy. If not set default WebRTC allocator will be used. May be changed during
|
||||
* an active session.
|
||||
*/
|
||||
- (void)setBitrateAllocationStrategy:
|
||||
(std::unique_ptr<rtc::BitrateAllocationStrategy>)bitrateAllocationStrategy;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
#import "api/peerconnection/RTCPeerConnection+Native.h"
|
||||
|
||||
@ -1,106 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCPeerConnection.h"
|
||||
|
||||
#include "api/peerconnectioninterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
/**
|
||||
* These objects are created by RTCPeerConnectionFactory to wrap an
|
||||
* id<RTCPeerConnectionDelegate> and call methods on that interface.
|
||||
*/
|
||||
class PeerConnectionDelegateAdapter : public PeerConnectionObserver {
|
||||
public:
|
||||
PeerConnectionDelegateAdapter(RTCPeerConnection *peerConnection);
|
||||
~PeerConnectionDelegateAdapter() override;
|
||||
|
||||
void OnSignalingChange(PeerConnectionInterface::SignalingState new_state) override;
|
||||
|
||||
void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
|
||||
|
||||
void OnRemoveStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
|
||||
|
||||
void OnTrack(rtc::scoped_refptr<RtpTransceiverInterface> transceiver) override;
|
||||
|
||||
void OnDataChannel(rtc::scoped_refptr<DataChannelInterface> data_channel) override;
|
||||
|
||||
void OnRenegotiationNeeded() override;
|
||||
|
||||
void OnIceConnectionChange(PeerConnectionInterface::IceConnectionState new_state) override;
|
||||
|
||||
void OnIceGatheringChange(PeerConnectionInterface::IceGatheringState new_state) override;
|
||||
|
||||
void OnIceCandidate(const IceCandidateInterface *candidate) override;
|
||||
|
||||
void OnIceCandidatesRemoved(const std::vector<cricket::Candidate> &candidates) override;
|
||||
|
||||
void OnAddTrack(rtc::scoped_refptr<RtpReceiverInterface> receiver,
|
||||
const std::vector<rtc::scoped_refptr<MediaStreamInterface>> &streams) override;
|
||||
|
||||
void OnRemoveTrack(rtc::scoped_refptr<RtpReceiverInterface> receiver) override;
|
||||
|
||||
private:
|
||||
__weak RTCPeerConnection *peer_connection_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@interface RTCPeerConnection ()
|
||||
|
||||
/** The factory used to create this RTCPeerConnection */
|
||||
@property(nonatomic, readonly) RTCPeerConnectionFactory *factory;
|
||||
|
||||
/** The native PeerConnectionInterface created during construction. */
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::PeerConnectionInterface>
|
||||
nativePeerConnection;
|
||||
|
||||
/** Initialize an RTCPeerConnection with a configuration, constraints, and
|
||||
* delegate.
|
||||
*/
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
configuration:(RTCConfiguration *)configuration
|
||||
constraints:(RTCMediaConstraints *)constraints
|
||||
delegate:(nullable id<RTCPeerConnectionDelegate>)delegate
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
|
||||
(RTCSignalingState)state;
|
||||
|
||||
+ (RTCSignalingState)signalingStateForNativeState:
|
||||
(webrtc::PeerConnectionInterface::SignalingState)nativeState;
|
||||
|
||||
+ (NSString *)stringForSignalingState:(RTCSignalingState)state;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::IceConnectionState)nativeIceConnectionStateForState:
|
||||
(RTCIceConnectionState)state;
|
||||
|
||||
+ (RTCIceConnectionState)iceConnectionStateForNativeState:
|
||||
(webrtc::PeerConnectionInterface::IceConnectionState)nativeState;
|
||||
|
||||
+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::IceGatheringState)nativeIceGatheringStateForState:
|
||||
(RTCIceGatheringState)state;
|
||||
|
||||
+ (RTCIceGatheringState)iceGatheringStateForNativeState:
|
||||
(webrtc::PeerConnectionInterface::IceGatheringState)nativeState;
|
||||
|
||||
+ (NSString *)stringForIceGatheringState:(RTCIceGatheringState)state;
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::StatsOutputLevel)nativeStatsOutputLevelForLevel:
|
||||
(RTCStatsOutputLevel)level;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnection+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCLegacyStatsReport+Private.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class StatsObserverAdapter : public StatsObserver {
|
||||
public:
|
||||
StatsObserverAdapter(void (^completionHandler)
|
||||
(NSArray<RTCLegacyStatsReport *> *stats)) {
|
||||
completion_handler_ = completionHandler;
|
||||
}
|
||||
|
||||
~StatsObserverAdapter() override { completion_handler_ = nil; }
|
||||
|
||||
void OnComplete(const StatsReports& reports) override {
|
||||
RTC_DCHECK(completion_handler_);
|
||||
NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports.size()];
|
||||
for (const auto* report : reports) {
|
||||
RTCLegacyStatsReport *statsReport =
|
||||
[[RTCLegacyStatsReport alloc] initWithNativeReport:*report];
|
||||
[stats addObject:statsReport];
|
||||
}
|
||||
completion_handler_(stats);
|
||||
completion_handler_ = nil;
|
||||
}
|
||||
|
||||
private:
|
||||
void (^completion_handler_)(NSArray<RTCLegacyStatsReport *> *stats);
|
||||
};
|
||||
} // namespace webrtc
|
||||
|
||||
@implementation RTCPeerConnection (Stats)
|
||||
|
||||
- (void)statsForTrack:(RTCMediaStreamTrack *)mediaStreamTrack
|
||||
statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel
|
||||
completionHandler:
|
||||
(void (^)(NSArray<RTCLegacyStatsReport *> *stats))completionHandler {
|
||||
rtc::scoped_refptr<webrtc::StatsObserverAdapter> observer(
|
||||
new rtc::RefCountedObject<webrtc::StatsObserverAdapter>
|
||||
(completionHandler));
|
||||
webrtc::PeerConnectionInterface::StatsOutputLevel nativeOutputLevel =
|
||||
[[self class] nativeStatsOutputLevelForLevel:statsOutputLevel];
|
||||
self.nativePeerConnection->GetStats(
|
||||
observer, mediaStreamTrack.nativeTrack, nativeOutputLevel);
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,748 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnection+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCConfiguration+Private.h"
|
||||
#import "RTCDataChannel+Private.h"
|
||||
#import "RTCIceCandidate+Private.h"
|
||||
#import "RTCLegacyStatsReport+Private.h"
|
||||
#import "RTCMediaConstraints+Private.h"
|
||||
#import "RTCMediaStream+Private.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCPeerConnection+Native.h"
|
||||
#import "RTCPeerConnectionFactory+Private.h"
|
||||
#import "RTCRtpReceiver+Private.h"
|
||||
#import "RTCRtpSender+Private.h"
|
||||
#import "RTCRtpTransceiver+Private.h"
|
||||
#import "RTCSessionDescription+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "api/jsepicecandidate.h"
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
NSString * const kRTCPeerConnectionErrorDomain =
|
||||
@"org.webrtc.RTCPeerConnection";
|
||||
int const kRTCPeerConnnectionSessionDescriptionError = -1;
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class CreateSessionDescriptionObserverAdapter
|
||||
: public CreateSessionDescriptionObserver {
|
||||
public:
|
||||
CreateSessionDescriptionObserverAdapter(
|
||||
void (^completionHandler)(RTCSessionDescription *sessionDescription,
|
||||
NSError *error)) {
|
||||
completion_handler_ = completionHandler;
|
||||
}
|
||||
|
||||
~CreateSessionDescriptionObserverAdapter() override { completion_handler_ = nil; }
|
||||
|
||||
void OnSuccess(SessionDescriptionInterface *desc) override {
|
||||
RTC_DCHECK(completion_handler_);
|
||||
std::unique_ptr<webrtc::SessionDescriptionInterface> description =
|
||||
std::unique_ptr<webrtc::SessionDescriptionInterface>(desc);
|
||||
RTCSessionDescription* session =
|
||||
[[RTCSessionDescription alloc] initWithNativeDescription:
|
||||
description.get()];
|
||||
completion_handler_(session, nil);
|
||||
completion_handler_ = nil;
|
||||
}
|
||||
|
||||
void OnFailure(RTCError error) override {
|
||||
RTC_DCHECK(completion_handler_);
|
||||
// TODO(hta): Add handling of error.type()
|
||||
NSString *str = [NSString stringForStdString:error.message()];
|
||||
NSError* err =
|
||||
[NSError errorWithDomain:kRTCPeerConnectionErrorDomain
|
||||
code:kRTCPeerConnnectionSessionDescriptionError
|
||||
userInfo:@{ NSLocalizedDescriptionKey : str }];
|
||||
completion_handler_(nil, err);
|
||||
completion_handler_ = nil;
|
||||
}
|
||||
|
||||
private:
|
||||
void (^completion_handler_)
|
||||
(RTCSessionDescription *sessionDescription, NSError *error);
|
||||
};
|
||||
|
||||
class SetSessionDescriptionObserverAdapter :
|
||||
public SetSessionDescriptionObserver {
|
||||
public:
|
||||
SetSessionDescriptionObserverAdapter(void (^completionHandler)
|
||||
(NSError *error)) {
|
||||
completion_handler_ = completionHandler;
|
||||
}
|
||||
|
||||
~SetSessionDescriptionObserverAdapter() override { completion_handler_ = nil; }
|
||||
|
||||
void OnSuccess() override {
|
||||
RTC_DCHECK(completion_handler_);
|
||||
completion_handler_(nil);
|
||||
completion_handler_ = nil;
|
||||
}
|
||||
|
||||
void OnFailure(RTCError error) override {
|
||||
RTC_DCHECK(completion_handler_);
|
||||
// TODO(hta): Add handling of error.type()
|
||||
NSString *str = [NSString stringForStdString:error.message()];
|
||||
NSError* err =
|
||||
[NSError errorWithDomain:kRTCPeerConnectionErrorDomain
|
||||
code:kRTCPeerConnnectionSessionDescriptionError
|
||||
userInfo:@{ NSLocalizedDescriptionKey : str }];
|
||||
completion_handler_(err);
|
||||
completion_handler_ = nil;
|
||||
}
|
||||
|
||||
private:
|
||||
void (^completion_handler_)(NSError *error);
|
||||
};
|
||||
|
||||
PeerConnectionDelegateAdapter::PeerConnectionDelegateAdapter(
|
||||
RTCPeerConnection *peerConnection) {
|
||||
peer_connection_ = peerConnection;
|
||||
}
|
||||
|
||||
PeerConnectionDelegateAdapter::~PeerConnectionDelegateAdapter() {
|
||||
peer_connection_ = nil;
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnSignalingChange(
|
||||
PeerConnectionInterface::SignalingState new_state) {
|
||||
RTCSignalingState state =
|
||||
[[RTCPeerConnection class] signalingStateForNativeState:new_state];
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didChangeSignalingState:state];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnAddStream(
|
||||
rtc::scoped_refptr<MediaStreamInterface> stream) {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
RTCMediaStream *mediaStream =
|
||||
[[RTCMediaStream alloc] initWithFactory:peer_connection.factory nativeMediaStream:stream];
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didAddStream:mediaStream];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnRemoveStream(
|
||||
rtc::scoped_refptr<MediaStreamInterface> stream) {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
RTCMediaStream *mediaStream =
|
||||
[[RTCMediaStream alloc] initWithFactory:peer_connection.factory nativeMediaStream:stream];
|
||||
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didRemoveStream:mediaStream];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnTrack(
|
||||
rtc::scoped_refptr<RtpTransceiverInterface> nativeTransceiver) {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
RTCRtpTransceiver *transceiver =
|
||||
[[RTCRtpTransceiver alloc] initWithFactory:peer_connection.factory
|
||||
nativeRtpTransceiver:nativeTransceiver];
|
||||
if ([peer_connection.delegate
|
||||
respondsToSelector:@selector(peerConnection:didStartReceivingOnTransceiver:)]) {
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didStartReceivingOnTransceiver:transceiver];
|
||||
}
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnDataChannel(
|
||||
rtc::scoped_refptr<DataChannelInterface> data_channel) {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
RTCDataChannel *dataChannel = [[RTCDataChannel alloc] initWithFactory:peer_connection.factory
|
||||
nativeDataChannel:data_channel];
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didOpenDataChannel:dataChannel];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnRenegotiationNeeded() {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
[peer_connection.delegate peerConnectionShouldNegotiate:peer_connection];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnIceConnectionChange(
|
||||
PeerConnectionInterface::IceConnectionState new_state) {
|
||||
RTCIceConnectionState state =
|
||||
[[RTCPeerConnection class] iceConnectionStateForNativeState:new_state];
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didChangeIceConnectionState:state];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnIceGatheringChange(
|
||||
PeerConnectionInterface::IceGatheringState new_state) {
|
||||
RTCIceGatheringState state =
|
||||
[[RTCPeerConnection class] iceGatheringStateForNativeState:new_state];
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didChangeIceGatheringState:state];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnIceCandidate(
|
||||
const IceCandidateInterface *candidate) {
|
||||
RTCIceCandidate *iceCandidate =
|
||||
[[RTCIceCandidate alloc] initWithNativeCandidate:candidate];
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didGenerateIceCandidate:iceCandidate];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
|
||||
const std::vector<cricket::Candidate>& candidates) {
|
||||
NSMutableArray* ice_candidates =
|
||||
[NSMutableArray arrayWithCapacity:candidates.size()];
|
||||
for (const auto& candidate : candidates) {
|
||||
std::unique_ptr<JsepIceCandidate> candidate_wrapper(
|
||||
new JsepIceCandidate(candidate.transport_name(), -1, candidate));
|
||||
RTCIceCandidate* ice_candidate = [[RTCIceCandidate alloc]
|
||||
initWithNativeCandidate:candidate_wrapper.get()];
|
||||
[ice_candidates addObject:ice_candidate];
|
||||
}
|
||||
RTCPeerConnection* peer_connection = peer_connection_;
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didRemoveIceCandidates:ice_candidates];
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnAddTrack(
|
||||
rtc::scoped_refptr<RtpReceiverInterface> receiver,
|
||||
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
if ([peer_connection.delegate
|
||||
respondsToSelector:@selector(peerConnection:didAddReceiver:streams:)]) {
|
||||
NSMutableArray *mediaStreams = [NSMutableArray arrayWithCapacity:streams.size()];
|
||||
for (const auto& nativeStream : streams) {
|
||||
RTCMediaStream *mediaStream = [[RTCMediaStream alloc] initWithFactory:peer_connection.factory
|
||||
nativeMediaStream:nativeStream];
|
||||
[mediaStreams addObject:mediaStream];
|
||||
}
|
||||
RTCRtpReceiver *rtpReceiver =
|
||||
[[RTCRtpReceiver alloc] initWithFactory:peer_connection.factory nativeRtpReceiver:receiver];
|
||||
|
||||
[peer_connection.delegate peerConnection:peer_connection
|
||||
didAddReceiver:rtpReceiver
|
||||
streams:mediaStreams];
|
||||
}
|
||||
}
|
||||
|
||||
void PeerConnectionDelegateAdapter::OnRemoveTrack(
|
||||
rtc::scoped_refptr<RtpReceiverInterface> receiver) {
|
||||
RTCPeerConnection *peer_connection = peer_connection_;
|
||||
if ([peer_connection.delegate respondsToSelector:@selector(peerConnection:didRemoveReceiver:)]) {
|
||||
RTCRtpReceiver *rtpReceiver =
|
||||
[[RTCRtpReceiver alloc] initWithFactory:peer_connection.factory nativeRtpReceiver:receiver];
|
||||
[peer_connection.delegate peerConnection:peer_connection didRemoveReceiver:rtpReceiver];
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
|
||||
@implementation RTCPeerConnection {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
NSMutableArray<RTCMediaStream *> *_localStreams;
|
||||
std::unique_ptr<webrtc::PeerConnectionDelegateAdapter> _observer;
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
|
||||
std::unique_ptr<webrtc::MediaConstraints> _nativeConstraints;
|
||||
BOOL _hasStartedRtcEventLog;
|
||||
}
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
@synthesize factory = _factory;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
configuration:(RTCConfiguration *)configuration
|
||||
constraints:(RTCMediaConstraints *)constraints
|
||||
delegate:(id<RTCPeerConnectionDelegate>)delegate {
|
||||
NSParameterAssert(factory);
|
||||
std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
|
||||
[configuration createNativeConfiguration]);
|
||||
if (!config) {
|
||||
return nil;
|
||||
}
|
||||
if (self = [super init]) {
|
||||
_observer.reset(new webrtc::PeerConnectionDelegateAdapter(self));
|
||||
_nativeConstraints = constraints.nativeConstraints;
|
||||
CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
|
||||
config.get());
|
||||
_peerConnection =
|
||||
factory.nativeFactory->CreatePeerConnection(*config,
|
||||
nullptr,
|
||||
nullptr,
|
||||
_observer.get());
|
||||
if (!_peerConnection) {
|
||||
return nil;
|
||||
}
|
||||
_factory = factory;
|
||||
_localStreams = [[NSMutableArray alloc] init];
|
||||
_delegate = delegate;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSArray<RTCMediaStream *> *)localStreams {
|
||||
return [_localStreams copy];
|
||||
}
|
||||
|
||||
- (RTCSessionDescription *)localDescription {
|
||||
const webrtc::SessionDescriptionInterface *description =
|
||||
_peerConnection->local_description();
|
||||
return description ?
|
||||
[[RTCSessionDescription alloc] initWithNativeDescription:description]
|
||||
: nil;
|
||||
}
|
||||
|
||||
- (RTCSessionDescription *)remoteDescription {
|
||||
const webrtc::SessionDescriptionInterface *description =
|
||||
_peerConnection->remote_description();
|
||||
return description ?
|
||||
[[RTCSessionDescription alloc] initWithNativeDescription:description]
|
||||
: nil;
|
||||
}
|
||||
|
||||
- (RTCSignalingState)signalingState {
|
||||
return [[self class]
|
||||
signalingStateForNativeState:_peerConnection->signaling_state()];
|
||||
}
|
||||
|
||||
- (RTCIceConnectionState)iceConnectionState {
|
||||
return [[self class] iceConnectionStateForNativeState:
|
||||
_peerConnection->ice_connection_state()];
|
||||
}
|
||||
|
||||
- (RTCIceGatheringState)iceGatheringState {
|
||||
return [[self class] iceGatheringStateForNativeState:
|
||||
_peerConnection->ice_gathering_state()];
|
||||
}
|
||||
|
||||
- (BOOL)setConfiguration:(RTCConfiguration *)configuration {
|
||||
std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
|
||||
[configuration createNativeConfiguration]);
|
||||
if (!config) {
|
||||
return NO;
|
||||
}
|
||||
CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
|
||||
config.get());
|
||||
return _peerConnection->SetConfiguration(*config);
|
||||
}
|
||||
|
||||
- (RTCConfiguration *)configuration {
|
||||
webrtc::PeerConnectionInterface::RTCConfiguration config =
|
||||
_peerConnection->GetConfiguration();
|
||||
return [[RTCConfiguration alloc] initWithNativeConfiguration:config];
|
||||
}
|
||||
|
||||
- (void)close {
|
||||
_peerConnection->Close();
|
||||
}
|
||||
|
||||
- (void)addIceCandidate:(RTCIceCandidate *)candidate {
|
||||
std::unique_ptr<const webrtc::IceCandidateInterface> iceCandidate(
|
||||
candidate.nativeCandidate);
|
||||
_peerConnection->AddIceCandidate(iceCandidate.get());
|
||||
}
|
||||
|
||||
- (void)removeIceCandidates:(NSArray<RTCIceCandidate *> *)iceCandidates {
|
||||
std::vector<cricket::Candidate> candidates;
|
||||
for (RTCIceCandidate *iceCandidate in iceCandidates) {
|
||||
std::unique_ptr<const webrtc::IceCandidateInterface> candidate(
|
||||
iceCandidate.nativeCandidate);
|
||||
if (candidate) {
|
||||
candidates.push_back(candidate->candidate());
|
||||
// Need to fill the transport name from the sdp_mid.
|
||||
candidates.back().set_transport_name(candidate->sdp_mid());
|
||||
}
|
||||
}
|
||||
if (!candidates.empty()) {
|
||||
_peerConnection->RemoveIceCandidates(candidates);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)addStream:(RTCMediaStream *)stream {
|
||||
if (!_peerConnection->AddStream(stream.nativeMediaStream)) {
|
||||
RTCLogError(@"Failed to add stream: %@", stream);
|
||||
return;
|
||||
}
|
||||
[_localStreams addObject:stream];
|
||||
}
|
||||
|
||||
- (void)removeStream:(RTCMediaStream *)stream {
|
||||
_peerConnection->RemoveStream(stream.nativeMediaStream);
|
||||
[_localStreams removeObject:stream];
|
||||
}
|
||||
|
||||
- (RTCRtpSender *)addTrack:(RTCMediaStreamTrack *)track streamIds:(NSArray<NSString *> *)streamIds {
|
||||
std::vector<std::string> nativeStreamIds;
|
||||
for (NSString *streamId in streamIds) {
|
||||
nativeStreamIds.push_back([streamId UTF8String]);
|
||||
}
|
||||
webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenderOrError =
|
||||
_peerConnection->AddTrack(track.nativeTrack, nativeStreamIds);
|
||||
if (!nativeSenderOrError.ok()) {
|
||||
RTCLogError(@"Failed to add track %@: %s", track, nativeSenderOrError.error().message());
|
||||
return nil;
|
||||
}
|
||||
return [[RTCRtpSender alloc] initWithFactory:self.factory
|
||||
nativeRtpSender:nativeSenderOrError.MoveValue()];
|
||||
}
|
||||
|
||||
- (BOOL)removeTrack:(RTCRtpSender *)sender {
|
||||
bool result = _peerConnection->RemoveTrack(sender.nativeRtpSender);
|
||||
if (!result) {
|
||||
RTCLogError(@"Failed to remote track %@", sender);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverWithTrack:(RTCMediaStreamTrack *)track {
|
||||
return [self addTransceiverWithTrack:track init:[[RTCRtpTransceiverInit alloc] init]];
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverWithTrack:(RTCMediaStreamTrack *)track
|
||||
init:(RTCRtpTransceiverInit *)init {
|
||||
webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceiverOrError =
|
||||
_peerConnection->AddTransceiver(track.nativeTrack, init.nativeInit);
|
||||
if (!nativeTransceiverOrError.ok()) {
|
||||
RTCLogError(
|
||||
@"Failed to add transceiver %@: %s", track, nativeTransceiverOrError.error().message());
|
||||
return nil;
|
||||
}
|
||||
return [[RTCRtpTransceiver alloc] initWithFactory:self.factory
|
||||
nativeRtpTransceiver:nativeTransceiverOrError.MoveValue()];
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverOfType:(RTCRtpMediaType)mediaType {
|
||||
return [self addTransceiverOfType:mediaType init:[[RTCRtpTransceiverInit alloc] init]];
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiver *)addTransceiverOfType:(RTCRtpMediaType)mediaType
|
||||
init:(RTCRtpTransceiverInit *)init {
|
||||
webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceiverOrError =
|
||||
_peerConnection->AddTransceiver([RTCRtpReceiver nativeMediaTypeForMediaType:mediaType],
|
||||
init.nativeInit);
|
||||
if (!nativeTransceiverOrError.ok()) {
|
||||
RTCLogError(@"Failed to add transceiver %@: %s",
|
||||
[RTCRtpReceiver stringForMediaType:mediaType],
|
||||
nativeTransceiverOrError.error().message());
|
||||
return nil;
|
||||
}
|
||||
return [[RTCRtpTransceiver alloc] initWithFactory:self.factory
|
||||
nativeRtpTransceiver:nativeTransceiverOrError.MoveValue()];
|
||||
}
|
||||
|
||||
- (void)offerForConstraints:(RTCMediaConstraints *)constraints
|
||||
completionHandler:
|
||||
(void (^)(RTCSessionDescription *sessionDescription,
|
||||
NSError *error))completionHandler {
|
||||
rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
|
||||
observer(new rtc::RefCountedObject
|
||||
<webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
|
||||
webrtc::PeerConnectionInterface::RTCOfferAnswerOptions options;
|
||||
CopyConstraintsIntoOfferAnswerOptions(constraints.nativeConstraints.get(), &options);
|
||||
|
||||
_peerConnection->CreateOffer(observer, options);
|
||||
}
|
||||
|
||||
- (void)answerForConstraints:(RTCMediaConstraints *)constraints
|
||||
completionHandler:
|
||||
(void (^)(RTCSessionDescription *sessionDescription,
|
||||
NSError *error))completionHandler {
|
||||
rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
|
||||
observer(new rtc::RefCountedObject
|
||||
<webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
|
||||
webrtc::PeerConnectionInterface::RTCOfferAnswerOptions options;
|
||||
CopyConstraintsIntoOfferAnswerOptions(constraints.nativeConstraints.get(), &options);
|
||||
|
||||
_peerConnection->CreateAnswer(observer, options);
|
||||
}
|
||||
|
||||
- (void)setLocalDescription:(RTCSessionDescription *)sdp
|
||||
completionHandler:(void (^)(NSError *error))completionHandler {
|
||||
rtc::scoped_refptr<webrtc::SetSessionDescriptionObserverAdapter> observer(
|
||||
new rtc::RefCountedObject<webrtc::SetSessionDescriptionObserverAdapter>(
|
||||
completionHandler));
|
||||
_peerConnection->SetLocalDescription(observer, sdp.nativeDescription);
|
||||
}
|
||||
|
||||
- (void)setRemoteDescription:(RTCSessionDescription *)sdp
|
||||
completionHandler:(void (^)(NSError *error))completionHandler {
|
||||
rtc::scoped_refptr<webrtc::SetSessionDescriptionObserverAdapter> observer(
|
||||
new rtc::RefCountedObject<webrtc::SetSessionDescriptionObserverAdapter>(
|
||||
completionHandler));
|
||||
_peerConnection->SetRemoteDescription(observer, sdp.nativeDescription);
|
||||
}
|
||||
|
||||
- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps
|
||||
currentBitrateBps:(nullable NSNumber *)currentBitrateBps
|
||||
maxBitrateBps:(nullable NSNumber *)maxBitrateBps {
|
||||
webrtc::PeerConnectionInterface::BitrateParameters params;
|
||||
if (minBitrateBps != nil) {
|
||||
params.min_bitrate_bps = absl::optional<int>(minBitrateBps.intValue);
|
||||
}
|
||||
if (currentBitrateBps != nil) {
|
||||
params.current_bitrate_bps = absl::optional<int>(currentBitrateBps.intValue);
|
||||
}
|
||||
if (maxBitrateBps != nil) {
|
||||
params.max_bitrate_bps = absl::optional<int>(maxBitrateBps.intValue);
|
||||
}
|
||||
return _peerConnection->SetBitrate(params).ok();
|
||||
}
|
||||
|
||||
- (void)setBitrateAllocationStrategy:
|
||||
(std::unique_ptr<rtc::BitrateAllocationStrategy>)bitrateAllocationStrategy {
|
||||
_peerConnection->SetBitrateAllocationStrategy(std::move(bitrateAllocationStrategy));
|
||||
}
|
||||
|
||||
- (BOOL)startRtcEventLogWithFilePath:(NSString *)filePath
|
||||
maxSizeInBytes:(int64_t)maxSizeInBytes {
|
||||
RTC_DCHECK(filePath.length);
|
||||
RTC_DCHECK_GT(maxSizeInBytes, 0);
|
||||
RTC_DCHECK(!_hasStartedRtcEventLog);
|
||||
if (_hasStartedRtcEventLog) {
|
||||
RTCLogError(@"Event logging already started.");
|
||||
return NO;
|
||||
}
|
||||
int fd = open(filePath.UTF8String, O_WRONLY | O_CREAT | O_TRUNC,
|
||||
S_IRUSR | S_IWUSR);
|
||||
if (fd < 0) {
|
||||
RTCLogError(@"Error opening file: %@. Error: %d", filePath, errno);
|
||||
return NO;
|
||||
}
|
||||
_hasStartedRtcEventLog =
|
||||
_peerConnection->StartRtcEventLog(fd, maxSizeInBytes);
|
||||
return _hasStartedRtcEventLog;
|
||||
}
|
||||
|
||||
- (void)stopRtcEventLog {
|
||||
_peerConnection->StopRtcEventLog();
|
||||
_hasStartedRtcEventLog = NO;
|
||||
}
|
||||
|
||||
- (RTCRtpSender *)senderWithKind:(NSString *)kind
|
||||
streamId:(NSString *)streamId {
|
||||
std::string nativeKind = [NSString stdStringForString:kind];
|
||||
std::string nativeStreamId = [NSString stdStringForString:streamId];
|
||||
rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeSender(
|
||||
_peerConnection->CreateSender(nativeKind, nativeStreamId));
|
||||
return nativeSender ?
|
||||
[[RTCRtpSender alloc] initWithFactory:self.factory nativeRtpSender:nativeSender] :
|
||||
nil;
|
||||
}
|
||||
|
||||
- (NSArray<RTCRtpSender *> *)senders {
|
||||
std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenders(
|
||||
_peerConnection->GetSenders());
|
||||
NSMutableArray *senders = [[NSMutableArray alloc] init];
|
||||
for (const auto &nativeSender : nativeSenders) {
|
||||
RTCRtpSender *sender =
|
||||
[[RTCRtpSender alloc] initWithFactory:self.factory nativeRtpSender:nativeSender];
|
||||
[senders addObject:sender];
|
||||
}
|
||||
return senders;
|
||||
}
|
||||
|
||||
- (NSArray<RTCRtpReceiver *> *)receivers {
|
||||
std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> nativeReceivers(
|
||||
_peerConnection->GetReceivers());
|
||||
NSMutableArray *receivers = [[NSMutableArray alloc] init];
|
||||
for (const auto &nativeReceiver : nativeReceivers) {
|
||||
RTCRtpReceiver *receiver =
|
||||
[[RTCRtpReceiver alloc] initWithFactory:self.factory nativeRtpReceiver:nativeReceiver];
|
||||
[receivers addObject:receiver];
|
||||
}
|
||||
return receivers;
|
||||
}
|
||||
|
||||
- (NSArray<RTCRtpTransceiver *> *)transceivers {
|
||||
std::vector<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>> nativeTransceivers(
|
||||
_peerConnection->GetTransceivers());
|
||||
NSMutableArray *transceivers = [[NSMutableArray alloc] init];
|
||||
for (auto nativeTransceiver : nativeTransceivers) {
|
||||
RTCRtpTransceiver *transceiver = [[RTCRtpTransceiver alloc] initWithFactory:self.factory
|
||||
nativeRtpTransceiver:nativeTransceiver];
|
||||
[transceivers addObject:transceiver];
|
||||
}
|
||||
return transceivers;
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
|
||||
(RTCSignalingState)state {
|
||||
switch (state) {
|
||||
case RTCSignalingStateStable:
|
||||
return webrtc::PeerConnectionInterface::kStable;
|
||||
case RTCSignalingStateHaveLocalOffer:
|
||||
return webrtc::PeerConnectionInterface::kHaveLocalOffer;
|
||||
case RTCSignalingStateHaveLocalPrAnswer:
|
||||
return webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
|
||||
case RTCSignalingStateHaveRemoteOffer:
|
||||
return webrtc::PeerConnectionInterface::kHaveRemoteOffer;
|
||||
case RTCSignalingStateHaveRemotePrAnswer:
|
||||
return webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
|
||||
case RTCSignalingStateClosed:
|
||||
return webrtc::PeerConnectionInterface::kClosed;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCSignalingState)signalingStateForNativeState:
|
||||
(webrtc::PeerConnectionInterface::SignalingState)nativeState {
|
||||
switch (nativeState) {
|
||||
case webrtc::PeerConnectionInterface::kStable:
|
||||
return RTCSignalingStateStable;
|
||||
case webrtc::PeerConnectionInterface::kHaveLocalOffer:
|
||||
return RTCSignalingStateHaveLocalOffer;
|
||||
case webrtc::PeerConnectionInterface::kHaveLocalPrAnswer:
|
||||
return RTCSignalingStateHaveLocalPrAnswer;
|
||||
case webrtc::PeerConnectionInterface::kHaveRemoteOffer:
|
||||
return RTCSignalingStateHaveRemoteOffer;
|
||||
case webrtc::PeerConnectionInterface::kHaveRemotePrAnswer:
|
||||
return RTCSignalingStateHaveRemotePrAnswer;
|
||||
case webrtc::PeerConnectionInterface::kClosed:
|
||||
return RTCSignalingStateClosed;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForSignalingState:(RTCSignalingState)state {
|
||||
switch (state) {
|
||||
case RTCSignalingStateStable:
|
||||
return @"STABLE";
|
||||
case RTCSignalingStateHaveLocalOffer:
|
||||
return @"HAVE_LOCAL_OFFER";
|
||||
case RTCSignalingStateHaveLocalPrAnswer:
|
||||
return @"HAVE_LOCAL_PRANSWER";
|
||||
case RTCSignalingStateHaveRemoteOffer:
|
||||
return @"HAVE_REMOTE_OFFER";
|
||||
case RTCSignalingStateHaveRemotePrAnswer:
|
||||
return @"HAVE_REMOTE_PRANSWER";
|
||||
case RTCSignalingStateClosed:
|
||||
return @"CLOSED";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::IceConnectionState)
|
||||
nativeIceConnectionStateForState:(RTCIceConnectionState)state {
|
||||
switch (state) {
|
||||
case RTCIceConnectionStateNew:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionNew;
|
||||
case RTCIceConnectionStateChecking:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionChecking;
|
||||
case RTCIceConnectionStateConnected:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionConnected;
|
||||
case RTCIceConnectionStateCompleted:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionCompleted;
|
||||
case RTCIceConnectionStateFailed:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionFailed;
|
||||
case RTCIceConnectionStateDisconnected:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
|
||||
case RTCIceConnectionStateClosed:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionClosed;
|
||||
case RTCIceConnectionStateCount:
|
||||
return webrtc::PeerConnectionInterface::kIceConnectionMax;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCIceConnectionState)iceConnectionStateForNativeState:
|
||||
(webrtc::PeerConnectionInterface::IceConnectionState)nativeState {
|
||||
switch (nativeState) {
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionNew:
|
||||
return RTCIceConnectionStateNew;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionChecking:
|
||||
return RTCIceConnectionStateChecking;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionConnected:
|
||||
return RTCIceConnectionStateConnected;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionCompleted:
|
||||
return RTCIceConnectionStateCompleted;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionFailed:
|
||||
return RTCIceConnectionStateFailed;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionDisconnected:
|
||||
return RTCIceConnectionStateDisconnected;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionClosed:
|
||||
return RTCIceConnectionStateClosed;
|
||||
case webrtc::PeerConnectionInterface::kIceConnectionMax:
|
||||
return RTCIceConnectionStateCount;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state {
|
||||
switch (state) {
|
||||
case RTCIceConnectionStateNew:
|
||||
return @"NEW";
|
||||
case RTCIceConnectionStateChecking:
|
||||
return @"CHECKING";
|
||||
case RTCIceConnectionStateConnected:
|
||||
return @"CONNECTED";
|
||||
case RTCIceConnectionStateCompleted:
|
||||
return @"COMPLETED";
|
||||
case RTCIceConnectionStateFailed:
|
||||
return @"FAILED";
|
||||
case RTCIceConnectionStateDisconnected:
|
||||
return @"DISCONNECTED";
|
||||
case RTCIceConnectionStateClosed:
|
||||
return @"CLOSED";
|
||||
case RTCIceConnectionStateCount:
|
||||
return @"COUNT";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::IceGatheringState)
|
||||
nativeIceGatheringStateForState:(RTCIceGatheringState)state {
|
||||
switch (state) {
|
||||
case RTCIceGatheringStateNew:
|
||||
return webrtc::PeerConnectionInterface::kIceGatheringNew;
|
||||
case RTCIceGatheringStateGathering:
|
||||
return webrtc::PeerConnectionInterface::kIceGatheringGathering;
|
||||
case RTCIceGatheringStateComplete:
|
||||
return webrtc::PeerConnectionInterface::kIceGatheringComplete;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCIceGatheringState)iceGatheringStateForNativeState:
|
||||
(webrtc::PeerConnectionInterface::IceGatheringState)nativeState {
|
||||
switch (nativeState) {
|
||||
case webrtc::PeerConnectionInterface::kIceGatheringNew:
|
||||
return RTCIceGatheringStateNew;
|
||||
case webrtc::PeerConnectionInterface::kIceGatheringGathering:
|
||||
return RTCIceGatheringStateGathering;
|
||||
case webrtc::PeerConnectionInterface::kIceGatheringComplete:
|
||||
return RTCIceGatheringStateComplete;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForIceGatheringState:(RTCIceGatheringState)state {
|
||||
switch (state) {
|
||||
case RTCIceGatheringStateNew:
|
||||
return @"NEW";
|
||||
case RTCIceGatheringStateGathering:
|
||||
return @"GATHERING";
|
||||
case RTCIceGatheringStateComplete:
|
||||
return @"COMPLETE";
|
||||
}
|
||||
}
|
||||
|
||||
+ (webrtc::PeerConnectionInterface::StatsOutputLevel)
|
||||
nativeStatsOutputLevelForLevel:(RTCStatsOutputLevel)level {
|
||||
switch (level) {
|
||||
case RTCStatsOutputLevelStandard:
|
||||
return webrtc::PeerConnectionInterface::kStatsOutputLevelStandard;
|
||||
case RTCStatsOutputLevelDebug:
|
||||
return webrtc::PeerConnectionInterface::kStatsOutputLevelDebug;
|
||||
}
|
||||
}
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::PeerConnectionInterface>)nativePeerConnection {
|
||||
return _peerConnection;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -8,47 +8,4 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCPeerConnectionFactory.h"
|
||||
|
||||
#include "rtc_base/scoped_ref_ptr.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class AudioDeviceModule;
|
||||
class AudioEncoderFactory;
|
||||
class AudioDecoderFactory;
|
||||
class VideoEncoderFactory;
|
||||
class VideoDecoderFactory;
|
||||
class AudioProcessing;
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* This class extension exposes methods that work directly with injectable C++ components.
|
||||
*/
|
||||
@interface RTCPeerConnectionFactory ()
|
||||
|
||||
- (instancetype)initNative NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
/* Initializer used when WebRTC is compiled with no media support */
|
||||
- (instancetype)initWithNoMedia;
|
||||
|
||||
/* Initialize object with injectable native audio/video encoder/decoder factories */
|
||||
- (instancetype)initWithNativeAudioEncoderFactory:
|
||||
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
|
||||
nativeAudioDecoderFactory:
|
||||
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
|
||||
nativeVideoEncoderFactory:
|
||||
(std::unique_ptr<webrtc::VideoEncoderFactory>)videoEncoderFactory
|
||||
nativeVideoDecoderFactory:
|
||||
(std::unique_ptr<webrtc::VideoDecoderFactory>)videoDecoderFactory
|
||||
audioDeviceModule:
|
||||
(nullable webrtc::AudioDeviceModule *)audioDeviceModule
|
||||
audioProcessingModule:
|
||||
(rtc::scoped_refptr<webrtc::AudioProcessing>)audioProcessingModule;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
#import "api/peerconnection/RTCPeerConnectionFactory+Native.h"
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCPeerConnectionFactory.h"
|
||||
|
||||
#include "api/peerconnectioninterface.h"
|
||||
#include "rtc_base/scoped_ref_ptr.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCPeerConnectionFactory ()
|
||||
|
||||
/**
|
||||
* PeerConnectionFactoryInterface created and held by this
|
||||
* RTCPeerConnectionFactory object. This is needed to pass to the underlying
|
||||
* C++ APIs.
|
||||
*/
|
||||
@property(nonatomic, readonly)
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
|
||||
nativeFactory;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,256 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnectionFactory+Native.h"
|
||||
#import "RTCPeerConnectionFactory+Private.h"
|
||||
#import "RTCPeerConnectionFactoryOptions+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCAudioSource+Private.h"
|
||||
#import "RTCAudioTrack+Private.h"
|
||||
#import "RTCMediaConstraints+Private.h"
|
||||
#import "RTCMediaStream+Private.h"
|
||||
#import "RTCPeerConnection+Private.h"
|
||||
#import "RTCVideoSource+Private.h"
|
||||
#import "RTCVideoTrack+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
#import "WebRTC/RTCVideoCodecFactory.h"
|
||||
#ifndef HAVE_NO_MEDIA
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
// The no-media version PeerConnectionFactory doesn't depend on these files, but the gn check tool
|
||||
// is not smart enough to take the #ifdef into account.
|
||||
#include "api/audio_codecs/builtin_audio_decoder_factory.h" // nogncheck
|
||||
#include "api/audio_codecs/builtin_audio_encoder_factory.h" // nogncheck
|
||||
#include "media/engine/convert_legacy_video_factory.h" // nogncheck
|
||||
#include "modules/audio_device/include/audio_device.h" // nogncheck
|
||||
#include "modules/audio_processing/include/audio_processing.h" // nogncheck
|
||||
|
||||
#include "sdk/objc/Framework/Native/api/video_decoder_factory.h"
|
||||
#include "sdk/objc/Framework/Native/api/video_encoder_factory.h"
|
||||
#include "sdk/objc/Framework/Native/src/objc_video_decoder_factory.h"
|
||||
#include "sdk/objc/Framework/Native/src/objc_video_encoder_factory.h"
|
||||
#endif
|
||||
|
||||
#if defined(WEBRTC_IOS)
|
||||
#import "sdk/objc/Framework/Native/api/audio_device_module.h"
|
||||
#endif
|
||||
|
||||
// Adding the nogncheck to disable the including header check.
|
||||
// The no-media version PeerConnectionFactory doesn't depend on media related
|
||||
// C++ target.
|
||||
// TODO(zhihuang): Remove nogncheck once MediaEngineInterface is moved to C++
|
||||
// API layer.
|
||||
#include "absl/memory/memory.h"
|
||||
#include "media/engine/webrtcmediaengine.h" // nogncheck
|
||||
|
||||
@implementation RTCPeerConnectionFactory {
|
||||
std::unique_ptr<rtc::Thread> _networkThread;
|
||||
std::unique_ptr<rtc::Thread> _workerThread;
|
||||
std::unique_ptr<rtc::Thread> _signalingThread;
|
||||
BOOL _hasStartedAecDump;
|
||||
}
|
||||
|
||||
@synthesize nativeFactory = _nativeFactory;
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::AudioDeviceModule>)audioDeviceModule {
|
||||
#if defined(WEBRTC_IOS)
|
||||
return webrtc::CreateAudioDeviceModule();
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
#ifdef HAVE_NO_MEDIA
|
||||
return [self initWithNoMedia];
|
||||
#else
|
||||
return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
|
||||
nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
|
||||
nativeVideoEncoderFactory:webrtc::ObjCToNativeVideoEncoderFactory(
|
||||
[[RTCVideoEncoderFactoryH264 alloc] init])
|
||||
nativeVideoDecoderFactory:webrtc::ObjCToNativeVideoDecoderFactory(
|
||||
[[RTCVideoDecoderFactoryH264 alloc] init])
|
||||
audioDeviceModule:[self audioDeviceModule]
|
||||
audioProcessingModule:nullptr];
|
||||
#endif
|
||||
}
|
||||
|
||||
- (instancetype)initWithEncoderFactory:(nullable id<RTCVideoEncoderFactory>)encoderFactory
|
||||
decoderFactory:(nullable id<RTCVideoDecoderFactory>)decoderFactory {
|
||||
#ifdef HAVE_NO_MEDIA
|
||||
return [self initWithNoMedia];
|
||||
#else
|
||||
std::unique_ptr<webrtc::VideoEncoderFactory> native_encoder_factory;
|
||||
std::unique_ptr<webrtc::VideoDecoderFactory> native_decoder_factory;
|
||||
if (encoderFactory) {
|
||||
native_encoder_factory = webrtc::ObjCToNativeVideoEncoderFactory(encoderFactory);
|
||||
}
|
||||
if (decoderFactory) {
|
||||
native_decoder_factory = webrtc::ObjCToNativeVideoDecoderFactory(decoderFactory);
|
||||
}
|
||||
return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
|
||||
nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
|
||||
nativeVideoEncoderFactory:std::move(native_encoder_factory)
|
||||
nativeVideoDecoderFactory:std::move(native_decoder_factory)
|
||||
audioDeviceModule:[self audioDeviceModule]
|
||||
audioProcessingModule:nullptr];
|
||||
#endif
|
||||
}
|
||||
|
||||
- (instancetype)initNative {
|
||||
if (self = [super init]) {
|
||||
_networkThread = rtc::Thread::CreateWithSocketServer();
|
||||
_networkThread->SetName("network_thread", _networkThread.get());
|
||||
BOOL result = _networkThread->Start();
|
||||
NSAssert(result, @"Failed to start network thread.");
|
||||
|
||||
_workerThread = rtc::Thread::Create();
|
||||
_workerThread->SetName("worker_thread", _workerThread.get());
|
||||
result = _workerThread->Start();
|
||||
NSAssert(result, @"Failed to start worker thread.");
|
||||
|
||||
_signalingThread = rtc::Thread::Create();
|
||||
_signalingThread->SetName("signaling_thread", _signalingThread.get());
|
||||
result = _signalingThread->Start();
|
||||
NSAssert(result, @"Failed to start signaling thread.");
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNoMedia {
|
||||
if (self = [self initNative]) {
|
||||
_nativeFactory = webrtc::CreateModularPeerConnectionFactory(
|
||||
_networkThread.get(),
|
||||
_workerThread.get(),
|
||||
_signalingThread.get(),
|
||||
std::unique_ptr<cricket::MediaEngineInterface>(),
|
||||
std::unique_ptr<webrtc::CallFactoryInterface>(),
|
||||
std::unique_ptr<webrtc::RtcEventLogFactoryInterface>());
|
||||
NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!");
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeAudioEncoderFactory:
|
||||
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
|
||||
nativeAudioDecoderFactory:
|
||||
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
|
||||
nativeVideoEncoderFactory:
|
||||
(std::unique_ptr<webrtc::VideoEncoderFactory>)videoEncoderFactory
|
||||
nativeVideoDecoderFactory:
|
||||
(std::unique_ptr<webrtc::VideoDecoderFactory>)videoDecoderFactory
|
||||
audioDeviceModule:
|
||||
(nullable webrtc::AudioDeviceModule *)audioDeviceModule
|
||||
audioProcessingModule:
|
||||
(rtc::scoped_refptr<webrtc::AudioProcessing>)audioProcessingModule {
|
||||
#ifdef HAVE_NO_MEDIA
|
||||
return [self initWithNoMedia];
|
||||
#else
|
||||
if (self = [self initNative]) {
|
||||
_nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(),
|
||||
_workerThread.get(),
|
||||
_signalingThread.get(),
|
||||
audioDeviceModule,
|
||||
audioEncoderFactory,
|
||||
audioDecoderFactory,
|
||||
std::move(videoEncoderFactory),
|
||||
std::move(videoDecoderFactory),
|
||||
nullptr, // audio mixer
|
||||
audioProcessingModule);
|
||||
NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!");
|
||||
}
|
||||
return self;
|
||||
#endif
|
||||
}
|
||||
|
||||
- (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints {
|
||||
std::unique_ptr<webrtc::MediaConstraints> nativeConstraints;
|
||||
if (constraints) {
|
||||
nativeConstraints = constraints.nativeConstraints;
|
||||
}
|
||||
cricket::AudioOptions options;
|
||||
CopyConstraintsIntoAudioOptions(nativeConstraints.get(), &options);
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
|
||||
_nativeFactory->CreateAudioSource(options);
|
||||
return [[RTCAudioSource alloc] initWithFactory:self nativeAudioSource:source];
|
||||
}
|
||||
|
||||
- (RTCAudioTrack *)audioTrackWithTrackId:(NSString *)trackId {
|
||||
RTCAudioSource *audioSource = [self audioSourceWithConstraints:nil];
|
||||
return [self audioTrackWithSource:audioSource trackId:trackId];
|
||||
}
|
||||
|
||||
- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source
|
||||
trackId:(NSString *)trackId {
|
||||
return [[RTCAudioTrack alloc] initWithFactory:self
|
||||
source:source
|
||||
trackId:trackId];
|
||||
}
|
||||
|
||||
- (RTCVideoSource *)videoSource {
|
||||
return [[RTCVideoSource alloc] initWithFactory:self
|
||||
signalingThread:_signalingThread.get()
|
||||
workerThread:_workerThread.get()];
|
||||
}
|
||||
|
||||
- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source
|
||||
trackId:(NSString *)trackId {
|
||||
return [[RTCVideoTrack alloc] initWithFactory:self
|
||||
source:source
|
||||
trackId:trackId];
|
||||
}
|
||||
|
||||
- (RTCMediaStream *)mediaStreamWithStreamId:(NSString *)streamId {
|
||||
return [[RTCMediaStream alloc] initWithFactory:self
|
||||
streamId:streamId];
|
||||
}
|
||||
|
||||
- (RTCPeerConnection *)peerConnectionWithConfiguration:
|
||||
(RTCConfiguration *)configuration
|
||||
constraints:
|
||||
(RTCMediaConstraints *)constraints
|
||||
delegate:
|
||||
(nullable id<RTCPeerConnectionDelegate>)delegate {
|
||||
return [[RTCPeerConnection alloc] initWithFactory:self
|
||||
configuration:configuration
|
||||
constraints:constraints
|
||||
delegate:delegate];
|
||||
}
|
||||
|
||||
- (void)setOptions:(nonnull RTCPeerConnectionFactoryOptions *)options {
|
||||
RTC_DCHECK(options != nil);
|
||||
_nativeFactory->SetOptions(options.nativeOptions);
|
||||
}
|
||||
|
||||
- (BOOL)startAecDumpWithFilePath:(NSString *)filePath
|
||||
maxSizeInBytes:(int64_t)maxSizeInBytes {
|
||||
RTC_DCHECK(filePath.length);
|
||||
RTC_DCHECK_GT(maxSizeInBytes, 0);
|
||||
|
||||
if (_hasStartedAecDump) {
|
||||
RTCLogError(@"Aec dump already started.");
|
||||
return NO;
|
||||
}
|
||||
int fd = open(filePath.UTF8String, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
|
||||
if (fd < 0) {
|
||||
RTCLogError(@"Error opening file: %@. Error: %d", filePath, errno);
|
||||
return NO;
|
||||
}
|
||||
_hasStartedAecDump = _nativeFactory->StartAecDump(fd, maxSizeInBytes);
|
||||
return _hasStartedAecDump;
|
||||
}
|
||||
|
||||
- (void)stopAecDump {
|
||||
_nativeFactory->StopAecDump();
|
||||
_hasStartedAecDump = NO;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnectionFactoryBuilder.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCPeerConnectionFactoryBuilder (DefaultComponents)
|
||||
|
||||
+ (RTCPeerConnectionFactoryBuilder *)defaultBuilder;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnectionFactory+Native.h"
|
||||
#import "RTCPeerConnectionFactoryBuilder+DefaultComponents.h"
|
||||
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
|
||||
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
|
||||
#include "sdk/objc/Framework/Native/api/video_decoder_factory.h"
|
||||
#include "sdk/objc/Framework/Native/api/video_encoder_factory.h"
|
||||
|
||||
#if defined(WEBRTC_IOS)
|
||||
#import "sdk/objc/Framework/Native/api/audio_device_module.h"
|
||||
#endif
|
||||
|
||||
@implementation RTCPeerConnectionFactoryBuilder (DefaultComponents)
|
||||
|
||||
+ (RTCPeerConnectionFactoryBuilder *)defaultBuilder {
|
||||
RTCPeerConnectionFactoryBuilder *builder = [[RTCPeerConnectionFactoryBuilder alloc] init];
|
||||
auto audioEncoderFactory = webrtc::CreateBuiltinAudioEncoderFactory();
|
||||
[builder setAudioEncoderFactory:audioEncoderFactory];
|
||||
|
||||
auto audioDecoderFactory = webrtc::CreateBuiltinAudioDecoderFactory();
|
||||
[builder setAudioDecoderFactory:audioDecoderFactory];
|
||||
|
||||
auto videoEncoderFactory =
|
||||
webrtc::ObjCToNativeVideoEncoderFactory([[RTCVideoEncoderFactoryH264 alloc] init]);
|
||||
[builder setVideoEncoderFactory:std::move(videoEncoderFactory)];
|
||||
|
||||
auto videoDecoderFactory =
|
||||
webrtc::ObjCToNativeVideoDecoderFactory([[RTCVideoDecoderFactoryH264 alloc] init]);
|
||||
[builder setVideoDecoderFactory:std::move(videoDecoderFactory)];
|
||||
|
||||
#if defined(WEBRTC_IOS)
|
||||
[builder setAudioDeviceModule:webrtc::CreateAudioDeviceModule()];
|
||||
#endif
|
||||
return builder;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCPeerConnectionFactory.h"
|
||||
|
||||
#include "rtc_base/scoped_ref_ptr.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class AudioDeviceModule;
|
||||
class AudioEncoderFactory;
|
||||
class AudioDecoderFactory;
|
||||
class VideoEncoderFactory;
|
||||
class VideoDecoderFactory;
|
||||
class AudioProcessing;
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCPeerConnectionFactoryBuilder : NSObject
|
||||
|
||||
+ (RTCPeerConnectionFactoryBuilder *)builder;
|
||||
|
||||
- (RTCPeerConnectionFactory *)createPeerConnectionFactory;
|
||||
|
||||
- (void)setVideoEncoderFactory:(std::unique_ptr<webrtc::VideoEncoderFactory>)videoEncoderFactory;
|
||||
|
||||
- (void)setVideoDecoderFactory:(std::unique_ptr<webrtc::VideoDecoderFactory>)videoDecoderFactory;
|
||||
|
||||
- (void)setAudioEncoderFactory:(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory;
|
||||
|
||||
- (void)setAudioDecoderFactory:(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory;
|
||||
|
||||
- (void)setAudioDeviceModule:(rtc::scoped_refptr<webrtc::AudioDeviceModule>)audioDeviceModule;
|
||||
|
||||
- (void)setAudioProcessingModule:(rtc::scoped_refptr<webrtc::AudioProcessing>)audioProcessingModule;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnectionFactoryBuilder.h"
|
||||
#import "RTCPeerConnectionFactory+Native.h"
|
||||
|
||||
#include "api/audio_codecs/audio_decoder_factory.h"
|
||||
#include "api/audio_codecs/audio_encoder_factory.h"
|
||||
#include "api/video_codecs/video_decoder_factory.h"
|
||||
#include "api/video_codecs/video_encoder_factory.h"
|
||||
#include "modules/audio_device/include/audio_device.h"
|
||||
#include "modules/audio_processing/include/audio_processing.h"
|
||||
|
||||
@implementation RTCPeerConnectionFactoryBuilder {
|
||||
std::unique_ptr<webrtc::VideoEncoderFactory> _videoEncoderFactory;
|
||||
std::unique_ptr<webrtc::VideoDecoderFactory> _videoDecoderFactory;
|
||||
rtc::scoped_refptr<webrtc::AudioEncoderFactory> _audioEncoderFactory;
|
||||
rtc::scoped_refptr<webrtc::AudioDecoderFactory> _audioDecoderFactory;
|
||||
rtc::scoped_refptr<webrtc::AudioDeviceModule> _audioDeviceModule;
|
||||
rtc::scoped_refptr<webrtc::AudioProcessing> _audioProcessingModule;
|
||||
}
|
||||
|
||||
+ (RTCPeerConnectionFactoryBuilder *)builder {
|
||||
return [[RTCPeerConnectionFactoryBuilder alloc] init];
|
||||
}
|
||||
|
||||
- (RTCPeerConnectionFactory *)createPeerConnectionFactory {
|
||||
RTCPeerConnectionFactory *factory = [RTCPeerConnectionFactory alloc];
|
||||
return [factory initWithNativeAudioEncoderFactory:_audioEncoderFactory
|
||||
nativeAudioDecoderFactory:_audioDecoderFactory
|
||||
nativeVideoEncoderFactory:std::move(_videoEncoderFactory)
|
||||
nativeVideoDecoderFactory:std::move(_videoDecoderFactory)
|
||||
audioDeviceModule:_audioDeviceModule
|
||||
audioProcessingModule:_audioProcessingModule];
|
||||
}
|
||||
|
||||
- (void)setVideoEncoderFactory:(std::unique_ptr<webrtc::VideoEncoderFactory>)videoEncoderFactory {
|
||||
_videoEncoderFactory = std::move(videoEncoderFactory);
|
||||
}
|
||||
|
||||
- (void)setVideoDecoderFactory:(std::unique_ptr<webrtc::VideoDecoderFactory>)videoDecoderFactory {
|
||||
_videoDecoderFactory = std::move(videoDecoderFactory);
|
||||
}
|
||||
|
||||
- (void)setAudioEncoderFactory:
|
||||
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory {
|
||||
_audioEncoderFactory = audioEncoderFactory;
|
||||
}
|
||||
|
||||
- (void)setAudioDecoderFactory:
|
||||
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory {
|
||||
_audioDecoderFactory = audioDecoderFactory;
|
||||
}
|
||||
|
||||
- (void)setAudioDeviceModule:(rtc::scoped_refptr<webrtc::AudioDeviceModule>)audioDeviceModule {
|
||||
_audioDeviceModule = audioDeviceModule;
|
||||
}
|
||||
|
||||
- (void)setAudioProcessingModule:
|
||||
(rtc::scoped_refptr<webrtc::AudioProcessing>)audioProcessingModule {
|
||||
_audioProcessingModule = audioProcessingModule;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,26 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCPeerConnectionFactoryOptions.h"
|
||||
|
||||
#include "api/peerconnectioninterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCPeerConnectionFactoryOptions ()
|
||||
|
||||
/** Returns the equivalent native PeerConnectionFactoryInterface::Options
|
||||
* structure. */
|
||||
@property(nonatomic, readonly)
|
||||
webrtc::PeerConnectionFactoryInterface::Options nativeOptions;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCPeerConnectionFactoryOptions+Private.h"
|
||||
|
||||
#include "rtc_base/network_constants.h"
|
||||
|
||||
namespace {
|
||||
|
||||
void setNetworkBit(webrtc::PeerConnectionFactoryInterface::Options* options,
|
||||
rtc::AdapterType type,
|
||||
bool ignore) {
|
||||
if (ignore) {
|
||||
options->network_ignore_mask |= type;
|
||||
} else {
|
||||
options->network_ignore_mask &= ~type;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@implementation RTCPeerConnectionFactoryOptions
|
||||
|
||||
@synthesize disableEncryption = _disableEncryption;
|
||||
@synthesize disableNetworkMonitor = _disableNetworkMonitor;
|
||||
@synthesize ignoreLoopbackNetworkAdapter = _ignoreLoopbackNetworkAdapter;
|
||||
@synthesize ignoreVPNNetworkAdapter = _ignoreVPNNetworkAdapter;
|
||||
@synthesize ignoreCellularNetworkAdapter = _ignoreCellularNetworkAdapter;
|
||||
@synthesize ignoreWiFiNetworkAdapter = _ignoreWiFiNetworkAdapter;
|
||||
@synthesize ignoreEthernetNetworkAdapter = _ignoreEthernetNetworkAdapter;
|
||||
@synthesize enableAes128Sha1_32CryptoCipher = _enableAes128Sha1_32CryptoCipher;
|
||||
@synthesize enableGcmCryptoSuites = _enableGcmCryptoSuites;
|
||||
|
||||
- (instancetype)init {
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (webrtc::PeerConnectionFactoryInterface::Options)nativeOptions {
|
||||
webrtc::PeerConnectionFactoryInterface::Options options;
|
||||
options.disable_encryption = self.disableEncryption;
|
||||
options.disable_network_monitor = self.disableNetworkMonitor;
|
||||
|
||||
setNetworkBit(&options, rtc::ADAPTER_TYPE_LOOPBACK, self.ignoreLoopbackNetworkAdapter);
|
||||
setNetworkBit(&options, rtc::ADAPTER_TYPE_VPN, self.ignoreVPNNetworkAdapter);
|
||||
setNetworkBit(&options, rtc::ADAPTER_TYPE_CELLULAR, self.ignoreCellularNetworkAdapter);
|
||||
setNetworkBit(&options, rtc::ADAPTER_TYPE_WIFI, self.ignoreWiFiNetworkAdapter);
|
||||
setNetworkBit(&options, rtc::ADAPTER_TYPE_ETHERNET, self.ignoreEthernetNetworkAdapter);
|
||||
|
||||
options.crypto_options.enable_aes128_sha1_32_crypto_cipher = self.enableAes128Sha1_32CryptoCipher;
|
||||
options.crypto_options.enable_gcm_crypto_suites = self.enableGcmCryptoSuites;
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtcpParameters.h"
|
||||
|
||||
#include "api/rtpparameters.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCRtcpParameters ()
|
||||
|
||||
/** Returns the equivalent native RtcpParameters structure. */
|
||||
@property(nonatomic, readonly) webrtc::RtcpParameters nativeParameters;
|
||||
|
||||
/** Initialize the object with a native RtcpParameters structure. */
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtcpParameters &)nativeParameters;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtcpParameters+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
@implementation RTCRtcpParameters
|
||||
|
||||
@synthesize cname = _cname;
|
||||
@synthesize isReducedSize = _isReducedSize;
|
||||
|
||||
- (instancetype)init {
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtcpParameters &)nativeParameters {
|
||||
if (self = [self init]) {
|
||||
_cname = [NSString stringForStdString:nativeParameters.cname];
|
||||
_isReducedSize = nativeParameters.reduced_size;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::RtcpParameters)nativeParameters {
|
||||
webrtc::RtcpParameters parameters;
|
||||
parameters.cname = [NSString stdStringForString:_cname];
|
||||
parameters.reduced_size = _isReducedSize;
|
||||
return parameters;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpCodecParameters.h"
|
||||
|
||||
#include "api/rtpparameters.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCRtpCodecParameters ()
|
||||
|
||||
/** Returns the equivalent native RtpCodecParameters structure. */
|
||||
@property(nonatomic, readonly) webrtc::RtpCodecParameters nativeParameters;
|
||||
|
||||
/** Initialize the object with a native RtpCodecParameters structure. */
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtpCodecParameters &)nativeParameters;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,109 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpCodecParameters+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "WebRTC/RTCMediaStreamTrack.h" // For "kind" strings.
|
||||
|
||||
#include "media/base/mediaconstants.h"
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
const NSString * const kRTCRtxCodecName = @(cricket::kRtxCodecName);
|
||||
const NSString * const kRTCRedCodecName = @(cricket::kRedCodecName);
|
||||
const NSString * const kRTCUlpfecCodecName = @(cricket::kUlpfecCodecName);
|
||||
const NSString * const kRTCFlexfecCodecName = @(cricket::kFlexfecCodecName);
|
||||
const NSString * const kRTCOpusCodecName = @(cricket::kOpusCodecName);
|
||||
const NSString * const kRTCIsacCodecName = @(cricket::kIsacCodecName);
|
||||
const NSString * const kRTCL16CodecName = @(cricket::kL16CodecName);
|
||||
const NSString * const kRTCG722CodecName = @(cricket::kG722CodecName);
|
||||
const NSString * const kRTCIlbcCodecName = @(cricket::kIlbcCodecName);
|
||||
const NSString * const kRTCPcmuCodecName = @(cricket::kPcmuCodecName);
|
||||
const NSString * const kRTCPcmaCodecName = @(cricket::kPcmaCodecName);
|
||||
const NSString * const kRTCDtmfCodecName = @(cricket::kDtmfCodecName);
|
||||
const NSString * const kRTCComfortNoiseCodecName =
|
||||
@(cricket::kComfortNoiseCodecName);
|
||||
const NSString * const kRTCVp8CodecName = @(cricket::kVp8CodecName);
|
||||
const NSString * const kRTCVp9CodecName = @(cricket::kVp9CodecName);
|
||||
const NSString * const kRTCH264CodecName = @(cricket::kH264CodecName);
|
||||
|
||||
@implementation RTCRtpCodecParameters
|
||||
|
||||
@synthesize payloadType = _payloadType;
|
||||
@synthesize name = _name;
|
||||
@synthesize kind = _kind;
|
||||
@synthesize clockRate = _clockRate;
|
||||
@synthesize numChannels = _numChannels;
|
||||
@synthesize parameters = _parameters;
|
||||
|
||||
- (instancetype)init {
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeParameters:
|
||||
(const webrtc::RtpCodecParameters &)nativeParameters {
|
||||
if (self = [self init]) {
|
||||
_payloadType = nativeParameters.payload_type;
|
||||
_name = [NSString stringForStdString:nativeParameters.name];
|
||||
switch (nativeParameters.kind) {
|
||||
case cricket::MEDIA_TYPE_AUDIO:
|
||||
_kind = kRTCMediaStreamTrackKindAudio;
|
||||
break;
|
||||
case cricket::MEDIA_TYPE_VIDEO:
|
||||
_kind = kRTCMediaStreamTrackKindVideo;
|
||||
break;
|
||||
case cricket::MEDIA_TYPE_DATA:
|
||||
RTC_NOTREACHED();
|
||||
break;
|
||||
}
|
||||
if (nativeParameters.clock_rate) {
|
||||
_clockRate = [NSNumber numberWithInt:*nativeParameters.clock_rate];
|
||||
}
|
||||
if (nativeParameters.num_channels) {
|
||||
_numChannels = [NSNumber numberWithInt:*nativeParameters.num_channels];
|
||||
}
|
||||
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
|
||||
for (const auto ¶meter : nativeParameters.parameters) {
|
||||
[parameters setObject:[NSString stringForStdString:parameter.second]
|
||||
forKey:[NSString stringForStdString:parameter.first]];
|
||||
}
|
||||
_parameters = parameters;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::RtpCodecParameters)nativeParameters {
|
||||
webrtc::RtpCodecParameters parameters;
|
||||
parameters.payload_type = _payloadType;
|
||||
parameters.name = [NSString stdStringForString:_name];
|
||||
// NSString pointer comparison is safe here since "kind" is readonly and only
|
||||
// populated above.
|
||||
if (_kind == kRTCMediaStreamTrackKindAudio) {
|
||||
parameters.kind = cricket::MEDIA_TYPE_AUDIO;
|
||||
} else if (_kind == kRTCMediaStreamTrackKindVideo) {
|
||||
parameters.kind = cricket::MEDIA_TYPE_VIDEO;
|
||||
} else {
|
||||
RTC_NOTREACHED();
|
||||
}
|
||||
if (_clockRate != nil) {
|
||||
parameters.clock_rate = absl::optional<int>(_clockRate.intValue);
|
||||
}
|
||||
if (_numChannels != nil) {
|
||||
parameters.num_channels = absl::optional<int>(_numChannels.intValue);
|
||||
}
|
||||
for (NSString *paramKey in _parameters.allKeys) {
|
||||
std::string key = [NSString stdStringForString:paramKey];
|
||||
std::string value = [NSString stdStringForString:_parameters[paramKey]];
|
||||
parameters.parameters[key] = value;
|
||||
}
|
||||
return parameters;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpEncodingParameters.h"
|
||||
|
||||
#include "api/rtpparameters.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCRtpEncodingParameters ()
|
||||
|
||||
/** Returns the equivalent native RtpEncodingParameters structure. */
|
||||
@property(nonatomic, readonly) webrtc::RtpEncodingParameters nativeParameters;
|
||||
|
||||
/** Initialize the object with a native RtpEncodingParameters structure. */
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtpEncodingParameters &)nativeParameters;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpEncodingParameters+Private.h"
|
||||
|
||||
@implementation RTCRtpEncodingParameters
|
||||
|
||||
@synthesize isActive = _isActive;
|
||||
@synthesize maxBitrateBps = _maxBitrateBps;
|
||||
@synthesize minBitrateBps = _minBitrateBps;
|
||||
@synthesize ssrc = _ssrc;
|
||||
|
||||
- (instancetype)init {
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeParameters:
|
||||
(const webrtc::RtpEncodingParameters &)nativeParameters {
|
||||
if (self = [self init]) {
|
||||
_isActive = nativeParameters.active;
|
||||
if (nativeParameters.max_bitrate_bps) {
|
||||
_maxBitrateBps =
|
||||
[NSNumber numberWithInt:*nativeParameters.max_bitrate_bps];
|
||||
}
|
||||
if (nativeParameters.min_bitrate_bps) {
|
||||
_minBitrateBps =
|
||||
[NSNumber numberWithInt:*nativeParameters.min_bitrate_bps];
|
||||
}
|
||||
if (nativeParameters.ssrc) {
|
||||
_ssrc = [NSNumber numberWithUnsignedLong:*nativeParameters.ssrc];
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::RtpEncodingParameters)nativeParameters {
|
||||
webrtc::RtpEncodingParameters parameters;
|
||||
parameters.active = _isActive;
|
||||
if (_maxBitrateBps != nil) {
|
||||
parameters.max_bitrate_bps = absl::optional<int>(_maxBitrateBps.intValue);
|
||||
}
|
||||
if (_minBitrateBps != nil) {
|
||||
parameters.min_bitrate_bps = absl::optional<int>(_minBitrateBps.intValue);
|
||||
}
|
||||
if (_ssrc != nil) {
|
||||
parameters.ssrc = absl::optional<uint32_t>(_ssrc.unsignedLongValue);
|
||||
}
|
||||
return parameters;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
|
||||
#include "modules/include/module_common_types.h"
|
||||
|
||||
@implementation RTCRtpFragmentationHeader
|
||||
|
||||
@synthesize fragmentationOffset = _fragmentationOffset;
|
||||
@synthesize fragmentationLength = _fragmentationLength;
|
||||
@synthesize fragmentationTimeDiff = _fragmentationTimeDiff;
|
||||
@synthesize fragmentationPlType = _fragmentationPlType;
|
||||
|
||||
- (instancetype)initWithNativeFragmentationHeader:
|
||||
(const webrtc::RTPFragmentationHeader *)fragmentationHeader {
|
||||
if (self = [super init]) {
|
||||
if (fragmentationHeader) {
|
||||
int count = fragmentationHeader->fragmentationVectorSize;
|
||||
NSMutableArray *offsets = [NSMutableArray array];
|
||||
NSMutableArray *lengths = [NSMutableArray array];
|
||||
NSMutableArray *timeDiffs = [NSMutableArray array];
|
||||
NSMutableArray *plTypes = [NSMutableArray array];
|
||||
for (int i = 0; i < count; ++i) {
|
||||
[offsets addObject:@(fragmentationHeader->fragmentationOffset[i])];
|
||||
[lengths addObject:@(fragmentationHeader->fragmentationLength[i])];
|
||||
[timeDiffs addObject:@(fragmentationHeader->fragmentationTimeDiff[i])];
|
||||
[plTypes addObject:@(fragmentationHeader->fragmentationPlType[i])];
|
||||
}
|
||||
_fragmentationOffset = [offsets copy];
|
||||
_fragmentationLength = [lengths copy];
|
||||
_fragmentationTimeDiff = [timeDiffs copy];
|
||||
_fragmentationPlType = [plTypes copy];
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (std::unique_ptr<webrtc::RTPFragmentationHeader>)createNativeFragmentationHeader {
|
||||
auto fragmentationHeader =
|
||||
std::unique_ptr<webrtc::RTPFragmentationHeader>(new webrtc::RTPFragmentationHeader);
|
||||
fragmentationHeader->VerifyAndAllocateFragmentationHeader(_fragmentationOffset.count);
|
||||
for (NSUInteger i = 0; i < _fragmentationOffset.count; ++i) {
|
||||
fragmentationHeader->fragmentationOffset[i] = (size_t)_fragmentationOffset[i].unsignedIntValue;
|
||||
fragmentationHeader->fragmentationLength[i] = (size_t)_fragmentationLength[i].unsignedIntValue;
|
||||
fragmentationHeader->fragmentationTimeDiff[i] =
|
||||
(uint16_t)_fragmentationOffset[i].unsignedIntValue;
|
||||
fragmentationHeader->fragmentationPlType[i] = (uint8_t)_fragmentationOffset[i].unsignedIntValue;
|
||||
}
|
||||
|
||||
return fragmentationHeader;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpHeaderExtension.h"
|
||||
|
||||
#include "api/rtpparameters.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCRtpHeaderExtension ()
|
||||
|
||||
/** Returns the equivalent native RtpExtension structure. */
|
||||
@property(nonatomic, readonly) webrtc::RtpExtension nativeParameters;
|
||||
|
||||
/** Initialize the object with a native RtpExtension structure. */
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtpExtension &)nativeParameters;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpHeaderExtension+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
|
||||
@implementation RTCRtpHeaderExtension
|
||||
|
||||
@synthesize uri = _uri;
|
||||
@synthesize id = _id;
|
||||
@synthesize encrypted = _encrypted;
|
||||
|
||||
- (instancetype)init {
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtpExtension &)nativeParameters {
|
||||
if (self = [self init]) {
|
||||
_uri = [NSString stringForStdString:nativeParameters.uri];
|
||||
_id = nativeParameters.id;
|
||||
_encrypted = nativeParameters.encrypt;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::RtpExtension)nativeParameters {
|
||||
webrtc::RtpExtension extension;
|
||||
extension.uri = [NSString stdStringForString:_uri];
|
||||
extension.id = _id;
|
||||
extension.encrypt = _encrypted;
|
||||
return extension;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpParameters.h"
|
||||
|
||||
#include "api/rtpparameters.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCRtpParameters ()
|
||||
|
||||
/** Returns the equivalent native RtpParameters structure. */
|
||||
@property(nonatomic, readonly) webrtc::RtpParameters nativeParameters;
|
||||
|
||||
/** Initialize the object with a native RtpParameters structure. */
|
||||
- (instancetype)initWithNativeParameters:(const webrtc::RtpParameters &)nativeParameters;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,77 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpParameters+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCRtcpParameters+Private.h"
|
||||
#import "RTCRtpCodecParameters+Private.h"
|
||||
#import "RTCRtpEncodingParameters+Private.h"
|
||||
#import "RTCRtpHeaderExtension+Private.h"
|
||||
|
||||
@implementation RTCRtpParameters
|
||||
|
||||
@synthesize transactionId = _transactionId;
|
||||
@synthesize rtcp = _rtcp;
|
||||
@synthesize headerExtensions = _headerExtensions;
|
||||
@synthesize encodings = _encodings;
|
||||
@synthesize codecs = _codecs;
|
||||
|
||||
- (instancetype)init {
|
||||
return [super init];
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeParameters:
|
||||
(const webrtc::RtpParameters &)nativeParameters {
|
||||
if (self = [self init]) {
|
||||
_transactionId = [NSString stringForStdString:nativeParameters.transaction_id];
|
||||
_rtcp = [[RTCRtcpParameters alloc] initWithNativeParameters:nativeParameters.rtcp];
|
||||
|
||||
NSMutableArray *headerExtensions = [[NSMutableArray alloc] init];
|
||||
for (const auto &headerExtension : nativeParameters.header_extensions) {
|
||||
[headerExtensions
|
||||
addObject:[[RTCRtpHeaderExtension alloc] initWithNativeParameters:headerExtension]];
|
||||
}
|
||||
_headerExtensions = headerExtensions;
|
||||
|
||||
NSMutableArray *encodings = [[NSMutableArray alloc] init];
|
||||
for (const auto &encoding : nativeParameters.encodings) {
|
||||
[encodings addObject:[[RTCRtpEncodingParameters alloc]
|
||||
initWithNativeParameters:encoding]];
|
||||
}
|
||||
_encodings = encodings;
|
||||
|
||||
NSMutableArray *codecs = [[NSMutableArray alloc] init];
|
||||
for (const auto &codec : nativeParameters.codecs) {
|
||||
[codecs addObject:[[RTCRtpCodecParameters alloc]
|
||||
initWithNativeParameters:codec]];
|
||||
}
|
||||
_codecs = codecs;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::RtpParameters)nativeParameters {
|
||||
webrtc::RtpParameters parameters;
|
||||
parameters.transaction_id = [NSString stdStringForString:_transactionId];
|
||||
parameters.rtcp = [_rtcp nativeParameters];
|
||||
for (RTCRtpHeaderExtension *headerExtension in _headerExtensions) {
|
||||
parameters.header_extensions.push_back(headerExtension.nativeParameters);
|
||||
}
|
||||
for (RTCRtpEncodingParameters *encoding in _encodings) {
|
||||
parameters.encodings.push_back(encoding.nativeParameters);
|
||||
}
|
||||
for (RTCRtpCodecParameters *codec in _codecs) {
|
||||
parameters.codecs.push_back(codec.nativeParameters);
|
||||
}
|
||||
return parameters;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpReceiver.h"
|
||||
|
||||
#include "api/rtpreceiverinterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class RtpReceiverDelegateAdapter : public RtpReceiverObserverInterface {
|
||||
public:
|
||||
RtpReceiverDelegateAdapter(RTCRtpReceiver* receiver);
|
||||
|
||||
void OnFirstPacketReceived(cricket::MediaType media_type) override;
|
||||
|
||||
private:
|
||||
__weak RTCRtpReceiver* receiver_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@interface RTCRtpReceiver ()
|
||||
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::RtpReceiverInterface> nativeRtpReceiver;
|
||||
|
||||
/** Initialize an RTCRtpReceiver with a native RtpReceiverInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory
|
||||
nativeRtpReceiver:(rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
+ (RTCRtpMediaType)mediaTypeForNativeMediaType:(cricket::MediaType)nativeMediaType;
|
||||
|
||||
+ (cricket::MediaType)nativeMediaTypeForMediaType:(RTCRtpMediaType)mediaType;
|
||||
|
||||
+ (NSString*)stringForMediaType:(RTCRtpMediaType)mediaType;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,154 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpReceiver+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCRtpParameters+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
RtpReceiverDelegateAdapter::RtpReceiverDelegateAdapter(
|
||||
RTCRtpReceiver *receiver) {
|
||||
RTC_CHECK(receiver);
|
||||
receiver_ = receiver;
|
||||
}
|
||||
|
||||
void RtpReceiverDelegateAdapter::OnFirstPacketReceived(
|
||||
cricket::MediaType media_type) {
|
||||
RTCRtpMediaType packet_media_type =
|
||||
[RTCRtpReceiver mediaTypeForNativeMediaType:media_type];
|
||||
RTCRtpReceiver *receiver = receiver_;
|
||||
[receiver.delegate rtpReceiver:receiver didReceiveFirstPacketForMediaType:packet_media_type];
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@implementation RTCRtpReceiver {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
rtc::scoped_refptr<webrtc::RtpReceiverInterface> _nativeRtpReceiver;
|
||||
std::unique_ptr<webrtc::RtpReceiverDelegateAdapter> _observer;
|
||||
}
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
|
||||
- (NSString *)receiverId {
|
||||
return [NSString stringForStdString:_nativeRtpReceiver->id()];
|
||||
}
|
||||
|
||||
- (RTCRtpParameters *)parameters {
|
||||
return [[RTCRtpParameters alloc]
|
||||
initWithNativeParameters:_nativeRtpReceiver->GetParameters()];
|
||||
}
|
||||
|
||||
- (void)setParameters:(RTCRtpParameters *)parameters {
|
||||
if (!_nativeRtpReceiver->SetParameters(parameters.nativeParameters)) {
|
||||
RTCLogError(@"RTCRtpReceiver(%p): Failed to set parameters: %@", self,
|
||||
parameters);
|
||||
}
|
||||
}
|
||||
|
||||
- (nullable RTCMediaStreamTrack *)track {
|
||||
rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
|
||||
_nativeRtpReceiver->track());
|
||||
if (nativeTrack) {
|
||||
return [RTCMediaStreamTrack mediaTrackForNativeTrack:nativeTrack factory:_factory];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCRtpReceiver {\n receiverId: %@\n}",
|
||||
self.receiverId];
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
if (_nativeRtpReceiver) {
|
||||
_nativeRtpReceiver->SetObserver(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:(id)object {
|
||||
if (self == object) {
|
||||
return YES;
|
||||
}
|
||||
if (object == nil) {
|
||||
return NO;
|
||||
}
|
||||
if (![object isMemberOfClass:[self class]]) {
|
||||
return NO;
|
||||
}
|
||||
RTCRtpReceiver *receiver = (RTCRtpReceiver *)object;
|
||||
return _nativeRtpReceiver == receiver.nativeRtpReceiver;
|
||||
}
|
||||
|
||||
- (NSUInteger)hash {
|
||||
return (NSUInteger)_nativeRtpReceiver.get();
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
|
||||
return _nativeRtpReceiver;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeRtpReceiver:
|
||||
(rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
_nativeRtpReceiver = nativeRtpReceiver;
|
||||
RTCLogInfo(
|
||||
@"RTCRtpReceiver(%p): created receiver: %@", self, self.description);
|
||||
_observer.reset(new webrtc::RtpReceiverDelegateAdapter(self));
|
||||
_nativeRtpReceiver->SetObserver(_observer.get());
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (RTCRtpMediaType)mediaTypeForNativeMediaType:
|
||||
(cricket::MediaType)nativeMediaType {
|
||||
switch (nativeMediaType) {
|
||||
case cricket::MEDIA_TYPE_AUDIO:
|
||||
return RTCRtpMediaTypeAudio;
|
||||
case cricket::MEDIA_TYPE_VIDEO:
|
||||
return RTCRtpMediaTypeVideo;
|
||||
case cricket::MEDIA_TYPE_DATA:
|
||||
return RTCRtpMediaTypeData;
|
||||
}
|
||||
}
|
||||
|
||||
+ (cricket::MediaType)nativeMediaTypeForMediaType:(RTCRtpMediaType)mediaType {
|
||||
switch (mediaType) {
|
||||
case RTCRtpMediaTypeAudio:
|
||||
return cricket::MEDIA_TYPE_AUDIO;
|
||||
case RTCRtpMediaTypeVideo:
|
||||
return cricket::MEDIA_TYPE_VIDEO;
|
||||
case RTCRtpMediaTypeData:
|
||||
return cricket::MEDIA_TYPE_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
+ (NSString *)stringForMediaType:(RTCRtpMediaType)mediaType {
|
||||
switch (mediaType) {
|
||||
case RTCRtpMediaTypeAudio:
|
||||
return @"AUDIO";
|
||||
case RTCRtpMediaTypeVideo:
|
||||
return @"VIDEO";
|
||||
case RTCRtpMediaTypeData:
|
||||
return @"DATA";
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpSender.h"
|
||||
|
||||
#include "api/rtpsenderinterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
|
||||
@interface RTCRtpSender ()
|
||||
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeRtpSender;
|
||||
|
||||
/** Initialize an RTCRtpSender with a native RtpSenderInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory
|
||||
nativeRtpSender:(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,105 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpSender+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCDtmfSender+Private.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCRtpParameters+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
@implementation RTCRtpSender {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
rtc::scoped_refptr<webrtc::RtpSenderInterface> _nativeRtpSender;
|
||||
}
|
||||
|
||||
@synthesize dtmfSender = _dtmfSender;
|
||||
|
||||
- (NSString *)senderId {
|
||||
return [NSString stringForStdString:_nativeRtpSender->id()];
|
||||
}
|
||||
|
||||
- (RTCRtpParameters *)parameters {
|
||||
return [[RTCRtpParameters alloc]
|
||||
initWithNativeParameters:_nativeRtpSender->GetParameters()];
|
||||
}
|
||||
|
||||
- (void)setParameters:(RTCRtpParameters *)parameters {
|
||||
if (!_nativeRtpSender->SetParameters(parameters.nativeParameters).ok()) {
|
||||
RTCLogError(@"RTCRtpSender(%p): Failed to set parameters: %@", self,
|
||||
parameters);
|
||||
}
|
||||
}
|
||||
|
||||
- (RTCMediaStreamTrack *)track {
|
||||
rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
|
||||
_nativeRtpSender->track());
|
||||
if (nativeTrack) {
|
||||
return [RTCMediaStreamTrack mediaTrackForNativeTrack:nativeTrack factory:_factory];
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setTrack:(RTCMediaStreamTrack *)track {
|
||||
if (!_nativeRtpSender->SetTrack(track.nativeTrack)) {
|
||||
RTCLogError(@"RTCRtpSender(%p): Failed to set track %@", self, track);
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCRtpSender {\n senderId: %@\n}",
|
||||
self.senderId];
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:(id)object {
|
||||
if (self == object) {
|
||||
return YES;
|
||||
}
|
||||
if (object == nil) {
|
||||
return NO;
|
||||
}
|
||||
if (![object isMemberOfClass:[self class]]) {
|
||||
return NO;
|
||||
}
|
||||
RTCRtpSender *sender = (RTCRtpSender *)object;
|
||||
return _nativeRtpSender == sender.nativeRtpSender;
|
||||
}
|
||||
|
||||
- (NSUInteger)hash {
|
||||
return (NSUInteger)_nativeRtpSender.get();
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
|
||||
return _nativeRtpSender;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeRtpSender:(rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
|
||||
NSParameterAssert(factory);
|
||||
NSParameterAssert(nativeRtpSender);
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
_nativeRtpSender = nativeRtpSender;
|
||||
rtc::scoped_refptr<webrtc::DtmfSenderInterface> nativeDtmfSender(
|
||||
_nativeRtpSender->GetDtmfSender());
|
||||
if (nativeDtmfSender) {
|
||||
_dtmfSender = [[RTCDtmfSender alloc] initWithNativeDtmfSender:nativeDtmfSender];
|
||||
}
|
||||
RTCLogInfo(@"RTCRtpSender(%p): created sender: %@", self, self.description);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,44 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCRtpTransceiver.h"
|
||||
|
||||
#include "api/rtptransceiverinterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class RTCPeerConnectionFactory;
|
||||
|
||||
@interface RTCRtpTransceiverInit ()
|
||||
|
||||
@property(nonatomic, readonly) webrtc::RtpTransceiverInit nativeInit;
|
||||
|
||||
@end
|
||||
|
||||
@interface RTCRtpTransceiver ()
|
||||
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::RtpTransceiverInterface>
|
||||
nativeRtpTransceiver;
|
||||
|
||||
/** Initialize an RTCRtpTransceiver with a native RtpTransceiverInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory
|
||||
nativeRtpTransceiver:
|
||||
(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
+ (webrtc::RtpTransceiverDirection)nativeRtpTransceiverDirectionFromDirection:
|
||||
(RTCRtpTransceiverDirection)direction;
|
||||
|
||||
+ (RTCRtpTransceiverDirection)rtpTransceiverDirectionFromNativeDirection:
|
||||
(webrtc::RtpTransceiverDirection)nativeDirection;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,169 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCRtpTransceiver+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCRtpEncodingParameters+Private.h"
|
||||
#import "RTCRtpParameters+Private.h"
|
||||
#import "RTCRtpReceiver+Private.h"
|
||||
#import "RTCRtpSender+Private.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
@implementation RTCRtpTransceiverInit
|
||||
|
||||
@synthesize direction = _direction;
|
||||
@synthesize streamIds = _streamIds;
|
||||
@synthesize sendEncodings = _sendEncodings;
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
_direction = RTCRtpTransceiverDirectionSendRecv;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::RtpTransceiverInit)nativeInit {
|
||||
webrtc::RtpTransceiverInit init;
|
||||
init.direction = [RTCRtpTransceiver nativeRtpTransceiverDirectionFromDirection:_direction];
|
||||
for (NSString *streamId in _streamIds) {
|
||||
init.stream_ids.push_back([streamId UTF8String]);
|
||||
}
|
||||
for (RTCRtpEncodingParameters *sendEncoding in _sendEncodings) {
|
||||
init.send_encodings.push_back(sendEncoding.nativeParameters);
|
||||
}
|
||||
return init;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation RTCRtpTransceiver {
|
||||
RTCPeerConnectionFactory *_factory;
|
||||
rtc::scoped_refptr<webrtc::RtpTransceiverInterface> _nativeRtpTransceiver;
|
||||
}
|
||||
|
||||
- (RTCRtpMediaType)mediaType {
|
||||
return [RTCRtpReceiver mediaTypeForNativeMediaType:_nativeRtpTransceiver->media_type()];
|
||||
}
|
||||
|
||||
- (NSString *)mid {
|
||||
if (_nativeRtpTransceiver->mid()) {
|
||||
return [NSString stringForStdString:*_nativeRtpTransceiver->mid()];
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
@synthesize sender = _sender;
|
||||
@synthesize receiver = _receiver;
|
||||
|
||||
- (BOOL)isStopped {
|
||||
return _nativeRtpTransceiver->stopped();
|
||||
}
|
||||
|
||||
- (RTCRtpTransceiverDirection)direction {
|
||||
return [RTCRtpTransceiver
|
||||
rtpTransceiverDirectionFromNativeDirection:_nativeRtpTransceiver->direction()];
|
||||
}
|
||||
|
||||
- (void)setDirection:(RTCRtpTransceiverDirection)direction {
|
||||
_nativeRtpTransceiver->SetDirection(
|
||||
[RTCRtpTransceiver nativeRtpTransceiverDirectionFromDirection:direction]);
|
||||
}
|
||||
|
||||
- (BOOL)currentDirection:(RTCRtpTransceiverDirection *)currentDirectionOut {
|
||||
if (_nativeRtpTransceiver->current_direction()) {
|
||||
*currentDirectionOut = [RTCRtpTransceiver
|
||||
rtpTransceiverDirectionFromNativeDirection:*_nativeRtpTransceiver->current_direction()];
|
||||
return YES;
|
||||
} else {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)stop {
|
||||
_nativeRtpTransceiver->Stop();
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString
|
||||
stringWithFormat:@"RTCRtpTransceiver {\n sender: %@\n receiver: %@\n}", _sender, _receiver];
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:(id)object {
|
||||
if (self == object) {
|
||||
return YES;
|
||||
}
|
||||
if (object == nil) {
|
||||
return NO;
|
||||
}
|
||||
if (![object isMemberOfClass:[self class]]) {
|
||||
return NO;
|
||||
}
|
||||
RTCRtpTransceiver *transceiver = (RTCRtpTransceiver *)object;
|
||||
return _nativeRtpTransceiver == transceiver.nativeRtpTransceiver;
|
||||
}
|
||||
|
||||
- (NSUInteger)hash {
|
||||
return (NSUInteger)_nativeRtpTransceiver.get();
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver {
|
||||
return _nativeRtpTransceiver;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeRtpTransceiver:
|
||||
(rtc::scoped_refptr<webrtc::RtpTransceiverInterface>)nativeRtpTransceiver {
|
||||
NSParameterAssert(factory);
|
||||
NSParameterAssert(nativeRtpTransceiver);
|
||||
if (self = [super init]) {
|
||||
_factory = factory;
|
||||
_nativeRtpTransceiver = nativeRtpTransceiver;
|
||||
_sender = [[RTCRtpSender alloc] initWithFactory:_factory
|
||||
nativeRtpSender:nativeRtpTransceiver->sender()];
|
||||
_receiver = [[RTCRtpReceiver alloc] initWithFactory:_factory
|
||||
nativeRtpReceiver:nativeRtpTransceiver->receiver()];
|
||||
RTCLogInfo(@"RTCRtpTransceiver(%p): created transceiver: %@", self, self.description);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (webrtc::RtpTransceiverDirection)nativeRtpTransceiverDirectionFromDirection:
|
||||
(RTCRtpTransceiverDirection)direction {
|
||||
switch (direction) {
|
||||
case RTCRtpTransceiverDirectionSendRecv:
|
||||
return webrtc::RtpTransceiverDirection::kSendRecv;
|
||||
case RTCRtpTransceiverDirectionSendOnly:
|
||||
return webrtc::RtpTransceiverDirection::kSendOnly;
|
||||
case RTCRtpTransceiverDirectionRecvOnly:
|
||||
return webrtc::RtpTransceiverDirection::kRecvOnly;
|
||||
case RTCRtpTransceiverDirectionInactive:
|
||||
return webrtc::RtpTransceiverDirection::kInactive;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCRtpTransceiverDirection)rtpTransceiverDirectionFromNativeDirection:
|
||||
(webrtc::RtpTransceiverDirection)nativeDirection {
|
||||
switch (nativeDirection) {
|
||||
case webrtc::RtpTransceiverDirection::kSendRecv:
|
||||
return RTCRtpTransceiverDirectionSendRecv;
|
||||
case webrtc::RtpTransceiverDirection::kSendOnly:
|
||||
return RTCRtpTransceiverDirectionSendOnly;
|
||||
case webrtc::RtpTransceiverDirection::kRecvOnly:
|
||||
return RTCRtpTransceiverDirectionRecvOnly;
|
||||
case webrtc::RtpTransceiverDirection::kInactive:
|
||||
return RTCRtpTransceiverDirectionInactive;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,26 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCSSLAdapter.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/ssladapter.h"
|
||||
|
||||
BOOL RTCInitializeSSL(void) {
|
||||
BOOL initialized = rtc::InitializeSSL();
|
||||
RTC_DCHECK(initialized);
|
||||
return initialized;
|
||||
}
|
||||
|
||||
BOOL RTCCleanupSSL(void) {
|
||||
BOOL cleanedUp = rtc::CleanupSSL();
|
||||
RTC_DCHECK(cleanedUp);
|
||||
return cleanedUp;
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCSessionDescription.h"
|
||||
|
||||
#include "api/jsep.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCSessionDescription ()
|
||||
|
||||
/**
|
||||
* The native SessionDescriptionInterface representation of this
|
||||
* RTCSessionDescription object. This is needed to pass to the underlying C++
|
||||
* APIs.
|
||||
*/
|
||||
@property(nonatomic, readonly, nullable) webrtc::SessionDescriptionInterface *nativeDescription;
|
||||
|
||||
/**
|
||||
* Initialize an RTCSessionDescription from a native
|
||||
* SessionDescriptionInterface. No ownership is taken of the native session
|
||||
* description.
|
||||
*/
|
||||
- (instancetype)initWithNativeDescription:
|
||||
(const webrtc::SessionDescriptionInterface *)nativeDescription;
|
||||
|
||||
+ (std::string)stdStringForType:(RTCSdpType)type;
|
||||
|
||||
+ (RTCSdpType)typeForStdString:(const std::string &)string;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCSessionDescription+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "WebRTC/RTCLogging.h"
|
||||
|
||||
#include "rtc_base/checks.h"
|
||||
|
||||
@implementation RTCSessionDescription
|
||||
|
||||
@synthesize type = _type;
|
||||
@synthesize sdp = _sdp;
|
||||
|
||||
+ (NSString *)stringForType:(RTCSdpType)type {
|
||||
std::string string = [[self class] stdStringForType:type];
|
||||
return [NSString stringForStdString:string];
|
||||
}
|
||||
|
||||
+ (RTCSdpType)typeForString:(NSString *)string {
|
||||
std::string typeString = string.stdString;
|
||||
return [[self class] typeForStdString:typeString];
|
||||
}
|
||||
|
||||
- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp {
|
||||
NSParameterAssert(sdp.length);
|
||||
if (self = [super init]) {
|
||||
_type = type;
|
||||
_sdp = [sdp copy];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
return [NSString stringWithFormat:@"RTCSessionDescription:\n%@\n%@",
|
||||
[[self class] stringForType:_type],
|
||||
_sdp];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (webrtc::SessionDescriptionInterface *)nativeDescription {
|
||||
webrtc::SdpParseError error;
|
||||
|
||||
webrtc::SessionDescriptionInterface *description =
|
||||
webrtc::CreateSessionDescription([[self class] stdStringForType:_type],
|
||||
_sdp.stdString,
|
||||
&error);
|
||||
|
||||
if (!description) {
|
||||
RTCLogError(@"Failed to create session description: %s\nline: %s",
|
||||
error.description.c_str(),
|
||||
error.line.c_str());
|
||||
}
|
||||
|
||||
return description;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeDescription:
|
||||
(const webrtc::SessionDescriptionInterface *)nativeDescription {
|
||||
NSParameterAssert(nativeDescription);
|
||||
std::string sdp;
|
||||
nativeDescription->ToString(&sdp);
|
||||
RTCSdpType type = [[self class] typeForStdString:nativeDescription->type()];
|
||||
|
||||
return [self initWithType:type
|
||||
sdp:[NSString stringForStdString:sdp]];
|
||||
}
|
||||
|
||||
+ (std::string)stdStringForType:(RTCSdpType)type {
|
||||
switch (type) {
|
||||
case RTCSdpTypeOffer:
|
||||
return webrtc::SessionDescriptionInterface::kOffer;
|
||||
case RTCSdpTypePrAnswer:
|
||||
return webrtc::SessionDescriptionInterface::kPrAnswer;
|
||||
case RTCSdpTypeAnswer:
|
||||
return webrtc::SessionDescriptionInterface::kAnswer;
|
||||
}
|
||||
}
|
||||
|
||||
+ (RTCSdpType)typeForStdString:(const std::string &)string {
|
||||
if (string == webrtc::SessionDescriptionInterface::kOffer) {
|
||||
return RTCSdpTypeOffer;
|
||||
} else if (string == webrtc::SessionDescriptionInterface::kPrAnswer) {
|
||||
return RTCSdpTypePrAnswer;
|
||||
} else if (string == webrtc::SessionDescriptionInterface::kAnswer) {
|
||||
return RTCSdpTypeAnswer;
|
||||
} else {
|
||||
RTC_NOTREACHED();
|
||||
return RTCSdpTypeOffer;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCTracing.h"
|
||||
|
||||
#include "rtc_base/event_tracer.h"
|
||||
|
||||
void RTCSetupInternalTracer(void) {
|
||||
rtc::tracing::SetupInternalTracer();
|
||||
}
|
||||
|
||||
BOOL RTCStartInternalCapture(NSString *filePath) {
|
||||
return rtc::tracing::StartInternalCapture(filePath.UTF8String);
|
||||
}
|
||||
|
||||
void RTCStopInternalCapture(void) {
|
||||
rtc::tracing::StopInternalCapture();
|
||||
}
|
||||
|
||||
void RTCShutdownInternalTracer(void) {
|
||||
rtc::tracing::ShutdownInternalTracer();
|
||||
}
|
||||
@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCapturer.h"
|
||||
|
||||
@implementation RTCVideoCapturer
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
|
||||
- (instancetype)initWithDelegate:(id<RTCVideoCapturerDelegate>)delegate {
|
||||
if (self = [super init]) {
|
||||
_delegate = delegate;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -8,51 +8,8 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
|
||||
#include "api/video_codecs/sdp_video_format.h"
|
||||
#include "common_video/include/video_frame.h"
|
||||
#include "media/base/codec.h"
|
||||
#include "modules/video_coding/include/video_codec_interface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/* Interfaces for converting to/from internal C++ formats. */
|
||||
@interface RTCEncodedImage ()
|
||||
|
||||
- (instancetype)initWithNativeEncodedImage:(webrtc::EncodedImage)encodedImage;
|
||||
- (webrtc::EncodedImage)nativeEncodedImage;
|
||||
|
||||
@end
|
||||
|
||||
@interface RTCVideoEncoderSettings ()
|
||||
|
||||
- (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *__nullable)videoCodec;
|
||||
- (webrtc::VideoCodec)nativeVideoCodec;
|
||||
|
||||
@end
|
||||
|
||||
@interface RTCCodecSpecificInfoH264 ()
|
||||
|
||||
- (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo;
|
||||
|
||||
@end
|
||||
|
||||
@interface RTCRtpFragmentationHeader ()
|
||||
|
||||
- (instancetype)initWithNativeFragmentationHeader:
|
||||
(const webrtc::RTPFragmentationHeader *__nullable)fragmentationHeader;
|
||||
- (std::unique_ptr<webrtc::RTPFragmentationHeader>)createNativeFragmentationHeader;
|
||||
|
||||
@end
|
||||
|
||||
@interface RTCVideoCodecInfo ()
|
||||
|
||||
- (instancetype)initWithNativeSdpVideoFormat:(webrtc::SdpVideoFormat)format;
|
||||
- (webrtc::SdpVideoFormat)nativeSdpVideoFormat;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
#import "api/peerconnection/RTCEncodedImage+Private.h"
|
||||
#import "api/peerconnection/RTCRtpFragmentationHeader+Private.h"
|
||||
#import "api/peerconnection/RTCVideoCodecInfo+Private.h"
|
||||
#import "api/peerconnection/RTCVideoEncoderSettings+Private.h"
|
||||
#import "components/video_codec/RTCCodecSpecificInfoH264+Private.h"
|
||||
|
||||
@ -1,167 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCVideoCodec+Private.h"
|
||||
#if defined(WEBRTC_IOS)
|
||||
#import "UIDevice+H264Profile.h"
|
||||
#endif
|
||||
#import "WebRTC/RTCVideoCodecFactory.h"
|
||||
|
||||
#include "media/base/mediaconstants.h"
|
||||
|
||||
namespace {
|
||||
|
||||
NSString *MaxSupportedProfileLevelConstrainedHigh();
|
||||
NSString *MaxSupportedProfileLevelConstrainedBaseline();
|
||||
|
||||
} // namespace
|
||||
|
||||
NSString *const kRTCVideoCodecVp8Name = @(cricket::kVp8CodecName);
|
||||
NSString *const kRTCVideoCodecVp9Name = @(cricket::kVp9CodecName);
|
||||
NSString *const kRTCVideoCodecH264Name = @(cricket::kH264CodecName);
|
||||
NSString *const kRTCLevel31ConstrainedHigh = @"640c1f";
|
||||
NSString *const kRTCLevel31ConstrainedBaseline = @"42e01f";
|
||||
NSString *const kRTCMaxSupportedH264ProfileLevelConstrainedHigh =
|
||||
MaxSupportedProfileLevelConstrainedHigh();
|
||||
NSString *const kRTCMaxSupportedH264ProfileLevelConstrainedBaseline =
|
||||
MaxSupportedProfileLevelConstrainedBaseline();
|
||||
|
||||
namespace {
|
||||
|
||||
#if defined(WEBRTC_IOS)
|
||||
|
||||
using namespace webrtc::H264;
|
||||
|
||||
NSString *MaxSupportedLevelForProfile(Profile profile) {
|
||||
const absl::optional<ProfileLevelId> profileLevelId = [UIDevice maxSupportedH264Profile];
|
||||
if (profileLevelId && profileLevelId->profile >= profile) {
|
||||
const absl::optional<std::string> profileString =
|
||||
ProfileLevelIdToString(ProfileLevelId(profile, profileLevelId->level));
|
||||
if (profileString) {
|
||||
return [NSString stringForStdString:*profileString];
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
#endif
|
||||
|
||||
NSString *MaxSupportedProfileLevelConstrainedBaseline() {
|
||||
#if defined(WEBRTC_IOS)
|
||||
NSString *profile = MaxSupportedLevelForProfile(webrtc::H264::kProfileConstrainedBaseline);
|
||||
if (profile != nil) {
|
||||
return profile;
|
||||
}
|
||||
#endif
|
||||
return kRTCLevel31ConstrainedBaseline;
|
||||
}
|
||||
|
||||
NSString *MaxSupportedProfileLevelConstrainedHigh() {
|
||||
#if defined(WEBRTC_IOS)
|
||||
NSString *profile = MaxSupportedLevelForProfile(webrtc::H264::kProfileConstrainedHigh);
|
||||
if (profile != nil) {
|
||||
return profile;
|
||||
}
|
||||
#endif
|
||||
return kRTCLevel31ConstrainedHigh;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@implementation RTCVideoCodecInfo
|
||||
|
||||
@synthesize name = _name;
|
||||
@synthesize parameters = _parameters;
|
||||
|
||||
- (instancetype)initWithName:(NSString *)name {
|
||||
return [self initWithName:name parameters:nil];
|
||||
}
|
||||
|
||||
- (instancetype)initWithName:(NSString *)name
|
||||
parameters:(nullable NSDictionary<NSString *, NSString *> *)parameters {
|
||||
if (self = [super init]) {
|
||||
_name = name;
|
||||
_parameters = (parameters ? parameters : @{});
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeSdpVideoFormat:(webrtc::SdpVideoFormat)format {
|
||||
NSMutableDictionary *params = [NSMutableDictionary dictionary];
|
||||
for (auto it = format.parameters.begin(); it != format.parameters.end(); ++it) {
|
||||
[params setObject:[NSString stringForStdString:it->second]
|
||||
forKey:[NSString stringForStdString:it->first]];
|
||||
}
|
||||
return [self initWithName:[NSString stringForStdString:format.name] parameters:params];
|
||||
}
|
||||
|
||||
- (BOOL)isEqualToCodecInfo:(RTCVideoCodecInfo *)info {
|
||||
if (!info ||
|
||||
![self.name isEqualToString:info.name] ||
|
||||
![self.parameters isEqualToDictionary:info.parameters]) {
|
||||
return NO;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:(id)object {
|
||||
if (self == object)
|
||||
return YES;
|
||||
if (![object isKindOfClass:[self class]])
|
||||
return NO;
|
||||
return [self isEqualToCodecInfo:object];
|
||||
}
|
||||
|
||||
- (NSUInteger)hash {
|
||||
return [self.name hash] ^ [self.parameters hash];
|
||||
}
|
||||
|
||||
- (webrtc::SdpVideoFormat)nativeSdpVideoFormat {
|
||||
std::map<std::string, std::string> parameters;
|
||||
for (NSString *paramKey in _parameters.allKeys) {
|
||||
std::string key = [NSString stdStringForString:paramKey];
|
||||
std::string value = [NSString stdStringForString:_parameters[paramKey]];
|
||||
parameters[key] = value;
|
||||
}
|
||||
|
||||
return webrtc::SdpVideoFormat([NSString stdStringForString:_name], parameters);
|
||||
}
|
||||
|
||||
#pragma mark - NSCoding
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)decoder {
|
||||
return [self initWithName:[decoder decodeObjectForKey:@"name"]
|
||||
parameters:[decoder decodeObjectForKey:@"parameters"]];
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(NSCoder *)encoder {
|
||||
[encoder encodeObject:_name forKey:@"name"];
|
||||
[encoder encodeObject:_parameters forKey:@"parameters"];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation RTCVideoEncoderQpThresholds
|
||||
|
||||
@synthesize low = _low;
|
||||
@synthesize high = _high;
|
||||
|
||||
- (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high {
|
||||
if (self = [super init]) {
|
||||
_low = low;
|
||||
_high = high;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodecH264.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#import "RTCVideoCodec+Private.h"
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
|
||||
#include "rtc_base/timeutils.h"
|
||||
|
||||
// H264 specific settings.
|
||||
@implementation RTCCodecSpecificInfoH264
|
||||
|
||||
@synthesize packetizationMode = _packetizationMode;
|
||||
|
||||
- (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo {
|
||||
webrtc::CodecSpecificInfo codecSpecificInfo;
|
||||
codecSpecificInfo.codecType = webrtc::kVideoCodecH264;
|
||||
codecSpecificInfo.codec_name = [kRTCVideoCodecH264Name cStringUsingEncoding:NSUTF8StringEncoding];
|
||||
codecSpecificInfo.codecSpecific.H264.packetization_mode =
|
||||
(webrtc::H264PacketizationMode)_packetizationMode;
|
||||
|
||||
return codecSpecificInfo;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// Encoder factory.
|
||||
@implementation RTCVideoEncoderFactoryH264
|
||||
|
||||
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
|
||||
NSMutableArray<RTCVideoCodecInfo *> *codecs = [NSMutableArray array];
|
||||
NSString *codecName = kRTCVideoCodecH264Name;
|
||||
|
||||
NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
|
||||
@"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedHigh,
|
||||
@"level-asymmetry-allowed" : @"1",
|
||||
@"packetization-mode" : @"1",
|
||||
};
|
||||
RTCVideoCodecInfo *constrainedHighInfo =
|
||||
[[RTCVideoCodecInfo alloc] initWithName:codecName parameters:constrainedHighParams];
|
||||
[codecs addObject:constrainedHighInfo];
|
||||
|
||||
NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
|
||||
@"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedBaseline,
|
||||
@"level-asymmetry-allowed" : @"1",
|
||||
@"packetization-mode" : @"1",
|
||||
};
|
||||
RTCVideoCodecInfo *constrainedBaselineInfo =
|
||||
[[RTCVideoCodecInfo alloc] initWithName:codecName parameters:constrainedBaselineParams];
|
||||
[codecs addObject:constrainedBaselineInfo];
|
||||
|
||||
return [codecs copy];
|
||||
}
|
||||
|
||||
- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
|
||||
return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// Decoder factory.
|
||||
@implementation RTCVideoDecoderFactoryH264
|
||||
|
||||
- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info {
|
||||
return [[RTCVideoDecoderH264 alloc] init];
|
||||
}
|
||||
|
||||
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
|
||||
NSString *codecName = kRTCVideoCodecH264Name;
|
||||
return @[ [[RTCVideoCodecInfo alloc] initWithName:codecName parameters:nil] ];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "RTCWrappedNativeVideoDecoder.h"
|
||||
#import "RTCWrappedNativeVideoEncoder.h"
|
||||
#import "WebRTC/RTCVideoDecoderVP8.h"
|
||||
#import "WebRTC/RTCVideoEncoderVP8.h"
|
||||
|
||||
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
||||
|
||||
#pragma mark - Encoder
|
||||
|
||||
@implementation RTCVideoEncoderVP8
|
||||
|
||||
+ (id<RTCVideoEncoder>)vp8Encoder {
|
||||
return [[RTCWrappedNativeVideoEncoder alloc]
|
||||
initWithNativeEncoder:std::unique_ptr<webrtc::VideoEncoder>(webrtc::VP8Encoder::Create())];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - Decoder
|
||||
|
||||
@implementation RTCVideoDecoderVP8
|
||||
|
||||
+ (id<RTCVideoDecoder>)vp8Decoder {
|
||||
return [[RTCWrappedNativeVideoDecoder alloc]
|
||||
initWithNativeDecoder:std::unique_ptr<webrtc::VideoDecoder>(webrtc::VP8Decoder::Create())];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "RTCWrappedNativeVideoDecoder.h"
|
||||
#import "RTCWrappedNativeVideoEncoder.h"
|
||||
#import "WebRTC/RTCVideoDecoderVP9.h"
|
||||
#import "WebRTC/RTCVideoEncoderVP9.h"
|
||||
|
||||
#include "modules/video_coding/codecs/vp9/include/vp9.h"
|
||||
|
||||
#pragma mark - Encoder
|
||||
|
||||
@implementation RTCVideoEncoderVP9
|
||||
|
||||
+ (id<RTCVideoEncoder>)vp9Encoder {
|
||||
return [[RTCWrappedNativeVideoEncoder alloc]
|
||||
initWithNativeEncoder:std::unique_ptr<webrtc::VideoEncoder>(webrtc::VP9Encoder::Create())];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - Decoder
|
||||
|
||||
@implementation RTCVideoDecoderVP9
|
||||
|
||||
+ (id<RTCVideoDecoder>)vp9Decoder {
|
||||
return [[RTCWrappedNativeVideoDecoder alloc]
|
||||
initWithNativeDecoder:std::unique_ptr<webrtc::VideoDecoder>(webrtc::VP9Decoder::Create())];
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCVideoCodec+Private.h"
|
||||
#import "WebRTC/RTCVideoCodecFactory.h"
|
||||
|
||||
@implementation RTCVideoEncoderSettings
|
||||
|
||||
@synthesize name = _name;
|
||||
@synthesize width = _width;
|
||||
@synthesize height = _height;
|
||||
@synthesize startBitrate = _startBitrate;
|
||||
@synthesize maxBitrate = _maxBitrate;
|
||||
@synthesize minBitrate = _minBitrate;
|
||||
@synthesize targetBitrate = _targetBitrate;
|
||||
@synthesize maxFramerate = _maxFramerate;
|
||||
@synthesize qpMax = _qpMax;
|
||||
@synthesize mode = _mode;
|
||||
|
||||
- (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *)videoCodec {
|
||||
if (self = [super init]) {
|
||||
if (videoCodec) {
|
||||
const char *codecName = CodecTypeToPayloadString(videoCodec->codecType);
|
||||
_name = [NSString stringWithUTF8String:codecName];
|
||||
|
||||
_width = videoCodec->width;
|
||||
_height = videoCodec->height;
|
||||
_startBitrate = videoCodec->startBitrate;
|
||||
_maxBitrate = videoCodec->maxBitrate;
|
||||
_minBitrate = videoCodec->minBitrate;
|
||||
_targetBitrate = videoCodec->targetBitrate;
|
||||
_maxFramerate = videoCodec->maxFramerate;
|
||||
_qpMax = videoCodec->qpMax;
|
||||
_mode = (RTCVideoCodecMode)videoCodec->mode;
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (webrtc::VideoCodec)nativeVideoCodec {
|
||||
webrtc::VideoCodec videoCodec;
|
||||
videoCodec.width = _width;
|
||||
videoCodec.height = _height;
|
||||
videoCodec.startBitrate = _startBitrate;
|
||||
videoCodec.maxBitrate = _maxBitrate;
|
||||
videoCodec.minBitrate = _minBitrate;
|
||||
videoCodec.targetBitrate = _targetBitrate;
|
||||
videoCodec.maxBitrate = _maxBitrate;
|
||||
videoCodec.qpMax = _qpMax;
|
||||
videoCodec.mode = (webrtc::VideoCodecMode)_mode;
|
||||
|
||||
return videoCodec;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,84 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoFrame.h"
|
||||
|
||||
#import "WebRTC/RTCVideoFrameBuffer.h"
|
||||
|
||||
@implementation RTCVideoFrame {
|
||||
RTCVideoRotation _rotation;
|
||||
int64_t _timeStampNs;
|
||||
}
|
||||
|
||||
@synthesize buffer = _buffer;
|
||||
@synthesize timeStamp;
|
||||
|
||||
- (int)width {
|
||||
return _buffer.width;
|
||||
}
|
||||
|
||||
- (int)height {
|
||||
return _buffer.height;
|
||||
}
|
||||
|
||||
- (RTCVideoRotation)rotation {
|
||||
return _rotation;
|
||||
}
|
||||
|
||||
- (int64_t)timeStampNs {
|
||||
return _timeStampNs;
|
||||
}
|
||||
|
||||
- (RTCVideoFrame *)newI420VideoFrame {
|
||||
return [[RTCVideoFrame alloc] initWithBuffer:[_buffer toI420]
|
||||
rotation:_rotation
|
||||
timeStampNs:_timeStampNs];
|
||||
}
|
||||
|
||||
- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
|
||||
rotation:(RTCVideoRotation)rotation
|
||||
timeStampNs:(int64_t)timeStampNs {
|
||||
return [self initWithBuffer:[[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]
|
||||
rotation:rotation
|
||||
timeStampNs:timeStampNs];
|
||||
}
|
||||
|
||||
- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
|
||||
scaledWidth:(int)scaledWidth
|
||||
scaledHeight:(int)scaledHeight
|
||||
cropWidth:(int)cropWidth
|
||||
cropHeight:(int)cropHeight
|
||||
cropX:(int)cropX
|
||||
cropY:(int)cropY
|
||||
rotation:(RTCVideoRotation)rotation
|
||||
timeStampNs:(int64_t)timeStampNs {
|
||||
RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer
|
||||
adaptedWidth:scaledWidth
|
||||
adaptedHeight:scaledHeight
|
||||
cropWidth:cropWidth
|
||||
cropHeight:cropHeight
|
||||
cropX:cropX
|
||||
cropY:cropY];
|
||||
return [self initWithBuffer:rtcPixelBuffer rotation:rotation timeStampNs:timeStampNs];
|
||||
}
|
||||
|
||||
- (instancetype)initWithBuffer:(id<RTCVideoFrameBuffer>)buffer
|
||||
rotation:(RTCVideoRotation)rotation
|
||||
timeStampNs:(int64_t)timeStampNs {
|
||||
if (self = [super init]) {
|
||||
_buffer = buffer;
|
||||
_rotation = rotation;
|
||||
_timeStampNs = timeStampNs;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCVideoRendererAdapter.h"
|
||||
|
||||
#import "WebRTC/RTCVideoRenderer.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCVideoRendererAdapter ()
|
||||
|
||||
/**
|
||||
* The Objective-C video renderer passed to this adapter during construction.
|
||||
* Calls made to the webrtc::VideoRenderInterface will be adapted and passed to
|
||||
* this video renderer.
|
||||
*/
|
||||
@property(nonatomic, readonly) id<RTCVideoRenderer> videoRenderer;
|
||||
|
||||
/**
|
||||
* The native VideoSinkInterface surface exposed by this adapter. Calls made
|
||||
* to this interface will be adapted and passed to the RTCVideoRenderer supplied
|
||||
* during construction. This pointer is unsafe and owned by this class.
|
||||
*/
|
||||
@property(nonatomic, readonly) rtc::VideoSinkInterface<webrtc::VideoFrame> *nativeVideoRenderer;
|
||||
|
||||
/** Initialize an RTCVideoRendererAdapter with an RTCVideoRenderer. */
|
||||
- (instancetype)initWithNativeRenderer:(id<RTCVideoRenderer>)videoRenderer
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/*
|
||||
* Creates a rtc::VideoSinkInterface surface for an RTCVideoRenderer. The
|
||||
* rtc::VideoSinkInterface is used by WebRTC rendering code - this
|
||||
* adapter adapts calls made to that interface to the RTCVideoRenderer supplied
|
||||
* during construction.
|
||||
*/
|
||||
@interface RTCVideoRendererAdapter : NSObject
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,69 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCI420Buffer+Private.h"
|
||||
#import "RTCVideoRendererAdapter+Private.h"
|
||||
#import "WebRTC/RTCVideoFrame.h"
|
||||
#import "WebRTC/RTCVideoFrameBuffer.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "sdk/objc/Framework/Native/api/video_frame.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class VideoRendererAdapter
|
||||
: public rtc::VideoSinkInterface<webrtc::VideoFrame> {
|
||||
public:
|
||||
VideoRendererAdapter(RTCVideoRendererAdapter* adapter) {
|
||||
adapter_ = adapter;
|
||||
size_ = CGSizeZero;
|
||||
}
|
||||
|
||||
void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override {
|
||||
RTCVideoFrame* videoFrame = NativeToObjCVideoFrame(nativeVideoFrame);
|
||||
|
||||
CGSize current_size = (videoFrame.rotation % 180 == 0)
|
||||
? CGSizeMake(videoFrame.width, videoFrame.height)
|
||||
: CGSizeMake(videoFrame.height, videoFrame.width);
|
||||
|
||||
if (!CGSizeEqualToSize(size_, current_size)) {
|
||||
size_ = current_size;
|
||||
[adapter_.videoRenderer setSize:size_];
|
||||
}
|
||||
[adapter_.videoRenderer renderFrame:videoFrame];
|
||||
}
|
||||
|
||||
private:
|
||||
__weak RTCVideoRendererAdapter *adapter_;
|
||||
CGSize size_;
|
||||
};
|
||||
}
|
||||
|
||||
@implementation RTCVideoRendererAdapter {
|
||||
std::unique_ptr<webrtc::VideoRendererAdapter> _adapter;
|
||||
}
|
||||
|
||||
@synthesize videoRenderer = _videoRenderer;
|
||||
|
||||
- (instancetype)initWithNativeRenderer:(id<RTCVideoRenderer>)videoRenderer {
|
||||
NSParameterAssert(videoRenderer);
|
||||
if (self = [super init]) {
|
||||
_videoRenderer = videoRenderer;
|
||||
_adapter.reset(new webrtc::VideoRendererAdapter(self));
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (rtc::VideoSinkInterface<webrtc::VideoFrame> *)nativeVideoRenderer {
|
||||
return _adapter.get();
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,44 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoSource.h"
|
||||
|
||||
#import "RTCMediaSource+Private.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCVideoSource ()
|
||||
|
||||
/**
|
||||
* The VideoTrackSourceInterface object passed to this RTCVideoSource during
|
||||
* construction.
|
||||
*/
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>
|
||||
nativeVideoSource;
|
||||
|
||||
/** Initialize an RTCVideoSource from a native VideoTrackSourceInterface. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeVideoSource:
|
||||
(rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>)nativeVideoSource
|
||||
NS_DESIGNATED_INITIALIZER;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaSource:(rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
|
||||
type:(RTCMediaSourceType)type NS_UNAVAILABLE;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
signalingThread:(rtc::Thread *)signalingThread
|
||||
workerThread:(rtc::Thread *)workerThread;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCVideoSource+Private.h"
|
||||
|
||||
#include "api/videosourceproxy.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "sdk/objc/Framework/Native/src/objc_video_track_source.h"
|
||||
|
||||
static webrtc::ObjCVideoTrackSource *getObjCVideoSource(
|
||||
const rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> nativeSource) {
|
||||
webrtc::VideoTrackSourceProxy *proxy_source =
|
||||
static_cast<webrtc::VideoTrackSourceProxy *>(nativeSource.get());
|
||||
return static_cast<webrtc::ObjCVideoTrackSource *>(proxy_source->internal());
|
||||
}
|
||||
|
||||
// TODO(magjed): Refactor this class and target ObjCVideoTrackSource only once
|
||||
// RTCAVFoundationVideoSource is gone. See http://crbug/webrtc/7177 for more
|
||||
// info.
|
||||
@implementation RTCVideoSource {
|
||||
rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> _nativeVideoSource;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeVideoSource:
|
||||
(rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>)nativeVideoSource {
|
||||
RTC_DCHECK(factory);
|
||||
RTC_DCHECK(nativeVideoSource);
|
||||
if (self = [super initWithFactory:factory
|
||||
nativeMediaSource:nativeVideoSource
|
||||
type:RTCMediaSourceTypeVideo]) {
|
||||
_nativeVideoSource = nativeVideoSource;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeMediaSource:(rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
|
||||
type:(RTCMediaSourceType)type {
|
||||
RTC_NOTREACHED();
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
signalingThread:(rtc::Thread *)signalingThread
|
||||
workerThread:(rtc::Thread *)workerThread {
|
||||
rtc::scoped_refptr<webrtc::ObjCVideoTrackSource> objCVideoTrackSource(
|
||||
new rtc::RefCountedObject<webrtc::ObjCVideoTrackSource>());
|
||||
|
||||
return [self initWithFactory:factory
|
||||
nativeVideoSource:webrtc::VideoTrackSourceProxy::Create(
|
||||
signalingThread, workerThread, objCVideoTrackSource)];
|
||||
}
|
||||
|
||||
- (NSString *)description {
|
||||
NSString *stateString = [[self class] stringForState:self.state];
|
||||
return [NSString stringWithFormat:@"RTCVideoSource( %p ): %@", self, stateString];
|
||||
}
|
||||
|
||||
- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame {
|
||||
getObjCVideoSource(_nativeVideoSource)->OnCapturedFrame(frame);
|
||||
}
|
||||
|
||||
- (void)adaptOutputFormatToWidth:(int)width height:(int)height fps:(int)fps {
|
||||
getObjCVideoSource(_nativeVideoSource)->OnOutputFormatRequest(width, height, fps);
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>)nativeVideoSource {
|
||||
return _nativeVideoSource;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "WebRTC/RTCVideoTrack.h"
|
||||
|
||||
#include "api/mediastreaminterface.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface RTCVideoTrack ()
|
||||
|
||||
/** VideoTrackInterface created or passed in at construction. */
|
||||
@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::VideoTrackInterface> nativeVideoTrack;
|
||||
|
||||
/** Initialize an RTCVideoTrack with its source and an id. */
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
source:(RTCVideoSource *)source
|
||||
trackId:(NSString *)trackId;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@ -1,113 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import "RTCVideoTrack+Private.h"
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCMediaStreamTrack+Private.h"
|
||||
#import "RTCPeerConnectionFactory+Private.h"
|
||||
#import "RTCVideoRendererAdapter+Private.h"
|
||||
#import "RTCVideoSource+Private.h"
|
||||
|
||||
@implementation RTCVideoTrack {
|
||||
NSMutableArray *_adapters;
|
||||
}
|
||||
|
||||
@synthesize source = _source;
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
source:(RTCVideoSource *)source
|
||||
trackId:(NSString *)trackId {
|
||||
NSParameterAssert(factory);
|
||||
NSParameterAssert(source);
|
||||
NSParameterAssert(trackId.length);
|
||||
std::string nativeId = [NSString stdStringForString:trackId];
|
||||
rtc::scoped_refptr<webrtc::VideoTrackInterface> track =
|
||||
factory.nativeFactory->CreateVideoTrack(nativeId,
|
||||
source.nativeVideoSource);
|
||||
if (self = [self initWithFactory:factory nativeTrack:track type:RTCMediaStreamTrackTypeVideo]) {
|
||||
_source = source;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
|
||||
nativeTrack:
|
||||
(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeMediaTrack
|
||||
type:(RTCMediaStreamTrackType)type {
|
||||
NSParameterAssert(factory);
|
||||
NSParameterAssert(nativeMediaTrack);
|
||||
NSParameterAssert(type == RTCMediaStreamTrackTypeVideo);
|
||||
if (self = [super initWithFactory:factory nativeTrack:nativeMediaTrack type:type]) {
|
||||
_adapters = [NSMutableArray array];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
for (RTCVideoRendererAdapter *adapter in _adapters) {
|
||||
self.nativeVideoTrack->RemoveSink(adapter.nativeVideoRenderer);
|
||||
}
|
||||
}
|
||||
|
||||
- (RTCVideoSource *)source {
|
||||
if (!_source) {
|
||||
rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
|
||||
self.nativeVideoTrack->GetSource();
|
||||
if (source) {
|
||||
_source =
|
||||
[[RTCVideoSource alloc] initWithFactory:self.factory nativeVideoSource:source.get()];
|
||||
}
|
||||
}
|
||||
return _source;
|
||||
}
|
||||
|
||||
- (void)addRenderer:(id<RTCVideoRenderer>)renderer {
|
||||
// Make sure we don't have this renderer yet.
|
||||
for (RTCVideoRendererAdapter *adapter in _adapters) {
|
||||
if (adapter.videoRenderer == renderer) {
|
||||
NSAssert(NO, @"|renderer| is already attached to this track");
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Create a wrapper that provides a native pointer for us.
|
||||
RTCVideoRendererAdapter* adapter =
|
||||
[[RTCVideoRendererAdapter alloc] initWithNativeRenderer:renderer];
|
||||
[_adapters addObject:adapter];
|
||||
self.nativeVideoTrack->AddOrUpdateSink(adapter.nativeVideoRenderer,
|
||||
rtc::VideoSinkWants());
|
||||
}
|
||||
|
||||
- (void)removeRenderer:(id<RTCVideoRenderer>)renderer {
|
||||
__block NSUInteger indexToRemove = NSNotFound;
|
||||
[_adapters enumerateObjectsUsingBlock:^(RTCVideoRendererAdapter *adapter,
|
||||
NSUInteger idx,
|
||||
BOOL *stop) {
|
||||
if (adapter.videoRenderer == renderer) {
|
||||
indexToRemove = idx;
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
if (indexToRemove == NSNotFound) {
|
||||
return;
|
||||
}
|
||||
RTCVideoRendererAdapter *adapterToRemove =
|
||||
[_adapters objectAtIndex:indexToRemove];
|
||||
self.nativeVideoTrack->RemoveSink(adapterToRemove.nativeVideoRenderer);
|
||||
[_adapters removeObjectAtIndex:indexToRemove];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack {
|
||||
return static_cast<webrtc::VideoTrackInterface *>(self.nativeTrack.get());
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
#include "api/video_codecs/video_decoder.h"
|
||||
#include "media/base/codec.h"
|
||||
|
||||
@interface RTCWrappedNativeVideoDecoder : NSObject <RTCVideoDecoder>
|
||||
|
||||
- (instancetype)initWithNativeDecoder:(std::unique_ptr<webrtc::VideoDecoder>)decoder;
|
||||
|
||||
/* This moves the ownership of the wrapped decoder to the caller. */
|
||||
- (std::unique_ptr<webrtc::VideoDecoder>)releaseWrappedDecoder;
|
||||
|
||||
@end
|
||||
@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCWrappedNativeVideoDecoder.h"
|
||||
|
||||
@implementation RTCWrappedNativeVideoDecoder {
|
||||
std::unique_ptr<webrtc::VideoDecoder> _wrappedDecoder;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeDecoder:(std::unique_ptr<webrtc::VideoDecoder>)decoder {
|
||||
if (self = [super init]) {
|
||||
_wrappedDecoder = std::move(decoder);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (std::unique_ptr<webrtc::VideoDecoder>)releaseWrappedDecoder {
|
||||
return std::move(_wrappedDecoder);
|
||||
}
|
||||
|
||||
#pragma mark - RTCVideoDecoder
|
||||
|
||||
- (void)setCallback:(RTCVideoDecoderCallback)callback {
|
||||
RTC_NOTREACHED();
|
||||
}
|
||||
|
||||
- (NSInteger)startDecodeWithNumberOfCores:(int)numberOfCores {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings
|
||||
numberOfCores:(int)numberOfCores {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)releaseDecoder {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)decode:(RTCEncodedImage *)encodedImage
|
||||
missingFrames:(BOOL)missingFrames
|
||||
codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info
|
||||
renderTimeMs:(int64_t)renderTimeMs {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSString *)implementationName {
|
||||
RTC_NOTREACHED();
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "WebRTC/RTCVideoCodec.h"
|
||||
#include "api/video_codecs/sdp_video_format.h"
|
||||
#include "api/video_codecs/video_encoder.h"
|
||||
#include "media/base/codec.h"
|
||||
|
||||
@interface RTCWrappedNativeVideoEncoder : NSObject <RTCVideoEncoder>
|
||||
|
||||
- (instancetype)initWithNativeEncoder:(std::unique_ptr<webrtc::VideoEncoder>)encoder;
|
||||
|
||||
/* This moves the ownership of the wrapped encoder to the caller. */
|
||||
- (std::unique_ptr<webrtc::VideoEncoder>)releaseWrappedEncoder;
|
||||
|
||||
@end
|
||||
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "NSString+StdString.h"
|
||||
#import "RTCWrappedNativeVideoEncoder.h"
|
||||
|
||||
@implementation RTCWrappedNativeVideoEncoder {
|
||||
std::unique_ptr<webrtc::VideoEncoder> _wrappedEncoder;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNativeEncoder:(std::unique_ptr<webrtc::VideoEncoder>)encoder {
|
||||
if (self = [super init]) {
|
||||
_wrappedEncoder = std::move(encoder);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (std::unique_ptr<webrtc::VideoEncoder>)releaseWrappedEncoder {
|
||||
return std::move(_wrappedEncoder);
|
||||
}
|
||||
|
||||
#pragma mark - RTCVideoEncoder
|
||||
|
||||
- (void)setCallback:(RTCVideoEncoderCallback)callback {
|
||||
RTC_NOTREACHED();
|
||||
}
|
||||
|
||||
- (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings
|
||||
numberOfCores:(int)numberOfCores {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)releaseEncoder {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)encode:(RTCVideoFrame *)frame
|
||||
codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info
|
||||
frameTypes:(NSArray<NSNumber *> *)frameTypes {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate {
|
||||
RTC_NOTREACHED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSString *)implementationName {
|
||||
RTC_NOTREACHED();
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (RTCVideoEncoderQpThresholds *)scalingSettings {
|
||||
RTC_NOTREACHED();
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user