diff options
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/opus_pvq.c | 249 | ||||
-rw-r--r-- | libavcodec/opustab.c | 5 | ||||
-rw-r--r-- | libavcodec/opustab.h | 2 |
3 files changed, 112 insertions, 144 deletions
diff --git a/libavcodec/opus_pvq.c b/libavcodec/opus_pvq.c index e424cb2e03..e37eccae16 100644 --- a/libavcodec/opus_pvq.c +++ b/libavcodec/opus_pvq.c @@ -33,7 +33,7 @@ static inline int16_t celt_cos(int16_t x) { x = (MUL16(x, x) + 4096) >> 13; x = (32767-x) + ROUND_MUL16(x, (-7651 + ROUND_MUL16(x, (8277 + ROUND_MUL16(-626, x))))); - return 1+x; + return x + 1; } static inline int celt_log2tan(int isin, int icos) @@ -163,7 +163,7 @@ static inline uint32_t celt_extract_collapse_mask(const int *iy, uint32_t N, uin collapse_mask = 0; for (i = 0; i < B; i++) for (j = 0; j < N0; j++) - collapse_mask |= (iy[i*N0+j]!=0)<<i; + collapse_mask |= (!!iy[i*N0+j]) << i; return collapse_mask; } @@ -173,7 +173,7 @@ static inline void celt_stereo_merge(float *X, float *Y, float mid, int N) float xp = 0, side = 0; float E[2]; float mid2; - float t, gain[2]; + float gain[2]; /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ for (i = 0; i < N; i++) { @@ -192,10 +192,8 @@ static inline void celt_stereo_merge(float *X, float *Y, float mid, int N) return; } - t = E[0]; - gain[0] = 1.0f / sqrtf(t); - t = E[1]; - gain[1] = 1.0f / sqrtf(t); + gain[0] = 1.0f / sqrtf(E[0]); + gain[1] = 1.0f / sqrtf(E[1]); for (i = 0; i < N; i++) { float value[2]; @@ -210,43 +208,27 @@ static inline void celt_stereo_merge(float *X, float *Y, float mid, int N) static void celt_interleave_hadamard(float *tmp, float *X, int N0, int stride, int hadamard) { - int i, j; - int N = N0*stride; + int i, j, N = N0*stride; + const uint8_t *order = &ff_celt_hadamard_order[hadamard ? stride - 2 : 30]; - if (hadamard) { - const uint8_t *ordery = ff_celt_hadamard_ordery + stride - 2; - for (i = 0; i < stride; i++) - for (j = 0; j < N0; j++) - tmp[j*stride+i] = X[ordery[i]*N0+j]; - } else { - for (i = 0; i < stride; i++) - for (j = 0; j < N0; j++) - tmp[j*stride+i] = X[i*N0+j]; - } + for (i = 0; i < stride; i++) + for (j = 0; j < N0; j++) + tmp[j*stride+i] = X[order[i]*N0+j]; - for (i = 0; i < N; i++) - X[i] = tmp[i]; + memcpy(X, tmp, N*sizeof(float)); } static void celt_deinterleave_hadamard(float *tmp, float *X, int N0, int stride, int hadamard) { - int i, j; - int N = N0*stride; + int i, j, N = N0*stride; + const uint8_t *order = &ff_celt_hadamard_order[hadamard ? stride - 2 : 30]; - if (hadamard) { - const uint8_t *ordery = ff_celt_hadamard_ordery + stride - 2; - for (i = 0; i < stride; i++) - for (j = 0; j < N0; j++) - tmp[ordery[i]*N0+j] = X[j*stride+i]; - } else { - for (i = 0; i < stride; i++) - for (j = 0; j < N0; j++) - tmp[i*N0+j] = X[j*stride+i]; - } + for (i = 0; i < stride; i++) + for (j = 0; j < N0; j++) + tmp[order[i]*N0+j] = X[j*stride+i]; - for (i = 0; i < N; i++) - X[i] = tmp[i]; + memcpy(X, tmp, N*sizeof(float)); } static void celt_haar1(float *X, int N0, int stride) @@ -264,11 +246,11 @@ static void celt_haar1(float *X, int N0, int stride) } static inline int celt_compute_qn(int N, int b, int offset, int pulse_cap, - int dualstereo) + int stereo) { int qn, qb; int N2 = 2 * N - 1; - if (dualstereo && N == 2) + if (stereo && N == 2) N2--; /* The upper limit ensures that in a stereo split with itheta==16384, we'll @@ -471,12 +453,13 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, float *lowband, int duration, float *lowband_out, int level, float gain, float *lowband_scratch, int fill) { + int i; const uint8_t *cache; - int dualstereo, split; + int stereo = !!Y, split = !!Y; int imid = 0, iside = 0; uint32_t N0 = N; - int N_B; - int N_B0; + int N_B = N / blocks; + int N_B0 = N_B; int B0 = blocks; int time_divide = 0; int recombine = 0; @@ -485,14 +468,10 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, int longblocks = (B0 == 1); uint32_t cm = 0; - N_B0 = N_B = N / blocks; - split = dualstereo = (Y != NULL); - if (N == 1) { /* special case for one sample */ - int i; float *x = X; - for (i = 0; i <= dualstereo; i++) { + for (i = 0; i <= stereo; i++) { int sign = 0; if (f->remaining2 >= 1<<3) { sign = ff_opus_rc_get_raw(rc, 1); @@ -507,7 +486,7 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, return 1; } - if (!dualstereo && level == 0) { + if (!stereo && level == 0) { int tf_change = f->tf_change[band]; int k; if (tf_change > 0) @@ -516,9 +495,8 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, if (lowband && (recombine || ((N_B & 1) == 0 && tf_change < 0) || B0 > 1)) { - int j; - for (j = 0; j < N; j++) - lowband_scratch[j] = lowband[j]; + for (i = 0; i < N; i++) + lowband_scratch[i] = lowband[i]; lowband = lowband_scratch; } @@ -552,7 +530,7 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* If we need 1.5 more bit than we can produce, split the band in two. */ cache = ff_celt_cache_bits + ff_celt_cache_index[(duration + 1) * CELT_MAX_BANDS + band]; - if (!dualstereo && duration >= 0 && b > cache[cache[0]] + 12 && N > 2) { + if (!stereo && duration >= 0 && b > cache[cache[0]] + 12 && N > 2) { N >>= 1; Y = X + N; split = 1; @@ -574,24 +552,24 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Decide on the resolution to give to the split parameter theta */ pulse_cap = ff_celt_log_freq_range[band] + duration * 8; - offset = (pulse_cap >> 1) - (dualstereo && N == 2 ? CELT_QTHETA_OFFSET_TWOPHASE : + offset = (pulse_cap >> 1) - (stereo && N == 2 ? CELT_QTHETA_OFFSET_TWOPHASE : CELT_QTHETA_OFFSET); - qn = (dualstereo && band >= f->intensity_stereo) ? 1 : - celt_compute_qn(N, b, offset, pulse_cap, dualstereo); + qn = (stereo && band >= f->intensity_stereo) ? 1 : + celt_compute_qn(N, b, offset, pulse_cap, stereo); tell = opus_rc_tell_frac(rc); if (qn != 1) { /* Entropy coding of the angle. We use a uniform pdf for the time split, a step for stereo, and a triangular one for the rest. */ - if (dualstereo && N > 2) + if (stereo && N > 2) itheta = ff_opus_rc_dec_uint_step(rc, qn/2); - else if (dualstereo || B0 > 1) + else if (stereo || B0 > 1) itheta = ff_opus_rc_dec_uint(rc, qn+1); else itheta = ff_opus_rc_dec_uint_tri(rc, qn); itheta = itheta * 16384 / qn; /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. Let's do that at higher complexity */ - } else if (dualstereo) { + } else if (stereo) { inv = (b > 2 << 3 && f->remaining2 > 2 << 3) ? ff_opus_rc_dec_log(rc, 2) : 0; itheta = 0; } @@ -623,7 +601,7 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* This is a special case for N=2 that only works for stereo and takes advantage of the fact that mid and side are orthogonal to encode the side with just one bit. */ - if (N == 2 && dualstereo) { + if (N == 2 && stereo) { int c; int sign = 0; float tmp; @@ -668,7 +646,7 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Give more bits to low-energy MDCTs than they would * otherwise deserve */ - if (B0 > 1 && !dualstereo && (itheta & 0x3fff)) { + if (B0 > 1 && !stereo && (itheta & 0x3fff)) { if (itheta > 8192) /* Rough approximation for pre-echo masking */ delta -= delta >> (4 - duration); @@ -681,12 +659,12 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, sbits = b - mbits; f->remaining2 -= qalloc; - if (lowband && !dualstereo) + if (lowband && !stereo) next_lowband2 = lowband + N; /* >32-bit split case */ /* Only stereo needs to pass on lowband_out. * Otherwise, it's handled at the end */ - if (dualstereo) + if (stereo) next_lowband_out1 = lowband_out; else next_level = level + 1; @@ -697,7 +675,7 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, * because we need the normalized mid for folding later */ cm = ff_celt_decode_band(f, rc, band, X, NULL, N, mbits, blocks, lowband, duration, next_lowband_out1, - next_level, dualstereo ? 1.0f : (gain * mid), + next_level, stereo ? 1.0f : (gain * mid), lowband_scratch, fill); rebalance = mbits - (rebalance - f->remaining2); @@ -709,14 +687,14 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, cm |= ff_celt_decode_band(f, rc, band, Y, NULL, N, sbits, blocks, next_lowband2, duration, NULL, next_level, gain * side, NULL, - fill >> blocks) << ((B0 >> 1) & (dualstereo - 1)); + fill >> blocks) << ((B0 >> 1) & (stereo - 1)); } else { /* For a stereo split, the high bits of fill are always zero, * so no folding will be done to the side. */ cm = ff_celt_decode_band(f, rc, band, Y, NULL, N, sbits, blocks, next_lowband2, duration, NULL, next_level, gain * side, NULL, - fill >> blocks) << ((B0 >> 1) & (dualstereo - 1)); + fill >> blocks) << ((B0 >> 1) & (stereo - 1)); rebalance = sbits - (rebalance - f->remaining2); if (rebalance > 3 << 3 && itheta != 16384) @@ -726,7 +704,7 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, * we need the normalized mid for folding later */ cm |= ff_celt_decode_band(f, rc, band, X, NULL, N, mbits, blocks, lowband, duration, next_lowband_out1, - next_level, dualstereo ? 1.0f : (gain * mid), + next_level, stereo ? 1.0f : (gain * mid), lowband_scratch, fill); } } @@ -749,47 +727,44 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, f->spread, blocks, gain); } else { /* If there's no pulse, fill the band anyway */ - int j; uint32_t cm_mask = (1 << blocks) - 1; fill &= cm_mask; - if (!fill) { - for (j = 0; j < N; j++) - X[j] = 0.0f; - } else { + if (fill) { if (!lowband) { /* Noise */ - for (j = 0; j < N; j++) - X[j] = (((int32_t)celt_rng(f)) >> 20); + for (i = 0; i < N; i++) + X[i] = (((int32_t)celt_rng(f)) >> 20); cm = cm_mask; } else { /* Folded spectrum */ - for (j = 0; j < N; j++) { + for (i = 0; i < N; i++) { /* About 48 dB below the "normal" folding level */ - X[j] = lowband[j] + (((celt_rng(f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256); + X[i] = lowband[i] + (((celt_rng(f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256); } cm = fill; } celt_renormalize_vector(X, N, gain); + } else { + memset(X, 0, N*sizeof(float)); } } } /* This code is used by the decoder and by the resynthesis-enabled encoder */ - if (dualstereo) { - int j; - if (N != 2) + if (stereo) { + if (N > 2) celt_stereo_merge(X, Y, mid, N); if (inv) { - for (j = 0; j < N; j++) - Y[j] *= -1; + for (i = 0; i < N; i++) + Y[i] *= -1; } } else if (level == 0) { int k; /* Undo the sample reorganization going from time order to frequency order */ if (B0 > 1) - celt_interleave_hadamard(f->scratch, X, N_B>>recombine, - B0<<recombine, longblocks); + celt_interleave_hadamard(f->scratch, X, N_B >> recombine, + B0 << recombine, longblocks); /* Undo time-freq changes that we did earlier */ N_B = N_B0; @@ -809,10 +784,9 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Scale output for later folding */ if (lowband_out) { - int j; float n = sqrtf(N0); - for (j = 0; j < N0; j++) - lowband_out[j] = n * X[j]; + for (i = 0; i < N0; i++) + lowband_out[i] = n * X[i]; } cm = av_mod_uintp2(cm, blocks); } @@ -824,15 +798,17 @@ uint32_t ff_celt_decode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, * big impact on the entire quantization and especially huge on transients */ static int celt_calc_theta(const float *X, const float *Y, int coupling, int N) { - int j; + int i; float e[2] = { 0.0f, 0.0f }; - for (j = 0; j < N; j++) { - if (coupling) { /* Coupling case */ - e[0] += (X[j] + Y[j])*(X[j] + Y[j]); - e[1] += (X[j] - Y[j])*(X[j] - Y[j]); - } else { - e[0] += X[j]*X[j]; - e[1] += Y[j]*Y[j]; + if (coupling) { /* Coupling case */ + for (i = 0; i < N; i++) { + e[0] += (X[i] + Y[i])*(X[i] + Y[i]); + e[1] += (X[i] - Y[i])*(X[i] - Y[i]); + } + } else { + for (i = 0; i < N; i++) { + e[0] += X[i]*X[i]; + e[1] += Y[i]*Y[i]; } } return lrintf(32768.0f*atan2f(sqrtf(e[1]), sqrtf(e[0]))/M_PI); @@ -851,11 +827,10 @@ static void celt_stereo_is_decouple(float *X, float *Y, float e_l, float e_r, in static void celt_stereo_ms_decouple(float *X, float *Y, int N) { int i; - const float decouple_norm = 1.0f/sqrtf(1.0f + 1.0f); for (i = 0; i < N; i++) { const float Xret = X[i]; - X[i] = (X[i] + Y[i])*decouple_norm; - Y[i] = (Y[i] - Xret)*decouple_norm; + X[i] = (X[i] + Y[i])*M_SQRT1_2; + Y[i] = (Y[i] - Xret)*M_SQRT1_2; } } @@ -864,8 +839,9 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, float *lowband, int duration, float *lowband_out, int level, float gain, float *lowband_scratch, int fill) { + int i; const uint8_t *cache; - int dualstereo, split; + int stereo = !!Y, split = !!Y; int imid = 0, iside = 0; uint32_t N0 = N; int N_B = N / blocks; @@ -878,13 +854,10 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, int longblocks = (B0 == 1); uint32_t cm = 0; - split = dualstereo = (Y != NULL); - if (N == 1) { /* special case for one sample - the decoder's output will be +- 1.0f!!! */ - int i; float *x = X; - for (i = 0; i <= dualstereo; i++) { + for (i = 0; i <= stereo; i++) { if (f->remaining2 >= 1<<3) { ff_opus_rc_put_raw(rc, x[0] < 0, 1); f->remaining2 -= 1 << 3; @@ -898,7 +871,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, return 1; } - if (!dualstereo && level == 0) { + if (!stereo && level == 0) { int tf_change = f->tf_change[band]; int k; if (tf_change > 0) @@ -907,9 +880,8 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, if (lowband && (recombine || ((N_B & 1) == 0 && tf_change < 0) || B0 > 1)) { - int j; - for (j = 0; j < N; j++) - lowband_scratch[j] = lowband[j]; + for (i = 0; i < N; i++) + lowband_scratch[i] = lowband[i]; lowband = lowband_scratch; } @@ -941,7 +913,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* If we need 1.5 more bit than we can produce, split the band in two. */ cache = ff_celt_cache_bits + ff_celt_cache_index[(duration + 1) * CELT_MAX_BANDS + band]; - if (!dualstereo && duration >= 0 && b > cache[cache[0]] + 12 && N > 2) { + if (!stereo && duration >= 0 && b > cache[cache[0]] + 12 && N > 2) { N >>= 1; Y = X + N; split = 1; @@ -953,7 +925,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, if (split) { int qn; - int itheta = celt_calc_theta(X, Y, dualstereo, N); + int itheta = celt_calc_theta(X, Y, stereo, N); int mbits, sbits, delta; int qalloc; int pulse_cap; @@ -963,10 +935,10 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Decide on the resolution to give to the split parameter theta */ pulse_cap = ff_celt_log_freq_range[band] + duration * 8; - offset = (pulse_cap >> 1) - (dualstereo && N == 2 ? CELT_QTHETA_OFFSET_TWOPHASE : + offset = (pulse_cap >> 1) - (stereo && N == 2 ? CELT_QTHETA_OFFSET_TWOPHASE : CELT_QTHETA_OFFSET); - qn = (dualstereo && band >= f->intensity_stereo) ? 1 : - celt_compute_qn(N, b, offset, pulse_cap, dualstereo); + qn = (stereo && band >= f->intensity_stereo) ? 1 : + celt_compute_qn(N, b, offset, pulse_cap, stereo); tell = opus_rc_tell_frac(rc); if (qn != 1) { @@ -975,27 +947,26 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Entropy coding of the angle. We use a uniform pdf for the * time split, a step for stereo, and a triangular one for the rest. */ - if (dualstereo && N > 2) + if (stereo && N > 2) ff_opus_rc_enc_uint_step(rc, itheta, qn / 2); - else if (dualstereo || B0 > 1) + else if (stereo || B0 > 1) ff_opus_rc_enc_uint(rc, itheta, qn + 1); else ff_opus_rc_enc_uint_tri(rc, itheta, qn); itheta = itheta * 16384 / qn; - if (dualstereo) { + if (stereo) { if (itheta == 0) celt_stereo_is_decouple(X, Y, f->block[0].lin_energy[band], f->block[1].lin_energy[band], N); else celt_stereo_ms_decouple(X, Y, N); } - } else if (dualstereo) { + } else if (stereo) { inv = itheta > 8192; if (inv) { - int j; - for (j = 0; j < N; j++) - Y[j] = -Y[j]; + for (i = 0; i < N; i++) + Y[i] *= -1; } celt_stereo_is_decouple(X, Y, f->block[0].lin_energy[band], f->block[1].lin_energy[band], N); @@ -1036,7 +1007,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* This is a special case for N=2 that only works for stereo and takes advantage of the fact that mid and side are orthogonal to encode the side with just one bit. */ - if (N == 2 && dualstereo) { + if (N == 2 && stereo) { int c; int sign = 0; float tmp; @@ -1083,7 +1054,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Give more bits to low-energy MDCTs than they would * otherwise deserve */ - if (B0 > 1 && !dualstereo && (itheta & 0x3fff)) { + if (B0 > 1 && !stereo && (itheta & 0x3fff)) { if (itheta > 8192) /* Rough approximation for pre-echo masking */ delta -= delta >> (4 - duration); @@ -1096,12 +1067,12 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, sbits = b - mbits; f->remaining2 -= qalloc; - if (lowband && !dualstereo) + if (lowband && !stereo) next_lowband2 = lowband + N; /* >32-bit split case */ /* Only stereo needs to pass on lowband_out. * Otherwise, it's handled at the end */ - if (dualstereo) + if (stereo) next_lowband_out1 = lowband_out; else next_level = level + 1; @@ -1112,7 +1083,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, * because we need the normalized mid for folding later */ cm = ff_celt_encode_band(f, rc, band, X, NULL, N, mbits, blocks, lowband, duration, next_lowband_out1, - next_level, dualstereo ? 1.0f : (gain * mid), + next_level, stereo ? 1.0f : (gain * mid), lowband_scratch, fill); rebalance = mbits - (rebalance - f->remaining2); @@ -1124,14 +1095,14 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, cm |= ff_celt_encode_band(f, rc, band, Y, NULL, N, sbits, blocks, next_lowband2, duration, NULL, next_level, gain * side, NULL, - fill >> blocks) << ((B0 >> 1) & (dualstereo - 1)); + fill >> blocks) << ((B0 >> 1) & (stereo - 1)); } else { /* For a stereo split, the high bits of fill are always zero, * so no folding will be done to the side. */ cm = ff_celt_encode_band(f, rc, band, Y, NULL, N, sbits, blocks, next_lowband2, duration, NULL, next_level, gain * side, NULL, - fill >> blocks) << ((B0 >> 1) & (dualstereo - 1)); + fill >> blocks) << ((B0 >> 1) & (stereo - 1)); rebalance = sbits - (rebalance - f->remaining2); if (rebalance > 3 << 3 && itheta != 16384) @@ -1141,7 +1112,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, * we need the normalized mid for folding later */ cm |= ff_celt_encode_band(f, rc, band, X, NULL, N, mbits, blocks, lowband, duration, next_lowband_out1, - next_level, dualstereo ? 1.0f : (gain * mid), + next_level, stereo ? 1.0f : (gain * mid), lowband_scratch, fill); } } @@ -1164,39 +1135,36 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, f->spread, blocks, gain); } else { /* If there's no pulse, fill the band anyway */ - int j; uint32_t cm_mask = (1 << blocks) - 1; fill &= cm_mask; - if (!fill) { - for (j = 0; j < N; j++) - X[j] = 0.0f; - } else { + if (fill) { if (!lowband) { /* Noise */ - for (j = 0; j < N; j++) - X[j] = (((int32_t)celt_rng(f)) >> 20); + for (i = 0; i < N; i++) + X[i] = (((int32_t)celt_rng(f)) >> 20); cm = cm_mask; } else { /* Folded spectrum */ - for (j = 0; j < N; j++) { + for (i = 0; i < N; i++) { /* About 48 dB below the "normal" folding level */ - X[j] = lowband[j] + (((celt_rng(f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256); + X[i] = lowband[i] + (((celt_rng(f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256); } cm = fill; } celt_renormalize_vector(X, N, gain); + } else { + memset(X, 0, N*sizeof(float)); } } } /* This code is used by the decoder and by the resynthesis-enabled encoder */ - if (dualstereo) { - int j; - if (N != 2) + if (stereo) { + if (N > 2) celt_stereo_merge(X, Y, mid, N); if (inv) { - for (j = 0; j < N; j++) - Y[j] *= -1; + for (i = 0; i < N; i++) + Y[i] *= -1; } } else if (level == 0) { int k; @@ -1204,7 +1172,7 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Undo the sample reorganization going from time order to frequency order */ if (B0 > 1) celt_interleave_hadamard(f->scratch, X, N_B >> recombine, - B0<<recombine, longblocks); + B0 << recombine, longblocks); /* Undo time-freq changes that we did earlier */ N_B = N_B0; @@ -1224,10 +1192,9 @@ uint32_t ff_celt_encode_band(CeltFrame *f, OpusRangeCoder *rc, const int band, /* Scale output for later folding */ if (lowband_out) { - int j; float n = sqrtf(N0); - for (j = 0; j < N0; j++) - lowband_out[j] = n * X[j]; + for (i = 0; i < N0; i++) + lowband_out[i] = n * X[i]; } cm = av_mod_uintp2(cm, blocks); } diff --git a/libavcodec/opustab.c b/libavcodec/opustab.c index 02d548e71a..d0b4bf4bd5 100644 --- a/libavcodec/opustab.c +++ b/libavcodec/opustab.c @@ -930,11 +930,12 @@ const uint8_t ff_celt_bit_deinterleave[] = { 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF }; -const uint8_t ff_celt_hadamard_ordery[] = { +const uint8_t ff_celt_hadamard_order[] = { 1, 0, 3, 0, 2, 1, 7, 0, 4, 3, 6, 1, 5, 2, - 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5 + 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; const uint16_t ff_celt_qn_exp2[] = { diff --git a/libavcodec/opustab.h b/libavcodec/opustab.h index b6be073659..2701a392fd 100644 --- a/libavcodec/opustab.h +++ b/libavcodec/opustab.h @@ -146,7 +146,7 @@ extern const uint8_t ff_celt_log2_frac[]; extern const uint8_t ff_celt_bit_interleave[]; extern const uint8_t ff_celt_bit_deinterleave[]; -extern const uint8_t ff_celt_hadamard_ordery[]; +extern const uint8_t ff_celt_hadamard_order[]; extern const uint16_t ff_celt_qn_exp2[]; extern const uint32_t ff_celt_pvq_u[1272]; |