blob: ffff0775dfd6181aa0bf0d899dddfffdd0efee44 [file] [log] [blame]
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001/* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2010 Xiph.Org Foundation
3 Copyright (c) 2008 Gregory Maxwell
4 Written by Jean-Marc Valin and Gregory Maxwell */
5/*
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9
10 - Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12
13 - Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#ifdef HAVE_CONFIG_H
31#include "config.h"
32#endif
33
34#define CELT_ENCODER_C
35
36#include "cpu_support.h"
37#include "os_support.h"
38#include "mdct.h"
39#include <math.h>
40#include "celt.h"
41#include "pitch.h"
42#include "bands.h"
43#include "modes.h"
44#include "entcode.h"
45#include "quant_bands.h"
46#include "rate.h"
47#include "stack_alloc.h"
48#include "mathops.h"
49#include "float_cast.h"
50#include <stdarg.h>
51#include "celt_lpc.h"
52#include "vq.h"
53
54
55/** Encoder state
56 @brief Encoder state
57 */
58struct OpusCustomEncoder {
59 const OpusCustomMode *mode; /**< Mode used by the encoder */
60 int overlap;
61 int channels;
62 int stream_channels;
63
64 int force_intra;
65 int clip;
66 int disable_pf;
67 int complexity;
68 int upsample;
69 int start, end;
70
71 opus_int32 bitrate;
72 int vbr;
73 int signalling;
74 int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */
75 int loss_rate;
76 int lsb_depth;
77 int variable_duration;
78 int lfe;
79 int arch;
80
81 /* Everything beyond this point gets cleared on a reset */
82#define ENCODER_RESET_START rng
83
84 opus_uint32 rng;
85 int spread_decision;
86 opus_val32 delayedIntra;
87 int tonal_average;
88 int lastCodedBands;
89 int hf_average;
90 int tapset_decision;
91
92 int prefilter_period;
93 opus_val16 prefilter_gain;
94 int prefilter_tapset;
95#ifdef RESYNTH
96 int prefilter_period_old;
97 opus_val16 prefilter_gain_old;
98 int prefilter_tapset_old;
99#endif
100 int consec_transient;
101 AnalysisInfo analysis;
102
103 opus_val32 preemph_memE[2];
104 opus_val32 preemph_memD[2];
105
106 /* VBR-related parameters */
107 opus_int32 vbr_reservoir;
108 opus_int32 vbr_drift;
109 opus_int32 vbr_offset;
110 opus_int32 vbr_count;
111 opus_val32 overlap_max;
112 opus_val16 stereo_saving;
113 int intensity;
114 opus_val16 *energy_mask;
115 opus_val16 spec_avg;
116
117#ifdef RESYNTH
118 /* +MAX_PERIOD/2 to make space for overlap */
119 celt_sig syn_mem[2][2*MAX_PERIOD+MAX_PERIOD/2];
120#endif
121
122 celt_sig in_mem[1]; /* Size = channels*mode->overlap */
123 /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */
124 /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */
125 /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */
126 /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */
127};
128
129int celt_encoder_get_size(int channels)
130{
131 CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
132 return opus_custom_encoder_get_size(mode, channels);
133}
134
135OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels)
136{
137 int size = sizeof(struct CELTEncoder)
138 + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */
139 + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */
140 + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */
141 /* opus_val16 oldLogE[channels*mode->nbEBands]; */
142 /* opus_val16 oldLogE2[channels*mode->nbEBands]; */
143 return size;
144}
145
146#ifdef CUSTOM_MODES
147CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error)
148{
149 int ret;
150 CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels));
151 /* init will handle the NULL case */
152 ret = opus_custom_encoder_init(st, mode, channels);
153 if (ret != OPUS_OK)
154 {
155 opus_custom_encoder_destroy(st);
156 st = NULL;
157 }
158 if (error)
159 *error = ret;
160 return st;
161}
162#endif /* CUSTOM_MODES */
163
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000164static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode,
165 int channels, int arch)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000166{
167 if (channels < 0 || channels > 2)
168 return OPUS_BAD_ARG;
169
170 if (st==NULL || mode==NULL)
171 return OPUS_ALLOC_FAIL;
172
173 OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels));
174
175 st->mode = mode;
176 st->overlap = mode->overlap;
177 st->stream_channels = st->channels = channels;
178
179 st->upsample = 1;
180 st->start = 0;
181 st->end = st->mode->effEBands;
182 st->signalling = 1;
183
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000184 st->arch = arch;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000185
186 st->constrained_vbr = 1;
187 st->clip = 1;
188
189 st->bitrate = OPUS_BITRATE_MAX;
190 st->vbr = 0;
191 st->force_intra = 0;
192 st->complexity = 5;
193 st->lsb_depth=24;
194
195 opus_custom_encoder_ctl(st, OPUS_RESET_STATE);
196
197 return OPUS_OK;
198}
199
200#ifdef CUSTOM_MODES
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000201int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels)
202{
203 return opus_custom_encoder_init_arch(st, mode, channels, opus_select_arch());
204}
205#endif
206
207int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels,
208 int arch)
209{
210 int ret;
211 ret = opus_custom_encoder_init_arch(st,
212 opus_custom_mode_create(48000, 960, NULL), channels, arch);
213 if (ret != OPUS_OK)
214 return ret;
215 st->upsample = resampling_factor(sampling_rate);
216 return OPUS_OK;
217}
218
219#ifdef CUSTOM_MODES
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000220void opus_custom_encoder_destroy(CELTEncoder *st)
221{
222 opus_free(st);
223}
224#endif /* CUSTOM_MODES */
225
226
227static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C,
228 opus_val16 *tf_estimate, int *tf_chan)
229{
230 int i;
231 VARDECL(opus_val16, tmp);
232 opus_val32 mem0,mem1;
233 int is_transient = 0;
234 opus_int32 mask_metric = 0;
235 int c;
236 opus_val16 tf_max;
237 int len2;
238 /* Table of 6*64/x, trained on real data to minimize the average error */
239 static const unsigned char inv_table[128] = {
240 255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25,
241 23, 22, 21, 20, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12,
242 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8,
243 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6,
244 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5,
245 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
246 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,
247 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
248 };
249 SAVE_STACK;
250 ALLOC(tmp, len, opus_val16);
251
252 len2=len/2;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000253 for (c=0;c<C;c++)
254 {
255 opus_val32 mean;
256 opus_int32 unmask=0;
257 opus_val32 norm;
258 opus_val16 maxE;
259 mem0=0;
260 mem1=0;
261 /* High-pass filter: (1 - 2*z^-1 + z^-2) / (1 - z^-1 + .5*z^-2) */
262 for (i=0;i<len;i++)
263 {
264 opus_val32 x,y;
265 x = SHR32(in[i+c*len],SIG_SHIFT);
266 y = ADD32(mem0, x);
267#ifdef FIXED_POINT
268 mem0 = mem1 + y - SHL32(x,1);
269 mem1 = x - SHR32(y,1);
270#else
271 mem0 = mem1 + y - 2*x;
272 mem1 = x - .5f*y;
273#endif
274 tmp[i] = EXTRACT16(SHR32(y,2));
275 /*printf("%f ", tmp[i]);*/
276 }
277 /*printf("\n");*/
278 /* First few samples are bad because we don't propagate the memory */
279 for (i=0;i<12;i++)
280 tmp[i] = 0;
281
282#ifdef FIXED_POINT
283 /* Normalize tmp to max range */
284 {
285 int shift=0;
286 shift = 14-celt_ilog2(1+celt_maxabs16(tmp, len));
287 if (shift!=0)
288 {
289 for (i=0;i<len;i++)
290 tmp[i] = SHL16(tmp[i], shift);
291 }
292 }
293#endif
294
295 mean=0;
296 mem0=0;
297 /* Grouping by two to reduce complexity */
298 /* Forward pass to compute the post-echo threshold*/
299 for (i=0;i<len2;i++)
300 {
301 opus_val16 x2 = PSHR32(MULT16_16(tmp[2*i],tmp[2*i]) + MULT16_16(tmp[2*i+1],tmp[2*i+1]),16);
302 mean += x2;
303#ifdef FIXED_POINT
304 /* FIXME: Use PSHR16() instead */
305 tmp[i] = mem0 + PSHR32(x2-mem0,4);
306#else
307 tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0);
308#endif
309 mem0 = tmp[i];
310 }
311
312 mem0=0;
313 maxE=0;
314 /* Backward pass to compute the pre-echo threshold */
315 for (i=len2-1;i>=0;i--)
316 {
317#ifdef FIXED_POINT
318 /* FIXME: Use PSHR16() instead */
319 tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3);
320#else
321 tmp[i] = mem0 + MULT16_16_P15(QCONST16(0.125f,15),tmp[i]-mem0);
322#endif
323 mem0 = tmp[i];
324 maxE = MAX16(maxE, mem0);
325 }
326 /*for (i=0;i<len2;i++)printf("%f ", tmp[i]/mean);printf("\n");*/
327
328 /* Compute the ratio of the "frame energy" over the harmonic mean of the energy.
329 This essentially corresponds to a bitrate-normalized temporal noise-to-mask
330 ratio */
331
332 /* As a compromise with the old transient detector, frame energy is the
333 geometric mean of the energy and half the max */
334#ifdef FIXED_POINT
335 /* Costs two sqrt() to avoid overflows */
336 mean = MULT16_16(celt_sqrt(mean), celt_sqrt(MULT16_16(maxE,len2>>1)));
337#else
338 mean = celt_sqrt(mean * maxE*.5*len2);
339#endif
340 /* Inverse of the mean energy in Q15+6 */
341 norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1));
342 /* Compute harmonic mean discarding the unreliable boundaries
343 The data is smooth, so we only take 1/4th of the samples */
344 unmask=0;
345 for (i=12;i<len2-5;i+=4)
346 {
347 int id;
348#ifdef FIXED_POINT
349 id = IMAX(0,IMIN(127,MULT16_32_Q15(tmp[i],norm))); /* Do not round to nearest */
350#else
351 id = IMAX(0,IMIN(127,(int)floor(64*norm*tmp[i]))); /* Do not round to nearest */
352#endif
353 unmask += inv_table[id];
354 }
355 /*printf("%d\n", unmask);*/
356 /* Normalize, compensate for the 1/4th of the sample and the factor of 6 in the inverse table */
357 unmask = 64*unmask*4/(6*(len2-17));
358 if (unmask>mask_metric)
359 {
360 *tf_chan = c;
361 mask_metric = unmask;
362 }
363 }
364 is_transient = mask_metric>200;
365
366 /* Arbitrary metric for VBR boost */
367 tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42);
368 /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */
369 *tf_estimate = celt_sqrt(MAX16(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28)));
370 /*printf("%d %f\n", tf_max, mask_metric);*/
371 RESTORE_STACK;
372#ifdef FUZZING
373 is_transient = rand()&0x1;
374#endif
375 /*printf("%d %f %d\n", is_transient, (float)*tf_estimate, tf_max);*/
376 return is_transient;
377}
378
379/* Looks for sudden increases of energy to decide whether we need to patch
380 the transient decision */
381int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
382 int end, int C)
383{
384 int i, c;
385 opus_val32 mean_diff=0;
386 opus_val16 spread_old[26];
387 /* Apply an aggressive (-6 dB/Bark) spreading function to the old frame to
388 avoid false detection caused by irrelevant bands */
389 if (C==1)
390 {
391 spread_old[0] = oldE[0];
392 for (i=1;i<end;i++)
393 spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), oldE[i]);
394 } else {
395 spread_old[0] = MAX16(oldE[0],oldE[nbEBands]);
396 for (i=1;i<end;i++)
397 spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT),
398 MAX16(oldE[i],oldE[i+nbEBands]));
399 }
400 for (i=end-2;i>=0;i--)
401 spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT));
402 /* Compute mean increase */
403 c=0; do {
404 for (i=2;i<end-1;i++)
405 {
406 opus_val16 x1, x2;
407 x1 = MAX16(0, newE[i]);
408 x2 = MAX16(0, spread_old[i]);
409 mean_diff = ADD32(mean_diff, EXTEND32(MAX16(0, SUB16(x1, x2))));
410 }
411 } while (++c<C);
412 mean_diff = DIV32(mean_diff, C*(end-3));
413 /*printf("%f %f %d\n", mean_diff, max_diff, count);*/
414 return mean_diff > QCONST16(1.f, DB_SHIFT);
415}
416
417/** Apply window and compute the MDCT for all sub-frames and
418 all channels in a frame */
419static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in,
420 celt_sig * OPUS_RESTRICT out, int C, int CC, int LM, int upsample)
421{
422 const int overlap = OVERLAP(mode);
423 int N;
424 int B;
425 int shift;
426 int i, b, c;
427 if (shortBlocks)
428 {
429 B = shortBlocks;
430 N = mode->shortMdctSize;
431 shift = mode->maxLM;
432 } else {
433 B = 1;
434 N = mode->shortMdctSize<<LM;
435 shift = mode->maxLM-LM;
436 }
437 c=0; do {
438 for (b=0;b<B;b++)
439 {
440 /* Interleaving the sub-frames while doing the MDCTs */
441 clt_mdct_forward(&mode->mdct, in+c*(B*N+overlap)+b*N, &out[b+c*N*B], mode->window, overlap, shift, B);
442 }
443 } while (++c<CC);
444 if (CC==2&&C==1)
445 {
446 for (i=0;i<B*N;i++)
447 out[i] = ADD32(HALF32(out[i]), HALF32(out[B*N+i]));
448 }
449 if (upsample != 1)
450 {
451 c=0; do
452 {
453 int bound = B*N/upsample;
454 for (i=0;i<bound;i++)
455 out[c*B*N+i] *= upsample;
456 for (;i<B*N;i++)
457 out[c*B*N+i] = 0;
458 } while (++c<C);
459 }
460}
461
462
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000463void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000464 int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip)
465{
466 int i;
467 opus_val16 coef0;
468 celt_sig m;
469 int Nu;
470
471 coef0 = coef[0];
472
473
474 Nu = N/upsample;
475 if (upsample!=1)
476 {
477 for (i=0;i<N;i++)
478 inp[i] = 0;
479 }
480 for (i=0;i<Nu;i++)
481 {
482 celt_sig x;
483
484 x = SCALEIN(pcmp[CC*i]);
485#ifndef FIXED_POINT
486 /* Replace NaNs with zeros */
487 if (!(x==x))
488 x = 0;
489#endif
490 inp[i*upsample] = x;
491 }
492
493#ifndef FIXED_POINT
494 if (clip)
495 {
496 /* Clip input to avoid encoding non-portable files */
497 for (i=0;i<Nu;i++)
498 inp[i*upsample] = MAX32(-65536.f, MIN32(65536.f,inp[i*upsample]));
499 }
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000500#else
501 (void)clip; /* Avoids a warning about clip being unused. */
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000502#endif
503 m = *mem;
504#ifdef CUSTOM_MODES
505 if (coef[1] != 0)
506 {
507 opus_val16 coef1 = coef[1];
508 opus_val16 coef2 = coef[2];
509 for (i=0;i<N;i++)
510 {
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000511 celt_sig x, tmp;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000512 x = inp[i];
513 /* Apply pre-emphasis */
514 tmp = MULT16_16(coef2, x);
515 inp[i] = tmp + m;
516 m = MULT16_32_Q15(coef1, inp[i]) - MULT16_32_Q15(coef0, tmp);
517 }
518 } else
519#endif
520 {
521 for (i=0;i<N;i++)
522 {
523 celt_sig x;
524 x = SHL32(inp[i], SIG_SHIFT);
525 /* Apply pre-emphasis */
526 inp[i] = x + m;
527 m = - MULT16_32_Q15(coef0, x);
528 }
529 }
530 *mem = m;
531}
532
533
534
535static opus_val32 l1_metric(const celt_norm *tmp, int N, int LM, opus_val16 bias)
536{
537 int i;
538 opus_val32 L1;
539 L1 = 0;
540 for (i=0;i<N;i++)
541 L1 += EXTEND32(ABS16(tmp[i]));
542 /* When in doubt, prefer good freq resolution */
543 L1 = MAC16_32_Q15(L1, LM*bias, L1);
544 return L1;
545
546}
547
548static int tf_analysis(const CELTMode *m, int len, int isTransient,
549 int *tf_res, int lambda, celt_norm *X, int N0, int LM,
550 int *tf_sum, opus_val16 tf_estimate, int tf_chan)
551{
552 int i;
553 VARDECL(int, metric);
554 int cost0;
555 int cost1;
556 VARDECL(int, path0);
557 VARDECL(int, path1);
558 VARDECL(celt_norm, tmp);
559 VARDECL(celt_norm, tmp_1);
560 int sel;
561 int selcost[2];
562 int tf_select=0;
563 opus_val16 bias;
564
565 SAVE_STACK;
566 bias = MULT16_16_Q14(QCONST16(.04f,15), MAX16(-QCONST16(.25f,14), QCONST16(.5f,14)-tf_estimate));
567 /*printf("%f ", bias);*/
568
569 ALLOC(metric, len, int);
570 ALLOC(tmp, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm);
571 ALLOC(tmp_1, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm);
572 ALLOC(path0, len, int);
573 ALLOC(path1, len, int);
574
575 *tf_sum = 0;
576 for (i=0;i<len;i++)
577 {
578 int j, k, N;
579 int narrow;
580 opus_val32 L1, best_L1;
581 int best_level=0;
582 N = (m->eBands[i+1]-m->eBands[i])<<LM;
583 /* band is too narrow to be split down to LM=-1 */
584 narrow = (m->eBands[i+1]-m->eBands[i])==1;
585 for (j=0;j<N;j++)
586 tmp[j] = X[tf_chan*N0 + j+(m->eBands[i]<<LM)];
587 /* Just add the right channel if we're in stereo */
588 /*if (C==2)
589 for (j=0;j<N;j++)
590 tmp[j] = ADD16(SHR16(tmp[j], 1),SHR16(X[N0+j+(m->eBands[i]<<LM)], 1));*/
591 L1 = l1_metric(tmp, N, isTransient ? LM : 0, bias);
592 best_L1 = L1;
593 /* Check the -1 case for transients */
594 if (isTransient && !narrow)
595 {
596 for (j=0;j<N;j++)
597 tmp_1[j] = tmp[j];
598 haar1(tmp_1, N>>LM, 1<<LM);
599 L1 = l1_metric(tmp_1, N, LM+1, bias);
600 if (L1<best_L1)
601 {
602 best_L1 = L1;
603 best_level = -1;
604 }
605 }
606 /*printf ("%f ", L1);*/
607 for (k=0;k<LM+!(isTransient||narrow);k++)
608 {
609 int B;
610
611 if (isTransient)
612 B = (LM-k-1);
613 else
614 B = k+1;
615
616 haar1(tmp, N>>k, 1<<k);
617
618 L1 = l1_metric(tmp, N, B, bias);
619
620 if (L1 < best_L1)
621 {
622 best_L1 = L1;
623 best_level = k+1;
624 }
625 }
626 /*printf ("%d ", isTransient ? LM-best_level : best_level);*/
627 /* metric is in Q1 to be able to select the mid-point (-0.5) for narrower bands */
628 if (isTransient)
629 metric[i] = 2*best_level;
630 else
631 metric[i] = -2*best_level;
632 *tf_sum += (isTransient ? LM : 0) - metric[i]/2;
633 /* For bands that can't be split to -1, set the metric to the half-way point to avoid
634 biasing the decision */
635 if (narrow && (metric[i]==0 || metric[i]==-2*LM))
636 metric[i]-=1;
637 /*printf("%d ", metric[i]);*/
638 }
639 /*printf("\n");*/
640 /* Search for the optimal tf resolution, including tf_select */
641 tf_select = 0;
642 for (sel=0;sel<2;sel++)
643 {
644 cost0 = 0;
645 cost1 = isTransient ? 0 : lambda;
646 for (i=1;i<len;i++)
647 {
648 int curr0, curr1;
649 curr0 = IMIN(cost0, cost1 + lambda);
650 curr1 = IMIN(cost0 + lambda, cost1);
651 cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]);
652 cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]);
653 }
654 cost0 = IMIN(cost0, cost1);
655 selcost[sel]=cost0;
656 }
657 /* For now, we're conservative and only allow tf_select=1 for transients.
658 * If tests confirm it's useful for non-transients, we could allow it. */
659 if (selcost[1]<selcost[0] && isTransient)
660 tf_select=1;
661 cost0 = 0;
662 cost1 = isTransient ? 0 : lambda;
663 /* Viterbi forward pass */
664 for (i=1;i<len;i++)
665 {
666 int curr0, curr1;
667 int from0, from1;
668
669 from0 = cost0;
670 from1 = cost1 + lambda;
671 if (from0 < from1)
672 {
673 curr0 = from0;
674 path0[i]= 0;
675 } else {
676 curr0 = from1;
677 path0[i]= 1;
678 }
679
680 from0 = cost0 + lambda;
681 from1 = cost1;
682 if (from0 < from1)
683 {
684 curr1 = from0;
685 path1[i]= 0;
686 } else {
687 curr1 = from1;
688 path1[i]= 1;
689 }
690 cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]);
691 cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]);
692 }
693 tf_res[len-1] = cost0 < cost1 ? 0 : 1;
694 /* Viterbi backward pass to check the decisions */
695 for (i=len-2;i>=0;i--)
696 {
697 if (tf_res[i+1] == 1)
698 tf_res[i] = path1[i+1];
699 else
700 tf_res[i] = path0[i+1];
701 }
702 /*printf("%d %f\n", *tf_sum, tf_estimate);*/
703 RESTORE_STACK;
704#ifdef FUZZING
705 tf_select = rand()&0x1;
706 tf_res[0] = rand()&0x1;
707 for (i=1;i<len;i++)
708 tf_res[i] = tf_res[i-1] ^ ((rand()&0xF) == 0);
709#endif
710 return tf_select;
711}
712
713static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, int tf_select, ec_enc *enc)
714{
715 int curr, i;
716 int tf_select_rsv;
717 int tf_changed;
718 int logp;
719 opus_uint32 budget;
720 opus_uint32 tell;
721 budget = enc->storage*8;
722 tell = ec_tell(enc);
723 logp = isTransient ? 2 : 4;
724 /* Reserve space to code the tf_select decision. */
725 tf_select_rsv = LM>0 && tell+logp+1 <= budget;
726 budget -= tf_select_rsv;
727 curr = tf_changed = 0;
728 for (i=start;i<end;i++)
729 {
730 if (tell+logp<=budget)
731 {
732 ec_enc_bit_logp(enc, tf_res[i] ^ curr, logp);
733 tell = ec_tell(enc);
734 curr = tf_res[i];
735 tf_changed |= curr;
736 }
737 else
738 tf_res[i] = curr;
739 logp = isTransient ? 4 : 5;
740 }
741 /* Only code tf_select if it would actually make a difference. */
742 if (tf_select_rsv &&
743 tf_select_table[LM][4*isTransient+0+tf_changed]!=
744 tf_select_table[LM][4*isTransient+2+tf_changed])
745 ec_enc_bit_logp(enc, tf_select, 1);
746 else
747 tf_select = 0;
748 for (i=start;i<end;i++)
749 tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
750 /*for(i=0;i<end;i++)printf("%d ", isTransient ? tf_res[i] : LM+tf_res[i]);printf("\n");*/
751}
752
753
754static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
755 const opus_val16 *bandLogE, int end, int LM, int C, int N0,
756 AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate,
757 int intensity, opus_val16 surround_trim)
758{
759 int i;
760 opus_val32 diff=0;
761 int c;
762 int trim_index = 5;
763 opus_val16 trim = QCONST16(5.f, 8);
764 opus_val16 logXC, logXC2;
765 if (C==2)
766 {
767 opus_val16 sum = 0; /* Q10 */
768 opus_val16 minXC; /* Q10 */
769 /* Compute inter-channel correlation for low frequencies */
770 for (i=0;i<8;i++)
771 {
772 int j;
773 opus_val32 partial = 0;
774 for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
775 partial = MAC16_16(partial, X[j], X[N0+j]);
776 sum = ADD16(sum, EXTRACT16(SHR32(partial, 18)));
777 }
778 sum = MULT16_16_Q15(QCONST16(1.f/8, 15), sum);
779 sum = MIN16(QCONST16(1.f, 10), ABS16(sum));
780 minXC = sum;
781 for (i=8;i<intensity;i++)
782 {
783 int j;
784 opus_val32 partial = 0;
785 for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
786 partial = MAC16_16(partial, X[j], X[N0+j]);
787 minXC = MIN16(minXC, ABS16(EXTRACT16(SHR32(partial, 18))));
788 }
789 minXC = MIN16(QCONST16(1.f, 10), ABS16(minXC));
790 /*printf ("%f\n", sum);*/
791 if (sum > QCONST16(.995f,10))
792 trim_index-=4;
793 else if (sum > QCONST16(.92f,10))
794 trim_index-=3;
795 else if (sum > QCONST16(.85f,10))
796 trim_index-=2;
797 else if (sum > QCONST16(.8f,10))
798 trim_index-=1;
799 /* mid-side savings estimations based on the LF average*/
800 logXC = celt_log2(QCONST32(1.001f, 20)-MULT16_16(sum, sum));
801 /* mid-side savings estimations based on min correlation */
802 logXC2 = MAX16(HALF16(logXC), celt_log2(QCONST32(1.001f, 20)-MULT16_16(minXC, minXC)));
803#ifdef FIXED_POINT
804 /* Compensate for Q20 vs Q14 input and convert output to Q8 */
805 logXC = PSHR32(logXC-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8);
806 logXC2 = PSHR32(logXC2-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8);
807#endif
808
809 trim += MAX16(-QCONST16(4.f, 8), MULT16_16_Q15(QCONST16(.75f,15),logXC));
810 *stereo_saving = MIN16(*stereo_saving + QCONST16(0.25f, 8), -HALF16(logXC2));
811 }
812
813 /* Estimate spectral tilt */
814 c=0; do {
815 for (i=0;i<end-1;i++)
816 {
817 diff += bandLogE[i+c*m->nbEBands]*(opus_int32)(2+2*i-end);
818 }
819 } while (++c<C);
820 diff /= C*(end-1);
821 /*printf("%f\n", diff);*/
822 if (diff > QCONST16(2.f, DB_SHIFT))
823 trim_index--;
824 if (diff > QCONST16(8.f, DB_SHIFT))
825 trim_index--;
826 if (diff < -QCONST16(4.f, DB_SHIFT))
827 trim_index++;
828 if (diff < -QCONST16(10.f, DB_SHIFT))
829 trim_index++;
830 trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 ));
831 trim -= SHR16(surround_trim, DB_SHIFT-8);
832 trim -= 2*SHR16(tf_estimate, 14-8);
833#ifndef DISABLE_FLOAT_API
834 if (analysis->valid)
835 {
tlegrand@google.com3c3902f2013-12-09 08:35:25 +0000836 trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8),
837 (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f))));
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +0000838 }
839#endif
840
841#ifdef FIXED_POINT
842 trim_index = PSHR32(trim, 8);
843#else
844 trim_index = (int)floor(.5f+trim);
845#endif
846 if (trim_index<0)
847 trim_index = 0;
848 if (trim_index>10)
849 trim_index = 10;
850 /*printf("%d\n", trim_index);*/
851#ifdef FUZZING
852 trim_index = rand()%11;
853#endif
854 return trim_index;
855}
856
857static int stereo_analysis(const CELTMode *m, const celt_norm *X,
858 int LM, int N0)
859{
860 int i;
861 int thetas;
862 opus_val32 sumLR = EPSILON, sumMS = EPSILON;
863
864 /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */
865 for (i=0;i<13;i++)
866 {
867 int j;
868 for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
869 {
870 opus_val32 L, R, M, S;
871 /* We cast to 32-bit first because of the -32768 case */
872 L = EXTEND32(X[j]);
873 R = EXTEND32(X[N0+j]);
874 M = ADD32(L, R);
875 S = SUB32(L, R);
876 sumLR = ADD32(sumLR, ADD32(ABS32(L), ABS32(R)));
877 sumMS = ADD32(sumMS, ADD32(ABS32(M), ABS32(S)));
878 }
879 }
880 sumMS = MULT16_32_Q15(QCONST16(0.707107f, 15), sumMS);
881 thetas = 13;
882 /* We don't need thetas for lower bands with LM<=1 */
883 if (LM<=1)
884 thetas -= 8;
885 return MULT16_32_Q15((m->eBands[13]<<(LM+1))+thetas, sumMS)
886 > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR);
887}
888
889static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2,
890 int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN,
891 int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM,
892 int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc)
893{
894 int i, c;
895 opus_int32 tot_boost=0;
896 opus_val16 maxDepth;
897 VARDECL(opus_val16, follower);
898 VARDECL(opus_val16, noise_floor);
899 SAVE_STACK;
900 ALLOC(follower, C*nbEBands, opus_val16);
901 ALLOC(noise_floor, C*nbEBands, opus_val16);
902 for (i=0;i<nbEBands;i++)
903 offsets[i] = 0;
904 /* Dynamic allocation code */
905 maxDepth=-QCONST16(31.9f, DB_SHIFT);
906 for (i=0;i<end;i++)
907 {
908 /* Noise floor must take into account eMeans, the depth, the width of the bands
909 and the preemphasis filter (approx. square of bark band ID) */
910 noise_floor[i] = MULT16_16(QCONST16(0.0625f, DB_SHIFT),logN[i])
911 +QCONST16(.5f,DB_SHIFT)+SHL16(9-lsb_depth,DB_SHIFT)-SHL16(eMeans[i],6)
912 +MULT16_16(QCONST16(.0062,DB_SHIFT),(i+5)*(i+5));
913 }
914 c=0;do
915 {
916 for (i=0;i<end;i++)
917 maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]);
918 } while (++c<C);
919 /* Make sure that dynamic allocation can't make us bust the budget */
920 if (effectiveBytes > 50 && LM>=1 && !lfe)
921 {
922 int last=0;
923 c=0;do
924 {
925 follower[c*nbEBands] = bandLogE2[c*nbEBands];
926 for (i=1;i<end;i++)
927 {
928 /* The last band to be at least 3 dB higher than the previous one
929 is the last we'll consider. Otherwise, we run into problems on
930 bandlimited signals. */
931 if (bandLogE2[c*nbEBands+i] > bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT))
932 last=i;
933 follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]);
934 }
935 for (i=last-1;i>=0;i--)
936 follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i], MIN16(follower[c*nbEBands+i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i]));
937 for (i=0;i<end;i++)
938 follower[c*nbEBands+i] = MAX16(follower[c*nbEBands+i], noise_floor[i]);
939 } while (++c<C);
940 if (C==2)
941 {
942 for (i=start;i<end;i++)
943 {
944 /* Consider 24 dB "cross-talk" */
945 follower[nbEBands+i] = MAX16(follower[nbEBands+i], follower[ i]-QCONST16(4.f,DB_SHIFT));
946 follower[ i] = MAX16(follower[ i], follower[nbEBands+i]-QCONST16(4.f,DB_SHIFT));
947 follower[i] = HALF16(MAX16(0, bandLogE[i]-follower[i]) + MAX16(0, bandLogE[nbEBands+i]-follower[nbEBands+i]));
948 }
949 } else {
950 for (i=start;i<end;i++)
951 {
952 follower[i] = MAX16(0, bandLogE[i]-follower[i]);
953 }
954 }
955 for (i=start;i<end;i++)
956 follower[i] = MAX16(follower[i], surround_dynalloc[i]);
957 /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */
958 if ((!vbr || constrained_vbr)&&!isTransient)
959 {
960 for (i=start;i<end;i++)
961 follower[i] = HALF16(follower[i]);
962 }
963 for (i=start;i<end;i++)
964 {
965 int width;
966 int boost;
967 int boost_bits;
968
969 if (i<8)
970 follower[i] *= 2;
971 if (i>=12)
972 follower[i] = HALF16(follower[i]);
973 follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT));
974
975 width = C*(eBands[i+1]-eBands[i])<<LM;
976 if (width<6)
977 {
978 boost = (int)SHR32(EXTEND32(follower[i]),DB_SHIFT);
979 boost_bits = boost*width<<BITRES;
980 } else if (width > 48) {
981 boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT);
982 boost_bits = (boost*width<<BITRES)/8;
983 } else {
984 boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT);
985 boost_bits = boost*6<<BITRES;
986 }
987 /* For CBR and non-transient CVBR frames, limit dynalloc to 1/4 of the bits */
988 if ((!vbr || (constrained_vbr&&!isTransient))
989 && (tot_boost+boost_bits)>>BITRES>>3 > effectiveBytes/4)
990 {
991 opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3);
992 offsets[i] = cap-tot_boost;
993 tot_boost = cap;
994 break;
995 } else {
996 offsets[i] = boost;
997 tot_boost += boost_bits;
998 }
999 }
1000 }
1001 *tot_boost_ = tot_boost;
1002 RESTORE_STACK;
1003 return maxDepth;
1004}
1005
1006
1007static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N,
1008 int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes)
1009{
1010 int c;
1011 VARDECL(celt_sig, _pre);
1012 celt_sig *pre[2];
1013 const CELTMode *mode;
1014 int pitch_index;
1015 opus_val16 gain1;
1016 opus_val16 pf_threshold;
1017 int pf_on;
1018 int qg;
1019 SAVE_STACK;
1020
1021 mode = st->mode;
1022 ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig);
1023
1024 pre[0] = _pre;
1025 pre[1] = _pre + (N+COMBFILTER_MAXPERIOD);
1026
1027
1028 c=0; do {
1029 OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD);
1030 OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N);
1031 } while (++c<CC);
1032
1033 if (enabled)
1034 {
1035 VARDECL(opus_val16, pitch_buf);
1036 ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, opus_val16);
1037
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001038 pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC, st->arch);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001039 /* Don't search for the fir last 1.5 octave of the range because
1040 there's too many false-positives due to short-term correlation */
1041 pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N,
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001042 COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index,
1043 st->arch);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001044 pitch_index = COMBFILTER_MAXPERIOD-pitch_index;
1045
1046 gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD,
1047 N, &pitch_index, st->prefilter_period, st->prefilter_gain);
1048 if (pitch_index > COMBFILTER_MAXPERIOD-2)
1049 pitch_index = COMBFILTER_MAXPERIOD-2;
1050 gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1);
1051 /*printf("%d %d %f %f\n", pitch_change, pitch_index, gain1, st->analysis.tonality);*/
1052 if (st->loss_rate>2)
1053 gain1 = HALF32(gain1);
1054 if (st->loss_rate>4)
1055 gain1 = HALF32(gain1);
1056 if (st->loss_rate>8)
1057 gain1 = 0;
1058 } else {
1059 gain1 = 0;
1060 pitch_index = COMBFILTER_MINPERIOD;
1061 }
1062
1063 /* Gain threshold for enabling the prefilter/postfilter */
1064 pf_threshold = QCONST16(.2f,15);
1065
1066 /* Adjusting the threshold based on rate and continuity */
1067 if (abs(pitch_index-st->prefilter_period)*10>pitch_index)
1068 pf_threshold += QCONST16(.2f,15);
1069 if (nbAvailableBytes<25)
1070 pf_threshold += QCONST16(.1f,15);
1071 if (nbAvailableBytes<35)
1072 pf_threshold += QCONST16(.1f,15);
1073 if (st->prefilter_gain > QCONST16(.4f,15))
1074 pf_threshold -= QCONST16(.1f,15);
1075 if (st->prefilter_gain > QCONST16(.55f,15))
1076 pf_threshold -= QCONST16(.1f,15);
1077
1078 /* Hard threshold at 0.2 */
1079 pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15));
1080 if (gain1<pf_threshold)
1081 {
1082 gain1 = 0;
1083 pf_on = 0;
1084 qg = 0;
1085 } else {
1086 /*This block is not gated by a total bits check only because
1087 of the nbAvailableBytes check above.*/
1088 if (ABS16(gain1-st->prefilter_gain)<QCONST16(.1f,15))
1089 gain1=st->prefilter_gain;
1090
1091#ifdef FIXED_POINT
1092 qg = ((gain1+1536)>>10)/3-1;
1093#else
1094 qg = (int)floor(.5f+gain1*32/3)-1;
1095#endif
1096 qg = IMAX(0, IMIN(7, qg));
1097 gain1 = QCONST16(0.09375f,15)*(qg+1);
1098 pf_on = 1;
1099 }
1100 /*printf("%d %f\n", pitch_index, gain1);*/
1101
1102 c=0; do {
1103 int offset = mode->shortMdctSize-st->overlap;
1104 st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD);
1105 OPUS_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap);
1106 if (offset)
1107 comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD,
1108 st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain,
1109 st->prefilter_tapset, st->prefilter_tapset, NULL, 0);
1110
1111 comb_filter(in+c*(N+st->overlap)+st->overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset,
1112 st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1,
1113 st->prefilter_tapset, prefilter_tapset, mode->window, st->overlap);
1114 OPUS_COPY(st->in_mem+c*(st->overlap), in+c*(N+st->overlap)+N, st->overlap);
1115
1116 if (N>COMBFILTER_MAXPERIOD)
1117 {
1118 OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD);
1119 } else {
1120 OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N);
1121 OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
1122 }
1123 } while (++c<CC);
1124
1125 RESTORE_STACK;
1126 *gain = gain1;
1127 *pitch = pitch_index;
1128 *qgain = qg;
1129 return pf_on;
1130}
1131
1132static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 base_target,
1133 int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity,
1134 int constrained_vbr, opus_val16 stereo_saving, int tot_boost,
1135 opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth,
1136 int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking,
1137 opus_val16 temporal_vbr)
1138{
1139 /* The target rate in 8th bits per frame */
1140 opus_int32 target;
1141 int coded_bins;
1142 int coded_bands;
1143 opus_val16 tf_calibration;
1144 int nbEBands;
1145 const opus_int16 *eBands;
1146
1147 nbEBands = mode->nbEBands;
1148 eBands = mode->eBands;
1149
1150 coded_bands = lastCodedBands ? lastCodedBands : nbEBands;
1151 coded_bins = eBands[coded_bands]<<LM;
1152 if (C==2)
1153 coded_bins += eBands[IMIN(intensity, coded_bands)]<<LM;
1154
1155 target = base_target;
1156
1157 /*printf("%f %f %f %f %d %d ", st->analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/
1158#ifndef DISABLE_FLOAT_API
1159 if (analysis->valid && analysis->activity<.4)
1160 target -= (opus_int32)((coded_bins<<BITRES)*(.4f-analysis->activity));
1161#endif
1162 /* Stereo savings */
1163 if (C==2)
1164 {
1165 int coded_stereo_bands;
1166 int coded_stereo_dof;
1167 opus_val16 max_frac;
1168 coded_stereo_bands = IMIN(intensity, coded_bands);
1169 coded_stereo_dof = (eBands[coded_stereo_bands]<<LM)-coded_stereo_bands;
1170 /* Maximum fraction of the bits we can save if the signal is mono. */
1171 max_frac = DIV32_16(MULT16_16(QCONST16(0.8f, 15), coded_stereo_dof), coded_bins);
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001172 stereo_saving = MIN16(stereo_saving, QCONST16(1.f, 8));
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001173 /*printf("%d %d %d ", coded_stereo_dof, coded_bins, tot_boost);*/
1174 target -= (opus_int32)MIN32(MULT16_32_Q15(max_frac,target),
1175 SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8));
1176 }
1177 /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */
1178 target += tot_boost-(16<<LM);
1179 /* Apply transient boost, compensating for average boost. */
1180 tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ?
1181 QCONST16(0.02f,14) : QCONST16(0.04f,14);
1182 target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1);
1183
1184#ifndef DISABLE_FLOAT_API
1185 /* Apply tonality boost */
1186 if (analysis->valid && !lfe)
1187 {
1188 opus_int32 tonal_target;
1189 float tonal;
1190
1191 /* Tonality boost (compensating for the average). */
1192 tonal = MAX16(0.f,analysis->tonality-.15f)-0.09f;
1193 tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal);
1194 if (pitch_change)
1195 tonal_target += (opus_int32)((coded_bins<<BITRES)*.8f);
1196 /*printf("%f %f ", analysis->tonality, tonal);*/
1197 target = tonal_target;
1198 }
1199#endif
1200
1201 if (has_surround_mask&&!lfe)
1202 {
1203 opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<<BITRES), DB_SHIFT);
1204 /*printf("%f %d %d %d %d %d %d ", surround_masking, coded_bins, st->end, st->intensity, surround_target, target, st->bitrate);*/
1205 target = IMAX(target/4, surround_target);
1206 }
1207
1208 {
1209 opus_int32 floor_depth;
1210 int bins;
1211 bins = eBands[nbEBands-2]<<LM;
1212 /*floor_depth = SHR32(MULT16_16((C*bins<<BITRES),celt_log2(SHL32(MAX16(1,sample_max),13))), DB_SHIFT);*/
1213 floor_depth = (opus_int32)SHR32(MULT16_16((C*bins<<BITRES),maxDepth), DB_SHIFT);
1214 floor_depth = IMAX(floor_depth, target>>2);
1215 target = IMIN(target, floor_depth);
1216 /*printf("%f %d\n", maxDepth, floor_depth);*/
1217 }
1218
1219 if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000))
1220 {
1221 opus_val16 rate_factor;
1222#ifdef FIXED_POINT
1223 rate_factor = MAX16(0,(bitrate-32000));
1224#else
1225 rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000));
1226#endif
1227 if (constrained_vbr)
1228 rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15));
1229 target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, target-base_target);
1230
1231 }
1232
1233 if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14))
1234 {
1235 opus_val16 amount;
1236 opus_val16 tvbr_factor;
1237 amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate)));
1238 tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT);
1239 target += (opus_int32)MULT16_32_Q15(tvbr_factor, target);
1240 }
1241
1242 /* Don't allow more than doubling the rate */
1243 target = IMIN(2*base_target, target);
1244
1245 return target;
1246}
1247
1248int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc)
1249{
1250 int i, c, N;
1251 opus_int32 bits;
1252 ec_enc _enc;
1253 VARDECL(celt_sig, in);
1254 VARDECL(celt_sig, freq);
1255 VARDECL(celt_norm, X);
1256 VARDECL(celt_ener, bandE);
1257 VARDECL(opus_val16, bandLogE);
1258 VARDECL(opus_val16, bandLogE2);
1259 VARDECL(int, fine_quant);
1260 VARDECL(opus_val16, error);
1261 VARDECL(int, pulses);
1262 VARDECL(int, cap);
1263 VARDECL(int, offsets);
1264 VARDECL(int, fine_priority);
1265 VARDECL(int, tf_res);
1266 VARDECL(unsigned char, collapse_masks);
1267 celt_sig *prefilter_mem;
1268 opus_val16 *oldBandE, *oldLogE, *oldLogE2;
1269 int shortBlocks=0;
1270 int isTransient=0;
1271 const int CC = st->channels;
1272 const int C = st->stream_channels;
1273 int LM, M;
1274 int tf_select;
1275 int nbFilledBytes, nbAvailableBytes;
1276 int effEnd;
1277 int codedBands;
1278 int tf_sum;
1279 int alloc_trim;
1280 int pitch_index=COMBFILTER_MINPERIOD;
1281 opus_val16 gain1 = 0;
1282 int dual_stereo=0;
1283 int effectiveBytes;
1284 int dynalloc_logp;
1285 opus_int32 vbr_rate;
1286 opus_int32 total_bits;
1287 opus_int32 total_boost;
1288 opus_int32 balance;
1289 opus_int32 tell;
1290 int prefilter_tapset=0;
1291 int pf_on;
1292 int anti_collapse_rsv;
1293 int anti_collapse_on=0;
1294 int silence=0;
1295 int tf_chan = 0;
1296 opus_val16 tf_estimate;
1297 int pitch_change=0;
1298 opus_int32 tot_boost;
1299 opus_val32 sample_max;
1300 opus_val16 maxDepth;
1301 const OpusCustomMode *mode;
1302 int nbEBands;
1303 int overlap;
1304 const opus_int16 *eBands;
1305 int secondMdct;
1306 int signalBandwidth;
1307 int transient_got_disabled=0;
1308 opus_val16 surround_masking=0;
1309 opus_val16 temporal_vbr=0;
1310 opus_val16 surround_trim = 0;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001311 opus_int32 equiv_rate = 510000;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001312 VARDECL(opus_val16, surround_dynalloc);
1313 ALLOC_STACK;
1314
1315 mode = st->mode;
1316 nbEBands = mode->nbEBands;
1317 overlap = mode->overlap;
1318 eBands = mode->eBands;
1319 tf_estimate = 0;
1320 if (nbCompressedBytes<2 || pcm==NULL)
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001321 {
1322 RESTORE_STACK;
1323 return OPUS_BAD_ARG;
1324 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001325
1326 frame_size *= st->upsample;
1327 for (LM=0;LM<=mode->maxLM;LM++)
1328 if (mode->shortMdctSize<<LM==frame_size)
1329 break;
1330 if (LM>mode->maxLM)
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001331 {
1332 RESTORE_STACK;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001333 return OPUS_BAD_ARG;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001334 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001335 M=1<<LM;
1336 N = M*mode->shortMdctSize;
1337
1338 prefilter_mem = st->in_mem+CC*(st->overlap);
1339 oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD));
1340 oldLogE = oldBandE + CC*nbEBands;
1341 oldLogE2 = oldLogE + CC*nbEBands;
1342
1343 if (enc==NULL)
1344 {
1345 tell=1;
1346 nbFilledBytes=0;
1347 } else {
1348 tell=ec_tell(enc);
1349 nbFilledBytes=(tell+4)>>3;
1350 }
1351
1352#ifdef CUSTOM_MODES
1353 if (st->signalling && enc==NULL)
1354 {
1355 int tmp = (mode->effEBands-st->end)>>1;
1356 st->end = IMAX(1, mode->effEBands-tmp);
1357 compressed[0] = tmp<<5;
1358 compressed[0] |= LM<<3;
1359 compressed[0] |= (C==2)<<2;
1360 /* Convert "standard mode" to Opus header */
1361 if (mode->Fs==48000 && mode->shortMdctSize==120)
1362 {
1363 int c0 = toOpus(compressed[0]);
1364 if (c0<0)
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001365 {
1366 RESTORE_STACK;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001367 return OPUS_BAD_ARG;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001368 }
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001369 compressed[0] = c0;
1370 }
1371 compressed++;
1372 nbCompressedBytes--;
1373 }
1374#else
1375 celt_assert(st->signalling==0);
1376#endif
1377
1378 /* Can't produce more than 1275 output bytes */
1379 nbCompressedBytes = IMIN(nbCompressedBytes,1275);
1380 nbAvailableBytes = nbCompressedBytes - nbFilledBytes;
1381
1382 if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX)
1383 {
1384 opus_int32 den=mode->Fs>>BITRES;
1385 vbr_rate=(st->bitrate*frame_size+(den>>1))/den;
1386#ifdef CUSTOM_MODES
1387 if (st->signalling)
1388 vbr_rate -= 8<<BITRES;
1389#endif
1390 effectiveBytes = vbr_rate>>(3+BITRES);
1391 } else {
1392 opus_int32 tmp;
1393 vbr_rate = 0;
1394 tmp = st->bitrate*frame_size;
1395 if (tell>1)
1396 tmp += tell;
1397 if (st->bitrate!=OPUS_BITRATE_MAX)
1398 nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes,
1399 (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling));
1400 effectiveBytes = nbCompressedBytes;
1401 }
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001402 if (st->bitrate != OPUS_BITRATE_MAX)
1403 equiv_rate = st->bitrate - (40*C+20)*((400>>LM) - 50);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001404
1405 if (enc==NULL)
1406 {
1407 ec_enc_init(&_enc, compressed, nbCompressedBytes);
1408 enc = &_enc;
1409 }
1410
1411 if (vbr_rate>0)
1412 {
1413 /* Computes the max bit-rate allowed in VBR mode to avoid violating the
1414 target rate and buffering.
1415 We must do this up front so that bust-prevention logic triggers
1416 correctly if we don't have enough bits. */
1417 if (st->constrained_vbr)
1418 {
1419 opus_int32 vbr_bound;
1420 opus_int32 max_allowed;
1421 /* We could use any multiple of vbr_rate as bound (depending on the
1422 delay).
1423 This is clamped to ensure we use at least two bytes if the encoder
1424 was entirely empty, but to allow 0 in hybrid mode. */
1425 vbr_bound = vbr_rate;
1426 max_allowed = IMIN(IMAX(tell==1?2:0,
1427 (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)),
1428 nbAvailableBytes);
1429 if(max_allowed < nbAvailableBytes)
1430 {
1431 nbCompressedBytes = nbFilledBytes+max_allowed;
1432 nbAvailableBytes = max_allowed;
1433 ec_enc_shrink(enc, nbCompressedBytes);
1434 }
1435 }
1436 }
1437 total_bits = nbCompressedBytes*8;
1438
1439 effEnd = st->end;
1440 if (effEnd > mode->effEBands)
1441 effEnd = mode->effEBands;
1442
1443 ALLOC(in, CC*(N+st->overlap), celt_sig);
1444
1445 sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample));
1446 st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample);
1447 sample_max=MAX32(sample_max, st->overlap_max);
1448#ifdef FIXED_POINT
1449 silence = (sample_max==0);
1450#else
1451 silence = (sample_max <= (opus_val16)1/(1<<st->lsb_depth));
1452#endif
1453#ifdef FUZZING
1454 if ((rand()&0x3F)==0)
1455 silence = 1;
1456#endif
1457 if (tell==1)
1458 ec_enc_bit_logp(enc, silence, 15);
1459 else
1460 silence=0;
1461 if (silence)
1462 {
1463 /*In VBR mode there is no need to send more than the minimum. */
1464 if (vbr_rate>0)
1465 {
1466 effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2);
1467 total_bits=nbCompressedBytes*8;
1468 nbAvailableBytes=2;
1469 ec_enc_shrink(enc, nbCompressedBytes);
1470 }
1471 /* Pretend we've filled all the remaining bits with zeros
1472 (that's what the initialiser did anyway) */
1473 tell = nbCompressedBytes*8;
1474 enc->nbits_total+=tell-ec_tell(enc);
1475 }
1476 c=0; do {
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001477 celt_preemphasis(pcm+c, in+c*(N+st->overlap)+st->overlap, N, CC, st->upsample,
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001478 mode->preemph, st->preemph_memE+c, st->clip);
1479 } while (++c<CC);
1480
1481
1482
1483 /* Find pitch period and gain */
1484 {
1485 int enabled;
1486 int qg;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001487 enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && st->start==0 && !silence && !st->disable_pf
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001488 && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE);
1489
1490 prefilter_tapset = st->tapset_decision;
1491 pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes);
1492 if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3)
1493 && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period))
1494 pitch_change = 1;
1495 if (pf_on==0)
1496 {
1497 if(st->start==0 && tell+16<=total_bits)
1498 ec_enc_bit_logp(enc, 0, 1);
1499 } else {
1500 /*This block is not gated by a total bits check only because
1501 of the nbAvailableBytes check above.*/
1502 int octave;
1503 ec_enc_bit_logp(enc, 1, 1);
1504 pitch_index += 1;
1505 octave = EC_ILOG(pitch_index)-5;
1506 ec_enc_uint(enc, octave, 6);
1507 ec_enc_bits(enc, pitch_index-(16<<octave), 4+octave);
1508 pitch_index -= 1;
1509 ec_enc_bits(enc, qg, 3);
1510 ec_enc_icdf(enc, prefilter_tapset, tapset_icdf, 2);
1511 }
1512 }
1513
1514 isTransient = 0;
1515 shortBlocks = 0;
1516 if (st->complexity >= 1 && !st->lfe)
1517 {
1518 isTransient = transient_analysis(in, N+st->overlap, CC,
1519 &tf_estimate, &tf_chan);
1520 }
1521 if (LM>0 && ec_tell(enc)+3<=total_bits)
1522 {
1523 if (isTransient)
1524 shortBlocks = M;
1525 } else {
1526 isTransient = 0;
1527 transient_got_disabled=1;
1528 }
1529
1530 ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */
1531 ALLOC(bandE,nbEBands*CC, celt_ener);
1532 ALLOC(bandLogE,nbEBands*CC, opus_val16);
1533
1534 secondMdct = shortBlocks && st->complexity>=8;
1535 ALLOC(bandLogE2, C*nbEBands, opus_val16);
1536 if (secondMdct)
1537 {
1538 compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample);
1539 compute_band_energies(mode, freq, bandE, effEnd, C, M);
1540 amp2Log2(mode, effEnd, st->end, bandE, bandLogE2, C);
1541 for (i=0;i<C*nbEBands;i++)
1542 bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
1543 }
1544
1545 compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
1546 if (CC==2&&C==1)
1547 tf_chan = 0;
1548 compute_band_energies(mode, freq, bandE, effEnd, C, M);
1549
1550 if (st->lfe)
1551 {
1552 for (i=2;i<st->end;i++)
1553 {
1554 bandE[i] = IMIN(bandE[i], MULT16_32_Q15(QCONST16(1e-4f,15),bandE[0]));
1555 bandE[i] = MAX32(bandE[i], EPSILON);
1556 }
1557 }
1558 amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
1559
1560 ALLOC(surround_dynalloc, C*nbEBands, opus_val16);
1561 for(i=0;i<st->end;i++)
1562 surround_dynalloc[i] = 0;
1563 /* This computes how much masking takes place between surround channels */
1564 if (st->start==0&&st->energy_mask&&!st->lfe)
1565 {
1566 int mask_end;
1567 int midband;
1568 int count_dynalloc;
1569 opus_val32 mask_avg=0;
1570 opus_val32 diff=0;
1571 int count=0;
1572 mask_end = IMAX(2,st->lastCodedBands);
1573 for (c=0;c<C;c++)
1574 {
1575 for(i=0;i<mask_end;i++)
1576 {
1577 opus_val16 mask;
1578 mask = MAX16(MIN16(st->energy_mask[nbEBands*c+i],
1579 QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT));
1580 if (mask > 0)
1581 mask = HALF16(mask);
1582 mask_avg += MULT16_16(mask, eBands[i+1]-eBands[i]);
1583 count += eBands[i+1]-eBands[i];
1584 diff += MULT16_16(mask, 1+2*i-mask_end);
1585 }
1586 }
1587 mask_avg = DIV32_16(mask_avg,count);
1588 mask_avg += QCONST16(.2f, DB_SHIFT);
1589 diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end);
1590 /* Again, being conservative */
1591 diff = HALF32(diff);
1592 diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT));
1593 /* Find the band that's in the middle of the coded spectrum */
1594 for (midband=0;eBands[midband+1] < eBands[mask_end]/2;midband++);
1595 count_dynalloc=0;
1596 for(i=0;i<mask_end;i++)
1597 {
1598 opus_val32 lin;
1599 opus_val16 unmask;
1600 lin = mask_avg + diff*(i-midband);
1601 if (C==2)
1602 unmask = MAX16(st->energy_mask[i], st->energy_mask[nbEBands+i]);
1603 else
1604 unmask = st->energy_mask[i];
1605 unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT));
1606 unmask -= lin;
1607 if (unmask > QCONST16(.25f, DB_SHIFT))
1608 {
1609 surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT);
1610 count_dynalloc++;
1611 }
1612 }
1613 if (count_dynalloc>=3)
1614 {
1615 /* If we need dynalloc in many bands, it's probably because our
1616 initial masking rate was too low. */
1617 mask_avg += QCONST16(.25f, DB_SHIFT);
1618 if (mask_avg>0)
1619 {
1620 /* Something went really wrong in the original calculations,
1621 disabling masking. */
1622 mask_avg = 0;
1623 diff = 0;
1624 for(i=0;i<mask_end;i++)
1625 surround_dynalloc[i] = 0;
1626 } else {
1627 for(i=0;i<mask_end;i++)
1628 surround_dynalloc[i] = MAX16(0, surround_dynalloc[i]-QCONST16(.25f, DB_SHIFT));
1629 }
1630 }
1631 mask_avg += QCONST16(.2f, DB_SHIFT);
1632 /* Convert to 1/64th units used for the trim */
1633 surround_trim = 64*diff;
1634 /*printf("%d %d ", mask_avg, surround_trim);*/
1635 surround_masking = mask_avg;
1636 }
1637 /* Temporal VBR (but not for LFE) */
1638 if (!st->lfe)
1639 {
1640 opus_val16 follow=-QCONST16(10.0f,DB_SHIFT);
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001641 opus_val32 frame_avg=0;
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001642 opus_val16 offset = shortBlocks?HALF16(SHL16(LM, DB_SHIFT)):0;
1643 for(i=st->start;i<st->end;i++)
1644 {
1645 follow = MAX16(follow-QCONST16(1.f, DB_SHIFT), bandLogE[i]-offset);
1646 if (C==2)
1647 follow = MAX16(follow, bandLogE[i+nbEBands]-offset);
1648 frame_avg += follow;
1649 }
1650 frame_avg /= (st->end-st->start);
1651 temporal_vbr = SUB16(frame_avg,st->spec_avg);
1652 temporal_vbr = MIN16(QCONST16(3.f, DB_SHIFT), MAX16(-QCONST16(1.5f, DB_SHIFT), temporal_vbr));
1653 st->spec_avg += MULT16_16_Q15(QCONST16(.02f, 15), temporal_vbr);
1654 }
1655 /*for (i=0;i<21;i++)
1656 printf("%f ", bandLogE[i]);
1657 printf("\n");*/
1658
1659 if (!secondMdct)
1660 {
1661 for (i=0;i<C*nbEBands;i++)
1662 bandLogE2[i] = bandLogE[i];
1663 }
1664
1665 /* Last chance to catch any transient we might have missed in the
1666 time-domain analysis */
1667 if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe)
1668 {
1669 if (patch_transient_decision(bandLogE, oldBandE, nbEBands, st->end, C))
1670 {
1671 isTransient = 1;
1672 shortBlocks = M;
1673 compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
1674 compute_band_energies(mode, freq, bandE, effEnd, C, M);
1675 amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
1676 /* Compensate for the scaling of short vs long mdcts */
1677 for (i=0;i<C*nbEBands;i++)
1678 bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
1679 tf_estimate = QCONST16(.2f,14);
1680 }
1681 }
1682
1683 if (LM>0 && ec_tell(enc)+3<=total_bits)
1684 ec_enc_bit_logp(enc, isTransient, 3);
1685
1686 ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
1687
1688 /* Band normalisation */
1689 normalise_bands(mode, freq, X, bandE, effEnd, C, M);
1690
1691 ALLOC(tf_res, nbEBands, int);
1692 /* Disable variable tf resolution for hybrid and at very low bitrate */
1693 if (effectiveBytes>=15*C && st->start==0 && st->complexity>=2 && !st->lfe)
1694 {
1695 int lambda;
1696 if (effectiveBytes<40)
1697 lambda = 12;
1698 else if (effectiveBytes<60)
1699 lambda = 6;
1700 else if (effectiveBytes<100)
1701 lambda = 4;
1702 else
1703 lambda = 3;
1704 lambda*=2;
1705 tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan);
1706 for (i=effEnd;i<st->end;i++)
1707 tf_res[i] = tf_res[effEnd-1];
1708 } else {
1709 tf_sum = 0;
1710 for (i=0;i<st->end;i++)
1711 tf_res[i] = isTransient;
1712 tf_select=0;
1713 }
1714
1715 ALLOC(error, C*nbEBands, opus_val16);
1716 quant_coarse_energy(mode, st->start, st->end, effEnd, bandLogE,
1717 oldBandE, total_bits, error, enc,
1718 C, LM, nbAvailableBytes, st->force_intra,
1719 &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe);
1720
1721 tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc);
1722
1723 if (ec_tell(enc)+4<=total_bits)
1724 {
1725 if (st->lfe)
1726 {
1727 st->tapset_decision = 0;
1728 st->spread_decision = SPREAD_NORMAL;
1729 } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C || st->start != 0)
1730 {
1731 if (st->complexity == 0)
1732 st->spread_decision = SPREAD_NONE;
1733 else
1734 st->spread_decision = SPREAD_NORMAL;
1735 } else {
1736 /* Disable new spreading+tapset estimator until we can show it works
1737 better than the old one. So far it seems like spreading_decision()
1738 works best. */
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001739#if 0
1740 if (st->analysis.valid)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001741 {
1742 static const opus_val16 spread_thresholds[3] = {-QCONST16(.6f, 15), -QCONST16(.2f, 15), -QCONST16(.07f, 15)};
1743 static const opus_val16 spread_histeresis[3] = {QCONST16(.15f, 15), QCONST16(.07f, 15), QCONST16(.02f, 15)};
1744 static const opus_val16 tapset_thresholds[2] = {QCONST16(.0f, 15), QCONST16(.15f, 15)};
1745 static const opus_val16 tapset_histeresis[2] = {QCONST16(.1f, 15), QCONST16(.05f, 15)};
1746 st->spread_decision = hysteresis_decision(-st->analysis.tonality, spread_thresholds, spread_histeresis, 3, st->spread_decision);
1747 st->tapset_decision = hysteresis_decision(st->analysis.tonality_slope, tapset_thresholds, tapset_histeresis, 2, st->tapset_decision);
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001748 } else
1749#endif
1750 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001751 st->spread_decision = spreading_decision(mode, X,
1752 &st->tonal_average, st->spread_decision, &st->hf_average,
1753 &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M);
1754 }
1755 /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/
1756 /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/
1757 }
1758 ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5);
1759 }
1760
1761 ALLOC(offsets, nbEBands, int);
1762
1763 maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, st->start, st->end, C, offsets,
1764 st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr,
1765 eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc);
1766 /* For LFE, everything interesting is in the first band */
1767 if (st->lfe)
1768 offsets[0] = IMIN(8, effectiveBytes/3);
1769 ALLOC(cap, nbEBands, int);
1770 init_caps(mode,cap,LM,C);
1771
1772 dynalloc_logp = 6;
1773 total_bits<<=BITRES;
1774 total_boost = 0;
1775 tell = ec_tell_frac(enc);
1776 for (i=st->start;i<st->end;i++)
1777 {
1778 int width, quanta;
1779 int dynalloc_loop_logp;
1780 int boost;
1781 int j;
1782 width = C*(eBands[i+1]-eBands[i])<<LM;
1783 /* quanta is 6 bits, but no more than 1 bit/sample
1784 and no less than 1/8 bit/sample */
1785 quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
1786 dynalloc_loop_logp = dynalloc_logp;
1787 boost = 0;
1788 for (j = 0; tell+(dynalloc_loop_logp<<BITRES) < total_bits-total_boost
1789 && boost < cap[i]; j++)
1790 {
1791 int flag;
1792 flag = j<offsets[i];
1793 ec_enc_bit_logp(enc, flag, dynalloc_loop_logp);
1794 tell = ec_tell_frac(enc);
1795 if (!flag)
1796 break;
1797 boost += quanta;
1798 total_boost += quanta;
1799 dynalloc_loop_logp = 1;
1800 }
1801 /* Making dynalloc more likely */
1802 if (j)
1803 dynalloc_logp = IMAX(2, dynalloc_logp-1);
1804 offsets[i] = boost;
1805 }
1806
1807 if (C==2)
1808 {
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001809 static const opus_val16 intensity_thresholds[21]=
1810 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 off*/
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001811 { 1, 2, 3, 4, 5, 6, 7, 8,16,24,36,44,50,56,62,67,72,79,88,106,134};
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001812 static const opus_val16 intensity_histeresis[21]=
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001813 { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 6, 8, 8};
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001814
1815 /* Always use MS for 2.5 ms frames until we can do a better analysis */
1816 if (LM!=0)
1817 dual_stereo = stereo_analysis(mode, X, LM, N);
1818
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001819 st->intensity = hysteresis_decision((opus_val16)(equiv_rate/1000),
1820 intensity_thresholds, intensity_histeresis, 21, st->intensity);
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001821 st->intensity = IMIN(st->end,IMAX(st->start, st->intensity));
1822 }
1823
1824 alloc_trim = 5;
1825 if (tell+(6<<BITRES) <= total_bits - total_boost)
1826 {
1827 if (st->lfe)
1828 alloc_trim = 5;
1829 else
1830 alloc_trim = alloc_trim_analysis(mode, X, bandLogE,
1831 st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim);
1832 ec_enc_icdf(enc, alloc_trim, trim_icdf, 7);
1833 tell = ec_tell_frac(enc);
1834 }
1835
1836 /* Variable bitrate */
1837 if (vbr_rate>0)
1838 {
1839 opus_val16 alpha;
1840 opus_int32 delta;
1841 /* The target rate in 8th bits per frame */
1842 opus_int32 target, base_target;
1843 opus_int32 min_allowed;
1844 int lm_diff = mode->maxLM - LM;
1845
1846 /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms.
1847 The CELT allocator will just not be able to use more than that anyway. */
1848 nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM));
1849 base_target = vbr_rate - ((40*C+20)<<BITRES);
1850
1851 if (st->constrained_vbr)
1852 base_target += (st->vbr_offset>>lm_diff);
1853
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001854 target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate,
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001855 st->lastCodedBands, C, st->intensity, st->constrained_vbr,
1856 st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth,
1857 st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking,
1858 temporal_vbr);
1859
1860 /* The current offset is removed from the target and the space used
1861 so far is added*/
1862 target=target+tell;
1863 /* In VBR mode the frame size must not be reduced so much that it would
1864 result in the encoder running out of bits.
1865 The margin of 2 bytes ensures that none of the bust-prevention logic
1866 in the decoder will have triggered so far. */
1867 min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes;
1868
1869 nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3);
1870 nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes);
1871 nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes;
1872
1873 /* By how much did we "miss" the target on that frame */
1874 delta = target - vbr_rate;
1875
1876 target=nbAvailableBytes<<(BITRES+3);
1877
1878 /*If the frame is silent we don't adjust our drift, otherwise
1879 the encoder will shoot to very high rates after hitting a
1880 span of silence, but we do allow the bitres to refill.
1881 This means that we'll undershoot our target in CVBR/VBR modes
1882 on files with lots of silence. */
1883 if(silence)
1884 {
1885 nbAvailableBytes = 2;
1886 target = 2*8<<BITRES;
1887 delta = 0;
1888 }
1889
1890 if (st->vbr_count < 970)
1891 {
1892 st->vbr_count++;
1893 alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16));
1894 } else
1895 alpha = QCONST16(.001f,15);
1896 /* How many bits have we used in excess of what we're allowed */
1897 if (st->constrained_vbr)
1898 st->vbr_reservoir += target - vbr_rate;
1899 /*printf ("%d\n", st->vbr_reservoir);*/
1900
1901 /* Compute the offset we need to apply in order to reach the target */
1902 if (st->constrained_vbr)
1903 {
1904 st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<<lm_diff))-st->vbr_offset-st->vbr_drift);
1905 st->vbr_offset = -st->vbr_drift;
1906 }
1907 /*printf ("%d\n", st->vbr_drift);*/
1908
1909 if (st->constrained_vbr && st->vbr_reservoir < 0)
1910 {
1911 /* We're under the min value -- increase rate */
1912 int adjust = (-st->vbr_reservoir)/(8<<BITRES);
1913 /* Unless we're just coding silence */
1914 nbAvailableBytes += silence?0:adjust;
1915 st->vbr_reservoir = 0;
1916 /*printf ("+%d\n", adjust);*/
1917 }
1918 nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes);
1919 /*printf("%d\n", nbCompressedBytes*50*8);*/
1920 /* This moves the raw bits to take into account the new compressed size */
1921 ec_enc_shrink(enc, nbCompressedBytes);
1922 }
1923
1924 /* Bit allocation */
1925 ALLOC(fine_quant, nbEBands, int);
1926 ALLOC(pulses, nbEBands, int);
1927 ALLOC(fine_priority, nbEBands, int);
1928
1929 /* bits = packet size - where we are - safety*/
1930 bits = (((opus_int32)nbCompressedBytes*8)<<BITRES) - ec_tell_frac(enc) - 1;
1931 anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
1932 bits -= anti_collapse_rsv;
1933 signalBandwidth = st->end-1;
1934#ifndef DISABLE_FLOAT_API
1935 if (st->analysis.valid)
1936 {
1937 int min_bandwidth;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001938 if (equiv_rate < (opus_int32)32000*C)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001939 min_bandwidth = 13;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001940 else if (equiv_rate < (opus_int32)48000*C)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001941 min_bandwidth = 16;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001942 else if (equiv_rate < (opus_int32)60000*C)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001943 min_bandwidth = 18;
tlegrand@google.com3c3902f2013-12-09 08:35:25 +00001944 else if (equiv_rate < (opus_int32)80000*C)
tlegrand@chromium.orge3ea0492013-10-23 09:13:50 +00001945 min_bandwidth = 19;
1946 else
1947 min_bandwidth = 20;
1948 signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth);
1949 }
1950#endif
1951 if (st->lfe)
1952 signalBandwidth = 1;
1953 codedBands = compute_allocation(mode, st->start, st->end, offsets, cap,
1954 alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
1955 fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth);
1956 if (st->lastCodedBands)
1957 st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands));
1958 else
1959 st->lastCodedBands = codedBands;
1960
1961 quant_fine_energy(mode, st->start, st->end, oldBandE, error, fine_quant, enc, C);
1962
1963 /* Residual quantisation */
1964 ALLOC(collapse_masks, C*nbEBands, unsigned char);
1965 quant_all_bands(1, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks,
1966 bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res,
1967 nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv, balance, enc, LM, codedBands, &st->rng);
1968
1969 if (anti_collapse_rsv > 0)
1970 {
1971 anti_collapse_on = st->consec_transient<2;
1972#ifdef FUZZING
1973 anti_collapse_on = rand()&0x1;
1974#endif
1975 ec_enc_bits(enc, anti_collapse_on, 1);
1976 }
1977 quant_energy_finalise(mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C);
1978
1979 if (silence)
1980 {
1981 for (i=0;i<C*nbEBands;i++)
1982 oldBandE[i] = -QCONST16(28.f,DB_SHIFT);
1983 }
1984
1985#ifdef RESYNTH
1986 /* Re-synthesis of the coded audio if required */
1987 {
1988 celt_sig *out_mem[2];
1989
1990 if (anti_collapse_on)
1991 {
1992 anti_collapse(mode, X, collapse_masks, LM, C, N,
1993 st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng);
1994 }
1995
1996 if (silence)
1997 {
1998 for (i=0;i<C*N;i++)
1999 freq[i] = 0;
2000 } else {
2001 /* Synthesis */
2002 denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M);
2003 }
2004
2005 c=0; do {
2006 OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2);
2007 } while (++c<CC);
2008
2009 if (CC==2&&C==1)
2010 {
2011 for (i=0;i<N;i++)
2012 freq[N+i] = freq[i];
2013 }
2014
2015 c=0; do {
2016 out_mem[c] = st->syn_mem[c]+2*MAX_PERIOD-N;
2017 } while (++c<CC);
2018
2019 compute_inv_mdcts(mode, shortBlocks, freq, out_mem, CC, LM);
2020
2021 c=0; do {
2022 st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD);
2023 st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD);
2024 comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, mode->shortMdctSize,
2025 st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset,
2026 mode->window, st->overlap);
2027 if (LM!=0)
2028 comb_filter(out_mem[c]+mode->shortMdctSize, out_mem[c]+mode->shortMdctSize, st->prefilter_period, pitch_index, N-mode->shortMdctSize,
2029 st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset,
2030 mode->window, overlap);
2031 } while (++c<CC);
2032
2033 /* We reuse freq[] as scratch space for the de-emphasis */
2034 deemphasis(out_mem, (opus_val16*)pcm, N, CC, st->upsample, mode->preemph, st->preemph_memD, freq);
2035 st->prefilter_period_old = st->prefilter_period;
2036 st->prefilter_gain_old = st->prefilter_gain;
2037 st->prefilter_tapset_old = st->prefilter_tapset;
2038 }
2039#endif
2040
2041 st->prefilter_period = pitch_index;
2042 st->prefilter_gain = gain1;
2043 st->prefilter_tapset = prefilter_tapset;
2044#ifdef RESYNTH
2045 if (LM!=0)
2046 {
2047 st->prefilter_period_old = st->prefilter_period;
2048 st->prefilter_gain_old = st->prefilter_gain;
2049 st->prefilter_tapset_old = st->prefilter_tapset;
2050 }
2051#endif
2052
2053 if (CC==2&&C==1) {
2054 for (i=0;i<nbEBands;i++)
2055 oldBandE[nbEBands+i]=oldBandE[i];
2056 }
2057
2058 if (!isTransient)
2059 {
2060 for (i=0;i<CC*nbEBands;i++)
2061 oldLogE2[i] = oldLogE[i];
2062 for (i=0;i<CC*nbEBands;i++)
2063 oldLogE[i] = oldBandE[i];
2064 } else {
2065 for (i=0;i<CC*nbEBands;i++)
2066 oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
2067 }
2068 /* In case start or end were to change */
2069 c=0; do
2070 {
2071 for (i=0;i<st->start;i++)
2072 {
2073 oldBandE[c*nbEBands+i]=0;
2074 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
2075 }
2076 for (i=st->end;i<nbEBands;i++)
2077 {
2078 oldBandE[c*nbEBands+i]=0;
2079 oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
2080 }
2081 } while (++c<CC);
2082
2083 if (isTransient || transient_got_disabled)
2084 st->consec_transient++;
2085 else
2086 st->consec_transient=0;
2087 st->rng = enc->rng;
2088
2089 /* If there's any room left (can only happen for very high rates),
2090 it's already filled with zeros */
2091 ec_enc_done(enc);
2092
2093#ifdef CUSTOM_MODES
2094 if (st->signalling)
2095 nbCompressedBytes++;
2096#endif
2097
2098 RESTORE_STACK;
2099 if (ec_get_error(enc))
2100 return OPUS_INTERNAL_ERROR;
2101 else
2102 return nbCompressedBytes;
2103}
2104
2105
2106#ifdef CUSTOM_MODES
2107
2108#ifdef FIXED_POINT
2109int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
2110{
2111 return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL);
2112}
2113
2114#ifndef DISABLE_FLOAT_API
2115int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
2116{
2117 int j, ret, C, N;
2118 VARDECL(opus_int16, in);
2119 ALLOC_STACK;
2120
2121 if (pcm==NULL)
2122 return OPUS_BAD_ARG;
2123
2124 C = st->channels;
2125 N = frame_size;
2126 ALLOC(in, C*N, opus_int16);
2127
2128 for (j=0;j<C*N;j++)
2129 in[j] = FLOAT2INT16(pcm[j]);
2130
2131 ret=celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL);
2132#ifdef RESYNTH
2133 for (j=0;j<C*N;j++)
2134 ((float*)pcm)[j]=in[j]*(1.f/32768.f);
2135#endif
2136 RESTORE_STACK;
2137 return ret;
2138}
2139#endif /* DISABLE_FLOAT_API */
2140#else
2141
2142int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
2143{
2144 int j, ret, C, N;
2145 VARDECL(celt_sig, in);
2146 ALLOC_STACK;
2147
2148 if (pcm==NULL)
2149 return OPUS_BAD_ARG;
2150
2151 C=st->channels;
2152 N=frame_size;
2153 ALLOC(in, C*N, celt_sig);
2154 for (j=0;j<C*N;j++) {
2155 in[j] = SCALEOUT(pcm[j]);
2156 }
2157
2158 ret = celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL);
2159#ifdef RESYNTH
2160 for (j=0;j<C*N;j++)
2161 ((opus_int16*)pcm)[j] = FLOAT2INT16(in[j]);
2162#endif
2163 RESTORE_STACK;
2164 return ret;
2165}
2166
2167int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
2168{
2169 return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL);
2170}
2171
2172#endif
2173
2174#endif /* CUSTOM_MODES */
2175
2176int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...)
2177{
2178 va_list ap;
2179
2180 va_start(ap, request);
2181 switch (request)
2182 {
2183 case OPUS_SET_COMPLEXITY_REQUEST:
2184 {
2185 int value = va_arg(ap, opus_int32);
2186 if (value<0 || value>10)
2187 goto bad_arg;
2188 st->complexity = value;
2189 }
2190 break;
2191 case CELT_SET_START_BAND_REQUEST:
2192 {
2193 opus_int32 value = va_arg(ap, opus_int32);
2194 if (value<0 || value>=st->mode->nbEBands)
2195 goto bad_arg;
2196 st->start = value;
2197 }
2198 break;
2199 case CELT_SET_END_BAND_REQUEST:
2200 {
2201 opus_int32 value = va_arg(ap, opus_int32);
2202 if (value<1 || value>st->mode->nbEBands)
2203 goto bad_arg;
2204 st->end = value;
2205 }
2206 break;
2207 case CELT_SET_PREDICTION_REQUEST:
2208 {
2209 int value = va_arg(ap, opus_int32);
2210 if (value<0 || value>2)
2211 goto bad_arg;
2212 st->disable_pf = value<=1;
2213 st->force_intra = value==0;
2214 }
2215 break;
2216 case OPUS_SET_PACKET_LOSS_PERC_REQUEST:
2217 {
2218 int value = va_arg(ap, opus_int32);
2219 if (value<0 || value>100)
2220 goto bad_arg;
2221 st->loss_rate = value;
2222 }
2223 break;
2224 case OPUS_SET_VBR_CONSTRAINT_REQUEST:
2225 {
2226 opus_int32 value = va_arg(ap, opus_int32);
2227 st->constrained_vbr = value;
2228 }
2229 break;
2230 case OPUS_SET_VBR_REQUEST:
2231 {
2232 opus_int32 value = va_arg(ap, opus_int32);
2233 st->vbr = value;
2234 }
2235 break;
2236 case OPUS_SET_BITRATE_REQUEST:
2237 {
2238 opus_int32 value = va_arg(ap, opus_int32);
2239 if (value<=500 && value!=OPUS_BITRATE_MAX)
2240 goto bad_arg;
2241 value = IMIN(value, 260000*st->channels);
2242 st->bitrate = value;
2243 }
2244 break;
2245 case CELT_SET_CHANNELS_REQUEST:
2246 {
2247 opus_int32 value = va_arg(ap, opus_int32);
2248 if (value<1 || value>2)
2249 goto bad_arg;
2250 st->stream_channels = value;
2251 }
2252 break;
2253 case OPUS_SET_LSB_DEPTH_REQUEST:
2254 {
2255 opus_int32 value = va_arg(ap, opus_int32);
2256 if (value<8 || value>24)
2257 goto bad_arg;
2258 st->lsb_depth=value;
2259 }
2260 break;
2261 case OPUS_GET_LSB_DEPTH_REQUEST:
2262 {
2263 opus_int32 *value = va_arg(ap, opus_int32*);
2264 *value=st->lsb_depth;
2265 }
2266 break;
2267 case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
2268 {
2269 opus_int32 value = va_arg(ap, opus_int32);
2270 st->variable_duration = value;
2271 }
2272 break;
2273 case OPUS_RESET_STATE:
2274 {
2275 int i;
2276 opus_val16 *oldBandE, *oldLogE, *oldLogE2;
2277 oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->overlap+COMBFILTER_MAXPERIOD));
2278 oldLogE = oldBandE + st->channels*st->mode->nbEBands;
2279 oldLogE2 = oldLogE + st->channels*st->mode->nbEBands;
2280 OPUS_CLEAR((char*)&st->ENCODER_RESET_START,
2281 opus_custom_encoder_get_size(st->mode, st->channels)-
2282 ((char*)&st->ENCODER_RESET_START - (char*)st));
2283 for (i=0;i<st->channels*st->mode->nbEBands;i++)
2284 oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
2285 st->vbr_offset = 0;
2286 st->delayedIntra = 1;
2287 st->spread_decision = SPREAD_NORMAL;
2288 st->tonal_average = 256;
2289 st->hf_average = 0;
2290 st->tapset_decision = 0;
2291 }
2292 break;
2293#ifdef CUSTOM_MODES
2294 case CELT_SET_INPUT_CLIPPING_REQUEST:
2295 {
2296 opus_int32 value = va_arg(ap, opus_int32);
2297 st->clip = value;
2298 }
2299 break;
2300#endif
2301 case CELT_SET_SIGNALLING_REQUEST:
2302 {
2303 opus_int32 value = va_arg(ap, opus_int32);
2304 st->signalling = value;
2305 }
2306 break;
2307 case CELT_SET_ANALYSIS_REQUEST:
2308 {
2309 AnalysisInfo *info = va_arg(ap, AnalysisInfo *);
2310 if (info)
2311 OPUS_COPY(&st->analysis, info, 1);
2312 }
2313 break;
2314 case CELT_GET_MODE_REQUEST:
2315 {
2316 const CELTMode ** value = va_arg(ap, const CELTMode**);
2317 if (value==0)
2318 goto bad_arg;
2319 *value=st->mode;
2320 }
2321 break;
2322 case OPUS_GET_FINAL_RANGE_REQUEST:
2323 {
2324 opus_uint32 * value = va_arg(ap, opus_uint32 *);
2325 if (value==0)
2326 goto bad_arg;
2327 *value=st->rng;
2328 }
2329 break;
2330 case OPUS_SET_LFE_REQUEST:
2331 {
2332 opus_int32 value = va_arg(ap, opus_int32);
2333 st->lfe = value;
2334 }
2335 break;
2336 case OPUS_SET_ENERGY_MASK_REQUEST:
2337 {
2338 opus_val16 *value = va_arg(ap, opus_val16*);
2339 st->energy_mask = value;
2340 }
2341 break;
2342 default:
2343 goto bad_request;
2344 }
2345 va_end(ap);
2346 return OPUS_OK;
2347bad_arg:
2348 va_end(ap);
2349 return OPUS_BAD_ARG;
2350bad_request:
2351 va_end(ap);
2352 return OPUS_UNIMPLEMENTED;
2353}