зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1209850: Only attempt to initialize decoders as they are required. r=alfredo
This commit is contained in:
Родитель
6807956b60
Коммит
3785990cb1
|
@ -438,6 +438,36 @@ MediaFormatReader::EnsureDecodersCreated()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
MediaFormatReader::EnsureDecoderInitialized(TrackType aTrack)
|
||||
{
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
auto& decoder = GetDecoderData(aTrack);
|
||||
|
||||
if (!decoder.mDecoder) {
|
||||
MOZ_ASSERT(false);
|
||||
return false;
|
||||
}
|
||||
if (decoder.mDecoderInitialized) {
|
||||
return true;
|
||||
}
|
||||
nsRefPtr<MediaFormatReader> self = this;
|
||||
decoder.mInitPromise.Begin(decoder.mDecoder->Init()
|
||||
->Then(OwnerThread(), __func__,
|
||||
[self] (TrackType aTrack) {
|
||||
auto& decoder = self->GetDecoderData(aTrack);
|
||||
decoder.mInitPromise.Complete();
|
||||
decoder.mDecoderInitialized = true;
|
||||
self->ScheduleUpdate(aTrack);
|
||||
},
|
||||
[self, aTrack] (MediaDataDecoder::DecoderFailureReason aResult) {
|
||||
auto& decoder = self->GetDecoderData(aTrack);
|
||||
decoder.mInitPromise.Complete();
|
||||
self->NotifyError(aTrack);
|
||||
}));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
MediaFormatReader::EnsureDecodersInitialized()
|
||||
{
|
||||
|
@ -449,16 +479,19 @@ MediaFormatReader::EnsureDecodersInitialized()
|
|||
// will call ScheduleUpdate() again.
|
||||
// It also avoids calling decoder->Init() multiple times.
|
||||
if (mDecodersInitRequest.Exists()) {
|
||||
MOZ_ASSERT(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
nsTArray<nsRefPtr<MediaDataDecoder::InitPromise>> promises;
|
||||
|
||||
if (mVideo.mDecoder && !mVideo.mDecoderInitialized) {
|
||||
MOZ_ASSERT(!mVideo.mInitPromise.Exists());
|
||||
promises.AppendElement(mVideo.mDecoder->Init());
|
||||
}
|
||||
|
||||
if (mAudio.mDecoder && !mAudio.mDecoderInitialized) {
|
||||
MOZ_ASSERT(!mAudio.mInitPromise.Exists());
|
||||
promises.AppendElement(mAudio.mDecoder->Init());
|
||||
}
|
||||
|
||||
|
@ -486,17 +519,14 @@ MediaFormatReader::OnDecoderInitDone(const nsTArray<TrackType>& aTrackTypes)
|
|||
for (const auto& track : aTrackTypes) {
|
||||
auto& decoder = GetDecoderData(track);
|
||||
decoder.mDecoderInitialized = true;
|
||||
|
||||
ScheduleUpdate(track);
|
||||
}
|
||||
|
||||
if (!mMetadataPromise.IsEmpty()) {
|
||||
mInitDone = true;
|
||||
nsRefPtr<MetadataHolder> metadata = new MetadataHolder();
|
||||
metadata->mInfo = mInfo;
|
||||
metadata->mTags = nullptr;
|
||||
mMetadataPromise.Resolve(metadata, __func__);
|
||||
}
|
||||
MOZ_ASSERT(!mMetadataPromise.IsEmpty());
|
||||
mInitDone = true;
|
||||
nsRefPtr<MetadataHolder> metadata = new MetadataHolder();
|
||||
metadata->mInfo = mInfo;
|
||||
metadata->mTags = nullptr;
|
||||
mMetadataPromise.Resolve(metadata, __func__);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -910,8 +940,7 @@ MediaFormatReader::DecodeDemuxedSamples(TrackType aTrack,
|
|||
return;
|
||||
}
|
||||
|
||||
if (!EnsureDecodersInitialized()) {
|
||||
ScheduleUpdate(aTrack);
|
||||
if (!EnsureDecoderInitialized(aTrack)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1040,7 +1069,7 @@ MediaFormatReader::Update(TrackType aTrack)
|
|||
{
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
|
||||
if (mShutdown) {
|
||||
if (mShutdown || !mInitDone) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -111,6 +111,7 @@ private:
|
|||
// It returns true when all decoders are initialized. False when there is pending
|
||||
// initialization.
|
||||
bool EnsureDecodersInitialized();
|
||||
bool EnsureDecoderInitialized(TrackType aTrack);
|
||||
|
||||
// Enqueues a task to call Update(aTrack) on the decoder task queue.
|
||||
// Lock for corresponding track must be held.
|
||||
|
@ -249,6 +250,8 @@ private:
|
|||
}
|
||||
|
||||
// MediaDataDecoder handler's variables.
|
||||
// Decoder initialization promise holder.
|
||||
MozPromiseRequestHolder<MediaDataDecoder::InitPromise> mInitPromise;
|
||||
// False when decoder is created. True when decoder Init() promise is resolved.
|
||||
bool mDecoderInitialized;
|
||||
bool mDecodingRequested;
|
||||
|
|
Загрузка…
Ссылка в новой задаче