diff options
author | Andy Hung <hunga@google.com> | 2014-08-08 16:12:22 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-08-07 17:50:16 +0000 |
commit | 317bb9163befccd87348c11bdfc0044e629b362b (patch) | |
tree | ae1fc56615f47aa115cf8235ddfb02d444bbf3d2 /media/libstagefright/MediaCodec.cpp | |
parent | 1198a3394a21d3c31b19395b124c77f09a8f0924 (diff) | |
parent | 251d4be8aa5ab80bc915a82a2420233bdc62018e (diff) | |
download | frameworks_av-317bb9163befccd87348c11bdfc0044e629b362b.zip frameworks_av-317bb9163befccd87348c11bdfc0044e629b362b.tar.gz frameworks_av-317bb9163befccd87348c11bdfc0044e629b362b.tar.bz2 |
Merge "Clarify and implement MediaCodec status codes" into lmp-dev
Diffstat (limited to 'media/libstagefright/MediaCodec.cpp')
-rw-r--r-- | media/libstagefright/MediaCodec.cpp | 114 |
1 files changed, 78 insertions, 36 deletions
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index a67a933..42691b9 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -113,24 +113,26 @@ void MediaCodec::BatteryNotifier::noteStopAudio() { } // static sp<MediaCodec> MediaCodec::CreateByType( - const sp<ALooper> &looper, const char *mime, bool encoder) { + const sp<ALooper> &looper, const char *mime, bool encoder, status_t *err) { sp<MediaCodec> codec = new MediaCodec(looper); - if (codec->init(mime, true /* nameIsType */, encoder) != OK) { - return NULL; - } - return codec; + const status_t ret = codec->init(mime, true /* nameIsType */, encoder); + if (err != NULL) { + *err = ret; + } + return ret == OK ? codec : NULL; // NULL deallocates codec. } // static sp<MediaCodec> MediaCodec::CreateByComponentName( - const sp<ALooper> &looper, const char *name) { + const sp<ALooper> &looper, const char *name, status_t *err) { sp<MediaCodec> codec = new MediaCodec(looper); - if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { - return NULL; - } - return codec; + const status_t ret = codec->init(name, false /* nameIsType */, false /* encoder */); + if (err != NULL) { + *err = ret; + } + return ret == OK ? codec : NULL; // NULL deallocates codec. } MediaCodec::MediaCodec(const sp<ALooper> &looper) @@ -139,6 +141,7 @@ MediaCodec::MediaCodec(const sp<ALooper> &looper) mCodec(NULL), mReplyID(0), mFlags(0), + mStickyError(OK), mSoftRenderer(NULL), mBatteryStatNotified(false), mIsVideo(false), @@ -330,6 +333,7 @@ status_t MediaCodec::reset() { mLooper->unregisterHandler(id()); mFlags = 0; // clear all flags + mStickyError = OK; // reset state not reset by setState(UNINITIALIZED) mReplyID = 0; @@ -620,10 +624,12 @@ void MediaCodec::cancelPendingDequeueOperations() { bool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { if (!isExecuting() || (mFlags & kFlagIsAsync) - || (mFlags & kFlagStickyError) || (newRequest && (mFlags & kFlagDequeueInputPending))) { PostReplyWithError(replyID, INVALID_OPERATION); return true; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + return true; } ssize_t index = dequeuePortBuffer(kPortIndexInput); @@ -644,9 +650,10 @@ bool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { sp<AMessage> response = new AMessage; if (!isExecuting() || (mFlags & kFlagIsAsync) - || (mFlags & kFlagStickyError) || (newRequest && (mFlags & kFlagDequeueOutputPending))) { response->setInt32("err", INVALID_OPERATION); + } else if (mFlags & kFlagStickyError) { + response->setInt32("err", getStickyError()); } else if (mFlags & kFlagOutputBuffersChanged) { response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); mFlags &= ~kFlagOutputBuffersChanged; @@ -705,16 +712,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { switch (what) { case CodecBase::kWhatError: { - int32_t omxError, internalError; - CHECK(msg->findInt32("omx-error", &omxError)); - CHECK(msg->findInt32("err", &internalError)); + int32_t err, actionCode; + CHECK(msg->findInt32("err", &err)); + CHECK(msg->findInt32("actionCode", &actionCode)); - ALOGE("Codec reported an error. " - "(omx error 0x%08x, internalError %d)", - omxError, internalError); - - if (omxError == OMX_ErrorResourcesLost - && internalError == DEAD_OBJECT) { + ALOGE("Codec reported err %#x, actionCode %d", err, actionCode); + if (err == DEAD_OBJECT) { mFlags |= kFlagSawMediaServerDie; } @@ -774,15 +777,24 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { { sendErrorReponse = false; - mFlags |= kFlagStickyError; + setStickyError(err); postActivityNotificationIfPossible(); cancelPendingDequeueOperations(); if (mFlags & kFlagIsAsync) { - onError(omxError, 0); + onError(err, actionCode); + } + switch (actionCode) { + case ACTION_CODE_TRANSIENT: + break; + case ACTION_CODE_RECOVERABLE: + setState(INITIALIZED); + break; + default: + setState(UNINITIALIZED); + break; } - setState(UNINITIALIZED); break; } @@ -790,19 +802,32 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { { sendErrorReponse = false; - mFlags |= kFlagStickyError; + setStickyError(err); postActivityNotificationIfPossible(); + // actionCode in an uninitialized state is always fatal. + if (mState == UNINITIALIZED) { + actionCode = ACTION_CODE_FATAL; + } if (mFlags & kFlagIsAsync) { - onError(omxError, 0); + onError(err, actionCode); + } + switch (actionCode) { + case ACTION_CODE_TRANSIENT: + break; + case ACTION_CODE_RECOVERABLE: + setState(INITIALIZED); + break; + default: + setState(UNINITIALIZED); + break; } - setState(UNINITIALIZED); break; } } if (sendErrorReponse) { - PostReplyWithError(mReplyID, UNKNOWN_ERROR); + PostReplyWithError(mReplyID, err); } break; } @@ -1009,7 +1034,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { ALOGE("queueCSDInputBuffer failed w/ error %d", err); - mFlags |= kFlagStickyError; + setStickyError(err); postActivityNotificationIfPossible(); cancelPendingDequeueOperations(); @@ -1401,9 +1426,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); - if (!isExecuting() || (mFlags & kFlagStickyError)) { + if (!isExecuting()) { PostReplyWithError(replyID, INVALID_OPERATION); break; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + break; } status_t err = onQueueInputBuffer(msg); @@ -1472,9 +1500,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); - if (!isExecuting() || (mFlags & kFlagStickyError)) { + if (!isExecuting()) { PostReplyWithError(replyID, INVALID_OPERATION); break; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + break; } status_t err = onReleaseOutputBuffer(msg); @@ -1488,9 +1519,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); - if (!isExecuting() || (mFlags & kFlagStickyError)) { + if (!isExecuting()) { PostReplyWithError(replyID, INVALID_OPERATION); break; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + break; } mReplyID = replyID; @@ -1503,10 +1537,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); - if (!isExecuting() || (mFlags & kFlagIsAsync) - || (mFlags & kFlagStickyError)) { + if (!isExecuting() || (mFlags & kFlagIsAsync)) { PostReplyWithError(replyID, INVALID_OPERATION); break; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + break; } int32_t portIndex; @@ -1535,9 +1571,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { uint32_t replyID; CHECK(msg->senderAwaitsResponse(&replyID)); - if (!isExecuting() || (mFlags & kFlagStickyError)) { + if (!isExecuting()) { PostReplyWithError(replyID, INVALID_OPERATION); break; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + break; } mReplyID = replyID; @@ -1561,10 +1600,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { if ((mState != CONFIGURED && mState != STARTING && mState != STARTED && mState != FLUSHING && mState != FLUSHED) - || (mFlags & kFlagStickyError) || format == NULL) { PostReplyWithError(replyID, INVALID_OPERATION); break; + } else if (mFlags & kFlagStickyError) { + PostReplyWithError(replyID, getStickyError()); + break; } sp<AMessage> response = new AMessage; @@ -1687,6 +1728,7 @@ void MediaCodec::setState(State newState) { mFlags &= ~kFlagIsEncoder; mFlags &= ~kFlagGatherCodecSpecificData; mFlags &= ~kFlagIsAsync; + mStickyError = OK; mActivityNotify.clear(); mCallback.clear(); |