# HG changeset patch # User ramiro # Date 1218906237 0 # Node ID f6a1bff47a3b64ce272882584c56d752a43d6f91 # Parent 6248b6b16e47ac86d2ce3092a0799c0c31cb646d flacenc: Allow more flexible shift calculation in LPC. diff -r 6248b6b16e47 -r f6a1bff47a3b flacenc.c --- a/flacenc.c Sat Aug 16 14:46:31 2008 +0000 +++ b/flacenc.c Sat Aug 16 17:03:57 2008 +0000 @@ -680,7 +680,7 @@ * Quantize LPC coefficients */ static void quantize_lpc_coefs(double *lpc_in, int order, int precision, - int32_t *lpc_out, int *shift) + int32_t *lpc_out, int *shift, int max_shift, int zero_shift) { int i; double cmax, error; @@ -697,14 +697,14 @@ } /* if maximum value quantizes to zero, return all zeros */ - if(cmax * (1 << MAX_LPC_SHIFT) < 1.0) { - *shift = 0; + if(cmax * (1 << max_shift) < 1.0) { + *shift = zero_shift; memset(lpc_out, 0, sizeof(int32_t) * order); return; } /* calculate level shift which scales max coeff to available bits */ - sh = MAX_LPC_SHIFT; + sh = max_shift; while((cmax * (1 << sh) > qmax) && (sh > 0)) { sh--; } @@ -745,10 +745,10 @@ /** * Calculate LPC coefficients for multiple orders */ -static int lpc_calc_coefs(FlacEncodeContext *s, +static int lpc_calc_coefs(DSPContext *s, const int32_t *samples, int blocksize, int max_order, int precision, int32_t coefs[][MAX_LPC_ORDER], - int *shift, int use_lpc, int omethod) + int *shift, int use_lpc, int omethod, int max_shift, int zero_shift) { double autoc[MAX_LPC_ORDER+1]; double ref[MAX_LPC_ORDER]; @@ -759,7 +759,7 @@ assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER); if(use_lpc == 1){ - s->dsp.flac_compute_autocorr(samples, blocksize, max_order, autoc); + s->flac_compute_autocorr(samples, blocksize, max_order, autoc); compute_lpc_coefs(autoc, max_order, lpc, ref); }else{ @@ -804,10 +804,10 @@ if(omethod == ORDER_METHOD_EST) { opt_order = estimate_best_order(ref, max_order); i = opt_order-1; - quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i]); + quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i], max_shift, zero_shift); } else { for(i=0; ioptions.use_lpc, omethod); + opt_order = lpc_calc_coefs(&ctx->dsp, smp, n, max_order, precision, coefs, + shift, ctx->options.use_lpc, omethod, MAX_LPC_SHIFT, 0); if(omethod == ORDER_METHOD_2LEVEL || omethod == ORDER_METHOD_4LEVEL ||