diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2012-12-21 10:23:26 +0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2012-12-21 10:23:26 +0400 |
commit | e69bd79df9c03c20b6bd0fe6e240125b28ab9f82 (patch) | |
tree | b5c81440cded0805e5173b9012370c7fca11d4cf | |
parent | 5e0e85bcb9722de5a8a982dbcf8dbe7dc7583a5e (diff) |
skip bands with no energy
-rw-r--r-- | celt/celt_decoder.c | 2 | ||||
-rw-r--r-- | celt/celt_encoder.c | 8 | ||||
-rw-r--r-- | celt/rate.c | 8 | ||||
-rw-r--r-- | celt/rate.h | 2 |
4 files changed, 13 insertions, 7 deletions
diff --git a/celt/celt_decoder.c b/celt/celt_decoder.c index 9ade12bb..bfcdf415 100644 --- a/celt/celt_decoder.c +++ b/celt/celt_decoder.c @@ -857,7 +857,7 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat codedBands = compute_allocation(mode, st->start, st->end, offsets, cap, alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, - fine_quant, fine_priority, C, LM, dec, 0, 0); + fine_quant, fine_priority, C, LM, dec, 0, 0, 0); unquant_fine_energy(mode, st->start, st->end, oldBandE, fine_quant, dec, C); diff --git a/celt/celt_encoder.c b/celt/celt_encoder.c index fe3d2b1e..2226b23d 100644 --- a/celt/celt_encoder.c +++ b/celt/celt_encoder.c @@ -1103,6 +1103,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int overlap; const opus_int16 *eBands; int secondMdct; + int signalBandwidth; ALLOC_STACK; mode = st->mode; @@ -1678,9 +1679,14 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, bits = (((opus_int32)nbCompressedBytes*8)<<BITRES) - ec_tell_frac(enc) - 1; anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0; bits -= anti_collapse_rsv; + signalBandwidth = st->end-1; +#ifndef FIXED_POINT + if (st->analysis.valid) + signalBandwidth = st->analysis.bandwidth; +#endif codedBands = compute_allocation(mode, st->start, st->end, offsets, cap, alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses, - fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands); + fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth); st->lastCodedBands = codedBands; quant_fine_energy(mode, st->start, st->end, oldBandE, error, fine_quant, enc, C); diff --git a/celt/rate.c b/celt/rate.c index 4e96787f..e474cf50 100644 --- a/celt/rate.c +++ b/celt/rate.c @@ -248,7 +248,7 @@ void compute_pulse_cache(CELTMode *m, int LM) static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance, int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, - int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev) + int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) { opus_int32 psum; int lo, hi; @@ -353,7 +353,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int #ifdef FUZZING if ((rand()&0x1) == 0) #else - if (codedBands<=start+2 || band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4) + if (codedBands<=start+2 || (band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth)) #endif { ec_enc_bit_logp(ec, 1, 1); @@ -524,7 +524,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int } int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo, - opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev) + opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) { int lo, hi, len, j; int codedBands; @@ -631,7 +631,7 @@ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets } codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap, total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv, - pulses, ebits, fine_priority, C, LM, ec, encode, prev); + pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth); RESTORE_STACK; return codedBands; } diff --git a/celt/rate.h b/celt/rate.h index e0d50223..263fde98 100644 --- a/celt/rate.h +++ b/celt/rate.h @@ -96,6 +96,6 @@ static inline int pulses2bits(const CELTMode *m, int band, int LM, int pulses) @return Total number of bits allocated */ int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero, - opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev); + opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth); #endif |