From dc44d4ad64cddb32d7895d1fdc8a18c5fe49f0e8 Mon Sep 17 00:00:00 2001 From: Loren Merritt Date: Thu, 27 Sep 2007 02:42:00 +0000 Subject: unroll encode_residual_lpc(). speedup varies between 1.2x and 1.8x depending on lpc order. Originally committed as revision 10596 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/flacenc.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 2 deletions(-) (limited to 'libavcodec/flacenc.c') diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index e2357affeb..f5766e85a4 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -834,15 +834,83 @@ static void encode_residual_fixed(int32_t *res, const int32_t *smp, int n, } } +#define LPC1(x) {\ + int s = smp[i-(x)+1];\ + p1 += c*s;\ + c = coefs[(x)-2];\ + p0 += c*s;\ +} + +static av_always_inline void encode_residual_lpc_unrolled( + int32_t *res, const int32_t *smp, int n, + int order, const int32_t *coefs, int shift, int big) +{ + int i; + for(i=order; i> shift); + res[i+1] = smp[i+1] - (p1 >> shift); + } +} + static void encode_residual_lpc(int32_t *res, const int32_t *smp, int n, int order, const int32_t *coefs, int shift) { - int i, j; - + int i; for(i=0; i> shift); res[i+1] = smp[i+1] - (p1 >> shift); } +#else + switch(order) { + case 1: encode_residual_lpc_unrolled(res, smp, n, 1, coefs, shift, 0); break; + case 2: encode_residual_lpc_unrolled(res, smp, n, 2, coefs, shift, 0); break; + case 3: encode_residual_lpc_unrolled(res, smp, n, 3, coefs, shift, 0); break; + case 4: encode_residual_lpc_unrolled(res, smp, n, 4, coefs, shift, 0); break; + case 5: encode_residual_lpc_unrolled(res, smp, n, 5, coefs, shift, 0); break; + case 6: encode_residual_lpc_unrolled(res, smp, n, 6, coefs, shift, 0); break; + case 7: encode_residual_lpc_unrolled(res, smp, n, 7, coefs, shift, 0); break; + case 8: encode_residual_lpc_unrolled(res, smp, n, 8, coefs, shift, 0); break; + default: encode_residual_lpc_unrolled(res, smp, n, order, coefs, shift, 1); break; + } +#endif } static int encode_residual(FlacEncodeContext *ctx, int ch) -- cgit v1.2.3