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;