summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2014-10-10 03:05:40 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-10-10 03:05:40 +0000
commita4c3d8f0f9aab53b106d95e6139e0465908909f4 (patch)
treee5aa086d5a7f2b5598610c8ebbb7eaa9af6cfe42 /media
parent185a295d4518878d5e2bca7b7c3e51df44492df1 (diff)
parent6e029f0ba9a3b421eb7273a095305f7998e9aa5a (diff)
downloadframeworks_av-a4c3d8f0f9aab53b106d95e6139e0465908909f4.zip
frameworks_av-a4c3d8f0f9aab53b106d95e6139e0465908909f4.tar.gz
frameworks_av-a4c3d8f0f9aab53b106d95e6139e0465908909f4.tar.bz2
Merge "MediaCodec: fix onError and onInputBufferAvailable" into lmp-dev
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/MediaCodec.cpp24
1 files changed, 15 insertions, 9 deletions
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<AMessage> &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<AMessage> &msg) {
}
if (mFlags & kFlagIsAsync) {
- onInputBufferAvailable();
+ if (!mHaveInputSurface) {
+ onInputBufferAvailable();
+ }
} else if (mFlags & kFlagDequeueInputPending) {
CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
@@ -1130,6 +1134,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
} else {
CHECK_EQ(mState, RELEASING);
setState(UNINITIALIZED);
+ mComponentName.clear();
}
(new AMessage)->postReply(mReplyID);
@@ -1339,12 +1344,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &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<AMessage> 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<AMessage> &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.