Bug 1330254. Part 1 - move MDSM::Ensure{Audio,Video}DecodeTaskQueued into DecodingState.
MozReview-Commit-ID: 9xPNQ9E7R3E
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -669,22 +669,22 @@ public:
mMaster->PushVideo(aVideo);
DispatchDecodeTasksIfNeeded();
MaybeStopPrerolling();
CheckSlowDecoding(aDecodeStart);
}
void HandleAudioCanceled() override
{
- mMaster->EnsureAudioDecodeTaskQueued();
+ EnsureAudioDecodeTaskQueued();
}
void HandleVideoCanceled() override
{
- mMaster->EnsureVideoDecodeTaskQueued();
+ EnsureVideoDecodeTaskQueued();
}
void HandleEndOfAudio() override;
void HandleEndOfVideo() override;
void HandleWaitingForAudio() override
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
@@ -694,22 +694,22 @@ public:
void HandleWaitingForVideo() override
{
mMaster->WaitForData(MediaData::VIDEO_DATA);
MaybeStopPrerolling();
}
void HandleAudioWaited(MediaData::Type aType) override
{
- mMaster->EnsureAudioDecodeTaskQueued();
+ EnsureAudioDecodeTaskQueued();
}
void HandleVideoWaited(MediaData::Type aType) override
{
- mMaster->EnsureVideoDecodeTaskQueued();
+ EnsureVideoDecodeTaskQueued();
}
void HandleAudioCaptured() override
{
MaybeStopPrerolling();
// MediaSink is changed. Schedule Step() to check if we can start playback.
mMaster->ScheduleStateMachine();
}
@@ -741,16 +741,18 @@ public:
void DumpDebugInfo() override
{
SDUMP("mIsPrerolling=%d", mIsPrerolling);
}
private:
void DispatchDecodeTasksIfNeeded();
+ void EnsureAudioDecodeTaskQueued();
+ void EnsureVideoDecodeTaskQueued();
void MaybeStartBuffering();
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,
// since they decode audio and video on different threads so they
@@ -2081,23 +2083,23 @@ DecodingState::Enter()
if (mMaster->CheckIfDecodeComplete()) {
SetState<CompletedState>();
return;
}
mOnAudioPopped = AudioQueue().PopEvent().Connect(
OwnerThread(), [this] () {
if (mMaster->IsAudioDecoding() && !mMaster->HaveEnoughDecodedAudio()) {
- mMaster->EnsureAudioDecodeTaskQueued();
+ EnsureAudioDecodeTaskQueued();
}
});
mOnVideoPopped = VideoQueue().PopEvent().Connect(
OwnerThread(), [this] () {
if (mMaster->IsVideoDecoding() && !mMaster->HaveEnoughDecodedVideo()) {
- mMaster->EnsureVideoDecodeTaskQueued();
+ EnsureVideoDecodeTaskQueued();
}
});
mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_AVAILABLE);
mDecodeStartTime = TimeStamp::Now();
MaybeStopPrerolling();
@@ -2139,28 +2141,54 @@ DecodingState::HandleEndOfVideo()
void
MediaDecoderStateMachine::
DecodingState::DispatchDecodeTasksIfNeeded()
{
if (mMaster->IsAudioDecoding() &&
!mMaster->mMinimizePreroll &&
!mMaster->HaveEnoughDecodedAudio()) {
- mMaster->EnsureAudioDecodeTaskQueued();
+ EnsureAudioDecodeTaskQueued();
}
if (mMaster->IsVideoDecoding() &&
!mMaster->mMinimizePreroll &&
!mMaster->HaveEnoughDecodedVideo()) {
- mMaster->EnsureVideoDecodeTaskQueued();
+ EnsureVideoDecodeTaskQueued();
}
}
void
MediaDecoderStateMachine::
+DecodingState::EnsureAudioDecodeTaskQueued()
+{
+ if (!mMaster->IsAudioDecoding() ||
+ mMaster->IsRequestingAudioData() ||
+ mMaster->IsWaitingAudioData()) {
+ return;
+ }
+ mMaster->RequestAudioData();
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::EnsureVideoDecodeTaskQueued()
+{
+ if (!mMaster->IsVideoDecoding() ||
+ mMaster->IsRequestingVideoData() ||
+ mMaster->IsWaitingVideoData()) {
+ return;
+ }
+ mMaster->RequestVideoData(mMaster->NeedToSkipToNextKeyframe(),
+ media::TimeUnit::FromMicroseconds(mMaster->GetMediaTime()));
+}
+
+
+void
+MediaDecoderStateMachine::
DecodingState::MaybeStartBuffering()
{
// Buffering makes senses only after decoding first frames.
MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
// Don't enter buffering when MediaDecoder is not playing.
if (mMaster->mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
return;
@@ -2986,40 +3014,16 @@ void MediaDecoderStateMachine::StopMedia
mMediaSink->Stop();
mMediaSinkAudioPromise.DisconnectIfExists();
mMediaSinkVideoPromise.DisconnectIfExists();
}
}
void
-MediaDecoderStateMachine::EnsureAudioDecodeTaskQueued()
-{
- MOZ_ASSERT(OnTaskQueue());
- MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
- MOZ_ASSERT(mState != DECODER_STATE_DECODING_FIRSTFRAME);
-
- SAMPLE_LOG("EnsureAudioDecodeTaskQueued isDecoding=%d status=%s",
- IsAudioDecoding(), AudioRequestStatus());
-
- if (mState != DECODER_STATE_DECODING &&
- mState != DECODER_STATE_BUFFERING) {
- return;
- }
-
- if (!IsAudioDecoding() ||
- IsRequestingAudioData() ||
- IsWaitingAudioData()) {
- return;
- }
-
- RequestAudioData();
-}
-
-void
MediaDecoderStateMachine::RequestAudioData()
{
MOZ_ASSERT(OnTaskQueue());
MOZ_ASSERT(IsAudioDecoding());
MOZ_ASSERT(!IsRequestingAudioData());
MOZ_ASSERT(!IsWaitingAudioData());
SAMPLE_LOG("Queueing audio task - queued=%i, decoder-queued=%o",
AudioQueue().GetSize(), mReader->SizeOfAudioQueueInFrames());
@@ -3051,41 +3055,16 @@ MediaDecoderStateMachine::RequestAudioDa
default:
DecodeError(aError);
}
})
);
}
void
-MediaDecoderStateMachine::EnsureVideoDecodeTaskQueued()
-{
- MOZ_ASSERT(OnTaskQueue());
- MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
- MOZ_ASSERT(mState != DECODER_STATE_DECODING_FIRSTFRAME);
-
- SAMPLE_LOG("EnsureVideoDecodeTaskQueued isDecoding=%d status=%s",
- IsVideoDecoding(), VideoRequestStatus());
-
- if (mState != DECODER_STATE_DECODING &&
- mState != DECODER_STATE_BUFFERING) {
- return;
- }
-
- if (!IsVideoDecoding() ||
- IsRequestingVideoData() ||
- IsWaitingVideoData()) {
- return;
- }
-
- RequestVideoData(NeedToSkipToNextKeyframe(),
- media::TimeUnit::FromMicroseconds(GetMediaTime()));
-}
-
-void
MediaDecoderStateMachine::RequestVideoData(bool aSkipToNextKeyframe,
const media::TimeUnit& aCurrentTime)
{
MOZ_ASSERT(OnTaskQueue());
MOZ_ASSERT(IsVideoDecoding());
MOZ_ASSERT(!IsRequestingVideoData());
MOZ_ASSERT(!IsWaitingVideoData());
SAMPLE_LOG("Queueing video task - queued=%i, decoder-queued=%o, skip=%i, time=%lld",
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -403,22 +403,16 @@ protected:
// Dispatches a LoadedMetadataEvent.
// This is threadsafe and can be called on any thread.
// The decoder monitor must be held.
void EnqueueLoadedMetadataEvent();
void EnqueueFirstFrameLoadedEvent();
- // Dispatch a task to decode audio if there is not.
- void EnsureAudioDecodeTaskQueued();
-
- // Dispatch a task to decode video if there is not.
- void EnsureVideoDecodeTaskQueued();
-
// Start a task to decode audio.
void RequestAudioData();
// Start a task to decode video.
void RequestVideoData(bool aSkipToNextKeyframe,
const media::TimeUnit& aCurrentTime);
void WaitForData(MediaData::Type aType);