diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c index 008cb23c12..8a4dfbd7bb 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}, { NULL }, }; diff --git a/tests/fate/gapless.mak b/tests/fate/gapless.mak index a09dac6742..93a878fadb 100644 --- a/tests/fate/gapless.mak +++ b/tests/fate/gapless.mak @@ -1,5 +1,6 @@ -FATE_GAPLESS-$(CONFIG_MP3_DEMUXER) += fate-gapless-mp3 fate-gapless-mp3-notoc -fate-gapless-mp3: CMD = gapless $(TARGET_SAMPLES)/gapless/gapless.mp3 "-usetoc 1" +FATE_GAPLESS-$(CONFIG_MP3_DEMUXER) += fate-gapless-mp3 fate-gapless-mp3-toc fate-gapless-mp3-notoc +fate-gapless-mp3: CMD = gapless $(TARGET_SAMPLES)/gapless/gapless.mp3 "-usetoc 2" +fate-gapless-mp3-toc: CMD = gapless $(TARGET_SAMPLES)/gapless/gapless.mp3 "-usetoc 1" fate-gapless-mp3-notoc: CMD = gapless $(TARGET_SAMPLES)/gapless/gapless.mp3 "-usetoc 0" FATE_GAPLESS = $(FATE_GAPLESS-yes) diff --git a/tests/ref/fate/gapless-mp3 b/tests/ref/fate/gapless-mp3 index 984ae8489d..e6a7a3387b 100644 --- a/tests/ref/fate/gapless-mp3 +++ b/tests/ref/fate/gapless-mp3 @@ -2,4 +2,4 @@ d5c88cf38416329a052a9b0cb140fb4c *tests/data/fate/gapless-mp3.out-1 c96c3ae7bd3300fd2f4debac222de5b7 3386bc2009b31b7ef39247918cbb02a5 *tests/data/fate/gapless-mp3.out-2 c96c3ae7bd3300fd2f4debac222de5b7 -70e7cd7f2b6365e7f48ed206113f06fc *tests/data/fate/gapless-mp3.out-3 +92e37f050ad4fc817730c8af17ee6d1b *tests/data/fate/gapless-mp3.out-3 diff --git a/tests/ref/fate/gapless-mp3-toc b/tests/ref/fate/gapless-mp3-toc new file mode 100644 index 0000000000..5d1cc005ab --- /dev/null +++ b/tests/ref/fate/gapless-mp3-toc @@ -0,0 +1,5 @@ +d5c88cf38416329a052a9b0cb140fb4c *tests/data/fate/gapless-mp3-toc.out-1 +c96c3ae7bd3300fd2f4debac222de5b7 +3386bc2009b31b7ef39247918cbb02a5 *tests/data/fate/gapless-mp3-toc.out-2 +c96c3ae7bd3300fd2f4debac222de5b7 +70e7cd7f2b6365e7f48ed206113f06fc *tests/data/fate/gapless-mp3-toc.out-3