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 -