[FFmpeg-cvslog] avfilter/af_surround: improve front center channel

Paul B Mahol git at videolan.org
Fri Nov 18 22:49:19 EET 2022


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri Nov 18 13:18:57 2022 +0100| [08b4c3d6d6cb04e0468c5fbd4390ee96007e0d30] | committer: Paul B Mahol

avfilter/af_surround: improve front center channel

Stops producing too loud output of front center channel in stereo upmix
by using average magnitude instead of square root of squared magnitudes.

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

 libavfilter/af_surround.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/libavfilter/af_surround.c b/libavfilter/af_surround.c
index ed1bb3f9af..1fe6d44dab 100644
--- a/libavfilter/af_surround.c
+++ b/libavfilter/af_surround.c
@@ -108,6 +108,7 @@ typedef struct AudioSurroundContext {
     float *l_phase;
     float *r_phase;
     float *c_phase;
+    float *c_mag;
     float *lfe_mag;
     float *mag_total;
 
@@ -304,11 +305,12 @@ static int config_output(AVFilterLink *outlink)
     s->y_pos = av_calloc(s->rdft_size, sizeof(*s->y_pos));
     s->l_phase = av_calloc(s->rdft_size, sizeof(*s->l_phase));
     s->r_phase = av_calloc(s->rdft_size, sizeof(*s->r_phase));
+    s->c_mag   = av_calloc(s->rdft_size, sizeof(*s->c_mag));
     s->c_phase = av_calloc(s->rdft_size, sizeof(*s->c_phase));
     s->mag_total = av_calloc(s->rdft_size, sizeof(*s->mag_total));
     s->lfe_mag = av_calloc(s->rdft_size, sizeof(*s->lfe_mag));
     if (!s->x_pos || !s->y_pos || !s->l_phase || !s->r_phase ||
-        !s->c_phase || !s->mag_total || !s->lfe_mag)
+        !s->c_phase || !s->mag_total || !s->lfe_mag || !s->c_mag)
         return AVERROR(ENOMEM);
 
     return 0;
@@ -401,6 +403,7 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
     const float *l_phase = s->l_phase;
     const float *r_phase = s->r_phase;
     const float *lfe_mag = s->lfe_mag;
+    const float *c_mag = s->c_mag;
     const float *x = s->x_pos;
     const float *y = s->y_pos;
     const int chan = av_channel_layout_channel_from_index(&s->out_ch_layout, ch);
@@ -410,7 +413,7 @@ static int stereo_upmix(AVFilterContext *ctx, int ch)
     switch (chan) {
     case AV_CHAN_FRONT_CENTER:
         for (int n = 0; n < rdft_size; n++) {
-            float mag = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y) * mag_total[n];
+            float mag = powf(1.f - fabsf(x[n]), f_x) * powf((y[n] + 1.f) * .5f, f_y) * c_mag[n];
             float ph = c_phase[n];
 
             TRANSFORM
@@ -746,6 +749,7 @@ static void filter_stereo(AVFilterContext *ctx)
     float *lphase = s->l_phase;
     float *rphase = s->r_phase;
     float *cphase = s->c_phase;
+    float *cmag = s->c_mag;
     float *xpos = s->x_pos;
     float *ypos = s->y_pos;
 
@@ -760,6 +764,7 @@ static void filter_stereo(AVFilterContext *ctx)
         float r_phase = atan2f(r_im, r_re);
         float phase_dif = fabsf(l_phase - r_phase);
         float mag_sum = l_mag + r_mag;
+        float c_mag = mag_sum * 0.5f;
         float mag_dif, x, y;
 
         mag_sum = mag_sum < MIN_MAG_SUM ? 1.f : mag_sum;
@@ -776,6 +781,7 @@ static void filter_stereo(AVFilterContext *ctx)
         ypos[n]   = y;
         lphase[n] = l_phase;
         rphase[n] = r_phase;
+        cmag[n]   = c_mag;
         cphase[n] = c_phase;
         magtotal[n] = mag_total;
     }
@@ -1344,6 +1350,7 @@ static av_cold void uninit(AVFilterContext *ctx)
     av_freep(&s->y_pos);
     av_freep(&s->l_phase);
     av_freep(&s->r_phase);
+    av_freep(&s->c_mag);
     av_freep(&s->c_phase);
     av_freep(&s->mag_total);
     av_freep(&s->lfe_mag);



More information about the ffmpeg-cvslog mailing list