[FFmpeg-devel,v3,2/3] avfilter/af_silencedetect: use AV_OPT_TYPE_DURATION

Submitted by lance.lmwang@gmail.com on Oct. 8, 2019, 3:04 p.m.

Details

Message ID 20191008150453.30222-2-lance.lmwang@gmail.com
State Accepted
Commit 190f52ba3b16fd746886cb288a418db6afe9917e
Headers show

Commit Message

lance.lmwang@gmail.com Oct. 8, 2019, 3:04 p.m.
From: Limin Wang <lance.lmwang@gmail.com>

Reviewed-by: Moritz Barsnick <barsnick@gmx.net>
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
---
 doc/filters.texi               |  4 +++-
 libavfilter/af_silencedetect.c | 10 ++++++----
 tests/fate/filter-video.mak    |  2 +-
 3 files changed, 10 insertions(+), 6 deletions(-)

Comments

Gyan Oct. 21, 2019, 8:37 a.m.
On 08-10-2019 08:34 PM, lance.lmwang@gmail.com wrote:
> From: Limin Wang <lance.lmwang@gmail.com>
>
> Reviewed-by: Moritz Barsnick <barsnick@gmx.net>
> Signed-off-by: Limin Wang <lance.lmwang@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
> +@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

Patch hide | download patch | download mbox

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
+@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