[FFmpeg-cvslog] avfilter/af_aspectralstats: allow to select subset of measurements

Paul B Mahol git at videolan.org
Tue Oct 11 19:11:55 EEST 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Tue Oct 11 18:08:40 2022 +0200| [504fbc21491516faded95851bbe1c21a942dc64d] | committer: Paul B Mahol

avfilter/af_aspectralstats: allow to select subset of measurements

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=504fbc21491516faded95851bbe1c21a942dc64d
---

 doc/filters.texi                |   4 ++
 libavfilter/af_aspectralstats.c | 111 ++++++++++++++++++++++++++++++----------
 2 files changed, 89 insertions(+), 26 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index 68205147f0..5380b79d28 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -2961,6 +2961,10 @@ Default is @code{hann}.
 Set window overlap. Allowed range is from @code{0}
 to @code{1}. Default value is @code{0.5}.
 
+ at item measure
+Select the parameters which are measured. The metadata keys can
+be used as flags, default is @option{all} which measures everything.
+ at option{none} disables all measurement.
 @end table
 
 A list of each metadata key follows:
diff --git a/libavfilter/af_aspectralstats.c b/libavfilter/af_aspectralstats.c
index cac5d01bca..1839e3cf26 100644
--- a/libavfilter/af_aspectralstats.c
+++ b/libavfilter/af_aspectralstats.c
@@ -29,6 +29,22 @@
 #include "internal.h"
 #include "window_func.h"
 
+#define MEASURE_ALL       UINT_MAX
+#define MEASURE_NONE      0
+#define MEASURE_MEAN     (1 <<  0)
+#define MEASURE_VARIANCE (1 <<  1)
+#define MEASURE_CENTROID (1 <<  2)
+#define MEASURE_SPREAD   (1 <<  3)
+#define MEASURE_SKEWNESS (1 <<  4)
+#define MEASURE_KURTOSIS (1 <<  5)
+#define MEASURE_ENTROPY  (1 <<  6)
+#define MEASURE_FLATNESS (1 <<  7)
+#define MEASURE_CREST    (1 <<  8)
+#define MEASURE_FLUX     (1 <<  9)
+#define MEASURE_SLOPE    (1 << 10)
+#define MEASURE_DECREASE (1 << 11)
+#define MEASURE_ROLLOFF  (1 << 12)
+
 typedef struct ChannelSpectralStats {
     float mean;
     float variance;
@@ -47,6 +63,7 @@ typedef struct ChannelSpectralStats {
 
 typedef struct AudioSpectralStatsContext {
     const AVClass *class;
+    unsigned measure;
     int win_size;
     int win_func;
     float overlap;
@@ -70,6 +87,22 @@ static const AVOption aspectralstats_options[] = {
     { "win_size", "set the window size", OFFSET(win_size), AV_OPT_TYPE_INT, {.i64=2048}, 32, 65536, A },
     WIN_FUNC_OPTION("win_func", OFFSET(win_func), A, WFUNC_HANNING),
     { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0,  1, A },
+    { "measure", "select the parameters which are measured", OFFSET(measure), AV_OPT_TYPE_FLAGS, {.i64=MEASURE_ALL}, 0, UINT_MAX, A, "measure" },
+    { "none",     "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NONE    }, 0, 0, A, "measure" },
+    { "all",      "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_ALL     }, 0, 0, A, "measure" },
+    { "mean",     "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_MEAN    }, 0, 0, A, "measure" },
+    { "variance", "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_VARIANCE}, 0, 0, A, "measure" },
+    { "centroid", "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_CENTROID}, 0, 0, A, "measure" },
+    { "spread",   "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_SPREAD  }, 0, 0, A, "measure" },
+    { "skewness", "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_SKEWNESS}, 0, 0, A, "measure" },
+    { "kurtosis", "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_KURTOSIS}, 0, 0, A, "measure" },
+    { "entropy",  "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_ENTROPY }, 0, 0, A, "measure" },
+    { "flatness", "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_FLATNESS}, 0, 0, A, "measure" },
+    { "crest",    "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_CREST   }, 0, 0, A, "measure" },
+    { "flux",     "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_FLUX    }, 0, 0, A, "measure" },
+    { "slope",    "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_SLOPE   }, 0, 0, A, "measure" },
+    { "decrease", "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_DECREASE}, 0, 0, A, "measure" },
+    { "rolloff",  "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_ROLLOFF }, 0, 0, A, "measure" },
     { NULL }
 };
 
@@ -166,19 +199,32 @@ static void set_metadata(AudioSpectralStatsContext *s, AVDictionary **metadata)
     for (int ch = 0; ch < s->nb_channels; ch++) {
         ChannelSpectralStats *stats = &s->stats[ch];
 
-        set_meta(metadata, ch + 1, "mean",     "%g", stats->mean);
-        set_meta(metadata, ch + 1, "variance", "%g", stats->variance);
-        set_meta(metadata, ch + 1, "centroid", "%g", stats->centroid);
-        set_meta(metadata, ch + 1, "spread",   "%g", stats->spread);
-        set_meta(metadata, ch + 1, "skewness", "%g", stats->skewness);
-        set_meta(metadata, ch + 1, "kurtosis", "%g", stats->kurtosis);
-        set_meta(metadata, ch + 1, "entropy",  "%g", stats->entropy);
-        set_meta(metadata, ch + 1, "flatness", "%g", stats->flatness);
-        set_meta(metadata, ch + 1, "crest",    "%g", stats->crest);
-        set_meta(metadata, ch + 1, "flux",     "%g", stats->flux);
-        set_meta(metadata, ch + 1, "slope",    "%g", stats->slope);
-        set_meta(metadata, ch + 1, "decrease", "%g", stats->decrease);
-        set_meta(metadata, ch + 1, "rolloff",  "%g", stats->rolloff);
+        if (s->measure & MEASURE_MEAN)
+            set_meta(metadata, ch + 1, "mean",     "%g", stats->mean);
+        if (s->measure & MEASURE_VARIANCE)
+            set_meta(metadata, ch + 1, "variance", "%g", stats->variance);
+        if (s->measure & MEASURE_CENTROID)
+            set_meta(metadata, ch + 1, "centroid", "%g", stats->centroid);
+        if (s->measure & MEASURE_SPREAD)
+            set_meta(metadata, ch + 1, "spread",   "%g", stats->spread);
+        if (s->measure & MEASURE_SKEWNESS)
+            set_meta(metadata, ch + 1, "skewness", "%g", stats->skewness);
+        if (s->measure & MEASURE_KURTOSIS)
+            set_meta(metadata, ch + 1, "kurtosis", "%g", stats->kurtosis);
+        if (s->measure & MEASURE_ENTROPY)
+            set_meta(metadata, ch + 1, "entropy",  "%g", stats->entropy);
+        if (s->measure & MEASURE_FLATNESS)
+            set_meta(metadata, ch + 1, "flatness", "%g", stats->flatness);
+        if (s->measure & MEASURE_CREST)
+            set_meta(metadata, ch + 1, "crest",    "%g", stats->crest);
+        if (s->measure & MEASURE_FLUX)
+            set_meta(metadata, ch + 1, "flux",     "%g", stats->flux);
+        if (s->measure & MEASURE_SLOPE)
+            set_meta(metadata, ch + 1, "slope",    "%g", stats->slope);
+        if (s->measure & MEASURE_DECREASE)
+            set_meta(metadata, ch + 1, "decrease", "%g", stats->decrease);
+        if (s->measure & MEASURE_ROLLOFF)
+            set_meta(metadata, ch + 1, "rolloff",  "%g", stats->rolloff);
     }
 }
 
@@ -424,19 +470,32 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job
         for (int n = 0; n < s->win_size / 2; n++)
             magnitude[n] = hypotf(fft_out[n].re, fft_out[n].im);
 
-        stats->mean     = spectral_mean(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->variance = spectral_variance(magnitude, s->win_size / 2, in->sample_rate / 2, stats->mean);
-        stats->centroid = spectral_centroid(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->spread   = spectral_spread(magnitude, s->win_size / 2, in->sample_rate / 2, stats->centroid);
-        stats->skewness = spectral_skewness(magnitude, s->win_size / 2, in->sample_rate / 2, stats->centroid, stats->spread);
-        stats->kurtosis = spectral_kurtosis(magnitude, s->win_size / 2, in->sample_rate / 2, stats->centroid, stats->spread);
-        stats->entropy  = spectral_entropy(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->flatness = spectral_flatness(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->crest    = spectral_crest(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->flux     = spectral_flux(magnitude, prev_magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->slope    = spectral_slope(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->decrease = spectral_decrease(magnitude, s->win_size / 2, in->sample_rate / 2);
-        stats->rolloff  = spectral_rolloff(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & (MEASURE_MEAN | MEASURE_VARIANCE))
+            stats->mean     = spectral_mean(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_VARIANCE)
+            stats->variance = spectral_variance(magnitude, s->win_size / 2, in->sample_rate / 2, stats->mean);
+        if (s->measure & (MEASURE_SPREAD | MEASURE_KURTOSIS | MEASURE_SKEWNESS | MEASURE_CENTROID))
+            stats->centroid = spectral_centroid(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & (MEASURE_SPREAD | MEASURE_KURTOSIS | MEASURE_SKEWNESS))
+            stats->spread   = spectral_spread(magnitude, s->win_size / 2, in->sample_rate / 2, stats->centroid);
+        if (s->measure & MEASURE_SKEWNESS)
+            stats->skewness = spectral_skewness(magnitude, s->win_size / 2, in->sample_rate / 2, stats->centroid, stats->spread);
+        if (s->measure & MEASURE_KURTOSIS)
+            stats->kurtosis = spectral_kurtosis(magnitude, s->win_size / 2, in->sample_rate / 2, stats->centroid, stats->spread);
+        if (s->measure & MEASURE_ENTROPY)
+            stats->entropy  = spectral_entropy(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_FLATNESS)
+            stats->flatness = spectral_flatness(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_CREST)
+            stats->crest    = spectral_crest(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_FLUX)
+            stats->flux     = spectral_flux(magnitude, prev_magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_SLOPE)
+            stats->slope    = spectral_slope(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_DECREASE)
+            stats->decrease = spectral_decrease(magnitude, s->win_size / 2, in->sample_rate / 2);
+        if (s->measure & MEASURE_ROLLOFF)
+            stats->rolloff  = spectral_rolloff(magnitude, s->win_size / 2, in->sample_rate / 2);
 
         memcpy(prev_magnitude, magnitude, s->win_size * sizeof(float));
     }



More information about the ffmpeg-cvslog mailing list