Unified · Split
| @@ -2618,6 +2618,36 @@ static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom) · 2617 unmodified lines | |||
| 2618 | return 0; | 2618 | return 0; |
| 2619 | } | 2619 | } |
| 2620 | 2620 | ||
| 2621 | static int mov_read_tfdt(MOVContext *c, AVIOContext *pb, MOVAtom atom) | ||
| 2622 | { | ||
| 2623 | MOVFragment *frag = &c->fragment; | ||
| 2624 | AVStream *st = NULL; | ||
| 2625 | MOVStreamContext *sc; | ||
| 2626 | int version, i; | ||
| 2627 | |||
| 2628 | for (i = 0; i < c->fc->nb_streams; i++) { | ||
| 2629 | if (c->fc->streams[i]->id == frag->track_id) { | ||
| 2630 | st = c->fc->streams[i]; | ||
| 2631 | break; | ||
| 2632 | } | ||
| 2633 | } | ||
| 2634 | if (!st) { | ||
| 2635 | av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %d\n", frag->track_id); | ||
| 2636 | return AVERROR_INVALIDDATA; | ||
| 2637 | } | ||
| 2638 | sc = st->priv_data; | ||
| 2639 | if (sc->pseudo_stream_id + 1 != frag->stsd_id) | ||
| 2640 | return 0; | ||
| 2641 | version = avio_r8(pb); | ||
| 2642 | avio_rb24(pb); /* flags */ | ||
| 2643 | if (version) { | ||
| 2644 | sc->track_end = avio_rb64(pb); | ||
| 2645 | } else { | ||
| 2646 | sc->track_end = avio_rb32(pb); | ||
| 2647 | } | ||
| 2648 | return 0; | ||
| 2649 | } | ||
| 2650 | |||
| 2621 | static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) | 2651 | static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
| 2622 | { | 2652 | { |
| 2623 | MOVFragment *frag = &c->fragment; | 2653 | MOVFragment *frag = &c->fragment; |
| @@ -2870,6 +2900,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { · 246 unmodified lines | |||
| 2870 | { MKTAG('s','t','t','s'), mov_read_stts }, | 2900 | { MKTAG('s','t','t','s'), mov_read_stts }, |
| 2871 | { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */ | 2901 | { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */ |
| 2872 | { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */ | 2902 | { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */ |
| 2903 | { MKTAG('t','f','d','t'), mov_read_tfdt }, | ||
| 2873 | { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */ | 2904 | { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */ |
| 2874 | { MKTAG('t','r','a','k'), mov_read_trak }, | 2905 | { MKTAG('t','r','a','k'), mov_read_trak }, |
| 2875 | { MKTAG('t','r','a','f'), mov_read_default }, | 2906 | { MKTAG('t','r','a','f'), mov_read_default }, |