RefPtr<MP4TrackDemuxer::SeekPromise> MP4TrackDemuxer::Seek(const media::TimeUnit& aTime) { auto seekTime = aTime; mQueuedSample = nullptr; mIterator->Seek(seekTime.ToMicroseconds()); // Check what time we actually seeked to. RefPtr<MediaRawData> sample; do { sample = GetNextSample(); if (!sample) { return SeekPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__); } if (!sample->Size()) { // This sample can't be decoded, continue searching. continue; } if (sample->mKeyframe) { mQueuedSample = sample; seekTime = mQueuedSample->mTime; } } while (!mQueuedSample); SetNextKeyFrameTime(); return SeekPromise::CreateAndResolve(seekTime, __func__); }
void MP4TrackDemuxer::Reset() { mQueuedSample = nullptr; // TODO, Seek to first frame available, which isn't always 0. mIterator->Seek(0); SetNextKeyFrameTime(); }
RefPtr<MP4TrackDemuxer::SeekPromise> MP4TrackDemuxer::Seek(media::TimeUnit aTime) { int64_t seekTime = aTime.ToMicroseconds(); mQueuedSample = nullptr; mIterator->Seek(seekTime); // Check what time we actually seeked to. mQueuedSample = mIterator->GetNext(); if (mQueuedSample) { seekTime = mQueuedSample->mTime; } SetNextKeyFrameTime(); return SeekPromise::CreateAndResolve(media::TimeUnit::FromMicroseconds(seekTime), __func__); }