[vlc-devel] [PATCH 2/2] omxil: Allocate the sentinel buffer dynamically
Martin Storsjö
martin at martin.st
Fri Apr 13 17:01:20 CEST 2012
This avoids issues if there's more than one sentinel added
to a FIFO at the same time, since the FIFO is built as a
linked list.
Also use a custom buffer flag to mark sentinel buffers, to
avoid issues if a codec would set the EOS flag on returned
input buffers.
---
modules/codec/omxil/omxil.c | 37 ++++++++++++++++++++++++++++++-------
modules/codec/omxil/omxil.h | 1 -
2 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c
index 9a9f8da..84c8d20 100644
--- a/modules/codec/omxil/omxil.c
+++ b/modules/codec/omxil/omxil.c
@@ -52,6 +52,8 @@
//#define OMXIL_EXTRA_DEBUG
+#define SENTINEL_FLAG 0x10000
+
/*****************************************************************************
* List of OpenMAX IL core we will try in order
*****************************************************************************/
@@ -614,7 +616,8 @@ static OMX_ERRORTYPE DeinitialiseComponent(decoder_t *p_dec,
for(j = 0; j < p_port->i_buffers; j++)
{
OMX_FIFO_GET(&p_port->fifo, p_buffer);
- if (p_buffer == &p_sys->sentinel_buffer) {
+ if (p_buffer->nFlags & SENTINEL_FLAG) {
+ free(p_buffer);
j--;
continue;
}
@@ -625,6 +628,17 @@ static OMX_ERRORTYPE DeinitialiseComponent(decoder_t *p_dec,
}
CHECK_ERROR(omx_error, "OMX_FreeBuffer failed (%x, %i, %i)",
omx_error, (int)p_port->i_port_index, j );
+ while (1) {
+ OMX_FIFO_PEEK(&p_port->fifo, p_buffer);
+ if (!p_buffer) break;
+
+ OMX_FIFO_GET(&p_port->fifo, p_buffer);
+ if (p_buffer->nFlags & SENTINEL_FLAG) {
+ free(p_buffer);
+ continue;
+ }
+ msg_Warn( p_dec, "Stray buffer left in fifo, %p", p_buffer );
+ }
}
omx_error = WaitForSpecificOmxEvent(p_dec, OMX_EventCmdComplete, 0, 0, 0);
@@ -1092,7 +1106,8 @@ static OMX_ERRORTYPE PortReconfigure(decoder_t *p_dec, OmxPort *p_port)
for(i = 0; i < p_port->i_buffers; i++)
{
OMX_FIFO_GET(&p_port->fifo, p_buffer);
- if (p_buffer == &p_sys->sentinel_buffer) {
+ if (p_buffer->nFlags & SENTINEL_FLAG) {
+ free(p_buffer);
i--;
continue;
}
@@ -1270,8 +1285,10 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
/* Send the input buffer to the component */
OMX_FIFO_GET(&p_sys->in.fifo, p_header);
- if (p_header && p_header->nFlags & OMX_BUFFERFLAG_EOS)
+ if (p_header && p_header->nFlags & SENTINEL_FLAG) {
+ free(p_header);
goto reconfig;
+ }
if(p_header)
{
@@ -1438,8 +1455,10 @@ aout_buffer_t *DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
/* Send the input buffer to the component */
OMX_FIFO_GET(&p_sys->in.fifo, p_header);
- if (p_header && p_header->nFlags & OMX_BUFFERFLAG_EOS)
+ if (p_header && p_header->nFlags & SENTINEL_FLAG) {
+ free(p_header);
goto reconfig;
+ }
if(p_header)
{
@@ -1656,12 +1675,16 @@ static OMX_ERRORTYPE OmxEventHandler( OMX_HANDLETYPE omx_handle,
(unsigned int)data_1, (unsigned int)data_2 );
if( data_2 == 0 || data_2 == OMX_IndexParamPortDefinition )
{
+ OMX_BUFFERHEADERTYPE *sentinel;
for(i = 0; i < p_sys->ports; i++)
if(p_sys->p_ports[i].definition.eDir == OMX_DirOutput)
p_sys->p_ports[i].b_reconfigure = true;
- memset(&p_sys->sentinel_buffer, 0, sizeof(p_sys->sentinel_buffer));
- p_sys->sentinel_buffer.nFlags = OMX_BUFFERFLAG_EOS;
- OMX_FIFO_PUT(&p_sys->in.fifo, &p_sys->sentinel_buffer);
+ sentinel = malloc(sizeof(*sentinel));
+ if (sentinel) {
+ memset(sentinel, 0, sizeof(*sentinel));
+ sentinel->nFlags = SENTINEL_FLAG;
+ OMX_FIFO_PUT(&p_sys->in.fifo, sentinel);
+ }
}
else if( data_2 == OMX_IndexConfigCommonOutputCrop )
{
diff --git a/modules/codec/omxil/omxil.h b/modules/codec/omxil/omxil.h
index 649ba65..159d1d9 100644
--- a/modules/codec/omxil/omxil.h
+++ b/modules/codec/omxil/omxil.h
@@ -105,5 +105,4 @@ struct decoder_sys_t
int i_nal_size_length; /* Length of the NAL size field for H264 */
int b_use_pts;
- OMX_BUFFERHEADERTYPE sentinel_buffer;
};
--
1.7.9
More information about the vlc-devel
mailing list