From ebd4f7988eb31d7c4c2a9cf2581c77a33a0ad6c4 Mon Sep 17 00:00:00 2001 From: kthelgason Date: Mon, 4 Sep 2017 04:36:21 -0700 Subject: [PATCH] Let CreateVideoDecoder take a cricket::VideoCodec. This makes it possible for decoder factories to actually provide any video codec, not just the ones WebRTC knows about. It also brings the decoder factory interface more in line with that of the encoder factory. BUG=webrtc:8140 Review-Url: https://codereview.webrtc.org/3007433002 Cr-Commit-Position: refs/heads/master@{#19654} --- .../media/engine/webrtcvideodecoderfactory.h | 18 +++++++++++++++++- webrtc/media/engine/webrtcvideoengine.cc | 4 ++-- webrtc/sdk/BUILD.gn | 1 + .../VideoToolbox/objc_video_decoder_factory.h | 6 ++++-- .../VideoToolbox/objc_video_decoder_factory.mm | 7 +++---- .../objc_video_decoder_factory_tests.mm | 4 +++- 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/webrtc/media/engine/webrtcvideodecoderfactory.h b/webrtc/media/engine/webrtcvideodecoderfactory.h index 64a8faa1e4..d0dc3a500e 100644 --- a/webrtc/media/engine/webrtcvideodecoderfactory.h +++ b/webrtc/media/engine/webrtcvideodecoderfactory.h @@ -12,6 +12,7 @@ #define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEODECODERFACTORY_H_ #include "webrtc/common_types.h" +#include "webrtc/media/base/codec.h" #include "webrtc/rtc_base/refcount.h" namespace webrtc { @@ -28,8 +29,23 @@ class WebRtcVideoDecoderFactory { public: // Caller takes the ownership of the returned object and it should be released // by calling DestroyVideoDecoder(). + virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams( + const VideoCodec& codec, + VideoDecoderParams params) { + // Default implementation that delegates to old version in order to preserve + // backwards-compatability. + webrtc::VideoCodecType type = webrtc::PayloadStringToCodecType(codec.name); + return CreateVideoDecoderWithParams(type, params); + } + // DEPRECATED. + // These methods should not be used by new code and will eventually be + // removed. See http://crbug.com/webrtc/8140. virtual webrtc::VideoDecoder* CreateVideoDecoder( - webrtc::VideoCodecType type) = 0; + webrtc::VideoCodecType type) { + RTC_NOTREACHED(); + return nullptr; + }; + virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams( webrtc::VideoCodecType type, VideoDecoderParams params) { diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc index a9dc11e421..983b4eae61 100644 --- a/webrtc/media/engine/webrtcvideoengine.cc +++ b/webrtc/media/engine/webrtcvideoengine.cc @@ -2147,7 +2147,7 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::CreateOrReuseVideoDecoder( if (external_decoder_factory_ != NULL) { webrtc::VideoDecoder* decoder = external_decoder_factory_->CreateVideoDecoderWithParams( - type, {stream_params_.id}); + codec, {stream_params_.id}); if (decoder != NULL) { return AllocatedDecoder(decoder, type, true /* is_external */); } @@ -2155,7 +2155,7 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::CreateOrReuseVideoDecoder( InternalDecoderFactory internal_decoder_factory; return AllocatedDecoder(internal_decoder_factory.CreateVideoDecoderWithParams( - type, {stream_params_.id}), + codec, {stream_params_.id}), type, false /* is_external */); } diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 77b9d39e8c..2965338127 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -541,6 +541,7 @@ if (is_ios || is_mac) { ":videotoolbox_objc", ":videotracksource_objc", "..//system_wrappers:system_wrappers_default", + "../media:rtc_media_base", "../modules:module_api", "../rtc_base:rtc_base_tests_utils", "../system_wrappers:system_wrappers_default", diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h index dca7fe2899..8fd8c48cc0 100644 --- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h +++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h @@ -25,8 +25,10 @@ class ObjCVideoDecoderFactory : public cricket::WebRtcVideoDecoderFactory { id wrapped_decoder_factory() const; - webrtc::VideoDecoder* CreateVideoDecoder( - webrtc::VideoCodecType type) override; + VideoDecoder* CreateVideoDecoderWithParams( + const cricket::VideoCodec& codec, + cricket::VideoDecoderParams params) override; + void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override; private: diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm index 9d4f2b8e0a..d126f8442c 100644 --- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm +++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm @@ -103,10 +103,9 @@ id ObjCVideoDecoderFactory::wrapped_decoder_factory() co return decoder_factory_; } -VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoder(VideoCodecType type) { - const char *codec_name = CodecTypeToPayloadString(type); - - NSString *codecName = [NSString stringWithUTF8String:codec_name]; +VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoderWithParams( + const cricket::VideoCodec &codec, cricket::VideoDecoderParams params) { + NSString *codecName = [NSString stringWithUTF8String:codec.name.c_str()]; for (RTCVideoCodecInfo *codecInfo in decoder_factory_.supportedCodecs) { if ([codecName isEqualToString:codecInfo.name]) { id decoder = [decoder_factory_ createDecoder:codecInfo]; 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 index 3b1eb0571b..6fcc42296e 100644 --- a/webrtc/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm +++ b/webrtc/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm @@ -15,6 +15,7 @@ #import "WebRTC/RTCVideoCodec.h" #import "WebRTC/RTCVideoCodecFactory.h" +#include "webrtc/media/base/codec.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" @@ -49,7 +50,8 @@ id CreateErrorDecoderFactory() { webrtc::VideoDecoder *GetObjCDecoder(id factory) { webrtc::ObjCVideoDecoderFactory decoder_factory(factory); - return decoder_factory.CreateVideoDecoder(webrtc::kVideoCodecH264); + return decoder_factory.CreateVideoDecoderWithParams(cricket::VideoCodec(cricket::kH264CodecName), + {}); } #pragma mark -