Bug 1258922: [MSE] P4. Set draining flag to true when skip to next keyframe failed. r?gerald
data promise is only resolved once the decoder has been drained. It was possible for a promise to never be resolved if skipping to the next key frame failed.
MozReview-Commit-ID: GimbQTImH9e
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -1442,16 +1442,25 @@ MediaFormatReader::OnVideoSkipFailed(Med
mDecoder->NotifyDecodedFrames(aFailure.mSkipped, 0, aFailure.mSkipped);
}
MOZ_ASSERT(mVideo.HasPromise());
switch (aFailure.mFailure) {
case DemuxerFailureReason::END_OF_STREAM:
NotifyEndOfStream(TrackType::kVideoTrack);
break;
case DemuxerFailureReason::WAITING_FOR_DATA:
+ // While there is nothing to drain considering the decoder has been
+ // flushed in SkipVideoDemuxToNextKeyFrame, we need to set mNeedDraining
+ // to true as the video MediaDataPromise will only be rejected once drain
+ // has completed.
+ MOZ_DIAGNOSTIC_ASSERT(!mVideo.mDecodingRequested,
+ "Reset must have been called");
+ if (!mVideo.mWaitingForData) {
+ mVideo.mNeedDraining = true;
+ }
NotifyWaitingForData(TrackType::kVideoTrack);
break;
case DemuxerFailureReason::CANCELED:
case DemuxerFailureReason::SHUTDOWN:
if (mVideo.HasPromise()) {
mVideo.RejectPromise(CANCELED, __func__);
}
break;