X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Futils.c;h=07113107920a910d3b3094f01a1b3f8a58b11072;hb=0983e1395709c3e14904a5ab8ece32b326275b84;hp=56646464b680f941c58a6fe12772983d191e47f6;hpb=06136275e59c38806b04a1fc9cc92beb82db79b6;p=ffmpeg diff --git a/libavformat/utils.c b/libavformat/utils.c index 56646464b68..07113107920 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -328,6 +328,7 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, { "hevc", AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO }, { "loas", AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO }, { "m4v", AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO }, + { "mjpeg_2000",AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO }, { "mp3", AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO }, { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO }, { "truehd", AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO }, @@ -587,12 +588,26 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */ if (s->pb) - ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0); + ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta); + if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header) if ((ret = s->iformat->read_header(s)) < 0) goto fail; + if (!s->metadata) { + s->metadata = s->internal->id3v2_meta; + s->internal->id3v2_meta = NULL; + } else if (s->internal->id3v2_meta) { + int level = AV_LOG_WARNING; + if (s->error_recognition & AV_EF_COMPLIANT) + level = AV_LOG_ERROR; + av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n"); + av_dict_free(&s->internal->id3v2_meta); + if (s->error_recognition & AV_EF_EXPLODE) + return AVERROR_INVALIDDATA; + } + if (id3v2_extra_meta) { if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") || !strcmp(s->iformat->name, "tta")) { @@ -1980,7 +1995,7 @@ int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries, m = (a + b) >> 1; // Search for the next non-discarded packet. - while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b) { + while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) { m++; if (m == b && entries[m].timestamp >= wanted_timestamp) { m = b - 1; @@ -2597,11 +2612,14 @@ static void update_stream_timings(AVFormatContext *ic) if (ic->nb_programs > 1) { for (i = 0; i < ic->nb_programs; i++) { p = ic->programs[i]; - if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time) + if (p->start_time != AV_NOPTS_VALUE && + p->end_time > p->start_time && + p->end_time - (uint64_t)p->start_time <= INT64_MAX) duration = FFMAX(duration, p->end_time - p->start_time); } - } else + } else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) { duration = FFMAX(duration, end_time - start_time); + } } } if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) { @@ -3361,7 +3379,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) int64_t max_subtitle_analyze_duration; int64_t probesize = ic->probesize; int eof_reached = 0; - int64_t *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams"); + int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams"); flush_codecs = probesize > 0; @@ -3446,7 +3464,7 @@ FF_ENABLE_DEPRECATION_WARNINGS && codec && !avctx->codec) { if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0) av_log(ic, AV_LOG_WARNING, - "Failed to open codec in av_find_stream_info\n"); + "Failed to open codec in %s\n",__FUNCTION__); } // Try to just open decoders, in case this is enough to get parameters. @@ -3454,7 +3472,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (codec && !avctx->codec) if (avcodec_open2(avctx, codec, options ? &options[i] : &thread_opt) < 0) av_log(ic, AV_LOG_WARNING, - "Failed to open codec in av_find_stream_info\n"); + "Failed to open codec in %s\n",__FUNCTION__); } if (!options) av_dict_free(&thread_opt); @@ -3695,9 +3713,13 @@ FF_ENABLE_DEPRECATION_WARNINGS if (!has_codec_parameters(st, NULL)) { const AVCodec *codec = find_probe_decoder(ic, st, st->codecpar->codec_id); if (codec && !avctx->codec) { - if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : NULL) < 0) + AVDictionary *opts = NULL; + if (ic->codec_whitelist) + av_dict_set(&opts, "codec_whitelist", ic->codec_whitelist, 0); + if (avcodec_open2(avctx, codec, (options && stream_index < orig_nb_streams) ? &options[stream_index] : &opts) < 0) av_log(ic, AV_LOG_WARNING, - "Failed to open codec in av_find_stream_info\n"); + "Failed to open codec in %s\n",__FUNCTION__); + av_dict_free(&opts); } } @@ -4170,6 +4192,7 @@ void avformat_free_context(AVFormatContext *s) } av_freep(&s->chapters); av_dict_free(&s->metadata); + av_dict_free(&s->internal->id3v2_meta); av_freep(&s->streams); av_freep(&s->internal); flush_packet_queue(s); @@ -4210,8 +4233,11 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) int i; AVStream **streams; - if (s->nb_streams >= INT_MAX/sizeof(*streams)) + if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) { + if (s->max_streams < INT_MAX/sizeof(*streams)) + av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter (%d), see the documentation if you wish to increase it\n", s->max_streams); return NULL; + } streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams)); if (!streams) return NULL; @@ -5104,15 +5130,11 @@ uint8_t *av_stream_get_side_data(const AVStream *st, return NULL; } -uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, - int size) +int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, + uint8_t *data, size_t size) { AVPacketSideData *sd, *tmp; int i; - uint8_t *data = av_malloc(size); - - if (!data) - return NULL; for (i = 0; i < st->nb_side_data; i++) { sd = &st->side_data[i]; @@ -5121,14 +5143,16 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, av_freep(&sd->data); sd->data = data; sd->size = size; - return sd->data; + return 0; } } - tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp)); + if ((unsigned)st->nb_side_data + 1 >= INT_MAX / sizeof(*st->side_data)) + return AVERROR(ERANGE); + + tmp = av_realloc(st->side_data, (st->nb_side_data + 1) * sizeof(*tmp)); if (!tmp) { - av_freep(&data); - return NULL; + return AVERROR(ENOMEM); } st->side_data = tmp; @@ -5138,6 +5162,25 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, sd->type = type; sd->data = data; sd->size = size; + + return 0; +} + +uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, + int size) +{ + int ret; + uint8_t *data = av_malloc(size); + + if (!data) + return NULL; + + ret = av_stream_add_side_data(st, type, data, size); + if (ret < 0) { + av_freep(&data); + return NULL; + } + return data; }