From ef7b6b489ab38a8f0abe6b8f55c0e130cbd125c9 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 27 Mar 2013 22:08:53 +0100 Subject: [PATCH] ffmpeg/avformat: factor av_guess_frame_rate() out This will be used in ffplay Signed-off-by: Michael Niedermayer --- doc/APIchanges | 3 +++ ffmpeg_filter.c | 13 +++---------- libavformat/avformat.h | 10 ++++++++++ libavformat/utils.c | 16 ++++++++++++++++ libavformat/version.h | 2 +- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 255f9147ff..bc4d4febca 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2012-10-22 API changes, most recent first: +2013-03-29 - xxxxxxx - lavf 55.1.100 - avformat.h + Add av_guess_frame_rate() + 2013-03-20 - xxxxxxx - lavu 52.22.100 - opt.h Add AV_OPT_TYPE_DURATION value to AVOptionType enum. diff --git a/ffmpeg_filter.c b/ffmpeg_filter.c index 654c19d4c3..6824af6dee 100644 --- a/ffmpeg_filter.c +++ b/ffmpeg_filter.c @@ -542,22 +542,15 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter, InputStream *ist = ifilter->ist; AVRational tb = ist->framerate.num ? av_inv_q(ist->framerate) : ist->st->time_base; - AVRational fr = ist->framerate.num ? ist->framerate : - ist->st->r_frame_rate; + AVRational fr = ist->framerate; AVRational sar; AVBPrint args; char name[255]; int pad_idx = in->pad_idx; int ret; - if (!ist->framerate.num && ist->st->codec->ticks_per_frame>1) { - AVRational codec_fr = av_inv_q(ist->st->codec->time_base); - AVRational avg_fr = ist->st->avg_frame_rate; - codec_fr.den *= ist->st->codec->ticks_per_frame; - if ( codec_fr.num>0 && codec_fr.den>0 && av_q2d(codec_fr) < av_q2d(fr)*0.7 - && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr)))>0.1) - fr = codec_fr; - } + if (!fr.num) + fr = av_guess_frame_rate(input_files[ist->file_index]->ctx, ist->st, NULL); if (ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) { ret = sub2video_prepare(ist); diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 549a0fa45f..57603031a4 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -2107,6 +2107,16 @@ const struct AVCodecTag *avformat_get_riff_audio_tags(void); */ AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame); +/** + * Guess the frame rate, based on both the container and codec information. + * + * @param ctx the format context which the stream is part of + * @param stream the stream which the frame is part of + * @param frame the frame for which the frame rate should be determined, may be NULL + * @return the guessed (valid) frame rate, 0/1 if no idea + */ +AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame); + /** * Check if the stream st contained in s is matched by the stream specifier * spec. diff --git a/libavformat/utils.c b/libavformat/utils.c index df688f1817..d0393f9db2 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4278,6 +4278,22 @@ AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *strea return frame_sample_aspect_ratio; } +AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame) +{ + AVRational fr = st->r_frame_rate; + + if (st->codec->ticks_per_frame > 1) { + AVRational codec_fr = av_inv_q(st->codec->time_base); + AVRational avg_fr = st->avg_frame_rate; + codec_fr.den *= st->codec->ticks_per_frame; + if ( codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7 + && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1) + fr = codec_fr; + } + + return fr; +} + int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec) { diff --git a/libavformat/version.h b/libavformat/version.h index 6332878c9f..17447c0e08 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/avutil.h" #define LIBAVFORMAT_VERSION_MAJOR 55 -#define LIBAVFORMAT_VERSION_MINOR 0 +#define LIBAVFORMAT_VERSION_MINOR 1 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \