[FFmpeg-devel] [PATCH] lavf: consider codec timebase for framerate detection

wm4 nfxjfg at googlemail.com
Tue May 23 14:48:59 EEST 2017


On Tue, 23 May 2017 13:36:51 +0200
wm4 <nfxjfg at googlemail.com> wrote:

> Fixes detection of some TV sample as 24.5 FPS. With the patch applied,
> it's detected as 25 FPS.
> ---
>  libavformat/utils.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index fbd8b58ac2..778a82aeee 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -3903,6 +3903,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>                  st->info->codec_info_duration) {
>                  int best_fps      = 0;
>                  double best_error = 0.01;
> +                AVRational codec_frame_rate = av_inv_q(avctx->time_base);
>  
>                  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 ||
> @@ -3924,6 +3925,27 @@ FF_ENABLE_DEPRECATION_WARNINGS
>                          best_fps   = std_fps.num;
>                      }
>                  }
> +                if (avctx->ticks_per_frame > 0)
> +                    codec_frame_rate.num /= avctx->ticks_per_frame;
> +                for (j = 0; j < MAX_STD_TIMEBASES; j++) {
> +                    AVRational std_fps = { get_std_framerate(j), 12 * 1001 };
> +                    double error       = fabs(av_q2d(st->avg_frame_rate) /
> +                                              av_q2d(std_fps) - 1);
> +
> +                    if (error < best_error) {
> +                        best_error = error;
> +                        best_fps   = std_fps.num;
> +                    }
> +
> +                    if (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,
>                                best_fps, 12 * 1001, INT_MAX);

Oops, the patch got mangled. The loop above the additions should have
been replaced. This should compute the same result anyway, and I'll
remove it before pushing.


More information about the ffmpeg-devel mailing list