|
|
|
@ -2618,6 +2618,36 @@ static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mov_read_tfdt(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
{ |
|
|
|
|
MOVFragment *frag = &c->fragment; |
|
|
|
|
AVStream *st = NULL; |
|
|
|
|
MOVStreamContext *sc; |
|
|
|
|
int version, i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < c->fc->nb_streams; i++) { |
|
|
|
|
if (c->fc->streams[i]->id == frag->track_id) { |
|
|
|
|
st = c->fc->streams[i]; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!st) { |
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %d\n", frag->track_id); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
sc = st->priv_data; |
|
|
|
|
if (sc->pseudo_stream_id + 1 != frag->stsd_id) |
|
|
|
|
return 0; |
|
|
|
|
version = avio_r8(pb); |
|
|
|
|
avio_rb24(pb); /* flags */ |
|
|
|
|
if (version) { |
|
|
|
|
sc->track_end = avio_rb64(pb); |
|
|
|
|
} else { |
|
|
|
|
sc->track_end = avio_rb32(pb); |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
{ |
|
|
|
|
MOVFragment *frag = &c->fragment; |
|
|
|
@ -2870,6 +2900,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { |
|
|
|
|
{ MKTAG('s','t','t','s'), mov_read_stts }, |
|
|
|
|
{ MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */ |
|
|
|
|
{ MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */ |
|
|
|
|
{ MKTAG('t','f','d','t'), mov_read_tfdt }, |
|
|
|
|
{ MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */ |
|
|
|
|
{ MKTAG('t','r','a','k'), mov_read_trak }, |
|
|
|
|
{ MKTAG('t','r','a','f'), mov_read_default }, |
|
|
|
|