OSDN Git Service

swresample: Use double and float for matrixes for best quality and speed
authorMichael Niedermayer <michael@niedermayer.cc>
Wed, 17 Aug 2016 23:07:32 +0000 (01:07 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Tue, 27 Sep 2016 10:53:25 +0000 (12:53 +0200)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libswresample/rematrix.c
libswresample/swresample_internal.h

index ddba043..0d6138d 100644 (file)
@@ -73,6 +73,9 @@ int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride)
     for (out = 0; out < nb_out; out++) {
         for (in = 0; in < nb_in; in++)
             s->matrix[out][in] = matrix[in];
+        if (s->int_sample_fmt == AV_SAMPLE_FMT_FLTP)
+            for (in = 0; in < nb_in; in++)
+                s->matrix_flt[out][in] = matrix[in];
         matrix += stride;
     }
     s->rematrix_custom = 1;
@@ -354,6 +357,12 @@ av_cold static int auto_matrix(SwrContext *s)
         }
         av_log(s, AV_LOG_DEBUG, "\n");
     }
+    if (s->int_sample_fmt == AV_SAMPLE_FMT_FLTP) {
+        int i;
+        for (i = 0; i < FF_ARRAY_ELEMS(s->matrix[0])*FF_ARRAY_ELEMS(s->matrix[0]); i++)
+            s->matrix_flt[0][i] = s->matrix[0][i];
+    }
+
     return 0;
 }
 
@@ -513,7 +522,7 @@ int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mus
                     float v=0;
                     for(j=0; j<s->matrix_ch[out_i][0]; j++){
                         in_i= s->matrix_ch[out_i][1+j];
-                        v+= ((float*)in->ch[in_i])[i] * s->matrix[out_i][in_i];
+                        v+= ((float*)in->ch[in_i])[i] * s->matrix_flt[out_i][in_i];
                     }
                     ((float*)out->ch[out_i])[i]= v;
                 }
index 88dbc86..f2ea5a2 100644 (file)
@@ -168,7 +168,8 @@ struct SwrContext {
     struct ResampleContext *resample;               ///< resampling context
     struct Resampler const *resampler;              ///< resampler virtual function table
 
-    float matrix[SWR_CH_MAX][SWR_CH_MAX];           ///< floating point rematrixing coefficients
+    double matrix[SWR_CH_MAX][SWR_CH_MAX];          ///< floating point rematrixing coefficients
+    float matrix_flt[SWR_CH_MAX][SWR_CH_MAX];       ///< single precision floating point rematrixing coefficients
     uint8_t *native_matrix;
     uint8_t *native_one;
     uint8_t *native_simd_one;