X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Futils.c;h=7abca632b56ff4f7a559f0e1a768f3c614c453eb;hb=5a9415533dd064d44605b3a3896a53377b7a5ca8;hp=ba82a766dc50b658ff44fc27086491ce9a2337a9;hpb=18e2a446c52b0a5cb520f9b68d8fd4171a5f6471;p=ffmpeg diff --git a/libavformat/utils.c b/libavformat/utils.c index ba82a766dc5..7abca632b56 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -533,6 +533,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, if ((ret = av_opt_set_dict(s, &tmp)) < 0) goto fail; + av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename)); if ((ret = init_input(s, filename, &tmp)) < 0) goto fail; s->probe_score = ret; @@ -570,7 +571,6 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, } s->duration = s->start_time = AV_NOPTS_VALUE; - av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename)); /* Allocate private data. */ if (s->iformat->priv_data_size > 0) { @@ -894,12 +894,13 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) static int determinable_frame_size(AVCodecContext *avctx) { - if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/ - avctx->codec_id == AV_CODEC_ID_MP1 || - avctx->codec_id == AV_CODEC_ID_MP2 || - avctx->codec_id == AV_CODEC_ID_MP3/* || - avctx->codec_id == AV_CODEC_ID_CELT*/) + switch(avctx->codec_id) { + case AV_CODEC_ID_MP1: + case AV_CODEC_ID_MP2: + case AV_CODEC_ID_MP3: return 1; + } + return 0; } @@ -3166,7 +3167,7 @@ static void compute_chapters_end(AVFormatContext *s) if (j != i && next_start > ch->start && next_start < end) end = next_start; } - ch->end = (end == INT64_MAX) ? ch->start : end; + ch->end = (end == INT64_MAX || end < ch->start) ? ch->start : end; } } @@ -3903,6 +3904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS st->info->codec_info_duration) { int best_fps = 0; double best_error = 0.01; + AVRational codec_frame_rate = avctx->framerate; if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2|| st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den || @@ -3923,6 +3925,15 @@ FF_ENABLE_DEPRECATION_WARNINGS best_error = error; best_fps = std_fps.num; } + + if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) { + error = fabs(av_q2d(codec_frame_rate) / + av_q2d(std_fps) - 1); + if (error < best_error) { + best_error = error; + best_fps = std_fps.num; + } + } } if (best_fps) av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den, @@ -3932,8 +3943,8 @@ FF_ENABLE_DEPRECATION_WARNINGS if (!st->r_frame_rate.num) { if ( avctx->time_base.den * (int64_t) st->time_base.num <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) { - st->r_frame_rate.num = avctx->time_base.den; - st->r_frame_rate.den = avctx->time_base.num * avctx->ticks_per_frame; + av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, + avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX); } else { st->r_frame_rate.num = st->time_base.den; st->r_frame_rate.den = st->time_base.num; @@ -4097,7 +4108,11 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, AVCodec **decoder_ret, int flags) { int i, nb_streams = ic->nb_streams; - int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe; + int ret = AVERROR_STREAM_NOT_FOUND; + int best_count = -1, best_multiframe = -1, best_disposition = -1; + int count, multiframe, disposition; + int64_t best_bitrate = -1; + int64_t bitrate; unsigned *program = NULL; const AVCodec *decoder = NULL, *best_decoder = NULL; @@ -4116,10 +4131,6 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, continue; if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb) continue; - if (wanted_stream_nb != real_stream_index && - st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | - AV_DISPOSITION_VISUAL_IMPAIRED)) - continue; if (type == AVMEDIA_TYPE_AUDIO && !(par->channels && par->sample_rate)) continue; if (decoder_ret) { @@ -4130,13 +4141,16 @@ int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, continue; } } + disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED)); count = st->codec_info_nb_frames; bitrate = par->bit_rate; multiframe = FFMIN(5, count); - if ((best_multiframe > multiframe) || - (best_multiframe == multiframe && best_bitrate > bitrate) || - (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count)) + if ((best_disposition > disposition) || + (best_disposition == disposition && best_multiframe > multiframe) || + (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) || + (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count)) continue; + best_disposition = disposition; best_count = count; best_bitrate = bitrate; best_multiframe = multiframe; @@ -4266,9 +4280,7 @@ static void free_stream(AVStream **pst) av_freep(&st->index_entries); #if FF_API_LAVF_AVCTX FF_DISABLE_DEPRECATION_WARNINGS - av_freep(&st->codec->extradata); - av_freep(&st->codec->subtitle_header); - av_freep(&st->codec); + avcodec_free_context(&st->codec); FF_ENABLE_DEPRECATION_WARNINGS #endif av_freep(&st->priv_data); @@ -4321,8 +4333,8 @@ void avformat_free_context(AVFormatContext *s) av_dict_free(&s->metadata); av_dict_free(&s->internal->id3v2_meta); av_freep(&s->streams); - av_freep(&s->internal); flush_packet_queue(s); + av_freep(&s->internal); av_free(s); }