diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2006-06-12 13:09:19 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2006-06-12 13:09:19 +0000 |
commit | a2fe3b58697901c216f394caf47be574f5cc42e3 (patch) | |
tree | c047809d027387583d23cfa697738554257ea6d2 /libavformat | |
parent | c4da83fb0fe3e6c4475b6e9c48c2cc82c1c96db1 (diff) | |
download | ffmpeg-a2fe3b58697901c216f394caf47be574f5cc42e3.tar.gz |
simplify, completely ignore streams not recognized, that fixes seeking for some files
Originally committed as revision 5468 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mov.c | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index b2ee0695ac..ac21d5a547 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -287,7 +287,6 @@ struct MOVParseTableEntry; typedef struct MOVStreamContext { int ffindex; /* the ffmpeg stream id */ - int is_ff_stream; /* Is this stream presented to ffmpeg ? i.e. is this an audio or video stream ? */ long next_chunk; long chunk_count; int64_t *chunk_offsets; @@ -1664,7 +1663,7 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap) { MOVContext *mov = (MOVContext *) s->priv_data; ByteIOContext *pb = &s->pb; - int i, j, nb, err; + int i, j, err; MOV_atom_t atom = { 0, 0, 0 }; mov->fc = s; @@ -1689,36 +1688,35 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap) url_fseek(pb, mov->mdat_offset, SEEK_SET); mov->next_chunk_offset = mov->mdat_offset; /* initialise reading */ - mov->total_streams = nb = s->nb_streams; -#if 1 for(i=0; i<s->nb_streams;) { + MOVStreamContext *sc = (MOVStreamContext *)s->streams[i]->priv_data; + if(s->streams[i]->codec->codec_type == CODEC_TYPE_MOV_OTHER) {/* not audio, not video, delete */ av_free(s->streams[i]); - for(j=i+1; j<s->nb_streams; j++) + mov_free_stream_context(sc); + for(j=i+1; j<s->nb_streams; j++) { s->streams[j-1] = s->streams[j]; + mov->streams[j-1] = mov->streams[j]; + } s->nb_streams--; - } else + } else { + if(!sc->time_rate) + sc->time_rate=1; + if(!sc->time_scale) + sc->time_scale= mov->time_scale; + av_set_pts_info(s->streams[i], 64, sc->time_rate, sc->time_scale); + + if(s->streams[i]->duration != AV_NOPTS_VALUE){ + assert(s->streams[i]->duration % sc->time_rate == 0); + s->streams[i]->duration /= sc->time_rate; + } + sc->ffindex = i; i++; - } - for(i=0; i<s->nb_streams;i++) { - MOVStreamContext *sc = (MOVStreamContext *)s->streams[i]->priv_data; - - if(!sc->time_rate) - sc->time_rate=1; - if(!sc->time_scale) - sc->time_scale= mov->time_scale; - av_set_pts_info(s->streams[i], 64, sc->time_rate, sc->time_scale); - - if(s->streams[i]->duration != AV_NOPTS_VALUE){ - assert(s->streams[i]->duration % sc->time_rate == 0); - s->streams[i]->duration /= sc->time_rate; } - - sc->ffindex = i; - sc->is_ff_stream = 1; } -#endif + mov->total_streams = s->nb_streams; + return 0; } @@ -1807,7 +1805,7 @@ again: mov->next_chunk_offset = offset; } - if(!sc->is_ff_stream || (s->streams[sc->ffindex]->discard >= AVDISCARD_ALL)) { + if(s->streams[sc->ffindex]->discard >= AVDISCARD_ALL) { url_fskip(&s->pb, (offset - mov->next_chunk_offset)); mov->next_chunk_offset = offset; offset = INT64_MAX; |