From e38c7c18f77ba03e4f3c18c6de5cc4cbb17dcdf3 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <Jean-Marc.Valin@csiro.au> Date: Fri, 7 Dec 2007 17:10:14 +1100 Subject: [PATCH] Energy is now Laplace-encoded (very poorly for now) --- libcelt/celt.c | 6 +++--- libcelt/quant_bands.c | 14 ++++++++------ libentcode/Makefile.am | 2 +- libentcode/laplace.c | 11 ++++++++++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/libcelt/celt.c b/libcelt/celt.c index 7d7202337..b5d0c21c7 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -397,12 +397,12 @@ int celt_decode(CELTDecoder *st, char *data, int len, short *pcm) ec_byte_readinit(&buf,data,len); ec_dec_init(&dec,&buf); - /* Get band energies */ - unquant_energy(st->mode, bandE, st->oldBandE, &dec); - /* Get the pitch index */ pitch_index = ec_dec_uint(&dec, MAX_PERIOD-(B+1)*N);; + /* Get band energies */ + unquant_energy(st->mode, bandE, st->oldBandE, &dec); + /* Pitch MDCT */ compute_mdcts(&st->mdct_lookup, st->window, st->out_mem+pitch_index, P, N, B); diff --git a/libcelt/quant_bands.c b/libcelt/quant_bands.c index 33afc0459..61b809594 100644 --- a/libcelt/quant_bands.c +++ b/libcelt/quant_bands.c @@ -31,10 +31,9 @@ #include "quant_bands.h" +#include "laplace.h" #include <math.h> -int dummy_qi[100]; - void quant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc) { int i; @@ -51,11 +50,14 @@ void quant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_enc *enc) res = .25f*(i+3.f); //res = 1; qi = (int)floor(.5+(x-pred-prev)/res); - dummy_qi[i] = qi; + /*if (qi > 40) + qi = 40; + if (qi < -40) + qi = -40;*/ + ec_laplace_encode(enc, qi, 15000); q = qi*res; //printf("%f %f ", pred+prev+q, x); - //printf("%d ", qi); //printf("%f ", x-pred-prev); oldEBands[i] = pred+prev+q; @@ -79,9 +81,8 @@ void unquant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec) float pred = .7*oldEBands[i]; res = .25f*(i+3.f); - qi = dummy_qi[i]; + qi = ec_laplace_decode(dec, 15000); q = qi*res; - //printf("%f %f ", pred+prev+q, x); //printf("%d ", qi); //printf("%f ", x-pred-prev); @@ -92,4 +93,5 @@ void unquant_energy(CELTMode *m, float *eBands, float *oldEBands, ec_dec *dec) eBands[i] = 0; prev = (prev + .5*q); } + //printf ("\n"); } diff --git a/libentcode/Makefile.am b/libentcode/Makefile.am index d00c09be6..97112e740 100644 --- a/libentcode/Makefile.am +++ b/libentcode/Makefile.am @@ -7,4 +7,4 @@ bin_PROGRAMS = ectest ectest_SOURCES = ectest.c ectest_LDADD = $(top_builddir)/libentcode/libentcode.la noinst_HEADERS = bitrdec.h bitree.h bitrenc.h ecintrin.h entcode.h entdec.h \ - entenc.h mfrngcod.h probdec.h probenc.h probmod.h + entenc.h laplace.h mfrngcod.h probdec.h probenc.h probmod.h diff --git a/libentcode/laplace.c b/libentcode/laplace.c index 96e92d9f8..b06b5ff4d 100644 --- a/libentcode/laplace.c +++ b/libentcode/laplace.c @@ -33,7 +33,7 @@ #include "entdec.h" #include <stdio.h> -int ec_laplace_get_total(int decay) +static int ec_laplace_get_total(int decay) { return (1<<30)/((1<<14) - decay) - (1<<15) + 1; } @@ -52,8 +52,17 @@ void ec_laplace_encode(ec_enc *enc, int value, int decay) fs = 1<<15; for (i=0;i<value;i++) { + int tmp_l, tmp_s; + tmp_l = fl; + tmp_s = fs; fl += fs*2; fs = (fs*decay)>>14; + if (fs == 0) + { + fs = tmp_s; + fl = tmp_l; + break; + } } if (fl < 0) fl = 0; -- GitLab