aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorywan171 <yi.a.wang@intel.com>2014-02-24 16:05:17 +0800
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:03:43 -0700
commit41e08b779bbfab77f59765aa470aa93e2d81b877 (patch)
tree86ac16e9cf92c1bcdfd6ade3c5eb0ba7a8995c30
parent7cc9fbfc0cc668adf018b9d2d3f08c50724903c6 (diff)
downloadwrs_omxil_core-41e08b779bbfab77f59765aa470aa93e2d81b877.tar.gz
wrs_core: add timeout waitevent in video decoder to avoid dead lock when state changes from disable to enable
BZ: 164253 When output port state changes from disable to enable, the HAL will wait gralloc buffers set from OMX client. If dequeuebuffer fails in omx client, the video decoder HAL will fall into dead wait, and error will occur in destroying OMX node. add timeout waitevent in wrs_core for video decoder to avoid dead lock Change-Id: I604ca37879d95bfd5cdfc2512043c1c60a74d415 Signed-off-by: ywan171 <yi.a.wang@intel.com>
-rw-r--r--base/inc/portbase.h1
-rw-r--r--base/src/componentbase.cpp5
-rw-r--r--base/src/portbase.cpp36
3 files changed, 38 insertions, 4 deletions
diff --git a/base/inc/portbase.h b/base/inc/portbase.h
index 01cc20c..e0fd99f 100644
--- a/base/inc/portbase.h
+++ b/base/inc/portbase.h
@@ -88,6 +88,7 @@ public:
*/
void WaitPortBufferCompletion(void);
+ OMX_ERRORTYPE WaitPortBufferCompletionTimeout(int64_t mSec);
/* Empty/FillThisBuffer */
OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
OMX_BUFFERHEADERTYPE *PopBuffer(void);
diff --git a/base/src/componentbase.cpp b/base/src/componentbase.cpp
index ff68212..e1ef01a 100644
--- a/base/src/componentbase.cpp
+++ b/base/src/componentbase.cpp
@@ -1696,13 +1696,12 @@ void ComponentBase::TransStatePort(OMX_U32 port_index, OMX_U8 state)
data1 = OMX_CommandPortDisable;
}
data2 = i;
- }
- else {
+ } else {
event = OMX_EventError;
data1 = ret;
data2 = 0;
}
- callbacks->EventHandler(handle, appdata, OMX_EventCmdComplete,
+ callbacks->EventHandler(handle, appdata, event,
data1, data2, NULL);
}
pthread_mutex_unlock(&ports_block);
diff --git a/base/src/portbase.cpp b/base/src/portbase.cpp
index d6ca009..7f49980 100644
--- a/base/src/portbase.cpp
+++ b/base/src/portbase.cpp
@@ -579,6 +579,32 @@ void PortBase::WaitPortBufferCompletion(void)
pthread_mutex_unlock(&hdrs_lock);
}
+OMX_ERRORTYPE PortBase::WaitPortBufferCompletionTimeout(int64_t milliseconds)
+{
+ int rc = 0;
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ pthread_mutex_lock(&hdrs_lock);
+ if (!buffer_hdrs_completion) {
+ LOGV("%s(): %s:%s:PortIndex %lu: wait for buffer header completion\n",
+ __FUNCTION__, cbase->GetName(), cbase->GetWorkingRole(),
+ portdefinition.nPortIndex);
+ struct timespec tv;
+ clock_gettime(CLOCK_REALTIME, &tv);
+ tv.tv_sec += milliseconds/1000;
+ tv.tv_nsec+= (milliseconds%1000) * 1000000;
+ rc = pthread_cond_timedwait(&hdrs_wait, &hdrs_lock, &tv);
+ }
+ if (rc == ETIMEDOUT) {
+ LOGE("%s(): %s:%s:PortIndex %lu: wokeup (buffer header timeout)\n",
+ __FUNCTION__, cbase->GetName(), cbase->GetWorkingRole(),
+ portdefinition.nPortIndex);
+ ret = OMX_ErrorTimeout;
+ }
+ buffer_hdrs_completion = !buffer_hdrs_completion;
+ pthread_mutex_unlock(&hdrs_lock);
+ return ret;
+}
+
/* Empty/FillThisBuffer */
OMX_ERRORTYPE PortBase::PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer)
{
@@ -990,7 +1016,15 @@ OMX_ERRORTYPE PortBase::TransState(OMX_U8 transition)
}
if (transition == OMX_PortEnabled) {
- WaitPortBufferCompletion();
+ if (cbase->GetWorkingRole() != NULL &&
+ !strncmp (cbase->GetWorkingRole(),"video_decoder", 13 )) {
+ ret = WaitPortBufferCompletionTimeout(800); //0.8s timeout
+ if (ret != OMX_ErrorNone) {
+ goto unlock;
+ }
+ } else {
+ WaitPortBufferCompletion();
+ }
portdefinition.bEnabled = OMX_TRUE;
}
else if(transition == OMX_PortDisabled) {