Bug 1291633 - Don't call MediaDecoder::SeekingStarted when visibility is Suppressed.
MozReview-Commit-ID: 15YOmFCoXGp
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -631,17 +631,16 @@ MediaDecoder::Shutdown()
// This changes the decoder state to SHUTDOWN and does other things
// necessary to unblock the state machine thread if it's blocked, so
// the asynchronous shutdown in nsDestroyStateMachine won't deadlock.
if (mDecoderStateMachine) {
mTimedMetadataListener.Disconnect();
mMetadataLoadedListener.Disconnect();
mFirstFrameLoadedListener.Disconnect();
mOnPlaybackEvent.Disconnect();
- mOnSeekingStart.Disconnect();
mOnMediaNotSeekable.Disconnect();
mDecoderStateMachine->BeginShutdown()
->Then(AbstractThread::MainThread(), __func__, this,
&MediaDecoder::FinishShutdown,
&MediaDecoder::FinishShutdown);
} else {
// Ensure we always unregister asynchronously in order not to disrupt
@@ -683,16 +682,19 @@ MediaDecoder::OnPlaybackEvent(MediaEvent
break;
case MediaEventType::PlaybackStopped:
mPlaybackStatistics->Stop();
ComputePlaybackRate();
break;
case MediaEventType::PlaybackEnded:
PlaybackEnded();
break;
+ case MediaEventType::SeekStarted:
+ SeekingStarted();
+ break;
case MediaEventType::DecodeError:
DecodeError();
break;
case MediaEventType::Invalidate:
Invalidate();
break;
}
}
@@ -765,18 +767,16 @@ MediaDecoder::SetStateMachineParameters(
AbstractThread::MainThread(), this, &MediaDecoder::OnMetadataUpdate);
mMetadataLoadedListener = mDecoderStateMachine->MetadataLoadedEvent().Connect(
AbstractThread::MainThread(), this, &MediaDecoder::MetadataLoaded);
mFirstFrameLoadedListener = mDecoderStateMachine->FirstFrameLoadedEvent().Connect(
AbstractThread::MainThread(), this, &MediaDecoder::FirstFrameLoaded);
mOnPlaybackEvent = mDecoderStateMachine->OnPlaybackEvent().Connect(
AbstractThread::MainThread(), this, &MediaDecoder::OnPlaybackEvent);
- mOnSeekingStart = mDecoderStateMachine->OnSeekingStart().Connect(
- AbstractThread::MainThread(), this, &MediaDecoder::SeekingStarted);
mOnMediaNotSeekable = mDecoderStateMachine->OnMediaNotSeekable().Connect(
AbstractThread::MainThread(), this, &MediaDecoder::OnMediaNotSeekable);
}
void
MediaDecoder::SetMinimizePrerollUntilPlaybackStarts()
{
MOZ_ASSERT(NS_IsMainThread());
@@ -1307,23 +1307,21 @@ MediaDecoder::OnSeekRejected()
{
MOZ_ASSERT(NS_IsMainThread());
mSeekRequest.Complete();
mLogicallySeeking = false;
AsyncRejectSeekDOMPromiseIfExists();
}
void
-MediaDecoder::SeekingStarted(MediaDecoderEventVisibility aEventVisibility)
+MediaDecoder::SeekingStarted()
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!IsShutdown());
- if (aEventVisibility != MediaDecoderEventVisibility::Suppressed) {
- mOwner->SeekStarted();
- }
+ mOwner->SeekStarted();
}
void
MediaDecoder::ChangeState(PlayState aState)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!IsShutdown(), "SHUTDOWN is the final state.");
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -409,19 +409,18 @@ private:
void SeekingChanged()
{
// Stop updating the bytes downloaded for progress notifications when
// seeking to prevent wild changes to the progress notification.
MOZ_ASSERT(NS_IsMainThread());
mIgnoreProgressData = mLogicallySeeking;
}
- // Seeking has started. Inform the element on the main
- // thread.
- void SeekingStarted(MediaDecoderEventVisibility aEventVisibility = MediaDecoderEventVisibility::Observable);
+ // Seeking has started. Inform the element on the main thread.
+ void SeekingStarted();
void UpdateLogicalPositionInternal(MediaDecoderEventVisibility aEventVisibility);
void UpdateLogicalPosition()
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(!IsShutdown());
// Per spec, offical position remains stable during pause and seek.
if (mPlayState == PLAY_STATE_PAUSED || IsSeeking()) {
@@ -727,17 +726,16 @@ protected:
// A listener to receive metadata updates from MDSM.
MediaEventListener mTimedMetadataListener;
MediaEventListener mMetadataLoadedListener;
MediaEventListener mFirstFrameLoadedListener;
MediaEventListener mOnPlaybackEvent;
- MediaEventListener mOnSeekingStart;
MediaEventListener mOnMediaNotSeekable;
protected:
// Whether the state machine is shut down.
Mirror<bool> mStateMachineIsShutdown;
// Buffered range, mirrored from the reader.
Mirror<media::TimeIntervals> mBuffered;
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1405,18 +1405,16 @@ void MediaDecoderStateMachine::InitiateD
MOZ_ASSERT(!mCurrentSeek.Exists());
mCurrentSeek = Move(seekJob);
// Create a new SeekTask instance for the incoming seek task.
mSeekTask = new AccurateSeekTask(mDecoderID, OwnerThread(),
mReader.get(), mCurrentSeek.mTarget,
mInfo, Duration(), GetMediaTime());
- mOnSeekingStart.Notify(MediaDecoderEventVisibility::Suppressed);
-
// Reset our state machine and decoding pipeline before seeking.
if (mSeekTask->NeedToResetMDSM()) {
Reset(aTracks);
}
// Do the seek.
mSeekTaskRequest.Begin(
mSeekTask->Seek(Duration())->Then(OwnerThread(), __func__, this,
@@ -1626,17 +1624,19 @@ MediaDecoderStateMachine::InitiateSeek(S
StopPlayback();
// aSeekJob.mTarget.mTime might be different from
// mSeekTask->GetSeekTarget().mTime because the seek task might clamp the seek
// target to [0, duration]. We want to update the playback position to the
// clamped value.
UpdatePlaybackPositionInternal(mSeekTask->GetSeekTarget().GetTime().ToMicroseconds());
- mOnSeekingStart.Notify(aSeekJob.mTarget.mEventVisibility);
+ if (aSeekJob.mTarget.mEventVisibility == MediaDecoderEventVisibility::Observable) {
+ mOnPlaybackEvent.Notify(MediaEventType::SeekStarted);
+ }
// Reset our state machine and decoding pipeline before seeking.
if (mSeekTask->NeedToResetMDSM()) { Reset(); }
// Do the seek.
mSeekTaskRequest.Begin(mSeekTask->Seek(Duration())
->Then(OwnerThread(), __func__, this,
&MediaDecoderStateMachine::OnSeekTaskResolved,
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -113,16 +113,17 @@ class TaskQueue;
extern LazyLogModule gMediaDecoderLog;
extern LazyLogModule gMediaSampleLog;
enum class MediaEventType : int8_t {
PlaybackStarted,
PlaybackStopped,
PlaybackEnded,
+ SeekStarted,
DecodeError,
Invalidate
};
/*
The state machine class. This manages the decoding and seeking in the
MediaDecoderReader on the decode task queue, and A/V sync on the shared
state machine thread, and controls the audio "push" thread.
@@ -239,19 +240,16 @@ public:
MediaEventSourceExc<nsAutoPtr<MediaInfo>,
MediaDecoderEventVisibility>&
FirstFrameLoadedEvent() { return mFirstFrameLoadedEvent; }
MediaEventSource<MediaEventType>&
OnPlaybackEvent() { return mOnPlaybackEvent; }
- MediaEventSource<MediaDecoderEventVisibility>&
- OnSeekingStart() { return mOnSeekingStart; }
-
// Immutable after construction - may be called on any thread.
bool IsRealTime() const { return mRealTime; }
size_t SizeOfVideoQueue() const;
size_t SizeOfAudioQueue() const;
private:
@@ -944,17 +942,16 @@ private:
MediaEventProducerExc<nsAutoPtr<MediaInfo>,
nsAutoPtr<MetadataTags>,
MediaDecoderEventVisibility> mMetadataLoadedEvent;
MediaEventProducerExc<nsAutoPtr<MediaInfo>,
MediaDecoderEventVisibility> mFirstFrameLoadedEvent;
MediaEventProducer<MediaEventType> mOnPlaybackEvent;
- MediaEventProducer<MediaDecoderEventVisibility> mOnSeekingStart;
// True if audio is offloading.
// Playback will not start when audio is offloading.
bool mAudioOffloading;
#ifdef MOZ_EME
void OnCDMProxyReady(RefPtr<CDMProxy> aProxy);
void OnCDMProxyNotReady();
--- a/dom/media/omx/AudioOffloadPlayer.cpp
+++ b/dom/media/omx/AudioOffloadPlayer.cpp
@@ -365,18 +365,19 @@ status_t AudioOffloadPlayer::DoSeek()
AUDIO_OFFLOAD_LOG(LogLevel::Debug,
("DoSeek ( %lld )", mSeekTarget.GetTime().ToMicroseconds()));
mReachedEOS = false;
mPositionTimeMediaUs = -1;
mStartPosUs = mSeekTarget.GetTime().ToMicroseconds();
- if (!mSeekPromise.IsEmpty()) {
- mOnSeekingStarted.Notify(mSeekTarget.mEventVisibility);
+ if (!mSeekPromise.IsEmpty() &&
+ mSeekTarget.mEventVisibility == MediaDecoderEventVisibility::Observable) {
+ mOnSeekingStarted.Notify();
}
if (mPlaying) {
mAudioSink->Pause();
mAudioSink->Flush();
mAudioSink->Start();
} else {
--- a/dom/media/omx/AudioOffloadPlayer.h
+++ b/dom/media/omx/AudioOffloadPlayer.h
@@ -189,17 +189,17 @@ private:
// To avoid device suspend when mResetTimer is going to be triggered.
// Used only from main thread so no lock is needed.
RefPtr<mozilla::dom::WakeLock> mWakeLock;
MediaEventProducer<void> mOnPositionChanged;
MediaEventProducer<void> mOnPlaybackEnded;
MediaEventProducer<void> mOnPlayerTearDown;
- MediaEventProducer<MediaDecoderEventVisibility> mOnSeekingStarted;
+ MediaEventProducer<void> mOnSeekingStarted;
MediaEventListener mPositionChanged;
MediaEventListener mPlaybackEnded;
MediaEventListener mPlayerTearDown;
MediaEventListener mSeekingStarted;
// Provide the playback position in microseconds from total number of
// frames played by audio track
int64_t GetOutputPlayPositionUs_l() const;