From a443ec1a75d10be0f24fa0163f23e1555d4c53cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Bostr=C3=B6m?= Date: Mon, 30 Nov 2015 19:14:50 +0100 Subject: [PATCH] Add _decoder CHECK to VCMGenericDecoder constructor. This should never be using a null decoder, but it looks like it's crashing out in the field. Adding a CHECK to see if it catches any interesting stack traces. Also making the _decoder pointer const to show that it should never be changing. BUG=chromium:563299 R=stefan@webrtc.org Review URL: https://codereview.webrtc.org/1485713002 . Cr-Commit-Position: refs/heads/master@{#10843} --- webrtc/modules/video_coding/codec_database.cc | 12 +++---- .../modules/video_coding/generic_decoder.cc | 32 +++++++++---------- webrtc/modules/video_coding/generic_decoder.h | 4 +-- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/webrtc/modules/video_coding/codec_database.cc b/webrtc/modules/video_coding/codec_database.cc index 9f016d9924..2b358dd123 100644 --- a/webrtc/modules/video_coding/codec_database.cc +++ b/webrtc/modules/video_coding/codec_database.cc @@ -423,7 +423,7 @@ bool VCMCodecDataBase::DeregisterExternalDecoder(uint8_t payload_type) { // because payload type may be out of date (e.g. before we decode the first // frame after RegisterReceiveCodec) if (ptr_decoder_ != nullptr && - &ptr_decoder_->_decoder == (*it).second->external_decoder_instance) { + ptr_decoder_->_decoder == (*it).second->external_decoder_instance) { // Release it if it was registered and in use. ReleaseDecoder(ptr_decoder_); ptr_decoder_ = nullptr; @@ -571,7 +571,7 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder( if (external_dec_item) { // External codec. ptr_decoder = new VCMGenericDecoder( - *external_dec_item->external_decoder_instance, true); + external_dec_item->external_decoder_instance, true); } else { // Create decoder. ptr_decoder = CreateDecoder(decoder_item->settings->codecType); @@ -607,14 +607,14 @@ void VCMCodecDataBase::DeleteEncoder() { VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { switch (type) { case kVideoCodecVP8: - return new VCMGenericDecoder(*(VP8Decoder::Create())); + return new VCMGenericDecoder(VP8Decoder::Create(), false); case kVideoCodecVP9: - return new VCMGenericDecoder(*(VP9Decoder::Create())); + return new VCMGenericDecoder(VP9Decoder::Create(), false); case kVideoCodecI420: - return new VCMGenericDecoder(*(new I420Decoder)); + return new VCMGenericDecoder(new I420Decoder(), false); case kVideoCodecH264: if (H264Decoder::IsSupported()) { - return new VCMGenericDecoder(*(H264Decoder::Create())); + return new VCMGenericDecoder(H264Decoder::Create(), false); } break; default: diff --git a/webrtc/modules/video_coding/generic_decoder.cc b/webrtc/modules/video_coding/generic_decoder.cc index 092d0546ca..294a9030c5 100644 --- a/webrtc/modules/video_coding/generic_decoder.cc +++ b/webrtc/modules/video_coding/generic_decoder.cc @@ -8,10 +8,11 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include "webrtc/base/checks.h" #include "webrtc/base/logging.h" #include "webrtc/base/trace_event.h" -#include "webrtc/modules/video_coding/include/video_coding.h" #include "webrtc/modules/video_coding/generic_decoder.h" +#include "webrtc/modules/video_coding/include/video_coding.h" #include "webrtc/modules/video_coding/internal_defines.h" #include "webrtc/system_wrappers/include/clock.h" @@ -131,16 +132,15 @@ int32_t VCMDecodedFrameCallback::Pop(uint32_t timestamp) return VCM_OK; } -VCMGenericDecoder::VCMGenericDecoder(VideoDecoder& decoder, bool isExternal) -: -_callback(NULL), -_frameInfos(), -_nextFrameInfoIdx(0), -_decoder(decoder), -_codecType(kVideoCodecUnknown), -_isExternal(isExternal), -_keyFrameDecoded(false) -{ +VCMGenericDecoder::VCMGenericDecoder(VideoDecoder* decoder, bool isExternal) + : _callback(NULL), + _frameInfos(), + _nextFrameInfoIdx(0), + _decoder(decoder), + _codecType(kVideoCodecUnknown), + _isExternal(isExternal), + _keyFrameDecoded(false) { + RTC_CHECK(_decoder); } VCMGenericDecoder::~VCMGenericDecoder() @@ -153,7 +153,7 @@ int32_t VCMGenericDecoder::InitDecode(const VideoCodec* settings, TRACE_EVENT0("webrtc", "VCMGenericDecoder::InitDecode"); _codecType = settings->codecType; - return _decoder.InitDecode(settings, numberOfCores); + return _decoder->InitDecode(settings, numberOfCores); } int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, int64_t nowMs) { @@ -165,7 +165,7 @@ int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, int64_t nowMs) { _callback->Map(frame.TimeStamp(), &_frameInfos[_nextFrameInfoIdx]); _nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength; - int32_t ret = _decoder.Decode(frame.EncodedImage(), + int32_t ret = _decoder->Decode(frame.EncodedImage(), frame.MissingFrame(), frame.FragmentationHeader(), frame.CodecSpecific(), @@ -190,18 +190,18 @@ int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, int64_t nowMs) { int32_t VCMGenericDecoder::Release() { - return _decoder.Release(); + return _decoder->Release(); } int32_t VCMGenericDecoder::Reset() { - return _decoder.Reset(); + return _decoder->Reset(); } int32_t VCMGenericDecoder::RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback) { _callback = callback; - return _decoder.RegisterDecodeCompleteCallback(callback); + return _decoder->RegisterDecodeCompleteCallback(callback); } bool VCMGenericDecoder::External() const diff --git a/webrtc/modules/video_coding/generic_decoder.h b/webrtc/modules/video_coding/generic_decoder.h index d79b5e59f2..13759964ab 100644 --- a/webrtc/modules/video_coding/generic_decoder.h +++ b/webrtc/modules/video_coding/generic_decoder.h @@ -65,7 +65,7 @@ class VCMGenericDecoder { friend class VCMCodecDataBase; public: - VCMGenericDecoder(VideoDecoder& decoder, bool isExternal = false); + VCMGenericDecoder(VideoDecoder* decoder, bool external); ~VCMGenericDecoder(); /** @@ -102,7 +102,7 @@ private: VCMDecodedFrameCallback* _callback; VCMFrameInformation _frameInfos[kDecoderFrameMemoryLength]; uint32_t _nextFrameInfoIdx; - VideoDecoder& _decoder; + VideoDecoder* const _decoder; VideoCodecType _codecType; bool _isExternal; bool _keyFrameDecoded;