[FFmpeg-devel] [PATCH] avfilter/select: evaluate silencedetect metadata

Gyan Doshi ffmpeg at gyani.pro
Fri Jun 18 07:19:16 EEST 2021



On 2021-06-18 01:53, Timo Rothenpieler wrote:
> ---
>   doc/filters.texi       |  6 ++++++
>   libavfilter/f_select.c | 18 ++++++++++++++++++
>   libavfilter/version.h  |  2 +-
>   3 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index da8f7d7726..db6ecd7c2a 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -5404,6 +5404,7 @@ Set sidechain gain. Default is 1. Range is from 0.015625 to 64.
>   
>   This filter supports the all above options as @ref{commands}.
>   
> + at anchor{silencedetect}
>   @section silencedetect
>   
>   Detect silence in an audio stream.
> @@ -25564,6 +25565,11 @@ missing.
>   That basically means that an input frame is selected if its pts is within the
>   interval set by the concat demuxer.
>   
> + at item silence_detected
> +Evaluates the metadata added to frames by the @ref{silencedetect} filter.
> +The @var{silence_detected} variable is -1 if silence was detected for the current
> +frame, 0 otherwise.
> +

Instead of a specific option for silencedetect, it would be future-proof 
if it was an option called, say, metadata with a constant for 
silencedetect to start with.
There are multiple per-frame analysis filters like blackframe, 
blackdetect, freezedetect..etc and it will be easier to just extend 
'metadata' with new constants
than to add a new option for each filter.

>   @end table
>   
>   The default value of the select expression is "1".
> diff --git a/libavfilter/f_select.c b/libavfilter/f_select.c
> index f0468078e8..1e655290f4 100644
> --- a/libavfilter/f_select.c
> +++ b/libavfilter/f_select.c
> @@ -86,6 +86,8 @@ static const char *const var_names[] = {
>   
>       "concatdec_select",  ///< frame is within the interval set by the concat demuxer
>   
> +    "silence_detected",  ///< silencedetect detected silence for this frame
> +
>       NULL
>   };
>   
> @@ -138,6 +140,8 @@ enum var_name {
>   
>       VAR_CONCATDEC_SELECT,
>   
> +    VAR_SILENCE_DETECTED,
> +
>       VAR_VARS_NB
>   };
>   
> @@ -157,6 +161,7 @@ typedef struct SelectContext {
>       double select;
>       int select_out;                 ///< mark the selected output pad index
>       int nb_outputs;
> +    int silence_detected;
>   } SelectContext;
>   
>   #define OFFSET(x) offsetof(SelectContext, x)
> @@ -325,6 +330,18 @@ static double get_concatdec_select(AVFrame *frame, int64_t pts)
>       return NAN;
>   }
>   
> +static double get_silence_detected(SelectContext *select, AVFrame *frame)
> +{
> +    AVDictionary *metadata = frame->metadata;
> +    AVDictionaryEntry *start = av_dict_get(metadata, "lavfi.silence_start", NULL, 0);
> +    AVDictionaryEntry *end = av_dict_get(metadata, "lavfi.silence_end", NULL, 0);
> +    if (start)
> +        select->silence_detected = -1;
> +    if (end)
> +        select->silence_detected = 0;
> +    return select->silence_detected;
> +}
> +
>   static void select_frame(AVFilterContext *ctx, AVFrame *frame)
>   {
>       SelectContext *select = ctx->priv;
> @@ -342,6 +359,7 @@ static void select_frame(AVFilterContext *ctx, AVFrame *frame)
>       select->var_values[VAR_POS] = frame->pkt_pos == -1 ? NAN : frame->pkt_pos;
>       select->var_values[VAR_KEY] = frame->key_frame;
>       select->var_values[VAR_CONCATDEC_SELECT] = get_concatdec_select(frame, av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q));
> +    select->var_values[VAR_SILENCE_DETECTED] = get_silence_detected(select, frame);
>   
>       switch (inlink->type) {
>       case AVMEDIA_TYPE_AUDIO:
> diff --git a/libavfilter/version.h b/libavfilter/version.h
> index 5052681653..fbb81ef31c 100644
> --- a/libavfilter/version.h
> +++ b/libavfilter/version.h
> @@ -31,7 +31,7 @@
>   
>   #define LIBAVFILTER_VERSION_MAJOR   8
>   #define LIBAVFILTER_VERSION_MINOR   0
> -#define LIBAVFILTER_VERSION_MICRO 102
> +#define LIBAVFILTER_VERSION_MICRO 103
>   
>   
>   #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \



More information about the ffmpeg-devel mailing list