Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Unified Diff: webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm

Issue 2980173002: Revert of Injectable Obj-C video codecs (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm
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 28b386e42844feecda03ecf7df79e500e1494dc4..0000000000000000000000000000000000000000
--- 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 <vector>
-
-#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<webrtc::VideoFrameBuffer> video_frame_buffer =
- decodedImage.video_frame_buffer();
- id<RTCVideoFrameBuffer> rtcFrameBuffer;
- rtc::scoped_refptr<webrtc::ObjCFrameBuffer> objc_frame_buffer(
- static_cast<webrtc::ObjCFrameBuffer *>(video_frame_buffer.get()));
- rtcFrameBuffer = (id<RTCVideoFrameBuffer>)objc_frame_buffer->wrapped_frame_buffer();
-
- RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc]
- initWithBuffer:rtcFrameBuffer
- rotation:static_cast<RTCVideoRotation>(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<RTCCodecSpecificInfo>)info
- frameTypes:(NSArray<NSNumber *> *)frameTypes {
- rtc::scoped_refptr<webrtc::VideoFrameBuffer> frameBuffer =
- new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(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<webrtc::FrameType> 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<RTCCodecSpecificInfo>)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<RTCVideoCodecInfo *> *)supportedCodecs {
- NSMutableArray<RTCVideoCodecInfo *> *codecs = [NSMutableArray array];
- NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName];
-
- if (IsHighProfileEnabled()) {
- NSDictionary<NSString *, NSString *> *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<NSString *, NSString *> *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<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
- return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
-}
-
-@end
-
-// Decoder factory.
-@implementation RTCVideoDecoderFactoryH264
-
-- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info {
- return [[RTCVideoDecoderH264 alloc] init];
-}
-
-- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
- NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName];
- return @[ [[RTCVideoCodecInfo alloc] initWithPayload:0 name:codecName parameters:@{}] ];
-}
-
-@end

Powered by Google App Engine
This is Rietveld 408576698