diff --git a/dom/media/MediaDecoder.cpp b/dom/media/MediaDecoder.cpp index 4565382c1a..832584aa6c 100644 --- a/dom/media/MediaDecoder.cpp +++ b/dom/media/MediaDecoder.cpp @@ -1375,6 +1375,10 @@ void MediaDecoder::DurationChanged(TimeUnit aNewDuration) DECODER_LOG("Duration changed to %lld", mDuration); mOwner->DispatchAsyncEvent(NS_LITERAL_STRING("durationchange")); } + + if (CurrentPosition() > aNewDuration.ToMicroseconds()) { + Seek(aNewDuration.ToSeconds(), SeekTarget::Accurate); + } } void MediaDecoder::SetNetworkDuration(TimeUnit aNetworkDuration) diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp index de70702663..f353e00e49 100644 --- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -1396,21 +1396,6 @@ int64_t MediaDecoderStateMachine::GetEndTime() return mEndTime; } -// Runnable which dispatches an event to the main thread to seek to the new -// aSeekTarget. -class SeekRunnable : public nsRunnable { -public: - SeekRunnable(MediaDecoder* aDecoder, double aSeekTarget) - : mDecoder(aDecoder), mSeekTarget(aSeekTarget) {} - NS_IMETHOD Run() { - mDecoder->Seek(mSeekTarget, SeekTarget::Accurate); - return NS_OK; - } -private: - nsRefPtr mDecoder; - double mSeekTarget; -}; - void MediaDecoderStateMachine::RecomputeDuration() { MOZ_ASSERT(OnTaskQueue()); @@ -1477,21 +1462,6 @@ void MediaDecoderStateMachine::SetDuration(TimeUnit aDuration) } mEndTime = mStartTime + aDuration.ToMicroseconds(); - - if (mDecoder && mEndTime >= 0 && mEndTime < mCurrentPosition) { - // The current playback position is now past the end of the element duration - // the user agent must also seek to the time of the end of the media - // resource. - if (NS_IsMainThread()) { - // Seek synchronously. - mDecoder->Seek(double(mEndTime) / USECS_PER_S, SeekTarget::Accurate); - } else { - // Queue seek to new end position. - nsCOMPtr task = - new SeekRunnable(mDecoder, double(mEndTime) / USECS_PER_S); - AbstractThread::MainThread()->Dispatch(task.forget()); - } - } } void MediaDecoderStateMachine::SetFragmentEndTime(int64_t aEndTime)