summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2015-04-16 12:44:11 -0700
committerChong Zhang <chz@google.com>2015-04-16 13:58:38 -0700
commit3d66eb4128aebef31bb0fa44c4d53d6122294a26 (patch)
treeb532ebd2b434a9f6f90039bdb46f775fbe2ebefe
parent71933d769c54dadb5d8618ccb1ae69a3926f890b (diff)
downloadframeworks_av-3d66eb4128aebef31bb0fa44c4d53d6122294a26.zip
frameworks_av-3d66eb4128aebef31bb0fa44c4d53d6122294a26.tar.gz
frameworks_av-3d66eb4128aebef31bb0fa44c4d53d6122294a26.tar.bz2
MediaCodec: hold input buffers during FLUSHED state
bug: 20267388 Change-Id: I21a12cb2ebb74e17dcdb7b502c3f674e9e64b5dc
-rw-r--r--include/media/stagefright/MediaCodec.h1
-rw-r--r--media/libstagefright/MediaCodec.cpp13
2 files changed, 12 insertions, 2 deletions
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 @@ private:
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 @@ MediaCodec::MediaCodec(const sp<ALooper> &looper)
mDequeueInputReplyID(0),
mDequeueOutputTimeoutGeneration(0),
mDequeueOutputReplyID(0),
- mHaveInputSurface(false) {
+ mHaveInputSurface(false),
+ mHavePendingInputBuffers(false) {
}
MediaCodec::~MediaCodec() {
@@ -1380,7 +1381,11 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
if (mFlags & kFlagIsAsync) {
if (!mHaveInputSurface) {
- onInputBufferAvailable();
+ if (mState == FLUSHED) {
+ mHavePendingInputBuffers = true;
+ } else {
+ onInputBufferAvailable();
+ }
}
} else if (mFlags & kFlagDequeueInputPending) {
CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
@@ -1648,6 +1653,10 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
if (mState == FLUSHED) {
setState(STARTED);
+ if (mHavePendingInputBuffers) {
+ onInputBufferAvailable();
+ mHavePendingInputBuffers = false;
+ }
mCodec->signalResume();
PostReplyWithError(replyID, OK);
break;