aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpopcornmix <popcornmix@gmail.com>2013-09-11 19:58:26 +0100
committerpopcornmix <popcornmix@gmail.com>2013-10-06 17:47:29 +0100
commit379e045b2c01e3115abc2ee7fe1fe43b296b5d33 (patch)
treedae278c8c00ce0d45b9debc77745b9af8f3516c2
parent183047bb99193f26ad53697ff54ab2bb196bc549 (diff)
[rbp/omxplayer] Signal bad state on decode error
Also abort timeouts early when in bad state
-rw-r--r--xbmc/linux/OMXCore.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/xbmc/linux/OMXCore.cpp b/xbmc/linux/OMXCore.cpp
index 4fc2fc163e..7497aa7a46 100644
--- a/xbmc/linux/OMXCore.cpp
+++ b/xbmc/linux/OMXCore.cpp
@@ -578,6 +578,8 @@ OMX_BUFFERHEADERTYPE *COMXCoreComponent::GetInputBuffer(long timeout /*=200*/)
add_timespecs(endtime, timeout);
while (!m_flush_input)
{
+ if (m_resource_error)
+ break;
if(!m_omx_input_avaliable.empty())
{
omx_input_buffer = m_omx_input_avaliable.front();
@@ -609,6 +611,8 @@ OMX_BUFFERHEADERTYPE *COMXCoreComponent::GetOutputBuffer(long timeout /*=200*/)
add_timespecs(endtime, timeout);
while (!m_flush_output)
{
+ if (m_resource_error)
+ break;
if(!m_omx_output_available.empty())
{
omx_output_buffer = m_omx_output_available.front();
@@ -638,6 +642,8 @@ OMX_ERRORTYPE COMXCoreComponent::WaitForInputDone(long timeout /*=200*/)
add_timespecs(endtime, timeout);
while (m_input_buffer_count != m_omx_input_avaliable.size())
{
+ if (m_resource_error)
+ break;
int retcode = pthread_cond_timedwait(&m_input_buffer_cond, &m_omx_input_mutex, &endtime);
if (retcode != 0) {
if (timeout != 0)
@@ -661,6 +667,8 @@ OMX_ERRORTYPE COMXCoreComponent::WaitForOutputDone(long timeout /*=200*/)
add_timespecs(endtime, timeout);
while (m_output_buffer_count != m_omx_output_available.size())
{
+ if (m_resource_error)
+ break;
int retcode = pthread_cond_timedwait(&m_output_buffer_cond, &m_omx_output_mutex, &endtime);
if (retcode != 0) {
if (timeout != 0)
@@ -1075,6 +1083,8 @@ OMX_ERRORTYPE COMXCoreComponent::WaitForEvent(OMX_EVENTTYPE eventType, long time
}
}
+ if (m_resource_error)
+ break;
int retcode = pthread_cond_timedwait(&m_omx_event_cond, &m_omx_event_mutex, &endtime);
if (retcode != 0)
{
@@ -1142,6 +1152,8 @@ OMX_ERRORTYPE COMXCoreComponent::WaitForCommand(OMX_U32 command, OMX_U32 nData2,
}
}
+ if (m_resource_error)
+ break;
int retcode = pthread_cond_timedwait(&m_omx_event_cond, &m_omx_event_mutex, &endtime);
if (retcode != 0) {
CLog::Log(LOGERROR, "COMXCoreComponent::WaitForCommand %s wait timeout event.eEvent 0x%08x event.command 0x%08x event.nData2 %d\n",
@@ -1769,6 +1781,7 @@ OMX_ERRORTYPE COMXCoreComponent::DecoderEventHandler(
break;
case OMX_ErrorStreamCorrupt:
CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorStreamCorrupt, Bitstream corrupt\n", CLASSNAME, __func__, GetName().c_str());
+ m_resource_error = true;
break;
case OMX_ErrorUnsupportedSetting:
CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorUnsupportedSetting, unsupported setting\n", CLASSNAME, __func__, GetName().c_str());
@@ -1777,6 +1790,13 @@ OMX_ERRORTYPE COMXCoreComponent::DecoderEventHandler(
CLog::Log(LOGERROR, "%s::%s %s - OMX_EventError detected, nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), nData1, (int)nData2);
break;
}
+ // wake things up
+ if (m_resource_error)
+ {
+ pthread_cond_broadcast(&m_output_buffer_cond);
+ pthread_cond_broadcast(&m_input_buffer_cond);
+ pthread_cond_broadcast(&m_omx_event_cond);
+ }
break;
default:
CLog::Log(LOGWARNING, "%s::%s %s - Unknown eEvent(0x%x), nData1(0x%x), port %d\n", CLASSNAME, __func__, GetName().c_str(), eEvent, nData1, (int)nData2);