Bug 1322800 part 12 - move all SeekingState data members; r?jwwang
MozReview-Commit-ID: BL4vUw3zErL
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -1362,32 +1362,35 @@ public:
{
MOZ_ASSERT(aSeekJob.mTarget.IsNextFrame());
return SeekingState::Enter(Move(aSeekJob), aVisibility);
}
private:
void CreateSeekTask() override
{
+ mCurrentTime = mMaster->GetMediaTime();
+ mDuration = mMaster->Duration();
+
mSeekTask = new NextFrameSeekTask(
mMaster->mDecoderID, OwnerThread(), Reader(), mSeekJob.mTarget,
Info(), mMaster->Duration(),mMaster->GetMediaTime(),
AudioQueue(), VideoQueue());
mTask = static_cast<NextFrameSeekTask*>(mSeekTask.get());
}
void ResetMDSM() override
{
// Do nothing.
}
void DoSeek() override
{
- auto currentTime = mTask->mCurrentTime;
+ auto currentTime = mCurrentTime;
DiscardFrames(VideoQueue(), [currentTime] (int64_t aSampleTime) {
return aSampleTime <= currentTime;
});
mSeekTaskRequest.Begin(mSeekTask->Seek(mMaster->Duration())
->Then(OwnerThread(), __func__,
[this] (const SeekTaskResolveValue& aValue) {
OnSeekTaskResolved(aValue);
@@ -1408,33 +1411,33 @@ private:
MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
// The MDSM::mDecodedAudioEndTime will be updated once the whole SeekTask is
// resolved.
SSAMPLELOG("OnAudioDecoded [%lld,%lld]", aAudio->mTime, aAudio->GetEndTime());
// We accept any audio data here.
- mTask->mSeekedAudioData = aAudio;
+ mSeekedAudioData = aAudio;
MaybeFinishSeek();
}
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
{
MOZ_ASSERT(aVideo);
MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
// The MDSM::mDecodedVideoEndTime will be updated once the whole SeekTask is
// resolved.
SSAMPLELOG("OnVideoDecoded [%lld,%lld]", aVideo->mTime, aVideo->GetEndTime());
- if (aVideo->mTime > mTask->mCurrentTime) {
- mTask->mSeekedVideoData = aVideo;
+ if (aVideo->mTime > mCurrentTime) {
+ mSeekedVideoData = aVideo;
}
if (NeedMoreVideo()) {
RequestVideoData();
return;
}
MaybeFinishSeek();
@@ -1458,17 +1461,17 @@ private:
}
case MediaData::VIDEO_DATA:
{
MOZ_ASSERT(mSeekTaskRequest.Exists(), "Seek shouldn't be finished");
SSAMPLELOG("OnVideoNotDecoded (aError=%u)", aError.Code());
if (aError == NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
- mTask->mIsVideoQueueFinished = true;
+ mIsVideoQueueFinished = true;
}
// Video seek not finished.
if (NeedMoreVideo()) {
switch (aError.Code()) {
case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
Reader()->WaitForData(MediaData::VIDEO_DATA);
break;
@@ -1594,19 +1597,19 @@ private:
{
Reader()->RequestVideoData(false, media::TimeUnit());
}
bool NeedMoreVideo() const
{
// Need to request video when we have none and video queue is not finished.
return VideoQueue().GetSize() == 0 &&
- !mTask->mSeekedVideoData &&
+ !mSeekedVideoData &&
!VideoQueue().IsFinished() &&
- !mTask->mIsVideoQueueFinished;
+ !mIsVideoQueueFinished;
}
bool IsVideoRequestPending() const
{
return Reader()->IsRequestingVideoData() || Reader()->IsWaitingVideoData();
}
bool IsAudioSeekComplete() const
@@ -1625,20 +1628,20 @@ private:
// 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()
{
RefPtr<MediaData> data = VideoQueue().PeekFront();
if (data) {
mSeekJob.mTarget.SetTime(TimeUnit::FromMicroseconds(data->mTime));
- } else if (mTask->mSeekedVideoData) {
- mSeekJob.mTarget.SetTime(TimeUnit::FromMicroseconds(mTask->mSeekedVideoData->mTime));
- } else if (mTask->mIsVideoQueueFinished || VideoQueue().AtEndOfStream()) {
- mSeekJob.mTarget.SetTime(mTask->mDuration);
+ } else if (mSeekedVideoData) {
+ mSeekJob.mTarget.SetTime(TimeUnit::FromMicroseconds(mSeekedVideoData->mTime));
+ } else if (mIsVideoQueueFinished || VideoQueue().AtEndOfStream()) {
+ mSeekJob.mTarget.SetTime(mDuration);
} else {
MOZ_ASSERT(false, "No data!");
}
}
void MaybeFinishSeek()
{
if (IsAudioSeekComplete() && IsVideoSeekComplete()) {
@@ -1648,16 +1651,30 @@ private:
DiscardFrames(AudioQueue(), [time] (int64_t aSampleTime) {
return aSampleTime < time;
});
mTask->Resolve(__func__); // Call to MDSM::SeekCompleted();
}
}
+ /*
+ * Internal state.
+ */
+ int64_t mCurrentTime;
+ media::TimeUnit mDuration;
+
+ /*
+ * Information which are going to be returned to MDSM.
+ */
+ RefPtr<MediaData> mSeekedAudioData;
+ RefPtr<MediaData> mSeekedVideoData;
+ bool mIsAudioQueueFinished = false;
+ bool mIsVideoQueueFinished = false;
+
// For refactoring only, will be removed later.
RefPtr<NextFrameSeekTask> mTask;
};
/**
* Purpose: stop playback until enough data is decoded to continue playback.
*
--- a/dom/media/NextFrameSeekTask.cpp
+++ b/dom/media/NextFrameSeekTask.cpp
@@ -24,18 +24,16 @@ NextFrameSeekTask::NextFrameSeekTask(con
MediaDecoderReaderWrapper* aReader,
const SeekTarget& aTarget,
const MediaInfo& aInfo,
const media::TimeUnit& aDuration,
int64_t aCurrentTime,
MediaQueue<MediaData>& aAudioQueue,
MediaQueue<MediaData>& aVideoQueue)
: SeekTask(aDecoderID, aThread, aReader, aTarget)
- , mCurrentTime(aCurrentTime)
- , mDuration(aDuration)
{
AssertOwnerThread();
MOZ_ASSERT(aInfo.HasVideo());
}
NextFrameSeekTask::~NextFrameSeekTask()
{
AssertOwnerThread();
--- a/dom/media/NextFrameSeekTask.h
+++ b/dom/media/NextFrameSeekTask.h
@@ -48,20 +48,14 @@ public:
void HandleAudioWaited(MediaData::Type aType) override;
void HandleVideoWaited(MediaData::Type aType) override;
void HandleNotWaited(const WaitForDataRejectValue& aRejection) override;
~NextFrameSeekTask();
-
- /*
- * Internal state.
- */
- const int64_t mCurrentTime;
- media::TimeUnit mDuration;
};
} // namespace media
} // namespace mozilla
#endif /* NEXTFRAME_SEEK_TASK_H */