[FFmpeg-devel] [PATCH v2] avfilter/vf_freezedetect: add discard option to force drop freezen frame

Paul B Mahol onemda at gmail.com
Tue Oct 8 11:03:52 EEST 2019


On 10/8/19, Paul B Mahol <onemda at gmail.com> wrote:
> On 10/8/19, lance.lmwang at gmail.com <lance.lmwang at gmail.com> wrote:
>> From: Limin Wang <lance.lmwang at gmail.com>
>>
>> How to tested it, please try with the following command:
>> ./ffmpeg  -f lavfi -i
>> "smptebars=duration=5:size=1280x720:rate=30,freezedetect=d=1:discard=0"
>> -f
>> null -
>> frame=  150 fps=0.0 q=-0.0 Lsize=N/A time=00:00:05.00 bitrate=N/A speed=
>> 234x
>>
>> ./ffmpeg  -f lavfi -i
>> "smptebars=duration=5:size=1280x720:rate=30,freezedetect=d=1:discard=1"
>> -f
>> null -
>> frame=   30 fps=0.0 q=-0.0 Lsize=N/A time=00:00:01.00 bitrate=N/A
>> speed=59.7x
>>
>> Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
>> ---
>>  doc/filters.texi              | 10 ++++++++++
>>  libavfilter/vf_freezedetect.c |  8 +++++++-
>>  2 files changed, 17 insertions(+), 1 deletion(-)
>>
>> diff --git a/doc/filters.texi b/doc/filters.texi
>> index 333f502083..8aa7471f7e 100644
>> --- a/doc/filters.texi
>> +++ b/doc/filters.texi
>> @@ -10678,6 +10678,9 @@ timestamp of the first frame of the freeze. The
>>  @code{lavfi.freezedetect.freeze_duration} and
>>  @code{lavfi.freezedetect.freeze_end} metadata keys are set on the first
>> frame
>>  after the freeze.
>> +In addition, you can choose to discard the freezen frames instead of
>> report
>> +by metadata. Please note the first few freezen frames (the detection
>> interval)
>> +won't be dropped for the filter doesn't buffer any frames.
>
> This is no go. You can not claim one and do something else completely
> differently.
>
> If you want to drop frozen frames it should drop all frozen frames.
> If you want to trim frozen frames it should trim all frozen frames.

Also you can already drop frames with metadata filter and its select mode.

something like freezedetect,metadata=mode=select:key=lavfi.freezedetect.freeze_amount:value=some_frozen_amount:function=greater

You just need to export frozen value from freezedetect filter for each
output frame metadata.

>
>
>>
>>  The filter accepts the following options:
>>
>> @@ -10689,6 +10692,13 @@ specified value) or as a difference ratio between
>> 0
>> and 1. Default is -60dB, or
>>
>>  @item duration, d
>>  Set freeze duration until notification (default is 2 seconds).
>> +
>> + at item discard
>> +Set force to discard freezen frame.
>> + 0:  do nothing
>> + 1:  discard freezen frame
>> +
>> +Default is 0
>>  @end table
>>
>>  @anchor{frei0r}
>> diff --git a/libavfilter/vf_freezedetect.c
>> b/libavfilter/vf_freezedetect.c
>> index cc086afee6..cc115eb521 100644
>> --- a/libavfilter/vf_freezedetect.c
>> +++ b/libavfilter/vf_freezedetect.c
>> @@ -45,6 +45,8 @@ typedef struct FreezeDetectContext {
>>
>>      double noise;
>>      int64_t duration;            ///< minimum duration of frozen frame
>> until notification
>> +
>> +    int discard;                 ///< 0: no discard, 1: discard freezen
>> frame
>>  } FreezeDetectContext;
>>
>>  #define OFFSET(x) offsetof(FreezeDetectContext, x)
>> @@ -56,6 +58,7 @@ static const AVOption freezedetect_options[] = {
>>      { "noise",               "set noise tolerance",
>> OFFSET(noise),  AV_OPT_TYPE_DOUBLE,   {.dbl=0.001},     0,       1.0, V|F
>> },
>>      { "d",                   "set minimum duration in seconds",
>> OFFSET(duration),  AV_OPT_TYPE_DURATION, {.i64=2000000},   0, INT64_MAX,
>> V|F
>> },
>>      { "duration",            "set minimum duration in seconds",
>> OFFSET(duration),  AV_OPT_TYPE_DURATION, {.i64=2000000},   0, INT64_MAX,
>> V|F
>> },
>> +    { "discard",             "set frame discard flag",
>> OFFSET(discard),   AV_OPT_TYPE_BOOL,     {.i64=0},         0,         1,
>> V|F
>> },
>>
>>      {NULL}
>>  };
>> @@ -196,7 +199,10 @@ static int activate(AVFilterContext *ctx)
>>                  return AVERROR(ENOMEM);
>>              }
>>          }
>> -        return ff_filter_frame(outlink, frame);
>> +        if (s->discard && s->frozen) {
>> +            av_frame_free(&frame);
>> +        } else
>> +            return ff_filter_frame(outlink, frame);
>>      }
>>
>>      FF_FILTER_FORWARD_STATUS(inlink, outlink);
>> --
>> 2.21.0
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list