[FFmpeg-devel] [PATCH 3/5] avformat/mp3dec: allow enabling generic seek mode

wm4 nfxjfg at googlemail.com
Tue Apr 21 22:16:22 CEST 2015


On Tue, 21 Apr 2015 22:07:07 +0200
Clément Bœsch <u at pkh.me> wrote:

> On Tue, Apr 21, 2015 at 09:33:52PM +0200, wm4 wrote:
> > "-usetoc 2" now invokes the generic seek and indexing mode. This mode
> > skips data until the seek target is reached, and this is exact. It also
> > makes gapless audio actually work if a seek past the start of the file
> > is involved.
> > ---
> > Strange option value. On the other hand, it will be made default, so
> > this option will generally be used only to select the "old" seek modes.
> > But in general, libavformat should probably have something to switch
> > between slow/accurate and fast/inaccurate seeking.
> > ---
> >  libavformat/mp3dec.c           | 12 +++++++++---
> >  tests/fate/gapless.mak         |  5 +++--
> >  tests/ref/fate/gapless-mp3     |  5 -----
> >  tests/ref/fate/gapless-mp3-cbr |  5 +++++
> >  4 files changed, 17 insertions(+), 10 deletions(-)
> >  delete mode 100644 tests/ref/fate/gapless-mp3
> >  create mode 100644 tests/ref/fate/gapless-mp3-cbr
> > 
> > diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
> > index 008cb23..8a4dfbd 100644
> > --- a/libavformat/mp3dec.c
> > +++ b/libavformat/mp3dec.c
> > @@ -110,7 +110,7 @@ static void read_xing_toc(AVFormatContext *s, int64_t filesize, int64_t duration
> >  {
> >      int i;
> >      MP3DecContext *mp3 = s->priv_data;
> > -    int fill_index = mp3->usetoc && duration > 0;
> > +    int fill_index = mp3->usetoc == 1 && duration > 0;
> >  
> >      if (!filesize &&
> >          !(filesize = avio_size(s->pb))) {
> > @@ -336,6 +336,9 @@ static int mp3_read_header(AVFormatContext *s)
> >      int ret;
> >      int i;
> >  
> > +    if (mp3->usetoc < 0)
> > +        mp3->usetoc = 0;
> > +
> >      st = avformat_new_stream(s, NULL);
> >      if (!st)
> >          return AVERROR(ENOMEM);
> > @@ -432,8 +435,11 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
> >      int64_t best_pos;
> >      int best_score;
> >  
> > +    if (mp3->usetoc == 2)
> > +        return -1; // generic index code
> > +
> >      if (   mp3->is_cbr
> > -        && (mp3->usetoc <= 0 || !mp3->xing_toc)
> > +        && (mp3->usetoc == 0 || !mp3->xing_toc)
> >          && st->duration > 0
> >          && mp3->header_filesize > s->internal->data_offset
> >          && mp3->frames) {
> > @@ -498,7 +504,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
> >  }
> >  
> >  static const AVOption options[] = {
> > -    { "usetoc", "use table of contents", offsetof(MP3DecContext, usetoc), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM},
> > +    { "usetoc", "use table of contents", offsetof(MP3DecContext, usetoc), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, AV_OPT_FLAG_DECODING_PARAM},
> 
> Can you use AV_OPT_TYPE_CONST for the different special values?
> 
> (and document it)
> 
> [...]
> 

I'm not sure if it's a good idea to set this in stone. I'd much rather
have something similar to AVFMT_FLAG_IGNIDX, which can be checked by
all demuxers.


More information about the ffmpeg-devel mailing list