Bug 1404441 - return NS_ERROR_DOM_MEDIA_OVERFLOW_ERR if MediaData::AdjustForStartTime() results in an invalid mTime. draft
authorJW Wang <jwwang@mozilla.com>
Tue, 19 Dec 2017 14:56:08 +0800
changeset 712936 a70ac73a683e37aa3bf7523acf785989f7196eed
parent 712933 e48e35763180ceab53b7acf096f3c72f99540533
child 744200 9abdaa45a3f3b16b68f1b1c9fbd960c1eb20fa71
push id93498
push userjwwang@mozilla.com
push dateTue, 19 Dec 2017 06:56:43 +0000
bugs1404441
milestone59.0a1
Bug 1404441 - return NS_ERROR_DOM_MEDIA_OVERFLOW_ERR if MediaData::AdjustForStartTime() results in an invalid mTime. MozReview-Commit-ID: 44VgbrknYbi
dom/media/ReaderProxy.cpp
--- a/dom/media/ReaderProxy.cpp
+++ b/dom/media/ReaderProxy.cpp
@@ -57,18 +57,22 @@ RefPtr<ReaderProxy::AudioDataPromise>
 ReaderProxy::OnAudioDataRequestCompleted(RefPtr<AudioData> aAudio)
 {
   MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
 
   // Subtract the start time and add the looping-offset time.
   int64_t offset =
     StartTime().ToMicroseconds() - mLoopingOffset.ToMicroseconds();
   aAudio->AdjustForStartTime(offset);
-  mLastAudioEndTime = aAudio->mTime;
-  return AudioDataPromise::CreateAndResolve(aAudio.forget(), __func__);
+  if (aAudio->mTime.IsValid()) {
+    mLastAudioEndTime = aAudio->mTime;
+    return AudioDataPromise::CreateAndResolve(aAudio.forget(), __func__);
+  }
+  return AudioDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR,
+                                           __func__);
 }
 
 RefPtr<ReaderProxy::AudioDataPromise>
 ReaderProxy::OnAudioDataRequestFailed(const MediaResult& aError)
 {
   MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
 
   if (mSeamlessLoopingBlocked || !mSeamlessLoopingEnabled ||
@@ -144,18 +148,21 @@ ReaderProxy::RequestVideoData(const medi
                      mReader.get(),
                      __func__,
                      &MediaFormatReader::RequestVideoData,
                      threshold)
     ->Then(mOwnerThread,
            __func__,
            [startTime](RefPtr<VideoData> aVideo) {
              aVideo->AdjustForStartTime(startTime);
-             return VideoDataPromise::CreateAndResolve(aVideo.forget(),
-                                                       __func__);
+             return aVideo->mTime.IsValid()
+                      ? VideoDataPromise::CreateAndResolve(aVideo.forget(),
+                                                           __func__)
+                      : VideoDataPromise::CreateAndReject(
+                          NS_ERROR_DOM_MEDIA_OVERFLOW_ERR, __func__);
            },
            [](const MediaResult& aError) {
              return VideoDataPromise::CreateAndReject(aError, __func__);
            });
 }
 
 RefPtr<ReaderProxy::SeekPromise>
 ReaderProxy::Seek(const SeekTarget& aTarget)