Index: celt/quant_bands.c |
diff --git a/celt/quant_bands.c b/celt/quant_bands.c |
index 66f1f5fc5e6a1183937ade3a517f30313acd2a18..79685e17cb5d000135c30b9aa5a2647b7db72030 100644 |
--- a/celt/quant_bands.c |
+++ b/celt/quant_bands.c |
@@ -40,8 +40,8 @@ |
#include "rate.h" |
#ifdef FIXED_POINT |
-/* Mean energy in each band quantized in Q6 */ |
-static const signed char eMeans[25] = { |
+/* Mean energy in each band quantized in Q4 */ |
+const signed char eMeans[25] = { |
103,100, 92, 85, 81, |
77, 72, 70, 78, 75, |
73, 71, 78, 74, 69, |
@@ -49,8 +49,8 @@ static const signed char eMeans[25] = { |
60, 60, 60, 60, 60 |
}; |
#else |
-/* Mean energy in each band quantized in Q6 and converted back to float */ |
-static const opus_val16 eMeans[25] = { |
+/* Mean energy in each band quantized in Q4 and converted back to float */ |
+const opus_val16 eMeans[25] = { |
6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, |
4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, |
4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f, |
@@ -157,7 +157,7 @@ static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, |
const opus_val16 *eBands, opus_val16 *oldEBands, |
opus_int32 budget, opus_int32 tell, |
const unsigned char *prob_model, opus_val16 *error, ec_enc *enc, |
- int C, int LM, int intra, opus_val16 max_decay) |
+ int C, int LM, int intra, opus_val16 max_decay, int lfe) |
{ |
int i, c; |
int badness = 0; |
@@ -222,6 +222,8 @@ static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, |
if (bits_left < 16) |
qi = IMAX(-1, qi); |
} |
+ if (lfe && i>=2) |
+ qi = IMIN(qi, 0); |
if (budget-tell >= 15) |
{ |
int pi; |
@@ -253,13 +255,13 @@ static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, |
prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); |
} while (++c < C); |
} |
- return badness; |
+ return lfe ? 0 : badness; |
} |
void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, |
const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, |
opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, |
- int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate) |
+ int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe) |
{ |
int intra; |
opus_val16 max_decay; |
@@ -280,9 +282,6 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, |
if (tell+3 > budget) |
two_pass = intra = 0; |
- /* Encode the global flags using a simple probability model |
- (first symbols in the stream) */ |
- |
max_decay = QCONST16(16.f,DB_SHIFT); |
if (end-start>10) |
{ |
@@ -292,6 +291,8 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, |
max_decay = MIN32(max_decay, .125f*nbAvailableBytes); |
#endif |
} |
+ if (lfe) |
+ max_decay=3; |
enc_start_state = *enc; |
ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); |
@@ -301,7 +302,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, |
if (two_pass || intra) |
{ |
badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, |
- tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay); |
+ tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe); |
} |
if (!intra) |
@@ -328,7 +329,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, |
*enc = enc_start_state; |
badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, |
- tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay); |
+ tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe); |
if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) |
{ |
@@ -535,25 +536,6 @@ void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 * |
} |
} |
-void log2Amp(const CELTMode *m, int start, int end, |
- celt_ener *eBands, const opus_val16 *oldEBands, int C) |
-{ |
- int c, i; |
- c=0; |
- do { |
- for (i=0;i<start;i++) |
- eBands[i+c*m->nbEBands] = 0; |
- for (;i<end;i++) |
- { |
- opus_val16 lg = ADD16(oldEBands[i+c*m->nbEBands], |
- SHL16((opus_val16)eMeans[i],6)); |
- eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); |
- } |
- for (;i<m->nbEBands;i++) |
- eBands[i+c*m->nbEBands] = 0; |
- } while (++c < C); |
-} |
- |
void amp2Log2(const CELTMode *m, int effEnd, int end, |
celt_ener *bandE, opus_val16 *bandLogE, int C) |
{ |