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}
diff --git a/webrtc/modules/video_coding/codec_database.cc b/webrtc/modules/video_coding/codec_database.cc
index 9f016d9..2b358dd 100644
--- a/webrtc/modules/video_coding/codec_database.cc
+++ b/webrtc/modules/video_coding/codec_database.cc
@@ -423,7 +423,7 @@
// 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 @@
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 @@
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 092d054..294a903 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 @@
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 @@
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 @@
_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::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 d79b5e5..1375996 100644
--- a/webrtc/modules/video_coding/generic_decoder.h
+++ b/webrtc/modules/video_coding/generic_decoder.h
@@ -65,7 +65,7 @@
{
friend class VCMCodecDataBase;
public:
- VCMGenericDecoder(VideoDecoder& decoder, bool isExternal = false);
+ VCMGenericDecoder(VideoDecoder* decoder, bool external);
~VCMGenericDecoder();
/**
@@ -102,7 +102,7 @@
VCMDecodedFrameCallback* _callback;
VCMFrameInformation _frameInfos[kDecoderFrameMemoryLength];
uint32_t _nextFrameInfoIdx;
- VideoDecoder& _decoder;
+ VideoDecoder* const _decoder;
VideoCodecType _codecType;
bool _isExternal;
bool _keyFrameDecoded;