Bug 1307725. Part 7 - move mIsPrerolling into DecodingState.
MozReview-Commit-ID: kHNnGepY53
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -566,45 +566,43 @@ public:
if (mMaster->CheckIfDecodeComplete()) {
SetState(DECODER_STATE_COMPLETED);
return;
}
mDecodeStartTime = TimeStamp::Now();
- mMaster->mIsPrerolling = true;
MaybeStopPrerolling();
// Ensure that we've got tasks enqueued to decode data if we need to.
mMaster->DispatchDecodeTasksIfNeeded();
mMaster->ScheduleStateMachine();
}
void Exit() override
{
if (!mDecodeStartTime.IsNull()) {
TimeDuration decodeDuration = TimeStamp::Now() - mDecodeStartTime;
SLOG("Exiting DECODING, decoded for %.3lfs", decodeDuration.ToSeconds());
}
- mMaster->mIsPrerolling = false;
}
void Step() override
{
if (mMaster->mPlayState != MediaDecoder::PLAY_STATE_PLAYING &&
mMaster->IsPlaying()) {
// We're playing, but the element/decoder is in paused state. Stop
// playing!
mMaster->StopPlayback();
}
// Start playback if necessary so that the clock can be properly queried.
- if (!mMaster->mIsPrerolling) {
+ if (!mIsPrerolling) {
mMaster->MaybeStartPlayback();
}
mMaster->UpdatePlaybackPositionPeriodically();
MOZ_ASSERT(!mMaster->IsPlaying() ||
mMaster->IsStateMachineScheduled(),
"Must have timer scheduled");
@@ -664,17 +662,17 @@ public:
MaybeStopPrerolling();
// MediaSink is changed. Schedule Step() to check if we can start playback.
mMaster->ScheduleStateMachine();
return true;
}
void DumpDebugInfo() override
{
- SDUMP("mIsPrerolling=%d", mMaster->mIsPrerolling);
+ SDUMP("mIsPrerolling=%d", mIsPrerolling);
}
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,
@@ -701,27 +699,36 @@ private:
"mAmpleAudioThresholdUsecs=%lld",
mMaster->mLowAudioThresholdUsecs,
mMaster->mAmpleAudioThresholdUsecs);
}
}
void MaybeStopPrerolling()
{
- if (mMaster->mIsPrerolling &&
+ if (mIsPrerolling &&
(mMaster->DonePrerollingAudio() || Reader()->IsWaitingAudioData()) &&
(mMaster->DonePrerollingVideo() || Reader()->IsWaitingVideoData())) {
- mMaster->mIsPrerolling = false;
+ mIsPrerolling = false;
// Check if we can start playback.
mMaster->ScheduleStateMachine();
}
}
// Time at which we started decoding.
TimeStamp mDecodeStartTime;
+
+ // When we start decoding (either for the first time, or after a pause)
+ // we may be low on decoded data. We don't want our "low data" logic to
+ // kick in and decide that we're low on decoded data because the download
+ // can't keep up with the decode, and cause us to pause playback. So we
+ // have a "preroll" stage, where we ignore the results of our "low data"
+ // logic during the first few frames of our decode. This occurs during
+ // playback.
+ bool mIsPrerolling = true;
};
class MediaDecoderStateMachine::SeekingState
: public MediaDecoderStateMachine::StateObject
{
public:
explicit SeekingState(Master* aPtr, SeekJob aSeekJob)
: StateObject(aPtr), mSeekJob(Move(aSeekJob)) {}
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -687,25 +687,16 @@ private:
bool DonePrerollingVideo()
{
MOZ_ASSERT(OnTaskQueue());
return !IsVideoDecoding() ||
static_cast<uint32_t>(VideoQueue().GetSize()) >=
VideoPrerollFrames() * mPlaybackRate + 1;
}
- // When we start decoding (either for the first time, or after a pause)
- // we may be low on decoded data. We don't want our "low data" logic to
- // kick in and decide that we're low on decoded data because the download
- // can't keep up with the decode, and cause us to pause playback. So we
- // have a "preroll" stage, where we ignore the results of our "low data"
- // logic during the first few frames of our decode. This occurs during
- // playback.
- bool mIsPrerolling = false;
-
// Only one of a given pair of ({Audio,Video}DataPromise, WaitForDataPromise)
// should exist at any given moment.
MediaEventListener mAudioCallback;
MediaEventListener mVideoCallback;
MediaEventListener mAudioWaitCallback;
MediaEventListener mVideoWaitCallback;