From d8bf2d498692fc1a276edaeee2ce1f43475bd70b Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Tue, 23 Apr 2019 12:52:02 +0000 Subject: [PATCH] Revert "Delete deprecated variant of VideoDecoder::Decode" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 3a86d9520c9692abe4c6d2a73faf4fb7a0cb80b2. Reason for revert: breaks downstream project Original change's description: > Delete deprecated variant of VideoDecoder::Decode > > Bug: webrtc:10379 > Change-Id: I4dd8b503625a9ea2a71177165238e128ac3e49bb > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/132554 > Reviewed-by: Sami Kalliomäki > Reviewed-by: Rasmus Brandt > Reviewed-by: Kári Helgason > Reviewed-by: Erik Språng > Commit-Queue: Niels Moller > Cr-Commit-Position: refs/heads/master@{#27712} TBR=brandtr@webrtc.org,sakal@webrtc.org,nisse@webrtc.org,kthelgason@webrtc.org,sprang@webrtc.org Change-Id: Ie971fd821f4de9e4b68e1608d7074835bdf2ed16 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:10379 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/133907 Reviewed-by: Danil Chapovalov Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#27713} --- api/video_codecs/video_decoder.cc | 13 +++++++++++++ api/video_codecs/video_decoder.h | 13 ++++++++++++- sdk/android/src/jni/android_media_decoder.cc | 2 ++ sdk/android/src/jni/video_decoder_wrapper.cc | 1 + sdk/android/src/jni/video_decoder_wrapper.h | 1 + sdk/objc/native/src/objc_video_decoder_factory.mm | 14 +++++++++++++- video/video_stream_decoder_impl.cc | 1 + 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/api/video_codecs/video_decoder.cc b/api/video_codecs/video_decoder.cc index 1044ae4d39..b0a1c874b7 100644 --- a/api/video_codecs/video_decoder.cc +++ b/api/video_codecs/video_decoder.cc @@ -28,6 +28,19 @@ int32_t DecodedImageCallback::ReceivedDecodedFrame(const uint64_t pictureId) { return -1; } +int32_t VideoDecoder::Decode(const EncodedImage& input_image, + bool missing_frames, + int64_t render_time_ms) { + return Decode(input_image, missing_frames, nullptr, render_time_ms); +} + +int32_t VideoDecoder::Decode(const EncodedImage& input_image, + bool missing_frames, + const CodecSpecificInfo* codec_specific_info, + int64_t render_time_ms) { + return Decode(input_image, missing_frames, render_time_ms); +} + bool VideoDecoder::PrefersLateDecoding() const { return true; } diff --git a/api/video_codecs/video_decoder.h b/api/video_codecs/video_decoder.h index e9039343c4..d0341b184b 100644 --- a/api/video_codecs/video_decoder.h +++ b/api/video_codecs/video_decoder.h @@ -22,6 +22,10 @@ namespace webrtc { +// TODO(pbos): Expose these through a public (root) header or change these APIs. +struct CodecSpecificInfo; +class VideoCodec; + class RTC_EXPORT DecodedImageCallback { public: virtual ~DecodedImageCallback() {} @@ -51,7 +55,14 @@ class RTC_EXPORT VideoDecoder { virtual int32_t Decode(const EncodedImage& input_image, bool missing_frames, - int64_t render_time_ms) = 0; + int64_t render_time_ms); + + // TODO(bugs.webrtc.org/10379): Deprecated. Delete, and make above method pure + // virtual, as soon as downstream applications are updated. + virtual int32_t Decode(const EncodedImage& input_image, + bool missing_frames, + const CodecSpecificInfo* codec_specific_info, + int64_t render_time_ms); virtual int32_t RegisterDecodeCompleteCallback( DecodedImageCallback* callback) = 0; diff --git a/sdk/android/src/jni/android_media_decoder.cc b/sdk/android/src/jni/android_media_decoder.cc index 60250d84be..6506a86810 100644 --- a/sdk/android/src/jni/android_media_decoder.cc +++ b/sdk/android/src/jni/android_media_decoder.cc @@ -65,6 +65,7 @@ class MediaCodecVideoDecoder : public VideoDecoder, public rtc::MessageHandler { int32_t Decode(const EncodedImage& inputImage, bool missingFrames, + const CodecSpecificInfo* codecSpecificInfo = NULL, int64_t renderTimeMs = -1) override; int32_t RegisterDecodeCompleteCallback( @@ -349,6 +350,7 @@ int32_t MediaCodecVideoDecoder::ProcessHWErrorOnCodecThread() { int32_t MediaCodecVideoDecoder::Decode( const EncodedImage& inputImage, bool missingFrames, + const CodecSpecificInfo* codecSpecificInfo, int64_t renderTimeMs) { if (sw_fallback_required_) { ALOGE << "Decode() - fallback to SW codec"; diff --git a/sdk/android/src/jni/video_decoder_wrapper.cc b/sdk/android/src/jni/video_decoder_wrapper.cc index 1a157155a7..e3140746b6 100644 --- a/sdk/android/src/jni/video_decoder_wrapper.cc +++ b/sdk/android/src/jni/video_decoder_wrapper.cc @@ -88,6 +88,7 @@ int32_t VideoDecoderWrapper::InitDecodeInternal(JNIEnv* jni) { int32_t VideoDecoderWrapper::Decode( const EncodedImage& image_param, bool missing_frames, + const CodecSpecificInfo* codec_specific_info, int64_t render_time_ms) { RTC_DCHECK_RUN_ON(&decoder_thread_checker_); if (!initialized_) { diff --git a/sdk/android/src/jni/video_decoder_wrapper.h b/sdk/android/src/jni/video_decoder_wrapper.h index a2bc072705..55a395bee7 100644 --- a/sdk/android/src/jni/video_decoder_wrapper.h +++ b/sdk/android/src/jni/video_decoder_wrapper.h @@ -35,6 +35,7 @@ class VideoDecoderWrapper : public VideoDecoder { int32_t Decode(const EncodedImage& input_image, bool missing_frames, + const CodecSpecificInfo* codec_specific_info, int64_t render_time_ms) override; int32_t RegisterDecodeCompleteCallback( diff --git a/sdk/objc/native/src/objc_video_decoder_factory.mm b/sdk/objc/native/src/objc_video_decoder_factory.mm index fdc15c7277..c79fb06647 100644 --- a/sdk/objc/native/src/objc_video_decoder_factory.mm +++ b/sdk/objc/native/src/objc_video_decoder_factory.mm @@ -51,13 +51,25 @@ class ObjCVideoDecoder : public VideoDecoder { int32_t Decode(const EncodedImage &input_image, bool missing_frames, + const CodecSpecificInfo *codec_specific_info = NULL, int64_t render_time_ms = -1) override { RTCEncodedImage *encodedImage = [[RTCEncodedImage alloc] initWithNativeEncodedImage:input_image]; + // 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 - codecSpecificInfo:nil + codecSpecificInfo:rtcCodecSpecificInfo renderTimeMs:render_time_ms]; } diff --git a/video/video_stream_decoder_impl.cc b/video/video_stream_decoder_impl.cc index 42a543451c..c3c1d0dc47 100644 --- a/video/video_stream_decoder_impl.cc +++ b/video/video_stream_decoder_impl.cc @@ -210,6 +210,7 @@ VideoStreamDecoderImpl::DecodeResult VideoStreamDecoderImpl::DecodeNextFrame( int32_t decode_result = decoder->Decode(frame->EncodedImage(), false, // missing_frame + nullptr, // codec specific info frame->RenderTimeMs()); return decode_result == WEBRTC_VIDEO_CODEC_OK ? kOk : kDecodeFailure;