|
|
|
@@ -3309,7 +3309,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st) |
|
|
|
uint64_t stream_size = 0; |
|
|
|
|
|
|
|
if (sc->elst_count) { |
|
|
|
int i, edit_start_index = 0; |
|
|
|
int i, edit_start_index = 0, multiple_edits = 0; |
|
|
|
int64_t empty_duration = 0; // empty duration of the first edit list entry |
|
|
|
int64_t start_time = 0; // start time of the media |
|
|
|
|
|
|
|
@@ -3322,15 +3322,28 @@ static void mov_build_index(MOVContext *mov, AVStream *st) |
|
|
|
edit_start_index = 1; |
|
|
|
} else if (i == edit_start_index && e->time >= 0) { |
|
|
|
start_time = e->time; |
|
|
|
} else { |
|
|
|
multiple_edits = 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (multiple_edits && !mov->advanced_editlist) |
|
|
|
av_log(mov->fc, AV_LOG_WARNING, "multiple edit list entries, " |
|
|
|
"Use -advanced_editlist to correctly decode otherwise " |
|
|
|
"a/v desync might occur\n"); |
|
|
|
|
|
|
|
/* adjust first dts according to edit list */ |
|
|
|
if ((empty_duration || start_time) && mov->time_scale > 0) { |
|
|
|
if (empty_duration) |
|
|
|
empty_duration = av_rescale(empty_duration, sc->time_scale, mov->time_scale); |
|
|
|
sc->time_offset = start_time - empty_duration; |
|
|
|
if (!mov->advanced_editlist) |
|
|
|
current_dts = -sc->time_offset; |
|
|
|
} |
|
|
|
|
|
|
|
if (!multiple_edits && !mov->advanced_editlist && |
|
|
|
st->codecpar->codec_id == AV_CODEC_ID_AAC && start_time > 0) |
|
|
|
sc->start_pad = start_time; |
|
|
|
} |
|
|
|
|
|
|
|
/* only use old uncompressed audio chunk demuxing when stts specifies it */ |
|
|
|
@@ -3564,8 +3577,10 @@ static void mov_build_index(MOVContext *mov, AVStream *st) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Fix index according to edit lists. |
|
|
|
mov_fix_index(mov, st); |
|
|
|
if (!mov->ignore_editlist && mov->advanced_editlist) { |
|
|
|
// Fix index according to edit lists. |
|
|
|
mov_fix_index(mov, st); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static int test_same_origin(const char *src, const char *ref) { |
|
|
|
@@ -6478,7 +6493,11 @@ static const AVOption mov_options[] = { |
|
|
|
"Seek each stream individually to the to the closest point", |
|
|
|
OFFSET(seek_individually), AV_OPT_TYPE_BOOL, { .i64 = 1 }, |
|
|
|
0, 1, FLAGS}, |
|
|
|
{"ignore_editlist", "", OFFSET(ignore_editlist), AV_OPT_TYPE_BOOL, {.i64 = 0}, |
|
|
|
{"ignore_editlist", "Ignore the edit list atom.", OFFSET(ignore_editlist), AV_OPT_TYPE_BOOL, {.i64 = 0}, |
|
|
|
0, 1, FLAGS}, |
|
|
|
{"advanced_editlist", |
|
|
|
"Modify the AVIndex according to the editlists. Use this option to decode in the order specified by the edits.", |
|
|
|
OFFSET(advanced_editlist), AV_OPT_TYPE_BOOL, {.i64 = 1}, |
|
|
|
0, 1, FLAGS}, |
|
|
|
{"ignore_chapters", "", OFFSET(ignore_chapters), AV_OPT_TYPE_BOOL, {.i64 = 0}, |
|
|
|
0, 1, FLAGS}, |
|
|
|
|