diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/quant_bands.c')
-rw-r--r-- | lib/rbcodec/codecs/libopus/celt/quant_bands.c | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/quant_bands.c b/lib/rbcodec/codecs/libopus/celt/quant_bands.c index 5ad5311f84..79685e17cb 100644 --- a/lib/rbcodec/codecs/libopus/celt/quant_bands.c +++ b/lib/rbcodec/codecs/libopus/celt/quant_bands.c | |||
@@ -27,7 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #ifdef HAVE_CONFIG_H | 29 | #ifdef HAVE_CONFIG_H |
30 | #include "opus_config.h" | 30 | #include "config.h" |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | #include "quant_bands.h" | 33 | #include "quant_bands.h" |
@@ -40,8 +40,8 @@ | |||
40 | #include "rate.h" | 40 | #include "rate.h" |
41 | 41 | ||
42 | #ifdef FIXED_POINT | 42 | #ifdef FIXED_POINT |
43 | /* Mean energy in each band quantized in Q6 */ | 43 | /* Mean energy in each band quantized in Q4 */ |
44 | static const signed char eMeans[25] = { | 44 | const signed char eMeans[25] = { |
45 | 103,100, 92, 85, 81, | 45 | 103,100, 92, 85, 81, |
46 | 77, 72, 70, 78, 75, | 46 | 77, 72, 70, 78, 75, |
47 | 73, 71, 78, 74, 69, | 47 | 73, 71, 78, 74, 69, |
@@ -49,8 +49,8 @@ static const signed char eMeans[25] = { | |||
49 | 60, 60, 60, 60, 60 | 49 | 60, 60, 60, 60, 60 |
50 | }; | 50 | }; |
51 | #else | 51 | #else |
52 | /* Mean energy in each band quantized in Q6 and converted back to float */ | 52 | /* Mean energy in each band quantized in Q4 and converted back to float */ |
53 | static const opus_val16 eMeans[25] = { | 53 | const opus_val16 eMeans[25] = { |
54 | 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, | 54 | 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, |
55 | 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, | 55 | 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, |
56 | 4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f, | 56 | 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, | |||
157 | const opus_val16 *eBands, opus_val16 *oldEBands, | 157 | const opus_val16 *eBands, opus_val16 *oldEBands, |
158 | opus_int32 budget, opus_int32 tell, | 158 | opus_int32 budget, opus_int32 tell, |
159 | const unsigned char *prob_model, opus_val16 *error, ec_enc *enc, | 159 | const unsigned char *prob_model, opus_val16 *error, ec_enc *enc, |
160 | int C, int LM, int intra, opus_val16 max_decay) | 160 | int C, int LM, int intra, opus_val16 max_decay, int lfe) |
161 | { | 161 | { |
162 | int i, c; | 162 | int i, c; |
163 | int badness = 0; | 163 | int badness = 0; |
@@ -222,6 +222,8 @@ static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, | |||
222 | if (bits_left < 16) | 222 | if (bits_left < 16) |
223 | qi = IMAX(-1, qi); | 223 | qi = IMAX(-1, qi); |
224 | } | 224 | } |
225 | if (lfe && i>=2) | ||
226 | qi = IMIN(qi, 0); | ||
225 | if (budget-tell >= 15) | 227 | if (budget-tell >= 15) |
226 | { | 228 | { |
227 | int pi; | 229 | int pi; |
@@ -253,13 +255,13 @@ static int quant_coarse_energy_impl(const CELTMode *m, int start, int end, | |||
253 | prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); | 255 | prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); |
254 | } while (++c < C); | 256 | } while (++c < C); |
255 | } | 257 | } |
256 | return badness; | 258 | return lfe ? 0 : badness; |
257 | } | 259 | } |
258 | 260 | ||
259 | void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, | 261 | void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, |
260 | const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, | 262 | const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget, |
261 | opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, | 263 | opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes, |
262 | int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate) | 264 | int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe) |
263 | { | 265 | { |
264 | int intra; | 266 | int intra; |
265 | opus_val16 max_decay; | 267 | opus_val16 max_decay; |
@@ -280,15 +282,17 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, | |||
280 | if (tell+3 > budget) | 282 | if (tell+3 > budget) |
281 | two_pass = intra = 0; | 283 | two_pass = intra = 0; |
282 | 284 | ||
283 | /* Encode the global flags using a simple probability model | 285 | max_decay = QCONST16(16.f,DB_SHIFT); |
284 | (first symbols in the stream) */ | 286 | if (end-start>10) |
285 | 287 | { | |
286 | #ifdef FIXED_POINT | 288 | #ifdef FIXED_POINT |
287 | max_decay = MIN32(QCONST16(16.f,DB_SHIFT), SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3)); | 289 | max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3)); |
288 | #else | 290 | #else |
289 | max_decay = MIN32(16.f, .125f*nbAvailableBytes); | 291 | max_decay = MIN32(max_decay, .125f*nbAvailableBytes); |
290 | #endif | 292 | #endif |
291 | 293 | } | |
294 | if (lfe) | ||
295 | max_decay=3; | ||
292 | enc_start_state = *enc; | 296 | enc_start_state = *enc; |
293 | 297 | ||
294 | ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); | 298 | ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); |
@@ -298,7 +302,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, | |||
298 | if (two_pass || intra) | 302 | if (two_pass || intra) |
299 | { | 303 | { |
300 | badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, | 304 | badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget, |
301 | tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay); | 305 | tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe); |
302 | } | 306 | } |
303 | 307 | ||
304 | if (!intra) | 308 | if (!intra) |
@@ -325,7 +329,7 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd, | |||
325 | *enc = enc_start_state; | 329 | *enc = enc_start_state; |
326 | 330 | ||
327 | badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, | 331 | badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget, |
328 | tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay); | 332 | tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe); |
329 | 333 | ||
330 | if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) | 334 | if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) |
331 | { | 335 | { |
@@ -532,25 +536,6 @@ void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 * | |||
532 | } | 536 | } |
533 | } | 537 | } |
534 | 538 | ||
535 | void log2Amp(const CELTMode *m, int start, int end, | ||
536 | celt_ener *eBands, const opus_val16 *oldEBands, int C) | ||
537 | { | ||
538 | int c, i; | ||
539 | c=0; | ||
540 | do { | ||
541 | for (i=0;i<start;i++) | ||
542 | eBands[i+c*m->nbEBands] = 0; | ||
543 | for (;i<end;i++) | ||
544 | { | ||
545 | opus_val16 lg = ADD16(oldEBands[i+c*m->nbEBands], | ||
546 | SHL16((opus_val16)eMeans[i],6)); | ||
547 | eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); | ||
548 | } | ||
549 | for (;i<m->nbEBands;i++) | ||
550 | eBands[i+c*m->nbEBands] = 0; | ||
551 | } while (++c < C); | ||
552 | } | ||
553 | |||
554 | void amp2Log2(const CELTMode *m, int effEnd, int end, | 539 | void amp2Log2(const CELTMode *m, int effEnd, int end, |
555 | celt_ener *bandE, opus_val16 *bandLogE, int C) | 540 | celt_ener *bandE, opus_val16 *bandLogE, int C) |
556 | { | 541 | { |