X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flpc.c;h=fbd1bdf002403abd0cc90c82a6cf2d6548b85958;hb=30517a9f056c8d01b3790871db4aee95d9c176e6;hp=0d6910fd2d974d017182135fc86aede1dcf8ae1b;hpb=32f3c541bcddd1313212792c78c5ae643570b904;p=ffmpeg diff --git a/libavcodec/lpc.c b/libavcodec/lpc.c index 0d6910fd2d9..fbd1bdf0024 100644 --- a/libavcodec/lpc.c +++ b/libavcodec/lpc.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/common.h" #include "libavutil/lls.h" #define LPC_USE_DOUBLE @@ -147,6 +148,18 @@ static int estimate_best_order(double *ref, int min_order, int max_order) return est; } +int ff_lpc_calc_ref_coefs(LPCContext *s, + const int32_t *samples, int order, double *ref) +{ + double autoc[MAX_LPC_ORDER + 1]; + + s->lpc_apply_welch_window(samples, s->blocksize, s->windowed_samples); + s->lpc_compute_autocorr(s->windowed_samples, s->blocksize, order, autoc); + compute_ref_coefs(autoc, order, ref, NULL); + + return order; +} + /** * Calculate LPC coefficients for multiple orders * @@ -163,7 +176,7 @@ int ff_lpc_calc_coefs(LPCContext *s, double autoc[MAX_LPC_ORDER+1]; double ref[MAX_LPC_ORDER]; double lpc[MAX_LPC_ORDER][MAX_LPC_ORDER]; - int i, j, pass; + int i, j, pass = 0; int opt_order; assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER && @@ -176,23 +189,30 @@ int ff_lpc_calc_coefs(LPCContext *s, ff_lpc_init(s, blocksize, max_order, lpc_type); } - if (lpc_type == FF_LPC_TYPE_LEVINSON) { - double *windowed_samples = s->windowed_samples + max_order; - - s->lpc_apply_welch_window(samples, blocksize, windowed_samples); + if (lpc_type == FF_LPC_TYPE_LEVINSON || (lpc_type == FF_LPC_TYPE_CHOLESKY && lpc_passes > 1)) { + s->lpc_apply_welch_window(samples, blocksize, s->windowed_samples); - s->lpc_compute_autocorr(windowed_samples, blocksize, max_order, autoc); + s->lpc_compute_autocorr(s->windowed_samples, blocksize, max_order, autoc); compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1); for(i=0; i>pass) + fabs(eval - var[0]); inv = 1/eval; rinv = sqrt(inv); @@ -211,9 +231,9 @@ int ff_lpc_calc_coefs(LPCContext *s, }else weight++; - av_update_lls(&m[pass&1], var, 1.0); + m[pass&1].update_lls(&m[pass&1], var); } - av_solve_lls(&m[pass&1], 0.001, 0); + avpriv_solve_lls(&m[pass&1], 0.001, 0); } for(i=0; imax_order = max_order; s->lpc_type = lpc_type; - if (lpc_type == FF_LPC_TYPE_LEVINSON) { - s->windowed_samples = av_mallocz((blocksize + max_order + 2) * - sizeof(*s->windowed_samples)); - if (!s->windowed_samples) - return AVERROR(ENOMEM); - } else { - s->windowed_samples = NULL; - } + s->windowed_buffer = av_mallocz((blocksize + 2 + FFALIGN(max_order, 4)) * + sizeof(*s->windowed_samples)); + if (!s->windowed_buffer) + return AVERROR(ENOMEM); + s->windowed_samples = s->windowed_buffer + FFALIGN(max_order, 4); s->lpc_apply_welch_window = lpc_apply_welch_window_c; s->lpc_compute_autocorr = lpc_compute_autocorr_c; - if (HAVE_MMX) + if (ARCH_X86) ff_lpc_init_x86(s); return 0; @@ -266,5 +283,5 @@ av_cold int ff_lpc_init(LPCContext *s, int blocksize, int max_order, av_cold void ff_lpc_end(LPCContext *s) { - av_freep(&s->windowed_samples); + av_freep(&s->windowed_buffer); }