Bug 1329110. Part 7 - remove StateObject::HandleEndOfStream().
The same reason as P6. We would like to avoid virtual functions calls
inside a virtual function.
MozReview-Commit-ID: EYCk6tKPYSs
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -192,49 +192,46 @@ public:
// Event handlers for various events.
virtual void HandleCDMProxyReady() {}
virtual void HandleAudioDecoded(MediaData* aAudio) {}
virtual void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) {}
virtual void HandleAudioWaited(MediaData::Type aType);
virtual void HandleVideoWaited(MediaData::Type aType);
virtual void HandleNotWaited(const WaitForDataRejectValue& aRejection);
- virtual void HandleEndOfStream() {}
virtual void HandleAudioCaptured() {}
virtual void HandleWaitingForAudio()
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
}
virtual void HandleAudioCanceled()
{
mMaster->EnsureAudioDecodeTaskQueued();
}
virtual void HandleEndOfAudio()
{
AudioQueue().Finish();
- HandleEndOfStream();
}
virtual void HandleWaitingForVideo()
{
mMaster->WaitForData(MediaData::VIDEO_DATA);
}
virtual void HandleVideoCanceled()
{
mMaster->EnsureVideoDecodeTaskQueued();
}
virtual void HandleEndOfVideo()
{
VideoQueue().Finish();
- HandleEndOfStream();
}
virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget);
virtual RefPtr<ShutdownPromise> HandleShutdown();
virtual void HandleVideoSuspendTimeout() = 0;
@@ -657,17 +654,18 @@ public:
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
{
mMaster->PushVideo(aVideo);
DispatchDecodeTasksIfNeeded();
MaybeStopPrerolling();
CheckSlowDecoding(aDecodeStart);
}
- void HandleEndOfStream() override;
+ void HandleEndOfAudio() override;
+ void HandleEndOfVideo() override;
void HandleWaitingForAudio() override
{
mMaster->WaitForData(MediaData::AUDIO_DATA);
MaybeStopPrerolling();
}
void HandleWaitingForVideo() override
@@ -1641,17 +1639,18 @@ public:
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
{
// This might be the sample we need to exit buffering.
// Schedule Step() to check it.
mMaster->PushVideo(aVideo);
mMaster->ScheduleStateMachine();
}
- void HandleEndOfStream() override;
+ void HandleEndOfAudio() override;
+ void HandleEndOfVideo() override;
void HandleVideoSuspendTimeout() override
{
if (mMaster->HasVideo()) {
mMaster->mVideoDecodeSuspended = true;
mMaster->mOnPlaybackEvent.Notify(MediaEventType::EnterVideoSuspend);
Reader()->SetVideoBlankDecode(true);
}
@@ -2097,18 +2096,31 @@ DecodingState::Enter()
// Will enter dormant when playback is paused for a while.
if (mMaster->mPlayState == MediaDecoder::PLAY_STATE_PAUSED) {
StartDormantTimer();
}
}
void
MediaDecoderStateMachine::
-DecodingState::HandleEndOfStream()
+DecodingState::HandleEndOfAudio()
{
+ AudioQueue().Finish();
+ if (mMaster->CheckIfDecodeComplete()) {
+ SetState<CompletedState>();
+ } else {
+ MaybeStopPrerolling();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::HandleEndOfVideo()
+{
+ VideoQueue().Finish();
if (mMaster->CheckIfDecodeComplete()) {
SetState<CompletedState>();
} else {
MaybeStopPrerolling();
}
}
void
@@ -2269,18 +2281,32 @@ BufferingState::Step()
}
SLOG("Buffered for %.3lfs", (now - mBufferingStart).ToSeconds());
SetState<DecodingState>();
}
void
MediaDecoderStateMachine::
-BufferingState::HandleEndOfStream()
+BufferingState::HandleEndOfAudio()
{
+ AudioQueue().Finish();
+ if (mMaster->CheckIfDecodeComplete()) {
+ SetState<CompletedState>();
+ } else {
+ // Check if we can exit buffering.
+ mMaster->ScheduleStateMachine();
+ }
+}
+
+void
+MediaDecoderStateMachine::
+BufferingState::HandleEndOfVideo()
+{
+ VideoQueue().Finish();
if (mMaster->CheckIfDecodeComplete()) {
SetState<CompletedState>();
} else {
// Check if we can exit buffering.
mMaster->ScheduleStateMachine();
}
}