On Sun, Feb 24, 2013 at 04:59:14PM +0100, Luca Barbato wrote:
> The specification does not prevent an encoder to write the amplitude 0
> as 0 amplitude_bits.
> 
> Our get_bits() implementation might not support a zero sized read
> properly, thus the additional branch.
> ---
> 
> The libvorbis decoder seems to match my read of the specification, I'd ping
> Monthy to confirm just in case.
> 
>  libavcodec/vorbisdec.c | 10 +++-------
>  1 file changed, 3 insertions(+), 7 deletions(-)
> 
> diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
> index 7575ee4..0513d97 100644
> --- a/libavcodec/vorbisdec.c
> +++ b/libavcodec/vorbisdec.c
> @@ -602,13 +602,6 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context 
> *vc)
>                  return AVERROR_INVALIDDATA;
>              }
>              floor_setup->data.t0.amplitude_bits = get_bits(gb,  6);
> -            /* zero would result in a div by zero later *
> -             * 2^0 - 1 == 0                             */
> -            if (!floor_setup->data.t0.amplitude_bits) {
> -                av_log(vc->avccontext, AV_LOG_ERROR,
> -                       "Floor 0 amplitude bits is 0.\n");
> -                return AVERROR_INVALIDDATA;
> -            }
>              floor_setup->data.t0.amplitude_offset = get_bits(gb, 8);
>              floor_setup->data.t0.num_books        = get_bits(gb, 4) + 1;
>  
> @@ -1059,6 +1052,9 @@ static int vorbis_floor0_decode(vorbis_context *vc,
>      unsigned amplitude, book_idx;
>      unsigned blockflag = vc->modes[vc->mode_number].blockflag;
>  
> +    if (!vf->amplitude_bits)
> +        return 1;
> +
>      amplitude = get_bits(&vc->gb, vf->amplitude_bits);
>      if (amplitude > 0) {
>          float last = 0;
> -- 

LGTM
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to