On Fri, Feb 24, 2012 at 10:46 AM, Dale Curtis <[email protected]> wrote:
> Module: libav
> Branch: master
> Commit: b7165426917f91ebcad84bdff366824f03b32bfe
>
> Author:    Dale Curtis <[email protected]>
> Committer: Justin Ruggles <[email protected]>
> Date:      Fri Feb 24 13:17:39 2012 -0500
>
> mpegaudiodec: Prevent premature clipping of mp3 input buffer.
>
> Instead of clipping extrasize based on EXTRABYTES, clip based on the
> amount of buffer actually left. Without this fix, there are warbles
> and other distortions in the test case below.
>
> http://kevincennis.com/mix/assets/sounds/1901_voxfx.mp3
>
> ---
>
>  libavcodec/mpegaudiodec.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
> index 6c08862..d82432c 100644
> --- a/libavcodec/mpegaudiodec.c
> +++ b/libavcodec/mpegaudiodec.c
> @@ -40,6 +40,7 @@
>
>  #define BACKSTEP_SIZE 512
>  #define EXTRABYTES 24
> +#define LAST_BUF_SIZE 2 * BACKSTEP_SIZE + EXTRABYTES
>
>  /* layer 3 "granule" */
>  typedef struct GranuleDef {
> @@ -63,7 +64,7 @@ typedef struct GranuleDef {
>
>  typedef struct MPADecodeContext {
>     MPA_DECODE_HEADER
> -    uint8_t last_buf[2 * BACKSTEP_SIZE + EXTRABYTES];
> +    uint8_t last_buf[LAST_BUF_SIZE];
>     int last_buf_size;
>     /* next header (used in free format parsing) */
>     uint32_t free_format_next_header;
> @@ -1378,7 +1379,8 @@ static int mp_decode_layer3(MPADecodeContext *s)
>     if (!s->adu_mode) {
>         int skip;
>         const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
> -        int extrasize = av_clip(get_bits_left(&s->gb) >> 3, 0, EXTRABYTES);
> +        int extrasize = av_clip(get_bits_left(&s->gb) >> 3, 0,
> +                                FFMAX(0, LAST_BUF_SIZE - s->last_buf_size));

I didn't want to obstruct the fix getting in, but now that it's in I
think this calculation can be simplified.

Also we really really need a fate test for a file like this.

>         assert((get_bits_count(&s->gb) & 7) == 0);
>         /* now we get bits from the main_data_begin offset */
>         av_dlog(s->avctx, "seekback: %d\n", main_data_begin);
>
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to