aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgimli <ebsi4711@gmail.com>2012-12-05 22:16:52 +0100
committergimli <ebsi4711@gmail.com>2012-12-05 22:16:52 +0100
commit066df752bf448982f083e303d65a9cf3cc86aa23 (patch)
treea0db8e704930e86cdaf9f02850e6238da36cd5d3
parentdc499a2c4f89effb8248bc26070bbe16e159a14a (diff)
[rbp] changed keep omx handle during component/class lifetime
-rw-r--r--xbmc/linux/OMXCore.cpp100
-rw-r--r--xbmc/linux/OMXCore.h7
2 files changed, 60 insertions, 47 deletions
diff --git a/xbmc/linux/OMXCore.cpp b/xbmc/linux/OMXCore.cpp
index 91f6acdb53..1a2539adc7 100644
--- a/xbmc/linux/OMXCore.cpp
+++ b/xbmc/linux/OMXCore.cpp
@@ -209,7 +209,7 @@ OMX_ERRORTYPE COMXCoreTunel::Deestablish(bool noWait)
return OMX_ErrorNone;
}
-OMX_ERRORTYPE COMXCoreTunel::Establish(bool portSettingsChanged)
+OMX_ERRORTYPE COMXCoreTunel::Establish(bool portSettingsChanged, bool enable_ports /* = true */)
{
if(!m_DllOMXOpen)
return OMX_ErrorUndefined;
@@ -287,7 +287,7 @@ OMX_ERRORTYPE COMXCoreTunel::Establish(bool portSettingsChanged)
m_tunnel_set = true;
- if(m_src_component->GetComponent())
+ if(m_src_component->GetComponent() && enable_ports)
{
omx_err = m_src_component->EnablePort(m_src_port, false);
if(omx_err != OMX_ErrorNone)
@@ -299,7 +299,7 @@ OMX_ERRORTYPE COMXCoreTunel::Establish(bool portSettingsChanged)
}
}
- if(m_dst_component->GetComponent())
+ if(m_dst_component->GetComponent() && enable_ports)
{
omx_err = m_dst_component->EnablePort(m_dst_port, false);
if(omx_err != OMX_ErrorNone)
@@ -311,17 +311,17 @@ OMX_ERRORTYPE COMXCoreTunel::Establish(bool portSettingsChanged)
}
}
- if(m_dst_component->GetComponent())
+ if(m_dst_component->GetComponent() && enable_ports)
{
- if(m_dst_component->GetState() == OMX_StateLoaded)
+ omx_err = m_dst_component->WaitForCommand(OMX_CommandPortEnable, m_dst_port);
+ if(omx_err != OMX_ErrorNone)
{
- omx_err = m_dst_component->WaitForCommand(OMX_CommandPortEnable, m_dst_port);
- if(omx_err != OMX_ErrorNone)
- {
- UnLock();
- return omx_err;
- }
+ UnLock();
+ return omx_err;
+ }
+ if(m_dst_component->GetState() == OMX_StateLoaded)
+ {
omx_err = m_dst_component->SetStateForComponent(OMX_StateIdle);
if(omx_err != OMX_ErrorNone)
{
@@ -331,18 +331,9 @@ OMX_ERRORTYPE COMXCoreTunel::Establish(bool portSettingsChanged)
return omx_err;
}
}
- else
- {
- omx_err = m_dst_component->WaitForCommand(OMX_CommandPortEnable, m_dst_port);
- if(omx_err != OMX_ErrorNone)
- {
- UnLock();
- return omx_err;
- }
- }
}
- if(m_src_component->GetComponent())
+ if(m_src_component->GetComponent() && enable_ports)
{
omx_err = m_src_component->WaitForCommand(OMX_CommandPortEnable, m_src_port);
if(omx_err != OMX_ErrorNone)
@@ -385,6 +376,7 @@ COMXCoreComponent::COMXCoreComponent()
pthread_mutex_init(&m_omx_input_mutex, NULL);
pthread_mutex_init(&m_omx_output_mutex, NULL);
pthread_mutex_init(&m_omx_event_mutex, NULL);
+ pthread_mutex_init(&m_omx_eos_mutex, NULL);
pthread_cond_init(&m_input_buffer_cond, NULL);
pthread_cond_init(&m_output_buffer_cond, NULL);
pthread_cond_init(&m_omx_event_cond, NULL);
@@ -404,11 +396,12 @@ COMXCoreComponent::COMXCoreComponent()
COMXCoreComponent::~COMXCoreComponent()
{
- Deinitialize();
+ Deinitialize(true);
pthread_mutex_destroy(&m_omx_input_mutex);
pthread_mutex_destroy(&m_omx_output_mutex);
pthread_mutex_destroy(&m_omx_event_mutex);
+ pthread_mutex_destroy(&m_omx_eos_mutex);
pthread_cond_destroy(&m_input_buffer_cond);
pthread_cond_destroy(&m_output_buffer_cond);
pthread_cond_destroy(&m_omx_event_cond);
@@ -1388,13 +1381,19 @@ bool COMXCoreComponent::Initialize( const std::string &component_name, OMX_INDEX
m_callbacks.FillBufferDone = &COMXCoreComponent::DecoderFillBufferDoneCallback;
// Get video component handle setting up callbacks, component is in loaded state on return.
- omx_err = m_DllOMX->OMX_GetHandle(&m_handle, (char*)component_name.c_str(), this, &m_callbacks);
- if (omx_err != OMX_ErrorNone)
+ if(!m_handle)
{
- CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - could not get component handle for %s omx_err(0x%08x)\n",
- component_name.c_str(), (int)omx_err);
- Deinitialize();
- return false;
+ omx_err = m_DllOMX->OMX_GetHandle(&m_handle, (char*)component_name.c_str(), this, &m_callbacks);
+ if (!m_handle || omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXCoreComponent::Initialize - could not get component handle for %s omx_err(0x%08x)\n",
+ component_name.c_str(), (int)omx_err);
+ Deinitialize(true);
+ return false;
+ }
+
+ CLog::Log(LOGDEBUG, "COMXCoreComponent::Initialize : %s handle 0x%08x dllopen : %d\n",
+ m_componentName.c_str(), m_handle, m_DllOMXOpen);
}
OMX_PORT_PARAM_TYPE port_param;
@@ -1441,7 +1440,14 @@ bool COMXCoreComponent::IsInitialized()
return (m_handle != NULL);
}
-bool COMXCoreComponent::Deinitialize()
+void COMXCoreComponent::ResetEos()
+{
+ pthread_mutex_lock(&m_omx_eos_mutex);
+ m_eos = false;
+ pthread_mutex_unlock(&m_omx_eos_mutex);
+}
+
+bool COMXCoreComponent::Deinitialize(bool free_component /* = false */)
{
OMX_ERRORTYPE omx_err;
@@ -1452,7 +1458,6 @@ bool COMXCoreComponent::Deinitialize()
if(m_handle && m_DllOMXOpen)
{
-
FlushAll();
FreeOutputBuffers();
@@ -1460,21 +1465,25 @@ bool COMXCoreComponent::Deinitialize()
TransitionToStateLoaded();
- omx_err = m_DllOMX->OMX_FreeHandle(m_handle);
- if (omx_err != OMX_ErrorNone)
+ if(free_component)
{
- CLog::Log(LOGERROR, "COMXCoreComponent::Deinitialize - failed to free handle for component %s omx_err(0x%08x)",
- m_componentName.c_str(), omx_err);
- }
-
- m_handle = NULL;
+ CLog::Log(LOGDEBUG, "COMXCoreComponent::Deinitialize : %s handle 0x%08x dllopen : %d\n",
+ m_componentName.c_str(), m_handle, m_DllOMXOpen);
+ omx_err = m_DllOMX->OMX_FreeHandle(m_handle);
+ if (omx_err != OMX_ErrorNone)
+ {
+ CLog::Log(LOGERROR, "COMXCoreComponent::Deinitialize - failed to free handle for component %s omx_err(0x%08x)",
+ m_componentName.c_str(), omx_err);
+ }
+ m_handle = NULL;
+
+ m_input_port = 0;
+ m_output_port = 0;
+ m_componentName = "";
+ m_resource_error = false;
+ }
}
- m_input_port = 0;
- m_output_port = 0;
- m_componentName = "";
- m_resource_error = false;
-
return true;
}
@@ -1652,7 +1661,11 @@ OMX_ERRORTYPE COMXCoreComponent::DecoderEventHandler(
CLog::Log(LOGDEBUG, "%s::%s %s - OMX_EventBufferFlag(input)\n", CLASSNAME, __func__, ctx->GetName().c_str());
#endif
if(nData2 & OMX_BUFFERFLAG_EOS)
+ {
+ pthread_mutex_lock(&ctx->m_omx_eos_mutex);
ctx->m_eos = true;
+ pthread_mutex_unlock(&ctx->m_omx_eos_mutex);
+ }
break;
case OMX_EventPortSettingsChanged:
#if defined(OMX_DEBUG_EVENTHANDLER)
@@ -1683,8 +1696,7 @@ OMX_ERRORTYPE COMXCoreComponent::DecoderEventHandler(
CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorFormatNotDetected, cannot parse input stream\n", CLASSNAME, __func__, ctx->GetName().c_str());
break;
case OMX_ErrorPortUnpopulated:
- if(ctx->GetName() != std::string("OMX.broadcom.audio_mixer"))
- CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorPortUnpopulated port %d, cannot parse input stream\n", CLASSNAME, __func__, ctx->GetName().c_str(), (int)nData2);
+ CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorPortUnpopulated port %d, cannot parse input stream\n", CLASSNAME, __func__, ctx->GetName().c_str(), (int)nData2);
break;
case OMX_ErrorStreamCorrupt:
CLog::Log(LOGERROR, "%s::%s %s - OMX_ErrorStreamCorrupt, Bitstream corrupt\n", CLASSNAME, __func__, ctx->GetName().c_str());
diff --git a/xbmc/linux/OMXCore.h b/xbmc/linux/OMXCore.h
index a602da9886..2ce7cde73f 100644
--- a/xbmc/linux/OMXCore.h
+++ b/xbmc/linux/OMXCore.h
@@ -74,7 +74,7 @@ public:
bool IsInitialized();
OMX_ERRORTYPE Flush();
OMX_ERRORTYPE Deestablish(bool noWait = false);
- OMX_ERRORTYPE Establish(bool portSettingsChanged);
+ OMX_ERRORTYPE Establish(bool portSettingsChanged, bool enable_ports = true);
private:
pthread_mutex_t m_lock;
bool m_portSettingsChanged;
@@ -118,7 +118,7 @@ public:
bool Initialize( const std::string &component_name, OMX_INDEXTYPE index);
bool IsInitialized();
- bool Deinitialize();
+ bool Deinitialize(bool free_component = false);
// OMXCore Decoder delegate callback routines.
static OMX_ERRORTYPE DecoderEventHandlerCallback(OMX_HANDLETYPE hComponent, OMX_PTR pAppData,
@@ -162,8 +162,8 @@ public:
OMX_ERRORTYPE FreeOutputBuffers();
bool IsEOS() { return m_eos; };
-
bool BadState() { return m_resource_error; };
+ void ResetEos();
private:
OMX_HANDLETYPE m_handle;
@@ -171,6 +171,7 @@ private:
unsigned int m_output_port;
std::string m_componentName;
pthread_mutex_t m_omx_event_mutex;
+ pthread_mutex_t m_omx_eos_mutex;
pthread_mutex_t m_lock;
std::vector<omx_event> m_omx_events;