Bug 1378085 P1 - create VideoOnlySeekingState; r?jwwang
MozReview-Commit-ID: 2O6CsqSDKnG
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1246,17 +1246,17 @@ public:
return TimeUnit::FromMicroseconds(
audioGap <= videoGap ? audioStart : videoStart);
}
MOZ_ASSERT(false, "AccurateSeekTask doesn't handle other seek types.");
return TimeUnit::Zero();
}
-private:
+protected:
void DemuxerSeek()
{
// Request the demuxer to perform seek.
Reader()->Seek(mSeekJob.mTarget.ref())
->Then(OwnerThread(), __func__,
[this] (const media::TimeUnit& aUnit) {
OnSeekResolved(aUnit);
},
@@ -1763,16 +1763,23 @@ private:
// instead, we transition to NextFrameSeekingState.
void GoToNextState() override
{
SetState<NextFrameSeekingState>(Move(mFutureSeekJob),
EventVisibility::Observable);
}
};
+class MediaDecoderStateMachine::VideoOnlySeekingState
+ : public MediaDecoderStateMachine::AccurateSeekingState
+{
+public:
+ explicit VideoOnlySeekingState(Master* aPtr) : AccurateSeekingState(aPtr) { }
+};
+
RefPtr<MediaDecoder::SeekPromise>
MediaDecoderStateMachine::DormantState::HandleSeek(SeekTarget aTarget)
{
if (aTarget.IsNextFrame()) {
// NextFrameSeekingState doesn't reset the decoder unlike
// AccurateSeekingState. So we first must come out of dormant by seeking to
// mPendingSeek and continue later with the NextFrameSeek
SLOG("Changed state to SEEKING (to %" PRId64 ")",
@@ -2157,16 +2164,19 @@ StateObject::HandleResumeVideoDecoding(c
[](){});
}
RefPtr<MediaDecoder::SeekPromise>
MediaDecoderStateMachine::
StateObject::SetSeekingState(SeekJob&& aSeekJob, EventVisibility aVisibility)
{
if (aSeekJob.mTarget->IsAccurate() || aSeekJob.mTarget->IsFast()) {
+ if (aSeekJob.mTarget->IsVideoOnly()) {
+ return SetState<VideoOnlySeekingState>(Move(aSeekJob), aVisibility);
+ }
return SetState<AccurateSeekingState>(Move(aSeekJob), aVisibility);
}
if (aSeekJob.mTarget->IsNextFrame()) {
return SetState<NextFrameSeekingState>(Move(aSeekJob), aVisibility);
}
MOZ_ASSERT_UNREACHABLE("Unknown SeekTarget::Type.");
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -250,16 +250,17 @@ private:
class WaitForCDMState;
class DormantState;
class DecodingFirstFrameState;
class DecodingState;
class SeekingState;
class AccurateSeekingState;
class NextFrameSeekingState;
class NextFrameSeekingFromDormantState;
+ class VideoOnlySeekingState;
class BufferingState;
class CompletedState;
class ShutdownState;
static const char* ToStateStr(State aState);
static const char* ToStr(NextFrameStatus aStatus);
const char* ToStateStr();