Bug 1212164: Prevent use of demuxer before it is ready. r=cpearce

This commit is contained in:
Jean-Yves Avenard 2015-10-07 12:00:52 +11:00
Родитель 0eb9204d80
Коммит 339a21eccf
2 изменённых файлов: 8 добавлений и 3 удалений

Просмотреть файл

@ -63,9 +63,10 @@ MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder,
MediaDataDemuxer* aDemuxer, MediaDataDemuxer* aDemuxer,
TaskQueue* aBorrowedTaskQueue) TaskQueue* aBorrowedTaskQueue)
: MediaDecoderReader(aDecoder, aBorrowedTaskQueue) : MediaDecoderReader(aDecoder, aBorrowedTaskQueue)
, mDemuxer(aDemuxer)
, mAudio(this, MediaData::AUDIO_DATA, Preferences::GetUint("media.audio-decode-ahead", 2)) , mAudio(this, MediaData::AUDIO_DATA, Preferences::GetUint("media.audio-decode-ahead", 2))
, mVideo(this, MediaData::VIDEO_DATA, Preferences::GetUint("media.video-decode-ahead", 2)) , mVideo(this, MediaData::VIDEO_DATA, Preferences::GetUint("media.video-decode-ahead", 2))
, mDemuxer(aDemuxer)
, mDemuxerInitDone(false)
, mLastReportedNumDecodedFrames(0) , mLastReportedNumDecodedFrames(0)
, mLayersBackendType(layers::LayersBackend::LAYERS_NONE) , mLayersBackendType(layers::LayersBackend::LAYERS_NONE)
, mInitDone(false) , mInitDone(false)
@ -272,6 +273,8 @@ MediaFormatReader::OnDemuxerInitDone(nsresult)
MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(OnTaskQueue());
mDemuxerInitRequest.Complete(); mDemuxerInitRequest.Complete();
mDemuxerInitDone = true;
// To decode, we need valid video and a place to put it. // To decode, we need valid video and a place to put it.
bool videoActive = !!mDemuxer->GetNumberTracks(TrackInfo::kVideoTrack) && bool videoActive = !!mDemuxer->GetNumberTracks(TrackInfo::kVideoTrack) &&
mDecoder->GetImageContainer(); mDecoder->GetImageContainer();
@ -1593,7 +1596,8 @@ MediaFormatReader::NotifyDemuxer(uint32_t aLength, int64_t aOffset)
MOZ_ASSERT(OnTaskQueue()); MOZ_ASSERT(OnTaskQueue());
LOGV("aLength=%u, aOffset=%lld", aLength, aOffset); LOGV("aLength=%u, aOffset=%lld", aLength, aOffset);
if (mShutdown || !mDemuxer) { if (mShutdown || !mDemuxer ||
(!mDemuxerInitDone && !mDemuxerInitRequest.Exists())) {
return; return;
} }

Просмотреть файл

@ -152,7 +152,6 @@ private:
size_t SizeOfQueue(TrackType aTrack); size_t SizeOfQueue(TrackType aTrack);
nsRefPtr<MediaDataDemuxer> mDemuxer;
nsRefPtr<PDMFactory> mPlatform; nsRefPtr<PDMFactory> mPlatform;
class DecoderCallback : public MediaDataDecoderCallback { class DecoderCallback : public MediaDataDecoderCallback {
@ -355,6 +354,8 @@ private:
void OnDecoderInitFailed(MediaDataDecoder::DecoderFailureReason aReason); void OnDecoderInitFailed(MediaDataDecoder::DecoderFailureReason aReason);
// Demuxer objects. // Demuxer objects.
nsRefPtr<MediaDataDemuxer> mDemuxer;
bool mDemuxerInitDone;
void OnDemuxerInitDone(nsresult); void OnDemuxerInitDone(nsresult);
void OnDemuxerInitFailed(DemuxerFailureReason aFailure); void OnDemuxerInitFailed(DemuxerFailureReason aFailure);
MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest; MozPromiseRequestHolder<MediaDataDemuxer::InitPromise> mDemuxerInitRequest;