[FFmpeg-devel] [PATCH v3 2/3] avfilter/af_silencedetect: use AV_OPT_TYPE_DURATION
Gyan
ffmpeg at gyani.pro
Mon Oct 21 11:37:06 EEST 2019
On 08-10-2019 08:34 PM, lance.lmwang at gmail.com wrote:
> From: Limin Wang <lance.lmwang at gmail.com>
>
> Reviewed-by: Moritz Barsnick <barsnick at gmx.net>
> Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> ---
> doc/filters.texi | 4 +++-
> libavfilter/af_silencedetect.c | 10 ++++++----
> tests/fate/filter-video.mak | 2 +-
> 3 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 9bd63de..45ff5d4 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -4648,7 +4648,9 @@ Set noise tolerance. Can be specified in dB (in case "dB" is appended to the
> specified value) or amplitude ratio. Default is -60dB, or 0.001.
>
> @item duration, d
> -Set silence duration until notification (default is 2 seconds).
> +Set silence duration until notification (default is 2 seconds). See
> + at ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
> +for the accepted syntax.
>
> @item mono, m
> Process each channel separately, instead of combined. By default is disabled.
> diff --git a/libavfilter/af_silencedetect.c b/libavfilter/af_silencedetect.c
> index ed16f3d..3eb378d 100644
> --- a/libavfilter/af_silencedetect.c
> +++ b/libavfilter/af_silencedetect.c
> @@ -35,7 +35,7 @@
> typedef struct SilenceDetectContext {
> const AVClass *class;
> double noise; ///< noise amplitude ratio
> - double duration; ///< minimum duration of silence until notification
> + int64_t duration; ///< minimum duration of silence until notification
> int mono; ///< mono mode : check each channel separately (default = check when ALL channels are silent)
> int channels; ///< number of channels
> int independent_channels; ///< number of entries in following arrays (always 1 in mono mode)
> @@ -50,13 +50,14 @@ typedef struct SilenceDetectContext {
> AVRational time_base);
> } SilenceDetectContext;
>
> +#define MAX_DURATION (24*3600*1000000LL)
> #define OFFSET(x) offsetof(SilenceDetectContext, x)
> #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM
> static const AVOption silencedetect_options[] = {
> { "n", "set noise tolerance", OFFSET(noise), AV_OPT_TYPE_DOUBLE, {.dbl=0.001}, 0, DBL_MAX, FLAGS },
> { "noise", "set noise tolerance", OFFSET(noise), AV_OPT_TYPE_DOUBLE, {.dbl=0.001}, 0, DBL_MAX, FLAGS },
> - { "d", "set minimum duration in seconds", OFFSET(duration), AV_OPT_TYPE_DOUBLE, {.dbl=2.}, 0, 24*60*60, FLAGS },
> - { "duration", "set minimum duration in seconds", OFFSET(duration), AV_OPT_TYPE_DOUBLE, {.dbl=2.}, 0, 24*60*60, FLAGS },
> + { "d", "set minimum duration in seconds", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=2000000}, 0, MAX_DURATION,FLAGS },
> + { "duration", "set minimum duration in seconds", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=2000000}, 0, MAX_DURATION,FLAGS },
> { "mono", "check each channel separately", OFFSET(mono), AV_OPT_TYPE_BOOL, {.i64=0.}, 0, 1, FLAGS },
> { "m", "check each channel separately", OFFSET(mono), AV_OPT_TYPE_BOOL, {.i64=0.}, 0, 1, FLAGS },
> { NULL }
> @@ -142,6 +143,7 @@ static int config_input(AVFilterLink *inlink)
> int c;
>
> s->channels = inlink->channels;
> + s->duration = av_rescale(s->duration, inlink->sample_rate, AV_TIME_BASE);
> s->independent_channels = s->mono ? s->channels : 1;
> s->nb_null_samples = av_mallocz_array(sizeof(*s->nb_null_samples), s->independent_channels);
> if (!s->nb_null_samples)
> @@ -174,7 +176,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
> const int nb_channels = inlink->channels;
> const int srate = inlink->sample_rate;
> const int nb_samples = insamples->nb_samples * nb_channels;
> - const int64_t nb_samples_notify = srate * s->duration * (s->mono ? 1 : nb_channels);
> + const int64_t nb_samples_notify = s->duration * (s->mono ? 1 : nb_channels);
> int c;
>
> // scale number of null samples to the new sample rate
> diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
> index 0c6ee72..dd57a40 100644
> --- a/tests/fate/filter-video.mak
> +++ b/tests/fate/filter-video.mak
> @@ -747,7 +747,7 @@ fate-filter-metadata-cropdetect: CMD = run $(FILTER_METADATA_COMMAND) "sws_flags
> SILENCEDETECT_DEPS = FFPROBE AVDEVICE LAVFI_INDEV AMOVIE_FILTER TTA_DEMUXER TTA_DECODER SILENCEDETECT_FILTER
> FATE_METADATA_FILTER-$(call ALLYES, $(SILENCEDETECT_DEPS)) += fate-filter-metadata-silencedetect
> fate-filter-metadata-silencedetect: SRC = $(TARGET_SAMPLES)/lossless-audio/inside.tta
> -fate-filter-metadata-silencedetect: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',silencedetect=n=-33.5dB:d=.2"
> +fate-filter-metadata-silencedetect: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',silencedetect=n=-33.5dB:d=0.2"
>
> EBUR128_METADATA_DEPS = FFPROBE AVDEVICE LAVFI_INDEV AMOVIE_FILTER FLAC_DEMUXER FLAC_DECODER EBUR128_FILTER
> FATE_METADATA_FILTER-$(call ALLYES, $(EBUR128_METADATA_DEPS)) += fate-filter-metadata-ebur128
Will confirm FATE passes and push this and next in set.
Thanks,
Gyan
More information about the ffmpeg-devel
mailing list