зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1212164: Prevent use of demuxer before it is ready. r=cpearce
This commit is contained in:
Родитель
0eb9204d80
Коммит
339a21eccf
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче