summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/omx/OMXNodeInstance.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-01-25 14:55:00 -0800
committerAndreas Huber <andih@google.com>2011-01-26 12:04:06 -0800
commit43e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5 (patch)
tree8e838538b225b4e3d7787b4d52d3f3e4f91e5da8 /media/libstagefright/omx/OMXNodeInstance.cpp
parent78fc8fab70411c6863d5f71383061f51290294df (diff)
downloadframeworks_av-43e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5.zip
frameworks_av-43e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5.tar.gz
frameworks_av-43e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5.tar.bz2
More instrumentation to track down the hardware decoder not shutting down bug.
Change-Id: I3f31b6fdf5c90b436567bbce578dcbc4666ed7c2 related-to-bug: 3362836
Diffstat (limited to 'media/libstagefright/omx/OMXNodeInstance.cpp')
-rw-r--r--media/libstagefright/omx/OMXNodeInstance.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 9b6d441..c7c1409 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 0
#define LOG_TAG "OMXNodeInstance"
#include <utils/Log.h>
@@ -124,6 +124,8 @@ static status_t StatusFromOMXError(OMX_ERRORTYPE err) {
}
status_t OMXNodeInstance::freeNode(OMXMaster *master) {
+ static int32_t kMaxNumIterations = 10;
+
// Transition the node from its current state all the way down
// to "Loaded".
// This ensures that all active buffers are properly freed even
@@ -143,9 +145,16 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
LOGV("forcing Executing->Idle");
sendCommand(OMX_CommandStateSet, OMX_StateIdle);
OMX_ERRORTYPE err;
+ int32_t iteration = 0;
while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
&& state != OMX_StateIdle
&& state != OMX_StateInvalid) {
+ if (++iteration > kMaxNumIterations) {
+ LOGE("component failed to enter Idle state, aborting.");
+ state = OMX_StateInvalid;
+ break;
+ }
+
usleep(100000);
}
CHECK_EQ(err, OMX_ErrorNone);
@@ -165,9 +174,16 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
freeActiveBuffers();
OMX_ERRORTYPE err;
+ int32_t iteration = 0;
while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
&& state != OMX_StateLoaded
&& state != OMX_StateInvalid) {
+ if (++iteration > kMaxNumIterations) {
+ LOGE("component failed to enter Loaded state, aborting.");
+ state = OMX_StateInvalid;
+ break;
+ }
+
LOGV("waiting for Loaded state...");
usleep(100000);
}
@@ -185,8 +201,10 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) {
break;
}
+ LOGV("calling destroyComponentInstance");
OMX_ERRORTYPE err = master->destroyComponentInstance(
static_cast<OMX_COMPONENTTYPE *>(mHandle));
+ LOGV("destroyComponentInstance returned err %d", err);
mHandle = NULL;