diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc index ba861ccdf8..95ad24406b 100644 --- a/talk/media/webrtc/webrtcvideoengine2.cc +++ b/talk/media/webrtc/webrtcvideoengine2.cc @@ -2226,10 +2226,9 @@ WebRtcVideoChannel2::WebRtcVideoReceiveStream::CreateOrReuseVideoDecoder( webrtc::VideoDecoder::Create(webrtc::VideoDecoder::kH264), type, false); } - // This shouldn't happen, we should not be trying to create something we don't - // support. - RTC_DCHECK(false); - return AllocatedDecoder(NULL, webrtc::kVideoCodecUnknown, false); + return AllocatedDecoder( + webrtc::VideoDecoder::Create(webrtc::VideoDecoder::kUnsupportedCodec), + webrtc::kVideoCodecUnknown, false); } void WebRtcVideoChannel2::WebRtcVideoReceiveStream::ConfigureCodecs( diff --git a/webrtc/video/video_decoder.cc b/webrtc/video/video_decoder.cc index d570f9f69d..195f7e14d6 100644 --- a/webrtc/video/video_decoder.cc +++ b/webrtc/video/video_decoder.cc @@ -27,8 +27,8 @@ VideoDecoder* VideoDecoder::Create(VideoDecoder::DecoderType codec_type) { case kVp9: return VP9Decoder::Create(); case kUnsupportedCodec: - RTC_NOTREACHED(); - return nullptr; + LOG(LS_ERROR) << "Creating NullVideoDecoder for unsupported codec."; + return new NullVideoDecoder(); } RTC_NOTREACHED(); return nullptr; @@ -140,4 +140,40 @@ const char* VideoDecoderSoftwareFallbackWrapper::ImplementationName() const { return decoder_->ImplementationName(); } +NullVideoDecoder::NullVideoDecoder() {} + +int32_t NullVideoDecoder::InitDecode(const VideoCodec* codec_settings, + int32_t number_of_cores) { + LOG(LS_ERROR) << "Can't initialize NullVideoDecoder."; + return WEBRTC_VIDEO_CODEC_OK; +} + +int32_t NullVideoDecoder::Decode(const EncodedImage& input_image, + bool missing_frames, + const RTPFragmentationHeader* fragmentation, + const CodecSpecificInfo* codec_specific_info, + int64_t render_time_ms) { + LOG(LS_ERROR) << "The NullVideoDecoder doesn't support decoding."; + return WEBRTC_VIDEO_CODEC_OK; +} + +int32_t NullVideoDecoder::RegisterDecodeCompleteCallback( + DecodedImageCallback* callback) { + LOG(LS_ERROR) + << "Can't register decode complete callback on NullVideoDecoder."; + return WEBRTC_VIDEO_CODEC_OK; +} + +int32_t NullVideoDecoder::Release() { + return WEBRTC_VIDEO_CODEC_OK; +} + +int32_t NullVideoDecoder::Reset() { + return WEBRTC_VIDEO_CODEC_OK; +} + +const char* NullVideoDecoder::ImplementationName() const { + return "NullVideoDecoder"; +} + } // namespace webrtc diff --git a/webrtc/video_decoder.h b/webrtc/video_decoder.h index 23e89b1da6..368b846e14 100644 --- a/webrtc/video_decoder.h +++ b/webrtc/video_decoder.h @@ -123,6 +123,30 @@ class VideoDecoderSoftwareFallbackWrapper : public webrtc::VideoDecoder { DecodedImageCallback* callback_; }; +// Video decoder class to be used for unknown codecs. Doesn't support decoding +// but logs messages to LS_ERROR. +class NullVideoDecoder : public VideoDecoder { + public: + NullVideoDecoder(); + + int32_t InitDecode(const VideoCodec* codec_settings, + int32_t number_of_cores) override; + + int32_t Decode(const EncodedImage& input_image, + bool missing_frames, + const RTPFragmentationHeader* fragmentation, + const CodecSpecificInfo* codec_specific_info, + int64_t render_time_ms) override; + + int32_t RegisterDecodeCompleteCallback( + DecodedImageCallback* callback) override; + + int32_t Release() override; + int32_t Reset() override; + + const char* ImplementationName() const override; +}; + } // namespace webrtc #endif // WEBRTC_VIDEO_DECODER_H_