summaryrefslogtreecommitdiff
path: root/libavfilter/avf_showvolume.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2022-12-06 10:37:40 +0100
committerPaul B Mahol <onemda@gmail.com>2022-12-06 17:31:56 +0100
commitcc11afe502057b8fde36e996fbb2f5ca3eb1c285 (patch)
treee019c3379123d9ac03e94b90a9b0aa209e7206f5 /libavfilter/avf_showvolume.c
parent45216e33e295f27b52bb0e829284f682ba48b7c8 (diff)
downloadffmpeg-cc11afe502057b8fde36e996fbb2f5ca3eb1c285.tar.gz
avfilter/avf_showvolume: make rms meter actually get rms of whole frame
Diffstat (limited to 'libavfilter/avf_showvolume.c')
-rw-r--r--libavfilter/avf_showvolume.c29
1 files 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);