diff options
author | Dave Burke <daveburke@google.com> | 2011-10-19 22:38:45 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-10-19 22:38:45 -0700 |
commit | 1d2acaffde56ad79e6e96f228d7857863462397c (patch) | |
tree | e5e05f30fbca34668d58ff6e6b3199a4ab947e3b /media/libstagefright | |
parent | e6a823c276302b0c499d7a39956c1b731f23dd4c (diff) | |
parent | 55f4bc5c3d1acfaa735b8b19cf34b6b68f6cfcca (diff) | |
download | frameworks_av-1d2acaffde56ad79e6e96f228d7857863462397c.zip frameworks_av-1d2acaffde56ad79e6e96f228d7857863462397c.tar.gz frameworks_av-1d2acaffde56ad79e6e96f228d7857863462397c.tar.bz2 |
am 23d64420: Merge "Stagefright: idle OMX after ANW errors" into ics-mr0
* commit '23d644202a44383bf008ff86f6faa3ea7e447290':
Stagefright: idle OMX after ANW errors
Diffstat (limited to 'media/libstagefright')
-rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 21 | ||||
-rw-r--r-- | media/libstagefright/include/OMX.h | 3 | ||||
-rw-r--r-- | media/libstagefright/include/OMXNodeInstance.h | 2 | ||||
-rw-r--r-- | media/libstagefright/omx/OMX.cpp | 6 | ||||
-rw-r--r-- | media/libstagefright/omx/OMXNodeInstance.cpp | 8 |
5 files changed, 39 insertions, 1 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index f9cb882..7e55790 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -3618,11 +3618,24 @@ status_t OMXCodec::stop() { mAsyncCompletion.wait(mLock); } + bool isError = false; switch (mState) { case LOADED: - case ERROR: break; + case ERROR: + { + OMX_STATETYPE state = OMX_StateInvalid; + status_t err = mOMX->getState(mNode, &state); + CHECK_EQ(err, (status_t)OK); + + if (state != OMX_StateExecuting) { + break; + } + // else fall through to the idling code + isError = true; + } + case EXECUTING: { setState(EXECUTING_TO_IDLE); @@ -3657,6 +3670,12 @@ status_t OMXCodec::stop() { mAsyncCompletion.wait(mLock); } + if (isError) { + // We were in the ERROR state coming in, so restore that now + // that we've idled the OMX component. + setState(ERROR); + } + break; } diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h index d54b1c1..53e764f 100644 --- a/media/libstagefright/include/OMX.h +++ b/media/libstagefright/include/OMX.h @@ -59,6 +59,9 @@ public: node_id node, OMX_INDEXTYPE index, const void *params, size_t size); + virtual status_t getState( + node_id node, OMX_STATETYPE* state); + virtual status_t enableGraphicBuffers( node_id node, OMX_U32 port_index, OMX_BOOL enable); diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h index 1ccf50d..47ca579 100644 --- a/media/libstagefright/include/OMXNodeInstance.h +++ b/media/libstagefright/include/OMXNodeInstance.h @@ -49,6 +49,8 @@ struct OMXNodeInstance { status_t getConfig(OMX_INDEXTYPE index, void *params, size_t size); status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size); + status_t getState(OMX_STATETYPE* state); + status_t enableGraphicBuffers(OMX_U32 portIndex, OMX_BOOL enable); status_t getGraphicBufferUsage(OMX_U32 portIndex, OMX_U32* usage); diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index 33d3f30..3715fe9 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -303,6 +303,12 @@ status_t OMX::setConfig( index, params, size); } +status_t OMX::getState( + node_id node, OMX_STATETYPE* state) { + return findInstance(node)->getState( + state); +} + status_t OMX::enableGraphicBuffers( node_id node, OMX_U32 port_index, OMX_BOOL enable) { return findInstance(node)->enableGraphicBuffers(port_index, enable); diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index b612f89..0ff398a 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -266,6 +266,14 @@ status_t OMXNodeInstance::setConfig( return StatusFromOMXError(err); } +status_t OMXNodeInstance::getState(OMX_STATETYPE* state) { + Mutex::Autolock autoLock(mLock); + + OMX_ERRORTYPE err = OMX_GetState(mHandle, state); + + return StatusFromOMXError(err); +} + status_t OMXNodeInstance::enableGraphicBuffers( OMX_U32 portIndex, OMX_BOOL enable) { Mutex::Autolock autoLock(mLock); |