lavf/mov.c: Add -advanced_editlist option for mov format.
Adding an MOV format option to turn on/off the editlist supporting code, introduced in ca6cae73db
Signed-off-by: Sasi Inguva <isasi@google.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
58b867a7cf
commit
ef71dc7948
@ -234,6 +234,7 @@ typedef struct MOVContext {
|
||||
unsigned int nb_chapter_tracks;
|
||||
int use_absolute_path;
|
||||
int ignore_editlist;
|
||||
int advanced_editlist;
|
||||
int ignore_chapters;
|
||||
int seek_individually;
|
||||
int64_t next_root_atom; ///< offset of the next root atom
|
||||
|
@ -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},
|
||||
|
Loading…
x
Reference in New Issue
Block a user