support yet another broken avi (filedoesitbetter.avi) which has a wrong stream count
Originally committed as revision 7961 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
1d7d9935b2
commit
6d29fba950
@ -216,7 +216,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
//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 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
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];
|
||||
|
Loading…
Reference in New Issue
Block a user