[FFmpeg-cvslog] avfilter/avf_showvolume: make rms meter actually get rms of whole frame

Paul B Mahol git at videolan.org
Tue Dec 6 18:27:37 EET 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Tue Dec  6 10:37:40 2022 +0100| [cc11afe502057b8fde36e996fbb2f5ca3eb1c285] | committer: Paul B Mahol

avfilter/avf_showvolume: make rms meter actually get rms of whole frame

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

 libavfilter/avf_showvolume.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/libavfilter/avf_showvolume.c b/libavfilter/avf_showvolume.c
index 854d10be7a..952f079a67 100644
--- a/libavfilter/avf_showvolume.c
+++ b/libavfilter/avf_showvolume.c
@@ -56,7 +56,6 @@ typedef struct ShowVolumeContext {
     double *values;
     uint32_t *color_lut;
     float *max;
-    float rms_factor;
     int display_scale;
 
     double draw_persistent_duration; /* in second */
@@ -65,7 +64,7 @@ typedef struct ShowVolumeContext {
     float *max_persistent; /* max value for draw_persistent_max for each channel */
     int *nb_frames_max_display; /* number of frame for each channel, for displaying the max value */
 
-    void (*meter)(float *src, int nb_samples, float *max, float factor);
+    void (*meter)(float *src, int nb_samples, float *max);
 } ShowVolumeContext;
 
 #define OFFSET(x) offsetof(ShowVolumeContext, x)
@@ -143,21 +142,23 @@ static int query_formats(AVFilterContext *ctx)
     return 0;
 }
 
-static void find_peak(float *src, int nb_samples, float *peak, float factor)
+static void find_peak(float *src, int nb_samples, float *peak)
 {
-    int i;
+    float max = 0.f;
 
-    *peak = 0;
-    for (i = 0; i < nb_samples; i++)
-        *peak = FFMAX(*peak, FFABS(src[i]));
+    max = 0;
+    for (int i = 0; i < nb_samples; i++)
+        max = fmaxf(max, fabsf(src[i]));
+    *peak = max;
 }
 
-static void find_rms(float *src, int nb_samples, float *rms, float factor)
+static void find_rms(float *src, int nb_samples, float *rms)
 {
-    int i;
+    float sum = 0.f;
 
-    for (i = 0; i < nb_samples; i++)
-        *rms += factor * (src[i] * src[i] - *rms);
+    for (int i = 0; i < nb_samples; i++)
+        sum += src[i] * src[i];
+    *rms = sqrtf(sum / nb_samples);
 }
 
 static int config_input(AVFilterLink *inlink)
@@ -178,8 +179,6 @@ static int config_input(AVFilterLink *inlink)
     if (!s->max)
         return AVERROR(ENOMEM);
 
-    s->rms_factor = 10000. / inlink->sample_rate;
-
     switch (s->mode) {
     case 0: s->meter = find_peak; break;
     case 1: s->meter = find_rms;  break;
@@ -363,7 +362,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
             uint32_t *lut = s->color_lut + s->w * c;
             float max;
 
-            s->meter(src, insamples->nb_samples, &s->max[c], s->rms_factor);
+            s->meter(src, insamples->nb_samples, &s->max[c]);
             max = s->max[c];
 
             s->values[c * VAR_VARS_NB + VAR_VOLUME] = 20.0 * log10(max);
@@ -398,7 +397,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples)
             uint32_t *lut = s->color_lut + s->w * c;
             float max;
 
-            s->meter(src, insamples->nb_samples, &s->max[c], s->rms_factor);
+            s->meter(src, insamples->nb_samples, &s->max[c]);
             max = s->max[c];
 
             s->values[c * VAR_VARS_NB + VAR_VOLUME] = 20.0 * log10(max);



More information about the ffmpeg-cvslog mailing list