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}
This commit is contained in:
Peter Boström
2015-11-30 19:14:50 +01:00
parent 7640ffabd7
commit a443ec1a75
3 changed files with 24 additions and 24 deletions

View File

@ -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 // because payload type may be out of date (e.g. before we decode the first
// frame after RegisterReceiveCodec) // frame after RegisterReceiveCodec)
if (ptr_decoder_ != nullptr && 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. // Release it if it was registered and in use.
ReleaseDecoder(ptr_decoder_); ReleaseDecoder(ptr_decoder_);
ptr_decoder_ = nullptr; ptr_decoder_ = nullptr;
@ -571,7 +571,7 @@ VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder(
if (external_dec_item) { if (external_dec_item) {
// External codec. // External codec.
ptr_decoder = new VCMGenericDecoder( ptr_decoder = new VCMGenericDecoder(
*external_dec_item->external_decoder_instance, true); external_dec_item->external_decoder_instance, true);
} else { } else {
// Create decoder. // Create decoder.
ptr_decoder = CreateDecoder(decoder_item->settings->codecType); ptr_decoder = CreateDecoder(decoder_item->settings->codecType);
@ -607,14 +607,14 @@ void VCMCodecDataBase::DeleteEncoder() {
VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const {
switch (type) { switch (type) {
case kVideoCodecVP8: case kVideoCodecVP8:
return new VCMGenericDecoder(*(VP8Decoder::Create())); return new VCMGenericDecoder(VP8Decoder::Create(), false);
case kVideoCodecVP9: case kVideoCodecVP9:
return new VCMGenericDecoder(*(VP9Decoder::Create())); return new VCMGenericDecoder(VP9Decoder::Create(), false);
case kVideoCodecI420: case kVideoCodecI420:
return new VCMGenericDecoder(*(new I420Decoder)); return new VCMGenericDecoder(new I420Decoder(), false);
case kVideoCodecH264: case kVideoCodecH264:
if (H264Decoder::IsSupported()) { if (H264Decoder::IsSupported()) {
return new VCMGenericDecoder(*(H264Decoder::Create())); return new VCMGenericDecoder(H264Decoder::Create(), false);
} }
break; break;
default: default:

View File

@ -8,10 +8,11 @@
* be found in the AUTHORS file in the root of the source tree. * 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/logging.h"
#include "webrtc/base/trace_event.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/generic_decoder.h"
#include "webrtc/modules/video_coding/include/video_coding.h"
#include "webrtc/modules/video_coding/internal_defines.h" #include "webrtc/modules/video_coding/internal_defines.h"
#include "webrtc/system_wrappers/include/clock.h" #include "webrtc/system_wrappers/include/clock.h"
@ -131,16 +132,15 @@ int32_t VCMDecodedFrameCallback::Pop(uint32_t timestamp)
return VCM_OK; return VCM_OK;
} }
VCMGenericDecoder::VCMGenericDecoder(VideoDecoder& decoder, bool isExternal) VCMGenericDecoder::VCMGenericDecoder(VideoDecoder* decoder, bool isExternal)
: : _callback(NULL),
_callback(NULL),
_frameInfos(), _frameInfos(),
_nextFrameInfoIdx(0), _nextFrameInfoIdx(0),
_decoder(decoder), _decoder(decoder),
_codecType(kVideoCodecUnknown), _codecType(kVideoCodecUnknown),
_isExternal(isExternal), _isExternal(isExternal),
_keyFrameDecoded(false) _keyFrameDecoded(false) {
{ RTC_CHECK(_decoder);
} }
VCMGenericDecoder::~VCMGenericDecoder() VCMGenericDecoder::~VCMGenericDecoder()
@ -153,7 +153,7 @@ int32_t VCMGenericDecoder::InitDecode(const VideoCodec* settings,
TRACE_EVENT0("webrtc", "VCMGenericDecoder::InitDecode"); TRACE_EVENT0("webrtc", "VCMGenericDecoder::InitDecode");
_codecType = settings->codecType; _codecType = settings->codecType;
return _decoder.InitDecode(settings, numberOfCores); return _decoder->InitDecode(settings, numberOfCores);
} }
int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, int64_t nowMs) { 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]); _callback->Map(frame.TimeStamp(), &_frameInfos[_nextFrameInfoIdx]);
_nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength; _nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength;
int32_t ret = _decoder.Decode(frame.EncodedImage(), int32_t ret = _decoder->Decode(frame.EncodedImage(),
frame.MissingFrame(), frame.MissingFrame(),
frame.FragmentationHeader(), frame.FragmentationHeader(),
frame.CodecSpecific(), frame.CodecSpecific(),
@ -190,18 +190,18 @@ int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, int64_t nowMs) {
int32_t int32_t
VCMGenericDecoder::Release() VCMGenericDecoder::Release()
{ {
return _decoder.Release(); return _decoder->Release();
} }
int32_t VCMGenericDecoder::Reset() int32_t VCMGenericDecoder::Reset()
{ {
return _decoder.Reset(); return _decoder->Reset();
} }
int32_t VCMGenericDecoder::RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback) int32_t VCMGenericDecoder::RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback)
{ {
_callback = callback; _callback = callback;
return _decoder.RegisterDecodeCompleteCallback(callback); return _decoder->RegisterDecodeCompleteCallback(callback);
} }
bool VCMGenericDecoder::External() const bool VCMGenericDecoder::External() const

View File

@ -65,7 +65,7 @@ class VCMGenericDecoder
{ {
friend class VCMCodecDataBase; friend class VCMCodecDataBase;
public: public:
VCMGenericDecoder(VideoDecoder& decoder, bool isExternal = false); VCMGenericDecoder(VideoDecoder* decoder, bool external);
~VCMGenericDecoder(); ~VCMGenericDecoder();
/** /**
@ -102,7 +102,7 @@ private:
VCMDecodedFrameCallback* _callback; VCMDecodedFrameCallback* _callback;
VCMFrameInformation _frameInfos[kDecoderFrameMemoryLength]; VCMFrameInformation _frameInfos[kDecoderFrameMemoryLength];
uint32_t _nextFrameInfoIdx; uint32_t _nextFrameInfoIdx;
VideoDecoder& _decoder; VideoDecoder* const _decoder;
VideoCodecType _codecType; VideoCodecType _codecType;
bool _isExternal; bool _isExternal;
bool _keyFrameDecoded; bool _keyFrameDecoded;