1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2007-2008 CSIRO 3cabdff1aSopenharmony_ci * Copyright (c) 2007-2009 Xiph.Org Foundation 4cabdff1aSopenharmony_ci * Copyright (c) 2008-2009 Gregory Maxwell 5cabdff1aSopenharmony_ci * Copyright (c) 2012 Andrew D'Addesio 6cabdff1aSopenharmony_ci * Copyright (c) 2013-2014 Mozilla Corporation 7cabdff1aSopenharmony_ci * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com> 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * This file is part of FFmpeg. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 12cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 13cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 14cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 17cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 18cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19cabdff1aSopenharmony_ci * Lesser General Public License for more details. 20cabdff1aSopenharmony_ci * 21cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 22cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 23cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 24cabdff1aSopenharmony_ci */ 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "config_components.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "opustab.h" 29cabdff1aSopenharmony_ci#include "opus_pvq.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#define CELT_PVQ_U(n, k) (ff_celt_pvq_u_row[FFMIN(n, k)][FFMAX(n, k)]) 32cabdff1aSopenharmony_ci#define CELT_PVQ_V(n, k) (CELT_PVQ_U(n, k) + CELT_PVQ_U(n, (k) + 1)) 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_cistatic inline int16_t celt_cos(int16_t x) 35cabdff1aSopenharmony_ci{ 36cabdff1aSopenharmony_ci x = (MUL16(x, x) + 4096) >> 13; 37cabdff1aSopenharmony_ci x = (32767-x) + ROUND_MUL16(x, (-7651 + ROUND_MUL16(x, (8277 + ROUND_MUL16(-626, x))))); 38cabdff1aSopenharmony_ci return x + 1; 39cabdff1aSopenharmony_ci} 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_cistatic inline int celt_log2tan(int isin, int icos) 42cabdff1aSopenharmony_ci{ 43cabdff1aSopenharmony_ci int lc, ls; 44cabdff1aSopenharmony_ci lc = opus_ilog(icos); 45cabdff1aSopenharmony_ci ls = opus_ilog(isin); 46cabdff1aSopenharmony_ci icos <<= 15 - lc; 47cabdff1aSopenharmony_ci isin <<= 15 - ls; 48cabdff1aSopenharmony_ci return (ls << 11) - (lc << 11) + 49cabdff1aSopenharmony_ci ROUND_MUL16(isin, ROUND_MUL16(isin, -2597) + 7932) - 50cabdff1aSopenharmony_ci ROUND_MUL16(icos, ROUND_MUL16(icos, -2597) + 7932); 51cabdff1aSopenharmony_ci} 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_cistatic inline int celt_bits2pulses(const uint8_t *cache, int bits) 54cabdff1aSopenharmony_ci{ 55cabdff1aSopenharmony_ci // TODO: Find the size of cache and make it into an array in the parameters list 56cabdff1aSopenharmony_ci int i, low = 0, high; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci high = cache[0]; 59cabdff1aSopenharmony_ci bits--; 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 62cabdff1aSopenharmony_ci int center = (low + high + 1) >> 1; 63cabdff1aSopenharmony_ci if (cache[center] >= bits) 64cabdff1aSopenharmony_ci high = center; 65cabdff1aSopenharmony_ci else 66cabdff1aSopenharmony_ci low = center; 67cabdff1aSopenharmony_ci } 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci return (bits - (low == 0 ? -1 : cache[low]) <= cache[high] - bits) ? low : high; 70cabdff1aSopenharmony_ci} 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_cistatic inline int celt_pulses2bits(const uint8_t *cache, int pulses) 73cabdff1aSopenharmony_ci{ 74cabdff1aSopenharmony_ci // TODO: Find the size of cache and make it into an array in the parameters list 75cabdff1aSopenharmony_ci return (pulses == 0) ? 0 : cache[pulses] + 1; 76cabdff1aSopenharmony_ci} 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_cistatic inline void celt_normalize_residual(const int * av_restrict iy, float * av_restrict X, 79cabdff1aSopenharmony_ci int N, float g) 80cabdff1aSopenharmony_ci{ 81cabdff1aSopenharmony_ci int i; 82cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 83cabdff1aSopenharmony_ci X[i] = g * iy[i]; 84cabdff1aSopenharmony_ci} 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_cistatic void celt_exp_rotation_impl(float *X, uint32_t len, uint32_t stride, 87cabdff1aSopenharmony_ci float c, float s) 88cabdff1aSopenharmony_ci{ 89cabdff1aSopenharmony_ci float *Xptr; 90cabdff1aSopenharmony_ci int i; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci Xptr = X; 93cabdff1aSopenharmony_ci for (i = 0; i < len - stride; i++) { 94cabdff1aSopenharmony_ci float x1 = Xptr[0]; 95cabdff1aSopenharmony_ci float x2 = Xptr[stride]; 96cabdff1aSopenharmony_ci Xptr[stride] = c * x2 + s * x1; 97cabdff1aSopenharmony_ci *Xptr++ = c * x1 - s * x2; 98cabdff1aSopenharmony_ci } 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci Xptr = &X[len - 2 * stride - 1]; 101cabdff1aSopenharmony_ci for (i = len - 2 * stride - 1; i >= 0; i--) { 102cabdff1aSopenharmony_ci float x1 = Xptr[0]; 103cabdff1aSopenharmony_ci float x2 = Xptr[stride]; 104cabdff1aSopenharmony_ci Xptr[stride] = c * x2 + s * x1; 105cabdff1aSopenharmony_ci *Xptr-- = c * x1 - s * x2; 106cabdff1aSopenharmony_ci } 107cabdff1aSopenharmony_ci} 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_cistatic inline void celt_exp_rotation(float *X, uint32_t len, 110cabdff1aSopenharmony_ci uint32_t stride, uint32_t K, 111cabdff1aSopenharmony_ci enum CeltSpread spread, const int encode) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci uint32_t stride2 = 0; 114cabdff1aSopenharmony_ci float c, s; 115cabdff1aSopenharmony_ci float gain, theta; 116cabdff1aSopenharmony_ci int i; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci if (2*K >= len || spread == CELT_SPREAD_NONE) 119cabdff1aSopenharmony_ci return; 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci gain = (float)len / (len + (20 - 5*spread) * K); 122cabdff1aSopenharmony_ci theta = M_PI * gain * gain / 4; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci c = cosf(theta); 125cabdff1aSopenharmony_ci s = sinf(theta); 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci if (len >= stride << 3) { 128cabdff1aSopenharmony_ci stride2 = 1; 129cabdff1aSopenharmony_ci /* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding. 130cabdff1aSopenharmony_ci It's basically incrementing long as (stride2+0.5)^2 < len/stride. */ 131cabdff1aSopenharmony_ci while ((stride2 * stride2 + stride2) * stride + (stride >> 2) < len) 132cabdff1aSopenharmony_ci stride2++; 133cabdff1aSopenharmony_ci } 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci len /= stride; 136cabdff1aSopenharmony_ci for (i = 0; i < stride; i++) { 137cabdff1aSopenharmony_ci if (encode) { 138cabdff1aSopenharmony_ci celt_exp_rotation_impl(X + i * len, len, 1, c, -s); 139cabdff1aSopenharmony_ci if (stride2) 140cabdff1aSopenharmony_ci celt_exp_rotation_impl(X + i * len, len, stride2, s, -c); 141cabdff1aSopenharmony_ci } else { 142cabdff1aSopenharmony_ci if (stride2) 143cabdff1aSopenharmony_ci celt_exp_rotation_impl(X + i * len, len, stride2, s, c); 144cabdff1aSopenharmony_ci celt_exp_rotation_impl(X + i * len, len, 1, c, s); 145cabdff1aSopenharmony_ci } 146cabdff1aSopenharmony_ci } 147cabdff1aSopenharmony_ci} 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_cistatic inline uint32_t celt_extract_collapse_mask(const int *iy, uint32_t N, uint32_t B) 150cabdff1aSopenharmony_ci{ 151cabdff1aSopenharmony_ci int i, j, N0 = N / B; 152cabdff1aSopenharmony_ci uint32_t collapse_mask = 0; 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci if (B <= 1) 155cabdff1aSopenharmony_ci return 1; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci for (i = 0; i < B; i++) 158cabdff1aSopenharmony_ci for (j = 0; j < N0; j++) 159cabdff1aSopenharmony_ci collapse_mask |= (!!iy[i*N0+j]) << i; 160cabdff1aSopenharmony_ci return collapse_mask; 161cabdff1aSopenharmony_ci} 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_cistatic inline void celt_stereo_merge(float *X, float *Y, float mid, int N) 164cabdff1aSopenharmony_ci{ 165cabdff1aSopenharmony_ci int i; 166cabdff1aSopenharmony_ci float xp = 0, side = 0; 167cabdff1aSopenharmony_ci float E[2]; 168cabdff1aSopenharmony_ci float mid2; 169cabdff1aSopenharmony_ci float gain[2]; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ 172cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 173cabdff1aSopenharmony_ci xp += X[i] * Y[i]; 174cabdff1aSopenharmony_ci side += Y[i] * Y[i]; 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci /* Compensating for the mid normalization */ 178cabdff1aSopenharmony_ci xp *= mid; 179cabdff1aSopenharmony_ci mid2 = mid; 180cabdff1aSopenharmony_ci E[0] = mid2 * mid2 + side - 2 * xp; 181cabdff1aSopenharmony_ci E[1] = mid2 * mid2 + side + 2 * xp; 182cabdff1aSopenharmony_ci if (E[0] < 6e-4f || E[1] < 6e-4f) { 183cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 184cabdff1aSopenharmony_ci Y[i] = X[i]; 185cabdff1aSopenharmony_ci return; 186cabdff1aSopenharmony_ci } 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_ci gain[0] = 1.0f / sqrtf(E[0]); 189cabdff1aSopenharmony_ci gain[1] = 1.0f / sqrtf(E[1]); 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 192cabdff1aSopenharmony_ci float value[2]; 193cabdff1aSopenharmony_ci /* Apply mid scaling (side is already scaled) */ 194cabdff1aSopenharmony_ci value[0] = mid * X[i]; 195cabdff1aSopenharmony_ci value[1] = Y[i]; 196cabdff1aSopenharmony_ci X[i] = gain[0] * (value[0] - value[1]); 197cabdff1aSopenharmony_ci Y[i] = gain[1] * (value[0] + value[1]); 198cabdff1aSopenharmony_ci } 199cabdff1aSopenharmony_ci} 200cabdff1aSopenharmony_ci 201cabdff1aSopenharmony_cistatic void celt_interleave_hadamard(float *tmp, float *X, int N0, 202cabdff1aSopenharmony_ci int stride, int hadamard) 203cabdff1aSopenharmony_ci{ 204cabdff1aSopenharmony_ci int i, j, N = N0*stride; 205cabdff1aSopenharmony_ci const uint8_t *order = &ff_celt_hadamard_order[hadamard ? stride - 2 : 30]; 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci for (i = 0; i < stride; i++) 208cabdff1aSopenharmony_ci for (j = 0; j < N0; j++) 209cabdff1aSopenharmony_ci tmp[j*stride+i] = X[order[i]*N0+j]; 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci memcpy(X, tmp, N*sizeof(float)); 212cabdff1aSopenharmony_ci} 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_cistatic void celt_deinterleave_hadamard(float *tmp, float *X, int N0, 215cabdff1aSopenharmony_ci int stride, int hadamard) 216cabdff1aSopenharmony_ci{ 217cabdff1aSopenharmony_ci int i, j, N = N0*stride; 218cabdff1aSopenharmony_ci const uint8_t *order = &ff_celt_hadamard_order[hadamard ? stride - 2 : 30]; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci for (i = 0; i < stride; i++) 221cabdff1aSopenharmony_ci for (j = 0; j < N0; j++) 222cabdff1aSopenharmony_ci tmp[order[i]*N0+j] = X[j*stride+i]; 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci memcpy(X, tmp, N*sizeof(float)); 225cabdff1aSopenharmony_ci} 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_cistatic void celt_haar1(float *X, int N0, int stride) 228cabdff1aSopenharmony_ci{ 229cabdff1aSopenharmony_ci int i, j; 230cabdff1aSopenharmony_ci N0 >>= 1; 231cabdff1aSopenharmony_ci for (i = 0; i < stride; i++) { 232cabdff1aSopenharmony_ci for (j = 0; j < N0; j++) { 233cabdff1aSopenharmony_ci float x0 = X[stride * (2 * j + 0) + i]; 234cabdff1aSopenharmony_ci float x1 = X[stride * (2 * j + 1) + i]; 235cabdff1aSopenharmony_ci X[stride * (2 * j + 0) + i] = (x0 + x1) * M_SQRT1_2; 236cabdff1aSopenharmony_ci X[stride * (2 * j + 1) + i] = (x0 - x1) * M_SQRT1_2; 237cabdff1aSopenharmony_ci } 238cabdff1aSopenharmony_ci } 239cabdff1aSopenharmony_ci} 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_cistatic inline int celt_compute_qn(int N, int b, int offset, int pulse_cap, 242cabdff1aSopenharmony_ci int stereo) 243cabdff1aSopenharmony_ci{ 244cabdff1aSopenharmony_ci int qn, qb; 245cabdff1aSopenharmony_ci int N2 = 2 * N - 1; 246cabdff1aSopenharmony_ci if (stereo && N == 2) 247cabdff1aSopenharmony_ci N2--; 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_ci /* The upper limit ensures that in a stereo split with itheta==16384, we'll 250cabdff1aSopenharmony_ci * always have enough bits left over to code at least one pulse in the 251cabdff1aSopenharmony_ci * side; otherwise it would collapse, since it doesn't get folded. */ 252cabdff1aSopenharmony_ci qb = FFMIN3(b - pulse_cap - (4 << 3), (b + N2 * offset) / N2, 8 << 3); 253cabdff1aSopenharmony_ci qn = (qb < (1 << 3 >> 1)) ? 1 : ((ff_celt_qn_exp2[qb & 0x7] >> (14 - (qb >> 3))) + 1) >> 1 << 1; 254cabdff1aSopenharmony_ci return qn; 255cabdff1aSopenharmony_ci} 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci/* Convert the quantized vector to an index */ 258cabdff1aSopenharmony_cistatic inline uint32_t celt_icwrsi(uint32_t N, uint32_t K, const int *y) 259cabdff1aSopenharmony_ci{ 260cabdff1aSopenharmony_ci int i, idx = 0, sum = 0; 261cabdff1aSopenharmony_ci for (i = N - 1; i >= 0; i--) { 262cabdff1aSopenharmony_ci const uint32_t i_s = CELT_PVQ_U(N - i, sum + FFABS(y[i]) + 1); 263cabdff1aSopenharmony_ci idx += CELT_PVQ_U(N - i, sum) + (y[i] < 0)*i_s; 264cabdff1aSopenharmony_ci sum += FFABS(y[i]); 265cabdff1aSopenharmony_ci } 266cabdff1aSopenharmony_ci return idx; 267cabdff1aSopenharmony_ci} 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci// this code was adapted from libopus 270cabdff1aSopenharmony_cistatic inline uint64_t celt_cwrsi(uint32_t N, uint32_t K, uint32_t i, int *y) 271cabdff1aSopenharmony_ci{ 272cabdff1aSopenharmony_ci uint64_t norm = 0; 273cabdff1aSopenharmony_ci uint32_t q, p; 274cabdff1aSopenharmony_ci int s, val; 275cabdff1aSopenharmony_ci int k0; 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci while (N > 2) { 278cabdff1aSopenharmony_ci /*Lots of pulses case:*/ 279cabdff1aSopenharmony_ci if (K >= N) { 280cabdff1aSopenharmony_ci const uint32_t *row = ff_celt_pvq_u_row[N]; 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_ci /* Are the pulses in this dimension negative? */ 283cabdff1aSopenharmony_ci p = row[K + 1]; 284cabdff1aSopenharmony_ci s = -(i >= p); 285cabdff1aSopenharmony_ci i -= p & s; 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_ci /*Count how many pulses were placed in this dimension.*/ 288cabdff1aSopenharmony_ci k0 = K; 289cabdff1aSopenharmony_ci q = row[N]; 290cabdff1aSopenharmony_ci if (q > i) { 291cabdff1aSopenharmony_ci K = N; 292cabdff1aSopenharmony_ci do { 293cabdff1aSopenharmony_ci p = ff_celt_pvq_u_row[--K][N]; 294cabdff1aSopenharmony_ci } while (p > i); 295cabdff1aSopenharmony_ci } else 296cabdff1aSopenharmony_ci for (p = row[K]; p > i; p = row[K]) 297cabdff1aSopenharmony_ci K--; 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci i -= p; 300cabdff1aSopenharmony_ci val = (k0 - K + s) ^ s; 301cabdff1aSopenharmony_ci norm += val * val; 302cabdff1aSopenharmony_ci *y++ = val; 303cabdff1aSopenharmony_ci } else { /*Lots of dimensions case:*/ 304cabdff1aSopenharmony_ci /*Are there any pulses in this dimension at all?*/ 305cabdff1aSopenharmony_ci p = ff_celt_pvq_u_row[K ][N]; 306cabdff1aSopenharmony_ci q = ff_celt_pvq_u_row[K + 1][N]; 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci if (p <= i && i < q) { 309cabdff1aSopenharmony_ci i -= p; 310cabdff1aSopenharmony_ci *y++ = 0; 311cabdff1aSopenharmony_ci } else { 312cabdff1aSopenharmony_ci /*Are the pulses in this dimension negative?*/ 313cabdff1aSopenharmony_ci s = -(i >= q); 314cabdff1aSopenharmony_ci i -= q & s; 315cabdff1aSopenharmony_ci 316cabdff1aSopenharmony_ci /*Count how many pulses were placed in this dimension.*/ 317cabdff1aSopenharmony_ci k0 = K; 318cabdff1aSopenharmony_ci do p = ff_celt_pvq_u_row[--K][N]; 319cabdff1aSopenharmony_ci while (p > i); 320cabdff1aSopenharmony_ci 321cabdff1aSopenharmony_ci i -= p; 322cabdff1aSopenharmony_ci val = (k0 - K + s) ^ s; 323cabdff1aSopenharmony_ci norm += val * val; 324cabdff1aSopenharmony_ci *y++ = val; 325cabdff1aSopenharmony_ci } 326cabdff1aSopenharmony_ci } 327cabdff1aSopenharmony_ci N--; 328cabdff1aSopenharmony_ci } 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci /* N == 2 */ 331cabdff1aSopenharmony_ci p = 2 * K + 1; 332cabdff1aSopenharmony_ci s = -(i >= p); 333cabdff1aSopenharmony_ci i -= p & s; 334cabdff1aSopenharmony_ci k0 = K; 335cabdff1aSopenharmony_ci K = (i + 1) / 2; 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci if (K) 338cabdff1aSopenharmony_ci i -= 2 * K - 1; 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_ci val = (k0 - K + s) ^ s; 341cabdff1aSopenharmony_ci norm += val * val; 342cabdff1aSopenharmony_ci *y++ = val; 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci /* N==1 */ 345cabdff1aSopenharmony_ci s = -i; 346cabdff1aSopenharmony_ci val = (K + s) ^ s; 347cabdff1aSopenharmony_ci norm += val * val; 348cabdff1aSopenharmony_ci *y = val; 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_ci return norm; 351cabdff1aSopenharmony_ci} 352cabdff1aSopenharmony_ci 353cabdff1aSopenharmony_cistatic inline void celt_encode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K) 354cabdff1aSopenharmony_ci{ 355cabdff1aSopenharmony_ci ff_opus_rc_enc_uint(rc, celt_icwrsi(N, K, y), CELT_PVQ_V(N, K)); 356cabdff1aSopenharmony_ci} 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_cistatic inline float celt_decode_pulses(OpusRangeCoder *rc, int *y, uint32_t N, uint32_t K) 359cabdff1aSopenharmony_ci{ 360cabdff1aSopenharmony_ci const uint32_t idx = ff_opus_rc_dec_uint(rc, CELT_PVQ_V(N, K)); 361cabdff1aSopenharmony_ci return celt_cwrsi(N, K, idx, y); 362cabdff1aSopenharmony_ci} 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci/* 365cabdff1aSopenharmony_ci * Faster than libopus's search, operates entirely in the signed domain. 366cabdff1aSopenharmony_ci * Slightly worse/better depending on N, K and the input vector. 367cabdff1aSopenharmony_ci */ 368cabdff1aSopenharmony_cistatic float ppp_pvq_search_c(float *X, int *y, int K, int N) 369cabdff1aSopenharmony_ci{ 370cabdff1aSopenharmony_ci int i, y_norm = 0; 371cabdff1aSopenharmony_ci float res = 0.0f, xy_norm = 0.0f; 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 374cabdff1aSopenharmony_ci res += FFABS(X[i]); 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci res = K/(res + FLT_EPSILON); 377cabdff1aSopenharmony_ci 378cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 379cabdff1aSopenharmony_ci y[i] = lrintf(res*X[i]); 380cabdff1aSopenharmony_ci y_norm += y[i]*y[i]; 381cabdff1aSopenharmony_ci xy_norm += y[i]*X[i]; 382cabdff1aSopenharmony_ci K -= FFABS(y[i]); 383cabdff1aSopenharmony_ci } 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci while (K) { 386cabdff1aSopenharmony_ci int max_idx = 0, phase = FFSIGN(K); 387cabdff1aSopenharmony_ci float max_num = 0.0f; 388cabdff1aSopenharmony_ci float max_den = 1.0f; 389cabdff1aSopenharmony_ci y_norm += 1.0f; 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 392cabdff1aSopenharmony_ci /* If the sum has been overshot and the best place has 0 pulses allocated 393cabdff1aSopenharmony_ci * to it, attempting to decrease it further will actually increase the 394cabdff1aSopenharmony_ci * sum. Prevent this by disregarding any 0 positions when decrementing. */ 395cabdff1aSopenharmony_ci const int ca = 1 ^ ((y[i] == 0) & (phase < 0)); 396cabdff1aSopenharmony_ci const int y_new = y_norm + 2*phase*FFABS(y[i]); 397cabdff1aSopenharmony_ci float xy_new = xy_norm + 1*phase*FFABS(X[i]); 398cabdff1aSopenharmony_ci xy_new = xy_new * xy_new; 399cabdff1aSopenharmony_ci if (ca && (max_den*xy_new) > (y_new*max_num)) { 400cabdff1aSopenharmony_ci max_den = y_new; 401cabdff1aSopenharmony_ci max_num = xy_new; 402cabdff1aSopenharmony_ci max_idx = i; 403cabdff1aSopenharmony_ci } 404cabdff1aSopenharmony_ci } 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci K -= phase; 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_ci phase *= FFSIGN(X[max_idx]); 409cabdff1aSopenharmony_ci xy_norm += 1*phase*X[max_idx]; 410cabdff1aSopenharmony_ci y_norm += 2*phase*y[max_idx]; 411cabdff1aSopenharmony_ci y[max_idx] += phase; 412cabdff1aSopenharmony_ci } 413cabdff1aSopenharmony_ci 414cabdff1aSopenharmony_ci return (float)y_norm; 415cabdff1aSopenharmony_ci} 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_cistatic uint32_t celt_alg_quant(OpusRangeCoder *rc, float *X, uint32_t N, uint32_t K, 418cabdff1aSopenharmony_ci enum CeltSpread spread, uint32_t blocks, float gain, 419cabdff1aSopenharmony_ci CeltPVQ *pvq) 420cabdff1aSopenharmony_ci{ 421cabdff1aSopenharmony_ci int *y = pvq->qcoeff; 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_ci celt_exp_rotation(X, N, blocks, K, spread, 1); 424cabdff1aSopenharmony_ci gain /= sqrtf(pvq->pvq_search(X, y, K, N)); 425cabdff1aSopenharmony_ci celt_encode_pulses(rc, y, N, K); 426cabdff1aSopenharmony_ci celt_normalize_residual(y, X, N, gain); 427cabdff1aSopenharmony_ci celt_exp_rotation(X, N, blocks, K, spread, 0); 428cabdff1aSopenharmony_ci return celt_extract_collapse_mask(y, N, blocks); 429cabdff1aSopenharmony_ci} 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_ci/** Decode pulse vector and combine the result with the pitch vector to produce 432cabdff1aSopenharmony_ci the final normalised signal in the current band. */ 433cabdff1aSopenharmony_cistatic uint32_t celt_alg_unquant(OpusRangeCoder *rc, float *X, uint32_t N, uint32_t K, 434cabdff1aSopenharmony_ci enum CeltSpread spread, uint32_t blocks, float gain, 435cabdff1aSopenharmony_ci CeltPVQ *pvq) 436cabdff1aSopenharmony_ci{ 437cabdff1aSopenharmony_ci int *y = pvq->qcoeff; 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_ci gain /= sqrtf(celt_decode_pulses(rc, y, N, K)); 440cabdff1aSopenharmony_ci celt_normalize_residual(y, X, N, gain); 441cabdff1aSopenharmony_ci celt_exp_rotation(X, N, blocks, K, spread, 0); 442cabdff1aSopenharmony_ci return celt_extract_collapse_mask(y, N, blocks); 443cabdff1aSopenharmony_ci} 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_cistatic int celt_calc_theta(const float *X, const float *Y, int coupling, int N) 446cabdff1aSopenharmony_ci{ 447cabdff1aSopenharmony_ci int i; 448cabdff1aSopenharmony_ci float e[2] = { 0.0f, 0.0f }; 449cabdff1aSopenharmony_ci if (coupling) { /* Coupling case */ 450cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 451cabdff1aSopenharmony_ci e[0] += (X[i] + Y[i])*(X[i] + Y[i]); 452cabdff1aSopenharmony_ci e[1] += (X[i] - Y[i])*(X[i] - Y[i]); 453cabdff1aSopenharmony_ci } 454cabdff1aSopenharmony_ci } else { 455cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 456cabdff1aSopenharmony_ci e[0] += X[i]*X[i]; 457cabdff1aSopenharmony_ci e[1] += Y[i]*Y[i]; 458cabdff1aSopenharmony_ci } 459cabdff1aSopenharmony_ci } 460cabdff1aSopenharmony_ci return lrintf(32768.0f*atan2f(sqrtf(e[1]), sqrtf(e[0]))/M_PI); 461cabdff1aSopenharmony_ci} 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_cistatic void celt_stereo_is_decouple(float *X, float *Y, float e_l, float e_r, int N) 464cabdff1aSopenharmony_ci{ 465cabdff1aSopenharmony_ci int i; 466cabdff1aSopenharmony_ci const float energy_n = 1.0f/(sqrtf(e_l*e_l + e_r*e_r) + FLT_EPSILON); 467cabdff1aSopenharmony_ci e_l *= energy_n; 468cabdff1aSopenharmony_ci e_r *= energy_n; 469cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 470cabdff1aSopenharmony_ci X[i] = e_l*X[i] + e_r*Y[i]; 471cabdff1aSopenharmony_ci} 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_cistatic void celt_stereo_ms_decouple(float *X, float *Y, int N) 474cabdff1aSopenharmony_ci{ 475cabdff1aSopenharmony_ci int i; 476cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 477cabdff1aSopenharmony_ci const float Xret = X[i]; 478cabdff1aSopenharmony_ci X[i] = (X[i] + Y[i])*M_SQRT1_2; 479cabdff1aSopenharmony_ci Y[i] = (Y[i] - Xret)*M_SQRT1_2; 480cabdff1aSopenharmony_ci } 481cabdff1aSopenharmony_ci} 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_cistatic av_always_inline uint32_t quant_band_template(CeltPVQ *pvq, CeltFrame *f, 484cabdff1aSopenharmony_ci OpusRangeCoder *rc, 485cabdff1aSopenharmony_ci const int band, float *X, 486cabdff1aSopenharmony_ci float *Y, int N, int b, 487cabdff1aSopenharmony_ci uint32_t blocks, float *lowband, 488cabdff1aSopenharmony_ci int duration, float *lowband_out, 489cabdff1aSopenharmony_ci int level, float gain, 490cabdff1aSopenharmony_ci float *lowband_scratch, 491cabdff1aSopenharmony_ci int fill, int quant) 492cabdff1aSopenharmony_ci{ 493cabdff1aSopenharmony_ci int i; 494cabdff1aSopenharmony_ci const uint8_t *cache; 495cabdff1aSopenharmony_ci int stereo = !!Y, split = stereo; 496cabdff1aSopenharmony_ci int imid = 0, iside = 0; 497cabdff1aSopenharmony_ci uint32_t N0 = N; 498cabdff1aSopenharmony_ci int N_B = N / blocks; 499cabdff1aSopenharmony_ci int N_B0 = N_B; 500cabdff1aSopenharmony_ci int B0 = blocks; 501cabdff1aSopenharmony_ci int time_divide = 0; 502cabdff1aSopenharmony_ci int recombine = 0; 503cabdff1aSopenharmony_ci int inv = 0; 504cabdff1aSopenharmony_ci float mid = 0, side = 0; 505cabdff1aSopenharmony_ci int longblocks = (B0 == 1); 506cabdff1aSopenharmony_ci uint32_t cm = 0; 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_ci if (N == 1) { 509cabdff1aSopenharmony_ci float *x = X; 510cabdff1aSopenharmony_ci for (i = 0; i <= stereo; i++) { 511cabdff1aSopenharmony_ci int sign = 0; 512cabdff1aSopenharmony_ci if (f->remaining2 >= 1 << 3) { 513cabdff1aSopenharmony_ci if (quant) { 514cabdff1aSopenharmony_ci sign = x[0] < 0; 515cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, sign, 1); 516cabdff1aSopenharmony_ci } else { 517cabdff1aSopenharmony_ci sign = ff_opus_rc_get_raw(rc, 1); 518cabdff1aSopenharmony_ci } 519cabdff1aSopenharmony_ci f->remaining2 -= 1 << 3; 520cabdff1aSopenharmony_ci } 521cabdff1aSopenharmony_ci x[0] = 1.0f - 2.0f*sign; 522cabdff1aSopenharmony_ci x = Y; 523cabdff1aSopenharmony_ci } 524cabdff1aSopenharmony_ci if (lowband_out) 525cabdff1aSopenharmony_ci lowband_out[0] = X[0]; 526cabdff1aSopenharmony_ci return 1; 527cabdff1aSopenharmony_ci } 528cabdff1aSopenharmony_ci 529cabdff1aSopenharmony_ci if (!stereo && level == 0) { 530cabdff1aSopenharmony_ci int tf_change = f->tf_change[band]; 531cabdff1aSopenharmony_ci int k; 532cabdff1aSopenharmony_ci if (tf_change > 0) 533cabdff1aSopenharmony_ci recombine = tf_change; 534cabdff1aSopenharmony_ci /* Band recombining to increase frequency resolution */ 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci if (lowband && 537cabdff1aSopenharmony_ci (recombine || ((N_B & 1) == 0 && tf_change < 0) || B0 > 1)) { 538cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 539cabdff1aSopenharmony_ci lowband_scratch[i] = lowband[i]; 540cabdff1aSopenharmony_ci lowband = lowband_scratch; 541cabdff1aSopenharmony_ci } 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_ci for (k = 0; k < recombine; k++) { 544cabdff1aSopenharmony_ci if (quant || lowband) 545cabdff1aSopenharmony_ci celt_haar1(quant ? X : lowband, N >> k, 1 << k); 546cabdff1aSopenharmony_ci fill = ff_celt_bit_interleave[fill & 0xF] | ff_celt_bit_interleave[fill >> 4] << 2; 547cabdff1aSopenharmony_ci } 548cabdff1aSopenharmony_ci blocks >>= recombine; 549cabdff1aSopenharmony_ci N_B <<= recombine; 550cabdff1aSopenharmony_ci 551cabdff1aSopenharmony_ci /* Increasing the time resolution */ 552cabdff1aSopenharmony_ci while ((N_B & 1) == 0 && tf_change < 0) { 553cabdff1aSopenharmony_ci if (quant || lowband) 554cabdff1aSopenharmony_ci celt_haar1(quant ? X : lowband, N_B, blocks); 555cabdff1aSopenharmony_ci fill |= fill << blocks; 556cabdff1aSopenharmony_ci blocks <<= 1; 557cabdff1aSopenharmony_ci N_B >>= 1; 558cabdff1aSopenharmony_ci time_divide++; 559cabdff1aSopenharmony_ci tf_change++; 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci B0 = blocks; 562cabdff1aSopenharmony_ci N_B0 = N_B; 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci /* Reorganize the samples in time order instead of frequency order */ 565cabdff1aSopenharmony_ci if (B0 > 1 && (quant || lowband)) 566cabdff1aSopenharmony_ci celt_deinterleave_hadamard(pvq->hadamard_tmp, quant ? X : lowband, 567cabdff1aSopenharmony_ci N_B >> recombine, B0 << recombine, 568cabdff1aSopenharmony_ci longblocks); 569cabdff1aSopenharmony_ci } 570cabdff1aSopenharmony_ci 571cabdff1aSopenharmony_ci /* If we need 1.5 more bit than we can produce, split the band in two. */ 572cabdff1aSopenharmony_ci cache = ff_celt_cache_bits + 573cabdff1aSopenharmony_ci ff_celt_cache_index[(duration + 1) * CELT_MAX_BANDS + band]; 574cabdff1aSopenharmony_ci if (!stereo && duration >= 0 && b > cache[cache[0]] + 12 && N > 2) { 575cabdff1aSopenharmony_ci N >>= 1; 576cabdff1aSopenharmony_ci Y = X + N; 577cabdff1aSopenharmony_ci split = 1; 578cabdff1aSopenharmony_ci duration -= 1; 579cabdff1aSopenharmony_ci if (blocks == 1) 580cabdff1aSopenharmony_ci fill = (fill & 1) | (fill << 1); 581cabdff1aSopenharmony_ci blocks = (blocks + 1) >> 1; 582cabdff1aSopenharmony_ci } 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci if (split) { 585cabdff1aSopenharmony_ci int qn; 586cabdff1aSopenharmony_ci int itheta = quant ? celt_calc_theta(X, Y, stereo, N) : 0; 587cabdff1aSopenharmony_ci int mbits, sbits, delta; 588cabdff1aSopenharmony_ci int qalloc; 589cabdff1aSopenharmony_ci int pulse_cap; 590cabdff1aSopenharmony_ci int offset; 591cabdff1aSopenharmony_ci int orig_fill; 592cabdff1aSopenharmony_ci int tell; 593cabdff1aSopenharmony_ci 594cabdff1aSopenharmony_ci /* Decide on the resolution to give to the split parameter theta */ 595cabdff1aSopenharmony_ci pulse_cap = ff_celt_log_freq_range[band] + duration * 8; 596cabdff1aSopenharmony_ci offset = (pulse_cap >> 1) - (stereo && N == 2 ? CELT_QTHETA_OFFSET_TWOPHASE : 597cabdff1aSopenharmony_ci CELT_QTHETA_OFFSET); 598cabdff1aSopenharmony_ci qn = (stereo && band >= f->intensity_stereo) ? 1 : 599cabdff1aSopenharmony_ci celt_compute_qn(N, b, offset, pulse_cap, stereo); 600cabdff1aSopenharmony_ci tell = opus_rc_tell_frac(rc); 601cabdff1aSopenharmony_ci if (qn != 1) { 602cabdff1aSopenharmony_ci if (quant) 603cabdff1aSopenharmony_ci itheta = (itheta*qn + 8192) >> 14; 604cabdff1aSopenharmony_ci /* Entropy coding of the angle. We use a uniform pdf for the 605cabdff1aSopenharmony_ci * time split, a step for stereo, and a triangular one for the rest. */ 606cabdff1aSopenharmony_ci if (quant) { 607cabdff1aSopenharmony_ci if (stereo && N > 2) 608cabdff1aSopenharmony_ci ff_opus_rc_enc_uint_step(rc, itheta, qn / 2); 609cabdff1aSopenharmony_ci else if (stereo || B0 > 1) 610cabdff1aSopenharmony_ci ff_opus_rc_enc_uint(rc, itheta, qn + 1); 611cabdff1aSopenharmony_ci else 612cabdff1aSopenharmony_ci ff_opus_rc_enc_uint_tri(rc, itheta, qn); 613cabdff1aSopenharmony_ci itheta = itheta * 16384 / qn; 614cabdff1aSopenharmony_ci if (stereo) { 615cabdff1aSopenharmony_ci if (itheta == 0) 616cabdff1aSopenharmony_ci celt_stereo_is_decouple(X, Y, f->block[0].lin_energy[band], 617cabdff1aSopenharmony_ci f->block[1].lin_energy[band], N); 618cabdff1aSopenharmony_ci else 619cabdff1aSopenharmony_ci celt_stereo_ms_decouple(X, Y, N); 620cabdff1aSopenharmony_ci } 621cabdff1aSopenharmony_ci } else { 622cabdff1aSopenharmony_ci if (stereo && N > 2) 623cabdff1aSopenharmony_ci itheta = ff_opus_rc_dec_uint_step(rc, qn / 2); 624cabdff1aSopenharmony_ci else if (stereo || B0 > 1) 625cabdff1aSopenharmony_ci itheta = ff_opus_rc_dec_uint(rc, qn+1); 626cabdff1aSopenharmony_ci else 627cabdff1aSopenharmony_ci itheta = ff_opus_rc_dec_uint_tri(rc, qn); 628cabdff1aSopenharmony_ci itheta = itheta * 16384 / qn; 629cabdff1aSopenharmony_ci } 630cabdff1aSopenharmony_ci } else if (stereo) { 631cabdff1aSopenharmony_ci if (quant) { 632cabdff1aSopenharmony_ci inv = f->apply_phase_inv ? itheta > 8192 : 0; 633cabdff1aSopenharmony_ci if (inv) { 634cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 635cabdff1aSopenharmony_ci Y[i] *= -1; 636cabdff1aSopenharmony_ci } 637cabdff1aSopenharmony_ci celt_stereo_is_decouple(X, Y, f->block[0].lin_energy[band], 638cabdff1aSopenharmony_ci f->block[1].lin_energy[band], N); 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_ci if (b > 2 << 3 && f->remaining2 > 2 << 3) { 641cabdff1aSopenharmony_ci ff_opus_rc_enc_log(rc, inv, 2); 642cabdff1aSopenharmony_ci } else { 643cabdff1aSopenharmony_ci inv = 0; 644cabdff1aSopenharmony_ci } 645cabdff1aSopenharmony_ci } else { 646cabdff1aSopenharmony_ci inv = (b > 2 << 3 && f->remaining2 > 2 << 3) ? ff_opus_rc_dec_log(rc, 2) : 0; 647cabdff1aSopenharmony_ci inv = f->apply_phase_inv ? inv : 0; 648cabdff1aSopenharmony_ci } 649cabdff1aSopenharmony_ci itheta = 0; 650cabdff1aSopenharmony_ci } 651cabdff1aSopenharmony_ci qalloc = opus_rc_tell_frac(rc) - tell; 652cabdff1aSopenharmony_ci b -= qalloc; 653cabdff1aSopenharmony_ci 654cabdff1aSopenharmony_ci orig_fill = fill; 655cabdff1aSopenharmony_ci if (itheta == 0) { 656cabdff1aSopenharmony_ci imid = 32767; 657cabdff1aSopenharmony_ci iside = 0; 658cabdff1aSopenharmony_ci fill = av_mod_uintp2(fill, blocks); 659cabdff1aSopenharmony_ci delta = -16384; 660cabdff1aSopenharmony_ci } else if (itheta == 16384) { 661cabdff1aSopenharmony_ci imid = 0; 662cabdff1aSopenharmony_ci iside = 32767; 663cabdff1aSopenharmony_ci fill &= ((1 << blocks) - 1) << blocks; 664cabdff1aSopenharmony_ci delta = 16384; 665cabdff1aSopenharmony_ci } else { 666cabdff1aSopenharmony_ci imid = celt_cos(itheta); 667cabdff1aSopenharmony_ci iside = celt_cos(16384-itheta); 668cabdff1aSopenharmony_ci /* This is the mid vs side allocation that minimizes squared error 669cabdff1aSopenharmony_ci in that band. */ 670cabdff1aSopenharmony_ci delta = ROUND_MUL16((N - 1) << 7, celt_log2tan(iside, imid)); 671cabdff1aSopenharmony_ci } 672cabdff1aSopenharmony_ci 673cabdff1aSopenharmony_ci mid = imid / 32768.0f; 674cabdff1aSopenharmony_ci side = iside / 32768.0f; 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci /* This is a special case for N=2 that only works for stereo and takes 677cabdff1aSopenharmony_ci advantage of the fact that mid and side are orthogonal to encode 678cabdff1aSopenharmony_ci the side with just one bit. */ 679cabdff1aSopenharmony_ci if (N == 2 && stereo) { 680cabdff1aSopenharmony_ci int c; 681cabdff1aSopenharmony_ci int sign = 0; 682cabdff1aSopenharmony_ci float tmp; 683cabdff1aSopenharmony_ci float *x2, *y2; 684cabdff1aSopenharmony_ci mbits = b; 685cabdff1aSopenharmony_ci /* Only need one bit for the side */ 686cabdff1aSopenharmony_ci sbits = (itheta != 0 && itheta != 16384) ? 1 << 3 : 0; 687cabdff1aSopenharmony_ci mbits -= sbits; 688cabdff1aSopenharmony_ci c = (itheta > 8192); 689cabdff1aSopenharmony_ci f->remaining2 -= qalloc+sbits; 690cabdff1aSopenharmony_ci 691cabdff1aSopenharmony_ci x2 = c ? Y : X; 692cabdff1aSopenharmony_ci y2 = c ? X : Y; 693cabdff1aSopenharmony_ci if (sbits) { 694cabdff1aSopenharmony_ci if (quant) { 695cabdff1aSopenharmony_ci sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; 696cabdff1aSopenharmony_ci ff_opus_rc_put_raw(rc, sign, 1); 697cabdff1aSopenharmony_ci } else { 698cabdff1aSopenharmony_ci sign = ff_opus_rc_get_raw(rc, 1); 699cabdff1aSopenharmony_ci } 700cabdff1aSopenharmony_ci } 701cabdff1aSopenharmony_ci sign = 1 - 2 * sign; 702cabdff1aSopenharmony_ci /* We use orig_fill here because we want to fold the side, but if 703cabdff1aSopenharmony_ci itheta==16384, we'll have cleared the low bits of fill. */ 704cabdff1aSopenharmony_ci cm = pvq->quant_band(pvq, f, rc, band, x2, NULL, N, mbits, blocks, lowband, duration, 705cabdff1aSopenharmony_ci lowband_out, level, gain, lowband_scratch, orig_fill); 706cabdff1aSopenharmony_ci /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), 707cabdff1aSopenharmony_ci and there's no need to worry about mixing with the other channel. */ 708cabdff1aSopenharmony_ci y2[0] = -sign * x2[1]; 709cabdff1aSopenharmony_ci y2[1] = sign * x2[0]; 710cabdff1aSopenharmony_ci X[0] *= mid; 711cabdff1aSopenharmony_ci X[1] *= mid; 712cabdff1aSopenharmony_ci Y[0] *= side; 713cabdff1aSopenharmony_ci Y[1] *= side; 714cabdff1aSopenharmony_ci tmp = X[0]; 715cabdff1aSopenharmony_ci X[0] = tmp - Y[0]; 716cabdff1aSopenharmony_ci Y[0] = tmp + Y[0]; 717cabdff1aSopenharmony_ci tmp = X[1]; 718cabdff1aSopenharmony_ci X[1] = tmp - Y[1]; 719cabdff1aSopenharmony_ci Y[1] = tmp + Y[1]; 720cabdff1aSopenharmony_ci } else { 721cabdff1aSopenharmony_ci /* "Normal" split code */ 722cabdff1aSopenharmony_ci float *next_lowband2 = NULL; 723cabdff1aSopenharmony_ci float *next_lowband_out1 = NULL; 724cabdff1aSopenharmony_ci int next_level = 0; 725cabdff1aSopenharmony_ci int rebalance; 726cabdff1aSopenharmony_ci uint32_t cmt; 727cabdff1aSopenharmony_ci 728cabdff1aSopenharmony_ci /* Give more bits to low-energy MDCTs than they would 729cabdff1aSopenharmony_ci * otherwise deserve */ 730cabdff1aSopenharmony_ci if (B0 > 1 && !stereo && (itheta & 0x3fff)) { 731cabdff1aSopenharmony_ci if (itheta > 8192) 732cabdff1aSopenharmony_ci /* Rough approximation for pre-echo masking */ 733cabdff1aSopenharmony_ci delta -= delta >> (4 - duration); 734cabdff1aSopenharmony_ci else 735cabdff1aSopenharmony_ci /* Corresponds to a forward-masking slope of 736cabdff1aSopenharmony_ci * 1.5 dB per 10 ms */ 737cabdff1aSopenharmony_ci delta = FFMIN(0, delta + (N << 3 >> (5 - duration))); 738cabdff1aSopenharmony_ci } 739cabdff1aSopenharmony_ci mbits = av_clip((b - delta) / 2, 0, b); 740cabdff1aSopenharmony_ci sbits = b - mbits; 741cabdff1aSopenharmony_ci f->remaining2 -= qalloc; 742cabdff1aSopenharmony_ci 743cabdff1aSopenharmony_ci if (lowband && !stereo) 744cabdff1aSopenharmony_ci next_lowband2 = lowband + N; /* >32-bit split case */ 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_ci /* Only stereo needs to pass on lowband_out. 747cabdff1aSopenharmony_ci * Otherwise, it's handled at the end */ 748cabdff1aSopenharmony_ci if (stereo) 749cabdff1aSopenharmony_ci next_lowband_out1 = lowband_out; 750cabdff1aSopenharmony_ci else 751cabdff1aSopenharmony_ci next_level = level + 1; 752cabdff1aSopenharmony_ci 753cabdff1aSopenharmony_ci rebalance = f->remaining2; 754cabdff1aSopenharmony_ci if (mbits >= sbits) { 755cabdff1aSopenharmony_ci /* In stereo mode, we do not apply a scaling to the mid 756cabdff1aSopenharmony_ci * because we need the normalized mid for folding later */ 757cabdff1aSopenharmony_ci cm = pvq->quant_band(pvq, f, rc, band, X, NULL, N, mbits, blocks, 758cabdff1aSopenharmony_ci lowband, duration, next_lowband_out1, next_level, 759cabdff1aSopenharmony_ci stereo ? 1.0f : (gain * mid), lowband_scratch, fill); 760cabdff1aSopenharmony_ci rebalance = mbits - (rebalance - f->remaining2); 761cabdff1aSopenharmony_ci if (rebalance > 3 << 3 && itheta != 0) 762cabdff1aSopenharmony_ci sbits += rebalance - (3 << 3); 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci /* For a stereo split, the high bits of fill are always zero, 765cabdff1aSopenharmony_ci * so no folding will be done to the side. */ 766cabdff1aSopenharmony_ci cmt = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks, 767cabdff1aSopenharmony_ci next_lowband2, duration, NULL, next_level, 768cabdff1aSopenharmony_ci gain * side, NULL, fill >> blocks); 769cabdff1aSopenharmony_ci cm |= cmt << ((B0 >> 1) & (stereo - 1)); 770cabdff1aSopenharmony_ci } else { 771cabdff1aSopenharmony_ci /* For a stereo split, the high bits of fill are always zero, 772cabdff1aSopenharmony_ci * so no folding will be done to the side. */ 773cabdff1aSopenharmony_ci cm = pvq->quant_band(pvq, f, rc, band, Y, NULL, N, sbits, blocks, 774cabdff1aSopenharmony_ci next_lowband2, duration, NULL, next_level, 775cabdff1aSopenharmony_ci gain * side, NULL, fill >> blocks); 776cabdff1aSopenharmony_ci cm <<= ((B0 >> 1) & (stereo - 1)); 777cabdff1aSopenharmony_ci rebalance = sbits - (rebalance - f->remaining2); 778cabdff1aSopenharmony_ci if (rebalance > 3 << 3 && itheta != 16384) 779cabdff1aSopenharmony_ci mbits += rebalance - (3 << 3); 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_ci /* In stereo mode, we do not apply a scaling to the mid because 782cabdff1aSopenharmony_ci * we need the normalized mid for folding later */ 783cabdff1aSopenharmony_ci cm |= pvq->quant_band(pvq, f, rc, band, X, NULL, N, mbits, blocks, 784cabdff1aSopenharmony_ci lowband, duration, next_lowband_out1, next_level, 785cabdff1aSopenharmony_ci stereo ? 1.0f : (gain * mid), lowband_scratch, fill); 786cabdff1aSopenharmony_ci } 787cabdff1aSopenharmony_ci } 788cabdff1aSopenharmony_ci } else { 789cabdff1aSopenharmony_ci /* This is the basic no-split case */ 790cabdff1aSopenharmony_ci uint32_t q = celt_bits2pulses(cache, b); 791cabdff1aSopenharmony_ci uint32_t curr_bits = celt_pulses2bits(cache, q); 792cabdff1aSopenharmony_ci f->remaining2 -= curr_bits; 793cabdff1aSopenharmony_ci 794cabdff1aSopenharmony_ci /* Ensures we can never bust the budget */ 795cabdff1aSopenharmony_ci while (f->remaining2 < 0 && q > 0) { 796cabdff1aSopenharmony_ci f->remaining2 += curr_bits; 797cabdff1aSopenharmony_ci curr_bits = celt_pulses2bits(cache, --q); 798cabdff1aSopenharmony_ci f->remaining2 -= curr_bits; 799cabdff1aSopenharmony_ci } 800cabdff1aSopenharmony_ci 801cabdff1aSopenharmony_ci if (q != 0) { 802cabdff1aSopenharmony_ci /* Finally do the actual (de)quantization */ 803cabdff1aSopenharmony_ci if (quant) { 804cabdff1aSopenharmony_ci cm = celt_alg_quant(rc, X, N, (q < 8) ? q : (8 + (q & 7)) << ((q >> 3) - 1), 805cabdff1aSopenharmony_ci f->spread, blocks, gain, pvq); 806cabdff1aSopenharmony_ci } else { 807cabdff1aSopenharmony_ci cm = celt_alg_unquant(rc, X, N, (q < 8) ? q : (8 + (q & 7)) << ((q >> 3) - 1), 808cabdff1aSopenharmony_ci f->spread, blocks, gain, pvq); 809cabdff1aSopenharmony_ci } 810cabdff1aSopenharmony_ci } else { 811cabdff1aSopenharmony_ci /* If there's no pulse, fill the band anyway */ 812cabdff1aSopenharmony_ci uint32_t cm_mask = (1 << blocks) - 1; 813cabdff1aSopenharmony_ci fill &= cm_mask; 814cabdff1aSopenharmony_ci if (fill) { 815cabdff1aSopenharmony_ci if (!lowband) { 816cabdff1aSopenharmony_ci /* Noise */ 817cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 818cabdff1aSopenharmony_ci X[i] = (((int32_t)celt_rng(f)) >> 20); 819cabdff1aSopenharmony_ci cm = cm_mask; 820cabdff1aSopenharmony_ci } else { 821cabdff1aSopenharmony_ci /* Folded spectrum */ 822cabdff1aSopenharmony_ci for (i = 0; i < N; i++) { 823cabdff1aSopenharmony_ci /* About 48 dB below the "normal" folding level */ 824cabdff1aSopenharmony_ci X[i] = lowband[i] + (((celt_rng(f)) & 0x8000) ? 1.0f / 256 : -1.0f / 256); 825cabdff1aSopenharmony_ci } 826cabdff1aSopenharmony_ci cm = fill; 827cabdff1aSopenharmony_ci } 828cabdff1aSopenharmony_ci celt_renormalize_vector(X, N, gain); 829cabdff1aSopenharmony_ci } else { 830cabdff1aSopenharmony_ci memset(X, 0, N*sizeof(float)); 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci } 833cabdff1aSopenharmony_ci } 834cabdff1aSopenharmony_ci 835cabdff1aSopenharmony_ci /* This code is used by the decoder and by the resynthesis-enabled encoder */ 836cabdff1aSopenharmony_ci if (stereo) { 837cabdff1aSopenharmony_ci if (N > 2) 838cabdff1aSopenharmony_ci celt_stereo_merge(X, Y, mid, N); 839cabdff1aSopenharmony_ci if (inv) { 840cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 841cabdff1aSopenharmony_ci Y[i] *= -1; 842cabdff1aSopenharmony_ci } 843cabdff1aSopenharmony_ci } else if (level == 0) { 844cabdff1aSopenharmony_ci int k; 845cabdff1aSopenharmony_ci 846cabdff1aSopenharmony_ci /* Undo the sample reorganization going from time order to frequency order */ 847cabdff1aSopenharmony_ci if (B0 > 1) 848cabdff1aSopenharmony_ci celt_interleave_hadamard(pvq->hadamard_tmp, X, N_B >> recombine, 849cabdff1aSopenharmony_ci B0 << recombine, longblocks); 850cabdff1aSopenharmony_ci 851cabdff1aSopenharmony_ci /* Undo time-freq changes that we did earlier */ 852cabdff1aSopenharmony_ci N_B = N_B0; 853cabdff1aSopenharmony_ci blocks = B0; 854cabdff1aSopenharmony_ci for (k = 0; k < time_divide; k++) { 855cabdff1aSopenharmony_ci blocks >>= 1; 856cabdff1aSopenharmony_ci N_B <<= 1; 857cabdff1aSopenharmony_ci cm |= cm >> blocks; 858cabdff1aSopenharmony_ci celt_haar1(X, N_B, blocks); 859cabdff1aSopenharmony_ci } 860cabdff1aSopenharmony_ci 861cabdff1aSopenharmony_ci for (k = 0; k < recombine; k++) { 862cabdff1aSopenharmony_ci cm = ff_celt_bit_deinterleave[cm]; 863cabdff1aSopenharmony_ci celt_haar1(X, N0>>k, 1<<k); 864cabdff1aSopenharmony_ci } 865cabdff1aSopenharmony_ci blocks <<= recombine; 866cabdff1aSopenharmony_ci 867cabdff1aSopenharmony_ci /* Scale output for later folding */ 868cabdff1aSopenharmony_ci if (lowband_out) { 869cabdff1aSopenharmony_ci float n = sqrtf(N0); 870cabdff1aSopenharmony_ci for (i = 0; i < N0; i++) 871cabdff1aSopenharmony_ci lowband_out[i] = n * X[i]; 872cabdff1aSopenharmony_ci } 873cabdff1aSopenharmony_ci cm = av_mod_uintp2(cm, blocks); 874cabdff1aSopenharmony_ci } 875cabdff1aSopenharmony_ci 876cabdff1aSopenharmony_ci return cm; 877cabdff1aSopenharmony_ci} 878cabdff1aSopenharmony_ci 879cabdff1aSopenharmony_cistatic QUANT_FN(pvq_decode_band) 880cabdff1aSopenharmony_ci{ 881cabdff1aSopenharmony_ci#if CONFIG_OPUS_DECODER 882cabdff1aSopenharmony_ci return quant_band_template(pvq, f, rc, band, X, Y, N, b, blocks, lowband, duration, 883cabdff1aSopenharmony_ci lowband_out, level, gain, lowband_scratch, fill, 0); 884cabdff1aSopenharmony_ci#else 885cabdff1aSopenharmony_ci return 0; 886cabdff1aSopenharmony_ci#endif 887cabdff1aSopenharmony_ci} 888cabdff1aSopenharmony_ci 889cabdff1aSopenharmony_cistatic QUANT_FN(pvq_encode_band) 890cabdff1aSopenharmony_ci{ 891cabdff1aSopenharmony_ci#if CONFIG_OPUS_ENCODER 892cabdff1aSopenharmony_ci return quant_band_template(pvq, f, rc, band, X, Y, N, b, blocks, lowband, duration, 893cabdff1aSopenharmony_ci lowband_out, level, gain, lowband_scratch, fill, 1); 894cabdff1aSopenharmony_ci#else 895cabdff1aSopenharmony_ci return 0; 896cabdff1aSopenharmony_ci#endif 897cabdff1aSopenharmony_ci} 898cabdff1aSopenharmony_ci 899cabdff1aSopenharmony_ciint av_cold ff_celt_pvq_init(CeltPVQ **pvq, int encode) 900cabdff1aSopenharmony_ci{ 901cabdff1aSopenharmony_ci CeltPVQ *s = av_malloc(sizeof(CeltPVQ)); 902cabdff1aSopenharmony_ci if (!s) 903cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 904cabdff1aSopenharmony_ci 905cabdff1aSopenharmony_ci s->pvq_search = ppp_pvq_search_c; 906cabdff1aSopenharmony_ci s->quant_band = encode ? pvq_encode_band : pvq_decode_band; 907cabdff1aSopenharmony_ci 908cabdff1aSopenharmony_ci#if CONFIG_OPUS_ENCODER && ARCH_X86 909cabdff1aSopenharmony_ci ff_celt_pvq_init_x86(s); 910cabdff1aSopenharmony_ci#endif 911cabdff1aSopenharmony_ci 912cabdff1aSopenharmony_ci *pvq = s; 913cabdff1aSopenharmony_ci 914cabdff1aSopenharmony_ci return 0; 915cabdff1aSopenharmony_ci} 916cabdff1aSopenharmony_ci 917cabdff1aSopenharmony_civoid av_cold ff_celt_pvq_uninit(CeltPVQ **pvq) 918cabdff1aSopenharmony_ci{ 919cabdff1aSopenharmony_ci av_freep(pvq); 920cabdff1aSopenharmony_ci} 921