Bug 1307699. Part 1 - move OnSeekTaskResolved/OnSeekTaskRejected into SeekingState.
MozReview-Commit-ID: 7n9MSGxduZK
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -718,25 +718,34 @@ public:
mMaster->Reset(TrackInfo::kVideoTrack);
} else {
mMaster->Reset();
}
}
// Do the seek.
mMaster->mSeekTaskRequest.Begin(mMaster->mSeekTask->Seek(mMaster->Duration())
- ->Then(OwnerThread(), __func__, mMaster,
- &MediaDecoderStateMachine::OnSeekTaskResolved,
- &MediaDecoderStateMachine::OnSeekTaskRejected));
+ ->Then(OwnerThread(), __func__,
+ [this] (const SeekTaskResolveValue& aValue) {
+ OnSeekTaskResolved(aValue);
+ },
+ [this] (const SeekTaskRejectValue& aValue) {
+ OnSeekTaskRejected(aValue);
+ }));
MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
MOZ_ASSERT(!mMaster->mCurrentSeek.Exists());
mMaster->mCurrentSeek = Move(mSeekJob);
}
+ void Exit() override
+ {
+ mMaster->mSeekTaskRequest.DisconnectIfExists();
+ }
+
State GetState() const override
{
return DECODER_STATE_SEEKING;
}
bool HandleDormant(bool aDormant) override
{
if (!aDormant) {
@@ -776,16 +785,60 @@ public:
SeekJob seekJob;
seekJob.mTarget = aTarget;
RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
mMaster->InitiateSeek(Move(seekJob));
return p.forget();
}
private:
+ void OnSeekTaskResolved(const SeekTaskResolveValue& aValue)
+ {
+ mMaster->mSeekTaskRequest.Complete();
+
+ if (aValue.mSeekedAudioData) {
+ mMaster->Push(aValue.mSeekedAudioData, MediaData::AUDIO_DATA);
+ mMaster->mDecodedAudioEndTime = std::max(
+ aValue.mSeekedAudioData->GetEndTime(), mMaster->mDecodedAudioEndTime);
+ }
+
+ if (aValue.mSeekedVideoData) {
+ mMaster->Push(aValue.mSeekedVideoData, MediaData::VIDEO_DATA);
+ mMaster->mDecodedVideoEndTime = std::max(
+ aValue.mSeekedVideoData->GetEndTime(), mMaster->mDecodedVideoEndTime);
+ }
+
+ if (aValue.mIsAudioQueueFinished) {
+ mMaster->AudioQueue().Finish();
+ }
+
+ if (aValue.mIsVideoQueueFinished) {
+ mMaster->VideoQueue().Finish();
+ }
+
+ mMaster->SeekCompleted();
+ }
+
+ void OnSeekTaskRejected(const SeekTaskRejectValue& aValue)
+ {
+ mMaster->mSeekTaskRequest.Complete();
+
+ if (aValue.mIsAudioQueueFinished) {
+ mMaster->AudioQueue().Finish();
+ }
+
+ if (aValue.mIsVideoQueueFinished) {
+ mMaster->VideoQueue().Finish();
+ }
+
+ mMaster->DecodeError(aValue.mError);
+
+ mMaster->DiscardSeekTaskIfExist();
+ }
+
SeekJob mSeekJob;
};
class MediaDecoderStateMachine::BufferingState
: public MediaDecoderStateMachine::StateObject
{
public:
explicit BufferingState(Master* aPtr) : StateObject(aPtr) {}
@@ -2182,68 +2235,16 @@ MediaDecoderStateMachine::InitiateSeek(S
// if we are already in the SEEKING state.
mStateObj->Exit();
mState = DECODER_STATE_SEEKING;
mStateObj = MakeUnique<SeekingState>(this, Move(aSeekJob));
mStateObj->Enter();
}
void
-MediaDecoderStateMachine::OnSeekTaskResolved(SeekTaskResolveValue aValue)
-{
- MOZ_ASSERT(OnTaskQueue());
- MOZ_ASSERT(mState == DECODER_STATE_SEEKING);
-
- mSeekTaskRequest.Complete();
-
- if (aValue.mSeekedAudioData) {
- Push(aValue.mSeekedAudioData.get(), MediaData::AUDIO_DATA);
- mDecodedAudioEndTime =
- std::max(aValue.mSeekedAudioData->GetEndTime(), mDecodedAudioEndTime);
- }
-
- if (aValue.mSeekedVideoData) {
- Push(aValue.mSeekedVideoData.get(), MediaData::VIDEO_DATA);
- mDecodedVideoEndTime =
- std::max(aValue.mSeekedVideoData->GetEndTime(), mDecodedVideoEndTime);
- }
-
- if (aValue.mIsAudioQueueFinished) {
- AudioQueue().Finish();
- }
-
- if (aValue.mIsVideoQueueFinished) {
- VideoQueue().Finish();
- }
-
- SeekCompleted();
-}
-
-void
-MediaDecoderStateMachine::OnSeekTaskRejected(SeekTaskRejectValue aValue)
-{
- MOZ_ASSERT(OnTaskQueue());
- MOZ_ASSERT(mState == DECODER_STATE_SEEKING);
-
- mSeekTaskRequest.Complete();
-
- if (aValue.mIsAudioQueueFinished) {
- AudioQueue().Finish();
- }
-
- if (aValue.mIsVideoQueueFinished) {
- VideoQueue().Finish();
- }
-
- DecodeError(aValue.mError);
-
- DiscardSeekTaskIfExist();
-}
-
-void
MediaDecoderStateMachine::DiscardSeekTaskIfExist()
{
if (mSeekTask) {
mCurrentSeek.RejectIfExists(__func__);
mSeekTask->Discard();
mSeekTask = nullptr;
// Reset the MediaDecoderReaderWrapper's callbask.
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -621,19 +621,16 @@ private:
// 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);
-
// This method discards the seek task and then get the ownership of
// MedaiDecoderReaderWarpper back via registering MDSM's callback into it.
void DiscardSeekTaskIfExist();
// Media Fragment end time in microseconds. Access controlled by decoder monitor.
int64_t mFragmentEndTime;
// The media sink resource. Used on the state machine thread.