[Ffmpeg-cvslog] r7961 - trunk/libavformat/avidec.c
michael
subversion
Tue Feb 13 01:38:17 CET 2007
Author: michael
Date: Tue Feb 13 01:38:16 2007
New Revision: 7961
Modified:
trunk/libavformat/avidec.c
Log:
support yet another broken avi (filedoesitbetter.avi) which has a wrong stream count
Modified: trunk/libavformat/avidec.c
==============================================================================
--- trunk/libavformat/avidec.c (original)
+++ trunk/libavformat/avidec.c Tue Feb 13 01:38:16 2007
@@ -216,7 +216,7 @@
uint32_t tag, tag1, handler;
int codec_type, stream_index, frame_period, bit_rate;
unsigned int size, nb_frames;
- int i, n;
+ int i;
AVStream *st;
AVIStream *ast = NULL;
char str_track[4];
@@ -269,10 +269,22 @@
avi->non_interleaved |= get_le32(pb) & AVIF_MUSTUSEINDEX;
url_fskip(pb, 2 * 4);
- n = get_le32(pb);
- for(i=0;i<n;i++) {
- AVIStream *ast;
- st = av_new_stream(s, i);
+ get_le32(pb);
+
+ url_fskip(pb, size - 7 * 4);
+ break;
+ case MKTAG('s', 't', 'r', 'h'):
+ /* stream header */
+
+ tag1 = get_le32(pb);
+ handler = get_le32(pb); /* codec tag */
+
+ if(tag1 == MKTAG('p', 'a', 'd', 's')){
+ url_fskip(pb, size - 8);
+ break;
+ }else{
+ stream_index++;
+ st = av_new_stream(s, stream_index);
if (!st)
goto fail;
@@ -281,13 +293,7 @@
goto fail;
st->priv_data = ast;
}
- url_fskip(pb, size - 7 * 4);
- break;
- case MKTAG('s', 't', 'r', 'h'):
- /* stream header */
- stream_index++;
- tag1 = get_le32(pb);
- handler = get_le32(pb); /* codec tag */
+
#ifdef DEBUG
print_tag("strh", tag1, -1);
#endif
@@ -336,15 +342,7 @@
break;
}
- if (stream_index >= s->nb_streams) {
- url_fskip(pb, size - 8);
- /* ignore padding stream */
- if (tag1 == MKTAG('p', 'a', 'd', 's'))
- stream_index--;
- break;
- }
- st = s->streams[stream_index];
- ast = st->priv_data;
+ assert(stream_index < s->nb_streams);
st->codec->stream_codec_tag= handler;
get_le32(pb); /* flags */
@@ -387,10 +385,6 @@
//FIXME
codec_type = CODEC_TYPE_DATA; //CODEC_TYPE_SUB ? FIXME
break;
- case MKTAG('p', 'a', 'd', 's'):
- codec_type = CODEC_TYPE_UNKNOWN;
- stream_index--;
- break;
default:
av_log(s, AV_LOG_ERROR, "unknown stream type %X\n", tag1);
goto fail;
@@ -400,7 +394,7 @@
break;
case MKTAG('s', 't', 'r', 'f'):
/* stream header */
- if (stream_index >= s->nb_streams || avi->dv_demux) {
+ if (stream_index >= (unsigned)s->nb_streams || avi->dv_demux) {
url_fskip(pb, size);
} else {
st = s->streams[stream_index];
More information about the ffmpeg-cvslog
mailing list