From 6a5047dad31f14f53dd9f8bc1ecde19e1dede2e4 Mon Sep 17 00:00:00 2001 From: kthelgason Date: Mon, 7 Nov 2016 07:26:00 -0800 Subject: [PATCH] Add a webrtc{en,de}coderfactory implementation for VideoToolbox This CL removes the coupling of the VideoToolbox h264 implementation to the generic h264 code. The files have been moved into sdb/obj/Framework and all dependency on them has been removed from the rest of WebRTC. We now add it as an external encoder via a factory supplied to the CreatePeerConnectionFactory call. This also brings the iOS implementation closer to what we do on Android for MediaCodec. BUG=webrtc:6619 Review-Url: https://codereview.webrtc.org/2463313002 Cr-Commit-Position: refs/heads/master@{#14953} --- webrtc/modules/BUILD.gn | 5 +- webrtc/modules/video_coding/BUILD.gn | 59 ---------- .../modules/video_coding/codecs/h264/h264.cc | 28 ----- .../video_coding/codecs/h264/h264.gypi | 45 -------- .../video_coding/codecs/h264/h264_objc.mm | 32 ------ webrtc/sdk/BUILD.gn | 63 ++++++++++- webrtc/sdk/DEPS | 2 + .../Classes/RTCPeerConnectionFactory.mm | 9 +- .../Classes}/h264_video_toolbox_decoder.cc | 8 +- .../Classes}/h264_video_toolbox_decoder.h | 9 +- .../Classes}/h264_video_toolbox_encoder.h | 9 +- .../Classes}/h264_video_toolbox_encoder.mm | 8 +- .../Classes}/h264_video_toolbox_nalu.cc | 6 +- .../Classes}/h264_video_toolbox_nalu.h | 9 +- .../h264_video_toolbox_nalu_unittest.cc | 6 +- .../Classes/videotoolboxvideocodecfactory.cc | 103 ++++++++++++++++++ .../Classes/videotoolboxvideocodecfactory.h | 50 +++++++++ 17 files changed, 239 insertions(+), 212 deletions(-) delete mode 100644 webrtc/modules/video_coding/codecs/h264/h264_objc.mm rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_decoder.cc (97%) rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_decoder.h (84%) rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_encoder.h (90%) rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_encoder.mm (98%) rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_nalu.cc (98%) rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_nalu.h (92%) rename webrtc/{modules/video_coding/codecs/h264 => sdk/objc/Framework/Classes}/h264_video_toolbox_nalu_unittest.cc (98%) create mode 100644 webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.cc create mode 100644 webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.h diff --git a/webrtc/modules/BUILD.gn b/webrtc/modules/BUILD.gn index 13f74f85ea..8321bcd501 100644 --- a/webrtc/modules/BUILD.gn +++ b/webrtc/modules/BUILD.gn @@ -705,10 +705,7 @@ if (rtc_include_tests) { "//build/config/compiler:enable_arc", ] - sources += [ - "audio_device/ios/objc/RTCAudioSessionTest.mm", - "video_coding/codecs/h264/h264_video_toolbox_nalu_unittest.cc", - ] + sources += [ "audio_device/ios/objc/RTCAudioSessionTest.mm" ] if (target_cpu != "x64") { sources += [ "audio_device/ios/audio_device_unittest_ios.cc" ] diff --git a/webrtc/modules/video_coding/BUILD.gn b/webrtc/modules/video_coding/BUILD.gn index e567b89327..9bd746be75 100644 --- a/webrtc/modules/video_coding/BUILD.gn +++ b/webrtc/modules/video_coding/BUILD.gn @@ -141,11 +141,6 @@ rtc_static_library("webrtc_h264") { "../../system_wrappers", ] - if (is_ios) { - sources += [ "codecs/h264/h264_objc.mm" ] - deps += [ ":webrtc_h264_video_toolbox" ] - } - if (rtc_use_h264) { defines += [ "WEBRTC_USE_H264" ] if (rtc_initialize_ffmpeg) { @@ -165,60 +160,6 @@ rtc_static_library("webrtc_h264") { } } -if (is_ios) { - config("webrtc_h264_video_toolbox_warnings_config") { - if (is_clang) { - # TODO(tkchin): Make webrtc_h264_video_toolbox compile with the standard set - # of warnings. - # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6307 - cflags = [ "-Wno-thread-safety-analysis" ] - } - } - - rtc_static_library("webrtc_h264_video_toolbox") { - sources = [ - "codecs/h264/h264_video_toolbox_decoder.cc", - "codecs/h264/h264_video_toolbox_decoder.h", - "codecs/h264/h264_video_toolbox_encoder.h", - "codecs/h264/h264_video_toolbox_encoder.mm", - "codecs/h264/h264_video_toolbox_nalu.cc", - "codecs/h264/h264_video_toolbox_nalu.h", - ] - - configs += [ - ":webrtc_h264_video_toolbox_warnings_config", - "../..:common_objc", - "//build/config/compiler:enable_arc", - ] - - deps = [ - "../../sdk:rtc_sdk_common_objc", - ] - - libs = [ - "CoreFoundation.framework", - "CoreMedia.framework", - "CoreVideo.framework", - "VideoToolbox.framework", - ] - - if (!build_with_chromium && is_clang) { - # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163). - suppressed_configs += [ "//build/config/clang:find_bad_constructs" ] - } - - if (rtc_build_libyuv) { - deps += [ "$rtc_libyuv_dir" ] - public_deps = [ - "$rtc_libyuv_dir", - ] - } else { - # Need to add a directory normally exported by libyuv. - include_dirs = [ "$rtc_libyuv_dir/include" ] - } - } -} - rtc_static_library("webrtc_i420") { sources = [ "codecs/i420/i420.cc", diff --git a/webrtc/modules/video_coding/codecs/h264/h264.cc b/webrtc/modules/video_coding/codecs/h264/h264.cc index 1c0fc705ae..bbff225d1c 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264.cc +++ b/webrtc/modules/video_coding/codecs/h264/h264.cc @@ -15,10 +15,6 @@ #include "webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h" #include "webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h" #endif -#if defined(WEBRTC_IOS) -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.h" -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.h" -#endif #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" @@ -39,20 +35,8 @@ void DisableRtcUseH264() { #endif } -// We need this file to be C++ only so it will compile properly for all -// platforms. In order to write ObjC specific implementations we use private -// externs. This function is defined in h264.mm. -#if defined(WEBRTC_IOS) -extern bool IsH264CodecSupportedObjC(); -#endif - // If any H.264 codec is supported (iOS HW or OpenH264/FFmpeg). bool IsH264CodecSupported() { -#if defined(WEBRTC_IOS) && defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - if (IsH264CodecSupportedObjC()) { - return true; - } -#endif #if defined(WEBRTC_USE_H264) return g_rtc_use_h264; #else @@ -62,12 +46,6 @@ bool IsH264CodecSupported() { H264Encoder* H264Encoder::Create() { RTC_DCHECK(H264Encoder::IsSupported()); -#if defined(WEBRTC_IOS) && defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - if (IsH264CodecSupportedObjC()) { - LOG(LS_INFO) << "Creating H264VideoToolboxEncoder."; - return new H264VideoToolboxEncoder(); - } -#endif #if defined(WEBRTC_USE_H264) RTC_CHECK(g_rtc_use_h264); LOG(LS_INFO) << "Creating H264EncoderImpl."; @@ -84,12 +62,6 @@ bool H264Encoder::IsSupported() { H264Decoder* H264Decoder::Create() { RTC_DCHECK(H264Decoder::IsSupported()); -#if defined(WEBRTC_IOS) && defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - if (IsH264CodecSupportedObjC()) { - LOG(LS_INFO) << "Creating H264VideoToolboxDecoder."; - return new H264VideoToolboxDecoder(); - } -#endif #if defined(WEBRTC_USE_H264) RTC_CHECK(g_rtc_use_h264); LOG(LS_INFO) << "Creating H264DecoderImpl."; diff --git a/webrtc/modules/video_coding/codecs/h264/h264.gypi b/webrtc/modules/video_coding/codecs/h264/h264.gypi index 5d9282371f..2a103843ef 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264.gypi +++ b/webrtc/modules/video_coding/codecs/h264/h264.gypi @@ -15,14 +15,6 @@ 'target_name': 'webrtc_h264', 'type': 'static_library', 'conditions': [ - ['OS=="ios"', { - 'dependencies': [ - 'webrtc_h264_video_toolbox', - ], - 'sources': [ - 'h264_objc.mm', - ], - }], # TODO(hbos): Consider renaming this flag and the below macro to # something which helps distinguish OpenH264/FFmpeg from other H264 # implementations. @@ -56,41 +48,4 @@ ], }, # webrtc_h264 ], - 'conditions': [ - ['OS=="ios"', { - 'targets': [ - { - 'target_name': 'webrtc_h264_video_toolbox', - 'type': 'static_library', - 'includes': [ '../../../../build/objc_common.gypi' ], - 'dependencies': [ - '<(webrtc_root)/sdk/sdk.gyp:rtc_sdk_common_objc', - ], - 'link_settings': { - 'xcode_settings': { - 'OTHER_LDFLAGS': [ - '-framework CoreFoundation', - '-framework CoreMedia', - '-framework CoreVideo', - '-framework VideoToolbox', - ], - }, - }, - 'sources': [ - 'h264_video_toolbox_decoder.cc', - 'h264_video_toolbox_decoder.h', - 'h264_video_toolbox_encoder.h', - 'h264_video_toolbox_encoder.mm', - 'h264_video_toolbox_nalu.cc', - 'h264_video_toolbox_nalu.h', - ], - 'conditions': [ - ['build_libyuv==1', { - 'dependencies': ['<(DEPTH)/third_party/libyuv/libyuv.gyp:libyuv'], - }], - ], - }, # webrtc_h264_video_toolbox - ], # targets - }], # OS=="ios" - ], # conditions } diff --git a/webrtc/modules/video_coding/codecs/h264/h264_objc.mm b/webrtc/modules/video_coding/codecs/h264/h264_objc.mm deleted file mode 100644 index 9a6582d2f0..0000000000 --- a/webrtc/modules/video_coding/codecs/h264/h264_objc.mm +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 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. - * - */ - -#include "webrtc/modules/video_coding/codecs/h264/include/h264.h" - -#if defined(WEBRTC_IOS) -#import -#endif - -namespace webrtc { - -bool IsH264CodecSupportedObjC() { -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) && \ - defined(WEBRTC_IOS) - // Supported on iOS8+. - return [[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0; -#else - // TODO(tkchin): Support OS/X once we stop mixing libstdc++ and libc++ on - // OSX 10.9. - return false; -#endif -} - -} // namespace webrtc diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 0779291879..d54961cefb 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -30,6 +30,14 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { "objc/Framework/Headers", ] } + config("webrtc_h264_video_toolbox_warnings_config") { + if (is_clang) { + # TODO(tkchin): Make webrtc_h264_video_toolbox compile with the standard set + # of warnings. + # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6307 + cflags = [ "-Wno-thread-safety-analysis" ] + } + } rtc_static_library("rtc_sdk_common_objc") { deps = [ @@ -143,6 +151,8 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { "objc/Framework/Classes/RTCVideoTrack.mm", "objc/Framework/Classes/avfoundationvideocapturer.h", "objc/Framework/Classes/avfoundationvideocapturer.mm", + "objc/Framework/Classes/videotoolboxvideocodecfactory.cc", + "objc/Framework/Classes/videotoolboxvideocodecfactory.h", "objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h", "objc/Framework/Headers/WebRTC/RTCAudioSource.h", "objc/Framework/Headers/WebRTC/RTCAudioTrack.h", @@ -182,6 +192,9 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { "OpenGLES.framework", "QuartzCore.framework", ] + deps = [ + ":webrtc_h264_video_toolbox", + ] } if (is_mac) { @@ -193,6 +206,7 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { "CoreMedia.framework", "OpenGL.framework", ] + deps = [] } configs += [ @@ -209,7 +223,7 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { libs += [ "AVFoundation.framework" ] - deps = [ + deps += [ ":rtc_sdk_common_objc", "../api:libjingle_peerconnection", ] @@ -351,8 +365,51 @@ if (is_ios || (is_mac && mac_deployment_target == "10.7")) { complete_static_lib = true deps = [ ":rtc_sdk_peerconnection_objc", - "../system_wrappers:field_trial_default", - "../system_wrappers:metrics_default", + "//webrtc/system_wrappers:field_trial_default", + "//webrtc/system_wrappers:metrics_default", ] } + + rtc_static_library("webrtc_h264_video_toolbox") { + sources = [ + "objc/Framework/Classes/h264_video_toolbox_decoder.cc", + "objc/Framework/Classes/h264_video_toolbox_decoder.h", + "objc/Framework/Classes/h264_video_toolbox_encoder.h", + "objc/Framework/Classes/h264_video_toolbox_encoder.mm", + "objc/Framework/Classes/h264_video_toolbox_nalu.cc", + "objc/Framework/Classes/h264_video_toolbox_nalu.h", + ] + + configs += [ + ":webrtc_h264_video_toolbox_warnings_config", + "//webrtc:common_objc", + "//build/config/compiler:enable_arc", + ] + + deps = [ + ":rtc_sdk_common_objc", + ] + + libs = [ + "CoreFoundation.framework", + "CoreMedia.framework", + "CoreVideo.framework", + "VideoToolbox.framework", + ] + + if (!build_with_chromium && is_clang) { + # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163). + suppressed_configs += [ "//build/config/clang:find_bad_constructs" ] + } + + if (rtc_build_libyuv) { + deps += [ "$rtc_libyuv_dir" ] + public_deps = [ + "$rtc_libyuv_dir", + ] + } else { + # Need to add a directory normally exported by libyuv. + include_dirs = [ "$rtc_libyuv_dir/include" ] + } + } } diff --git a/webrtc/sdk/DEPS b/webrtc/sdk/DEPS index d6e53d504d..137f67a2f1 100644 --- a/webrtc/sdk/DEPS +++ b/webrtc/sdk/DEPS @@ -2,6 +2,8 @@ include_rules = [ "+WebRTC", "+webrtc/api", "+webrtc/common_video/include", + "+webrtc/common_video/h264", "+webrtc/media", + "+webrtc/modules/video_coding", "+webrtc/system_wrappers", ] diff --git a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnectionFactory.mm b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnectionFactory.mm index 9f24aec11d..4f542a9fcc 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnectionFactory.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnectionFactory.mm @@ -21,6 +21,8 @@ #import "RTCVideoTrack+Private.h" #import "WebRTC/RTCLogging.h" +#include "videotoolboxvideocodecfactory.h" + @implementation RTCPeerConnectionFactory { std::unique_ptr _networkThread; std::unique_ptr _workerThread; @@ -44,9 +46,14 @@ result = _signalingThread->Start(); NSAssert(result, @"Failed to start signaling thread."); + const auto encoder_factory = new webrtc::VideoToolboxVideoEncoderFactory(); + const auto decoder_factory = new webrtc::VideoToolboxVideoDecoderFactory(); + + // Ownership of encoder/decoder factories is passed on to the + // peerconnectionfactory, that handles deleting them. _nativeFactory = webrtc::CreatePeerConnectionFactory( _networkThread.get(), _workerThread.get(), _signalingThread.get(), - nullptr, nullptr, nullptr); + nullptr, encoder_factory, decoder_factory); NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!"); } return self; diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.cc b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.cc similarity index 97% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.cc rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.cc index 18820d3ded..31c8baf167 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.cc +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.cc @@ -9,9 +9,7 @@ * */ -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.h" - -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h" #include @@ -22,7 +20,7 @@ #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" #include "webrtc/common_video/include/corevideo_frame_buffer.h" -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h" +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h" #include "webrtc/video_frame.h" namespace internal { @@ -277,5 +275,3 @@ const char* H264VideoToolboxDecoder::ImplementationName() const { } } // namespace webrtc - -#endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.h b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h similarity index 84% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.h rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h index 1fbccdacf4..d81c1121b7 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.h +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h @@ -9,13 +9,11 @@ * */ -#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_DECODER_H_ -#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_DECODER_H_ +#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_DECODER_H_ +#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_DECODER_H_ #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - #include // This file provides a H264 encoder implementation using the VideoToolbox @@ -58,5 +56,4 @@ class H264VideoToolboxDecoder : public H264Decoder { } // namespace webrtc -#endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) -#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_DECODER_H_ +#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_DECODER_H_ diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.h b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h similarity index 90% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.h rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h index 2b387563d3..3acdf641cd 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.h +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h @@ -9,8 +9,8 @@ * */ -#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_ENCODER_H_ -#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_ENCODER_H_ +#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_ENCODER_H_ +#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_ENCODER_H_ #include "webrtc/base/criticalsection.h" #include "webrtc/common_video/h264/h264_bitstream_parser.h" @@ -19,8 +19,6 @@ #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" #include "webrtc/modules/video_coding/utility/quality_scaler.h" -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - #include #include @@ -94,5 +92,4 @@ class H264VideoToolboxEncoder : public H264Encoder { } // namespace webrtc -#endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) -#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_ENCODER_H_ +#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_ENCODER_H_ diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.mm b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm similarity index 98% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.mm rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm index 538734b0f4..d3ce8208e4 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.mm +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm @@ -9,9 +9,7 @@ * */ -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.h" - -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h" #include #include @@ -25,7 +23,7 @@ #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" #include "webrtc/common_video/include/corevideo_frame_buffer.h" -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h" +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h" #include "webrtc/system_wrappers/include/clock.h" namespace internal { @@ -660,5 +658,3 @@ void H264VideoToolboxEncoder::OnEncodedFrame( } } // namespace webrtc - -#endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.cc b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.cc similarity index 98% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.cc rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.cc index 357b4d4b4a..0d7975821f 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.cc +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.cc @@ -9,9 +9,7 @@ * */ -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h" - -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h" #include #include @@ -365,5 +363,3 @@ size_t AvccBufferWriter::BytesRemaining() const { } } // namespace webrtc - -#endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h similarity index 92% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h index 7862c3b618..23e9f7f7d7 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h @@ -9,13 +9,11 @@ * */ -#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_NALU_H_ -#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_NALU_H_ +#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_NALU_H_ +#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_NALU_H_ #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - #include #include @@ -111,5 +109,4 @@ class AvccBufferWriter final { } // namespace webrtc -#endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) -#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_VIDEO_TOOLBOX_NALU_H_ +#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_H264_VIDEO_TOOLBOX_NALU_H_ diff --git a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu_unittest.cc b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu_unittest.cc similarity index 98% rename from webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu_unittest.cc rename to webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu_unittest.cc index df71f54fa4..bc4efa044e 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu_unittest.cc +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu_unittest.cc @@ -12,11 +12,9 @@ #include #include "webrtc/base/arraysize.h" -#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_nalu.h" +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_nalu.h" #include "webrtc/test/gtest.h" -#if defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) - namespace webrtc { static const uint8_t NALU_TEST_DATA_0[] = {0xAA, 0xBB, 0xCC}; @@ -204,5 +202,3 @@ TEST(AvccBufferWriterTest, TestOverflow) { } } // namespace webrtc - -#endif // WEBRTC_VIDEO_TOOLBOX_SUPPORTED diff --git a/webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.cc b/webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.cc new file mode 100644 index 0000000000..b7a5141dfd --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.cc @@ -0,0 +1,103 @@ +/* + * 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. + */ +#include "webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.h" + +#include "webrtc/base/logging.h" +#include "webrtc/media/base/codec.h" +#if defined(WEBRTC_IOS) +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.h" +#include "webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_decoder.h" +#endif + +// TODO(kthelgason): delete this when CreateVideoDecoder takes +// a cricket::VideoCodec instead of webrtc::VideoCodecType. +static const char* NameFromCodecType(webrtc::VideoCodecType type) { + switch (type) { + case webrtc::kVideoCodecVP8: + return cricket::kVp8CodecName; + case webrtc::kVideoCodecVP9: + return cricket::kVp9CodecName; + case webrtc::kVideoCodecH264: + return cricket::kH264CodecName; + default: + return "Unknown codec"; + } +} + +namespace webrtc { + +// VideoToolboxVideoEncoderFactory + +VideoToolboxVideoEncoderFactory::VideoToolboxVideoEncoderFactory() { +// Hardware H264 encoding only supported on iOS for now. +#if defined(WEBRTC_IOS) + supported_codecs_.push_back(cricket::VideoCodec(cricket::kH264CodecName)); +#endif +} + +VideoToolboxVideoEncoderFactory::~VideoToolboxVideoEncoderFactory() {} + +VideoEncoder* VideoToolboxVideoEncoderFactory::CreateVideoEncoder( + const cricket::VideoCodec& codec) { +#if defined(WEBRTC_IOS) + if (IsCodecSupported(supported_codecs_, codec)) { + LOG(LS_INFO) << "Creating HW encoder for " << codec.name; + return new H264VideoToolboxEncoder(); + } +#endif + LOG(LS_INFO) << "No HW encoder found for codec " << codec.name; + return nullptr; +} + +void VideoToolboxVideoEncoderFactory::DestroyVideoEncoder( + VideoEncoder* encoder) { +#if defined(WEBRTC_IOS) + delete encoder; + encoder = nullptr; +#endif +} + +const std::vector& +VideoToolboxVideoEncoderFactory::supported_codecs() const { + return supported_codecs_; +} + +// VideoToolboxVideoDecoderFactory + +VideoToolboxVideoDecoderFactory::VideoToolboxVideoDecoderFactory() { +#if defined(WEBRTC_IOS) + supported_codecs_.push_back(cricket::VideoCodec("H264")); +#endif +} + +VideoToolboxVideoDecoderFactory::~VideoToolboxVideoDecoderFactory() {} + +VideoDecoder* VideoToolboxVideoDecoderFactory::CreateVideoDecoder( + VideoCodecType type) { + const auto codec = cricket::VideoCodec(NameFromCodecType(type)); +#if defined(WEBRTC_IOS) + if (IsCodecSupported(supported_codecs_, codec)) { + LOG(LS_INFO) << "Creating HW decoder for " << codec.name; + return new H264VideoToolboxDecoder(); + } +#endif + LOG(LS_INFO) << "No HW decoder found for codec " << codec.name; + return nullptr; +} + +void VideoToolboxVideoDecoderFactory::DestroyVideoDecoder( + VideoDecoder* decoder) { +#if defined(WEBRTC_IOS) + delete decoder; + decoder = nullptr; +#endif +} + +} // namespace webrtc diff --git a/webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.h b/webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.h new file mode 100644 index 0000000000..51007106ae --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/videotoolboxvideocodecfactory.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 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. + * + */ +#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOXVIDEOCODECFACTORY_H_ +#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOXVIDEOCODECFACTORY_H_ + +#include "webrtc/media/engine/webrtcvideoencoderfactory.h" +#include "webrtc/media/engine/webrtcvideodecoderfactory.h" + +namespace webrtc { + +class VideoToolboxVideoEncoderFactory + : public cricket::WebRtcVideoEncoderFactory { + public: + VideoToolboxVideoEncoderFactory(); + ~VideoToolboxVideoEncoderFactory(); + + // WebRtcVideoEncoderFactory implementation. + VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override; + void DestroyVideoEncoder(VideoEncoder* encoder) override; + const std::vector& supported_codecs() const override; + + private: + std::vector supported_codecs_; +}; + +class VideoToolboxVideoDecoderFactory + : public cricket::WebRtcVideoDecoderFactory { + public: + VideoToolboxVideoDecoderFactory(); + ~VideoToolboxVideoDecoderFactory(); + + // WebRtcVideoDecoderFactory implementation. + VideoDecoder* CreateVideoDecoder(VideoCodecType type) override; + void DestroyVideoDecoder(VideoDecoder* decoder) override; + + private: + std::vector supported_codecs_; +}; + +} // namespace webrtc + +#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOXVIDEOCODECFACTORY_H_