Commit c3a73666 authored by wm4's avatar wm4 Committed by Michael Niedermayer

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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 066b92e9
......@@ -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 },
};
......
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)
......
......@@ -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
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment