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