summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorAlex Converse <alex.converse@gmail.com>2009-03-04 07:57:09 +0000
committerAlex Converse <alex.converse@gmail.com>2009-03-04 07:57:09 +0000
commit63581eb1836d928b319720143f48a9bd13d5537d (patch)
tree3b81f87733a90a21b3d214113f80aec2745fdb8f /libavformat/mov.c
parente584914acddaeb21f5258d9947b530fbd9421ab8 (diff)
MOV: fix demuxing fragmented files
Originally committed as revision 17803 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 88f8003057..f2898c7f75 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1586,7 +1586,7 @@ static int mov_read_tfhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
flags = get_be24(pb);
track_id = get_be32(pb);
- if (!track_id || track_id > c->fc->nb_streams)
+ if (!track_id)
return -1;
frag->track_id = track_id;
for (i = 0; i < c->trex_count; i++)
@@ -1635,7 +1635,7 @@ static int mov_read_trex(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
static int mov_read_trun(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
MOVFragment *frag = &c->fragment;
- AVStream *st;
+ AVStream *st = NULL;
MOVStreamContext *sc;
uint64_t offset;
int64_t dts;
@@ -1643,9 +1643,16 @@ static int mov_read_trun(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
unsigned entries, first_sample_flags = frag->flags;
int flags, distance, i;
- if (!frag->track_id || frag->track_id > c->fc->nb_streams)
+ 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 -1;
- st = c->fc->streams[frag->track_id-1];
+ }
sc = st->priv_data;
if (sc->pseudo_stream_id+1 != frag->stsd_id)
return 0;