summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorSasi Inguva <isasi-at-google.com@ffmpeg.org>2016-10-26 11:31:03 -0700
committerMichael Niedermayer <michael@niedermayer.cc>2016-11-03 19:03:22 +0100
commit4abe1ff08f1fb2a909c4a99bd9e44a81e2c3cc3d (patch)
treeb7d27eacd9f016a970412b6a70251b0f6fe1ffb9 /libavformat/mov.c
parent067910ed134461fd3afc42c82a401e952bd2172f (diff)
lavf/mov.c: Use the first sidx for tracks without sidx.
According to spec ISO_IEC_15444_12 "For any media stream for which no segment index is present, referred to as non‐indexed stream, the media stream associated with the first Segment Index box in the segment serves as a reference stream in a sense that it also describes the subsegments for any non‐indexed media stream." Signed-off-by: Sasi Inguva <isasi@google.com> Reviewed-by: Derek Buitenhuis <derek.buitenhuis@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 4222088315..9179b5865a 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -4202,7 +4202,8 @@ static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom)
uint8_t version;
unsigned i, track_id;
AVStream *st = NULL;
- MOVStreamContext *sc;
+ AVStream *ref_st;
+ MOVStreamContext *sc, *ref_sc;
MOVFragmentIndex *index = NULL;
MOVFragmentIndex **tmp;
AVRational timescale;
@@ -4284,9 +4285,26 @@ static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom)
c->fragment_index_data = tmp;
c->fragment_index_data[c->fragment_index_count++] = index;
+ sc->has_sidx = 1;
+
+ if (offset == avio_size(pb)) {
+ for (i = 0; i < c->fc->nb_streams; i++) {
+ if (c->fc->streams[i]->id == c->fragment_index_data[0]->track_id) {
+ ref_st = c->fc->streams[i];
+ ref_sc = ref_st->priv_data;
+ break;
+ }
+ }
+ for (i = 0; i < c->fc->nb_streams; i++) {
+ st = c->fc->streams[i];
+ sc = st->priv_data;
+ if (!sc->has_sidx) {
+ st->duration = sc->track_end = av_rescale(ref_st->duration, sc->time_scale, ref_sc->time_scale);
+ }
+ }
- if (offset == avio_size(pb))
c->fragment_index_complete = 1;
+ }
return 0;
}
@@ -5847,13 +5865,14 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
static int mov_seek_fragment(AVFormatContext *s, AVStream *st, int64_t timestamp)
{
MOVContext *mov = s->priv_data;
+ MOVStreamContext *sc = st->priv_data;
int i, j;
if (!mov->fragment_index_complete)
return 0;
for (i = 0; i < mov->fragment_index_count; i++) {
- if (mov->fragment_index_data[i]->track_id == st->id) {
+ if (mov->fragment_index_data[i]->track_id == st->id || !sc->has_sidx) {
MOVFragmentIndex *index = mov->fragment_index_data[i];
for (j = index->item_count - 1; j >= 0; j--) {
if (index->items[j].time <= timestamp) {