Commit 56f8952b authored by Justin Ruggles's avatar Justin Ruggles Committed by Mans Rullgard

Move lpc_compute_autocorr() from DSPContext to a new struct LPCContext.

Signed-off-by: 's avatarMans Rullgard <mans@mansr.com>
parent 50196a98
...@@ -51,11 +51,11 @@ typedef struct RiceContext { ...@@ -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 { ...@@ -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]; AlacLPCContext lpc[MAX_CHANNELS];
DSPContext dspctx; LPCContext lpc_ctx;
AVCodecContext *avctx; AVCodecContext *avctx;
} AlacEncodeContext; } AlacEncodeContext;
...@@ -141,7 +141,7 @@ static void calc_predictor_params(AlacEncodeContext *s, int ch) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 BLOCK_LAST_INDEX 0x21bc
#define INTER_SCANTAB_RASTER_END 0x23c0 #define INTER_SCANTAB_RASTER_END 0x23bc
#define H263_AIC 0x2670 #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 BLOCK_LAST_INDEX 0x2178
#define INTER_SCANTAB_RASTER_END 0x237c #define INTER_SCANTAB_RASTER_END 0x2378
#define H263_AIC 0x2620 #define H263_AIC 0x261c
#endif #endif
#endif #endif
...@@ -36,7 +36,6 @@ ...@@ -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) ...@@ -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 { ...@@ -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 @@ ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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, ...@@ -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); ...@@ -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) ...@@ -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 @@ ...@@ -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 ...@@ -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, ...@@ -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;
}
}
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