Bug 1299021. Part 2 - ensure resolving the end promise when mVideoSinkEndRequest is resolved. draft
authorJW Wang <jwwang@mozilla.com>
Mon, 29 Aug 2016 21:28:36 +0800
changeset 407828 1982f49c4f6a572c69db6b333884d5799e3e8936
parent 407827 1a76a2cd2320a57f59500baa5380559e01a2584f
child 529954 aa79cbee723bef125eb18e98e15c41cbb3d96235
push id28048
push userjwwang@mozilla.com
push dateWed, 31 Aug 2016 02:13:28 +0000
bugs1299021
milestone51.0a1
Bug 1299021. Part 2 - ensure resolving the end promise when mVideoSinkEndRequest is resolved. MozReview-Commit-ID: 2XTpqVGBrBN
dom/media/mediasink/VideoSink.cpp
--- a/dom/media/mediasink/VideoSink.cpp
+++ b/dom/media/mediasink/VideoSink.cpp
@@ -177,19 +177,24 @@ VideoSink::Start(int64_t aStartTime, con
     // test_streams_element_capture.html to time out.
     RefPtr<GenericPromise> p = mAudioSink->OnEnded(TrackInfo::kVideoTrack);
     if (p) {
       RefPtr<VideoSink> self = this;
       mVideoSinkEndRequest.Begin(p->Then(mOwnerThread, __func__,
         [self] () {
           self->mVideoSinkEndRequest.Complete();
           self->TryUpdateRenderedVideoFrames();
+          // It is possible the video queue size is 0 and we have no frames to
+          // render. However, we need to call MaybeResolveEndPromise() to ensure
+          // mEndPromiseHolder is resolved.
+          self->MaybeResolveEndPromise();
         }, [self] () {
           self->mVideoSinkEndRequest.Complete();
           self->TryUpdateRenderedVideoFrames();
+          self->MaybeResolveEndPromise();
         }));
     }
 
     ConnectListener();
     // Run the render loop at least once so we can resolve the end promise
     // when video duration is 0.
     UpdateRenderedVideoFrames();
   }