|
|
|
@@ -4325,8 +4325,8 @@ static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, |
|
|
|
|
|
|
|
static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) |
|
|
|
{ |
|
|
|
MOVContext *mc = s->priv_data; |
|
|
|
AVStream *st; |
|
|
|
int64_t seek_timestamp, timestamp; |
|
|
|
int sample; |
|
|
|
int i; |
|
|
|
|
|
|
|
@@ -4338,19 +4338,39 @@ static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti |
|
|
|
if (sample < 0) |
|
|
|
return sample; |
|
|
|
|
|
|
|
/* adjust seek timestamp to found sample timestamp */ |
|
|
|
seek_timestamp = st->index_entries[sample].timestamp; |
|
|
|
if (mc->seek_individually) { |
|
|
|
/* adjust seek timestamp to found sample timestamp */ |
|
|
|
int64_t seek_timestamp = st->index_entries[sample].timestamp; |
|
|
|
|
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
MOVStreamContext *sc = s->streams[i]->priv_data; |
|
|
|
st = s->streams[i]; |
|
|
|
st->skip_samples = (sample_time <= 0) ? sc->start_pad : 0; |
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
int64_t timestamp; |
|
|
|
MOVStreamContext *sc = s->streams[i]->priv_data; |
|
|
|
st = s->streams[i]; |
|
|
|
st->skip_samples = (sample_time <= 0) ? sc->start_pad : 0; |
|
|
|
|
|
|
|
if (stream_index == i) |
|
|
|
continue; |
|
|
|
if (stream_index == i) |
|
|
|
continue; |
|
|
|
|
|
|
|
timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base); |
|
|
|
mov_seek_stream(s, st, timestamp, flags); |
|
|
|
timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base); |
|
|
|
mov_seek_stream(s, st, timestamp, flags); |
|
|
|
} |
|
|
|
} else { |
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
MOVStreamContext *sc; |
|
|
|
st = s->streams[i]; |
|
|
|
sc = st->priv_data; |
|
|
|
sc->current_sample = 0; |
|
|
|
} |
|
|
|
while (1) { |
|
|
|
MOVStreamContext *sc; |
|
|
|
AVIndexEntry *entry = mov_find_next_sample(s, &st); |
|
|
|
if (!entry) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
sc = st->priv_data; |
|
|
|
if (sc->ffindex == stream_index && sc->current_sample == sample) |
|
|
|
break; |
|
|
|
sc->current_sample++; |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
@@ -4362,6 +4382,10 @@ static const AVOption mov_options[] = { |
|
|
|
"allow using absolute path when opening alias, this is a possible security issue", |
|
|
|
OFFSET(use_absolute_path), FF_OPT_TYPE_INT, {.i64 = 0}, |
|
|
|
0, 1, FLAGS}, |
|
|
|
{"seek_streams_individually", |
|
|
|
"Seek each stream individually to the to the closest point", |
|
|
|
OFFSET(seek_individually), AV_OPT_TYPE_INT, { .i64 = 1 }, |
|
|
|
0, 1, FLAGS}, |
|
|
|
{"ignore_editlist", "", OFFSET(ignore_editlist), FF_OPT_TYPE_INT, {.i64 = 0}, |
|
|
|
0, 1, FLAGS}, |
|
|
|
{"use_mfra_for", |
|
|
|
|