diff options
author | popcornmix <popcornmix@gmail.com> | 2013-09-11 19:58:26 +0100 |
---|---|---|
committer | popcornmix <popcornmix@gmail.com> | 2013-10-06 17:47:29 +0100 |
commit | 379e045b2c01e3115abc2ee7fe1fe43b296b5d33 (patch) | |
tree | dae278c8c00ce0d45b9debc77745b9af8f3516c2 | |
parent | 183047bb99193f26ad53697ff54ab2bb196bc549 (diff) |
[rbp/omxplayer] Signal bad state on decode error
Also abort timeouts early when in bad state
-rw-r--r-- | xbmc/linux/OMXCore.cpp | 20 |
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); |