Bug 1336358 - resolve drain promise when seeing the EOS sample or empty duration queue. r?jya
MozReview-Commit-ID: 2hFLlkqyMiC
--- 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;