From 860f7298166084d966749e22b69aa2fdcf4d4ed6 Mon Sep 17 00:00:00 2001 From: jtteh Date: Fri, 14 Jul 2017 19:49:58 -0700 Subject: [PATCH] Revert of Injectable Obj-C video codecs (patchset #2 id:370001 of https://codereview.webrtc.org/2979983002/ ) Reason for revert: Still having problems with no video. Reverting. Once no video is visible, no video is available from then on even if the callee app is in the foreground. Original issue's description: > Reland of Injectable Obj-C video codecs (patchset #1 id:1 of https://codereview.webrtc.org/2979973002/ ) > > Reason for revert: > Fix the broken build file > > Original issue's description: > > Revert of Injectable Obj-C video codecs (patchset #3 id:400001 of https://codereview.webrtc.org/2981583002/ ) > > > > Reason for revert: > > Breaks bots. Build file incorrect. > > > > Original issue's description: > > > Reland of Injectable Obj-C video codecs (patchset #1 id:1 of https://codereview.webrtc.org/2975963002/ ) > > > > > > Reason for revert: > > > New CL for fixing the issues > > > > > > Original issue's description: > > > > Revert of Injectable Obj-C video codecs (patchset #8 id:140001 of https://codereview.webrtc.org/2966023002/ ) > > > > > > > > Reason for revert: > > > > Causes no video in certain scenarios. Please come up with a test plan or unit test to prevent such problems in the future. > > > > > > > > Original issue's description: > > > > > Injectable Obj-C video codecs > > > > > > > > > > Initial CL for this effort, with a working RTCVideoEncoder/Decoder for H264 > > > > > (wrapping the VideoToolbox codec). > > > > > > > > > > Some notes / things left to do: > > > > > - There are some hard-coded references to codec types that are supported by > > > > > webrtc::VideoCodec, cricket::VideoCodec, webrtc::CodecSpecificInfo etc > > > > > since we need to convert to/from these types in ObjCVideoEncoder/Decoder. > > > > > These types would need to be more codec agnostic to avoid this. > > > > > - Most interfaces are borrowed from the design document for injectable > > > > > codecs in Android. Some data in the corresponding C++ classes is discarded > > > > > when converting to the Obj-C version, since it has fewer fields. I have not > > > > > verified whether all data that we do keep is needed, or whether we might be > > > > > losing anything useful in these conversions. > > > > > - Implement the VideoToolbox codec code directly in the RTCVideoEncoderH264 > > > > > classes, instead of wrapping webrtc::H264VideoToolboxEncoder / decoder. > > > > > Eliminates converting between ObjC/C++ types outside the ObjCVideoEncoder/ > > > > > Decoder wrapper classes. > > > > > - List the injected codec factory's supported codecs in the list of codecs in > > > > > AppRTCMobile. > > > > > > > > > > BUG=webrtc:7924 > > > > > R=magjed@webrtc.org > > > > > > > > > > Review-Url: https://codereview.webrtc.org/2966023002 . > > > > > Cr-Commit-Position: refs/heads/master@{#18928} > > > > > Committed: https://chromium.googlesource.com/external/webrtc/+/a0349c138db62c52435be84b6c837f5f4758e264 > > > > > > > > TBR=magjed@webrtc.org,andersc@webrtc.org > > > > # Not skipping CQ checks because original CL landed more than 1 days ago. > > > > BUG=webrtc:7924 > > > > NOTRY=true > > > > > > > > Review-Url: https://codereview.webrtc.org/2975963002 > > > > Cr-Commit-Position: refs/heads/master@{#18979} > > > > Committed: https://chromium.googlesource.com/external/webrtc/+/1095ada7ad56fe29b7b2bbc560a8f6475a7978ce > > > > > > R=magjed@webrtc.org > > > TBR=tkchin@webrtc.org > > > # Skipping CQ checks because original CL landed less than 1 days ago. > > > NOPRESUBMIT=true > > > NOTREECHECKS=true > > > NOTRY=true > > > BUG=webrtc:7924 > > > > > > Review-Url: https://codereview.webrtc.org/2981583002 . > > > Cr-Commit-Position: refs/heads/master@{#19002} > > > Committed: https://chromium.googlesource.com/external/webrtc/+/a5f1de1e6541de03f944bcbf49be87c01f57a18b > > > > TBR=magjed@webrtc.org,tkchin@webrtc.org,jtteh@webrtc.org,andersc@webrtc.org > > # Skipping CQ checks because original CL landed less than 1 days ago. > > NOPRESUBMIT=true > > NOTREECHECKS=true > > NOTRY=true > > BUG=webrtc:7924 > > > > Review-Url: https://codereview.webrtc.org/2979973002 > > Cr-Commit-Position: refs/heads/master@{#19004} > > Committed: https://chromium.googlesource.com/external/webrtc/+/81d40ee1491d5229c2677cc04b1f40d67c2babef > > TBR=magjed@webrtc.org,tkchin@webrtc.org,jtteh@webrtc.org,sprang@webrtc.org > BUG=webrtc:7924 > > Review-Url: https://codereview.webrtc.org/2979983002 > Cr-Commit-Position: refs/heads/master@{#19005} > Committed: https://chromium.googlesource.com/external/webrtc/+/732a3437da4db7b452758b8e1cf26fce0ce3bf65 TBR=magjed@webrtc.org,tkchin@webrtc.org,sprang@webrtc.org,haysc@webrtc.org,andersc@webrtc.org # Not skipping CQ checks because original CL landed more than 1 days ago. BUG=webrtc:7924 Review-Url: https://codereview.webrtc.org/2980173002 Cr-Commit-Position: refs/heads/master@{#19036} --- webrtc/sdk/BUILD.gn | 23 -- .../objc/Framework/Classes/Common/helpers.h | 8 +- .../Classes/PeerConnection/RTCEncodedImage.mm | 74 ----- .../RTCPeerConnectionFactory.mm | 31 +-- .../RTCRtpFragmentationHeader.mm | 61 ---- .../PeerConnection/RTCVideoCodec+Private.h | 57 ---- .../Classes/PeerConnection/RTCVideoCodec.mm | 114 -------- .../PeerConnection/RTCVideoCodecH264.mm | 262 ------------------ .../Classes/PeerConnection/RTCVideoFrame.mm | 1 - .../objc_video_decoder_factory.h | 39 --- .../objc_video_decoder_factory.mm | 124 --------- .../objc_video_encoder_factory.h | 41 --- .../objc_video_encoder_factory.mm | 149 ---------- .../Headers/WebRTC/RTCPeerConnectionFactory.h | 10 +- .../Framework/Headers/WebRTC/RTCVideoCodec.h | 137 --------- .../Headers/WebRTC/RTCVideoCodecFactory.h | 36 --- .../Headers/WebRTC/RTCVideoCodecH264.h | 47 ---- .../Framework/Headers/WebRTC/RTCVideoFrame.h | 3 - .../objc/Framework/Headers/WebRTC/WebRTC.h | 3 - .../objc_video_decoder_factory_tests.mm | 103 ------- .../objc_video_encoder_factory_tests.mm | 133 --------- 21 files changed, 10 insertions(+), 1446 deletions(-) delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.mm delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h delete mode 100644 webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm delete mode 100644 webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h delete mode 100644 webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h delete mode 100644 webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h delete mode 100644 webrtc/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm delete mode 100644 webrtc/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 6cff621d91..d08a2f7f56 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -310,11 +310,6 @@ if (is_ios || is_mac) { sources = [ "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h", "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm", - "objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm", - "objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h", - "objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.mm", - "objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h", - "objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm", ] public_configs = [ ":objc_common_config" ] @@ -331,16 +326,11 @@ if (is_ios || is_mac) { ":objc_peerconnectionfactory_base", ":objc_video", ":objc_videotoolbox", - ":objc_videotracksource", "../api:video_frame_api", - "../api/video_codecs:video_codecs_api", "../base:rtc_base", - "../media:rtc_audio_video", "../media:rtc_media_base", - "../modules:module_api", "../pc:create_pc_factory", "../pc:peerconnection", - "../system_wrappers:field_trial_api", ] } @@ -387,7 +377,6 @@ if (is_ios || is_mac) { "objc/Framework/Classes/PeerConnection/RTCDataChannel.mm", "objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration+Private.h", "objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration.mm", - "objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm", "objc/Framework/Classes/PeerConnection/RTCIceCandidate+Private.h", "objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm", "objc/Framework/Classes/PeerConnection/RTCIceServer+Private.h", @@ -415,7 +404,6 @@ if (is_ios || is_mac) { "objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters.mm", "objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters+Private.h", "objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters.mm", - "objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm", "objc/Framework/Classes/PeerConnection/RTCRtpParameters+Private.h", "objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm", "objc/Framework/Classes/PeerConnection/RTCRtpReceiver+Private.h", @@ -427,8 +415,6 @@ if (is_ios || is_mac) { "objc/Framework/Classes/PeerConnection/RTCSessionDescription.mm", "objc/Framework/Classes/PeerConnection/RTCTracing.mm", "objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m", - "objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h", - "objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm", "objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm", "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h", "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h", @@ -490,7 +476,6 @@ if (is_ios || is_mac) { "../base:rtc_base", "../common_video", "../media:rtc_media_base", - "../modules:module_api", "../pc:peerconnection", ] } @@ -516,8 +501,6 @@ if (is_ios || is_mac) { "objc/Framework/UnitTests/RTCSessionDescriptionTest.mm", "objc/Framework/UnitTests/RTCTracingTest.mm", "objc/Framework/UnitTests/avformatmappertests.mm", - "objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm", - "objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm", ] if (is_ios && !(use_ios_simulator && @@ -535,11 +518,8 @@ if (is_ios || is_mac) { defines = [ "GTEST_RELATIVE_PATH" ] deps = [ ":objc_peerconnection", - ":objc_peerconnectionfactory", - ":objc_videotracksource", "..//system_wrappers:system_wrappers_default", "../base:rtc_base_tests_utils", - "../modules:module_api", "../system_wrappers:system_wrappers_default", "//third_party/ocmock", ] @@ -573,8 +553,6 @@ if (is_ios || is_mac) { common_objc_headers = [ "objc/Framework/Headers/WebRTC/RTCAudioSession.h", - "objc/Framework/Headers/WebRTC/RTCVideoCodec.h", - "objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h", "objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h", "objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h", "objc/Framework/Headers/WebRTC/RTCAudioSource.h", @@ -617,7 +595,6 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCVideoTrack.h", "objc/Framework/Headers/WebRTC/RTCVideoViewShading.h", "objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h", - "objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h", "objc/Framework/Headers/WebRTC/WebRTC.h", ] if (rtc_use_metal_rendering) { diff --git a/webrtc/sdk/objc/Framework/Classes/Common/helpers.h b/webrtc/sdk/objc/Framework/Classes/Common/helpers.h index fdcd9ccb56..d9e1d7fa64 100644 --- a/webrtc/sdk/objc/Framework/Classes/Common/helpers.h +++ b/webrtc/sdk/objc/Framework/Classes/Common/helpers.h @@ -11,6 +11,8 @@ #ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_COMMON_HELPERS_H_ #define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_COMMON_HELPERS_H_ +#if defined(WEBRTC_IOS) + #include namespace webrtc { @@ -31,7 +33,6 @@ std::string GetThreadInfo(); // Example: {number = 1, name = main} std::string GetCurrentThreadDescription(); -#if defined(WEBRTC_IOS) // Returns the current name of the operating system. std::string GetSystemName(); @@ -45,7 +46,6 @@ double GetSystemVersion(); // Returns the device type. // Examples: ”iPhone” and ”iPod touch”. std::string GetDeviceType(); -#endif // defined(WEBRTC_IOS) // Returns a more detailed device name. // Examples: "iPhone 5s (GSM)" and "iPhone 6 Plus". @@ -65,12 +65,12 @@ std::string GetOSVersionString(); // Returns the number of processing cores available on the device. int GetProcessorCount(); -#if defined(WEBRTC_IOS) // Indicates whether Low Power Mode is enabled on the iOS device. bool GetLowPowerModeEnabled(); -#endif } // namespace ios } // namespace webrtc +#endif // defined(WEBRTC_IOS) + #endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_COMMON_HELPERS_H_ diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm deleted file mode 100644 index 50550214d0..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm +++ /dev/null @@ -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 "WebRTC/RTCVideoCodec.h" - -#import "RTCVideoCodec+Private.h" - -@implementation RTCEncodedImage - -@synthesize buffer = _buffer; -@synthesize encodedWidth = _encodedWidth; -@synthesize encodedHeight = _encodedHeight; -@synthesize timeStamp = _timeStamp; -@synthesize captureTimeMs = _captureTimeMs; -@synthesize ntpTimeMs = _ntpTimeMs; -@synthesize isTimingFrame = _isTimingFrame; -@synthesize encodeStartMs = _encodeStartMs; -@synthesize encodeFinishMs = _encodeFinishMs; -@synthesize frameType = _frameType; -@synthesize rotation = _rotation; -@synthesize completeFrame = _completeFrame; -@synthesize qp = _qp; - -- (instancetype)initWithEncodedImage:(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 = encodedImage._encodedWidth; - _encodedHeight = encodedImage._encodedHeight; - _timeStamp = encodedImage._timeStamp; - _captureTimeMs = encodedImage.capture_time_ms_; - _ntpTimeMs = encodedImage.ntp_time_ms_; - _isTimingFrame = encodedImage.timing_.is_timing_frame; - _encodeStartMs = encodedImage.timing_.encode_start_ms; - _encodeFinishMs = encodedImage.timing_.encode_finish_ms; - _frameType = (RTCFrameType)encodedImage._frameType; - _rotation = encodedImage.rotation_; - _completeFrame = encodedImage._completeFrame; - _qp = encodedImage.qp_ == -1 ? nil : @(encodedImage.qp_); - } - - return self; -} - -- (webrtc::EncodedImage)toCpp { - // Return the pointer without copying. - webrtc::EncodedImage encodedImage( - (uint8_t *)_buffer.bytes, (size_t)_buffer.length, (size_t)_buffer.length); - encodedImage._encodedWidth = _encodedWidth; - encodedImage._encodedHeight = _encodedHeight; - encodedImage._timeStamp = _timeStamp; - encodedImage.capture_time_ms_ = _captureTimeMs; - encodedImage.ntp_time_ms_ = _ntpTimeMs; - encodedImage.timing_.is_timing_frame = _isTimingFrame; - 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; - - return encodedImage; -} - -@end diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm index 7c5ba1d16f..7accdbbe38 100644 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm @@ -11,7 +11,6 @@ #import "RTCPeerConnectionFactory+Private.h" #import "NSString+StdString.h" -#import "RTCAVFoundationVideoSource+Private.h" #import "RTCAudioSource+Private.h" #import "RTCAudioTrack+Private.h" #import "RTCMediaConstraints+Private.h" @@ -19,15 +18,11 @@ #import "RTCPeerConnection+Private.h" #import "RTCVideoSource+Private.h" #import "RTCVideoTrack+Private.h" +#import "RTCAVFoundationVideoSource+Private.h" #import "WebRTC/RTCLogging.h" -#import "WebRTC/RTCVideoCodecFactory.h" -#ifndef HAVE_NO_MEDIA -#import "WebRTC/RTCVideoCodecH264.h" -#endif -#include "PeerConnection/objc_video_decoder_factory.h" -#include "PeerConnection/objc_video_encoder_factory.h" #include "Video/objcvideotracksource.h" +#include "VideoToolbox/videocodecfactory.h" #include "webrtc/api/videosourceproxy.h" // Adding the nogncheck to disable the including header check. // The no-media version PeerConnectionFactory doesn't depend on media related @@ -46,17 +41,7 @@ @synthesize nativeFactory = _nativeFactory; - (instancetype)init { -#ifdef HAVE_NO_MEDIA - return [self initWithEncoderFactory:nil decoderFactory:nil]; -#else - return [self initWithEncoderFactory:[[RTCVideoEncoderFactoryH264 alloc] init] - decoderFactory:[[RTCVideoDecoderFactoryH264 alloc] init]]; -#endif -} - -- (instancetype)initWithEncoderFactory:(nullable id)encoderFactory - decoderFactory:(nullable id)decoderFactory { - if (self = [super init]) { + if ((self = [super init])) { _networkThread = rtc::Thread::CreateWithSocketServer(); BOOL result = _networkThread->Start(); NSAssert(result, @"Failed to start network thread."); @@ -83,14 +68,8 @@ std::unique_ptr(), std::unique_ptr()); #else - cricket::WebRtcVideoEncoderFactory *encoder_factory = nullptr; - cricket::WebRtcVideoDecoderFactory *decoder_factory = nullptr; - if (encoderFactory) { - encoder_factory = new webrtc::ObjCVideoEncoderFactory(encoderFactory); - } - if (decoderFactory) { - decoder_factory = new webrtc::ObjCVideoDecoderFactory(decoderFactory); - } + 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. diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm deleted file mode 100644 index eea07ec92e..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm +++ /dev/null @@ -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 "WebRTC/RTCVideoCodec.h" - -#include "webrtc/modules/include/module_common_types.h" - -@implementation RTCRtpFragmentationHeader - -@synthesize fragmentationOffset = _fragmentationOffset; -@synthesize fragmentationLength = _fragmentationLength; -@synthesize fragmentationTimeDiff = _fragmentationTimeDiff; -@synthesize fragmentationPlType = _fragmentationPlType; - -- (instancetype)initWithFragmentationHeader: - (const webrtc::RTPFragmentationHeader *__nullable)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; -} - -- (webrtc::RTPFragmentationHeader *)toCpp { - webrtc::RTPFragmentationHeader *fragmentationHeader = 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 diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h deleted file mode 100644 index 27815189e8..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h +++ /dev/null @@ -1,57 +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 "WebRTC/RTCVideoCodecH264.h" - -#include "webrtc/common_video/include/video_frame.h" -#include "webrtc/media/base/codec.h" -#include "webrtc/modules/video_coding/include/video_codec_interface.h" - -NS_ASSUME_NONNULL_BEGIN - -/* Interfaces for converting to/from internal C++ formats. */ -@interface RTCEncodedImage () - -- (instancetype)initWithEncodedImage:(webrtc::EncodedImage)encodedImage; -- (webrtc::EncodedImage)toCpp; - -@end - -@interface RTCVideoEncoderSettings () - -- (instancetype)initWithVideoCodec:(const webrtc::VideoCodec *__nullable)videoCodec; -- (webrtc::VideoCodec *)toCpp; - -@end - -@interface RTCCodecSpecificInfoH264 () - -- (webrtc::CodecSpecificInfo)toCpp; - -@end - -@interface RTCRtpFragmentationHeader () - -- (instancetype)initWithFragmentationHeader: - (const webrtc::RTPFragmentationHeader *__nullable)fragmentationHeader; -- (webrtc::RTPFragmentationHeader *)toCpp; - -@end - -@interface RTCVideoCodecInfo () - -- (instancetype)initWithVideoCodec:(cricket::VideoCodec)videoCodec; -- (cricket::VideoCodec)toCpp; - -@end - -NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm deleted file mode 100644 index a1b9109fd3..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm +++ /dev/null @@ -1,114 +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" -#import "WebRTC/RTCVideoCodecFactory.h" - -#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h" - -@implementation RTCVideoCodecInfo - -@synthesize payload = _payload; -@synthesize name = _name; -@synthesize parameters = _parameters; - -- (instancetype)initWithPayload:(int)payload - name:(NSString *)name - parameters:(NSDictionary *)parameters { - if (self = [super init]) { - _payload = payload; - _name = name; - _parameters = parameters; - } - - return self; -} - -- (instancetype)initWithVideoCodec:(cricket::VideoCodec)videoCodec { - NSMutableDictionary *params = [NSMutableDictionary dictionary]; - for (auto it = videoCodec.params.begin(); it != videoCodec.params.end(); ++it) { - [params setObject:webrtc::ios::NSStringFromStdString(it->second) - forKey:webrtc::ios::NSStringFromStdString(it->first)]; - } - return [self initWithPayload:videoCodec.id - name:webrtc::ios::NSStringFromStdString(videoCodec.name) - parameters:params]; -} - -- (cricket::VideoCodec)toCpp { - cricket::VideoCodec codec(webrtc::ios::StdStringFromNSString(_name)); - for (NSString *paramKey in [_parameters allKeys]) { - codec.SetParam(webrtc::ios::StdStringFromNSString(paramKey), - webrtc::ios::StdStringFromNSString(_parameters[paramKey])); - } - - return codec; -} - -@end - -@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; - -- (instancetype)initWithVideoCodec:(const webrtc::VideoCodec *__nullable)videoCodec { - if (self = [super init]) { - if (videoCodec) { - rtc::Optional codecName = CodecTypeToPayloadName(videoCodec->codecType); - if (codecName) { - _name = [NSString stringWithUTF8String:codecName.value()]; - } - - _width = videoCodec->width; - _height = videoCodec->height; - _startBitrate = videoCodec->startBitrate; - _maxBitrate = videoCodec->maxBitrate; - _minBitrate = videoCodec->minBitrate; - _targetBitrate = videoCodec->targetBitrate; - _maxFramerate = videoCodec->maxFramerate; - _qpMax = videoCodec->qpMax; - } - } - - return self; -} - -- (webrtc::VideoCodec *)toCpp { - webrtc::VideoCodec *codecSettings = new webrtc::VideoCodec; - - rtc::Optional codecType = - webrtc::PayloadNameToCodecType(webrtc::ios::StdStringFromNSString(_name)); - if (codecType) { - codecSettings->codecType = codecType.value(); - } - - codecSettings->width = _width; - codecSettings->height = _height; - codecSettings->startBitrate = _startBitrate; - codecSettings->maxBitrate = _maxBitrate; - codecSettings->minBitrate = _minBitrate; - codecSettings->targetBitrate = _targetBitrate; - codecSettings->maxFramerate = _maxFramerate; - codecSettings->qpMax = _qpMax; - - return codecSettings; -} - -@end diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm deleted file mode 100644 index 28b386e428..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm +++ /dev/null @@ -1,262 +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 - -#import "RTCVideoCodec+Private.h" -#import "WebRTC/RTCVideoCodec.h" -#import "WebRTC/RTCVideoFrame.h" -#import "WebRTC/RTCVideoFrameBuffer.h" - -#include "webrtc/rtc_base/timeutils.h" -#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h" -#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.h" -#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.h" -#include "webrtc/system_wrappers/include/field_trial.h" - -const size_t kDefaultPayloadSize = 1440; - -const char kHighProfileExperiment[] = "WebRTC-H264HighProfile"; - -bool IsHighProfileEnabled() { - return webrtc::field_trial::IsEnabled(kHighProfileExperiment); -} - -// H264 specific settings. -@implementation RTCCodecSpecificInfoH264 - -@synthesize packetizationMode = _packetizationMode; - -- (webrtc::CodecSpecificInfo)toCpp { - webrtc::CodecSpecificInfo codecSpecificInfo; - codecSpecificInfo.codecType = webrtc::kVideoCodecH264; - codecSpecificInfo.codec_name = "H264"; - codecSpecificInfo.codecSpecific.H264.packetization_mode = - (webrtc::H264PacketizationMode)_packetizationMode; - - return codecSpecificInfo; -} - -@end - -namespace { - -class H264VideoToolboxEncodeCompleteCallback : public webrtc::EncodedImageCallback { - public: - Result OnEncodedImage(const webrtc::EncodedImage &encoded_image, - const webrtc::CodecSpecificInfo *codec_specific_info, - const webrtc::RTPFragmentationHeader *fragmentation) { - RTCEncodedImage *image = [[RTCEncodedImage alloc] initWithEncodedImage:encoded_image]; - - RTCCodecSpecificInfoH264 *info = [[RTCCodecSpecificInfoH264 alloc] init]; - info.packetizationMode = - (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packetization_mode; - - RTCRtpFragmentationHeader *header = - [[RTCRtpFragmentationHeader alloc] initWithFragmentationHeader:fragmentation]; - - callback(image, info, header); - return Result(Result::OK, 0); - } - - RTCVideoEncoderCallback callback; -}; - -class H264VideoToolboxDecodeCompleteCallback : public webrtc::DecodedImageCallback { - public: - int32_t Decoded(webrtc::VideoFrame &decodedImage) { - rtc::scoped_refptr video_frame_buffer = - decodedImage.video_frame_buffer(); - id rtcFrameBuffer; - rtc::scoped_refptr objc_frame_buffer( - static_cast(video_frame_buffer.get())); - rtcFrameBuffer = (id)objc_frame_buffer->wrapped_frame_buffer(); - - RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] - initWithBuffer:rtcFrameBuffer - rotation:static_cast(decodedImage.rotation()) - timeStampNs:decodedImage.timestamp_us() * rtc::kNumNanosecsPerMicrosec]; - videoFrame.timeStamp = decodedImage.timestamp(); - - callback(videoFrame); - - return 0; - } - - RTCVideoDecoderCallback callback; -}; - -} // namespace - -// Encoder. -@implementation RTCVideoEncoderH264 { - webrtc::H264VideoToolboxEncoder *_videoToolboxEncoder; - H264VideoToolboxEncodeCompleteCallback *_toolboxCallback; -} - -- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo { - if (self = [super init]) { - cricket::VideoCodec codec = [codecInfo toCpp]; - _videoToolboxEncoder = new webrtc::H264VideoToolboxEncoder(codec); - } - return self; -} - -- (void)setCallback:(RTCVideoEncoderCallback)callback { - _toolboxCallback = new H264VideoToolboxEncodeCompleteCallback(); - _toolboxCallback->callback = callback; - _videoToolboxEncoder->RegisterEncodeCompleteCallback(_toolboxCallback); -} - -- (int)initEncodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores { - webrtc::VideoCodec *codecSettings = [settings toCpp]; - return _videoToolboxEncoder->InitEncode(codecSettings, numberOfCores, kDefaultPayloadSize); -} - -- (int)releaseEncode { - return _videoToolboxEncoder->Release(); -} - -- (int)encode:(RTCVideoFrame *)frame - codecSpecificInfo:(id)info - frameTypes:(NSArray *)frameTypes { - rtc::scoped_refptr frameBuffer = - new rtc::RefCountedObject(frame.buffer); - webrtc::VideoFrame videoFrame(frameBuffer, - (webrtc::VideoRotation)frame.rotation, - frame.timeStampNs / rtc::kNumNanosecsPerMicrosec); - videoFrame.set_timestamp(frame.timeStamp); - - // Handle types than can be converted into one of webrtc::CodecSpecificInfo's hard coded cases. - webrtc::CodecSpecificInfo codecSpecificInfo; - if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { - codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info toCpp]; - } - - std::vector nativeFrameTypes; - for (NSNumber *frameType in frameTypes) { - RTCFrameType rtcFrameType = (RTCFrameType)frameType.unsignedIntegerValue; - nativeFrameTypes.push_back((webrtc::FrameType)rtcFrameType); - } - - return _videoToolboxEncoder->Encode(videoFrame, &codecSpecificInfo, &nativeFrameTypes); -} - -- (BOOL)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate { - return _videoToolboxEncoder->SetRates(bitrateKbit, framerate) == WEBRTC_VIDEO_CODEC_OK; -} - -@end - -// Decoder. -@implementation RTCVideoDecoderH264 { - webrtc::H264VideoToolboxDecoder *_videoToolboxDecoder; - H264VideoToolboxDecodeCompleteCallback *_toolboxCallback; -} - -- (instancetype)init { - if (self = [super init]) { - cricket::VideoCodec codec(cricket::kH264CodecName); - _videoToolboxDecoder = new webrtc::H264VideoToolboxDecoder(); - } - return self; -} - -- (int)initDecodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores { - webrtc::VideoCodec *codecSettings = [settings toCpp]; - return _videoToolboxDecoder->InitDecode(codecSettings, numberOfCores); -} - -- (void)setCallback:(RTCVideoDecoderCallback)callback { - _toolboxCallback = new H264VideoToolboxDecodeCompleteCallback(); - _toolboxCallback->callback = callback; - _videoToolboxDecoder->RegisterDecodeCompleteCallback(_toolboxCallback); -} - -- (int32_t)releaseDecode { - return _videoToolboxDecoder->Release(); -} - -- (int)decode:(RTCEncodedImage *)encodedImage - missingFrames:(BOOL)missingFrames - fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader - codecSpecificInfo:(__nullable id)info - renderTimeMs:(int64_t)renderTimeMs { - webrtc::EncodedImage image = [encodedImage toCpp]; - - // Handle types than can be converted into one of webrtc::CodecSpecificInfo's hard coded cases. - webrtc::CodecSpecificInfo codecSpecificInfo; - if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { - codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info toCpp]; - } - - webrtc::RTPFragmentationHeader *header = [fragmentationHeader toCpp]; - - return _videoToolboxDecoder->Decode( - image, missingFrames, header, &codecSpecificInfo, renderTimeMs); -} - -@end - -// Encoder factory. -@implementation RTCVideoEncoderFactoryH264 - -- (NSArray *)supportedCodecs { - NSMutableArray *codecs = [NSMutableArray array]; - NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName]; - - if (IsHighProfileEnabled()) { - NSDictionary *constrainedHighParams = @{ - @"profile-level-id" : @"640c1f", // Level 3.1 Constrained High. - @"level-asymmetry-allowed" : @"1", - @"packetization-mode" : @"1", - }; - RTCVideoCodecInfo *constrainedHighInfo = - [[RTCVideoCodecInfo alloc] initWithPayload:0 - name:codecName - parameters:constrainedHighParams]; - [codecs addObject:constrainedHighInfo]; - } - - NSDictionary *constrainedBaselineParams = @{ - @"profile-level-id" : @"42e01f", // Level 3.1 Constrained Baseline. - @"level-asymmetry-allowed" : @"1", - @"packetization-mode" : @"1", - }; - RTCVideoCodecInfo *constrainedBaselineInfo = - [[RTCVideoCodecInfo alloc] initWithPayload:0 - name:codecName - parameters:constrainedBaselineParams]; - [codecs addObject:constrainedBaselineInfo]; - - return [codecs copy]; -} - -- (id)createEncoder:(RTCVideoCodecInfo *)info { - return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info]; -} - -@end - -// Decoder factory. -@implementation RTCVideoDecoderFactoryH264 - -- (id)createDecoder:(RTCVideoCodecInfo *)info { - return [[RTCVideoDecoderH264 alloc] init]; -} - -- (NSArray *)supportedCodecs { - NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName]; - return @[ [[RTCVideoCodecInfo alloc] initWithPayload:0 name:codecName parameters:@{}] ]; -} - -@end diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm index daac9fde08..ef93fef8cd 100644 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm +++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm @@ -17,7 +17,6 @@ } @synthesize buffer = _buffer; -@synthesize timeStamp; - (int)width { return _buffer.width; diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h deleted file mode 100644 index dca7fe2899..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h +++ /dev/null @@ -1,39 +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. - */ - -#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_ -#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_ - -#include "webrtc/media/base/codec.h" -#include "webrtc/media/engine/webrtcvideodecoderfactory.h" - -@protocol RTCVideoDecoderFactory; - -namespace webrtc { - -class ObjCVideoDecoderFactory : public cricket::WebRtcVideoDecoderFactory { - public: - explicit ObjCVideoDecoderFactory(id); - ~ObjCVideoDecoderFactory(); - - id wrapped_decoder_factory() const; - - webrtc::VideoDecoder* CreateVideoDecoder( - webrtc::VideoCodecType type) override; - void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override; - - private: - id decoder_factory_; - std::vector supported_codecs_; -}; - -} // namespace webrtc - -#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_ diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.mm deleted file mode 100644 index 0f2937bc4e..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.mm +++ /dev/null @@ -1,124 +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. - */ - -#include "webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h" - -#import "RTCVideoCodec+Private.h" -#import "WebRTC/RTCVideoCodec.h" -#import "WebRTC/RTCVideoCodecFactory.h" -#import "WebRTC/RTCVideoCodecH264.h" -#import "WebRTC/RTCVideoFrame.h" -#import "WebRTC/RTCVideoFrameBuffer.h" - -#include "webrtc/api/video_codecs/video_decoder.h" -#include "webrtc/modules/include/module_common_types.h" -#include "webrtc/modules/video_coding/include/video_codec_interface.h" -#include "webrtc/modules/video_coding/include/video_error_codes.h" -#include "webrtc/rtc_base/logging.h" -#include "webrtc/rtc_base/timeutils.h" -#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h" - -namespace webrtc { - -namespace { -class ObjCVideoDecoder : public VideoDecoder { - public: - ObjCVideoDecoder(id decoder) : decoder_(decoder) {} - ~ObjCVideoDecoder() {} - - int32_t InitDecode(const VideoCodec *codec_settings, int32_t number_of_cores) { - RTCVideoEncoderSettings *settings = - [[RTCVideoEncoderSettings alloc] initWithVideoCodec:codec_settings]; - return [decoder_ initDecodeWithSettings:settings numberOfCores:number_of_cores]; - } - - int32_t Decode(const EncodedImage &input_image, - bool missing_frames, - const RTPFragmentationHeader *fragmentation, - const CodecSpecificInfo *codec_specific_info = NULL, - int64_t render_time_ms = -1) { - RTCEncodedImage *encodedImage = [[RTCEncodedImage alloc] initWithEncodedImage:input_image]; - RTCRtpFragmentationHeader *header = - [[RTCRtpFragmentationHeader alloc] initWithFragmentationHeader:fragmentation]; - - // webrtc::CodecSpecificInfo only handles a hard coded list of codecs - id rtcCodecSpecificInfo = nil; - if (codec_specific_info) { - if (codec_specific_info->codecType == kVideoCodecH264) { - RTCCodecSpecificInfoH264 *h264Info = [[RTCCodecSpecificInfoH264 alloc] init]; - h264Info.packetizationMode = - (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packetization_mode; - rtcCodecSpecificInfo = h264Info; - } - } - - return [decoder_ decode:encodedImage - missingFrames:missing_frames - fragmentationHeader:header - codecSpecificInfo:rtcCodecSpecificInfo - renderTimeMs:render_time_ms]; - } - - int32_t RegisterDecodeCompleteCallback(DecodedImageCallback *callback) { - [decoder_ setCallback:^(RTCVideoFrame *frame) { - const rtc::scoped_refptr buffer = - new rtc::RefCountedObject(frame.buffer); - VideoFrame videoFrame(buffer, - (uint32_t)(frame.timeStampNs / rtc::kNumNanosecsPerMicrosec), - 0, - (VideoRotation)frame.rotation); - videoFrame.set_timestamp(frame.timeStamp); - - callback->Decoded(videoFrame); - }]; - - return WEBRTC_VIDEO_CODEC_OK; - } - - int32_t Release() { return [decoder_ releaseDecode]; } - - private: - id decoder_; -}; -} // namespace - -ObjCVideoDecoderFactory::ObjCVideoDecoderFactory(id decoder_factory) - : decoder_factory_(decoder_factory) {} - -ObjCVideoDecoderFactory::~ObjCVideoDecoderFactory() {} - -id ObjCVideoDecoderFactory::wrapped_decoder_factory() const { - return decoder_factory_; -} - -VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoder(VideoCodecType type) { - const rtc::Optional codec_name = CodecTypeToPayloadName(type); - if (!codec_name) { - LOG(LS_ERROR) << "Invalid codec type: " << type; - return nullptr; - } - - NSString *codecName = [NSString stringWithUTF8String:codec_name.value()]; - for (RTCVideoCodecInfo *codecInfo in decoder_factory_.supportedCodecs) { - if ([codecName isEqualToString:codecInfo.name]) { - id decoder = [decoder_factory_ createDecoder:codecInfo]; - return new ObjCVideoDecoder(decoder); - } - } - - return nullptr; -} - -void ObjCVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder *decoder) { - delete decoder; - decoder = nullptr; -} - -} // namespace webrtc diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h b/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h deleted file mode 100644 index b0c45887f0..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h +++ /dev/null @@ -1,41 +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. - */ - -#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_ENCODER_FACTORY_H_ -#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_ENCODER_FACTORY_H_ - -#import - -#include "webrtc/media/engine/webrtcvideoencoderfactory.h" - -@protocol RTCVideoEncoderFactory; - -namespace webrtc { - -class ObjCVideoEncoderFactory : public cricket::WebRtcVideoEncoderFactory { - public: - explicit ObjCVideoEncoderFactory(id); - ~ObjCVideoEncoderFactory(); - - id wrapped_encoder_factory() const; - - webrtc::VideoEncoder* CreateVideoEncoder( - const cricket::VideoCodec& codec) override; - const std::vector& supported_codecs() const override; - void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override; - - private: - id encoder_factory_; - mutable std::vector supported_codecs_; -}; - -} // namespace webrtc - -#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_ENCODER_FACTORY_H_ diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm deleted file mode 100644 index d4fa416d05..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm +++ /dev/null @@ -1,149 +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. - */ - -#include "webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h" - -#import "RTCVideoCodec+Private.h" -#import "WebRTC/RTCVideoCodec.h" -#import "WebRTC/RTCVideoCodecFactory.h" -#import "WebRTC/RTCVideoCodecH264.h" -#import "WebRTC/RTCVideoFrame.h" -#import "WebRTC/RTCVideoFrameBuffer.h" - -#include "webrtc/api/video/video_frame.h" -#include "webrtc/api/video_codecs/video_encoder.h" -#include "webrtc/modules/include/module_common_types.h" -#include "webrtc/modules/video_coding/include/video_codec_interface.h" -#include "webrtc/modules/video_coding/include/video_error_codes.h" -#include "webrtc/rtc_base/logging.h" -#include "webrtc/rtc_base/timeutils.h" -#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h" -#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h" - -namespace webrtc { - -namespace { -class ObjCVideoEncoder : public VideoEncoder { - public: - ObjCVideoEncoder(id encoder) : encoder_(encoder) {} - ~ObjCVideoEncoder() {} - - int32_t InitEncode(const VideoCodec *codec_settings, - int32_t number_of_cores, - size_t max_payload_size) { - RTCVideoEncoderSettings *settings = - [[RTCVideoEncoderSettings alloc] initWithVideoCodec:codec_settings]; - return [encoder_ initEncodeWithSettings:settings numberOfCores:number_of_cores]; - } - - int32_t RegisterEncodeCompleteCallback(EncodedImageCallback *callback) { - [encoder_ setCallback:^(RTCEncodedImage *frame, - id info, - RTCRtpFragmentationHeader *header) { - EncodedImage encodedImage = [frame toCpp]; - - // Handle types than can be converted into one of webrtc::CodecSpecificInfo's hard coded - // cases. - CodecSpecificInfo codecSpecificInfo; - if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { - codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info toCpp]; - } - - RTPFragmentationHeader *fragmentationHeader = [header toCpp]; - callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader); - }]; - - return WEBRTC_VIDEO_CODEC_OK; - } - - int32_t Release() { return [encoder_ releaseEncode]; } - - int32_t Encode(const VideoFrame &frame, - const CodecSpecificInfo *codec_specific_info, - const std::vector *frame_types) { - RTC_CHECK(frame.video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative); - - id frame_buffer = - static_cast(frame.video_frame_buffer().get())->wrapped_frame_buffer(); - RTCVideoFrame *rtcFrame = - [[RTCVideoFrame alloc] initWithBuffer:frame_buffer - rotation:RTCVideoRotation(frame.rotation()) - timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec]; - rtcFrame.timeStamp = frame.timestamp(); - - // webrtc::CodecSpecificInfo only handles a hard coded list of codecs - id rtcCodecSpecificInfo = nil; - if (codec_specific_info) { - if (strcmp(codec_specific_info->codec_name, "H264") == 0) { - RTCCodecSpecificInfoH264 *h264Info = [[RTCCodecSpecificInfoH264 alloc] init]; - h264Info.packetizationMode = - (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packetization_mode; - rtcCodecSpecificInfo = h264Info; - } - } - - NSMutableArray *rtcFrameTypes = [NSMutableArray array]; - for (size_t i = 0; i < frame_types->size(); ++i) { - [rtcFrameTypes addObject:@(RTCFrameType(frame_types->at(i)))]; - } - - return - [encoder_ encode:rtcFrame codecSpecificInfo:rtcCodecSpecificInfo frameTypes:rtcFrameTypes]; - } - - int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) { return WEBRTC_VIDEO_CODEC_OK; } - - int32_t SetRates(uint32_t bitrate, uint32_t framerate) { - if ([encoder_ setBitrate:bitrate framerate:framerate]) { - return WEBRTC_VIDEO_CODEC_OK; - } else { - return WEBRTC_VIDEO_CODEC_ERROR; - } - } - - bool SupportsNativeHandle() const { return true; } - - private: - id encoder_; -}; -} // namespace - -ObjCVideoEncoderFactory::ObjCVideoEncoderFactory(id encoder_factory) - : encoder_factory_(encoder_factory) {} - -ObjCVideoEncoderFactory::~ObjCVideoEncoderFactory() {} - -id ObjCVideoEncoderFactory::wrapped_encoder_factory() const { - return encoder_factory_; -} - -webrtc::VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder( - const cricket::VideoCodec &codec) { - RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc] initWithVideoCodec:codec]; - id encoder = [encoder_factory_ createEncoder:info]; - return new ObjCVideoEncoder(encoder); -} - -const std::vector &ObjCVideoEncoderFactory::supported_codecs() const { - supported_codecs_.clear(); - for (RTCVideoCodecInfo *supportedCodec in encoder_factory_.supportedCodecs) { - cricket::VideoCodec codec = [supportedCodec toCpp]; - supported_codecs_.push_back(codec); - } - - return supported_codecs_; -} - -void ObjCVideoEncoderFactory::DestroyVideoEncoder(webrtc::VideoEncoder *encoder) { - delete encoder; - encoder = nullptr; -} - -} // namespace webrtc diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h index b6a13c1bb0..3924cdd053 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h @@ -24,19 +24,11 @@ NS_ASSUME_NONNULL_BEGIN @class RTCVideoSource; @class RTCVideoTrack; @protocol RTCPeerConnectionDelegate; -@protocol RTCVideoEncoderFactory; -@protocol RTCVideoDecoderFactory; RTC_EXPORT @interface RTCPeerConnectionFactory : NSObject -/* Initialize object with default H264 video encoder/decoder factories */ -- (instancetype)init; - -/* Initialize object with injectable video encoder/decoder factories */ -- (instancetype)initWithEncoderFactory:(nullable id)encoderFactory - decoderFactory:(nullable id)decoderFactory - NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_DESIGNATED_INITIALIZER; /** Initialize an RTCAudioSource with constraints. */ - (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints; diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h deleted file mode 100644 index f093049faf..0000000000 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h +++ /dev/null @@ -1,137 +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 - -#import - -@class RTCVideoFrame; - -NS_ASSUME_NONNULL_BEGIN - -/** Represents an encoded frame's type. */ -typedef NS_ENUM(NSUInteger, RTCFrameType) { - EmptyFrame, - VideoFrameKey, - VideoFrameDelta, -}; - -/** Represents an encoded frame. Corresponds to webrtc::EncodedImage. */ -RTC_EXPORT -@interface RTCEncodedImage : NSObject - -@property(nonatomic, retain) NSData *buffer; -@property(nonatomic, assign) int encodedWidth; -@property(nonatomic, assign) int encodedHeight; -@property(nonatomic, assign) uint32_t timeStamp; -@property(nonatomic, assign) long captureTimeMs; -@property(nonatomic, assign) long ntpTimeMs; -@property(nonatomic, assign) BOOL isTimingFrame; -@property(nonatomic, assign) long encodeStartMs; -@property(nonatomic, assign) long encodeFinishMs; -@property(nonatomic, assign) RTCFrameType frameType; -@property(nonatomic, assign) int rotation; -@property(nonatomic, assign) BOOL completeFrame; -@property(nonatomic, retain) NSNumber *qp; - -@end - -/** Information for header. Corresponds to webrtc::RTPFragmentationHeader. */ -RTC_EXPORT -@interface RTCRtpFragmentationHeader : NSObject - -@property(nonatomic, retain) NSArray *fragmentationOffset; -@property(nonatomic, retain) NSArray *fragmentationLength; -@property(nonatomic, retain) NSArray *fragmentationTimeDiff; -@property(nonatomic, retain) NSArray *fragmentationPlType; - -@end - -/** Implement this protocol to pass codec specific info from the encoder. - * Corresponds to webrtc::CodecSpecificInfo. - */ -RTC_EXPORT -@protocol RTCCodecSpecificInfo - -@end - -/** Callback block for encoder. */ -typedef void (^RTCVideoEncoderCallback)(RTCEncodedImage *frame, - id info, - RTCRtpFragmentationHeader *header); - -/** Callback block for decoder. */ -typedef void (^RTCVideoDecoderCallback)(RTCVideoFrame *frame); - -/** Settings for encoder. Corresponds to webrtc::VideoCodec. */ -RTC_EXPORT -@interface RTCVideoEncoderSettings : NSObject - -@property(nonatomic, retain) NSString *name; - -@property(nonatomic, assign) unsigned short width; -@property(nonatomic, assign) unsigned short height; - -@property(nonatomic, assign) unsigned int startBitrate; // kilobits/sec. -@property(nonatomic, assign) unsigned int maxBitrate; -@property(nonatomic, assign) unsigned int minBitrate; -@property(nonatomic, assign) unsigned int targetBitrate; - -@property(nonatomic, assign) uint32_t maxFramerate; - -@property(nonatomic, assign) unsigned int qpMax; - -@end - -/** Holds information to identify a codec. Corresponds to cricket::VideoCodec. */ -RTC_EXPORT -@interface RTCVideoCodecInfo : NSObject - -- (instancetype)initWithPayload:(int)payload - name:(NSString *)name - parameters:(NSDictionary *)parameters; - -@property(nonatomic, readonly) int payload; -@property(nonatomic, readonly) NSString *name; -@property(nonatomic, readonly) NSDictionary *parameters; - -@end - -/** Protocol for encoder implementations. */ -RTC_EXPORT -@protocol RTCVideoEncoder - -- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo; -- (void)setCallback:(RTCVideoEncoderCallback)callback; -- (int)initEncodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores; -- (int)releaseEncode; -- (int)encode:(RTCVideoFrame *)frame - codecSpecificInfo:(id)info - frameTypes:(NSArray *)frameTypes; -- (BOOL)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate; - -@end - -/** Protocol for decoder implementations. */ -RTC_EXPORT -@protocol RTCVideoDecoder - -- (void)setCallback:(RTCVideoDecoderCallback)callback; -- (int)initDecodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores; -- (int)releaseDecode; -- (int)decode:(RTCEncodedImage *)encodedImage - missingFrames:(BOOL)missingFrames - fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader - codecSpecificInfo:(__nullable id)info - renderTimeMs:(int64_t)renderTimeMs; - -@end - -NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h deleted file mode 100644 index 42842eb020..0000000000 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h +++ /dev/null @@ -1,36 +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 - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -/** RTCVideoEncoderFactory is an Objective-C version of cricket::WebRtcVideoEncoderFactory. */ -RTC_EXPORT -@protocol RTCVideoEncoderFactory - -- (id)createEncoder:(RTCVideoCodecInfo *)info; -- (NSArray *)supportedCodecs; - -@end - -/** RTCVideoDecoderFactory is an Objective-C version of cricket::WebRtcVideoDecoderFactory. */ -RTC_EXPORT -@protocol RTCVideoDecoderFactory - -- (id)createDecoder:(RTCVideoCodecInfo *)info; -- (NSArray *)supportedCodecs; - -@end - -NS_ASSUME_NONNULL_END diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h deleted file mode 100644 index fbb2bd29b6..0000000000 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h +++ /dev/null @@ -1,47 +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 - -#import -#import - -/** Class for H264 specific config. */ -typedef NS_ENUM(NSUInteger, RTCH264PacketizationMode) { - NonInterleaved = 0, // Mode 1 - STAP-A, FU-A is allowed - SingleNalUnit // Mode 0 - only single NALU allowed -}; - -RTC_EXPORT -@interface RTCCodecSpecificInfoH264 : NSObject - -@property(nonatomic, assign) RTCH264PacketizationMode packetizationMode; - -@end - -/** Encoder. */ -RTC_EXPORT -@interface RTCVideoEncoderH264 : NSObject -@end - -/** Decoder. */ -RTC_EXPORT -@interface RTCVideoDecoderH264 : NSObject -@end - -/** Encoder factory. */ -RTC_EXPORT -@interface RTCVideoEncoderFactoryH264 : NSObject -@end - -/** Decoder factory. */ -RTC_EXPORT -@interface RTCVideoDecoderFactoryH264 : NSObject -@end diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h index 4467b06c9d..78eee5f224 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h @@ -51,9 +51,6 @@ RTC_EXPORT /** Timestamp in nanoseconds. */ @property(nonatomic, readonly) int64_t timeStampNs; -/** Timestamp 90 kHz. */ -@property(nonatomic, assign) int32_t timeStamp; - /** The native handle should be a pixel buffer on iOS. */ @property(nonatomic, readonly) CVPixelBufferRef nativeHandle DEPRECATED_MSG_ATTRIBUTE("use buffer instead"); diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h index 17019a2a64..904cc84e03 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/WebRTC.h @@ -47,9 +47,6 @@ #import #import #import -#import -#import -#import #import #import #import diff --git a/webrtc/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm b/webrtc/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm deleted file mode 100644 index 7143f3dfd9..0000000000 --- a/webrtc/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm +++ /dev/null @@ -1,103 +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 -#import - -#include "webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_decoder_factory.h" - -#import "WebRTC/RTCVideoCodec.h" -#import "WebRTC/RTCVideoCodecFactory.h" -#include "webrtc/modules/include/module_common_types.h" -#include "webrtc/modules/video_coding/include/video_codec_interface.h" -#include "webrtc/modules/video_coding/include/video_error_codes.h" -#include "webrtc/rtc_base/gunit.h" - -id CreateDecoderFactoryReturning(int return_code) { - id decoderMock = OCMProtocolMock(@protocol(RTCVideoDecoder)); - OCMStub([decoderMock initDecodeWithSettings:[OCMArg any] numberOfCores:1]).andReturn(return_code); - OCMStub([decoderMock decode:[OCMArg any] - missingFrames:NO - fragmentationHeader:[OCMArg any] - codecSpecificInfo:[OCMArg any] - renderTimeMs:0]) - .andReturn(return_code); - OCMStub([decoderMock releaseDecode]).andReturn(return_code); - - id decoderFactoryMock = OCMProtocolMock(@protocol(RTCVideoDecoderFactory)); - RTCVideoCodecInfo *supported = - [[RTCVideoCodecInfo alloc] initWithPayload:0 name:@"H264" parameters:@{}]; - OCMStub([decoderFactoryMock supportedCodecs]).andReturn(@[ supported ]); - OCMStub([decoderFactoryMock createDecoder:[OCMArg any]]).andReturn(decoderMock); - return decoderFactoryMock; -} - -id CreateOKDecoderFactory() { - return CreateDecoderFactoryReturning(WEBRTC_VIDEO_CODEC_OK); -} - -id CreateErrorDecoderFactory() { - return CreateDecoderFactoryReturning(WEBRTC_VIDEO_CODEC_ERROR); -} - -webrtc::VideoDecoder *GetObjCDecoder(id factory) { - webrtc::ObjCVideoDecoderFactory decoder_factory(factory); - return decoder_factory.CreateVideoDecoder(webrtc::kVideoCodecH264); -} - -#pragma mark - - -TEST(ObjCVideoDecoderFactoryTest, InitDecodeReturnsOKOnSuccess) { - webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateOKDecoderFactory()); - - auto settings = new webrtc::VideoCodec(); - EXPECT_EQ(decoder->InitDecode(settings, 1), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoDecoderFactoryTest, InitDecodeReturnsErrorOnFail) { - webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateErrorDecoderFactory()); - - auto settings = new webrtc::VideoCodec(); - EXPECT_EQ(decoder->InitDecode(settings, 1), WEBRTC_VIDEO_CODEC_ERROR); -} - -TEST(ObjCVideoDecoderFactoryTest, DecodeReturnsOKOnSuccess) { - webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateOKDecoderFactory()); - - webrtc::EncodedImage encoded_image; - webrtc::RTPFragmentationHeader header; - webrtc::CodecSpecificInfo info; - info.codecType = webrtc::kVideoCodecH264; - - EXPECT_EQ(decoder->Decode(encoded_image, false, &header, &info, 0), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoDecoderFactoryTest, DecodeReturnsErrorOnFail) { - webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateErrorDecoderFactory()); - - webrtc::EncodedImage encoded_image; - webrtc::RTPFragmentationHeader header; - webrtc::CodecSpecificInfo info; - info.codecType = webrtc::kVideoCodecH264; - - EXPECT_EQ(decoder->Decode(encoded_image, false, &header, &info, 0), WEBRTC_VIDEO_CODEC_ERROR); -} - -TEST(ObjCVideoDecoderFactoryTest, ReleaseDecodeReturnsOKOnSuccess) { - webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateOKDecoderFactory()); - - EXPECT_EQ(decoder->Release(), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoDecoderFactoryTest, ReleaseDecodeReturnsErrorOnFail) { - webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateErrorDecoderFactory()); - - EXPECT_EQ(decoder->Release(), WEBRTC_VIDEO_CODEC_ERROR); -} diff --git a/webrtc/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm b/webrtc/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm deleted file mode 100644 index 1f858006f9..0000000000 --- a/webrtc/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm +++ /dev/null @@ -1,133 +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 -#import - -#include "webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.h" - -#import "WebRTC/RTCVideoCodec.h" -#import "WebRTC/RTCVideoCodecFactory.h" -#import "WebRTC/RTCVideoFrameBuffer.h" -#include "webrtc/modules/include/module_common_types.h" -#include "webrtc/modules/video_coding/include/video_codec_interface.h" -#include "webrtc/modules/video_coding/include/video_error_codes.h" -#include "webrtc/rtc_base/gunit.h" -#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h" - -id CreateEncoderFactoryReturning(int return_code) { - id encoderMock = OCMProtocolMock(@protocol(RTCVideoEncoder)); - OCMStub([encoderMock initEncodeWithSettings:[OCMArg any] numberOfCores:1]).andReturn(return_code); - OCMStub([encoderMock encode:[OCMArg any] codecSpecificInfo:[OCMArg any] frameTypes:[OCMArg any]]) - .andReturn(return_code); - OCMStub([encoderMock releaseEncode]).andReturn(return_code); - OCMStub([encoderMock setBitrate:0 framerate:0]).andReturn(return_code == WEBRTC_VIDEO_CODEC_OK); - - id encoderFactoryMock = OCMProtocolMock(@protocol(RTCVideoEncoderFactory)); - RTCVideoCodecInfo *supported = - [[RTCVideoCodecInfo alloc] initWithPayload:0 name:@"H264" parameters:@{}]; - OCMStub([encoderFactoryMock supportedCodecs]).andReturn(@[ supported ]); - OCMStub([encoderFactoryMock createEncoder:[OCMArg any]]).andReturn(encoderMock); - return encoderFactoryMock; -} - -id CreateOKEncoderFactory() { - return CreateEncoderFactoryReturning(WEBRTC_VIDEO_CODEC_OK); -} - -id CreateErrorEncoderFactory() { - return CreateEncoderFactoryReturning(WEBRTC_VIDEO_CODEC_ERROR); -} - -webrtc::VideoEncoder *GetObjCEncoder(id factory) { - webrtc::ObjCVideoEncoderFactory encoder_factory(factory); - cricket::VideoCodec codec("H264"); - return encoder_factory.CreateVideoEncoder(codec); -} - -#pragma mark - - -TEST(ObjCVideoEncoderFactoryTest, InitEncodeReturnsOKOnSuccess) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory()); - - auto settings = new webrtc::VideoCodec(); - EXPECT_EQ(encoder->InitEncode(settings, 1, 0), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoEncoderFactoryTest, InitEncodeReturnsErrorOnFail) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory()); - - auto settings = new webrtc::VideoCodec(); - EXPECT_EQ(encoder->InitEncode(settings, 1, 0), WEBRTC_VIDEO_CODEC_ERROR); -} - -TEST(ObjCVideoEncoderFactoryTest, EncodeReturnsOKOnSuccess) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory()); - - CVPixelBufferRef pixel_buffer; - CVPixelBufferCreate(kCFAllocatorDefault, 640, 480, kCVPixelFormatType_32ARGB, nil, &pixel_buffer); - rtc::scoped_refptr buffer = - new rtc::RefCountedObject( - [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixel_buffer]); - webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0); - webrtc::CodecSpecificInfo info; - info.codecType = webrtc::kVideoCodecH264; - info.codec_name = "H264"; - std::vector frame_types; - - EXPECT_EQ(encoder->Encode(frame, &info, &frame_types), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoEncoderFactoryTest, EncodeReturnsErrorOnFail) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory()); - - CVPixelBufferRef pixel_buffer; - CVPixelBufferCreate(kCFAllocatorDefault, 640, 480, kCVPixelFormatType_32ARGB, nil, &pixel_buffer); - rtc::scoped_refptr buffer = - new rtc::RefCountedObject( - [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixel_buffer]); - webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0); - webrtc::CodecSpecificInfo info; - info.codecType = webrtc::kVideoCodecH264; - info.codec_name = "H264"; - std::vector frame_types; - - EXPECT_EQ(encoder->Encode(frame, &info, &frame_types), WEBRTC_VIDEO_CODEC_ERROR); -} - -TEST(ObjCVideoEncoderFactoryTest, ReleaseEncodeReturnsOKOnSuccess) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory()); - - EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoEncoderFactoryTest, ReleaseEncodeReturnsErrorOnFail) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory()); - - EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_ERROR); -} - -TEST(ObjCVideoEncoderFactoryTest, SetChannelParametersAlwaysReturnsOK) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory()); - - EXPECT_EQ(encoder->SetChannelParameters(1, 1), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoEncoderFactoryTest, SetRatesReturnsOKOnSuccess) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory()); - - EXPECT_EQ(encoder->SetRates(0, 0), WEBRTC_VIDEO_CODEC_OK); -} - -TEST(ObjCVideoEncoderFactoryTest, SetRatesReturnsErrorOnFail) { - webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory()); - - EXPECT_EQ(encoder->SetRates(0, 0), WEBRTC_VIDEO_CODEC_ERROR); -}