Bug 1284399. Part 2 - add MDSM::mCurrentSeek to replace SeekTask::mSeekJob. r=kaku
MozReview-Commit-ID: 84KJcdoXakS
--- a/dom/media/AccurateSeekTask.cpp
+++ b/dom/media/AccurateSeekTask.cpp
@@ -33,21 +33,21 @@ extern LazyLogModule gMediaSampleLog;
// when __VA_ARGS__ expands to nothing. This is a workaround for it.
#define DECODER_WARN_HELPER(a, b) NS_WARNING b
#define DECODER_WARN(x, ...) \
DECODER_WARN_HELPER(0, (nsPrintfCString("Decoder=%p " x, mDecoderID, ##__VA_ARGS__).get()))
AccurateSeekTask::AccurateSeekTask(const void* aDecoderID,
AbstractThread* aThread,
MediaDecoderReaderWrapper* aReader,
- SeekJob&& aSeekJob,
+ SeekJob& aSeekJob,
const MediaInfo& aInfo,
const media::TimeUnit& aEnd,
int64_t aCurrentMediaTime)
- : SeekTask(aDecoderID, aThread, aReader, Move(aSeekJob))
+ : SeekTask(aDecoderID, aThread, aReader, aSeekJob)
, mCurrentTimeBeforeSeek(media::TimeUnit::FromMicroseconds(aCurrentMediaTime))
, mAudioRate(aInfo.mAudio.mRate)
, mDoneAudioSeeking(!aInfo.HasAudio() || mSeekJob.mTarget.IsVideoOnly())
, mDoneVideoSeeking(!aInfo.HasVideo())
{
AssertOwnerThread();
// Bound the seek time to be inside the media range.
--- a/dom/media/AccurateSeekTask.h
+++ b/dom/media/AccurateSeekTask.h
@@ -14,17 +14,17 @@
namespace mozilla {
class AccurateSeekTask final : public SeekTask {
public:
AccurateSeekTask(const void* aDecoderID,
AbstractThread* aThread,
MediaDecoderReaderWrapper* aReader,
- SeekJob&& aSeekJob,
+ SeekJob& aSeekJob,
const MediaInfo& aInfo,
const media::TimeUnit& aEnd,
int64_t aCurrentMediaTime);
void Discard() override;
RefPtr<SeekTaskPromise> Seek(const media::TimeUnit& aDuration) override;
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1169,17 +1169,17 @@ MediaDecoderStateMachine::SetDormant(boo
} else if (mSeekTask && mSeekTask->Exists()) {
// Because both audio and video decoders are going to be reset in this
// method later, we treat a VideoOnly seek task as a normal Accurate
// seek task so that while it is resumed, both audio and video playback
// are handled.
if (mSeekTask->GetSeekTarget().IsVideoOnly()) {
mSeekTask->GetSeekTarget().SetType(SeekTarget::Accurate);
}
- mQueuedSeek = Move(mSeekTask->GetSeekJob());
+ mQueuedSeek = Move(mCurrentSeek);
mSeekTaskRequest.DisconnectIfExists();
} else {
mQueuedSeek.mTarget = SeekTarget(mCurrentPosition,
SeekTarget::Accurate,
MediaDecoderEventVisibility::Suppressed);
// XXXbholley - Nobody is listening to this promise. Do we need to pass it
// back to MediaDecoder when we come out of dormant?
RefPtr<MediaDecoder::SeekPromise> unused = mQueuedSeek.mPromise.Ensure(__func__);
@@ -1433,19 +1433,21 @@ void MediaDecoderStateMachine::InitiateD
// Discard the existing seek task.
DiscardSeekTaskIfExist();
mSeekTaskRequest.DisconnectIfExists();
// SeekTask will register its callbacks to MediaDecoderReaderWrapper.
CancelMediaDecoderReaderWrapperCallback();
+ MOZ_ASSERT(!mCurrentSeek.Exists());
+ mCurrentSeek = Move(seekJob);
// Create a new SeekTask instance for the incoming seek task.
mSeekTask = new AccurateSeekTask(mDecoderID, OwnerThread(),
- mReader.get(), Move(seekJob),
+ mReader.get(), mCurrentSeek,
mInfo, Duration(), GetMediaTime());
mOnSeekingStart.Notify(MediaDecoderEventVisibility::Suppressed);
// Reset our state machine and decoding pipeline before seeking.
if (mSeekTask->NeedToResetMDSM()) {
Reset(aTracks);
}
@@ -1453,18 +1455,17 @@ void MediaDecoderStateMachine::InitiateD
// Do the seek.
mSeekTaskRequest.Begin(
mSeekTask->Seek(Duration())->Then(OwnerThread(), __func__, this,
&MediaDecoderStateMachine::OnSeekTaskResolved,
&MediaDecoderStateMachine::OnSeekTaskRejected));
// Nobody is listening to this as OnSeekTaskResolved handles what is
// required but the promise needs to exist or SeekJob::Exists() will
// assert.
- RefPtr<MediaDecoder::SeekPromise> unused =
- mSeekTask->GetSeekJob().mPromise.Ensure(__func__);
+ RefPtr<MediaDecoder::SeekPromise> unused = mCurrentSeek.mPromise.Ensure(__func__);
}
void MediaDecoderStateMachine::BufferedRangeUpdated()
{
MOZ_ASSERT(OnTaskQueue());
// While playing an unseekable stream of unknown duration, mObservedDuration
// is updated (in AdvanceFrame()) as we play. But if data is being downloaded
@@ -1543,17 +1544,17 @@ MediaDecoderStateMachine::Seek(SeekTarge
mQueuedSeek.RejectIfExists(__func__);
DECODER_LOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SetState(DECODER_STATE_SEEKING);
SeekJob seekJob;
seekJob.mTarget = aTarget;
InitiateSeek(Move(seekJob));
- return mSeekTask->GetSeekJob().mPromise.Ensure(__func__);
+ return mCurrentSeek.mPromise.Ensure(__func__);
}
RefPtr<MediaDecoder::SeekPromise>
MediaDecoderStateMachine::InvokeSeek(SeekTarget aTarget)
{
return InvokeAsync(OwnerThread(), this, __func__,
&MediaDecoderStateMachine::Seek, aTarget);
}
@@ -1637,23 +1638,25 @@ MediaDecoderStateMachine::InitiateSeek(S
DiscardSeekTaskIfExist();
mSeekTaskRequest.DisconnectIfExists();
// SeekTask will register its callbacks to MediaDecoderReaderWrapper.
CancelMediaDecoderReaderWrapperCallback();
// Create a new SeekTask instance for the incoming seek task.
- if (aSeekJob.mTarget.IsAccurate() || aSeekJob.mTarget.IsFast()) {
+ MOZ_ASSERT(!mCurrentSeek.Exists());
+ mCurrentSeek = Move(aSeekJob);
+ if (mCurrentSeek.mTarget.IsAccurate() || mCurrentSeek.mTarget.IsFast()) {
mSeekTask = new AccurateSeekTask(mDecoderID, OwnerThread(),
- mReader.get(), Move(aSeekJob),
+ mReader.get(), mCurrentSeek,
mInfo, Duration(), GetMediaTime());
- } else if (aSeekJob.mTarget.IsNextFrame()) {
+ } else if (mCurrentSeek.mTarget.IsNextFrame()) {
mSeekTask = new NextFrameSeekTask(mDecoderID, OwnerThread(), mReader.get(),
- Move(aSeekJob), mInfo, Duration(),
+ mCurrentSeek, mInfo, Duration(),
GetMediaTime(), AudioQueue(), VideoQueue());
} else {
MOZ_DIAGNOSTIC_ASSERT(false, "Cannot handle this seek task.");
}
// Stop playback now to ensure that while we're outside the monitor
// dispatching SeekingStarted, playback doesn't advance and mess with
// mCurrentPosition that we've setting to seekTime here.
@@ -2186,17 +2189,17 @@ MediaDecoderStateMachine::SeekCompleted(
nextState = DECODER_STATE_COMPLETED;
} else {
DECODER_LOG("Changed state from SEEKING (to %lld) to DECODING", seekTime);
nextState = DECODER_STATE_DECODING;
}
// We want to resolve the seek request prior finishing the first frame
// to ensure that the seeked event is fired prior loadeded.
- mSeekTask->GetSeekJob().Resolve(nextState == DECODER_STATE_COMPLETED, __func__);
+ mCurrentSeek.Resolve(nextState == DECODER_STATE_COMPLETED, __func__);
// Discard and nullify the seek task.
// Reset the MediaDecoderReaderWrapper's callbask.
DiscardSeekTaskIfExist();
// NOTE: Discarding the mSeekTask must be done before here. The following code
// might ask the MediaDecoderReaderWrapper to request media data, however, the
// SeekTask::Discard() will ask MediaDecoderReaderWrapper to discard media
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -681,16 +681,17 @@ private:
{
MOZ_ASSERT(OnTaskQueue());
return mPlayState == MediaDecoder::PLAY_STATE_PLAYING ||
mNextPlayState == MediaDecoder::PLAY_STATE_PLAYING;
}
// Queued seek - moves to mCurrentSeek when DecodeFirstFrame completes.
SeekJob mQueuedSeek;
+ SeekJob mCurrentSeek;
// mSeekTask is responsible for executing the current seek request.
RefPtr<SeekTask> mSeekTask;
MozPromiseRequestHolder<SeekTask::SeekTaskPromise> mSeekTaskRequest;
void OnSeekTaskResolved(SeekTaskResolveValue aValue);
void OnSeekTaskRejected(SeekTaskRejectValue aValue);
--- a/dom/media/NextFrameSeekTask.cpp
+++ b/dom/media/NextFrameSeekTask.cpp
@@ -17,23 +17,23 @@ extern LazyLogModule gMediaSampleLog;
#define SAMPLE_LOG(x, ...) MOZ_LOG(gMediaSampleLog, LogLevel::Debug, \
("[NextFrameSeekTask] Decoder=%p " x, mDecoderID, ##__VA_ARGS__))
namespace media {
NextFrameSeekTask::NextFrameSeekTask(const void* aDecoderID,
AbstractThread* aThread,
MediaDecoderReaderWrapper* aReader,
- SeekJob&& aSeekJob,
+ SeekJob& aSeekJob,
const MediaInfo& aInfo,
const media::TimeUnit& aDuration,
int64_t aCurrentTime,
MediaQueue<MediaData>& aAudioQueue,
MediaQueue<MediaData>& aVideoQueue)
- : SeekTask(aDecoderID, aThread, aReader, Move(aSeekJob))
+ : SeekTask(aDecoderID, aThread, aReader, aSeekJob)
, mAudioQueue(aAudioQueue)
, mVideoQueue(aVideoQueue)
, mCurrentTime(aCurrentTime)
, mDuration(aDuration)
{
AssertOwnerThread();
MOZ_ASSERT(aInfo.HasVideo());
--- a/dom/media/NextFrameSeekTask.h
+++ b/dom/media/NextFrameSeekTask.h
@@ -22,17 +22,17 @@ namespace media {
* so that the MDSM will be able to update the media element's position.
*/
class NextFrameSeekTask final : public SeekTask {
public:
NextFrameSeekTask(const void* aDecoderID,
AbstractThread* aThread,
MediaDecoderReaderWrapper* aReader,
- SeekJob&& aSeekJob,
+ SeekJob& aSeekJob,
const MediaInfo& aInfo,
const media::TimeUnit& aDuration,
int64_t aCurrentTime,
MediaQueue<MediaData>& aAudioQueue,
MediaQueue<MediaData>& aVideoQueue);
void Discard() override;
--- a/dom/media/SeekTask.cpp
+++ b/dom/media/SeekTask.cpp
@@ -8,21 +8,21 @@
#include "MediaDecoderReaderWrapper.h"
#include "mozilla/AbstractThread.h"
namespace mozilla {
SeekTask::SeekTask(const void* aDecoderID,
AbstractThread* aThread,
MediaDecoderReaderWrapper* aReader,
- SeekJob&& aSeekJob)
+ SeekJob& aSeekJob)
: mDecoderID(aDecoderID)
, mOwnerThread(aThread)
, mReader(aReader)
- , mSeekJob(Move(aSeekJob))
+ , mSeekJob(aSeekJob)
, mTarget(mSeekJob.mTarget)
, mIsDiscarded(false)
, mIsAudioQueueFinished(false)
, mIsVideoQueueFinished(false)
, mNeedToStopPrerollingAudio(false)
, mNeedToStopPrerollingVideo(false)
{
AssertOwnerThread();
@@ -72,23 +72,16 @@ SeekTask::AssertOwnerThread() const
AbstractThread*
SeekTask::OwnerThread() const
{
AssertOwnerThread();
return mOwnerThread;
}
-SeekJob&
-SeekTask::GetSeekJob()
-{
- AssertOwnerThread();
- return mSeekJob;
-}
-
SeekTarget&
SeekTask::GetSeekTarget()
{
AssertOwnerThread();
return mTarget;
}
bool
--- a/dom/media/SeekTask.h
+++ b/dom/media/SeekTask.h
@@ -51,27 +51,25 @@ public:
MozPromise<SeekTaskResolveValue, SeekTaskRejectValue, IsExclusive>;
virtual void Discard() = 0;
virtual RefPtr<SeekTaskPromise> Seek(const media::TimeUnit& aDuration) = 0;
virtual bool NeedToResetMDSM() const = 0;
- SeekJob& GetSeekJob();
-
SeekTarget& GetSeekTarget();
bool Exists() const;
protected:
SeekTask(const void* aDecoderID,
AbstractThread* aThread,
MediaDecoderReaderWrapper* aReader,
- SeekJob&& aSeekJob);
+ SeekJob& aSeekJob);
virtual ~SeekTask();
void Resolve(const char* aCallSite);
void RejectIfExist(const char* aCallSite);
void AssertOwnerThread() const;
@@ -83,17 +81,17 @@ protected:
*/
const void* mDecoderID; // For logging.
const RefPtr<AbstractThread> mOwnerThread;
const RefPtr<MediaDecoderReaderWrapper> mReader;
/*
* Internal state.
*/
- SeekJob mSeekJob;
+ SeekJob& mSeekJob;
SeekTarget& mTarget;
MozPromiseHolder<SeekTaskPromise> mSeekTaskPromise;
bool mIsDiscarded;
/*
* Information which are going to be returned to MDSM.
*/
RefPtr<MediaData> mSeekedAudioData;