author | JW Wang <jwwang@mozilla.com> |
Tue, 12 Jul 2016 13:57:10 +0800 | |
changeset 305474 | 91afa84e200100051eed039848cc3fb7c0e7384d |
parent 305473 | f1988e4c59d12690a17b5962afa0bf374ee40b5d |
child 305475 | 69741c30f7d501fa901bf77059840ad3f54cbbf4 |
push id | 30678 |
push user | jwwang@mozilla.com |
push date | Tue, 19 Jul 2016 07:35:31 +0000 |
treeherder | autoland@91afa84e2001 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jya |
bugs | 1287698 |
milestone | 50.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/media/MediaDecoderStateMachine.cpp | file | annotate | diff | comparison | revisions | |
dom/media/MediaDecoderStateMachine.h | file | annotate | diff | comparison | revisions |
--- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -1137,26 +1137,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()) { @@ -1198,17 +1191,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 @@ -852,18 +852,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;