Bug 1320466 part 7 - remove callbacks of SeekTask; r?jwwang draft
authorKaku Kuo <kaku@mozilla.com>
Sat, 26 Nov 2016 15:01:45 +0800
changeset 444177 52fa6f34ba56462e89bd42d06912aa07992f9793
parent 444176 575be3043a1b03793359c3bb9c93cdb2ab9ece45
child 444178 8a055351c00a1df668a0f0451ee89f5158f2baa9
push id37214
push userbmo:kaku@mozilla.com
push dateSat, 26 Nov 2016 16:12:11 +0000
reviewersjwwang
bugs1320466
milestone53.0a1
Bug 1320466 part 7 - remove callbacks of SeekTask; r?jwwang MozReview-Commit-ID: KwyWGVG4NYG
dom/media/AccurateSeekTask.cpp
dom/media/AccurateSeekTask.h
dom/media/MediaDecoderStateMachine.cpp
dom/media/NextFrameSeekTask.cpp
dom/media/NextFrameSeekTask.h
--- a/dom/media/AccurateSeekTask.cpp
+++ b/dom/media/AccurateSeekTask.cpp
@@ -39,19 +39,16 @@ AccurateSeekTask::AccurateSeekTask(const
   , mDoneAudioSeeking(!aInfo.HasAudio() || aTarget.IsVideoOnly())
   , mDoneVideoSeeking(!aInfo.HasVideo())
 {
   AssertOwnerThread();
 
   // Bound the seek time to be inside the media range.
   NS_ASSERTION(aEnd.ToMicroseconds() != -1, "Should know end time by now");
   mTarget.SetTime(std::max(media::TimeUnit(), std::min(mTarget.GetTime(), aEnd)));
-
-  // Configure MediaDecoderReaderWrapper.
-  SetCallbacks();
 }
 
 AccurateSeekTask::~AccurateSeekTask()
 {
   AssertOwnerThread();
   MOZ_ASSERT(mIsDiscarded);
 }
 
@@ -60,17 +57,16 @@ AccurateSeekTask::Discard()
 {
   AssertOwnerThread();
 
   // Disconnect MDSM.
   RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
 
   // Disconnect MediaDecoderReaderWrapper.
   mSeekRequest.DisconnectIfExists();
-  CancelCallbacks();
 
   mIsDiscarded = true;
 }
 
 bool
 AccurateSeekTask::NeedToResetMDSM() const
 {
   AssertOwnerThread();
@@ -387,17 +383,16 @@ AccurateSeekTask::OnAudioDecoded(MediaDa
 
   if (mTarget.IsFast()) {
     // Non-precise seek; we can stop the seek at the first sample.
     mSeekedAudioData = audio;
     mDoneAudioSeeking = true;
   } else {
     nsresult rv = DropAudioUpToSeekTarget(audio);
     if (NS_FAILED(rv)) {
-      CancelCallbacks();
       RejectIfExist(rv, __func__);
       return;
     }
   }
 
   if (!mDoneAudioSeeking) {
     RequestAudioData();
     return;
@@ -448,17 +443,16 @@ AccurateSeekTask::OnNotDecoded(MediaData
         mSeekedVideoData = mFirstVideoFrameAfterSeek.forget();
       }
     }
     MaybeFinishSeek();
     return;
   }
 
   // This is a decode error, delegate to the generic error path.
-  CancelCallbacks();
   RejectIfExist(aError, __func__);
 }
 
 void
 AccurateSeekTask::OnVideoDecoded(MediaData* aVideoSample)
 {
   AssertOwnerThread();
   MOZ_ASSERT(!mSeekTaskPromise.IsEmpty(), "Seek shouldn't be finished");
@@ -475,76 +469,21 @@ AccurateSeekTask::OnVideoDecoded(MediaDa
 
   if (mTarget.IsFast()) {
     // Non-precise seek. We can stop the seek at the first sample.
     mSeekedVideoData = video;
     mDoneVideoSeeking = true;
   } else {
     nsresult rv = DropVideoUpToSeekTarget(video.get());
     if (NS_FAILED(rv)) {
-      CancelCallbacks();
       RejectIfExist(rv, __func__);
       return;
     }
   }
 
   if (!mDoneVideoSeeking) {
     RequestVideoData();
     return;
   }
   MaybeFinishSeek();
 }
 
-void
-AccurateSeekTask::SetCallbacks()
-{
-  AssertOwnerThread();
-
-  mAudioCallback = mReader->AudioCallback().Connect(
-    OwnerThread(), [this] (AudioCallbackData aData) {
-    if (aData.is<MediaData*>()) {
-      OnAudioDecoded(aData.as<MediaData*>());
-    } else {
-      OnNotDecoded(MediaData::AUDIO_DATA,
-        aData.as<MediaResult>());
-    }
-  });
-
-  mVideoCallback = mReader->VideoCallback().Connect(
-    OwnerThread(), [this] (VideoCallbackData aData) {
-    typedef Tuple<MediaData*, TimeStamp> Type;
-    if (aData.is<Type>()) {
-      OnVideoDecoded(Get<0>(aData.as<Type>()));
-    } else {
-      OnNotDecoded(MediaData::VIDEO_DATA,
-        aData.as<MediaResult>());
-    }
-  });
-
-  mAudioWaitCallback = mReader->AudioWaitCallback().Connect(
-    OwnerThread(), [this] (WaitCallbackData aData) {
-    if (aData.is<MediaData::Type>()) {
-      HandleAudioWaited(aData.as<MediaData::Type>());
-    } else {
-      HandleNotWaited(aData.as<WaitForDataRejectValue>());
-    }
-  });
-
-  mVideoWaitCallback = mReader->VideoWaitCallback().Connect(
-    OwnerThread(), [this] (WaitCallbackData aData) {
-    if (aData.is<MediaData::Type>()) {
-      HandleVideoWaited(aData.as<MediaData::Type>());
-    } else {
-      HandleNotWaited(aData.as<WaitForDataRejectValue>());
-    }
-  });
-}
-
-void
-AccurateSeekTask::CancelCallbacks()
-{
-  AssertOwnerThread();
-  mAudioCallback.DisconnectIfExists();
-  mVideoCallback.DisconnectIfExists();
-  mAudioWaitCallback.DisconnectIfExists();
-  mVideoWaitCallback.DisconnectIfExists();
-}
 } // namespace mozilla
--- a/dom/media/AccurateSeekTask.h
+++ b/dom/media/AccurateSeekTask.h
@@ -61,20 +61,16 @@ private:
   void OnSeekRejected(nsresult aResult);
 
   void OnAudioDecoded(MediaData* aAudioSample);
 
   void OnVideoDecoded(MediaData* aVideoSample);
 
   void OnNotDecoded(MediaData::Type, const MediaResult&);
 
-  void SetCallbacks();
-
-  void CancelCallbacks();
-
   void AdjustFastSeekIfNeeded(MediaData* aSample);
 
   /*
    * Internal state.
    */
   const media::TimeUnit mCurrentTimeBeforeSeek;
   const uint32_t mAudioRate;  // Audio sample rate.
   bool mDoneAudioSeeking;
@@ -85,18 +81,13 @@ private:
   // the seek target, we will still have a frame that we can display as the
   // last frame in the media.
   RefPtr<MediaData> mFirstVideoFrameAfterSeek;
 
   /*
    * Track the current seek promise made by the reader.
    */
   MozPromiseRequestHolder<MediaDecoderReader::SeekPromise> mSeekRequest;
-
-  MediaEventListener mAudioCallback;
-  MediaEventListener mVideoCallback;
-  MediaEventListener mAudioWaitCallback;
-  MediaEventListener mVideoWaitCallback;
 };
 
 } // namespace mozilla
 
 #endif /* ACCURATE_SEEK_TASK_H */
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -776,19 +776,16 @@ public:
     // in the middle of seeking and won't have a valid video frame to show
     // when seek is done.
     if (mMaster->mVideoDecodeSuspended) {
       mMaster->mVideoDecodeSuspended = false;
       mMaster->mOnPlaybackEvent.Notify(MediaEventType::ExitVideoSuspend);
       Reader()->SetVideoBlankDecode(false);
     }
 
-    // SeekTask will register its callbacks to MediaDecoderReaderWrapper.
-    mMaster->CancelMediaDecoderReaderWrapperCallback();
-
     // Create a new SeekTask instance for the incoming seek task.
     if (mSeekJob.mTarget.IsAccurate() ||
         mSeekJob.mTarget.IsFast()) {
       mSeekTask = new AccurateSeekTask(
         mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
         Info(), mMaster->Duration(), mMaster->GetMediaTime());
     } else if (mSeekJob.mTarget.IsNextFrame()) {
       mSeekTask = new NextFrameSeekTask(
@@ -840,19 +837,16 @@ public:
     return mSeekJob.mPromise.Ensure(__func__);
   }
 
   void Exit() override
   {
     mSeekTaskRequest.DisconnectIfExists();
     mSeekJob.RejectIfExists(__func__);
     mSeekTask->Discard();
-
-    // Reset the MediaDecoderReaderWrapper's callbask.
-    mMaster->SetMediaDecoderReaderWrapperCallback();
   }
 
   State GetState() const override
   {
     return DECODER_STATE_SEEKING;
   }
 
   void HandleAudioDecoded(MediaData* aAudio) override
@@ -2061,17 +2055,16 @@ MediaDecoderStateMachine::OnVideoPopped(
   DispatchVideoDecodeTaskIfNeeded();
 }
 
 void
 MediaDecoderStateMachine::OnNotDecoded(MediaData::Type aType,
                                        const MediaResult& aError)
 {
   MOZ_ASSERT(OnTaskQueue());
-  MOZ_ASSERT(mState != DECODER_STATE_SEEKING);
 
   SAMPLE_LOG("OnNotDecoded (aType=%u, aError=%u)", aType, aError.Code());
 
   mStateObj->HandleNotDecoded(aType, aError);
 }
 
 void
 MediaDecoderStateMachine::OnVideoDecoded(MediaData* aVideo,
--- a/dom/media/NextFrameSeekTask.cpp
+++ b/dom/media/NextFrameSeekTask.cpp
@@ -31,38 +31,32 @@ NextFrameSeekTask::NextFrameSeekTask(con
   : SeekTask(aDecoderID, aThread, aReader, aTarget)
   , mAudioQueue(aAudioQueue)
   , mVideoQueue(aVideoQueue)
   , mCurrentTime(aCurrentTime)
   , mDuration(aDuration)
 {
   AssertOwnerThread();
   MOZ_ASSERT(aInfo.HasVideo());
-
-  // Configure MediaDecoderReaderWrapper.
-  SetCallbacks();
 }
 
 NextFrameSeekTask::~NextFrameSeekTask()
 {
   AssertOwnerThread();
   MOZ_ASSERT(mIsDiscarded);
 }
 
 void
 NextFrameSeekTask::Discard()
 {
   AssertOwnerThread();
 
   // Disconnect MDSM.
   RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
 
-  // Disconnect MediaDecoderReader.
-  CancelCallbacks();
-
   mIsDiscarded = true;
 }
 
 bool
 NextFrameSeekTask::NeedToResetMDSM() const
 {
   AssertOwnerThread();
   return false;
@@ -142,17 +136,16 @@ NextFrameSeekTask::HandleNotWaited(const
     // trigger further audio decode tasks if MDSM itself needs to play audio.
     MaybeFinishSeek();
     break;
   }
   case MediaData::VIDEO_DATA:
   {
     if (NeedMoreVideo()) {
       // Reject if we can't finish video seeking.
-      CancelCallbacks();
       RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
       return;
     }
     MaybeFinishSeek();
     break;
   }
   default:
     MOZ_ASSERT_UNREACHABLE("We cannot handle RAW_DATA or NULL_DATA here.");
@@ -334,86 +327,27 @@ NextFrameSeekTask::OnVideoNotDecoded(con
         break;
       case NS_ERROR_DOM_MEDIA_CANCELED:
         RequestVideoData();
         break;
       case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
         MOZ_ASSERT(false, "Shouldn't want more data for ended video.");
         break;
       default:
-        // We might lose the audio sample after canceling the callbacks.
-        // However it doesn't really matter because MDSM is gonna shut down
-        // when seek fails.
-        CancelCallbacks();
         // Reject the promise since we can't finish video seek anyway.
         RejectIfExist(aError, __func__);
         break;
     }
     return;
   }
 
   MaybeFinishSeek();
 }
 
 void
-NextFrameSeekTask::SetCallbacks()
-{
-  AssertOwnerThread();
-
-  // Register dummy callbcak for audio decoding since we don't need to handle
-  // the decoded audio samples.
-  mAudioCallback = mReader->AudioCallback().Connect(
-    OwnerThread(), [this] (AudioCallbackData aData) {
-    if (aData.is<MediaData*>()) {
-      OnAudioDecoded(aData.as<MediaData*>());
-    } else {
-      OnAudioNotDecoded(aData.as<MediaResult>());
-    }
-  });
-
-  mVideoCallback = mReader->VideoCallback().Connect(
-    OwnerThread(), [this] (VideoCallbackData aData) {
-    typedef Tuple<MediaData*, TimeStamp> Type;
-    if (aData.is<Type>()) {
-      OnVideoDecoded(Get<0>(aData.as<Type>()));
-    } else {
-      OnVideoNotDecoded(aData.as<MediaResult>());
-    }
-  });
-
-  mAudioWaitCallback = mReader->AudioWaitCallback().Connect(
-    OwnerThread(), [this] (WaitCallbackData aData) {
-    if (aData.is<MediaData::Type>()) {
-      HandleAudioWaited(aData.as<MediaData::Type>());
-    } else {
-      HandleNotWaited(aData.as<WaitForDataRejectValue>());
-    }
-  });
-
-  mVideoWaitCallback = mReader->VideoWaitCallback().Connect(
-    OwnerThread(), [this] (WaitCallbackData aData) {
-    if (aData.is<MediaData::Type>()) {
-      HandleVideoWaited(aData.as<MediaData::Type>());
-    } else {
-      HandleNotWaited(aData.as<WaitForDataRejectValue>());
-    }
-  });
-}
-
-void
-NextFrameSeekTask::CancelCallbacks()
-{
-  AssertOwnerThread();
-  mAudioCallback.DisconnectIfExists();
-  mVideoCallback.DisconnectIfExists();
-  mAudioWaitCallback.DisconnectIfExists();
-  mVideoWaitCallback.DisconnectIfExists();
-}
-
-void
 NextFrameSeekTask::UpdateSeekTargetTime()
 {
   AssertOwnerThread();
 
   RefPtr<MediaData> data = mVideoQueue.PeekFront();
   if (data) {
     mTarget.SetTime(TimeUnit::FromMicroseconds(data->mTime));
   } else if (mSeekedVideoData) {
--- a/dom/media/NextFrameSeekTask.h
+++ b/dom/media/NextFrameSeekTask.h
@@ -72,38 +72,29 @@ private:
   void OnAudioDecoded(MediaData* aAudioSample);
 
   void OnAudioNotDecoded(const MediaResult& aError);
 
   void OnVideoDecoded(MediaData* aVideoSample);
 
   void OnVideoNotDecoded(const MediaResult& aError);
 
-  void SetCallbacks();
-
-  void CancelCallbacks();
-
   // Update the seek target's time before resolving this seek task, the updated
   // time will be used in the MDSM::SeekCompleted() to update the MDSM's position.
   void UpdateSeekTargetTime();
 
   /*
    * Data shared with MDSM.
    */
   MediaQueue<MediaData>& mAudioQueue;
   MediaQueue<MediaData>& mVideoQueue;
 
   /*
    * Internal state.
    */
   const int64_t mCurrentTime;
   media::TimeUnit mDuration;
-
-  MediaEventListener mAudioCallback;
-  MediaEventListener mVideoCallback;
-  MediaEventListener mAudioWaitCallback;
-  MediaEventListener mVideoWaitCallback;
 };
 
 } // namespace media
 } // namespace mozilla
 
 #endif /* NEXTFRAME_SEEK_TASK_H */