[FFmpeg-devel] [PATCH v1] avfilter/vf_freezedetect: add metadata lavfi.freezedetect.mafd

Limin Wang lance.lmwang at gmail.com
Wed Oct 23 13:12:56 EEST 2019



ping, it's another approach to discard frozen frame, please comments.


On Thu, Oct 10, 2019 at 11:48:40AM +0800, lance.lmwang at gmail.com wrote:
> From: Limin Wang <lance.lmwang at gmail.com>
> 
> As suggested by Paul to support frozen frames discard, please refer to:
> https://patchwork.ffmpeg.org/patch/15423/
> 
> You can tested with below commands:
> 
> ./ffmpeg  -f lavfi -i "smptebars=duration=5:size=1280x720:rate=30,freezedetect,metadata=mode=select:key=lavfi.freezedetect.mafd:value=0.01:function=greater"  -f null -
> frame=    1 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.03 bitrate=N/A speed=2.14x
> 
> Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> ---
>  doc/filters.texi              | 9 +++++++++
>  libavfilter/vf_freezedetect.c | 7 +++++++
>  2 files changed, 16 insertions(+)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 55a8ebae56..cfc10c8479 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -10800,6 +10800,15 @@ timestamp of the first frame of the freeze. The
>  @code{lavfi.freezedetect.freeze_end} metadata keys are set on the first frame
>  after the freeze.
>  
> +The @code{lavfi.freezedetect.mafd} metadata key is set for all frames except the
> +first reference frame. You can use it to drop frozen frames by metadata select
> +mode. Note that in this way the first few frozen frames(the detection interval)
> +are dropped also. An example is as follows:
> + at example
> +freezedetect,metadata=mode=select:key=lavfi.freezedetect.mafd:value=0.001:function=greater
> + at end example
> +
> +
>  The filter accepts the following options:
>  
>  @table @option
> diff --git a/libavfilter/vf_freezedetect.c b/libavfilter/vf_freezedetect.c
> index cc086afee6..3931bcfa2e 100644
> --- a/libavfilter/vf_freezedetect.c
> +++ b/libavfilter/vf_freezedetect.c
> @@ -124,11 +124,14 @@ static av_cold void uninit(AVFilterContext *ctx)
>      av_frame_free(&s->reference_frame);
>  }
>  
> +static int set_meta(FreezeDetectContext *s, AVFrame *frame, const char *key, const char *value);
>  static int is_frozen(FreezeDetectContext *s, AVFrame *reference, AVFrame *frame)
>  {
>      uint64_t sad = 0;
>      uint64_t count = 0;
>      double mafd;
> +    char buf[64];
> +
>      for (int plane = 0; plane < 4; plane++) {
>          if (s->width[plane]) {
>              uint64_t plane_sad;
> @@ -141,6 +144,10 @@ static int is_frozen(FreezeDetectContext *s, AVFrame *reference, AVFrame *frame)
>      }
>      emms_c();
>      mafd = (double)sad / count / (1ULL << s->bitdepth);
> +
> +    snprintf(buf, sizeof(buf), "%0.5f", mafd);
> +    set_meta(s, frame, "lavfi.freezedetect.mafd", buf);
> +
>      return (mafd <= s->noise);
>  }
>  
> -- 
> 2.21.0
> 


More information about the ffmpeg-devel mailing list