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