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

Michael Niedermayer michaelni
Fri Jan 11 19:19:59 CET 2008


On Fri, Jan 11, 2008 at 10:18:58AM -0600, Brian Brice wrote:
> 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.

Thats all obvious, but neither dither_state nor synth_buf_offset need to
be cleared. Ive applied the sane looking parts of your patch.

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If a bugfix only changes things apparently unrelated to the bug with no
further explanation, that is a good sign that the bugfix is wrong.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080111/b3bfe615/attachment.pgp>



More information about the ffmpeg-devel mailing list