diff options
author | Thomas Reufer <thomas@reufer.ch> | 2014-04-16 08:52:23 +0200 |
---|---|---|
committer | Thomas Reufer <thomas@reufer.ch> | 2014-04-16 08:52:23 +0200 |
commit | f0b7ff1f6b875034de8e6e03f12e0a905a5ed62a (patch) | |
tree | f8854aefce01c24d2c5b51cd2569a86521804241 | |
parent | 3d21db9dcaa554ac1489ad380d20daa24901def5 (diff) | |
download | vdr-plugin-rpihddevice-f0b7ff1f6b875034de8e6e03f12e0a905a5ed62a.tar.gz vdr-plugin-rpihddevice-f0b7ff1f6b875034de8e6e03f12e0a905a5ed62a.tar.bz2 |
maintain list of rejected OMX buffers for later usage or proper buffer disabling
-rw-r--r-- | omx.c | 60 | ||||
-rw-r--r-- | omx.h | 3 |
2 files changed, 53 insertions, 10 deletions
@@ -317,6 +317,8 @@ cOmx::cOmx() : m_setVideoDiscontinuity(false), m_freeAudioBuffers(true), m_freeVideoBuffers(true), + m_spareAudioBuffers(0), + m_spareVideoBuffers(0), m_clockReference(eClockRefNone), m_clockScale(0), m_portEvents(new cOmxEvents()), @@ -783,8 +785,10 @@ void cOmx::StopVideo(void) ilclient_change_component_state(m_comp[eVideoRender], OMX_StateIdle); // disable port buffers and allow video decoder to reconfig - ilclient_disable_port_buffers(m_comp[eVideoDecoder], 130, NULL, NULL, NULL); + ilclient_disable_port_buffers(m_comp[eVideoDecoder], 130, + m_spareVideoBuffers, NULL, NULL); + m_spareVideoBuffers = 0; m_videoWidth = 0; m_videoHeight = 0; m_videoInterlaced = false; @@ -796,7 +800,10 @@ void cOmx::StopAudio(void) ilclient_flush_tunnels(&m_tun[eClockToAudioRender], 1); ilclient_disable_tunnel(&m_tun[eClockToAudioRender]); ilclient_change_component_state(m_comp[eAudioRender], OMX_StateIdle); - ilclient_disable_port_buffers(m_comp[eAudioRender], 100, NULL, NULL, NULL); + ilclient_disable_port_buffers(m_comp[eAudioRender], 100, + m_spareAudioBuffers, NULL, NULL); + + m_spareAudioBuffers = 0; } void cOmx::SetVideoDataUnitType(eDataUnitType dataUnitType) @@ -1091,8 +1098,16 @@ OMX_BUFFERHEADERTYPE* cOmx::GetAudioBuffer(uint64_t pts) { Lock(); - OMX_BUFFERHEADERTYPE* buf = - ilclient_get_input_buffer(m_comp[eAudioRender], 100, 0); + OMX_BUFFERHEADERTYPE* buf = 0; + if (m_spareAudioBuffers) + { + buf = m_spareAudioBuffers; + m_spareAudioBuffers = + static_cast <OMX_BUFFERHEADERTYPE*>(buf->pAppPrivate); + buf->pAppPrivate = 0; + } + else + buf = ilclient_get_input_buffer(m_comp[eAudioRender], 100, 0); if (buf) { @@ -1111,8 +1126,17 @@ OMX_BUFFERHEADERTYPE* cOmx::GetAudioBuffer(uint64_t pts) OMX_BUFFERHEADERTYPE* cOmx::GetVideoBuffer(uint64_t pts) { Lock(); - OMX_BUFFERHEADERTYPE* buf = - ilclient_get_input_buffer(m_comp[eVideoDecoder], 130, 0); + + OMX_BUFFERHEADERTYPE* buf = 0; + if (m_spareVideoBuffers) + { + buf = m_spareVideoBuffers; + m_spareVideoBuffers = + static_cast <OMX_BUFFERHEADERTYPE*>(buf->pAppPrivate); + buf->pAppPrivate = 0; + } + else + buf = ilclient_get_input_buffer(m_comp[eVideoDecoder], 130, 0); if (buf) { @@ -1136,8 +1160,16 @@ bool cOmx::EmptyAudioBuffer(OMX_BUFFERHEADERTYPE *buf) if (!buf) return false; - return (OMX_EmptyThisBuffer(ILC_GET_HANDLE(m_comp[eAudioRender]), buf) - == OMX_ErrorNone); + if (OMX_EmptyThisBuffer(ILC_GET_HANDLE(m_comp[eAudioRender]), buf) + != OMX_ErrorNone) + { + buf->nFilledLen = 0; + buf->pAppPrivate = m_spareAudioBuffers; + m_spareAudioBuffers = buf; + return false; + } + + return true; } bool cOmx::EmptyVideoBuffer(OMX_BUFFERHEADERTYPE *buf) @@ -1145,6 +1177,14 @@ bool cOmx::EmptyVideoBuffer(OMX_BUFFERHEADERTYPE *buf) if (!buf) return false; - return (OMX_EmptyThisBuffer(ILC_GET_HANDLE(m_comp[eVideoDecoder]), buf) - == OMX_ErrorNone); + if (OMX_EmptyThisBuffer(ILC_GET_HANDLE(m_comp[eVideoDecoder]), buf) + != OMX_ErrorNone) + { + buf->nFilledLen = 0; + buf->pAppPrivate = m_spareVideoBuffers; + m_spareVideoBuffers = buf; + return false; + } + + return true; } @@ -138,6 +138,9 @@ private: bool m_freeAudioBuffers; bool m_freeVideoBuffers; + OMX_BUFFERHEADERTYPE* m_spareAudioBuffers; + OMX_BUFFERHEADERTYPE* m_spareVideoBuffers; + eClockReference m_clockReference; OMX_S32 m_clockScale; |