mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-30 23:10:32 +00:00
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>
This commit is contained in:
parent
066b92e91d
commit
c3a73666ad
@ -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 },
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
5
tests/ref/fate/gapless-mp3-toc
Normal file
5
tests/ref/fate/gapless-mp3-toc
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user