diff options
author | ywan171 <yi.a.wang@intel.com> | 2014-02-24 16:05:17 +0800 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:03:43 -0700 |
commit | 41e08b779bbfab77f59765aa470aa93e2d81b877 (patch) | |
tree | 86ac16e9cf92c1bcdfd6ade3c5eb0ba7a8995c30 /base | |
parent | 7cc9fbfc0cc668adf018b9d2d3f08c50724903c6 (diff) | |
download | wrs_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>
Diffstat (limited to 'base')
-rw-r--r-- | base/inc/portbase.h | 1 | ||||
-rw-r--r-- | base/src/componentbase.cpp | 5 | ||||
-rw-r--r-- | base/src/portbase.cpp | 36 |
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) { |