[FFmpeg-cvslog] avfilter/af_sofalizer: use SIMD in compensate_volume()

Paul B Mahol git at videolan.org
Wed Dec 16 15:03:28 CET 2015


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Wed Dec 16 14:44:20 2015 +0100| [fa2c1eab95557ea9a1cbfa560178d9e3f4b452b2] | committer: Paul B Mahol

avfilter/af_sofalizer: use SIMD in compensate_volume()

Signed-off-by: Paul B Mahol <onemda at gmail.com>

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

 libavfilter/af_sofalizer.c |   14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/libavfilter/af_sofalizer.c b/libavfilter/af_sofalizer.c
index 6bf4306..b2ba525 100644
--- a/libavfilter/af_sofalizer.c
+++ b/libavfilter/af_sofalizer.c
@@ -567,7 +567,7 @@ static int compensate_volume(AVFilterContext *ctx)
     float compensate;
     float energy = 0;
     float *ir;
-    int m, j;
+    int m;
 
     if (s->sofa.ncid) {
         /* find IR at front center position in the SOFA file (IR closest to 0°,0°,1m) */
@@ -575,15 +575,17 @@ static int compensate_volume(AVFilterContext *ctx)
         m = find_m(s, 0, 0, 1);
         /* get energy of that IR and compensate volume */
         ir = sofa->data_ir + 2 * m * sofa->n_samples;
-        for (j = 0; j < sofa->n_samples; j++) {
-            energy += *(ir + j) * *(ir + j);
+        if (sofa->n_samples & 31) {
+            energy = avpriv_scalarproduct_float_c(ir, ir, sofa->n_samples);
+        } else {
+            energy = s->fdsp->scalarproduct_float(ir, ir, sofa->n_samples);
         }
         compensate = 256 / (sofa->n_samples * sqrt(energy));
         av_log(ctx, AV_LOG_DEBUG, "Compensate-factor: %f\n", compensate);
         ir = sofa->data_ir;
-        for (j = 0; j < sofa->n_samples * sofa->m_dim * 2; j++) {
-            ir[j] *= compensate; /* apply volume compensation to IRs */
-        }
+        /* apply volume compensation to IRs */
+        s->fdsp->vector_fmul_scalar(ir, ir, compensate, sofa->n_samples * sofa->m_dim * 2);
+        emms_c();
     }
 
     return 0;



More information about the ffmpeg-cvslog mailing list