Injectable software video codecs in Obj-C.

When injecting video codec factories in the Obj-C SDK, use the new
peer connection API that uses webrtc::Video{De,En}CoderFactory classes
and does not automatically add internal software codecs. Instead the
injected factory can support internal VP8 and VP9 codecs through the
included Obj-C classes RTCVideo{De,En}coderVP{8,9}.

When not explicitly injecting any video codec factory, the old code
path is still used and injects only H264 as an external codec and
the internal codec factory is used.

Bug: webrtc:7925
Change-Id: I657d30dfde71da9c0be341e213ab9f97a04caa58
Reviewed-on: https://webrtc-review.googlesource.com/3620
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20175}
This commit is contained in:
Anders Carlsson
2017-10-05 16:55:38 +02:00
committed by Commit Bot
parent c522298e03
commit 7e04281870
35 changed files with 856 additions and 133 deletions

View File

@ -233,6 +233,10 @@ if (is_ios || (is_mac && target_cpu != "x86")) {
"objc/AppRTCMobile/ARDTURNClient+Internal.h", "objc/AppRTCMobile/ARDTURNClient+Internal.h",
"objc/AppRTCMobile/ARDTURNClient.h", "objc/AppRTCMobile/ARDTURNClient.h",
"objc/AppRTCMobile/ARDTURNClient.m", "objc/AppRTCMobile/ARDTURNClient.m",
"objc/AppRTCMobile/ARDVideoDecoderFactory.h",
"objc/AppRTCMobile/ARDVideoDecoderFactory.m",
"objc/AppRTCMobile/ARDVideoEncoderFactory.h",
"objc/AppRTCMobile/ARDVideoEncoderFactory.m",
"objc/AppRTCMobile/ARDWebSocketChannel.h", "objc/AppRTCMobile/ARDWebSocketChannel.h",
"objc/AppRTCMobile/ARDWebSocketChannel.m", "objc/AppRTCMobile/ARDWebSocketChannel.m",
"objc/AppRTCMobile/RTCIceCandidate+JSON.h", "objc/AppRTCMobile/RTCIceCandidate+JSON.h",

View File

@ -32,6 +32,8 @@
#import "ARDSignalingMessage.h" #import "ARDSignalingMessage.h"
#import "ARDTURNClient+Internal.h" #import "ARDTURNClient+Internal.h"
#import "ARDUtilities.h" #import "ARDUtilities.h"
#import "ARDVideoDecoderFactory.h"
#import "ARDVideoEncoderFactory.h"
#import "ARDWebSocketChannel.h" #import "ARDWebSocketChannel.h"
#import "RTCIceCandidate+JSON.h" #import "RTCIceCandidate+JSON.h"
#import "RTCSessionDescription+JSON.h" #import "RTCSessionDescription+JSON.h"
@ -163,7 +165,10 @@ static int const kKbpsMultiplier = 1000;
} }
- (void)configure { - (void)configure {
_factory = [[RTCPeerConnectionFactory alloc] init]; ARDVideoDecoderFactory *decoderFactory = [[ARDVideoDecoderFactory alloc] init];
ARDVideoEncoderFactory *encoderFactory = [[ARDVideoEncoderFactory alloc] init];
_factory = [[RTCPeerConnectionFactory alloc] initWithEncoderFactory:encoderFactory
decoderFactory:decoderFactory];
_messageQueue = [NSMutableArray array]; _messageQueue = [NSMutableArray array];
_iceServers = [NSMutableArray array]; _iceServers = [NSMutableArray array];
_fileLogger = [[RTCFileLogger alloc] init]; _fileLogger = [[RTCFileLogger alloc] init];

View File

@ -0,0 +1,16 @@
/*
* 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/RTCVideoCodecFactory.h"
@interface ARDVideoDecoderFactory : NSObject<RTCVideoDecoderFactory>
@end

View File

@ -0,0 +1,39 @@
/*
* 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 "ARDVideoDecoderFactory.h"
#import "WebRTC/RTCVideoCodecH264.h"
#import "WebRTC/RTCVideoDecoderVP8.h"
#import "WebRTC/RTCVideoDecoderVP9.h"
@implementation ARDVideoDecoderFactory
- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info {
if ([info.name isEqualToString:@"H264"]) {
return [[RTCVideoDecoderH264 alloc] init];
} else if ([info.name isEqualToString:@"VP8"]) {
return [RTCVideoDecoderVP8 vp8Decoder];
} else if ([info.name isEqualToString:@"VP9"]) {
return [RTCVideoDecoderVP9 vp9Decoder];
}
return nil;
}
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
return @[
[[RTCVideoCodecInfo alloc] initWithName:@"H264" parameters:nil],
[[RTCVideoCodecInfo alloc] initWithName:@"VP8" parameters:nil],
[[RTCVideoCodecInfo alloc] initWithName:@"VP9" parameters:nil]
];
}
@end

View File

@ -0,0 +1,16 @@
/*
* 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/RTCVideoCodecFactory.h"
@interface ARDVideoEncoderFactory : NSObject<RTCVideoEncoderFactory>
@end

View File

@ -0,0 +1,64 @@
/*
* 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 "ARDVideoEncoderFactory.h"
#import "WebRTC/RTCVideoCodecH264.h"
#import "WebRTC/RTCVideoEncoderVP8.h"
#import "WebRTC/RTCVideoEncoderVP9.h"
static NSString *kLevel31ConstrainedHigh = @"640c1f";
static NSString *kLevel31ConstrainedBaseline = @"42e01f";
@implementation ARDVideoEncoderFactory
- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
if ([info.name isEqualToString:@"H264"]) {
return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
} else if ([info.name isEqualToString:@"VP8"]) {
return [RTCVideoEncoderVP8 vp8Encoder];
} else if ([info.name isEqualToString:@"VP9"]) {
return [RTCVideoEncoderVP9 vp9Encoder];
}
return nil;
}
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
NSMutableArray<RTCVideoCodecInfo *> *codecs = [NSMutableArray array];
NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
@"profile-level-id" : kLevel31ConstrainedHigh,
@"level-asymmetry-allowed" : @"1",
@"packetization-mode" : @"1",
};
RTCVideoCodecInfo *constrainedHighInfo =
[[RTCVideoCodecInfo alloc] initWithName:@"H264" parameters:constrainedHighParams];
[codecs addObject:constrainedHighInfo];
NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
@"profile-level-id" : kLevel31ConstrainedBaseline,
@"level-asymmetry-allowed" : @"1",
@"packetization-mode" : @"1",
};
RTCVideoCodecInfo *constrainedBaselineInfo =
[[RTCVideoCodecInfo alloc] initWithName:@"H264" parameters:constrainedBaselineParams];
[codecs addObject:constrainedBaselineInfo];
RTCVideoCodecInfo *vp8Info = [[RTCVideoCodecInfo alloc] initWithName:@"VP8" parameters:nil];
[codecs addObject:vp8Info];
RTCVideoCodecInfo *vp9Info = [[RTCVideoCodecInfo alloc] initWithName:@"VP9" parameters:nil];
[codecs addObject:vp9Info];
return [codecs copy];
}
@end

View File

@ -434,7 +434,10 @@ if (is_ios || is_mac) {
"objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m", "objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m",
"objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h", "objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h",
"objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm", "objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm",
"objc/Framework/Classes/PeerConnection/RTCVideoCodecVP8.mm",
"objc/Framework/Classes/PeerConnection/RTCVideoCodecVP9.mm",
"objc/Framework/Classes/PeerConnection/RTCVideoEncoderSettings.mm", "objc/Framework/Classes/PeerConnection/RTCVideoEncoderSettings.mm",
"objc/Framework/Classes/PeerConnection/RTCVideoFrame+Private.h",
"objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm", "objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm",
"objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h", "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h",
"objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h", "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h",
@ -443,6 +446,10 @@ if (is_ios || is_mac) {
"objc/Framework/Classes/PeerConnection/RTCVideoSource.mm", "objc/Framework/Classes/PeerConnection/RTCVideoSource.mm",
"objc/Framework/Classes/PeerConnection/RTCVideoTrack+Private.h", "objc/Framework/Classes/PeerConnection/RTCVideoTrack+Private.h",
"objc/Framework/Classes/PeerConnection/RTCVideoTrack.mm", "objc/Framework/Classes/PeerConnection/RTCVideoTrack.mm",
"objc/Framework/Classes/PeerConnection/RTCWrappedNativeVideoDecoder.h",
"objc/Framework/Classes/PeerConnection/RTCWrappedNativeVideoDecoder.mm",
"objc/Framework/Classes/PeerConnection/RTCWrappedNativeVideoEncoder.h",
"objc/Framework/Classes/PeerConnection/RTCWrappedNativeVideoEncoder.mm",
"objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h", "objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h",
"objc/Framework/Headers/WebRTC/RTCAudioSource.h", "objc/Framework/Headers/WebRTC/RTCAudioSource.h",
"objc/Framework/Headers/WebRTC/RTCAudioTrack.h", "objc/Framework/Headers/WebRTC/RTCAudioTrack.h",
@ -493,9 +500,12 @@ if (is_ios || is_mac) {
":corevideoframebuffer_objc", ":corevideoframebuffer_objc",
":videotracksource_objc", ":videotracksource_objc",
"../api:video_frame_api", "../api:video_frame_api",
"../api/video_codecs:video_codecs_api",
"../common_video", "../common_video",
"../media:rtc_media_base", "../media:rtc_media_base",
"../modules:module_api", "../modules:module_api",
"../modules/video_coding:webrtc_vp8",
"../modules/video_coding:webrtc_vp9",
"../pc:peerconnection", "../pc:peerconnection",
"../rtc_base:rtc_base", "../rtc_base:rtc_base",
] ]
@ -621,6 +631,11 @@ if (is_ios || is_mac) {
"objc/Framework/Headers/WebRTC/RTCSessionDescription.h", "objc/Framework/Headers/WebRTC/RTCSessionDescription.h",
"objc/Framework/Headers/WebRTC/RTCTracing.h", "objc/Framework/Headers/WebRTC/RTCTracing.h",
"objc/Framework/Headers/WebRTC/RTCVideoCapturer.h", "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
"objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h",
"objc/Framework/Headers/WebRTC/RTCVideoDecoderVP8.h",
"objc/Framework/Headers/WebRTC/RTCVideoDecoderVP9.h",
"objc/Framework/Headers/WebRTC/RTCVideoEncoderVP8.h",
"objc/Framework/Headers/WebRTC/RTCVideoEncoderVP9.h",
"objc/Framework/Headers/WebRTC/RTCVideoFrame.h", "objc/Framework/Headers/WebRTC/RTCVideoFrame.h",
"objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h", "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
"objc/Framework/Headers/WebRTC/RTCVideoRenderer.h", "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h",
@ -628,7 +643,6 @@ if (is_ios || is_mac) {
"objc/Framework/Headers/WebRTC/RTCVideoTrack.h", "objc/Framework/Headers/WebRTC/RTCVideoTrack.h",
"objc/Framework/Headers/WebRTC/RTCVideoViewShading.h", "objc/Framework/Headers/WebRTC/RTCVideoViewShading.h",
"objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h", "objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h",
"objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h",
"objc/Framework/Headers/WebRTC/WebRTC.h", "objc/Framework/Headers/WebRTC/WebRTC.h",
] ]
if (rtc_use_metal_rendering) { if (rtc_use_metal_rendering) {

View File

@ -15,4 +15,6 @@ include_rules = [
"+modules/video_coding", "+modules/video_coding",
"+pc", "+pc",
"+system_wrappers", "+system_wrappers",
] "+modules/audio_device",
"+modules/audio_processing",
]

View File

@ -16,6 +16,8 @@ namespace webrtc {
class AudioEncoderFactory; class AudioEncoderFactory;
class AudioDecoderFactory; class AudioDecoderFactory;
class VideoEncoderFactory;
class VideoDecoderFactory;
} // namespace webrtc } // namespace webrtc
@ -33,16 +35,31 @@ NS_ASSUME_NONNULL_BEGIN
*/ */
@interface RTCPeerConnectionFactory () @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 */ /* Initialize object with injectable native audio/video encoder/decoder factories */
- (instancetype)initWithNativeAudioEncoderFactory: - (instancetype)initWithNativeAudioEncoderFactory:
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory (rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
nativeAudioDecoderFactory: nativeAudioDecoderFactory:
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory (rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
nativeVideoEncoderFactory: nativeVideoEncoderFactory:
(nullable cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory (std::unique_ptr<webrtc::VideoEncoderFactory>)videoEncoderFactory
nativeVideoDecoderFactory: nativeVideoDecoderFactory:
(nullable cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory (std::unique_ptr<webrtc::VideoDecoderFactory>)videoDecoderFactory;
NS_DESIGNATED_INITIALIZER;
/* Initialize object with legacy injectable native audio/video encoder/decoder factories
TODO(andersc): Remove this when backwards compatiblity is no longer needed.
*/
- (instancetype)
initWithNativeAudioEncoderFactory:
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
nativeAudioDecoderFactory:
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
legacyNativeVideoEncoderFactory:(cricket::WebRtcVideoEncoderFactory*)videoEncoderFactory
legacyNativeVideoDecoderFactory:(cricket::WebRtcVideoDecoderFactory*)videoDecoderFactory;
@end @end

View File

@ -28,8 +28,10 @@
#import "WebRTC/RTCVideoCodecH264.h" #import "WebRTC/RTCVideoCodecH264.h"
// The no-media version PeerConnectionFactory doesn't depend on these files, but the gn check tool // 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. // 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_decoder_factory.h" // nogncheck
#include "api/audio_codecs/builtin_audio_encoder_factory.h" // nogncheck #include "api/audio_codecs/builtin_audio_encoder_factory.h" // nogncheck
#include "modules/audio_device/include/audio_device.h" // nogncheck
#include "modules/audio_processing/include/audio_processing.h" // nogncheck
#endif #endif
#include "Video/objcvideotracksource.h" #include "Video/objcvideotracksource.h"
@ -52,16 +54,13 @@
- (instancetype)init { - (instancetype)init {
#ifdef HAVE_NO_MEDIA #ifdef HAVE_NO_MEDIA
return [self initWithNativeAudioEncoderFactory:nil return [self initWithNoMedia];
nativeAudioDecoderFactory:nil
nativeVideoEncoderFactory:nil
nativeVideoDecoderFactory:nil];
#else #else
return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory() return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory() nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
nativeVideoEncoderFactory:new webrtc::ObjCVideoEncoderFactory( legacyNativeVideoEncoderFactory:new webrtc::ObjCVideoEncoderFactory(
[[RTCVideoEncoderFactoryH264 alloc] init]) [[RTCVideoEncoderFactoryH264 alloc] init])
nativeVideoDecoderFactory:new webrtc::ObjCVideoDecoderFactory( legacyNativeVideoDecoderFactory:new webrtc::ObjCVideoDecoderFactory(
[[RTCVideoDecoderFactoryH264 alloc] init])]; [[RTCVideoDecoderFactoryH264 alloc] init])];
#endif #endif
} }
@ -69,30 +68,24 @@
- (instancetype)initWithEncoderFactory:(nullable id<RTCVideoEncoderFactory>)encoderFactory - (instancetype)initWithEncoderFactory:(nullable id<RTCVideoEncoderFactory>)encoderFactory
decoderFactory:(nullable id<RTCVideoDecoderFactory>)decoderFactory { decoderFactory:(nullable id<RTCVideoDecoderFactory>)decoderFactory {
#ifdef HAVE_NO_MEDIA #ifdef HAVE_NO_MEDIA
return [self initWithNativeAudioEncoderFactory:nil return [self initWithNoMedia];
nativeAudioDecoderFactory:nil
nativeVideoEncoderFactory:nil
nativeVideoDecoderFactory:nil];
#else #else
cricket::WebRtcVideoEncoderFactory *native_encoder_factory = std::unique_ptr<webrtc::VideoEncoderFactory> native_encoder_factory;
encoderFactory ? new webrtc::ObjCVideoEncoderFactory(encoderFactory) : nullptr; std::unique_ptr<webrtc::VideoDecoderFactory> native_decoder_factory;
cricket::WebRtcVideoDecoderFactory *native_decoder_factory = if (encoderFactory) {
decoderFactory ? new webrtc::ObjCVideoDecoderFactory(decoderFactory) : nullptr; native_encoder_factory.reset(new webrtc::ObjCVideoEncoderFactory(encoderFactory));
}
if (decoderFactory) {
native_decoder_factory.reset(new webrtc::ObjCVideoDecoderFactory(decoderFactory));
}
return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory() return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory() nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
nativeVideoEncoderFactory:native_encoder_factory nativeVideoEncoderFactory:std::move(native_encoder_factory)
nativeVideoDecoderFactory:native_decoder_factory]; nativeVideoDecoderFactory:std::move(native_decoder_factory)];
#endif #endif
} }
- (instancetype)initWithNativeAudioEncoderFactory: - (instancetype)initNative {
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
nativeAudioDecoderFactory:
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
nativeVideoEncoderFactory:
(nullable cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory
nativeVideoDecoderFactory:
(nullable cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory {
if (self = [super init]) { if (self = [super init]) {
_networkThread = rtc::Thread::CreateWithSocketServer(); _networkThread = rtc::Thread::CreateWithSocketServer();
BOOL result = _networkThread->Start(); BOOL result = _networkThread->Start();
@ -105,7 +98,12 @@
_signalingThread = rtc::Thread::Create(); _signalingThread = rtc::Thread::Create();
result = _signalingThread->Start(); result = _signalingThread->Start();
NSAssert(result, @"Failed to start signaling thread."); NSAssert(result, @"Failed to start signaling thread.");
#ifdef HAVE_NO_MEDIA }
return self;
}
- (instancetype)initWithNoMedia {
if (self = [self initNative]) {
_nativeFactory = webrtc::CreateModularPeerConnectionFactory( _nativeFactory = webrtc::CreateModularPeerConnectionFactory(
_networkThread.get(), _networkThread.get(),
_workerThread.get(), _workerThread.get(),
@ -113,9 +111,51 @@
std::unique_ptr<cricket::MediaEngineInterface>(), std::unique_ptr<cricket::MediaEngineInterface>(),
std::unique_ptr<webrtc::CallFactoryInterface>(), std::unique_ptr<webrtc::CallFactoryInterface>(),
std::unique_ptr<webrtc::RtcEventLogFactoryInterface>()); 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 {
#ifdef HAVE_NO_MEDIA
return [self initWithNoMedia];
#else #else
// Ownership of encoder/decoder factories is passed on to the if (self = [self initNative]) {
// peerconnectionfactory, that handles deleting them. _nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(),
_workerThread.get(),
_signalingThread.get(),
nullptr, // audio device module
audioEncoderFactory,
audioDecoderFactory,
std::move(videoEncoderFactory),
std::move(videoDecoderFactory),
nullptr, // audio mixer
nullptr // audio processing
);
NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!");
}
return self;
#endif
}
- (instancetype)
initWithNativeAudioEncoderFactory:
(rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
nativeAudioDecoderFactory:
(rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
legacyNativeVideoEncoderFactory:(cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory
legacyNativeVideoDecoderFactory:(cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory {
#ifdef HAVE_NO_MEDIA
return [self initWithNoMedia];
#else
if (self = [self initNative]) {
_nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(), _nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(),
_workerThread.get(), _workerThread.get(),
_signalingThread.get(), _signalingThread.get(),
@ -124,10 +164,10 @@
audioDecoderFactory, audioDecoderFactory,
videoEncoderFactory, videoEncoderFactory,
videoDecoderFactory); videoDecoderFactory);
#endif
NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!");
} }
return self; return self;
#endif
} }
- (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints { - (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints {

View File

@ -12,6 +12,7 @@
#import "WebRTC/RTCVideoCodecH264.h" #import "WebRTC/RTCVideoCodecH264.h"
#include "api/video_codecs/sdp_video_format.h"
#include "common_video/include/video_frame.h" #include "common_video/include/video_frame.h"
#include "media/base/codec.h" #include "media/base/codec.h"
#include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/include/video_codec_interface.h"
@ -29,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface RTCVideoEncoderSettings () @interface RTCVideoEncoderSettings ()
- (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *__nullable)videoCodec; - (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *__nullable)videoCodec;
- (webrtc::VideoCodec)nativeVideoCodec;
@end @end
@ -48,10 +50,11 @@ NS_ASSUME_NONNULL_BEGIN
@interface RTCVideoCodecInfo () @interface RTCVideoCodecInfo ()
- (instancetype)initWithNativeSdpVideoFormat:(webrtc::SdpVideoFormat)format;
- (webrtc::SdpVideoFormat)nativeSdpVideoFormat;
/* TODO(andersc): These are deprecated, remove when no longer in use. */
- (instancetype)initWithNativeVideoCodec:(cricket::VideoCodec)videoCodec; - (instancetype)initWithNativeVideoCodec:(cricket::VideoCodec)videoCodec;
- (instancetype)initWithPayload:(NSInteger)payload
name:(NSString *)name
parameters:(NSDictionary<NSString *, NSString *> *)parameters;
- (cricket::VideoCodec)nativeVideoCodec; - (cricket::VideoCodec)nativeVideoCodec;
@end @end

View File

@ -16,7 +16,6 @@
@implementation RTCVideoCodecInfo @implementation RTCVideoCodecInfo
@synthesize payload = _payload;
@synthesize name = _name; @synthesize name = _name;
@synthesize parameters = _parameters; @synthesize parameters = _parameters;
@ -27,7 +26,6 @@
- (instancetype)initWithName:(NSString *)name - (instancetype)initWithName:(NSString *)name
parameters:(nullable NSDictionary<NSString *, NSString *> *)parameters { parameters:(nullable NSDictionary<NSString *, NSString *> *)parameters {
if (self = [super init]) { if (self = [super init]) {
_payload = 0;
_name = name; _name = name;
_parameters = (parameters ? parameters : @{}); _parameters = (parameters ? parameters : @{});
} }
@ -35,40 +33,22 @@
return self; return self;
} }
- (instancetype)initWithNativeVideoCodec:(cricket::VideoCodec)videoCodec { - (instancetype)initWithNativeSdpVideoFormat:(webrtc::SdpVideoFormat)format {
NSMutableDictionary *params = [NSMutableDictionary dictionary]; NSMutableDictionary *params = [NSMutableDictionary dictionary];
for (auto it = videoCodec.params.begin(); it != videoCodec.params.end(); ++it) { for (auto it = format.parameters.begin(); it != format.parameters.end(); ++it) {
[params setObject:[NSString stringForStdString:it->second] [params setObject:[NSString stringForStdString:it->second]
forKey:[NSString stringForStdString:it->first]]; forKey:[NSString stringForStdString:it->first]];
} }
return [self initWithPayload:videoCodec.id return [self initWithName:[NSString stringForStdString:format.name] parameters:params];
name:[NSString stringForStdString:videoCodec.name]
parameters:params];
} }
- (instancetype)initWithPayload:(NSInteger)payload - (instancetype)initWithNativeVideoCodec:(cricket::VideoCodec)videoCodec {
name:(NSString *)name return [self
parameters:(NSDictionary<NSString *, NSString *> *)parameters { initWithNativeSdpVideoFormat:webrtc::SdpVideoFormat(videoCodec.name, videoCodec.params)];
if (self = [self initWithName:name parameters:parameters]) {
_payload = payload;
}
return self;
}
- (cricket::VideoCodec)nativeVideoCodec {
cricket::VideoCodec codec([NSString stdStringForString:_name]);
for (NSString *paramKey in _parameters.allKeys) {
codec.SetParam([NSString stdStringForString:paramKey],
[NSString stdStringForString:_parameters[paramKey]]);
}
return codec;
} }
- (BOOL)isEqualToCodecInfo:(RTCVideoCodecInfo *)info { - (BOOL)isEqualToCodecInfo:(RTCVideoCodecInfo *)info {
if (!info || if (!info ||
self.payload != info.payload ||
![self.name isEqualToString:info.name] || ![self.name isEqualToString:info.name] ||
![self.parameters isEqualToDictionary:info.parameters]) { ![self.parameters isEqualToDictionary:info.parameters]) {
return NO; return NO;
@ -85,7 +65,28 @@
} }
- (NSUInteger)hash { - (NSUInteger)hash {
return [self.name hash] ^ self.payload ^ [self.parameters 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);
}
- (cricket::VideoCodec)nativeVideoCodec {
cricket::VideoCodec codec([NSString stdStringForString:_name]);
for (NSString *paramKey in _parameters.allKeys) {
codec.SetParam([NSString stdStringForString:paramKey],
[NSString stdStringForString:_parameters[paramKey]]);
}
return codec;
} }
@end @end

View File

@ -20,6 +20,7 @@
#include "system_wrappers/include/field_trial.h" #include "system_wrappers/include/field_trial.h"
const char kHighProfileExperiment[] = "WebRTC-H264HighProfile"; const char kHighProfileExperiment[] = "WebRTC-H264HighProfile";
static NSString *kH264CodecName = @"H264";
static NSString *kLevel31ConstrainedHigh = @"640c1f"; static NSString *kLevel31ConstrainedHigh = @"640c1f";
static NSString *kLevel31ConstrainedBaseline = @"42e01f"; static NSString *kLevel31ConstrainedBaseline = @"42e01f";
@ -35,7 +36,7 @@ bool IsHighProfileEnabled() {
- (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo { - (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo {
webrtc::CodecSpecificInfo codecSpecificInfo; webrtc::CodecSpecificInfo codecSpecificInfo;
codecSpecificInfo.codecType = webrtc::kVideoCodecH264; codecSpecificInfo.codecType = webrtc::kVideoCodecH264;
codecSpecificInfo.codec_name = "H264"; codecSpecificInfo.codec_name = [kH264CodecName cStringUsingEncoding:NSUTF8StringEncoding];
codecSpecificInfo.codecSpecific.H264.packetization_mode = codecSpecificInfo.codecSpecific.H264.packetization_mode =
(webrtc::H264PacketizationMode)_packetizationMode; (webrtc::H264PacketizationMode)_packetizationMode;
@ -49,7 +50,7 @@ bool IsHighProfileEnabled() {
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs { - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
NSMutableArray<RTCVideoCodecInfo *> *codecs = [NSMutableArray array]; NSMutableArray<RTCVideoCodecInfo *> *codecs = [NSMutableArray array];
NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName]; NSString *codecName = kH264CodecName;
if (IsHighProfileEnabled()) { if (IsHighProfileEnabled()) {
NSDictionary<NSString *, NSString *> *constrainedHighParams = @{ NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
@ -88,7 +89,7 @@ bool IsHighProfileEnabled() {
} }
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs { - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName]; NSString *codecName = kH264CodecName;
return @[ [[RTCVideoCodecInfo alloc] initWithName:codecName parameters:nil] ]; return @[ [[RTCVideoCodecInfo alloc] initWithName:codecName parameters:nil] ];
} }

View File

@ -0,0 +1,41 @@
/*
* 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

View File

@ -0,0 +1,41 @@
/*
* 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

View File

@ -48,4 +48,19 @@
return self; 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 @end

View File

@ -0,0 +1,27 @@
/*
* 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 "RTCI420Buffer+Private.h"
#import "WebRTC/RTCVideoFrame.h"
#import "WebRTC/RTCVideoFrameBuffer.h"
#include "api/video/video_frame.h"
#include "sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
NS_ASSUME_NONNULL_BEGIN
@interface RTCVideoFrame ()
- (instancetype)initWithNativeVideoFrame:(const webrtc::VideoFrame &)frame;
- (webrtc::VideoFrame)nativeVideoFrame;
@end
NS_ASSUME_NONNULL_END

View File

@ -8,9 +8,21 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#import "RTCVideoFrame+Private.h"
#import "WebRTC/RTCVideoFrame.h" #import "WebRTC/RTCVideoFrame.h"
#import "WebRTC/RTCVideoFrameBuffer.h" #import "WebRTC/RTCVideoFrameBuffer.h"
#include "api/video/video_frame.h"
#include "rtc_base/timeutils.h"
id<RTCVideoFrameBuffer> nativeToRtcFrameBuffer(
const rtc::scoped_refptr<webrtc::VideoFrameBuffer> &buffer) {
return buffer->type() == webrtc::VideoFrameBuffer::Type::kNative ?
static_cast<webrtc::ObjCFrameBuffer *>(buffer.get())->wrapped_frame_buffer() :
[[RTCI420Buffer alloc] initWithFrameBuffer:buffer->ToI420()];
}
@implementation RTCVideoFrame { @implementation RTCVideoFrame {
RTCVideoRotation _rotation; RTCVideoRotation _rotation;
int64_t _timeStampNs; int64_t _timeStampNs;
@ -80,4 +92,24 @@
return self; return self;
} }
- (instancetype)initWithNativeVideoFrame:(const webrtc::VideoFrame &)frame {
if (self = [self initWithBuffer:nativeToRtcFrameBuffer(frame.video_frame_buffer())
rotation:RTCVideoRotation(frame.rotation())
timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec]) {
self.timeStamp = frame.timestamp();
}
return self;
}
- (webrtc::VideoFrame)nativeVideoFrame {
rtc::scoped_refptr<webrtc::VideoFrameBuffer> frameBuffer =
new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(self.buffer);
webrtc::VideoFrame videoFrame(frameBuffer,
(webrtc::VideoRotation)self.rotation,
self.timeStampNs / rtc::kNumNanosecsPerMicrosec);
videoFrame.set_timestamp(self.timeStamp);
return videoFrame;
}
@end @end

View File

@ -9,6 +9,7 @@
*/ */
#import "RTCI420Buffer+Private.h" #import "RTCI420Buffer+Private.h"
#import "RTCVideoFrame+Private.h"
#import "RTCVideoRendererAdapter+Private.h" #import "RTCVideoRendererAdapter+Private.h"
#import "WebRTC/RTCVideoFrame.h" #import "WebRTC/RTCVideoFrame.h"
#import "WebRTC/RTCVideoFrameBuffer.h" #import "WebRTC/RTCVideoFrameBuffer.h"
@ -27,19 +28,7 @@ class VideoRendererAdapter
} }
void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override { void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override {
rtc::scoped_refptr<VideoFrameBuffer> video_frame_buffer = nativeVideoFrame.video_frame_buffer(); RTCVideoFrame* videoFrame = [[RTCVideoFrame alloc] initWithNativeVideoFrame:nativeVideoFrame];
id<RTCVideoFrameBuffer> rtc_frame_buffer;
if (video_frame_buffer->type() == VideoFrameBuffer::Type::kNative) {
rtc::scoped_refptr<ObjCFrameBuffer> objc_frame_buffer(
static_cast<ObjCFrameBuffer*>(video_frame_buffer.get()));
rtc_frame_buffer = (id<RTCVideoFrameBuffer>)objc_frame_buffer->wrapped_frame_buffer();
} else {
rtc_frame_buffer = [[RTCI420Buffer alloc] initWithFrameBuffer:video_frame_buffer->ToI420()];
}
RTCVideoFrame* videoFrame = [[RTCVideoFrame alloc]
initWithBuffer:rtc_frame_buffer
rotation:static_cast<RTCVideoRotation>(nativeVideoFrame.rotation())
timeStampNs:nativeVideoFrame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
CGSize current_size = (videoFrame.rotation % 180 == 0) CGSize current_size = (videoFrame.rotation % 180 == 0)
? CGSizeMake(videoFrame.width, videoFrame.height) ? CGSizeMake(videoFrame.width, videoFrame.height)

View File

@ -0,0 +1,24 @@
/*
* 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

View File

@ -0,0 +1,63 @@
/*
* 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)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings
numberOfCores:(int)numberOfCores {
RTC_NOTREACHED();
return 0;
}
- (NSInteger)releaseDecoder {
RTC_NOTREACHED();
return 0;
}
- (NSInteger)decode:(RTCEncodedImage *)encodedImage
missingFrames:(BOOL)missingFrames
fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader
codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info
renderTimeMs:(int64_t)renderTimeMs {
RTC_NOTREACHED();
return 0;
}
- (NSString *)implementationName {
RTC_NOTREACHED();
return nil;
}
@end

View File

@ -0,0 +1,25 @@
/*
* 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

View File

@ -0,0 +1,71 @@
/*
* 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:(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

View File

@ -169,9 +169,9 @@ void compressionOutputCallback(void *encoder,
// specific VideoToolbox profile for the specified level, AutoLevel will be // specific VideoToolbox profile for the specified level, AutoLevel will be
// returned. The user must initialize the encoder with a resolution and // returned. The user must initialize the encoder with a resolution and
// framerate conforming to the selected H264 level regardless. // framerate conforming to the selected H264 level regardless.
CFStringRef ExtractProfile(const cricket::VideoCodec &codec) { CFStringRef ExtractProfile(webrtc::SdpVideoFormat videoFormat) {
const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id = const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id =
webrtc::H264::ParseSdpProfileLevelId(codec.params); webrtc::H264::ParseSdpProfileLevelId(videoFormat.parameters);
RTC_DCHECK(profile_level_id); RTC_DCHECK(profile_level_id);
switch (profile_level_id->profile) { switch (profile_level_id->profile) {
case webrtc::H264::kProfileConstrainedBaseline: case webrtc::H264::kProfileConstrainedBaseline:
@ -302,7 +302,7 @@ CFStringRef ExtractProfile(const cricket::VideoCodec &codec) {
_bitrateAdjuster.reset(new webrtc::BitrateAdjuster( _bitrateAdjuster.reset(new webrtc::BitrateAdjuster(
webrtc::Clock::GetRealTimeClock(), .5, .95)); webrtc::Clock::GetRealTimeClock(), .5, .95));
_packetizationMode = RTCH264PacketizationModeNonInterleaved; _packetizationMode = RTCH264PacketizationModeNonInterleaved;
_profile = ExtractProfile([codecInfo nativeVideoCodec]); _profile = ExtractProfile([codecInfo nativeSdpVideoFormat]);
LOG(LS_INFO) << "Using profile " << CFStringToString(_profile); LOG(LS_INFO) << "Using profile " << CFStringToString(_profile);
RTC_CHECK([codecInfo.name isEqualToString:@"H264"]); RTC_CHECK([codecInfo.name isEqualToString:@"H264"]);

View File

@ -11,6 +11,7 @@
#ifndef SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_ #ifndef SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_
#define SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_ #define SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_
#include "api/video_codecs/video_decoder_factory.h"
#include "media/base/codec.h" #include "media/base/codec.h"
#include "media/engine/webrtcvideodecoderfactory.h" #include "media/engine/webrtcvideodecoderfactory.h"
@ -18,22 +19,30 @@
namespace webrtc { namespace webrtc {
class ObjCVideoDecoderFactory : public cricket::WebRtcVideoDecoderFactory { // TODO(andersc): Remove the inheritance from cricket::WebRtcVideoDecoderFactory
// when the legacy path in [RTCPeerConnectionFactory init] is no longer needed.
class ObjCVideoDecoderFactory : public VideoDecoderFactory,
public cricket::WebRtcVideoDecoderFactory {
public: public:
explicit ObjCVideoDecoderFactory(id<RTCVideoDecoderFactory>); explicit ObjCVideoDecoderFactory(id<RTCVideoDecoderFactory>);
~ObjCVideoDecoderFactory(); ~ObjCVideoDecoderFactory();
id<RTCVideoDecoderFactory> wrapped_decoder_factory() const; id<RTCVideoDecoderFactory> wrapped_decoder_factory() const;
VideoDecoder* CreateVideoDecoderWithParams( std::vector<SdpVideoFormat> GetSupportedFormats() const override;
std::unique_ptr<VideoDecoder> CreateVideoDecoder(
const SdpVideoFormat& format) override;
// Needed for WebRtcVideoDecoderFactory interface.
webrtc::VideoDecoder* CreateVideoDecoderWithParams(
const cricket::VideoCodec& codec, const cricket::VideoCodec& codec,
cricket::VideoDecoderParams params) override; cricket::VideoDecoderParams params) override;
webrtc::VideoDecoder* CreateVideoDecoder(
webrtc::VideoCodecType type) override;
void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override; void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override;
private: private:
id<RTCVideoDecoderFactory> decoder_factory_; id<RTCVideoDecoderFactory> decoder_factory_;
std::vector<cricket::VideoCodec> supported_codecs_;
}; };
} // namespace webrtc } // namespace webrtc

View File

@ -12,12 +12,14 @@
#import "NSString+StdString.h" #import "NSString+StdString.h"
#import "RTCVideoCodec+Private.h" #import "RTCVideoCodec+Private.h"
#import "RTCWrappedNativeVideoDecoder.h"
#import "WebRTC/RTCVideoCodec.h" #import "WebRTC/RTCVideoCodec.h"
#import "WebRTC/RTCVideoCodecFactory.h" #import "WebRTC/RTCVideoCodecFactory.h"
#import "WebRTC/RTCVideoCodecH264.h" #import "WebRTC/RTCVideoCodecH264.h"
#import "WebRTC/RTCVideoFrame.h" #import "WebRTC/RTCVideoFrame.h"
#import "WebRTC/RTCVideoFrameBuffer.h" #import "WebRTC/RTCVideoFrameBuffer.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_decoder.h" #include "api/video_codecs/video_decoder.h"
#include "modules/include/module_common_types.h" #include "modules/include/module_common_types.h"
#include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/include/video_codec_interface.h"
@ -103,19 +105,47 @@ id<RTCVideoDecoderFactory> ObjCVideoDecoderFactory::wrapped_decoder_factory() co
return decoder_factory_; return decoder_factory_;
} }
VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoderWithParams( std::unique_ptr<VideoDecoder> ObjCVideoDecoderFactory::CreateVideoDecoder(
const cricket::VideoCodec &codec, cricket::VideoDecoderParams params) { const SdpVideoFormat &format) {
NSString *codecName = [NSString stringWithUTF8String:codec.name.c_str()]; NSString *codecName = [NSString stringWithUTF8String:format.name.c_str()];
for (RTCVideoCodecInfo *codecInfo in decoder_factory_.supportedCodecs) { for (RTCVideoCodecInfo *codecInfo in decoder_factory_.supportedCodecs) {
if ([codecName isEqualToString:codecInfo.name]) { if ([codecName isEqualToString:codecInfo.name]) {
id<RTCVideoDecoder> decoder = [decoder_factory_ createDecoder:codecInfo]; id<RTCVideoDecoder> decoder = [decoder_factory_ createDecoder:codecInfo];
return new ObjCVideoDecoder(decoder);
if ([decoder isKindOfClass:[RTCWrappedNativeVideoDecoder class]]) {
return [(RTCWrappedNativeVideoDecoder *)decoder releaseWrappedDecoder];
} else {
return std::unique_ptr<ObjCVideoDecoder>(new ObjCVideoDecoder(decoder));
}
} }
} }
return nullptr; return nullptr;
} }
std::vector<SdpVideoFormat> ObjCVideoDecoderFactory::GetSupportedFormats() const {
std::vector<SdpVideoFormat> supported_formats;
for (RTCVideoCodecInfo *supportedCodec in decoder_factory_.supportedCodecs) {
SdpVideoFormat format = [supportedCodec nativeSdpVideoFormat];
supported_formats.push_back(format);
}
return supported_formats;
}
// WebRtcVideoDecoderFactory
VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoderWithParams(
const cricket::VideoCodec &codec, cricket::VideoDecoderParams params) {
return CreateVideoDecoder(SdpVideoFormat(codec.name, codec.params)).release();
}
VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoder(VideoCodecType type) {
// This is implemented to avoid hiding an overloaded virtual function
RTC_NOTREACHED();
return nullptr;
}
void ObjCVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder *decoder) { void ObjCVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder *decoder) {
delete decoder; delete decoder;
decoder = nullptr; decoder = nullptr;

View File

@ -13,19 +13,29 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#include "api/video_codecs/video_encoder_factory.h"
#include "media/engine/webrtcvideoencoderfactory.h" #include "media/engine/webrtcvideoencoderfactory.h"
@protocol RTCVideoEncoderFactory; @protocol RTCVideoEncoderFactory;
namespace webrtc { namespace webrtc {
class ObjCVideoEncoderFactory : public cricket::WebRtcVideoEncoderFactory { // TODO(andersc): Remove the inheritance from cricket::WebRtcVideoEncoderFactory
// when the legacy path in [RTCPeerConnectionFactory init] is no longer needed.
class ObjCVideoEncoderFactory : public VideoEncoderFactory,
public cricket::WebRtcVideoEncoderFactory {
public: public:
explicit ObjCVideoEncoderFactory(id<RTCVideoEncoderFactory>); explicit ObjCVideoEncoderFactory(id<RTCVideoEncoderFactory>);
~ObjCVideoEncoderFactory(); ~ObjCVideoEncoderFactory();
id<RTCVideoEncoderFactory> wrapped_encoder_factory() const; id<RTCVideoEncoderFactory> wrapped_encoder_factory() const;
std::vector<SdpVideoFormat> GetSupportedFormats() const override;
std::unique_ptr<VideoEncoder> CreateVideoEncoder(
const SdpVideoFormat& format) override;
CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const override;
// Needed for WebRtcVideoEncoderFactory interface.
webrtc::VideoEncoder* CreateVideoEncoder( webrtc::VideoEncoder* CreateVideoEncoder(
const cricket::VideoCodec& codec) override; const cricket::VideoCodec& codec) override;
const std::vector<cricket::VideoCodec>& supported_codecs() const override; const std::vector<cricket::VideoCodec>& supported_codecs() const override;
@ -33,6 +43,8 @@ class ObjCVideoEncoderFactory : public cricket::WebRtcVideoEncoderFactory {
private: private:
id<RTCVideoEncoderFactory> encoder_factory_; id<RTCVideoEncoderFactory> encoder_factory_;
// Needed for WebRtcVideoEncoderFactory interface.
mutable std::vector<cricket::VideoCodec> supported_codecs_; mutable std::vector<cricket::VideoCodec> supported_codecs_;
}; };

View File

@ -15,6 +15,8 @@
#import "NSString+StdString.h" #import "NSString+StdString.h"
#import "RTCI420Buffer+Private.h" #import "RTCI420Buffer+Private.h"
#import "RTCVideoCodec+Private.h" #import "RTCVideoCodec+Private.h"
#import "RTCVideoFrame+Private.h"
#import "RTCWrappedNativeVideoEncoder.h"
#import "WebRTC/RTCVideoCodec.h" #import "WebRTC/RTCVideoCodec.h"
#import "WebRTC/RTCVideoCodecFactory.h" #import "WebRTC/RTCVideoCodecFactory.h"
#import "WebRTC/RTCVideoCodecH264.h" #import "WebRTC/RTCVideoCodecH264.h"
@ -22,12 +24,12 @@
#import "WebRTC/RTCVideoFrameBuffer.h" #import "WebRTC/RTCVideoFrameBuffer.h"
#include "api/video/video_frame.h" #include "api/video/video_frame.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_encoder.h" #include "api/video_codecs/video_encoder.h"
#include "modules/include/module_common_types.h" #include "modules/include/module_common_types.h"
#include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/include/video_codec_interface.h"
#include "modules/video_coding/include/video_error_codes.h" #include "modules/video_coding/include/video_error_codes.h"
#include "rtc_base/logging.h" #include "rtc_base/logging.h"
#include "rtc_base/timeutils.h"
#include "sdk/objc/Framework/Classes/Common/helpers.h" #include "sdk/objc/Framework/Classes/Common/helpers.h"
#include "sdk/objc/Framework/Classes/Video/objc_frame_buffer.h" #include "sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
@ -35,21 +37,6 @@ namespace webrtc {
namespace { namespace {
id<RTCVideoFrameBuffer> nativeToRtcFrameBuffer(const rtc::scoped_refptr<VideoFrameBuffer> &buffer) {
return buffer->type() == VideoFrameBuffer::Type::kNative ?
static_cast<ObjCFrameBuffer *>(buffer.get())->wrapped_frame_buffer() :
[[RTCI420Buffer alloc] initWithFrameBuffer:buffer->ToI420()];
}
RTCVideoFrame *nativeToRtcFrame(const VideoFrame &frame) {
RTCVideoFrame *rtcFrame =
[[RTCVideoFrame alloc] initWithBuffer:nativeToRtcFrameBuffer(frame.video_frame_buffer())
rotation:RTCVideoRotation(frame.rotation())
timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
rtcFrame.timeStamp = frame.timestamp();
return rtcFrame;
}
class ObjCVideoEncoder : public VideoEncoder { class ObjCVideoEncoder : public VideoEncoder {
public: public:
ObjCVideoEncoder(id<RTCVideoEncoder> encoder) ObjCVideoEncoder(id<RTCVideoEncoder> encoder)
@ -69,7 +56,7 @@ class ObjCVideoEncoder : public VideoEncoder {
RTCRtpFragmentationHeader *_Nonnull header) { RTCRtpFragmentationHeader *_Nonnull header) {
EncodedImage encodedImage = [frame nativeEncodedImage]; EncodedImage encodedImage = [frame nativeEncodedImage];
// Handle types than can be converted into one of CodecSpecificInfo's hard coded cases. // Handle types that can be converted into one of CodecSpecificInfo's hard coded cases.
CodecSpecificInfo codecSpecificInfo; CodecSpecificInfo codecSpecificInfo;
if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) {
codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info nativeCodecSpecificInfo]; codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info nativeCodecSpecificInfo];
@ -106,7 +93,7 @@ class ObjCVideoEncoder : public VideoEncoder {
[rtcFrameTypes addObject:@(RTCFrameType(frame_types->at(i)))]; [rtcFrameTypes addObject:@(RTCFrameType(frame_types->at(i)))];
} }
return [encoder_ encode:nativeToRtcFrame(frame) return [encoder_ encode:[[RTCVideoFrame alloc] initWithNativeVideoFrame:frame]
codecSpecificInfo:rtcCodecSpecificInfo codecSpecificInfo:rtcCodecSpecificInfo
frameTypes:rtcFrameTypes]; frameTypes:rtcFrameTypes];
} }
@ -143,8 +130,44 @@ id<RTCVideoEncoderFactory> ObjCVideoEncoderFactory::wrapped_encoder_factory() co
return encoder_factory_; return encoder_factory_;
} }
std::vector<SdpVideoFormat> ObjCVideoEncoderFactory::GetSupportedFormats() const {
std::vector<SdpVideoFormat> supported_formats;
for (RTCVideoCodecInfo *supportedCodec in encoder_factory_.supportedCodecs) {
SdpVideoFormat format = [supportedCodec nativeSdpVideoFormat];
supported_formats.push_back(format);
}
return supported_formats;
}
VideoEncoderFactory::CodecInfo ObjCVideoEncoderFactory::QueryVideoEncoder(
const SdpVideoFormat &format) const {
// TODO(andersc): This is a hack until we figure out how this should be done properly.
NSString *formatName = [NSString stringForStdString:format.name];
NSSet *wrappedSoftwareFormats = [NSSet setWithObjects:@"VP8", @"VP9", nil];
CodecInfo codec_info;
codec_info.is_hardware_accelerated = ![wrappedSoftwareFormats containsObject:formatName];
codec_info.has_internal_source = false;
return codec_info;
}
std::unique_ptr<VideoEncoder> ObjCVideoEncoderFactory::CreateVideoEncoder(
const SdpVideoFormat &format) {
RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc] initWithNativeSdpVideoFormat:format];
id<RTCVideoEncoder> encoder = [encoder_factory_ createEncoder:info];
if ([encoder isKindOfClass:[RTCWrappedNativeVideoEncoder class]]) {
return [(RTCWrappedNativeVideoEncoder *)encoder releaseWrappedEncoder];
} else {
return std::unique_ptr<ObjCVideoEncoder>(new ObjCVideoEncoder(encoder));
}
}
// WebRtcVideoEncoderFactory
VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder(const cricket::VideoCodec &codec) { VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder(const cricket::VideoCodec &codec) {
RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc] initWithNativeVideoCodec:codec]; RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc]
initWithNativeSdpVideoFormat:SdpVideoFormat(codec.name, codec.params)];
id<RTCVideoEncoder> encoder = [encoder_factory_ createEncoder:info]; id<RTCVideoEncoder> encoder = [encoder_factory_ createEncoder:info];
return new ObjCVideoEncoder(encoder); return new ObjCVideoEncoder(encoder);
} }
@ -152,8 +175,8 @@ VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder(const cricket::VideoCo
const std::vector<cricket::VideoCodec> &ObjCVideoEncoderFactory::supported_codecs() const { const std::vector<cricket::VideoCodec> &ObjCVideoEncoderFactory::supported_codecs() const {
supported_codecs_.clear(); supported_codecs_.clear();
for (RTCVideoCodecInfo *supportedCodec in encoder_factory_.supportedCodecs) { for (RTCVideoCodecInfo *supportedCodec in encoder_factory_.supportedCodecs) {
cricket::VideoCodec codec = [supportedCodec nativeVideoCodec]; SdpVideoFormat format = [supportedCodec nativeSdpVideoFormat];
supported_codecs_.push_back(codec); supported_codecs_.push_back(cricket::VideoCodec(format));
} }
return supported_codecs_; return supported_codecs_;

View File

@ -69,19 +69,6 @@ RTC_EXPORT
@end @end
/** Class for H264 specific config. */
typedef NS_ENUM(NSUInteger, RTCH264PacketizationMode) {
RTCH264PacketizationModeNonInterleaved = 0, // Mode 1 - STAP-A, FU-A is allowed
RTCH264PacketizationModeSingleNalUnit // Mode 0 - only single NALU allowed
};
RTC_EXPORT
@interface RTCCodecSpecificInfoH264 : NSObject<RTCCodecSpecificInfo>
@property(nonatomic, assign) RTCH264PacketizationMode packetizationMode;
@end
/** Callback block for encoder. */ /** Callback block for encoder. */
typedef BOOL (^RTCVideoEncoderCallback)(RTCEncodedImage *frame, typedef BOOL (^RTCVideoEncoderCallback)(RTCEncodedImage *frame,
id<RTCCodecSpecificInfo> info, id<RTCCodecSpecificInfo> info,
@ -109,7 +96,6 @@ RTC_EXPORT
- (BOOL)isEqualToCodecInfo:(RTCVideoCodecInfo *)info; - (BOOL)isEqualToCodecInfo:(RTCVideoCodecInfo *)info;
@property(nonatomic, readonly) NSInteger payload;
@property(nonatomic, readonly) NSString *name; @property(nonatomic, readonly) NSString *name;
@property(nonatomic, readonly) NSDictionary<NSString *, NSString *> *parameters; @property(nonatomic, readonly) NSDictionary<NSString *, NSString *> *parameters;

View File

@ -15,21 +15,21 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
/** RTCVideoEncoderFactory is an Objective-C version of cricket::WebRtcVideoEncoderFactory. */ /** RTCVideoEncoderFactory is an Objective-C version of webrtc::VideoEncoderFactory. */
RTC_EXPORT RTC_EXPORT
@protocol RTCVideoEncoderFactory <NSObject> @protocol RTCVideoEncoderFactory <NSObject>
- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info; - (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info;
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs; - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs; // TODO(andersc): "supportedFormats" instead?
@end @end
/** RTCVideoDecoderFactory is an Objective-C version of cricket::WebRtcVideoDecoderFactory. */ /** RTCVideoDecoderFactory is an Objective-C version of webrtc::VideoDecoderFactory. */
RTC_EXPORT RTC_EXPORT
@protocol RTCVideoDecoderFactory <NSObject> @protocol RTCVideoDecoderFactory <NSObject>
- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info; - (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info;
- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs; - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs; // TODO(andersc): "supportedFormats" instead?
@end @end

View File

@ -13,6 +13,19 @@
#import <WebRTC/RTCMacros.h> #import <WebRTC/RTCMacros.h>
#import <WebRTC/RTCVideoCodecFactory.h> #import <WebRTC/RTCVideoCodecFactory.h>
/** Class for H264 specific config. */
typedef NS_ENUM(NSUInteger, RTCH264PacketizationMode) {
RTCH264PacketizationModeNonInterleaved = 0, // Mode 1 - STAP-A, FU-A is allowed
RTCH264PacketizationModeSingleNalUnit // Mode 0 - only single NALU allowed
};
RTC_EXPORT
@interface RTCCodecSpecificInfoH264 : NSObject <RTCCodecSpecificInfo>
@property(nonatomic, assign) RTCH264PacketizationMode packetizationMode;
@end
/** Encoder. */ /** Encoder. */
RTC_EXPORT RTC_EXPORT
@interface RTCVideoEncoderH264 : NSObject<RTCVideoEncoder> @interface RTCVideoEncoderH264 : NSObject<RTCVideoEncoder>

View File

@ -0,0 +1,25 @@
/*
* 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/RTCMacros.h>
#import <WebRTC/RTCVideoCodec.h>
RTC_EXPORT
@interface RTCVideoDecoderVP8 : NSObject
/* This returns a VP8 decoder that can be returned from a RTCVideoDecoderFactory injected into
* RTCPeerConnectionFactory. Even though it implements the RTCVideoDecoder protocol, it can not be
* used independently from the RTCPeerConnectionFactory.
*/
+ (id<RTCVideoDecoder>)vp8Decoder;
@end

View File

@ -0,0 +1,25 @@
/*
* 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/RTCMacros.h>
#import <WebRTC/RTCVideoCodec.h>
RTC_EXPORT
@interface RTCVideoDecoderVP9 : NSObject
/* This returns a VP9 decoder that can be returned from a RTCVideoDecoderFactory injected into
* RTCPeerConnectionFactory. Even though it implements the RTCVideoDecoder protocol, it can not be
* used independently from the RTCPeerConnectionFactory.
*/
+ (id<RTCVideoDecoder>)vp9Decoder;
@end

View File

@ -0,0 +1,25 @@
/*
* 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/RTCMacros.h>
#import <WebRTC/RTCVideoCodec.h>
RTC_EXPORT
@interface RTCVideoEncoderVP8 : NSObject
/* This returns a VP8 encoder that can be returned from a RTCVideoEncoderFactory injected into
* RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be
* used independently from the RTCPeerConnectionFactory.
*/
+ (id<RTCVideoEncoder>)vp8Encoder;
@end

View File

@ -0,0 +1,25 @@
/*
* 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/RTCMacros.h>
#import <WebRTC/RTCVideoCodec.h>
RTC_EXPORT
@interface RTCVideoEncoderVP9 : NSObject
/* This returns a VP9 encoder that can be returned from a RTCVideoEncoderFactory injected into
* RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be
* used independently from the RTCPeerConnectionFactory.
*/
+ (id<RTCVideoEncoder>)vp9Encoder;
@end