Bug 1287698 - Make MDSM::mPendingDormant a bool. r=jya
MozReview-Commit-ID: 8WF0cxAFABS
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1136,26 +1136,19 @@ MediaDecoderStateMachine::SetDormant(boo
{
MOZ_ASSERT(OnTaskQueue());
if (IsShutdown()) {
return;
}
if (mMetadataRequest.Exists()) {
- if (mPendingDormant && mPendingDormant.ref() != aDormant && !aDormant) {
- // We already have a dormant request pending; the new request would have
- // resumed from dormant, we can just cancel any pending dormant requests.
- mPendingDormant.reset();
- } else {
- mPendingDormant = Some(aDormant);
- }
+ mPendingDormant = aDormant;
return;
}
- mPendingDormant.reset();
DECODER_LOG("SetDormant=%d", aDormant);
if (aDormant) {
if (mState == DECODER_STATE_SEEKING) {
if (mQueuedSeek.Exists()) {
// Keep latest seek target
} else if (mCurrentSeek.Exists()) {
@@ -1197,17 +1190,17 @@ MediaDecoderStateMachine::SetDormant(boo
// Note that we do not wait for the decode task queue to go idle before
// queuing the ReleaseMediaResources task - instead, we disconnect promises,
// reset state, and put a ResetDecode in the decode task queue. Any tasks
// that run after ResetDecode are supposed to run with a clean slate. We rely
// on that in other places (i.e. seeking), so it seems reasonable to rely on
// it here as well.
mReader->ReleaseMediaResources();
- } else if ((aDormant != true) && (mState == DECODER_STATE_DORMANT)) {
+ } else if (mState == DECODER_STATE_DORMANT) {
mDecodingFirstFrame = true;
SetState(DECODER_STATE_DECODING_METADATA);
ReadMetadata();
}
}
RefPtr<ShutdownPromise>
MediaDecoderStateMachine::Shutdown()
@@ -1971,17 +1964,18 @@ MediaDecoderStateMachine::DecodeError()
void
MediaDecoderStateMachine::OnMetadataRead(MetadataHolder* aMetadata)
{
MOZ_ASSERT(OnTaskQueue());
MOZ_ASSERT(mState == DECODER_STATE_DECODING_METADATA);
mMetadataRequest.Complete();
if (mPendingDormant) {
- SetDormant(mPendingDormant.ref());
+ mPendingDormant = false;
+ SetDormant(true);
return;
}
// Set mode to PLAYBACK after reading metadata.
mResource->SetReadMode(MediaCacheStream::MODE_PLAYBACK);
mInfo = aMetadata->mInfo;
mMetadataTags = aMetadata->mTags.forget();
RefPtr<MediaDecoderStateMachine> self = this;
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -851,18 +851,20 @@ private:
// the state machine thread. Synchronised via decoder monitor.
// When data is being sent to a MediaStream, this is true when all data has
// been written to the MediaStream.
Watchable<bool> mAudioCompleted;
// True if all video frames are already rendered.
Watchable<bool> mVideoCompleted;
- // Set if MDSM receives dormant request during reading metadata.
- Maybe<bool> mPendingDormant;
+ // True if we need to enter dormant state after reading metadata. Note that
+ // we can't enter dormant state until reading metadata is done for some
+ // limitations of the reader.
+ bool mPendingDormant = false;
// Flag whether we notify metadata before decoding the first frame or after.
//
// Note that the odd semantics here are designed to replicate the current
// behavior where we notify the decoder each time we come out of dormant, but
// send suppressed event visibility for those cases. This code can probably be
// simplified.
bool mNotifyMetadataBeforeFirstFrame;