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
