[vlc-devel] [PATCH] avcodec: reconstruct the ALAC atom if we have enough data

Tristan Matthews tmatth at videolan.org
Fri Feb 12 17:53:09 CET 2016


Hi,

On Fri, Feb 12, 2016 at 10:28 AM, Steve Lhomme <robux4 at videolabs.io> wrote:
> fixes #16620
> ---
>  modules/codec/avcodec/audio.c | 37 ++++++++++++++++++++++++++++++-------
>  1 file changed, 30 insertions(+), 7 deletions(-)
>
> diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
> index 159dbf1..9ce190f 100644
> --- a/modules/codec/avcodec/audio.c
> +++ b/modules/codec/avcodec/audio.c
> @@ -85,15 +85,38 @@ static void InitDecoderConfig( decoder_t *p_dec, AVCodecContext *p_context )
>          if( p_dec->fmt_in.i_codec == VLC_CODEC_ALAC )
>          {
>              static const uint8_t p_pattern[] = { 0, 0, 0, 36, 'a', 'l', 'a', 'c' };

Maybe define 36 somewhere, or use p_pattern[3].

> -            /* Find alac atom XXX it is a bit ugly */
> -            for( i_offset = 0; i_offset < i_size - (int)sizeof(p_pattern); i_offset++ )
> +            if( i_size >= 24 && i_size < 36)
>              {
> -                if( !memcmp( &p_src[i_offset], p_pattern, sizeof(p_pattern) ) )
> -                    break;
> -            }
> -            i_size = __MIN( p_dec->fmt_in.i_extra - i_offset, 36 );
> -            if( i_size < 36 )
> +                p_context->extradata =
> +                    av_malloc( 12 + i_size + FF_INPUT_BUFFER_PADDING_SIZE );
> +                if( p_context->extradata )

What if av_malloc fails?

> +                {
> +                    uint8_t *p_dst = p_context->extradata;
> +
> +                    i_size = 0;
> +                    memcpy( &p_dst[i_size], &p_pattern[0], 8 );
> +                    i_size += 8;
> +                    memset( &p_dst[i_size], 0, 4 );
> +                    i_size += 4;
> +                    memcpy( &p_dst[i_size], &p_src[0], p_dec->fmt_in.i_extra );
> +                    i_size += p_dec->fmt_in.i_extra;
> +                    p_context->extradata_size = i_size;
> +                    memset( &p_dst[i_size], 0, FF_INPUT_BUFFER_PADDING_SIZE );
> +                }
>                  i_size = 0;
> +            }
> +            else
> +            {
> +                /* Find alac atom XXX it is a bit ugly */
> +                for( i_offset = 0; i_offset < i_size - (int)sizeof(p_pattern); i_offset++ )
> +                {
> +                    if( !memcmp( &p_src[i_offset], p_pattern, sizeof(p_pattern) ) )
> +                        break;
> +                }
> +                i_size = __MIN( p_dec->fmt_in.i_extra - i_offset, 36 );
> +                if( i_size < 36 )
> +                    i_size = 0;
> +            }
>          }
>
>          if( i_size > 0 )
> --
> 2.7.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list