mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 03:35:33 +00:00
Bug 1322800 part 4 - move NextFrameSeekTask::MaybeFinishSeek(); r=jwwang
MozReview-Commit-ID: 51EchnVlGEX --HG-- extra : rebase_source : 8727151e308e27754bd59ca555455d30a8756b99
This commit is contained in:
parent
1c4e890ece
commit
d6ff08b72a
@ -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;
|
||||
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user