Bug 1307677. Part 6 - don't access mMaster after InitiateSeek() which will delete the current state object.
MozReview-Commit-ID: HABL22OiLnJ
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -497,18 +497,19 @@ public:
// Since ForceZeroStartTime() is true, we should've transitioned to SEEKING
// in Enter() if there is any queued seek.
MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SeekJob seekJob;
seekJob.mTarget = aTarget;
+ RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
mMaster->InitiateSeek(Move(seekJob));
- return mMaster->mCurrentSeek.mPromise.Ensure(__func__);
+ return p.forget();
}
private:
// Notify FirstFrameLoaded if having decoded first frames and
// transition to SEEKING if there is any pending seek, or DECODING otherwise.
void MaybeFinishDecodeFirstFrame()
{
MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
@@ -608,18 +609,19 @@ public:
}
RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
{
mMaster->mQueuedSeek.RejectIfExists(__func__);
SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SeekJob seekJob;
seekJob.mTarget = aTarget;
+ RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
mMaster->InitiateSeek(Move(seekJob));
- return mMaster->mCurrentSeek.mPromise.Ensure(__func__);
+ return p.forget();
}
private:
void CheckSlowDecoding(TimeStamp aDecodeStart)
{
// For non async readers, if the requested video sample was slow to
// arrive, increase the amount of audio we buffer to ensure that we
// don't run out of audio. This is unnecessary for async readers,
@@ -768,18 +770,19 @@ public:
}
RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
{
mMaster->mQueuedSeek.RejectIfExists(__func__);
SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SeekJob seekJob;
seekJob.mTarget = aTarget;
+ RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
mMaster->InitiateSeek(Move(seekJob));
- return mMaster->mCurrentSeek.mPromise.Ensure(__func__);
+ return p.forget();
}
private:
SeekJob mSeekJob;
};
class MediaDecoderStateMachine::BufferingState
: public MediaDecoderStateMachine::StateObject
@@ -881,18 +884,19 @@ public:
}
RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
{
mMaster->mQueuedSeek.RejectIfExists(__func__);
SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SeekJob seekJob;
seekJob.mTarget = aTarget;
+ RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
mMaster->InitiateSeek(Move(seekJob));
- return mMaster->mCurrentSeek.mPromise.Ensure(__func__);
+ return p.forget();
}
private:
TimeStamp mBufferingStart;
};
class MediaDecoderStateMachine::CompletedState
: public MediaDecoderStateMachine::StateObject
@@ -959,18 +963,19 @@ public:
}
RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
{
mMaster->mQueuedSeek.RejectIfExists(__func__);
SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
SeekJob seekJob;
seekJob.mTarget = aTarget;
+ RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
mMaster->InitiateSeek(Move(seekJob));
- return mMaster->mCurrentSeek.mPromise.Ensure(__func__);
+ return p.forget();
}
private:
bool mSentPlaybackEndedEvent = false;
};
class MediaDecoderStateMachine::ShutdownState
: public MediaDecoderStateMachine::StateObject
@@ -2032,21 +2037,21 @@ void MediaDecoderStateMachine::Visibilit
? SeekTarget::Type::Accurate
: SeekTarget::Type::PrevSyncPoint;
seekJob.mTarget = SeekTarget(GetMediaTime(),
type,
MediaDecoderEventVisibility::Suppressed,
true /* aVideoOnly */);
- InitiateSeek(Move(seekJob));
- RefPtr<MediaDecoder::SeekPromise> p = mCurrentSeek.mPromise.Ensure(__func__);
+ RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
p->Then(AbstractThread::MainThread(), __func__,
[start, info, hw](){ ReportRecoveryTelemetry(start, info, hw); },
[](){});
+ InitiateSeek(Move(seekJob));
}
}
void MediaDecoderStateMachine::BufferedRangeUpdated()
{
MOZ_ASSERT(OnTaskQueue());
// While playing an unseekable stream of unknown duration, mObservedDuration