vlc | branch: master | Martin Storsjö <[email protected]> | Fri Apr 13 18:01:20 2012 +0300| [010c77bdc3f80b44068bcb0ec9a96f36413baab9] | committer: Jean-Baptiste Kempf
omxil: Allocate the sentinel buffer dynamically 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. Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=010c77bdc3f80b44068bcb0ec9a96f36413baab9 --- modules/codec/omxil/omxil.c | 36 +++++++++++++++++++++++++++++------- modules/codec/omxil/omxil.h | 1 - 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c index 9a9f8da..80d327e 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,15 @@ 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 = calloc(1, sizeof(*sentinel)); + if (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; }; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
