[FFmpeg-devel] [PATCH] fftools/ffmpeg: add option fps_skip_frames

Guo, Yejun yejun.guo at intel.com
Fri Oct 23 09:41:06 EEST 2020



> -----Original Message-----
> From: Guo, Yejun <yejun.guo at intel.com>
> Sent: 2020年10月15日 16:43
> To: ffmpeg-devel at ffmpeg.org
> Cc: Guo, Yejun <yejun.guo at intel.com>
> Subject: [PATCH] fftools/ffmpeg: add option fps_skip_frames
> 
> When dnn based filter is used with GPU as the underlying hardware, it is
> expected that the first model inference will be very slow due to the heavy
> workload in dnn framework (especially in compiler).
> Such 'loading' time are usually not added into FPS in graphics games, so, also add
> option fps_skip_frames to skip some frames in the beginning when calculate
> FPS.
> 
> Signed-off-by: Guo, Yejun <yejun.guo at intel.com>
> ---
>  fftools/ffmpeg.c     | 30 +++++++++++++++++++++++-------
>  fftools/ffmpeg.h     |  1 +
>  fftools/ffmpeg_opt.c |  3 +++
>  3 files changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 84306818a2..ee096f6748
> 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -1644,6 +1644,7 @@ static void print_report(int is_last_report, int64_t
> timer_start, int64_t cur_ti
>      double speed;
>      int64_t pts = INT64_MIN + 1;
>      static int64_t last_time = -1;
> +    static int64_t fps_skip_timer_start = -1;
>      static int qp_histogram[52];
>      int hours, mins, secs, us;
>      const char *hours_sign;
> @@ -1691,13 +1692,28 @@ static void print_report(int is_last_report, int64_t
> timer_start, int64_t cur_ti
>              float fps;
> 
>              frame_number = ost->frame_number;
> -            fps = t > 1 ? frame_number / t : 0;
> -            av_bprintf(&buf, "frame=%5d fps=%3.*f q=%3.1f ",
> -                     frame_number, fps < 9.95, fps, q);
> -            av_bprintf(&buf_script, "frame=%d\n", frame_number);
> -            av_bprintf(&buf_script, "fps=%.2f\n", fps);
> -            av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
> -                       ost->file_index, ost->index, q);
> +            if (fps_skip_frames < 0)
> +                fps_skip_frames = 0;
> +            if (frame_number <= fps_skip_frames) {
> +                fps_skip_timer_start = cur_time;
> +            } else if (fps_skip_frames > 0 && fps_skip_timer_start == -1) {
> +                av_log(NULL, AV_LOG_WARNING, "The first %d frames run
> very quickly, "
> +                                             "so skip these frames
> to calculate FPS\n", frame_number);
> +                fps_skip_timer_start = cur_time;
> +                fps_skip_frames = frame_number;
> +            } else {
> +                fps = t > 1 ? frame_number / t : 0;
> +                if (fps_skip_frames > 0) {
> +                    float newt = (cur_time - fps_skip_timer_start) /
> 1000000.0;
> +                    fps = newt > 1 ? (frame_number - fps_skip_frames) *
> 1.0f / newt : 0;
> +                }
> +                av_bprintf(&buf, "frame=%5d fps=%3.*f q=%3.1f ",
> +                         frame_number, fps < 9.95, fps, q);
> +                av_bprintf(&buf_script, "frame=%d\n", frame_number);
> +                av_bprintf(&buf_script, "fps=%.2f\n", fps);
> +                av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
> +                           ost->file_index, ost->index, q);
> +            }
>              if (is_last_report)
>                  av_bprintf(&buf, "L");
>              if (qp_hist) {
> diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 8665218dcf..af35dd5429
> 100644
> --- a/fftools/ffmpeg.h
> +++ b/fftools/ffmpeg.h
> @@ -609,6 +609,7 @@ extern int frame_bits_per_raw_sample;  extern
> AVIOContext *progress_avio;  extern float max_error_rate;  extern char
> *videotoolbox_pixfmt;
> +extern int fps_skip_frames;
> 
>  extern int filter_nbthreads;
>  extern int filter_complex_nbthreads;
> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index
> 19f719e3ff..cfe2b7f8ba 100644
> --- a/fftools/ffmpeg_opt.c
> +++ b/fftools/ffmpeg_opt.c
> @@ -173,6 +173,7 @@ int filter_nbthreads = 0;  int filter_complex_nbthreads
> = 0;  int vstats_version = 2;  int auto_conversion_filters = 1;
> +int fps_skip_frames = 0;
> 
> 
>  static int intra_only         = 0;
> @@ -3674,6 +3675,8 @@ const OptionDef options[] = {
>      { "autoscale",        HAS_ARG | OPT_BOOL | OPT_SPEC |
>                            OPT_EXPERT | OPT_OUTPUT,
> { .off = OFFSET(autoscale) },
>          "automatically insert a scale filter at the end of the filter graph" },
> +    { "fps_skip_frames",  OPT_INT | HAS_ARG | OPT_EXPERT,
> { &fps_skip_frames },
> +        "the number of frames skipped at beginning when calculate
> + FPS"},
> 
>      /* audio options */
>      { "aframes",        OPT_AUDIO | HAS_ARG  | OPT_PERFILE |
> OPT_OUTPUT,           { .func_arg = opt_audio_frames },
> --
> 2.17.1

this patch asks for review, thanks.



More information about the ffmpeg-devel mailing list