author | Kaku Kuo <kaku@mozilla.com> |
Sat, 11 Mar 2017 19:56:17 +0800 | |
changeset 347425 | 0f25d813f75dd1367db99dcd433ad4a8eb760c36 |
parent 347424 | 2fbdf43912c4dcb25cae7ba61ecf85d72fb37370 |
child 347426 | 096a4818b8c7aa485e30946a6f045e01cfd3b90e |
push id | 31496 |
push user | cbook@mozilla.com |
push date | Tue, 14 Mar 2017 13:21:57 +0000 |
treeherder | mozilla-central@9a26ed658fdc [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jwwang |
bugs | 1346498 |
milestone | 55.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
|
--- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -7395,22 +7395,19 @@ HTMLMediaElement::GetEMEInfo(nsString& a aEMEInfo.Append(keySystem); aEMEInfo.AppendLiteral(" SessionsInfo="); aEMEInfo.Append(sessionsInfo); } void HTMLMediaElement::NotifyDecoderActivityChanges() const { - // A element is visible only if its document is visible and the element - // itself is visible. - const bool visible = !IsHidden() && - mVisibilityState == Visibility::APPROXIMATELY_VISIBLE; if (mDecoder) { - mDecoder->NotifyOwnerActivityChanged(visible); + mDecoder->NotifyOwnerActivityChanged(!IsHidden(), + mVisibilityState == Visibility::APPROXIMATELY_VISIBLE); } } bool HasDebuggerPrivilege(JSContext* aCx, JSObject* aObj) { return nsContentUtils::CallerHasPermission(aCx, NS_LITERAL_STRING("debugger")); }
--- a/dom/media/MediaDecoder.cpp +++ b/dom/media/MediaDecoder.cpp @@ -292,21 +292,22 @@ MediaDecoder::ResourceCallback::NotifyBy if (self->mDecoder) { self->mDecoder->NotifyBytesConsumed(aBytes, aOffset); } }); mAbstractMainThread->Dispatch(r.forget()); } void -MediaDecoder::NotifyOwnerActivityChanged(bool aIsVisible) +MediaDecoder::NotifyOwnerActivityChanged(bool aIsDocumentVisible, + bool aIsElementVisible) { MOZ_ASSERT(NS_IsMainThread()); MOZ_DIAGNOSTIC_ASSERT(!IsShutdown()); - SetElementVisibility(aIsVisible); + SetElementVisibility(aIsDocumentVisible, aIsElementVisible); NotifyCompositor(); } void MediaDecoder::Pause() { MOZ_ASSERT(NS_IsMainThread()); @@ -389,17 +390,18 @@ MediaDecoder::MediaDecoder(MediaDecoderO , mAbstractMainThread(aOwner->AbstractMainThread()) , mFrameStats(new FrameStatistics()) , mVideoFrameContainer(aOwner->GetVideoFrameContainer()) , mPlaybackStatistics(new MediaChannelStatistics()) , mPinnedForSeek(false) , mMinimizePreroll(false) , mMediaTracksConstructed(false) , mFiredMetadataLoaded(false) - , mElementVisible(!aOwner->IsHidden()) + , mIsDocumentVisible(!aOwner->IsHidden()) + , mIsElementVisible(!aOwner->IsHidden()) , mForcedHidden(false) , mHasSuspendTaint(false) , INIT_MIRROR(mStateMachineIsShutdown, true) , INIT_MIRROR(mBuffered, TimeIntervals()) , INIT_MIRROR(mNextFrameStatus, MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE) , INIT_MIRROR(mCurrentPosition, 0) , INIT_MIRROR(mStateMachineDuration, NullableTimeUnit()) , INIT_MIRROR(mPlaybackPosition, 0) @@ -1300,20 +1302,22 @@ MediaDecoder::NotifyCompositor() nsContentUtils::LayerManagerForDocument(element->OwnerDoc()); if (layerManager) { RefPtr<KnowsCompositor> knowsCompositor = layerManager->AsShadowForwarder(); mCompositorUpdatedEvent.Notify(knowsCompositor); } } void -MediaDecoder::SetElementVisibility(bool aIsVisible) +MediaDecoder::SetElementVisibility(bool aIsDocumentVisible, + bool aIsElementVisible) { MOZ_ASSERT(NS_IsMainThread()); - mElementVisible = aIsVisible; + mIsDocumentVisible = aIsDocumentVisible; + mIsElementVisible = aIsElementVisible; UpdateVideoDecodeMode(); } void MediaDecoder::SetForcedHidden(bool aForcedHidden) { MOZ_ASSERT(NS_IsMainThread()); mForcedHidden = aForcedHidden; @@ -1338,18 +1342,25 @@ MediaDecoder::UpdateVideoDecodeMode() // If mHasSuspendTaint is set, never suspend the video decoder. if (mHasSuspendTaint) { mDecoderStateMachine->SetVideoDecodeMode(VideoDecodeMode::Normal); return; } // If mForcedHidden is set, suspend the video decoder anyway. + if (mForcedHidden) { + mDecoderStateMachine->SetVideoDecodeMode(VideoDecodeMode::Suspend); + return; + } + // Otherwise, depends on the owner's visibility state. - if (!mForcedHidden && mElementVisible) { + // A element is visible only if its document is visible and the element + // itself is visible. + if (mIsDocumentVisible && mIsElementVisible) { mDecoderStateMachine->SetVideoDecodeMode(VideoDecodeMode::Normal); } else { mDecoderStateMachine->SetVideoDecodeMode(VideoDecodeMode::Suspend); } } bool MediaDecoder::HasSuspendTaint() const
--- a/dom/media/MediaDecoder.h +++ b/dom/media/MediaDecoder.h @@ -184,17 +184,18 @@ public: // Initialize state machine and schedule it. nsresult InitializeStateMachine(); // Start playback of a video. 'Load' must have previously been // called. virtual nsresult Play(); // Notify activity of the decoder owner is changed. - virtual void NotifyOwnerActivityChanged(bool aIsVisible); + virtual void NotifyOwnerActivityChanged(bool aIsDocumentVisible, + bool aIsElementVisible); // Pause video playback. virtual void Pause(); // Adjust the speed of the playback, optionally with pitch correction, virtual void SetVolume(double aVolume); virtual void SetPlaybackRate(double aPlaybackRate); void SetPreservesPitch(bool aPreservesPitch); @@ -366,17 +367,18 @@ private: // Returns true if we can play the entire media through without stopping // to buffer, given the current download and playback rates. virtual bool CanPlayThrough(); void SetAudioChannel(dom::AudioChannel aChannel) { mAudioChannel = aChannel; } dom::AudioChannel GetAudioChannel() { return mAudioChannel; } // Called from HTMLMediaElement when owner document activity changes - virtual void SetElementVisibility(bool aIsVisible); + virtual void SetElementVisibility(bool aIsDocumentVisible, + bool aIsElementVisible); // Force override the visible state to hidden. // Called from HTMLMediaElement when testing of video decode suspend from mochitests. void SetForcedHidden(bool aForcedHidden); // Mark the decoder as tainted, meaning suspend-video-decoder is disabled. void SetSuspendTaint(bool aTaint); @@ -711,18 +713,21 @@ protected: // True if the media is only seekable within its buffered ranges // like WebMs with no cues. bool mMediaSeekableOnlyInBufferedRanges = false; // Stores media info, including info of audio tracks and video tracks, should // only be accessed from main thread. nsAutoPtr<MediaInfo> mInfo; - // Tracks the visiblity status from HTMLMediaElement - bool mElementVisible; + // Tracks the visibility status of owner element's document. + bool mIsDocumentVisible; + + // Tracks the visibliity status of owner element. + bool mIsElementVisible; // If true, forces the decoder to be considered hidden. bool mForcedHidden; // True if the decoder has a suspend taint - meaning suspend-video-decoder is // disabled. bool mHasSuspendTaint;