From 339a21eccf6406e52b5f7820ef8ea283c96f26f7 Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 7 Oct 2015 12:00:52 +1100 Subject: [PATCH] Bug 1212164: Prevent use of demuxer before it is ready. r=cpearce --- dom/media/MediaFormatReader.cpp | 8 ++++++-- dom/media/MediaFormatReader.h | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp index c1f79a7c14bd..6b0af2bcdf2b 100644 --- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -63,9 +63,10 @@ MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder, MediaDataDemuxer* aDemuxer, TaskQueue* aBorrowedTaskQueue) : MediaDecoderReader(aDecoder, aBorrowedTaskQueue) - , mDemuxer(aDemuxer) , mAudio(this, MediaData::AUDIO_DATA, Preferences::GetUint("media.audio-decode-ahead", 2)) , mVideo(this, MediaData::VIDEO_DATA, Preferences::GetUint("media.video-decode-ahead", 2)) + , mDemuxer(aDemuxer) + , mDemuxerInitDone(false) , mLastReportedNumDecodedFrames(0) , mLayersBackendType(layers::LayersBackend::LAYERS_NONE) , mInitDone(false) @@ -272,6 +273,8 @@ MediaFormatReader::OnDemuxerInitDone(nsresult) MOZ_ASSERT(OnTaskQueue()); mDemuxerInitRequest.Complete(); + mDemuxerInitDone = true; + // To decode, we need valid video and a place to put it. bool videoActive = !!mDemuxer->GetNumberTracks(TrackInfo::kVideoTrack) && mDecoder->GetImageContainer(); @@ -1593,7 +1596,8 @@ MediaFormatReader::NotifyDemuxer(uint32_t aLength, int64_t aOffset) MOZ_ASSERT(OnTaskQueue()); LOGV("aLength=%u, aOffset=%lld", aLength, aOffset); - if (mShutdown || !mDemuxer) { + if (mShutdown || !mDemuxer || + (!mDemuxerInitDone && !mDemuxerInitRequest.Exists())) { return; } diff --git a/dom/media/MediaFormatReader.h b/dom/media/MediaFormatReader.h index 85951ab12df6..64f1d5c92112 100644 --- a/dom/media/MediaFormatReader.h +++ b/dom/media/MediaFormatReader.h @@ -152,7 +152,6 @@ private: size_t SizeOfQueue(TrackType aTrack); - nsRefPtr mDemuxer; nsRefPtr mPlatform; class DecoderCallback : public MediaDataDecoderCallback { @@ -355,6 +354,8 @@ private: void OnDecoderInitFailed(MediaDataDecoder::DecoderFailureReason aReason); // Demuxer objects. + nsRefPtr mDemuxer; + bool mDemuxerInitDone; void OnDemuxerInitDone(nsresult); void OnDemuxerInitFailed(DemuxerFailureReason aFailure); MozPromiseRequestHolder mDemuxerInitRequest;