[FFmpeg-cvslog] r20266 - in trunk/libavcodec: Makefile dsputil.c dsputil.h flacenc.c lpc.c x86/dsputilenc_mmx.c x86/flacdsp_mmx.c x86/lpc_mmx.c

jbr subversion
Sat Oct 17 23:00:39 CEST 2009


Author: jbr
Date: Sat Oct 17 23:00:39 2009
New Revision: 20266

Log:
Move autocorrelation function from flacenc.c to lpc.c. Also rename the 
corresponding dsputil functions and remove their dependency on the FLAC
encoder.
Fixes Issue1486.

Added:
   trunk/libavcodec/x86/lpc_mmx.c   (contents, props changed)
      - copied, changed from r20256, trunk/libavcodec/x86/flacdsp_mmx.c
Deleted:
   trunk/libavcodec/x86/flacdsp_mmx.c
Modified:
   trunk/libavcodec/Makefile
   trunk/libavcodec/dsputil.c
   trunk/libavcodec/dsputil.h
   trunk/libavcodec/flacenc.c
   trunk/libavcodec/lpc.c
   trunk/libavcodec/x86/dsputilenc_mmx.c

Modified: trunk/libavcodec/Makefile
==============================================================================
--- trunk/libavcodec/Makefile	Sat Oct 17 22:37:58 2009	(r20265)
+++ trunk/libavcodec/Makefile	Sat Oct 17 23:00:39 2009	(r20266)
@@ -456,7 +456,6 @@ YASM-OBJS-$(CONFIG_GPL)                +
 
 MMX-OBJS-$(CONFIG_CAVS_DECODER)        += x86/cavsdsp_mmx.o
 MMX-OBJS-$(CONFIG_ENCODERS)            += x86/dsputilenc_mmx.o
-MMX-OBJS-$(CONFIG_FLAC_ENCODER)        += x86/flacdsp_mmx.o
 MMX-OBJS-$(CONFIG_GPL)                 += x86/idct_mmx.o
 MMX-OBJS-$(CONFIG_SNOW_DECODER)        += x86/snowdsp_mmx.o
 MMX-OBJS-$(CONFIG_VC1_DECODER)         += x86/vc1dsp_mmx.o
@@ -474,6 +473,7 @@ OBJS-$(HAVE_MMX)                       +
                                           x86/fft.o                     \
                                           x86/idct_mmx_xvid.o           \
                                           x86/idct_sse2_xvid.o          \
+                                          x86/lpc_mmx.o                 \
                                           x86/motion_est_mmx.o          \
                                           x86/mpegvideo_mmx.o           \
                                           x86/simple_idct_mmx.o         \

Modified: trunk/libavcodec/dsputil.c
==============================================================================
--- trunk/libavcodec/dsputil.c	Sat Oct 17 22:37:58 2009	(r20265)
+++ trunk/libavcodec/dsputil.c	Sat Oct 17 23:00:39 2009	(r20266)
@@ -45,8 +45,8 @@ void vorbis_inverse_coupling(float *mag,
 /* ac3dec.c */
 void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len);
 
-/* flacenc.c */
-void ff_flac_compute_autocorr(const int32_t *data, int len, int lag, double *autoc);
+/* lpc.c */
+void ff_lpc_compute_autocorr(const int32_t *data, int len, int lag, double *autoc);
 
 /* pngdec.c */
 void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
@@ -4837,9 +4837,7 @@ void dsputil_init(DSPContext* c, AVCodec
 #if CONFIG_AC3_DECODER
     c->ac3_downmix = ff_ac3_downmix_c;
 #endif
-#if CONFIG_FLAC_ENCODER
-    c->flac_compute_autocorr = ff_flac_compute_autocorr;
-#endif
+    c->lpc_compute_autocorr = ff_lpc_compute_autocorr;
     c->vector_fmul = vector_fmul_c;
     c->vector_fmul_reverse = vector_fmul_reverse_c;
     c->vector_fmul_add = vector_fmul_add_c;

Modified: trunk/libavcodec/dsputil.h
==============================================================================
--- trunk/libavcodec/dsputil.h	Sat Oct 17 22:37:58 2009	(r20265)
+++ trunk/libavcodec/dsputil.h	Sat Oct 17 23:00:39 2009	(r20266)
@@ -386,7 +386,7 @@ typedef struct DSPContext {
     void (*vorbis_inverse_coupling)(float *mag, float *ang, int blocksize);
     void (*ac3_downmix)(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len);
     /* no alignment needed */
-    void (*flac_compute_autocorr)(const int32_t *data, int len, int lag, double *autoc);
+    void (*lpc_compute_autocorr)(const int32_t *data, int len, int lag, double *autoc);
     /* assume len is a multiple of 8, and arrays are 16-byte aligned */
     void (*vector_fmul)(float *dst, const float *src, int len);
     void (*vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len);

Modified: trunk/libavcodec/flacenc.c
==============================================================================
--- trunk/libavcodec/flacenc.c	Sat Oct 17 22:37:58 2009	(r20265)
+++ trunk/libavcodec/flacenc.c	Sat Oct 17 23:00:39 2009	(r20266)
@@ -552,69 +552,6 @@ static uint32_t calc_rice_params_lpc(Ric
     return bits;
 }
 
-/**
- * Apply Welch window function to audio block
- */
-static void apply_welch_window(const int32_t *data, int len, double *w_data)
-{
-    int i, n2;
-    double w;
-    double c;
-
-    assert(!(len&1)); //the optimization in r11881 does not support odd len
-                      //if someone wants odd len extend the change in r11881
-
-    n2 = (len >> 1);
-    c = 2.0 / (len - 1.0);
-
-    w_data+=n2;
-      data+=n2;
-    for(i=0; i<n2; i++) {
-        w = c - n2 + i;
-        w = 1.0 - (w * w);
-        w_data[-i-1] = data[-i-1] * w;
-        w_data[+i  ] = data[+i  ] * w;
-    }
-}
-
-/**
- * Calculates autocorrelation data from audio samples
- * A Welch window function is applied before calculation.
- */
-void ff_flac_compute_autocorr(const int32_t *data, int len, int lag,
-                              double *autoc)
-{
-    int i, j;
-    double tmp[len + lag + 1];
-    double *data1= tmp + lag;
-
-    apply_welch_window(data, len, data1);
-
-    for(j=0; j<lag; j++)
-        data1[j-lag]= 0.0;
-    data1[len] = 0.0;
-
-    for(j=0; j<lag; j+=2){
-        double sum0 = 1.0, sum1 = 1.0;
-        for(i=j; i<len; i++){
-            sum0 += data1[i] * data1[i-j];
-            sum1 += data1[i] * data1[i-j-1];
-        }
-        autoc[j  ] = sum0;
-        autoc[j+1] = sum1;
-    }
-
-    if(j==lag){
-        double sum = 1.0;
-        for(i=j-1; i<len; i+=2){
-            sum += data1[i  ] * data1[i-j  ]
-                 + data1[i+1] * data1[i-j+1];
-        }
-        autoc[j] = sum;
-    }
-}
-
-
 static void encode_residual_verbatim(int32_t *res, int32_t *smp, int n)
 {
     assert(n > 0);

Modified: trunk/libavcodec/lpc.c
==============================================================================
--- trunk/libavcodec/lpc.c	Sat Oct 17 22:37:58 2009	(r20265)
+++ trunk/libavcodec/lpc.c	Sat Oct 17 23:00:39 2009	(r20266)
@@ -27,6 +27,68 @@
 
 
 /**
+ * Apply Welch window function to audio block
+ */
+static void apply_welch_window(const int32_t *data, int len, double *w_data)
+{
+    int i, n2;
+    double w;
+    double c;
+
+    assert(!(len&1)); //the optimization in r11881 does not support odd len
+                      //if someone wants odd len extend the change in r11881
+
+    n2 = (len >> 1);
+    c = 2.0 / (len - 1.0);
+
+    w_data+=n2;
+      data+=n2;
+    for(i=0; i<n2; i++) {
+        w = c - n2 + i;
+        w = 1.0 - (w * w);
+        w_data[-i-1] = data[-i-1] * w;
+        w_data[+i  ] = data[+i  ] * w;
+    }
+}
+
+/**
+ * Calculates autocorrelation data from audio samples
+ * A Welch window function is applied before calculation.
+ */
+void ff_lpc_compute_autocorr(const int32_t *data, int len, int lag,
+                             double *autoc)
+{
+    int i, j;
+    double tmp[len + lag + 1];
+    double *data1= tmp + lag;
+
+    apply_welch_window(data, len, data1);
+
+    for(j=0; j<lag; j++)
+        data1[j-lag]= 0.0;
+    data1[len] = 0.0;
+
+    for(j=0; j<lag; j+=2){
+        double sum0 = 1.0, sum1 = 1.0;
+        for(i=j; i<len; i++){
+            sum0 += data1[i] * data1[i-j];
+            sum1 += data1[i] * data1[i-j-1];
+        }
+        autoc[j  ] = sum0;
+        autoc[j+1] = sum1;
+    }
+
+    if(j==lag){
+        double sum = 1.0;
+        for(i=j-1; i<len; i+=2){
+            sum += data1[i  ] * data1[i-j  ]
+                 + data1[i+1] * data1[i-j+1];
+        }
+        autoc[j] = sum;
+    }
+}
+
+/**
  * Quantize LPC coefficients
  */
 static void quantize_lpc_coefs(double *lpc_in, int order, int precision,
@@ -115,7 +177,7 @@ int ff_lpc_calc_coefs(DSPContext *s,
     assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER && use_lpc > 0);
 
     if(use_lpc == 1){
-        s->flac_compute_autocorr(samples, blocksize, max_order, autoc);
+        s->lpc_compute_autocorr(samples, blocksize, max_order, autoc);
 
         compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1);
 

Modified: trunk/libavcodec/x86/dsputilenc_mmx.c
==============================================================================
--- trunk/libavcodec/x86/dsputilenc_mmx.c	Sat Oct 17 22:37:58 2009	(r20265)
+++ trunk/libavcodec/x86/dsputilenc_mmx.c	Sat Oct 17 23:00:39 2009	(r20266)
@@ -1348,8 +1348,7 @@ static int ssd_int8_vs_int16_mmx(const i
 #endif //HAVE_SSSE3
 
 
-/* FLAC specific */
-void ff_flac_compute_autocorr_sse2(const int32_t *data, int len, int lag,
+void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag,
                                    double *autoc);
 
 
@@ -1414,8 +1413,7 @@ void dsputilenc_init_mmx(DSPContext* c, 
             c->sum_abs_dctelem= sum_abs_dctelem_sse2;
             c->hadamard8_diff[0]= hadamard8_diff16_sse2;
             c->hadamard8_diff[1]= hadamard8_diff_sse2;
-            if (CONFIG_FLAC_ENCODER)
-                c->flac_compute_autocorr = ff_flac_compute_autocorr_sse2;
+            c->lpc_compute_autocorr = ff_lpc_compute_autocorr_sse2;
         }
 
 #if HAVE_SSSE3

Copied and modified: trunk/libavcodec/x86/lpc_mmx.c (from r20256, trunk/libavcodec/x86/flacdsp_mmx.c)
==============================================================================
--- trunk/libavcodec/x86/flacdsp_mmx.c	Fri Oct 16 18:50:15 2009	(r20256, copy source)
+++ trunk/libavcodec/x86/lpc_mmx.c	Sat Oct 17 23:00:39 2009	(r20266)
@@ -1,5 +1,5 @@
 /*
- * MMX optimized FLAC DSP utils
+ * MMX optimized LPC DSP utils
  * Copyright (c) 2007 Loren Merritt
  *
  * This file is part of FFmpeg.
@@ -65,7 +65,7 @@ static void apply_welch_window_sse2(cons
 #undef WELCH
 }
 
-void ff_flac_compute_autocorr_sse2(const int32_t *data, int len, int lag,
+void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag,
                                    double *autoc)
 {
     double tmp[len + lag + 2];



More information about the ffmpeg-cvslog mailing list