avformat/mp3dec: allow enabling generic seek mode

"-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.

Change the fate-gapless-mp3 test to use the new mode, and move the old
one to fate-gapless-mp3-toc (since the test forces use of the Xing TOC).
The new mode has a different result for the seek - this result is
actually correct.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
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 @@
 {
     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 @@
     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 @@
     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 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 a09dac6..93a878f 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 984ae84..e6a7a33 100644
--- a/tests/ref/fate/gapless-mp3
+++ b/tests/ref/fate/gapless-mp3
@@ -2,4 +2,4 @@
 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 0000000..5d1cc00
--- /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