X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Favidec.c;h=38f84f9f947122539676682aedbfa09a7fbd4e0f;hb=6774247a9d7d15033c2b80118c03cb0cb10027df;hp=871da0bb404adb1cfa0b1f501bc7e9cf82c03c74;hpb=d3f610c186b6e8430e4cf97667750e720f6983c8;p=ffmpeg diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 871da0bb404..38f84f9f947 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -19,11 +19,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include #include "libavutil/intreadwrite.h" +#include "libavutil/mathematics.h" #include "libavutil/bswap.h" #include "libavutil/dict.h" +#include "libavutil/avstring.h" #include "avformat.h" +#include "internal.h" #include "avi.h" #include "dv.h" #include "riff.h" @@ -37,8 +39,8 @@ typedef struct AVIStream { int remaining; int packet_size; - int scale; - int rate; + uint32_t scale; + uint32_t rate; int sample_size; /* size of one sample (or packet) (in the rate/scale sense) in bytes */ int64_t cum_len; /* temporary storage (used during seek) */ @@ -78,6 +80,11 @@ static const char avi_headers[][8] = { { 0 } }; +static const AVMetadataConv avi_metadata_conv[] = { + { "strn", "title" }, + { 0 }, +}; + static int avi_load_index(AVFormatContext *s); static int guess_ni_flag(AVFormatContext *s); @@ -260,15 +267,6 @@ static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag, uint32_t AV_DICT_DONT_STRDUP_VAL); } -static void avi_read_info(AVFormatContext *s, uint64_t end) -{ - while (avio_tell(s->pb) < end) { - uint32_t tag = avio_rl32(s->pb); - uint32_t size = avio_rl32(s->pb); - avi_read_tag(s, NULL, tag, size); - } -} - static const char months[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; @@ -280,7 +278,7 @@ static void avi_metadata_creation_time(AVDictionary **metadata, char *date) if (sscanf(date, "%*3s%*[ ]%3s%*[ ]%2d%*[ ]%8s%*[ ]%4d", month, &day, time, &year) == 4) { for (i=0; i<12; i++) - if (!strcasecmp(month, months[i])) { + if (!av_strcasecmp(month, months[i])) { snprintf(buffer, sizeof(buffer), "%.4d-%.2d-%.2d %s", year, i+1, day, time); av_dict_set(metadata, "creation_time", buffer, 0); @@ -327,7 +325,7 @@ static void avi_read_nikon(AVFormatContext *s, uint64_t end) } } -static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) +static int avi_read_header(AVFormatContext *s) { AVIContext *avi = s->priv_data; AVIOContext *pb = s->pb; @@ -379,7 +377,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) goto end_of_header; } else if (tag1 == MKTAG('I', 'N', 'F', 'O')) - avi_read_info(s, list_end); + ff_read_riff_info(s, size - 4); else if (tag1 == MKTAG('n', 'c', 'd', 't')) avi_read_nikon(s, list_end); @@ -425,10 +423,11 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) break; }else{ stream_index++; - st = av_new_stream(s, stream_index); + st = avformat_new_stream(s, NULL); if (!st) goto fail; + st->id = stream_index; ast = av_mallocz(sizeof(AVIStream)); if (!ast) goto fail; @@ -460,7 +459,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) av_freep(&s->streams[0]); s->nb_streams = 0; if (CONFIG_DV_DEMUXER) { - avi->dv_demux = dv_init_demux(s); + avi->dv_demux = avpriv_dv_init_demux(s); if (!avi->dv_demux) goto fail; } @@ -504,7 +503,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) ast->scale = 1; } } - av_set_pts_info(st, 64, ast->scale, ast->rate); + avpriv_set_pts_info(st, 64, ast->scale, ast->rate); ast->cum_len=avio_rl32(pb); /* start */ st->nb_frames = avio_rl32(pb); @@ -666,9 +665,10 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) break; case MKTAG('i', 'n', 'd', 'x'): i= avio_tell(pb); - if(pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX)){ - read_braindead_odml_indx(s, 0); - } + if(pb->seekable && !(s->flags & AVFMT_FLAG_IGNIDX) && + read_braindead_odml_indx(s, 0) < 0 && + (s->error_recognition & AV_EF_EXPLODE)) + goto fail; avio_seek(pb, i+size, SEEK_SET); break; case MKTAG('v', 'p', 'r', 'p'): @@ -705,6 +705,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) if(size > 1000000){ av_log(s, AV_LOG_ERROR, "Something went wrong during header parsing, " "I will ignore it and try to continue anyway.\n"); + if (s->error_recognition & AV_EF_EXPLODE) + goto fail; avi->movi_list = avio_tell(pb) - 4; avi->movi_end = avio_size(pb); goto end_of_header; @@ -741,7 +743,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) clean_index(s); } - ff_metadata_conv_ctx(s, NULL, ff_avi_metadata_conv); + ff_metadata_conv_ctx(s, NULL, avi_metadata_conv); + ff_metadata_conv_ctx(s, NULL, ff_riff_info_conv); return 0; } @@ -779,11 +782,11 @@ static int read_gab2_sub(AVStream *st, AVPacket *pkt) { ast->sub_ctx->pb = pb; if (!avformat_open_input(&ast->sub_ctx, "", sub_demuxer, NULL)) { - av_read_packet(ast->sub_ctx, &ast->sub_pkt); + ff_read_packet(ast->sub_ctx, &ast->sub_pkt); *st->codec = *ast->sub_ctx->streams[0]->codec; ast->sub_ctx->streams[0]->codec->extradata = NULL; time_base = ast->sub_ctx->streams[0]->time_base; - av_set_pts_info(st, 64, time_base.num, time_base.den); + avpriv_set_pts_info(st, 64, time_base.num, time_base.den); } ast->sub_buffer = pkt->data; memset(pkt, 0, sizeof(*pkt)); @@ -821,7 +824,7 @@ static AVStream *get_subtitle_pkt(AVFormatContext *s, AVStream *next_st, ast = sub_st->priv_data; *pkt = ast->sub_pkt; pkt->stream_index = sub_st->index; - if (av_read_packet(ast->sub_ctx, &ast->sub_pkt) < 0) + if (ff_read_packet(ast->sub_ctx, &ast->sub_pkt) < 0) ast->sub_pkt.data = NULL; } return sub_st; @@ -840,12 +843,13 @@ static int avi_sync(AVFormatContext *s, int exit_early) { AVIContext *avi = s->priv_data; AVIOContext *pb = s->pb; - int n, d[8]; + int n; + unsigned int d[8]; unsigned int size; int64_t i, sync; start_sync: - memset(d, -1, sizeof(int)*8); + memset(d, -1, sizeof(d)); for(i=sync=avio_tell(pb); !pb->eof_reached; i++) { int j; @@ -857,7 +861,7 @@ start_sync: n= get_stream_idx(d+2); //av_log(s, AV_LOG_DEBUG, "%X %X %X %X %X %X %X %X %"PRId64" %d %d\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n); - if(i + (uint64_t)size > avi->fsize || d[0]<0) + if(i + (uint64_t)size > avi->fsize || d[0] > 127) continue; //parse ix## @@ -974,7 +978,7 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) void* dstr; if (CONFIG_DV_DEMUXER && avi->dv_demux) { - int size = dv_get_packet(avi->dv_demux, pkt); + int size = avpriv_dv_get_packet(avi->dv_demux, pkt); if (size >= 0) return size; } @@ -1074,7 +1078,7 @@ resync: if (CONFIG_DV_DEMUXER && avi->dv_demux) { dstr = pkt->destruct; - size = dv_produce_packet(avi->dv_demux, pkt, + size = avpriv_dv_produce_packet(avi->dv_demux, pkt, pkt->data, pkt->size); pkt->destruct = dstr; pkt->flags |= AV_PKT_FLAG_KEY; @@ -1241,20 +1245,16 @@ static int avi_load_index(AVFormatContext *s) (tag >> 16) & 0xff, (tag >> 24) & 0xff, size); - switch(tag) { - case MKTAG('i', 'd', 'x', '1'): - if (avi_read_idx1(s, size) < 0) - goto skip; + + if (tag == MKTAG('i', 'd', 'x', '1') && + avi_read_idx1(s, size) >= 0) { ret = 0; - goto the_end; - break; - default: - skip: - size += (size & 1); - if (avio_skip(pb, size) < 0) - goto the_end; // something is wrong here break; } + + size += (size & 1); + if (avio_skip(pb, size) < 0) + break; // something is wrong here } the_end: avio_seek(pb, pos, SEEK_SET); @@ -1268,7 +1268,7 @@ static void seek_subtitle(AVStream *st, AVStream *st2, int64_t timestamp) av_free_packet(&ast2->sub_pkt); if (avformat_seek_file(ast2->sub_ctx, 0, INT64_MIN, ts2, ts2, 0) >= 0 || avformat_seek_file(ast2->sub_ctx, 0, ts2, ts2, INT64_MAX, 0) >= 0) - av_read_packet(ast2->sub_ctx, &ast2->sub_pkt); + ff_read_packet(ast2->sub_ctx, &ast2->sub_pkt); } static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) @@ -1306,7 +1306,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp /* Feed the DV video stream version of the timestamp to the */ /* DV demux so it can synthesize correct timestamps. */ - dv_offset_reset(avi->dv_demux, timestamp); + ff_dv_offset_reset(avi->dv_demux, timestamp); avio_seek(s->pb, pos, SEEK_SET); avi->stream_index= -1; @@ -1366,7 +1366,7 @@ static int avi_read_close(AVFormatContext *s) if (ast) { if (ast->sub_ctx) { av_freep(&ast->sub_ctx->pb); - av_close_input_file(ast->sub_ctx); + avformat_close_input(&ast->sub_ctx); } av_free(ast->sub_buffer); av_free_packet(&ast->sub_pkt); @@ -1392,12 +1392,12 @@ static int avi_probe(AVProbeData *p) } AVInputFormat ff_avi_demuxer = { - "avi", - NULL_IF_CONFIG_SMALL("AVI format"), - sizeof(AVIContext), - avi_probe, - avi_read_header, - avi_read_packet, - avi_read_close, - avi_read_seek, + .name = "avi", + .long_name = NULL_IF_CONFIG_SMALL("AVI format"), + .priv_data_size = sizeof(AVIContext), + .read_probe = avi_probe, + .read_header = avi_read_header, + .read_packet = avi_read_packet, + .read_close = avi_read_close, + .read_seek = avi_read_seek, };