Commit fde82ca7 authored by Justin Ruggles's avatar Justin Ruggles

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
parent a4cb6751
...@@ -456,7 +456,6 @@ YASM-OBJS-$(CONFIG_GPL) += x86/h264_deblock_sse2.o \ ...@@ -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_CAVS_DECODER) += x86/cavsdsp_mmx.o
MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_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_GPL) += x86/idct_mmx.o
MMX-OBJS-$(CONFIG_SNOW_DECODER) += x86/snowdsp_mmx.o MMX-OBJS-$(CONFIG_SNOW_DECODER) += x86/snowdsp_mmx.o
MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o
...@@ -474,6 +473,7 @@ OBJS-$(HAVE_MMX) += x86/cpuid.o \ ...@@ -474,6 +473,7 @@ OBJS-$(HAVE_MMX) += x86/cpuid.o \
x86/fft.o \ x86/fft.o \
x86/idct_mmx_xvid.o \ x86/idct_mmx_xvid.o \
x86/idct_sse2_xvid.o \ x86/idct_sse2_xvid.o \
x86/lpc_mmx.o \
x86/motion_est_mmx.o \ x86/motion_est_mmx.o \
x86/mpegvideo_mmx.o \ x86/mpegvideo_mmx.o \
x86/simple_idct_mmx.o \ x86/simple_idct_mmx.o \
......
...@@ -45,8 +45,8 @@ void vorbis_inverse_coupling(float *mag, float *ang, int blocksize); ...@@ -45,8 +45,8 @@ void vorbis_inverse_coupling(float *mag, float *ang, int blocksize);
/* ac3dec.c */ /* ac3dec.c */
void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len); void ff_ac3_downmix_c(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len);
/* flacenc.c */ /* lpc.c */
void ff_flac_compute_autocorr(const int32_t *data, int len, int lag, double *autoc); void ff_lpc_compute_autocorr(const int32_t *data, int len, int lag, double *autoc);
/* pngdec.c */ /* pngdec.c */
void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp); 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) ...@@ -4837,9 +4837,7 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
#if CONFIG_AC3_DECODER #if CONFIG_AC3_DECODER
c->ac3_downmix = ff_ac3_downmix_c; c->ac3_downmix = ff_ac3_downmix_c;
#endif #endif
#if CONFIG_FLAC_ENCODER c->lpc_compute_autocorr = ff_lpc_compute_autocorr;
c->flac_compute_autocorr = ff_flac_compute_autocorr;
#endif
c->vector_fmul = vector_fmul_c; c->vector_fmul = vector_fmul_c;
c->vector_fmul_reverse = vector_fmul_reverse_c; c->vector_fmul_reverse = vector_fmul_reverse_c;
c->vector_fmul_add = vector_fmul_add_c; c->vector_fmul_add = vector_fmul_add_c;
......
...@@ -386,7 +386,7 @@ typedef struct DSPContext { ...@@ -386,7 +386,7 @@ typedef struct DSPContext {
void (*vorbis_inverse_coupling)(float *mag, float *ang, int blocksize); 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); void (*ac3_downmix)(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len);
/* no alignment needed */ /* 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 */ /* 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)(float *dst, const float *src, int len);
void (*vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len); void (*vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len);
......
...@@ -552,69 +552,6 @@ static uint32_t calc_rice_params_lpc(RiceContext *rc, int pmin, int pmax, ...@@ -552,69 +552,6 @@ static uint32_t calc_rice_params_lpc(RiceContext *rc, int pmin, int pmax,
return bits; 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) static void encode_residual_verbatim(int32_t *res, int32_t *smp, int n)
{ {
assert(n > 0); assert(n > 0);
......
...@@ -26,6 +26,68 @@ ...@@ -26,6 +26,68 @@
#include "lpc.h" #include "lpc.h"
/**
* 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 * Quantize LPC coefficients
*/ */
...@@ -115,7 +177,7 @@ int ff_lpc_calc_coefs(DSPContext *s, ...@@ -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); assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER && use_lpc > 0);
if(use_lpc == 1){ 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); compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1);
......
...@@ -1348,8 +1348,7 @@ static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2, int si ...@@ -1348,8 +1348,7 @@ static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2, int si
#endif //HAVE_SSSE3 #endif //HAVE_SSSE3
/* FLAC specific */ void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag,
void ff_flac_compute_autocorr_sse2(const int32_t *data, int len, int lag,
double *autoc); double *autoc);
...@@ -1414,8 +1413,7 @@ void dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx) ...@@ -1414,8 +1413,7 @@ void dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx)
c->sum_abs_dctelem= sum_abs_dctelem_sse2; c->sum_abs_dctelem= sum_abs_dctelem_sse2;
c->hadamard8_diff[0]= hadamard8_diff16_sse2; c->hadamard8_diff[0]= hadamard8_diff16_sse2;
c->hadamard8_diff[1]= hadamard8_diff_sse2; c->hadamard8_diff[1]= hadamard8_diff_sse2;
if (CONFIG_FLAC_ENCODER) c->lpc_compute_autocorr = ff_lpc_compute_autocorr_sse2;
c->flac_compute_autocorr = ff_flac_compute_autocorr_sse2;
} }
#if HAVE_SSSE3 #if HAVE_SSSE3
......
/* /*
* MMX optimized FLAC DSP utils * MMX optimized LPC DSP utils
* Copyright (c) 2007 Loren Merritt * Copyright (c) 2007 Loren Merritt
* *
* This file is part of FFmpeg. * 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 ...@@ -65,7 +65,7 @@ static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data
#undef WELCH #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 *autoc)
{ {
double tmp[len + lag + 2]; double tmp[len + lag + 2];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment