[vlc-devel] [PATCH 3/3] omxil: move input handling into DecodeVideoInput

Thomas Guillem thomas.guillem at gmail.com
Fri Jul 11 00:01:53 CEST 2014


OK, that should do it. "i_input_used" is passed recursively.

But I think I just spotted a bug (not introduced by my patch, I hope ?).
What happens if OMX_FIFO_GET_TIMEOUT does timeout the next time when
i_input_used is != 0 ?
I think DecodeVideo will return and will be called again but with the same
p_block and with i_input_used = 0.
I think we should use something like i_last_input_used in OmxPort struct,
in order to save the p_block offset across several calls of DecodeVideo.

I you agree, I'll propose an other patch.


On Thu, Jul 10, 2014 at 11:53 PM, Thomas Guillem <thomas.guillem at gmail.com>
wrote:

> From: Thomas Guillem <guillem at archos.com>
>
> ---
>  modules/codec/omxil/omxil.c | 137
> ++++++++++++++++++++++++--------------------
>  1 file changed, 75 insertions(+), 62 deletions(-)
>
> diff --git a/modules/codec/omxil/omxil.c b/modules/codec/omxil/omxil.c
> index 99e6d2a..f67b526 100644
> --- a/modules/codec/omxil/omxil.c
> +++ b/modules/codec/omxil/omxil.c
> @@ -1268,72 +1268,23 @@ error:
>      return -1;
>  }
>
>
> -/*****************************************************************************
> - * DecodeVideo: Called to decode one frame
> -
> *****************************************************************************/
> -static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
> +static int DecodeVideoInput( decoder_t *p_dec, OmxPort *p_port, block_t
> **pp_block,
> +                             unsigned int i_input_used, bool *p_reconfig )
>  {
>      decoder_sys_t *p_sys = p_dec->p_sys;
> -    picture_t *p_pic = NULL;
> -    OMX_ERRORTYPE omx_error;
> -    unsigned int i;
> -
>      OMX_BUFFERHEADERTYPE *p_header;
> -    block_t *p_block;
> -    unsigned int i_input_used = 0;
>      struct H264ConvertState convert_state = { 0, 0 };
> +    block_t *p_block = *pp_block;
>
> -    if( !pp_block || !*pp_block )
> -        return NULL;
> -
> -    p_block = *pp_block;
> -
> -    /* Check for errors from codec */
> -    if(p_sys->b_error)
> -    {
> -        msg_Dbg(p_dec, "error during decoding");
> -        block_Release( p_block );
> -        return 0;
> -    }
> -
> -    if( p_block->i_flags &
> (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
> -    {
> -        block_Release( p_block );
> -        if(!p_sys->in.b_flushed)
> -        {
> -            msg_Dbg(p_dec, "flushing");
> -            OMX_SendCommand( p_sys->omx_handle, OMX_CommandFlush,
> -                             p_sys->in.definition.nPortIndex, 0 );
> -        }
> -        p_sys->in.b_flushed = true;
> -        return NULL;
> -    }
> -
> -    /* Use the aspect ratio provided by the input (ie read from
> packetizer).
> -     * In case the we get aspect ratio info from the decoder (as in the
> -     * broadcom OMX implementation on RPi), don't let the packetizer
> values
> -     * override what the decoder says, if anything - otherwise always
> update
> -     * even if it already is set (since it can change within a stream). */
> -    if((p_dec->fmt_in.video.i_sar_num != 0 &&
> p_dec->fmt_in.video.i_sar_den != 0) &&
> -       (p_dec->fmt_out.video.i_sar_num == 0 ||
> p_dec->fmt_out.video.i_sar_den == 0 ||
> -             !p_sys->b_aspect_ratio_handled))
> -    {
> -        p_dec->fmt_out.video.i_sar_num = p_dec->fmt_in.video.i_sar_num;
> -        p_dec->fmt_out.video.i_sar_den = p_dec->fmt_in.video.i_sar_den;
> -    }
> -
> -    /* Take care of decoded frames first */
> -    if( DecodeVideoOutput( p_dec, &p_sys->out, &p_pic ) != 0 )
> -        goto error;
> -
> -more_input:
>      /* Send the input buffer to the component */
> -    OMX_FIFO_GET_TIMEOUT(&p_sys->in.fifo, p_header, 200000);
> +    OMX_FIFO_GET_TIMEOUT(&p_port->fifo, p_header, 200000);
>
>      if (p_header && p_header->nFlags & SENTINEL_FLAG) {
>          free(p_header);
> -        goto reconfig;
> +        *p_reconfig = true;
> +        return 0;
>      }
> +    *p_reconfig = false;
>
>      if(p_header)
>      {
> @@ -1348,7 +1299,7 @@ more_input:
>
>          /* In direct mode we pass the input pointer as is.
>           * Otherwise we memcopy the data */
> -        if(p_sys->in.b_direct)
> +        if(p_port->b_direct)
>          {
>              p_header->pOutputPortPrivate = p_header->pBuffer;
>              p_header->pBuffer = p_block->p_buffer;
> @@ -1383,19 +1334,81 @@ more_input:
>          msg_Dbg( p_dec, "EmptyThisBuffer %p, %p, %i, %"PRId64, p_header,
> p_header->pBuffer,
>                   (int)p_header->nFilledLen,
> FromOmxTicks(p_header->nTimeStamp) );
>  #endif
> -        OMX_EmptyThisBuffer(p_sys->omx_handle, p_header);
> -        p_sys->in.b_flushed = false;
> +        OMX_EmptyThisBuffer(p_port->omx_handle, p_header);
> +        p_port->b_flushed = false;
>          if (decode_more)
> -            goto more_input;
> +            return DecodeVideoInput( p_dec, p_port, pp_block,
> i_input_used,
> +                                     p_reconfig );
>          else
>              *pp_block = NULL; /* Avoid being fed the same packet again */
>      }
>
> +    return 0;
> +}
> +
>
> +/*****************************************************************************
> + * DecodeVideo: Called to decode one frame
> +
> *****************************************************************************/
> +static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
> +{
> +    decoder_sys_t *p_sys = p_dec->p_sys;
> +    picture_t *p_pic = NULL;
> +    OMX_ERRORTYPE omx_error;
> +    unsigned int i;
> +    bool b_reconfig;
> +    block_t *p_block;
> +
> +    if( !pp_block || !*pp_block )
> +        return NULL;
> +
> +    p_block = *pp_block;
> +
> +    /* Check for errors from codec */
> +    if(p_sys->b_error)
> +    {
> +        msg_Dbg(p_dec, "error during decoding");
> +        block_Release( p_block );
> +        return 0;
> +    }
> +
> +    if( p_block->i_flags &
> (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
> +    {
> +        block_Release( p_block );
> +        if(!p_sys->in.b_flushed)
> +        {
> +            msg_Dbg(p_dec, "flushing");
> +            OMX_SendCommand( p_sys->omx_handle, OMX_CommandFlush,
> +                             p_sys->in.definition.nPortIndex, 0 );
> +        }
> +        p_sys->in.b_flushed = true;
> +        return NULL;
> +    }
> +
> +    /* Use the aspect ratio provided by the input (ie read from
> packetizer).
> +     * In case the we get aspect ratio info from the decoder (as in the
> +     * broadcom OMX implementation on RPi), don't let the packetizer
> values
> +     * override what the decoder says, if anything - otherwise always
> update
> +     * even if it already is set (since it can change within a stream). */
> +    if((p_dec->fmt_in.video.i_sar_num != 0 &&
> p_dec->fmt_in.video.i_sar_den != 0) &&
> +       (p_dec->fmt_out.video.i_sar_num == 0 ||
> p_dec->fmt_out.video.i_sar_den == 0 ||
> +             !p_sys->b_aspect_ratio_handled))
> +    {
> +        p_dec->fmt_out.video.i_sar_num = p_dec->fmt_in.video.i_sar_num;
> +        p_dec->fmt_out.video.i_sar_den = p_dec->fmt_in.video.i_sar_den;
> +    }
> +
> +    /* Take care of decoded frames first */
> +    if( DecodeVideoOutput( p_dec, &p_sys->out, &p_pic ) != 0 )
> +        goto error;
> +
> +    if( DecodeVideoInput( p_dec, &p_sys->in, pp_block, 0, &b_reconfig )
> != 0 )
> +        goto error;
> +
>      /* If we don't have a p_pic from the first try. Try again */
> -    if( !p_pic && DecodeVideoOutput( p_dec, &p_sys->out, &p_pic ) != 0 )
> +    if( !b_reconfig && !p_pic &&
> +        DecodeVideoOutput( p_dec, &p_sys->out, &p_pic ) != 0 )
>          goto error;
>
> -reconfig:
>      /* Handle the PortSettingsChanged events */
>      for(i = 0; i < p_sys->ports; i++)
>      {
> --
> 2.0.0.rc2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20140711/44a883ed/attachment.html>


More information about the vlc-devel mailing list