OLD | NEW |
1 /* Copyright (c) 2007-2008 CSIRO | 1 /* Copyright (c) 2007-2008 CSIRO |
2 Copyright (c) 2007-2009 Xiph.Org Foundation | 2 Copyright (c) 2007-2009 Xiph.Org Foundation |
3 Copyright (c) 2008-2009 Gregory Maxwell | 3 Copyright (c) 2008-2009 Gregory Maxwell |
4 Written by Jean-Marc Valin and Gregory Maxwell */ | 4 Written by Jean-Marc Valin and Gregory Maxwell */ |
5 /* | 5 /* |
6 Redistribution and use in source and binary forms, with or without | 6 Redistribution and use in source and binary forms, with or without |
7 modification, are permitted provided that the following conditions | 7 modification, are permitted provided that the following conditions |
8 are met: | 8 are met: |
9 | 9 |
10 - Redistributions of source code must retain the above copyright | 10 - Redistributions of source code must retain the above copyright |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 ls=EC_ILOG(isin); | 85 ls=EC_ILOG(isin); |
86 icos<<=15-lc; | 86 icos<<=15-lc; |
87 isin<<=15-ls; | 87 isin<<=15-ls; |
88 return (ls-lc)*(1<<11) | 88 return (ls-lc)*(1<<11) |
89 +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) | 89 +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) |
90 -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); | 90 -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); |
91 } | 91 } |
92 | 92 |
93 #ifdef FIXED_POINT | 93 #ifdef FIXED_POINT |
94 /* Compute the amplitude (sqrt energy) in each of the bands */ | 94 /* Compute the amplitude (sqrt energy) in each of the bands */ |
95 void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *band
E, int end, int C, int M) | 95 void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *band
E, int end, int C, int LM) |
96 { | 96 { |
97 int i, c, N; | 97 int i, c, N; |
98 const opus_int16 *eBands = m->eBands; | 98 const opus_int16 *eBands = m->eBands; |
99 N = M*m->shortMdctSize; | 99 N = m->shortMdctSize<<LM; |
100 c=0; do { | 100 c=0; do { |
101 for (i=0;i<end;i++) | 101 for (i=0;i<end;i++) |
102 { | 102 { |
103 int j; | 103 int j; |
104 opus_val32 maxval=0; | 104 opus_val32 maxval=0; |
105 opus_val32 sum = 0; | 105 opus_val32 sum = 0; |
106 | 106 |
107 j=M*eBands[i]; do { | 107 maxval = celt_maxabs32(&X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])
<<LM); |
108 maxval = MAX32(maxval, X[j+c*N]); | |
109 maxval = MAX32(maxval, -X[j+c*N]); | |
110 } while (++j<M*eBands[i+1]); | |
111 | |
112 if (maxval > 0) | 108 if (maxval > 0) |
113 { | 109 { |
114 int shift = celt_ilog2(maxval)-10; | 110 int shift = celt_ilog2(maxval) - 14 + (((m->logN[i]>>BITRES)+LM+1)>>
1); |
115 j=M*eBands[i]; do { | 111 j=eBands[i]<<LM; |
116 sum = MAC16_16(sum, EXTRACT16(VSHR32(X[j+c*N],shift)), | 112 if (shift>0) |
117 EXTRACT16(VSHR32(X[j+c*N],shift))); | 113 { |
118 } while (++j<M*eBands[i+1]); | 114 do { |
| 115 sum = MAC16_16(sum, EXTRACT16(SHR32(X[j+c*N],shift)), |
| 116 EXTRACT16(SHR32(X[j+c*N],shift))); |
| 117 } while (++j<eBands[i+1]<<LM); |
| 118 } else { |
| 119 do { |
| 120 sum = MAC16_16(sum, EXTRACT16(SHL32(X[j+c*N],-shift)), |
| 121 EXTRACT16(SHL32(X[j+c*N],-shift))); |
| 122 } while (++j<eBands[i+1]<<LM); |
| 123 } |
119 /* We're adding one here to ensure the normalized band isn't larger
than unity norm */ | 124 /* We're adding one here to ensure the normalized band isn't larger
than unity norm */ |
120 bandE[i+c*m->nbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-sh
ift); | 125 bandE[i+c*m->nbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-sh
ift); |
121 } else { | 126 } else { |
122 bandE[i+c*m->nbEBands] = EPSILON; | 127 bandE[i+c*m->nbEBands] = EPSILON; |
123 } | 128 } |
124 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ | 129 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ |
125 } | 130 } |
126 } while (++c<C); | 131 } while (++c<C); |
127 /*printf ("\n");*/ | 132 /*printf ("\n");*/ |
128 } | 133 } |
(...skipping 14 matching lines...) Expand all Loading... |
143 g = EXTRACT16(celt_rcp(SHL32(E,3))); | 148 g = EXTRACT16(celt_rcp(SHL32(E,3))); |
144 j=M*eBands[i]; do { | 149 j=M*eBands[i]; do { |
145 X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); | 150 X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); |
146 } while (++j<M*eBands[i+1]); | 151 } while (++j<M*eBands[i+1]); |
147 } while (++i<end); | 152 } while (++i<end); |
148 } while (++c<C); | 153 } while (++c<C); |
149 } | 154 } |
150 | 155 |
151 #else /* FIXED_POINT */ | 156 #else /* FIXED_POINT */ |
152 /* Compute the amplitude (sqrt energy) in each of the bands */ | 157 /* Compute the amplitude (sqrt energy) in each of the bands */ |
153 void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *band
E, int end, int C, int M) | 158 void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *band
E, int end, int C, int LM) |
154 { | 159 { |
155 int i, c, N; | 160 int i, c, N; |
156 const opus_int16 *eBands = m->eBands; | 161 const opus_int16 *eBands = m->eBands; |
157 N = M*m->shortMdctSize; | 162 N = m->shortMdctSize<<LM; |
158 c=0; do { | 163 c=0; do { |
159 for (i=0;i<end;i++) | 164 for (i=0;i<end;i++) |
160 { | 165 { |
161 int j; | 166 opus_val32 sum; |
162 opus_val32 sum = 1e-27f; | 167 sum = 1e-27f + celt_inner_prod_c(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBand
s[i]<<LM)], (eBands[i+1]-eBands[i])<<LM); |
163 for (j=M*eBands[i];j<M*eBands[i+1];j++) | |
164 sum += X[j+c*N]*X[j+c*N]; | |
165 bandE[i+c*m->nbEBands] = celt_sqrt(sum); | 168 bandE[i+c*m->nbEBands] = celt_sqrt(sum); |
166 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ | 169 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ |
167 } | 170 } |
168 } while (++c<C); | 171 } while (++c<C); |
169 /*printf ("\n");*/ | 172 /*printf ("\n");*/ |
170 } | 173 } |
171 | 174 |
172 /* Normalise each band such that the energy is one. */ | 175 /* Normalise each band such that the energy is one. */ |
173 void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, cel
t_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M) | 176 void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, cel
t_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M) |
174 { | 177 { |
175 int i, c, N; | 178 int i, c, N; |
176 const opus_int16 *eBands = m->eBands; | 179 const opus_int16 *eBands = m->eBands; |
177 N = M*m->shortMdctSize; | 180 N = M*m->shortMdctSize; |
178 c=0; do { | 181 c=0; do { |
179 for (i=0;i<end;i++) | 182 for (i=0;i<end;i++) |
180 { | 183 { |
181 int j; | 184 int j; |
182 opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]); | 185 opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]); |
183 for (j=M*eBands[i];j<M*eBands[i+1];j++) | 186 for (j=M*eBands[i];j<M*eBands[i+1];j++) |
184 X[j+c*N] = freq[j+c*N]*g; | 187 X[j+c*N] = freq[j+c*N]*g; |
185 } | 188 } |
186 } while (++c<C); | 189 } while (++c<C); |
187 } | 190 } |
188 | 191 |
189 #endif /* FIXED_POINT */ | 192 #endif /* FIXED_POINT */ |
190 | 193 |
191 /* De-normalise the energy to produce the synthesis from the unit-energy bands *
/ | 194 /* De-normalise the energy to produce the synthesis from the unit-energy bands *
/ |
192 void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, | 195 void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, |
193 celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandLogE, int start, int
end, int C, int M) | 196 celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandLogE, int start, |
| 197 int end, int M, int downsample, int silence) |
194 { | 198 { |
195 int i, c, N; | 199 int i, N; |
| 200 int bound; |
| 201 celt_sig * OPUS_RESTRICT f; |
| 202 const celt_norm * OPUS_RESTRICT x; |
196 const opus_int16 *eBands = m->eBands; | 203 const opus_int16 *eBands = m->eBands; |
197 N = M*m->shortMdctSize; | 204 N = M*m->shortMdctSize; |
198 celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels"); | 205 bound = M*eBands[end]; |
199 c=0; do { | 206 if (downsample!=1) |
200 celt_sig * OPUS_RESTRICT f; | 207 bound = IMIN(bound, N/downsample); |
201 const celt_norm * OPUS_RESTRICT x; | 208 if (silence) |
202 f = freq+c*N; | 209 { |
203 x = X+c*N+M*eBands[start]; | 210 bound = 0; |
204 for (i=0;i<M*eBands[start];i++) | 211 start = end = 0; |
205 *f++ = 0; | 212 } |
206 for (i=start;i<end;i++) | 213 f = freq; |
| 214 x = X+M*eBands[start]; |
| 215 for (i=0;i<M*eBands[start];i++) |
| 216 *f++ = 0; |
| 217 for (i=start;i<end;i++) |
| 218 { |
| 219 int j, band_end; |
| 220 opus_val16 g; |
| 221 opus_val16 lg; |
| 222 #ifdef FIXED_POINT |
| 223 int shift; |
| 224 #endif |
| 225 j=M*eBands[i]; |
| 226 band_end = M*eBands[i+1]; |
| 227 lg = ADD16(bandLogE[i], SHL16((opus_val16)eMeans[i],6)); |
| 228 #ifndef FIXED_POINT |
| 229 g = celt_exp2(lg); |
| 230 #else |
| 231 /* Handle the integer part of the log energy */ |
| 232 shift = 16-(lg>>DB_SHIFT); |
| 233 if (shift>31) |
207 { | 234 { |
208 int j, band_end; | 235 shift=0; |
209 opus_val16 g; | 236 g=0; |
210 opus_val16 lg; | 237 } else { |
211 #ifdef FIXED_POINT | 238 /* Handle the fractional part. */ |
212 int shift; | 239 g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1)); |
213 #endif | 240 } |
214 j=M*eBands[i]; | 241 /* Handle extreme gains with negative shift. */ |
215 band_end = M*eBands[i+1]; | 242 if (shift<0) |
216 lg = ADD16(bandLogE[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6)); | 243 { |
217 #ifndef FIXED_POINT | 244 /* For shift < -2 we'd be likely to overflow, so we're capping |
218 g = celt_exp2(lg); | |
219 #else | |
220 /* Handle the integer part of the log energy */ | |
221 shift = 16-(lg>>DB_SHIFT); | |
222 if (shift>31) | |
223 { | |
224 shift=0; | |
225 g=0; | |
226 } else { | |
227 /* Handle the fractional part. */ | |
228 g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1)); | |
229 } | |
230 /* Handle extreme gains with negative shift. */ | |
231 if (shift<0) | |
232 { | |
233 /* For shift < -2 we'd be likely to overflow, so we're capping | |
234 the gain here. This shouldn't happen unless the bitstream is | 245 the gain here. This shouldn't happen unless the bitstream is |
235 already corrupted. */ | 246 already corrupted. */ |
236 if (shift < -2) | 247 if (shift < -2) |
237 { | 248 { |
238 g = 32767; | 249 g = 32767; |
239 shift = -2; | 250 shift = -2; |
240 } | 251 } |
241 do { | 252 do { |
242 *f++ = SHL32(MULT16_16(*x++, g), -shift); | 253 *f++ = SHL32(MULT16_16(*x++, g), -shift); |
243 } while (++j<band_end); | 254 } while (++j<band_end); |
244 } else | 255 } else |
245 #endif | 256 #endif |
246 /* Be careful of the fixed-point "else" just above when changing this c
ode */ | 257 /* Be careful of the fixed-point "else" just above when changing this c
ode */ |
247 do { | 258 do { |
248 *f++ = SHR32(MULT16_16(*x++, g), shift); | 259 *f++ = SHR32(MULT16_16(*x++, g), shift); |
249 } while (++j<band_end); | 260 } while (++j<band_end); |
250 } | 261 } |
251 celt_assert(start <= end); | 262 celt_assert(start <= end); |
252 for (i=M*eBands[end];i<N;i++) | 263 OPUS_CLEAR(&freq[bound], N-bound); |
253 *f++ = 0; | |
254 } while (++c<C); | |
255 } | 264 } |
256 | 265 |
257 /* This prevents energy collapse for transients with multiple short MDCTs */ | 266 /* This prevents energy collapse for transients with multiple short MDCTs */ |
258 void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_mas
ks, int LM, int C, int size, | 267 void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_mas
ks, int LM, int C, int size, |
259 int start, int end, opus_val16 *logE, opus_val16 *prev1logE, | 268 int start, int end, const opus_val16 *logE, const opus_val16 *prev1logE, |
260 opus_val16 *prev2logE, int *pulses, opus_uint32 seed) | 269 const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed, int arch
) |
261 { | 270 { |
262 int c, i, j, k; | 271 int c, i, j, k; |
263 for (i=start;i<end;i++) | 272 for (i=start;i<end;i++) |
264 { | 273 { |
265 int N0; | 274 int N0; |
266 opus_val16 thresh, sqrt_1; | 275 opus_val16 thresh, sqrt_1; |
267 int depth; | 276 int depth; |
268 #ifdef FIXED_POINT | 277 #ifdef FIXED_POINT |
269 int shift; | 278 int shift; |
270 opus_val32 thresh32; | 279 opus_val32 thresh32; |
271 #endif | 280 #endif |
272 | 281 |
273 N0 = m->eBands[i+1]-m->eBands[i]; | 282 N0 = m->eBands[i+1]-m->eBands[i]; |
274 /* depth in 1/8 bits */ | 283 /* depth in 1/8 bits */ |
275 depth = (1+pulses[i])/((m->eBands[i+1]-m->eBands[i])<<LM); | 284 celt_assert(pulses[i]>=0); |
| 285 depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM; |
276 | 286 |
277 #ifdef FIXED_POINT | 287 #ifdef FIXED_POINT |
278 thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1); | 288 thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1); |
279 thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32)); | 289 thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32)); |
280 { | 290 { |
281 opus_val32 t; | 291 opus_val32 t; |
282 t = N0<<LM; | 292 t = N0<<LM; |
283 shift = celt_ilog2(t)>>1; | 293 shift = celt_ilog2(t)>>1; |
284 t = SHL32(t, (7-shift)<<1); | 294 t = SHL32(t, (7-shift)<<1); |
285 sqrt_1 = celt_rsqrt_norm(t); | 295 sqrt_1 = celt_rsqrt_norm(t); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 for (j=0;j<N0;j++) | 348 for (j=0;j<N0;j++) |
339 { | 349 { |
340 seed = celt_lcg_rand(seed); | 350 seed = celt_lcg_rand(seed); |
341 X[(j<<LM)+k] = (seed&0x8000 ? r : -r); | 351 X[(j<<LM)+k] = (seed&0x8000 ? r : -r); |
342 } | 352 } |
343 renormalize = 1; | 353 renormalize = 1; |
344 } | 354 } |
345 } | 355 } |
346 /* We just added some energy, so we need to renormalise */ | 356 /* We just added some energy, so we need to renormalise */ |
347 if (renormalize) | 357 if (renormalize) |
348 renormalise_vector(X, N0<<LM, Q15ONE); | 358 renormalise_vector(X, N0<<LM, Q15ONE, arch); |
349 } while (++c<C); | 359 } while (++c<C); |
350 } | 360 } |
351 } | 361 } |
352 | 362 |
353 static void intensity_stereo(const CELTMode *m, celt_norm *X, celt_norm *Y, cons
t celt_ener *bandE, int bandID, int N) | 363 static void intensity_stereo(const CELTMode *m, celt_norm * OPUS_RESTRICT X, con
st celt_norm * OPUS_RESTRICT Y, const celt_ener *bandE, int bandID, int N) |
354 { | 364 { |
355 int i = bandID; | 365 int i = bandID; |
356 int j; | 366 int j; |
357 opus_val16 a1, a2; | 367 opus_val16 a1, a2; |
358 opus_val16 left, right; | 368 opus_val16 left, right; |
359 opus_val16 norm; | 369 opus_val16 norm; |
360 #ifdef FIXED_POINT | 370 #ifdef FIXED_POINT |
361 int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13; | 371 int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13; |
362 #endif | 372 #endif |
363 left = VSHR32(bandE[i],shift); | 373 left = VSHR32(bandE[i],shift); |
364 right = VSHR32(bandE[i+m->nbEBands],shift); | 374 right = VSHR32(bandE[i+m->nbEBands],shift); |
365 norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right
)); | 375 norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right
)); |
366 a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); | 376 a1 = DIV32_16(SHL32(EXTEND32(left),14),norm); |
367 a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); | 377 a2 = DIV32_16(SHL32(EXTEND32(right),14),norm); |
368 for (j=0;j<N;j++) | 378 for (j=0;j<N;j++) |
369 { | 379 { |
370 celt_norm r, l; | 380 celt_norm r, l; |
371 l = X[j]; | 381 l = X[j]; |
372 r = Y[j]; | 382 r = Y[j]; |
373 X[j] = MULT16_16_Q14(a1,l) + MULT16_16_Q14(a2,r); | 383 X[j] = EXTRACT16(SHR32(MAC16_16(MULT16_16(a1, l), a2, r), 14)); |
374 /* Side is not encoded, no need to calculate */ | 384 /* Side is not encoded, no need to calculate */ |
375 } | 385 } |
376 } | 386 } |
377 | 387 |
378 static void stereo_split(celt_norm *X, celt_norm *Y, int N) | 388 static void stereo_split(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT
Y, int N) |
379 { | 389 { |
380 int j; | 390 int j; |
381 for (j=0;j<N;j++) | 391 for (j=0;j<N;j++) |
382 { | 392 { |
383 celt_norm r, l; | 393 opus_val32 r, l; |
384 l = MULT16_16_Q15(QCONST16(.70710678f,15), X[j]); | 394 l = MULT16_16(QCONST16(.70710678f, 15), X[j]); |
385 r = MULT16_16_Q15(QCONST16(.70710678f,15), Y[j]); | 395 r = MULT16_16(QCONST16(.70710678f, 15), Y[j]); |
386 X[j] = l+r; | 396 X[j] = EXTRACT16(SHR32(ADD32(l, r), 15)); |
387 Y[j] = r-l; | 397 Y[j] = EXTRACT16(SHR32(SUB32(r, l), 15)); |
388 } | 398 } |
389 } | 399 } |
390 | 400 |
391 static void stereo_merge(celt_norm *X, celt_norm *Y, opus_val16 mid, int N) | 401 static void stereo_merge(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT
Y, opus_val16 mid, int N) |
392 { | 402 { |
393 int j; | 403 int j; |
394 opus_val32 xp=0, side=0; | 404 opus_val32 xp=0, side=0; |
395 opus_val32 El, Er; | 405 opus_val32 El, Er; |
396 opus_val16 mid2; | 406 opus_val16 mid2; |
397 #ifdef FIXED_POINT | 407 #ifdef FIXED_POINT |
398 int kl, kr; | 408 int kl, kr; |
399 #endif | 409 #endif |
400 opus_val32 t, lgain, rgain; | 410 opus_val32 t, lgain, rgain; |
401 | 411 |
402 /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ | 412 /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ |
403 dual_inner_prod(Y, X, Y, N, &xp, &side); | 413 dual_inner_prod(Y, X, Y, N, &xp, &side); |
404 /* Compensating for the mid normalization */ | 414 /* Compensating for the mid normalization */ |
405 xp = MULT16_32_Q15(mid, xp); | 415 xp = MULT16_32_Q15(mid, xp); |
406 /* mid and side are in Q15, not Q14 like X and Y */ | 416 /* mid and side are in Q15, not Q14 like X and Y */ |
407 mid2 = SHR32(mid, 1); | 417 mid2 = SHR32(mid, 1); |
408 El = MULT16_16(mid2, mid2) + side - 2*xp; | 418 El = MULT16_16(mid2, mid2) + side - 2*xp; |
409 Er = MULT16_16(mid2, mid2) + side + 2*xp; | 419 Er = MULT16_16(mid2, mid2) + side + 2*xp; |
410 if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28)) | 420 if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28)) |
411 { | 421 { |
412 for (j=0;j<N;j++) | 422 OPUS_COPY(Y, X, N); |
413 Y[j] = X[j]; | |
414 return; | 423 return; |
415 } | 424 } |
416 | 425 |
417 #ifdef FIXED_POINT | 426 #ifdef FIXED_POINT |
418 kl = celt_ilog2(El)>>1; | 427 kl = celt_ilog2(El)>>1; |
419 kr = celt_ilog2(Er)>>1; | 428 kr = celt_ilog2(Er)>>1; |
420 #endif | 429 #endif |
421 t = VSHR32(El, (kl-7)<<1); | 430 t = VSHR32(El, (kl-7)<<1); |
422 lgain = celt_rsqrt_norm(t); | 431 lgain = celt_rsqrt_norm(t); |
423 t = VSHR32(Er, (kr-7)<<1); | 432 t = VSHR32(Er, (kr-7)<<1); |
424 rgain = celt_rsqrt_norm(t); | 433 rgain = celt_rsqrt_norm(t); |
425 | 434 |
426 #ifdef FIXED_POINT | 435 #ifdef FIXED_POINT |
427 if (kl < 7) | 436 if (kl < 7) |
428 kl = 7; | 437 kl = 7; |
429 if (kr < 7) | 438 if (kr < 7) |
430 kr = 7; | 439 kr = 7; |
431 #endif | 440 #endif |
432 | 441 |
433 for (j=0;j<N;j++) | 442 for (j=0;j<N;j++) |
434 { | 443 { |
435 celt_norm r, l; | 444 celt_norm r, l; |
436 /* Apply mid scaling (side is already scaled) */ | 445 /* Apply mid scaling (side is already scaled) */ |
437 l = MULT16_16_Q15(mid, X[j]); | 446 l = MULT16_16_P15(mid, X[j]); |
438 r = Y[j]; | 447 r = Y[j]; |
439 X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, SUB16(l,r)), kl+1)); | 448 X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, SUB16(l,r)), kl+1)); |
440 Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, ADD16(l,r)), kr+1)); | 449 Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, ADD16(l,r)), kr+1)); |
441 } | 450 } |
442 } | 451 } |
443 | 452 |
444 /* Decide whether we should spread the pulses in the current frame */ | 453 /* Decide whether we should spread the pulses in the current frame */ |
445 int spreading_decision(const CELTMode *m, celt_norm *X, int *average, | 454 int spreading_decision(const CELTMode *m, const celt_norm *X, int *average, |
446 int last_decision, int *hf_average, int *tapset_decision, int update_hf, | 455 int last_decision, int *hf_average, int *tapset_decision, int update_hf, |
447 int end, int C, int M) | 456 int end, int C, int M) |
448 { | 457 { |
449 int i, c, N0; | 458 int i, c, N0; |
450 int sum = 0, nbBands=0; | 459 int sum = 0, nbBands=0; |
451 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; | 460 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; |
452 int decision; | 461 int decision; |
453 int hf_sum=0; | 462 int hf_sum=0; |
454 | 463 |
455 celt_assert(end>0); | 464 celt_assert(end>0); |
456 | 465 |
457 N0 = M*m->shortMdctSize; | 466 N0 = M*m->shortMdctSize; |
458 | 467 |
459 if (M*(eBands[end]-eBands[end-1]) <= 8) | 468 if (M*(eBands[end]-eBands[end-1]) <= 8) |
460 return SPREAD_NONE; | 469 return SPREAD_NONE; |
461 c=0; do { | 470 c=0; do { |
462 for (i=0;i<end;i++) | 471 for (i=0;i<end;i++) |
463 { | 472 { |
464 int j, N, tmp=0; | 473 int j, N, tmp=0; |
465 int tcount[3] = {0,0,0}; | 474 int tcount[3] = {0,0,0}; |
466 celt_norm * OPUS_RESTRICT x = X+M*eBands[i]+c*N0; | 475 const celt_norm * OPUS_RESTRICT x = X+M*eBands[i]+c*N0; |
467 N = M*(eBands[i+1]-eBands[i]); | 476 N = M*(eBands[i+1]-eBands[i]); |
468 if (N<=8) | 477 if (N<=8) |
469 continue; | 478 continue; |
470 /* Compute rough CDF of |x[j]| */ | 479 /* Compute rough CDF of |x[j]| */ |
471 for (j=0;j<N;j++) | 480 for (j=0;j<N;j++) |
472 { | 481 { |
473 opus_val32 x2N; /* Q13 */ | 482 opus_val32 x2N; /* Q13 */ |
474 | 483 |
475 x2N = MULT16_16(MULT16_16_Q15(x[j], x[j]), N); | 484 x2N = MULT16_16(MULT16_16_Q15(x[j], x[j]), N); |
476 if (x2N < QCONST16(0.25f,13)) | 485 if (x2N < QCONST16(0.25f,13)) |
477 tcount[0]++; | 486 tcount[0]++; |
478 if (x2N < QCONST16(0.0625f,13)) | 487 if (x2N < QCONST16(0.0625f,13)) |
479 tcount[1]++; | 488 tcount[1]++; |
480 if (x2N < QCONST16(0.015625f,13)) | 489 if (x2N < QCONST16(0.015625f,13)) |
481 tcount[2]++; | 490 tcount[2]++; |
482 } | 491 } |
483 | 492 |
484 /* Only include four last bands (8 kHz and up) */ | 493 /* Only include four last bands (8 kHz and up) */ |
485 if (i>m->nbEBands-4) | 494 if (i>m->nbEBands-4) |
486 hf_sum += 32*(tcount[1]+tcount[0])/N; | 495 hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N); |
487 tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); | 496 tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); |
488 sum += tmp*256; | 497 sum += tmp*256; |
489 nbBands++; | 498 nbBands++; |
490 } | 499 } |
491 } while (++c<C); | 500 } while (++c<C); |
492 | 501 |
493 if (update_hf) | 502 if (update_hf) |
494 { | 503 { |
495 if (hf_sum) | 504 if (hf_sum) |
496 hf_sum /= C*(4-m->nbEBands+end); | 505 hf_sum = celt_udiv(hf_sum, C*(4-m->nbEBands+end)); |
497 *hf_average = (*hf_average+hf_sum)>>1; | 506 *hf_average = (*hf_average+hf_sum)>>1; |
498 hf_sum = *hf_average; | 507 hf_sum = *hf_average; |
499 if (*tapset_decision==2) | 508 if (*tapset_decision==2) |
500 hf_sum += 4; | 509 hf_sum += 4; |
501 else if (*tapset_decision==0) | 510 else if (*tapset_decision==0) |
502 hf_sum -= 4; | 511 hf_sum -= 4; |
503 if (hf_sum > 22) | 512 if (hf_sum > 22) |
504 *tapset_decision=2; | 513 *tapset_decision=2; |
505 else if (hf_sum > 18) | 514 else if (hf_sum > 18) |
506 *tapset_decision=1; | 515 *tapset_decision=1; |
507 else | 516 else |
508 *tapset_decision=0; | 517 *tapset_decision=0; |
509 } | 518 } |
510 /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ | 519 /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/ |
511 celt_assert(nbBands>0); /* end has to be non-zero */ | 520 celt_assert(nbBands>0); /* end has to be non-zero */ |
512 sum /= nbBands; | 521 celt_assert(sum>=0); |
| 522 sum = celt_udiv(sum, nbBands); |
513 /* Recursive averaging */ | 523 /* Recursive averaging */ |
514 sum = (sum+*average)>>1; | 524 sum = (sum+*average)>>1; |
515 *average = sum; | 525 *average = sum; |
516 /* Hysteresis */ | 526 /* Hysteresis */ |
517 sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; | 527 sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; |
518 if (sum < 80) | 528 if (sum < 80) |
519 { | 529 { |
520 decision = SPREAD_AGGRESSIVE; | 530 decision = SPREAD_AGGRESSIVE; |
521 } else if (sum < 256) | 531 } else if (sum < 256) |
522 { | 532 { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 for (i=0;i<stride;i++) | 570 for (i=0;i<stride;i++) |
561 { | 571 { |
562 for (j=0;j<N0;j++) | 572 for (j=0;j<N0;j++) |
563 tmp[ordery[i]*N0+j] = X[j*stride+i]; | 573 tmp[ordery[i]*N0+j] = X[j*stride+i]; |
564 } | 574 } |
565 } else { | 575 } else { |
566 for (i=0;i<stride;i++) | 576 for (i=0;i<stride;i++) |
567 for (j=0;j<N0;j++) | 577 for (j=0;j<N0;j++) |
568 tmp[i*N0+j] = X[j*stride+i]; | 578 tmp[i*N0+j] = X[j*stride+i]; |
569 } | 579 } |
570 for (j=0;j<N;j++) | 580 OPUS_COPY(X, tmp, N); |
571 X[j] = tmp[j]; | |
572 RESTORE_STACK; | 581 RESTORE_STACK; |
573 } | 582 } |
574 | 583 |
575 static void interleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) | 584 static void interleave_hadamard(celt_norm *X, int N0, int stride, int hadamard) |
576 { | 585 { |
577 int i,j; | 586 int i,j; |
578 VARDECL(celt_norm, tmp); | 587 VARDECL(celt_norm, tmp); |
579 int N; | 588 int N; |
580 SAVE_STACK; | 589 SAVE_STACK; |
581 N = N0*stride; | 590 N = N0*stride; |
582 ALLOC(tmp, N, celt_norm); | 591 ALLOC(tmp, N, celt_norm); |
583 if (hadamard) | 592 if (hadamard) |
584 { | 593 { |
585 const int *ordery = ordery_table+stride-2; | 594 const int *ordery = ordery_table+stride-2; |
586 for (i=0;i<stride;i++) | 595 for (i=0;i<stride;i++) |
587 for (j=0;j<N0;j++) | 596 for (j=0;j<N0;j++) |
588 tmp[j*stride+i] = X[ordery[i]*N0+j]; | 597 tmp[j*stride+i] = X[ordery[i]*N0+j]; |
589 } else { | 598 } else { |
590 for (i=0;i<stride;i++) | 599 for (i=0;i<stride;i++) |
591 for (j=0;j<N0;j++) | 600 for (j=0;j<N0;j++) |
592 tmp[j*stride+i] = X[i*N0+j]; | 601 tmp[j*stride+i] = X[i*N0+j]; |
593 } | 602 } |
594 for (j=0;j<N;j++) | 603 OPUS_COPY(X, tmp, N); |
595 X[j] = tmp[j]; | |
596 RESTORE_STACK; | 604 RESTORE_STACK; |
597 } | 605 } |
598 | 606 |
599 void haar1(celt_norm *X, int N0, int stride) | 607 void haar1(celt_norm *X, int N0, int stride) |
600 { | 608 { |
601 int i, j; | 609 int i, j; |
602 N0 >>= 1; | 610 N0 >>= 1; |
603 for (i=0;i<stride;i++) | 611 for (i=0;i<stride;i++) |
604 for (j=0;j<N0;j++) | 612 for (j=0;j<N0;j++) |
605 { | 613 { |
606 celt_norm tmp1, tmp2; | 614 opus_val32 tmp1, tmp2; |
607 tmp1 = MULT16_16_Q15(QCONST16(.70710678f,15), X[stride*2*j+i]); | 615 tmp1 = MULT16_16(QCONST16(.70710678f,15), X[stride*2*j+i]); |
608 tmp2 = MULT16_16_Q15(QCONST16(.70710678f,15), X[stride*(2*j+1)+i]); | 616 tmp2 = MULT16_16(QCONST16(.70710678f,15), X[stride*(2*j+1)+i]); |
609 X[stride*2*j+i] = tmp1 + tmp2; | 617 X[stride*2*j+i] = EXTRACT16(PSHR32(ADD32(tmp1, tmp2), 15)); |
610 X[stride*(2*j+1)+i] = tmp1 - tmp2; | 618 X[stride*(2*j+1)+i] = EXTRACT16(PSHR32(SUB32(tmp1, tmp2), 15)); |
611 } | 619 } |
612 } | 620 } |
613 | 621 |
614 static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo) | 622 static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo) |
615 { | 623 { |
616 static const opus_int16 exp2_table8[8] = | 624 static const opus_int16 exp2_table8[8] = |
617 {16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048}; | 625 {16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048}; |
618 int qn, qb; | 626 int qn, qb; |
619 int N2 = 2*N-1; | 627 int N2 = 2*N-1; |
620 if (stereo && N==2) | 628 if (stereo && N==2) |
621 N2--; | 629 N2--; |
622 /* The upper limit ensures that in a stereo split with itheta==16384, we'll | 630 /* The upper limit ensures that in a stereo split with itheta==16384, we'll |
623 always have enough bits left over to code at least one pulse in the | 631 always have enough bits left over to code at least one pulse in the |
624 side; otherwise it would collapse, since it doesn't get folded. */ | 632 side; otherwise it would collapse, since it doesn't get folded. */ |
625 qb = IMIN(b-pulse_cap-(4<<BITRES), (b+N2*offset)/N2); | 633 qb = celt_sudiv(b+N2*offset, N2); |
| 634 qb = IMIN(b-pulse_cap-(4<<BITRES), qb); |
626 | 635 |
627 qb = IMIN(8<<BITRES, qb); | 636 qb = IMIN(8<<BITRES, qb); |
628 | 637 |
629 if (qb<(1<<BITRES>>1)) { | 638 if (qb<(1<<BITRES>>1)) { |
630 qn = 1; | 639 qn = 1; |
631 } else { | 640 } else { |
632 qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); | 641 qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); |
633 qn = (qn+1)>>1<<1; | 642 qn = (qn+1)>>1<<1; |
634 } | 643 } |
635 celt_assert(qn <= 256); | 644 celt_assert(qn <= 256); |
636 return qn; | 645 return qn; |
637 } | 646 } |
638 | 647 |
639 struct band_ctx { | 648 struct band_ctx { |
640 int encode; | 649 int encode; |
641 const CELTMode *m; | 650 const CELTMode *m; |
642 int i; | 651 int i; |
643 int intensity; | 652 int intensity; |
644 int spread; | 653 int spread; |
645 int tf_change; | 654 int tf_change; |
646 ec_ctx *ec; | 655 ec_ctx *ec; |
647 opus_int32 remaining_bits; | 656 opus_int32 remaining_bits; |
648 const celt_ener *bandE; | 657 const celt_ener *bandE; |
649 opus_uint32 seed; | 658 opus_uint32 seed; |
| 659 int arch; |
650 }; | 660 }; |
651 | 661 |
652 struct split_ctx { | 662 struct split_ctx { |
653 int inv; | 663 int inv; |
654 int imid; | 664 int imid; |
655 int iside; | 665 int iside; |
656 int delta; | 666 int delta; |
657 int itheta; | 667 int itheta; |
658 int qalloc; | 668 int qalloc; |
659 }; | 669 }; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFF
SET); | 701 offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFF
SET); |
692 qn = compute_qn(N, *b, offset, pulse_cap, stereo); | 702 qn = compute_qn(N, *b, offset, pulse_cap, stereo); |
693 if (stereo && i>=intensity) | 703 if (stereo && i>=intensity) |
694 qn = 1; | 704 qn = 1; |
695 if (encode) | 705 if (encode) |
696 { | 706 { |
697 /* theta is the atan() of the ratio between the (normalized) | 707 /* theta is the atan() of the ratio between the (normalized) |
698 side and mid. With just that parameter, we can re-scale both | 708 side and mid. With just that parameter, we can re-scale both |
699 mid and side because we know that 1) they have unit norm and | 709 mid and side because we know that 1) they have unit norm and |
700 2) they are orthogonal. */ | 710 2) they are orthogonal. */ |
701 itheta = stereo_itheta(X, Y, stereo, N); | 711 itheta = stereo_itheta(X, Y, stereo, N, ctx->arch); |
702 } | 712 } |
703 tell = ec_tell_frac(ec); | 713 tell = ec_tell_frac(ec); |
704 if (qn!=1) | 714 if (qn!=1) |
705 { | 715 { |
706 if (encode) | 716 if (encode) |
707 itheta = (itheta*qn+8192)>>14; | 717 itheta = (itheta*qn+8192)>>14; |
708 | 718 |
709 /* Entropy coding of the angle. We use a uniform pdf for the | 719 /* Entropy coding of the angle. We use a uniform pdf for the |
710 time split, a step for stereo, and a triangular one for the rest. */ | 720 time split, a step for stereo, and a triangular one for the rest. */ |
711 if (stereo && N>2) | 721 if (stereo && N>2) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 { | 772 { |
763 itheta = (2*(qn + 1) | 773 itheta = (2*(qn + 1) |
764 - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; | 774 - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; |
765 fs = qn + 1 - itheta; | 775 fs = qn + 1 - itheta; |
766 fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); | 776 fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); |
767 } | 777 } |
768 | 778 |
769 ec_dec_update(ec, fl, fl+fs, ft); | 779 ec_dec_update(ec, fl, fl+fs, ft); |
770 } | 780 } |
771 } | 781 } |
772 itheta = (opus_int32)itheta*16384/qn; | 782 celt_assert(itheta>=0); |
| 783 itheta = celt_udiv((opus_int32)itheta*16384, qn); |
773 if (encode && stereo) | 784 if (encode && stereo) |
774 { | 785 { |
775 if (itheta==0) | 786 if (itheta==0) |
776 intensity_stereo(m, X, Y, bandE, i, N); | 787 intensity_stereo(m, X, Y, bandE, i, N); |
777 else | 788 else |
778 stereo_split(X, Y, N); | 789 stereo_split(X, Y, N); |
779 } | 790 } |
780 /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high r
ate. | 791 /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high r
ate. |
781 Let's do that at higher complexity */ | 792 Let's do that at higher complexity */ |
782 } else if (stereo) { | 793 } else if (stereo) { |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 int j; | 1025 int j; |
1015 if (resynth) | 1026 if (resynth) |
1016 { | 1027 { |
1017 unsigned cm_mask; | 1028 unsigned cm_mask; |
1018 /* B can be as large as 16, so this shift might overflow an int on a | 1029 /* B can be as large as 16, so this shift might overflow an int on a |
1019 16-bit platform; use a long to get defined behavior.*/ | 1030 16-bit platform; use a long to get defined behavior.*/ |
1020 cm_mask = (unsigned)(1UL<<B)-1; | 1031 cm_mask = (unsigned)(1UL<<B)-1; |
1021 fill &= cm_mask; | 1032 fill &= cm_mask; |
1022 if (!fill) | 1033 if (!fill) |
1023 { | 1034 { |
1024 for (j=0;j<N;j++) | 1035 OPUS_CLEAR(X, N); |
1025 X[j] = 0; | |
1026 } else { | 1036 } else { |
1027 if (lowband == NULL) | 1037 if (lowband == NULL) |
1028 { | 1038 { |
1029 /* Noise */ | 1039 /* Noise */ |
1030 for (j=0;j<N;j++) | 1040 for (j=0;j<N;j++) |
1031 { | 1041 { |
1032 ctx->seed = celt_lcg_rand(ctx->seed); | 1042 ctx->seed = celt_lcg_rand(ctx->seed); |
1033 X[j] = (celt_norm)((opus_int32)ctx->seed>>20); | 1043 X[j] = (celt_norm)((opus_int32)ctx->seed>>20); |
1034 } | 1044 } |
1035 cm = cm_mask; | 1045 cm = cm_mask; |
1036 } else { | 1046 } else { |
1037 /* Folded spectrum */ | 1047 /* Folded spectrum */ |
1038 for (j=0;j<N;j++) | 1048 for (j=0;j<N;j++) |
1039 { | 1049 { |
1040 opus_val16 tmp; | 1050 opus_val16 tmp; |
1041 ctx->seed = celt_lcg_rand(ctx->seed); | 1051 ctx->seed = celt_lcg_rand(ctx->seed); |
1042 /* About 48 dB below the "normal" folding level */ | 1052 /* About 48 dB below the "normal" folding level */ |
1043 tmp = QCONST16(1.0f/256, 10); | 1053 tmp = QCONST16(1.0f/256, 10); |
1044 tmp = (ctx->seed)&0x8000 ? tmp : -tmp; | 1054 tmp = (ctx->seed)&0x8000 ? tmp : -tmp; |
1045 X[j] = lowband[j]+tmp; | 1055 X[j] = lowband[j]+tmp; |
1046 } | 1056 } |
1047 cm = fill; | 1057 cm = fill; |
1048 } | 1058 } |
1049 renormalise_vector(X, N, gain); | 1059 renormalise_vector(X, N, gain, ctx->arch); |
1050 } | 1060 } |
1051 } | 1061 } |
1052 } | 1062 } |
1053 } | 1063 } |
1054 | 1064 |
1055 return cm; | 1065 return cm; |
1056 } | 1066 } |
1057 | 1067 |
1058 | 1068 |
1059 /* This function is responsible for encoding and decoding a band for the mono ca
se. */ | 1069 /* This function is responsible for encoding and decoding a band for the mono ca
se. */ |
(...skipping 17 matching lines...) Expand all Loading... |
1077 #endif | 1087 #endif |
1078 int k; | 1088 int k; |
1079 int encode; | 1089 int encode; |
1080 int tf_change; | 1090 int tf_change; |
1081 | 1091 |
1082 encode = ctx->encode; | 1092 encode = ctx->encode; |
1083 tf_change = ctx->tf_change; | 1093 tf_change = ctx->tf_change; |
1084 | 1094 |
1085 longBlocks = B0==1; | 1095 longBlocks = B0==1; |
1086 | 1096 |
1087 N_B /= B; | 1097 N_B = celt_udiv(N_B, B); |
1088 | 1098 |
1089 /* Special case for one sample */ | 1099 /* Special case for one sample */ |
1090 if (N==1) | 1100 if (N==1) |
1091 { | 1101 { |
1092 return quant_band_n1(ctx, X, NULL, b, lowband_out); | 1102 return quant_band_n1(ctx, X, NULL, b, lowband_out); |
1093 } | 1103 } |
1094 | 1104 |
1095 if (tf_change>0) | 1105 if (tf_change>0) |
1096 recombine = tf_change; | 1106 recombine = tf_change; |
1097 /* Band recombining to increase frequency resolution */ | 1107 /* Band recombining to increase frequency resolution */ |
1098 | 1108 |
1099 if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0)
|| B0>1)) | 1109 if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0)
|| B0>1)) |
1100 { | 1110 { |
1101 int j; | 1111 OPUS_COPY(lowband_scratch, lowband, N); |
1102 for (j=0;j<N;j++) | |
1103 lowband_scratch[j] = lowband[j]; | |
1104 lowband = lowband_scratch; | 1112 lowband = lowband_scratch; |
1105 } | 1113 } |
1106 | 1114 |
1107 for (k=0;k<recombine;k++) | 1115 for (k=0;k<recombine;k++) |
1108 { | 1116 { |
1109 static const unsigned char bit_interleave_table[16]={ | 1117 static const unsigned char bit_interleave_table[16]={ |
1110 0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3 | 1118 0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3 |
1111 }; | 1119 }; |
1112 if (encode) | 1120 if (encode) |
1113 haar1(X, N>>k, 1<<k); | 1121 haar1(X, N>>k, 1<<k); |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1346 int j; | 1354 int j; |
1347 for (j=0;j<N;j++) | 1355 for (j=0;j<N;j++) |
1348 Y[j] = -Y[j]; | 1356 Y[j] = -Y[j]; |
1349 } | 1357 } |
1350 } | 1358 } |
1351 return cm; | 1359 return cm; |
1352 } | 1360 } |
1353 | 1361 |
1354 | 1362 |
1355 void quant_all_bands(int encode, const CELTMode *m, int start, int end, | 1363 void quant_all_bands(int encode, const CELTMode *m, int start, int end, |
1356 celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, const celt_en
er *bandE, int *pulses, | 1364 celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, |
1357 int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, | 1365 const celt_ener *bandE, int *pulses, int shortBlocks, int spread, |
1358 opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int LM, int codedBa
nds, opus_uint32 *seed) | 1366 int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, |
| 1367 opus_int32 balance, ec_ctx *ec, int LM, int codedBands, |
| 1368 opus_uint32 *seed, int arch) |
1359 { | 1369 { |
1360 int i; | 1370 int i; |
1361 opus_int32 remaining_bits; | 1371 opus_int32 remaining_bits; |
1362 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; | 1372 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; |
1363 celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; | 1373 celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; |
1364 VARDECL(celt_norm, _norm); | 1374 VARDECL(celt_norm, _norm); |
1365 celt_norm *lowband_scratch; | 1375 celt_norm *lowband_scratch; |
1366 int B; | 1376 int B; |
1367 int M; | 1377 int M; |
1368 int lowband_offset; | 1378 int lowband_offset; |
(...skipping 21 matching lines...) Expand all Loading... |
1390 lowband_scratch = X_+M*eBands[m->nbEBands-1]; | 1400 lowband_scratch = X_+M*eBands[m->nbEBands-1]; |
1391 | 1401 |
1392 lowband_offset = 0; | 1402 lowband_offset = 0; |
1393 ctx.bandE = bandE; | 1403 ctx.bandE = bandE; |
1394 ctx.ec = ec; | 1404 ctx.ec = ec; |
1395 ctx.encode = encode; | 1405 ctx.encode = encode; |
1396 ctx.intensity = intensity; | 1406 ctx.intensity = intensity; |
1397 ctx.m = m; | 1407 ctx.m = m; |
1398 ctx.seed = *seed; | 1408 ctx.seed = *seed; |
1399 ctx.spread = spread; | 1409 ctx.spread = spread; |
| 1410 ctx.arch = arch; |
1400 for (i=start;i<end;i++) | 1411 for (i=start;i<end;i++) |
1401 { | 1412 { |
1402 opus_int32 tell; | 1413 opus_int32 tell; |
1403 int b; | 1414 int b; |
1404 int N; | 1415 int N; |
1405 opus_int32 curr_balance; | 1416 opus_int32 curr_balance; |
1406 int effective_lowband=-1; | 1417 int effective_lowband=-1; |
1407 celt_norm * OPUS_RESTRICT X, * OPUS_RESTRICT Y; | 1418 celt_norm * OPUS_RESTRICT X, * OPUS_RESTRICT Y; |
1408 int tf_change=0; | 1419 int tf_change=0; |
1409 unsigned x_cm; | 1420 unsigned x_cm; |
(...skipping 11 matching lines...) Expand all Loading... |
1421 N = M*eBands[i+1]-M*eBands[i]; | 1432 N = M*eBands[i+1]-M*eBands[i]; |
1422 tell = ec_tell_frac(ec); | 1433 tell = ec_tell_frac(ec); |
1423 | 1434 |
1424 /* Compute how many bits we want to allocate to this band */ | 1435 /* Compute how many bits we want to allocate to this band */ |
1425 if (i != start) | 1436 if (i != start) |
1426 balance -= tell; | 1437 balance -= tell; |
1427 remaining_bits = total_bits-tell-1; | 1438 remaining_bits = total_bits-tell-1; |
1428 ctx.remaining_bits = remaining_bits; | 1439 ctx.remaining_bits = remaining_bits; |
1429 if (i <= codedBands-1) | 1440 if (i <= codedBands-1) |
1430 { | 1441 { |
1431 curr_balance = balance / IMIN(3, codedBands-i); | 1442 curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i)); |
1432 b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance)))
; | 1443 b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance)))
; |
1433 } else { | 1444 } else { |
1434 b = 0; | 1445 b = 0; |
1435 } | 1446 } |
1436 | 1447 |
1437 if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowb
and_offset==0)) | 1448 if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowb
and_offset==0)) |
1438 lowband_offset = i; | 1449 lowband_offset = i; |
1439 | 1450 |
1440 tf_change = tf_res[i]; | 1451 tf_change = tf_res[i]; |
1441 ctx.tf_change = tf_change; | 1452 ctx.tf_change = tf_change; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1509 balance += pulses[i] + tell; | 1520 balance += pulses[i] + tell; |
1510 | 1521 |
1511 /* Update the folding position only as long as we have 1 bit/sample depth.
*/ | 1522 /* Update the folding position only as long as we have 1 bit/sample depth.
*/ |
1512 update_lowband = b>(N<<BITRES); | 1523 update_lowband = b>(N<<BITRES); |
1513 } | 1524 } |
1514 *seed = ctx.seed; | 1525 *seed = ctx.seed; |
1515 | 1526 |
1516 RESTORE_STACK; | 1527 RESTORE_STACK; |
1517 } | 1528 } |
1518 | 1529 |
OLD | NEW |