[FFmpeg-devel] [PATCH] Flushing the MP2 Decoder

Brian Brice bbrice
Fri Jan 11 17:18:58 CET 2008


On Jan 11, 2008 6:16 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
>
> On Thu, Jan 10, 2008 at 07:01:46PM -0600, Brian Brice wrote:
> > Hello,
> >
> > I believe I've found an issue with seeking relating to the MP2
> > decoder.  It's most notable in the scenario that you've been decoding
> > frames that have sound, seek to an area of silence, then continue
> > decoding.  After the seek, the first frame returned from the decoder
> > has a blip of sound from the previous audio.
> >
> > Currently, there isn't a flush implementation for the MP2 decoder.  In
> > researching what exactly needs to be flushed, I've noticed some fields
> > in MPADecodeContext that were previously set, causing the blip.
> >
> > I've attached my implementation of a flush function for the MP2 decoder.
> >
> > Thanks!
> >
> > --
> > Brian Brice
> > http://www.heapify.org/
>
> > --- libavcodec/mpegaudiodec.c.orig    2008-01-10 18:50:54.988827100 -0600
> > +++ libavcodec/mpegaudiodec.c 2008-01-10 18:59:13.629452100 -0600
> > @@ -2417,6 +2417,9 @@
> >
> >  static void flush(AVCodecContext *avctx){
> >      MPADecodeContext *s = avctx->priv_data;
> > +    memset(s->synth_buf, 0, sizeof(s->synth_buf));
>
> > +    memset(s->synth_buf_offset, 0, sizeof(s->synth_buf_offset));
> > +    s->dither_state= 0;
>
> this is not needed

This is what I've been looking to, if it's needed and why it's needed.

The scenario again is this: Decoding audio that has noticable sound in
it, performing a seek operation to a location that has only silence,
then continue decoding from this new location.  The first frame of
audio back after the seek returns data that has sound in it when it
shouldn't.  I went stepping around into the MP2 decoder to see what
data is kept around from the previous audio that could do this.

Within mp_decode_layer2(), s->sb_samples is pretty much set to all 0's
(silence) as expected.  Then within ff_mpa_synth_filter(), these 0's
are changed due to data laying around in s->synth_buf.

If this isn't cleared, then a "blip" is heard when playing that
decoded audio back.  If I cleared out synth_buf within the flush
operation, then the "blip" is not heard.


-- 
Brian Brice
http://www.heapify.org/




More information about the ffmpeg-devel mailing list