Bug 1409946 - ensure we could always get keyframe while seeking. draft
authorAlastor Wu <alwu@mozilla.com>
Mon, 06 Nov 2017 18:35:49 +0800
changeset 693908 b8a76a6e265daab1cda61bbd1c7bec059cf34ca9
parent 688337 d3910b7628b8066d3f30d58b17b5824b05768854
child 739190 3a3dfc2788efff74ea36beaffaad9302bf6da4fc
push id87971
push useralwu@mozilla.com
push dateTue, 07 Nov 2017 02:37:14 +0000
bugs1409946, 1359058
milestone58.0a1
Bug 1409946 - ensure we could always get keyframe while seeking. Since MDSM won't treat EOS as an erorr now, so we could revert bug1359058 p2. MozReview-Commit-ID: JqkIrOiBu8v
dom/media/fmp4/MP4Demuxer.cpp
--- a/dom/media/fmp4/MP4Demuxer.cpp
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -405,20 +405,31 @@ 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.
-  mQueuedSample = GetNextSample();
-  if (mQueuedSample) {
-    seekTime = mQueuedSample->mTime;
-  }
+  do {
+    RefPtr<MediaRawData> 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__);
 }
 
 already_AddRefed<MediaRawData>
 MP4TrackDemuxer::GetNextSample()