Signed-off-by: Mans Rullgard <mans@mansr.com>tags/n0.8
| @@ -51,11 +51,11 @@ typedef struct RiceContext { | |||||
| int rice_modifier; | int rice_modifier; | ||||
| } RiceContext; | } RiceContext; | ||||
| typedef struct LPCContext { | |||||
| typedef struct AlacLPCContext { | |||||
| int lpc_order; | int lpc_order; | ||||
| int lpc_coeff[ALAC_MAX_LPC_ORDER+1]; | int lpc_coeff[ALAC_MAX_LPC_ORDER+1]; | ||||
| int lpc_quant; | int lpc_quant; | ||||
| } LPCContext; | |||||
| } AlacLPCContext; | |||||
| typedef struct AlacEncodeContext { | typedef struct AlacEncodeContext { | ||||
| int compression_level; | int compression_level; | ||||
| @@ -69,8 +69,8 @@ typedef struct AlacEncodeContext { | |||||
| int interlacing_leftweight; | int interlacing_leftweight; | ||||
| PutBitContext pbctx; | PutBitContext pbctx; | ||||
| RiceContext rc; | RiceContext rc; | ||||
| LPCContext lpc[MAX_CHANNELS]; | |||||
| DSPContext dspctx; | |||||
| AlacLPCContext lpc[MAX_CHANNELS]; | |||||
| LPCContext lpc_ctx; | |||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| } AlacEncodeContext; | } AlacEncodeContext; | ||||
| @@ -141,7 +141,7 @@ static void calc_predictor_params(AlacEncodeContext *s, int ch) | |||||
| s->lpc[ch].lpc_coeff[4] = 80; | s->lpc[ch].lpc_coeff[4] = 80; | ||||
| s->lpc[ch].lpc_coeff[5] = -25; | s->lpc[ch].lpc_coeff[5] = -25; | ||||
| } else { | } else { | ||||
| opt_order = ff_lpc_calc_coefs(&s->dspctx, s->sample_buf[ch], | |||||
| opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, s->sample_buf[ch], | |||||
| s->avctx->frame_size, | s->avctx->frame_size, | ||||
| s->min_prediction_order, | s->min_prediction_order, | ||||
| s->max_prediction_order, | s->max_prediction_order, | ||||
| @@ -237,7 +237,7 @@ static void alac_stereo_decorrelation(AlacEncodeContext *s) | |||||
| static void alac_linear_predictor(AlacEncodeContext *s, int ch) | static void alac_linear_predictor(AlacEncodeContext *s, int ch) | ||||
| { | { | ||||
| int i; | int i; | ||||
| LPCContext lpc = s->lpc[ch]; | |||||
| AlacLPCContext lpc = s->lpc[ch]; | |||||
| if(lpc.lpc_order == 31) { | if(lpc.lpc_order == 31) { | ||||
| s->predictor_buf[0] = s->sample_buf[ch][0]; | s->predictor_buf[0] = s->sample_buf[ch][0]; | ||||
| @@ -455,7 +455,7 @@ static av_cold int alac_encode_init(AVCodecContext *avctx) | |||||
| avctx->coded_frame->key_frame = 1; | avctx->coded_frame->key_frame = 1; | ||||
| s->avctx = avctx; | s->avctx = avctx; | ||||
| dsputil_init(&s->dspctx, avctx); | |||||
| ff_lpc_init(&s->lpc_ctx); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -33,16 +33,16 @@ | |||||
| #define Y_DC_SCALE 0xab4 | #define Y_DC_SCALE 0xab4 | ||||
| #define C_DC_SCALE 0xab8 | #define C_DC_SCALE 0xab8 | ||||
| #define AC_PRED 0xae0 | #define AC_PRED 0xae0 | ||||
| #define BLOCK_LAST_INDEX 0x21c0 | |||||
| #define INTER_SCANTAB_RASTER_END 0x23c0 | |||||
| #define H263_AIC 0x2670 | |||||
| #define BLOCK_LAST_INDEX 0x21bc | |||||
| #define INTER_SCANTAB_RASTER_END 0x23bc | |||||
| #define H263_AIC 0x2668 | |||||
| #elif defined(__APPLE__) | #elif defined(__APPLE__) | ||||
| #define Y_DC_SCALE 0xa70 | #define Y_DC_SCALE 0xa70 | ||||
| #define C_DC_SCALE 0xa74 | #define C_DC_SCALE 0xa74 | ||||
| #define AC_PRED 0xa9c | #define AC_PRED 0xa9c | ||||
| #define BLOCK_LAST_INDEX 0x217c | |||||
| #define INTER_SCANTAB_RASTER_END 0x237c | |||||
| #define H263_AIC 0x2620 | |||||
| #define BLOCK_LAST_INDEX 0x2178 | |||||
| #define INTER_SCANTAB_RASTER_END 0x2378 | |||||
| #define H263_AIC 0x261c | |||||
| #endif | #endif | ||||
| #endif | #endif | ||||
| @@ -36,7 +36,6 @@ | |||||
| #include "mathops.h" | #include "mathops.h" | ||||
| #include "mpegvideo.h" | #include "mpegvideo.h" | ||||
| #include "config.h" | #include "config.h" | ||||
| #include "lpc.h" | |||||
| #include "ac3dec.h" | #include "ac3dec.h" | ||||
| #include "vorbis.h" | #include "vorbis.h" | ||||
| #include "png.h" | #include "png.h" | ||||
| @@ -4430,9 +4429,6 @@ av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx) | |||||
| #endif | #endif | ||||
| #if CONFIG_AC3_DECODER | #if CONFIG_AC3_DECODER | ||||
| c->ac3_downmix = ff_ac3_downmix_c; | c->ac3_downmix = ff_ac3_downmix_c; | ||||
| #endif | |||||
| #if CONFIG_LPC | |||||
| c->lpc_compute_autocorr = ff_lpc_compute_autocorr; | |||||
| #endif | #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; | ||||
| @@ -374,8 +374,6 @@ typedef struct DSPContext { | |||||
| /* assume len is a multiple of 4, and arrays are 16-byte aligned */ | /* assume len is a multiple of 4, and arrays are 16-byte aligned */ | ||||
| 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 */ | |||||
| 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); | ||||
| @@ -23,7 +23,6 @@ | |||||
| #include "libavutil/md5.h" | #include "libavutil/md5.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "get_bits.h" | #include "get_bits.h" | ||||
| #include "dsputil.h" | |||||
| #include "golomb.h" | #include "golomb.h" | ||||
| #include "lpc.h" | #include "lpc.h" | ||||
| #include "flac.h" | #include "flac.h" | ||||
| @@ -95,7 +94,7 @@ typedef struct FlacEncodeContext { | |||||
| FlacFrame frame; | FlacFrame frame; | ||||
| CompressionOptions options; | CompressionOptions options; | ||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| DSPContext dsp; | |||||
| LPCContext lpc_ctx; | |||||
| struct AVMD5 *md5ctx; | struct AVMD5 *md5ctx; | ||||
| } FlacEncodeContext; | } FlacEncodeContext; | ||||
| @@ -217,7 +216,7 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) | |||||
| s->avctx = avctx; | s->avctx = avctx; | ||||
| dsputil_init(&s->dsp, avctx); | |||||
| ff_lpc_init(&s->lpc_ctx); | |||||
| if (avctx->sample_fmt != AV_SAMPLE_FMT_S16) | if (avctx->sample_fmt != AV_SAMPLE_FMT_S16) | ||||
| return -1; | return -1; | ||||
| @@ -902,7 +901,7 @@ static int encode_residual_ch(FlacEncodeContext *s, int ch) | |||||
| /* LPC */ | /* LPC */ | ||||
| sub->type = FLAC_SUBFRAME_LPC; | sub->type = FLAC_SUBFRAME_LPC; | ||||
| opt_order = ff_lpc_calc_coefs(&s->dsp, smp, n, min_order, max_order, | |||||
| opt_order = ff_lpc_calc_coefs(&s->lpc_ctx, smp, n, min_order, max_order, | |||||
| s->options.lpc_coeff_precision, coefs, shift, s->options.lpc_type, | s->options.lpc_coeff_precision, coefs, shift, s->options.lpc_type, | ||||
| s->options.lpc_passes, omethod, | s->options.lpc_passes, omethod, | ||||
| MAX_LPC_SHIFT, 0); | MAX_LPC_SHIFT, 0); | ||||
| @@ -20,7 +20,6 @@ | |||||
| */ | */ | ||||
| #include "libavutil/lls.h" | #include "libavutil/lls.h" | ||||
| #include "dsputil.h" | |||||
| #define LPC_USE_DOUBLE | #define LPC_USE_DOUBLE | ||||
| #include "lpc.h" | #include "lpc.h" | ||||
| @@ -55,7 +54,7 @@ static void apply_welch_window(const int32_t *data, int len, double *w_data) | |||||
| * Calculate autocorrelation data from audio samples | * Calculate autocorrelation data from audio samples | ||||
| * A Welch window function is applied before calculation. | * A Welch window function is applied before calculation. | ||||
| */ | */ | ||||
| void ff_lpc_compute_autocorr(const int32_t *data, int len, int lag, | |||||
| static void lpc_compute_autocorr_c(const int32_t *data, int len, int lag, | |||||
| double *autoc) | double *autoc) | ||||
| { | { | ||||
| int i, j; | int i, j; | ||||
| @@ -162,7 +161,7 @@ static int estimate_best_order(double *ref, int min_order, int max_order) | |||||
| * 1 = LPC with coeffs determined by Levinson-Durbin recursion | * 1 = LPC with coeffs determined by Levinson-Durbin recursion | ||||
| * 2+ = LPC with coeffs determined by Cholesky factorization using (use_lpc-1) passes. | * 2+ = LPC with coeffs determined by Cholesky factorization using (use_lpc-1) passes. | ||||
| */ | */ | ||||
| int ff_lpc_calc_coefs(DSPContext *s, | |||||
| int ff_lpc_calc_coefs(LPCContext *s, | |||||
| const int32_t *samples, int blocksize, int min_order, | const int32_t *samples, int blocksize, int min_order, | ||||
| int max_order, int precision, | int max_order, int precision, | ||||
| int32_t coefs[][MAX_LPC_ORDER], int *shift, | int32_t coefs[][MAX_LPC_ORDER], int *shift, | ||||
| @@ -236,3 +235,11 @@ int ff_lpc_calc_coefs(DSPContext *s, | |||||
| return opt_order; | return opt_order; | ||||
| } | } | ||||
| av_cold void ff_lpc_init(LPCContext *s) | |||||
| { | |||||
| s->lpc_compute_autocorr = lpc_compute_autocorr_c; | |||||
| if (HAVE_MMX) | |||||
| ff_lpc_init_x86(s); | |||||
| } | |||||
| @@ -36,18 +36,36 @@ | |||||
| #define MAX_LPC_ORDER 32 | #define MAX_LPC_ORDER 32 | ||||
| typedef struct LPCContext { | |||||
| /** | |||||
| * Perform autocorrelation on input samples with delay of 0 to lag. | |||||
| * @param data input samples. | |||||
| * no alignment needed. | |||||
| * @param len number of input samples to process | |||||
| * @param lag maximum delay to calculate | |||||
| * @param autoc output autocorrelation coefficients. | |||||
| * constraints: array size must be at least lag+1. | |||||
| */ | |||||
| void (*lpc_compute_autocorr)(const int32_t *data, int len, int lag, | |||||
| double *autoc); | |||||
| } LPCContext; | |||||
| /** | /** | ||||
| * Calculate LPC coefficients for multiple orders | * Calculate LPC coefficients for multiple orders | ||||
| */ | */ | ||||
| int ff_lpc_calc_coefs(DSPContext *s, | |||||
| int ff_lpc_calc_coefs(LPCContext *s, | |||||
| const int32_t *samples, int blocksize, int min_order, | const int32_t *samples, int blocksize, int min_order, | ||||
| int max_order, int precision, | int max_order, int precision, | ||||
| int32_t coefs[][MAX_LPC_ORDER], int *shift, | int32_t coefs[][MAX_LPC_ORDER], int *shift, | ||||
| enum AVLPCType lpc_type, int lpc_passes, | enum AVLPCType lpc_type, int lpc_passes, | ||||
| int omethod, int max_shift, int zero_shift); | int omethod, int max_shift, int zero_shift); | ||||
| void ff_lpc_compute_autocorr(const int32_t *data, int len, int lag, | |||||
| double *autoc); | |||||
| /** | |||||
| * Initialize LPCContext. | |||||
| */ | |||||
| void ff_lpc_init(LPCContext *s); | |||||
| void ff_lpc_init_x86(LPCContext *s); | |||||
| #ifdef LPC_USE_DOUBLE | #ifdef LPC_USE_DOUBLE | ||||
| #define LPC_TYPE double | #define LPC_TYPE double | ||||
| @@ -23,7 +23,7 @@ | |||||
| #define AVCODEC_RA144_H | #define AVCODEC_RA144_H | ||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include "dsputil.h" | |||||
| #include "lpc.h" | |||||
| #define NBLOCKS 4 ///< number of subblocks within a block | #define NBLOCKS 4 ///< number of subblocks within a block | ||||
| #define BLOCKSIZE 40 ///< subblock size in 16-bit words | #define BLOCKSIZE 40 ///< subblock size in 16-bit words | ||||
| @@ -34,7 +34,7 @@ | |||||
| typedef struct { | typedef struct { | ||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| DSPContext dsp; | |||||
| LPCContext lpc_ctx; | |||||
| unsigned int old_energy; ///< previous frame energy | unsigned int old_energy; ///< previous frame energy | ||||
| @@ -29,7 +29,6 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "put_bits.h" | #include "put_bits.h" | ||||
| #include "lpc.h" | |||||
| #include "celp_filters.h" | #include "celp_filters.h" | ||||
| #include "ra144.h" | #include "ra144.h" | ||||
| @@ -53,7 +52,7 @@ static av_cold int ra144_encode_init(AVCodecContext * avctx) | |||||
| ractx->lpc_coef[0] = ractx->lpc_tables[0]; | ractx->lpc_coef[0] = ractx->lpc_tables[0]; | ||||
| ractx->lpc_coef[1] = ractx->lpc_tables[1]; | ractx->lpc_coef[1] = ractx->lpc_tables[1]; | ||||
| ractx->avctx = avctx; | ractx->avctx = avctx; | ||||
| dsputil_init(&ractx->dsp, avctx); | |||||
| ff_lpc_init(&ractx->lpc_ctx); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -451,7 +450,7 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame, | |||||
| energy = ff_energy_tab[quantize(ff_t_sqrt(energy >> 5) >> 10, ff_energy_tab, | energy = ff_energy_tab[quantize(ff_t_sqrt(energy >> 5) >> 10, ff_energy_tab, | ||||
| 32)]; | 32)]; | ||||
| ff_lpc_calc_coefs(&ractx->dsp, lpc_data, NBLOCKS * BLOCKSIZE, LPC_ORDER, | |||||
| ff_lpc_calc_coefs(&ractx->lpc_ctx, lpc_data, NBLOCKS * BLOCKSIZE, LPC_ORDER, | |||||
| LPC_ORDER, 16, lpc_coefs, shift, AV_LPC_TYPE_LEVINSON, | LPC_ORDER, 16, lpc_coefs, shift, AV_LPC_TYPE_LEVINSON, | ||||
| 0, ORDER_METHOD_EST, 12, 0); | 0, ORDER_METHOD_EST, 12, 0); | ||||
| for (i = 0; i < LPC_ORDER; i++) | for (i = 0; i < LPC_ORDER; i++) | ||||
| @@ -200,9 +200,6 @@ void ff_vc1dsp_init_mmx(DSPContext* dsp, AVCodecContext *avctx); | |||||
| void ff_put_vc1_mspel_mc00_mmx(uint8_t *dst, const uint8_t *src, int stride, int rnd); | void ff_put_vc1_mspel_mc00_mmx(uint8_t *dst, const uint8_t *src, int stride, int rnd); | ||||
| void ff_avg_vc1_mspel_mc00_mmx2(uint8_t *dst, const uint8_t *src, int stride, int rnd); | void ff_avg_vc1_mspel_mc00_mmx2(uint8_t *dst, const uint8_t *src, int stride, int rnd); | ||||
| void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag, | |||||
| double *autoc); | |||||
| void ff_mmx_idct(DCTELEM *block); | void ff_mmx_idct(DCTELEM *block); | ||||
| void ff_mmxext_idct(DCTELEM *block); | void ff_mmxext_idct(DCTELEM *block); | ||||
| @@ -1166,10 +1166,6 @@ void dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx) | |||||
| #endif | #endif | ||||
| } | } | ||||
| if (CONFIG_LPC && mm_flags & (AV_CPU_FLAG_SSE2|AV_CPU_FLAG_SSE2SLOW)) { | |||||
| c->lpc_compute_autocorr = ff_lpc_compute_autocorr_sse2; | |||||
| } | |||||
| #if HAVE_SSSE3 | #if HAVE_SSSE3 | ||||
| if(mm_flags & AV_CPU_FLAG_SSSE3){ | if(mm_flags & AV_CPU_FLAG_SSSE3){ | ||||
| if(!(avctx->flags & CODEC_FLAG_BITEXACT)){ | if(!(avctx->flags & CODEC_FLAG_BITEXACT)){ | ||||
| @@ -20,7 +20,8 @@ | |||||
| */ | */ | ||||
| #include "libavutil/x86_cpu.h" | #include "libavutil/x86_cpu.h" | ||||
| #include "dsputil_mmx.h" | |||||
| #include "libavutil/cpu.h" | |||||
| #include "libavcodec/lpc.h" | |||||
| static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data) | static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data) | ||||
| { | { | ||||
| @@ -68,7 +69,7 @@ static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data | |||||
| #undef WELCH | #undef WELCH | ||||
| } | } | ||||
| void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag, | |||||
| static void 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]; | ||||
| @@ -141,3 +142,12 @@ void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag, | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| av_cold void ff_lpc_init_x86(LPCContext *c) | |||||
| { | |||||
| int mm_flags = av_get_cpu_flags(); | |||||
| if (mm_flags & (AV_CPU_FLAG_SSE2|AV_CPU_FLAG_SSE2SLOW)) { | |||||
| c->lpc_compute_autocorr = lpc_compute_autocorr_sse2; | |||||
| } | |||||
| } | |||||