corresponding dsputil functions and remove their dependency on the FLAC encoder. Fixes Issue1486. Originally committed as revision 20266 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -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 \ | |||
| @@ -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; | |||
| @@ -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); | |||
| @@ -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); | |||
| @@ -26,6 +26,68 @@ | |||
| #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 | |||
| */ | |||
| @@ -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); | |||
| @@ -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 | |||
| @@ -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]; | |||