From 6e029f0ba9a3b421eb7273a095305f7998e9aa5a Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Thu, 9 Oct 2014 16:32:33 -0700 Subject: MediaCodec: fix onError and onInputBufferAvailable - don't call onInputBufferAvailable if we created an input surface - keep component name alive if an error occurs Bug: 17934966 Change-Id: I396c6e6cfd9fa589a1a95c6169492089255e6993 --- media/libstagefright/MediaCodec.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'media/libstagefright') diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index b568063..5f55484 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -780,7 +780,9 @@ void MediaCodec::onMessageReceived(const sp &msg) { // STOPPING->UNINITIALIZED, instead of the // usual STOPPING->INITIALIZED state. setState(UNINITIALIZED); - + if (mState == RELEASING) { + mComponentName.clear(); + } (new AMessage)->postReply(mReplyID); } break; @@ -1046,7 +1048,9 @@ void MediaCodec::onMessageReceived(const sp &msg) { } if (mFlags & kFlagIsAsync) { - onInputBufferAvailable(); + if (!mHaveInputSurface) { + onInputBufferAvailable(); + } } else if (mFlags & kFlagDequeueInputPending) { CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); @@ -1130,6 +1134,7 @@ void MediaCodec::onMessageReceived(const sp &msg) { } else { CHECK_EQ(mState, RELEASING); setState(UNINITIALIZED); + mComponentName.clear(); } (new AMessage)->postReply(mReplyID); @@ -1339,12 +1344,12 @@ void MediaCodec::onMessageReceived(const sp &msg) { // after stop() returned, it would be safe to call release() // and it should be in this case, no harm to allow a release() // if we're already uninitialized. - // Similarly stopping a stopped MediaCodec should be benign. sp response = new AMessage; - response->setInt32( - "err", - mState == targetState ? OK : INVALID_OPERATION); - + status_t err = mState == targetState ? OK : INVALID_OPERATION; + response->setInt32("err", err); + if (err == OK && targetState == UNINITIALIZED) { + mComponentName.clear(); + } response->postReply(replyID); break; } @@ -1353,6 +1358,9 @@ void MediaCodec::onMessageReceived(const sp &msg) { // It's dead, Jim. Don't expect initiateShutdown to yield // any useful results now... setState(UNINITIALIZED); + if (targetState == UNINITIALIZED) { + mComponentName.clear(); + } (new AMessage)->postReply(replyID); break; } @@ -1745,8 +1753,6 @@ void MediaCodec::setState(State newState) { // return any straggling buffers, e.g. if we got here on an error returnBuffersToCodec(); - mComponentName.clear(); - // The component is gone, mediaserver's probably back up already // but should definitely be back up should we try to instantiate // another component.. and the cycle continues. -- cgit v1.1