X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Favidec.c;h=a70a0113a0453befd1256dedc7ec3d683a14220f;hb=a9a1bc56abf1fa79104996bf7b98b12ca42cd32c;hp=0ec53489d66b458ac257496d509b7709881db075;hpb=87dced8074cf83e74e69d7dee725c8d62601c4e8;p=ffmpeg diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 0ec53489d66..a70a0113a04 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -25,15 +25,13 @@ #include "libavutil/opt.h" #include "libavutil/dict.h" #include "libavutil/avstring.h" +#include "libavutil/avassert.h" #include "avformat.h" #include "internal.h" #include "avi.h" #include "dv.h" #include "riff.h" -#undef NDEBUG -#include - typedef struct AVIStream { int64_t frame_offset; /* current frame (video) or byte (audio) counter (used to compute the pts) */ @@ -485,6 +483,7 @@ static int avi_read_header(AVFormatContext *s) ast = s->streams[0]->priv_data; av_freep(&s->streams[0]->codec->extradata); av_freep(&s->streams[0]->codec); + av_freep(&s->streams[0]->info); av_freep(&s->streams[0]); s->nb_streams = 0; if (CONFIG_DV_DEMUXER) { @@ -513,7 +512,7 @@ static int avi_read_header(AVFormatContext *s) break; } - assert(stream_index < s->nb_streams); + av_assert0(stream_index < s->nb_streams); st->codec->stream_codec_tag= handler; avio_rl32(pb); /* flags */ @@ -589,7 +588,7 @@ static int avi_read_header(AVFormatContext *s) st->codec->width=avih_width; st->codec->height=avih_height; st->codec->codec_type = AVMEDIA_TYPE_VIDEO; - st->codec->codec_id = CODEC_ID_AMV; + st->codec->codec_id = AV_CODEC_ID_AMV; avio_skip(pb, size); break; } @@ -598,7 +597,7 @@ static int avi_read_header(AVFormatContext *s) if (tag1 == MKTAG('D', 'X', 'S', 'B') || tag1 == MKTAG('D','X','S','A')) { st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE; st->codec->codec_tag = tag1; - st->codec->codec_id = CODEC_ID_XSUB; + st->codec->codec_id = AV_CODEC_ID_XSUB; break; } @@ -636,11 +635,6 @@ static int avi_read_header(AVFormatContext *s) st->codec->codec_tag = tag1; st->codec->codec_id = ff_codec_get_id(ff_codec_bmp_tags, tag1); st->need_parsing = AVSTREAM_PARSE_HEADERS; // This is needed to get the pict type which is necessary for generating correct pts. - // Support "Resolution 1:1" for Avid AVI Codec - if(tag1 == MKTAG('A', 'V', 'R', 'n') && - st->codec->extradata_size >= 31 && - !memcmp(&st->codec->extradata[28], "1:1", 3)) - st->codec->codec_id = CODEC_ID_RAWVIDEO; if(st->codec->codec_tag==0 && st->codec->height > 0 && st->codec->extradata_size < 1U<<30){ st->codec->extradata_size+= 9; @@ -669,17 +663,17 @@ static int avi_read_header(AVFormatContext *s) /* ADTS header is in extradata, AAC without header must be * stored as exact frames. Parser not needed and it will * fail. */ - if (st->codec->codec_id == CODEC_ID_AAC && st->codec->extradata_size) + if (st->codec->codec_id == AV_CODEC_ID_AAC && st->codec->extradata_size) st->need_parsing = AVSTREAM_PARSE_NONE; /* AVI files with Xan DPCM audio (wrongly) declare PCM * audio in the header but have Axan as stream_code_tag. */ if (st->codec->stream_codec_tag == AV_RL32("Axan")){ - st->codec->codec_id = CODEC_ID_XAN_DPCM; + st->codec->codec_id = AV_CODEC_ID_XAN_DPCM; st->codec->codec_tag = 0; ast->dshow_block_align = 0; } if (amv_file_format){ - st->codec->codec_id = CODEC_ID_ADPCM_IMA_AMV; + st->codec->codec_id = AV_CODEC_ID_ADPCM_IMA_AMV; ast->dshow_block_align = 0; } break; @@ -689,7 +683,7 @@ static int avi_read_header(AVFormatContext *s) break; default: st->codec->codec_type = AVMEDIA_TYPE_DATA; - st->codec->codec_id= CODEC_ID_NONE; + st->codec->codec_id= AV_CODEC_ID_NONE; st->codec->codec_tag= 0; avio_skip(pb, size); break; @@ -1103,7 +1097,7 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR_EOF; // av_log(s, AV_LOG_DEBUG, "pos=%"PRId64"\n", pos); - assert(best_ast->remaining <= best_ast->packet_size); + av_assert0(best_ast->remaining <= best_ast->packet_size); avi->stream_index= best_stream_index; if(!best_ast->remaining) @@ -1176,7 +1170,7 @@ resync: if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { AVIndexEntry *e; int index; - assert(st->index_entries); + av_assert0(st->index_entries); index= av_index_search_timestamp(st, ast->frame_offset, 0); e= &st->index_entries[index]; @@ -1187,7 +1181,7 @@ resync: int i; uint32_t state=-1; for(i=0; icodec->codec_id == CODEC_ID_MPEG4){ + if(st->codec->codec_id == AV_CODEC_ID_MPEG4){ if(state == 0x1B6){ key= !(pkt->data[i]&0xC0); break; @@ -1250,6 +1244,7 @@ static int avi_read_idx1(AVFormatContext *s, int size) unsigned last_pos= -1; unsigned last_idx= -1; int64_t idx1_pos, first_packet_pos = 0, data_offset = 0; + int anykey = 0; nb_index_entries = size / 16; if (nb_index_entries <= 0) @@ -1301,6 +1296,14 @@ static int avi_read_idx1(AVFormatContext *s, int size) } ast->cum_len += get_duration(ast, len); last_pos= pos; + anykey |= flags&AVIIF_INDEX; + } + if (!anykey) { + for (index = 0; index < s->nb_streams; index++) { + st = s->streams[index]; + if (st->nb_index_entries) + st->index_entries[0].flags |= AVINDEX_KEYFRAME; + } } return 0; } @@ -1369,16 +1372,19 @@ static int avi_load_index(AVFormatContext *s) AVIOContext *pb = s->pb; uint32_t tag, size; int64_t pos= avio_tell(pb); + int64_t next; int ret = -1; if (avio_seek(pb, avi->movi_end, SEEK_SET) < 0) goto the_end; // maybe truncated file av_dlog(s, "movi_end=0x%"PRIx64"\n", avi->movi_end); for(;;) { - if (url_feof(pb)) - break; tag = avio_rl32(pb); size = avio_rl32(pb); + if (url_feof(pb)) + break; + next = avio_tell(pb) + size + (size & 1); + av_dlog(s, "tag=%c%c%c%c size=0x%x\n", tag & 0xff, (tag >> 8) & 0xff, @@ -1390,11 +1396,15 @@ static int avi_load_index(AVFormatContext *s) avi_read_idx1(s, size) >= 0) { avi->index_loaded=2; ret = 0; + }else if(tag == MKTAG('L', 'I', 'S', 'T')) { + uint32_t tag1 = avio_rl32(pb); + + if (tag1 == MKTAG('I', 'N', 'F', 'O')) + ff_read_riff_info(s, size - 4); + }else if(!ret) break; - } - size += (size & 1); - if (avio_skip(pb, size) < 0) + if (avio_seek(pb, next, SEEK_SET) < 0) break; // something is wrong here } the_end: @@ -1425,7 +1435,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp avi_load_index(s); avi->index_loaded |= 1; } - assert(stream_index>= 0); + av_assert0(stream_index>= 0); st = s->streams[stream_index]; ast= st->priv_data; @@ -1449,7 +1459,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp /* One and only one real stream for DV in AVI, and it has video */ /* offsets. Calling with other stream indexes should have failed */ /* the av_index_search_timestamp call above. */ - assert(stream_index == 0); + av_assert0(stream_index == 0); if(avio_seek(s->pb, pos, SEEK_SET) < 0) return -1; @@ -1478,8 +1488,8 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp if (st2->nb_index_entries <= 0) continue; -// assert(st2->codec->block_align); - assert((int64_t)st2->time_base.num*ast2->rate == (int64_t)st2->time_base.den*ast2->scale); +// av_assert1(st2->codec->block_align); + av_assert0((int64_t)st2->time_base.num*ast2->rate == (int64_t)st2->time_base.den*ast2->scale); index = av_index_search_timestamp( st2, av_rescale_q(timestamp, st->time_base, st2->time_base) * FFMAX(ast2->sample_size, 1), @@ -1555,7 +1565,7 @@ static int avi_probe(AVProbeData *p) AVInputFormat ff_avi_demuxer = { .name = "avi", - .long_name = NULL_IF_CONFIG_SMALL("AVI format"), + .long_name = NULL_IF_CONFIG_SMALL("AVI (Audio Video Interleaved)"), .priv_data_size = sizeof(AVIContext), .read_probe = avi_probe, .read_header = avi_read_header,