mirror of https://git.ffmpeg.org/ffmpeg.git
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
This commit is contained in:
parent
a4cb675124
commit
fde82ca7e4
|
@ -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];
|
Loading…
Reference in New Issue