Bug 1322800 part 4 - move NextFrameSeekTask::MaybeFinishSeek(); r=jwwang

MozReview-Commit-ID: 51EchnVlGEX

--HG--
extra : rebase_source : 8727151e308e27754bd59ca555455d30a8756b99
This commit is contained in:
Kaku Kuo 2016-12-14 14:57:44 +08:00
parent 1c4e890ece
commit d6ff08b72a
3 changed files with 23 additions and 44 deletions

View File

@ -1397,7 +1397,7 @@ private:
if (!mTask->IsVideoRequestPending() && mTask->NeedMoreVideo()) {
mTask->RequestVideoData();
}
mTask->MaybeFinishSeek(); // Might resolve mSeekTaskPromise and modify audio queue.
MaybeFinishSeek(); // Might resolve mSeekTaskPromise and modify audio queue.
}
void HandleAudioDecoded(MediaData* aAudio) override
@ -1413,7 +1413,7 @@ private:
// We accept any audio data here.
mTask->mSeekedAudioData = aAudio;
mTask->MaybeFinishSeek();
MaybeFinishSeek();
}
void HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
@ -1435,7 +1435,7 @@ private:
return;
}
mTask->MaybeFinishSeek();
MaybeFinishSeek();
}
void HandleNotDecoded(MediaData::Type aType, const MediaResult& aError) override
@ -1451,7 +1451,7 @@ private:
// audio decoding tasks if it needs to play audio, and MDSM will then receive
// the decoding state from MediaDecoderReader.
mTask->MaybeFinishSeek();
MaybeFinishSeek();
break;
}
case MediaData::VIDEO_DATA:
@ -1484,7 +1484,7 @@ private:
return;
}
mTask->MaybeFinishSeek();
MaybeFinishSeek();
break;
}
default:
@ -1498,7 +1498,7 @@ private:
// We don't make an audio decode request here, instead, let MDSM to
// trigger further audio decode tasks if MDSM itself needs to play audio.
mTask->MaybeFinishSeek();
MaybeFinishSeek();
}
void HandleVideoWaited(MediaData::Type aType) override
@ -1509,7 +1509,7 @@ private:
mTask->RequestVideoData();
return;
}
mTask->MaybeFinishSeek();
MaybeFinishSeek();
}
void HandleNotWaited(const WaitForDataRejectValue& aRejection) override
@ -1521,7 +1521,7 @@ private:
{
// We don't make an audio decode request here, instead, let MDSM to
// trigger further audio decode tasks if MDSM itself needs to play audio.
mTask->MaybeFinishSeek();
MaybeFinishSeek();
break;
}
case MediaData::VIDEO_DATA:
@ -1531,7 +1531,7 @@ private:
mTask->RejectIfExist(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
return;
}
mTask->MaybeFinishSeek();
MaybeFinishSeek();
break;
}
default:
@ -1588,6 +1588,20 @@ private:
mMaster->DecodeError(aValue.mError);
}
void MaybeFinishSeek()
{
if (mTask->IsAudioSeekComplete() && mTask->IsVideoSeekComplete()) {
mTask->UpdateSeekTargetTime();
auto time = mTask->mTarget.GetTime().ToMicroseconds();
DiscardFrames(mTask->mAudioQueue, [time] (int64_t aSampleTime) {
return aSampleTime < time;
});
mTask->Resolve(__func__); // Call to MDSM::SeekCompleted();
}
}
// For refactoring only, will be removed later.
RefPtr<NextFrameSeekTask> mTask;

View File

@ -92,23 +92,6 @@ NextFrameSeekTask::HandleNotWaited(const WaitForDataRejectValue& aRejection)
{
}
/*
* Remove samples from the queue until aCompare() returns false.
* aCompare A function object with the signature bool(int64_t) which returns
* true for samples that should be removed.
*/
template <typename Function> static void
DiscardFrames(MediaQueue<MediaData>& aQueue, const Function& aCompare)
{
while(aQueue.GetSize() > 0) {
if (aCompare(aQueue.PeekFront()->mTime)) {
RefPtr<MediaData> releaseMe = aQueue.PopFront();
continue;
}
break;
}
}
RefPtr<NextFrameSeekTask::SeekTaskPromise>
NextFrameSeekTask::Seek(const media::TimeUnit&)
{
@ -162,22 +145,6 @@ NextFrameSeekTask::IsVideoSeekComplete() const
return !IsVideoRequestPending() && !NeedMoreVideo();
}
void
NextFrameSeekTask::MaybeFinishSeek()
{
AssertOwnerThread();
if (IsAudioSeekComplete() && IsVideoSeekComplete()) {
UpdateSeekTargetTime();
auto time = mTarget.GetTime().ToMicroseconds();
DiscardFrames(mAudioQueue, [time] (int64_t aSampleTime) {
return aSampleTime < time;
});
Resolve(__func__); // Call to MDSM::SeekCompleted();
}
}
void
NextFrameSeekTask::UpdateSeekTargetTime()
{

View File

@ -64,8 +64,6 @@ public:
bool IsVideoSeekComplete() const;
void MaybeFinishSeek();
// 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();