summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Reufer <thomas@reufer.ch>2014-04-16 08:52:23 +0200
committerThomas Reufer <thomas@reufer.ch>2014-04-16 08:52:23 +0200
commitf0b7ff1f6b875034de8e6e03f12e0a905a5ed62a (patch)
treef8854aefce01c24d2c5b51cd2569a86521804241
parent3d21db9dcaa554ac1489ad380d20daa24901def5 (diff)
downloadvdr-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.c60
-rw-r--r--omx.h3
2 files changed, 53 insertions, 10 deletions
diff --git a/omx.c b/omx.c
index 727c770..c7ba90d 100644
--- a/omx.c
+++ b/omx.c
@@ -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;
}
diff --git a/omx.h b/omx.h
index 4036a99..e2e0f9e 100644
--- a/omx.h
+++ b/omx.h
@@ -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;