[FFmpeg-devel] [PATCH] avformat/mp3dec:Subtract known padding from duration

Ulrik Mikaelsson ulrik.mikaelsson at gmail.com
Wed Aug 23 12:25:53 EEST 2023


> > ---
> >  libavformat/mp3dec.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
> > index 05c13228bc..c8c3b298ab 100644
> > --- a/libavformat/mp3dec.c
> > +++ b/libavformat/mp3dec.c
> > @@ -350,7 +350,8 @@ static int mp3_parse_vbr_tags(AVFormatContext *s,
> > AVStream *st, int64_t base)
> >      avio_seek(s->pb, base + vbrtag_size, SEEK_SET);
> >
> >      if (mp3->frames)
> > -        st->duration = av_rescale_q(mp3->frames, (AVRational){spf,
> > c.sample_rate},
> > +        st->duration = av_rescale_q((mp3->frames * spf) - mp3-
> > >start_pad - mp3->end_pad,
>
> This can overflow. Casting to int64_t before multiplying should be
> enough to fix it.

Good catch! I also noticed a fate-test failed (due to it including
padding-samples in the reference output for duration), and a
formatting error in the patch itself. Will fix and resubmit.


Den ons 23 aug. 2023 kl 11:18 skrev Tomas Härdin <git at haerdin.se>:
>
> tis 2023-08-22 klockan 14:03 +0200 skrev Ulrik Mikaelsson:
> > When an Info-tag is present, marking initial and trailing samples as
> > padding, those samples should not be included in the calculation of
> > track
> > duration.
> >
> > This solves a surprising user experience where converting a WAV->MP3-
> > >WAV,
> > ffprobe will show the duration of the mp3 as slightly longer than
> > both the
> > input and the output.
>
> I've had similar issues with burning gapless CDs. Hopefully this fixes
> some downstream projects.
>
> > ---
> >  libavformat/mp3dec.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
> > index 05c13228bc..c8c3b298ab 100644
> > --- a/libavformat/mp3dec.c
> > +++ b/libavformat/mp3dec.c
> > @@ -350,7 +350,8 @@ static int mp3_parse_vbr_tags(AVFormatContext *s,
> > AVStream *st, int64_t base)
> >      avio_seek(s->pb, base + vbrtag_size, SEEK_SET);
> >
> >      if (mp3->frames)
> > -        st->duration = av_rescale_q(mp3->frames, (AVRational){spf,
> > c.sample_rate},
> > +        st->duration = av_rescale_q((mp3->frames * spf) - mp3-
> > >start_pad - mp3->end_pad,
>
> This can overflow. Casting to int64_t before multiplying should be
> enough to fix it.
>
> /Tomas
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list