aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2009-10-17 21:00:39 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2009-10-17 21:00:39 +0000
commitfde82ca7e4e72226da99d86a9fa9689136461d14 (patch)
tree5060829d8c5971a2edae793e05d28895a06dbdcf
parenta4cb675124a906126ba4ab307f0c17716f6d9adb (diff)
downloadffmpeg-fde82ca7e4e72226da99d86a9fa9689136461d14.tar.gz
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. Originally committed as revision 20266 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/Makefile2
-rw-r--r--libavcodec/dsputil.c8
-rw-r--r--libavcodec/dsputil.h2
-rw-r--r--libavcodec/flacenc.c63
-rw-r--r--libavcodec/lpc.c64
-rw-r--r--libavcodec/x86/dsputilenc_mmx.c6
-rw-r--r--libavcodec/x86/lpc_mmx.c (renamed from libavcodec/x86/flacdsp_mmx.c)4
7 files changed, 72 insertions, 77 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 789ece0be0..85acb5f202 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -456,7 +456,6 @@ YASM-OBJS-$(CONFIG_GPL) += x86/h264_deblock_sse2.o \
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/cpuid.o \
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 \
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index be35ec3cff..aae86bcb21 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -45,8 +45,8 @@ void vorbis_inverse_coupling(float *mag, float *ang, int blocksize);
/* 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, AVCodecContext *avctx)
#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;
diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h
index 6cb5af2cc5..58524b26e4 100644
--- a/libavcodec/dsputil.h
+++ b/libavcodec/dsputil.h
@@ -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);
diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c
index 81a35a0d54..c1f862a684 100644
--- a/libavcodec/flacenc.c
+++ b/libavcodec/flacenc.c
@@ -552,69 +552,6 @@ static uint32_t calc_rice_params_lpc(RiceContext *rc, int pmin, int pmax,
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);
diff --git a/libavcodec/lpc.c b/libavcodec/lpc.c
index 896db51759..49e41d8c34 100644
--- a/libavcodec/lpc.c
+++ b/libavcodec/lpc.c
@@ -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);
diff --git a/libavcodec/x86/dsputilenc_mmx.c b/libavcodec/x86/dsputilenc_mmx.c
index 6059436252..2bf0fe1328 100644
--- a/libavcodec/x86/dsputilenc_mmx.c
+++ b/libavcodec/x86/dsputilenc_mmx.c
@@ -1348,8 +1348,7 @@ static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2, int si
#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, AVCodecContext *avctx)
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
diff --git a/libavcodec/x86/flacdsp_mmx.c b/libavcodec/x86/lpc_mmx.c
index 01c0d7ae8a..40fc678b7c 100644
--- a/libavcodec/x86/flacdsp_mmx.c
+++ b/libavcodec/x86/lpc_mmx.c
@@ -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(const int32_t *data, int len, double *w_data
#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];