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:
		@@ -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                   \
 | 
				
			|||||||
                                          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);
 | 
				
			|||||||
/* 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)
 | 
				
			|||||||
#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 {
 | 
				
			|||||||
    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,
 | 
				
			|||||||
    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 @@
 | 
				
			|||||||
#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,
 | 
				
			|||||||
    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
 | 
				
			|||||||
#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)
 | 
				
			|||||||
            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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * 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
 | 
				
			|||||||
#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];
 | 
				
			||||||
		Reference in New Issue
	
	Block a user