MediaCodec: hold input buffers during FLUSHED state
bug: 20267388
Change-Id: I21a12cb2ebb74e17dcdb7b502c3f674e9e64b5dc
diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h
index d98fa1a..e3e952f 100644
--- a/include/media/stagefright/MediaCodec.h
+++ b/include/media/stagefright/MediaCodec.h
@@ -304,6 +304,7 @@
sp<AMessage> mActivityNotify;
bool mHaveInputSurface;
+ bool mHavePendingInputBuffers;
MediaCodec(const sp<ALooper> &looper);
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 40818f9..8688d9b 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -320,7 +320,8 @@
mDequeueInputReplyID(0),
mDequeueOutputTimeoutGeneration(0),
mDequeueOutputReplyID(0),
- mHaveInputSurface(false) {
+ mHaveInputSurface(false),
+ mHavePendingInputBuffers(false) {
}
MediaCodec::~MediaCodec() {
@@ -1380,7 +1381,11 @@
if (mFlags & kFlagIsAsync) {
if (!mHaveInputSurface) {
- onInputBufferAvailable();
+ if (mState == FLUSHED) {
+ mHavePendingInputBuffers = true;
+ } else {
+ onInputBufferAvailable();
+ }
}
} else if (mFlags & kFlagDequeueInputPending) {
CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
@@ -1648,6 +1653,10 @@
if (mState == FLUSHED) {
setState(STARTED);
+ if (mHavePendingInputBuffers) {
+ onInputBufferAvailable();
+ mHavePendingInputBuffers = false;
+ }
mCodec->signalResume();
PostReplyWithError(replyID, OK);
break;