Bug 1336358 - resolve drain promise when seeing the EOS sample or empty duration queue. r?jya draft
authorJohn Lin <jolin@mozilla.com>
Tue, 07 Feb 2017 18:33:16 +0800
changeset 479835 4f59b36b5363ce5ca261c5a9de83eb3e10695a4e
parent 479651 af8a2573d0f1e9cc6f2ba0ab67d7a702a197f177
child 479836 b2b20a0a82c3744e1af5111a41c3c14cc01636e2
push id44379
push userbmo:jolin@mozilla.com
push dateTue, 07 Feb 2017 10:37:14 +0000
reviewersjya
bugs1336358
milestone54.0a1
Bug 1336358 - resolve drain promise when seeing the EOS sample or empty duration queue. r?jya MozReview-Commit-ID: 2hFLlkqyMiC
dom/media/platforms/android/RemoteDataDecoder.cpp
--- a/dom/media/platforms/android/RemoteDataDecoder.cpp
+++ b/dom/media/platforms/android/RemoteDataDecoder.cpp
@@ -189,17 +189,18 @@ public:
 
         UniquePtr<VideoData::Listener> listener(
           new RenderOrReleaseOutput(mDecoder->mJavaDecoder, aSample));
         v->SetListener(Move(listener));
 
         mDecoder->Output(v);
       }
 
-      if ((flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM) != 0) {
+      if (((flags & MediaCodec::BUFFER_FLAG_END_OF_STREAM) != 0)
+          || mDecoder->mInputDurations.IsEmpty()) {
         mDecoder->DrainComplete();
       }
     }
 
     void HandleError(const MediaResult& aError) override
     {
       mDecoder->Error(aError);
     }
@@ -260,17 +261,17 @@ public:
   RefPtr<MediaDataDecoder::FlushPromise> Flush() override
   {
     mInputDurations.Clear();
     return RemoteDataDecoder::Flush();
   }
 
   RefPtr<MediaDataDecoder::DecodePromise> Drain() override
   {
-    mInputDurations.Put(0);
+    mInputDurations.PutEOS();
     return RemoteDataDecoder::Drain();
   }
 
   RefPtr<MediaDataDecoder::DecodePromise> Decode(MediaRawData* aSample) override
   {
     mInputDurations.Put(aSample->mDuration);
     return RemoteDataDecoder::Decode(aSample);
   }
@@ -307,16 +308,25 @@ private:
       }
 
       auto value = Some(mValues.front());
       mValues.pop_front();
 
       return value;
     }
 
+    void PutEOS() {
+      Put(-1);
+    }
+
+    bool IsEmpty() {
+      MutexAutoLock lock(mMutex);
+      return mValues.empty() || mValues.front() == -1;
+    }
+
   private:
     Mutex mMutex; // To protect mValues.
     std::deque<int64_t> mValues;
   };
 
   layers::ImageContainer* mImageContainer;
   const VideoInfo mConfig;
   RefPtr<AndroidSurfaceTexture> mSurfaceTexture;