Bug 1329110. Part 7 - remove StateObject::HandleEndOfStream(). draft
authorJW Wang <jwwang@mozilla.com>
Mon, 09 Jan 2017 13:18:37 +0800
changeset 458397 f6dfd1c187265a9ad005a35a76a599f1e60b1150
parent 458396 06f59c551e95e929c9e8c667b4082fecfeee8f3b
child 541634 7e77eb988c1ee4a24c835054c9739b45d9ff61ec
push id40941
push userjwwang@mozilla.com
push dateTue, 10 Jan 2017 07:42:53 +0000
bugs1329110
milestone53.0a1
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
dom/media/MediaDecoderStateMachine.cpp
--- 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();
   }
 }