blob: 859f41994eab0442f0d9f1fb93e3b73d0c1ee755 [file] [log] [blame]
Jean-Marc Valin69062102012-11-08 09:42:27 -05001/* 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
Jean-Marc Valin1ecb7ea2012-11-08 11:25:20 -050034#define CELT_ENCODER_C
Jean-Marc Valin69062102012-11-08 09:42:27 -050035
Aurélien Zanellicd4c8242013-05-31 15:07:00 +020036#include "cpu_support.h"
Jean-Marc Valin69062102012-11-08 09:42:27 -050037#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;
Jean-Marc Valin3252bf22013-04-19 03:14:28 -040077 int variable_duration;
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -040078 int lfe;
Aurélien Zanellicd4c8242013-05-31 15:07:00 +020079 int arch;
Jean-Marc Valin69062102012-11-08 09:42:27 -050080
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;
Jean-Marc Valinb7bd4c22013-05-18 23:33:48 -0400111 opus_val32 overlap_max;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500112 opus_val16 stereo_saving;
113 int intensity;
Jean-Marc Valina4dccd32013-05-04 23:54:20 -0400114 opus_val16 *energy_mask;
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -0400115 opus_val16 spec_avg;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500116
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
Timothy B. Terriberry39386e02013-11-18 13:30:13 -0500164static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode,
165 int channels, int arch)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500166{
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
Timothy B. Terriberry39386e02013-11-18 13:30:13 -0500184 st->arch = arch;
Aurélien Zanellicd4c8242013-05-31 15:07:00 +0200185
Jean-Marc Valin69062102012-11-08 09:42:27 -0500186 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
Jean-Marc Valin41e89062013-11-20 19:34:14 -0500200#ifdef CUSTOM_MODES
201int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels)
Timothy B. Terriberry39386e02013-11-18 13:30:13 -0500202{
203 return opus_custom_encoder_init_arch(st, mode, channels, opus_select_arch());
204}
Jean-Marc Valin41e89062013-11-20 19:34:14 -0500205#endif
Timothy B. Terriberry39386e02013-11-18 13:30:13 -0500206
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
Jean-Marc Valin69062102012-11-08 09:42:27 -0500219#ifdef CUSTOM_MODES
220void 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;
Jean-Marc Valind683c762012-12-21 16:17:38 -0500236 opus_val16 tf_max;
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500237 int len2;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500238 /* 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
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500252 len2=len/2;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500253 for (c=0;c<C;c++)
254 {
255 opus_val32 mean;
256 opus_int32 unmask=0;
257 opus_val32 norm;
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500258 opus_val16 maxE;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500259 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;
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500297 /* Grouping by two to reduce complexity */
Jean-Marc Valin69062102012-11-08 09:42:27 -0500298 /* Forward pass to compute the post-echo threshold*/
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500299 for (i=0;i<len2;i++)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500300 {
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;
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500313 maxE=0;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500314 /* Backward pass to compute the pre-echo threshold */
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500315 for (i=len2-1;i>=0;i--)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500316 {
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];
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500324 maxE = MAX16(maxE, mem0);
Jean-Marc Valin69062102012-11-08 09:42:27 -0500325 }
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500326 /*for (i=0;i<len2;i++)printf("%f ", tmp[i]/mean);printf("\n");*/
Jean-Marc Valin69062102012-11-08 09:42:27 -0500327
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500328 /* Compute the ratio of the "frame energy" over the harmonic mean of the energy.
Jean-Marc Valin69062102012-11-08 09:42:27 -0500329 This essentially corresponds to a bitrate-normalized temporal noise-to-mask
330 ratio */
331
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500332 /* 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
Gregory Maxwell5280c712013-07-15 15:51:24 -0700338 mean = celt_sqrt(mean * maxE*.5*len2);
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500339#endif
Jean-Marc Valin69062102012-11-08 09:42:27 -0500340 /* Inverse of the mean energy in Q15+6 */
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500341 norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1));
Jean-Marc Valin69062102012-11-08 09:42:27 -0500342 /* Compute harmonic mean discarding the unreliable boundaries
343 The data is smooth, so we only take 1/4th of the samples */
344 unmask=0;
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500345 for (i=12;i<len2-5;i+=4)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500346 {
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
Jean-Marc Valind683c762012-12-21 16:17:38 -0500351 id = IMAX(0,IMIN(127,(int)floor(64*norm*tmp[i]))); /* Do not round to nearest */
Jean-Marc Valin69062102012-11-08 09:42:27 -0500352#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 */
Jean-Marc Valin144b6e62012-11-10 10:13:03 -0500357 unmask = 64*unmask*4/(6*(len2-17));
Jean-Marc Valin69062102012-11-08 09:42:27 -0500358 if (unmask>mask_metric)
359 {
360 *tf_chan = c;
361 mask_metric = unmask;
362 }
363 }
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500364 is_transient = mask_metric>200;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500365
366 /* Arbitrary metric for VBR boost */
Jean-Marc Valin413caa02012-11-19 16:36:22 -0500367 tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42);
Jean-Marc Valin69062102012-11-08 09:42:27 -0500368 /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */
Jean-Marc Valind683c762012-12-21 16:17:38 -0500369 *tf_estimate = celt_sqrt(MAX16(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28)));
Jean-Marc Valin69062102012-11-08 09:42:27 -0500370 /*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
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500379/* Looks for sudden increases of energy to decide whether we need to patch
380 the transient decision */
Stefan Hackera32fa312013-09-20 04:07:53 +0200381int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500382 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 {
Stefan Hackera32fa312013-09-20 04:07:53 +0200391 spread_old[0] = oldE[0];
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500392 for (i=1;i<end;i++)
Stefan Hackera32fa312013-09-20 04:07:53 +0200393 spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), oldE[i]);
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500394 } else {
Stefan Hackera32fa312013-09-20 04:07:53 +0200395 spread_old[0] = MAX16(oldE[0],oldE[nbEBands]);
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500396 for (i=1;i<end;i++)
397 spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT),
Stefan Hackera32fa312013-09-20 04:07:53 +0200398 MAX16(oldE[i],oldE[i+nbEBands]));
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500399 }
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;
Stefan Hackera32fa312013-09-20 04:07:53 +0200407 x1 = MAX16(0, newE[i]);
Jean-Marc Valin541a4722013-02-17 21:21:30 -0500408 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
Jean-Marc Valin69062102012-11-08 09:42:27 -0500417/** Apply window and compute the MDCT for all sub-frames and
418 all channels in a frame */
Jean-Marc Valin851f8032013-02-18 01:43:43 -0500419static 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)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500421{
422 const int overlap = OVERLAP(mode);
423 int N;
424 int B;
425 int shift;
Jean-Marc Valin851f8032013-02-18 01:43:43 -0500426 int i, b, c;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500427 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 }
Jean-Marc Valin851f8032013-02-18 01:43:43 -0500443 } 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 }
Jean-Marc Valin69062102012-11-08 09:42:27 -0500460}
461
462
Jean-Marc Valin2dc27df2013-11-13 19:35:43 -0500463void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
Jean-Marc Valin69062102012-11-08 09:42:27 -0500464 int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip)
465{
466 int i;
Jean-Marc Valine368e622013-01-03 14:28:28 -0500467 opus_val16 coef0;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500468 celt_sig m;
469 int Nu;
470
471 coef0 = coef[0];
Jean-Marc Valin69062102012-11-08 09:42:27 -0500472
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 }
Jean-Marc Valind6eb9c42013-11-25 22:33:43 -0500500#else
501 (void)clip; /* Avoids a warning about clip being unused. */
Jean-Marc Valin69062102012-11-08 09:42:27 -0500502#endif
503 m = *mem;
Jean-Marc Valine368e622013-01-03 14:28:28 -0500504#ifdef CUSTOM_MODES
505 if (coef[1] != 0)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500506 {
Jean-Marc Valine368e622013-01-03 14:28:28 -0500507 opus_val16 coef1 = coef[1];
Jean-Marc Valin69062102012-11-08 09:42:27 -0500508 opus_val16 coef2 = coef[2];
509 for (i=0;i<N;i++)
510 {
Jean-Marc Valin96408b62013-12-02 20:02:37 -0500511 celt_sig x, tmp;
Jean-Marc Valin69062102012-11-08 09:42:27 -0500512 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 }
Jean-Marc Valine368e622013-01-03 14:28:28 -0500518 } else
Jean-Marc Valinebdfbfb2013-01-09 11:13:00 -0500519#endif
Jean-Marc Valine368e622013-01-03 14:28:28 -0500520 {
521 for (i=0;i<N;i++)
522 {
Jean-Marc Valinaed10092013-12-05 13:36:48 -0500523 opus_val16 x;
524 x = inp[i];
Jean-Marc Valine368e622013-01-03 14:28:28 -0500525 /* Apply pre-emphasis */
Jean-Marc Valinaed10092013-12-05 13:36:48 -0500526 inp[i] = SHL32(x, SIG_SHIFT) - m;
527 m = SHR32(MULT16_16(coef0, x), 15-SIG_SHIFT);
Jean-Marc Valine368e622013-01-03 14:28:28 -0500528 }
Jean-Marc Valin69062102012-11-08 09:42:27 -0500529 }
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
Jean-Marc Valina6d663c2012-11-08 13:26:49 -0500548static int tf_analysis(const CELTMode *m, int len, int isTransient,
549 int *tf_res, int lambda, celt_norm *X, int N0, int LM,
Jean-Marc Valin69062102012-11-08 09:42:27 -0500550 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);
Jean-Marc Valin69062102012-11-08 09:42:27 -0500560 int sel;
561 int selcost[2];
562 int tf_select=0;
563 opus_val16 bias;
564
565 SAVE_STACK;
Jean-Marc Valindae16fb2012-12-13 21:40:58 -0500566 bias = MULT16_16_Q14(QCONST16(.04f,15), MAX16(-QCONST16(.25f,14), QCONST16(.5f,14)-tf_estimate));
Jean-Marc Valin69062102012-11-08 09:42:27 -0500567 /*printf("%f ", bias);*/
568
Jean-Marc Valin69062102012-11-08 09:42:27 -0500569 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,
Jean-Marc Valin0f686962013-09-05 12:49:55 -0400757 int intensity, opus_val16 surround_trim)
Jean-Marc Valin69062102012-11-08 09:42:27 -0500758{
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 ));
Jean-Marc Valin0f686962013-09-05 12:49:55 -0400831 trim -= SHR16(surround_trim, DB_SHIFT-8);
Jean-Marc Valindae16fb2012-12-13 21:40:58 -0500832 trim -= 2*SHR16(tf_estimate, 14-8);
Jean-Marc Valin3ab03e02013-09-06 16:00:39 -0400833#ifndef DISABLE_FLOAT_API
Jean-Marc Valin69062102012-11-08 09:42:27 -0500834 if (analysis->valid)
835 {
Jean-Marc Valina71c9ad2013-11-13 12:07:01 -0500836 trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8),
837 (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f))));
Jean-Marc Valin69062102012-11-08 09:42:27 -0500838 }
839#endif
840
841#ifdef FIXED_POINT
842 trim_index = PSHR32(trim, 8);
843#else
Jean-Marc Valind683c762012-12-21 16:17:38 -0500844 trim_index = (int)floor(.5f+trim);
Jean-Marc Valin69062102012-11-08 09:42:27 -0500845#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
Jean-Marc Valind683c762012-12-21 16:17:38 -0500889static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2,
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500890 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,
Jean-Marc Valin0f686962013-09-05 12:49:55 -0400892 int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc)
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500893{
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 */
Jean-Marc Valin82594922013-07-25 13:52:42 -0400905 maxDepth=-QCONST16(31.9f, DB_SHIFT);
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500906 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 */
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -0400920 if (effectiveBytes > 50 && LM>=1 && !lfe)
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500921 {
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 }
Jean-Marc Valin0f686962013-09-05 12:49:55 -0400955 for (i=start;i<end;i++)
956 follower[i] = MAX16(follower[i], surround_dynalloc[i]);
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500957 /* 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 {
Jean-Marc Valind683c762012-12-21 16:17:38 -0500978 boost = (int)SHR32(EXTEND32(follower[i]),DB_SHIFT);
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500979 boost_bits = boost*width<<BITRES;
980 } else if (width > 48) {
Jean-Marc Valind683c762012-12-21 16:17:38 -0500981 boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT);
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500982 boost_bits = (boost*width<<BITRES)/8;
983 } else {
Jean-Marc Valind683c762012-12-21 16:17:38 -0500984 boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT);
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500985 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 {
Jean-Marc Valine4550922013-07-30 05:12:46 -0400991 opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3);
992 offsets[i] = cap-tot_boost;
993 tot_boost = cap;
Jean-Marc Valin10b30e72012-11-10 00:44:03 -0500994 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
Jean-Marc Valin69062102012-11-08 09:42:27 -05001007static 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
Timothy B. Terriberry39386e02013-11-18 13:30:13 -05001038 pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC, st->arch);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001039 /* 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,
Timothy B. Terriberry39386e02013-11-18 13:30:13 -05001042 COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index,
1043 st->arch);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001044 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
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001132static 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,
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001136 int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking,
1137 opus_val16 temporal_vbr)
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001138{
1139 /* The target rate in 8th bits per frame */
1140 opus_int32 target;
1141 int coded_bins;
1142 int coded_bands;
Jean-Marc Valin39cbc452013-06-13 15:28:53 -04001143 opus_val16 tf_calibration;
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001144 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);*/
Jean-Marc Valin3ab03e02013-09-06 16:00:39 -04001158#ifndef DISABLE_FLOAT_API
Gregory Maxwell5280c712013-07-15 15:51:24 -07001159 if (analysis->valid && analysis->activity<.4)
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001160 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);
Jean-Marc Valin9c23f5c2013-10-28 14:15:18 -04001172 stereo_saving = MIN16(stereo_saving, QCONST16(1.f, 8));
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001173 /*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. */
Jean-Marc Valin39cbc452013-06-13 15:28:53 -04001180 tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ?
1181 QCONST16(0.02f,14) : QCONST16(0.04f,14);
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001182 target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1);
1183
Jean-Marc Valin3ab03e02013-09-06 16:00:39 -04001184#ifndef DISABLE_FLOAT_API
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001185 /* Apply tonality boost */
Jean-Marc Valincd373b52013-07-07 02:51:07 -04001186 if (analysis->valid && !lfe)
1187 {
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001188 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);
Jean-Marc Valin942fc812013-10-01 19:27:30 -04001196 /*printf("%f %f ", analysis->tonality, tonal);*/
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001197 target = tonal_target;
1198 }
1199#endif
1200
1201 if (has_surround_mask&&!lfe)
1202 {
Jean-Marc Valin16ba19a2013-06-27 03:40:44 -04001203 opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<<BITRES), DB_SHIFT);
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001204 /*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 }
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001232
Jean-Marc Valincd373b52013-07-07 02:51:07 -04001233 if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14))
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001234 {
1235 opus_val16 amount;
1236 opus_val16 tvbr_factor;
Jean-Marc Valin8e3a1cb2013-07-01 16:12:27 -04001237 amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate)));
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001238 tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT);
1239 target += (opus_int32)MULT16_32_Q15(tvbr_factor, target);
1240 }
1241
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001242 /* Don't allow more than doubling the rate */
1243 target = IMIN(2*base_target, target);
1244
1245 return target;
1246}
1247
Jean-Marc Valin69062102012-11-08 09:42:27 -05001248int 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;
Jean-Marc Valin10b30e72012-11-10 00:44:03 -05001298 opus_int32 tot_boost;
Jean-Marc Valinb7bd4c22013-05-18 23:33:48 -04001299 opus_val32 sample_max;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001300 opus_val16 maxDepth;
1301 const OpusCustomMode *mode;
1302 int nbEBands;
1303 int overlap;
1304 const opus_int16 *eBands;
1305 int secondMdct;
Jean-Marc Valin5fb50ad2012-12-21 01:23:26 -05001306 int signalBandwidth;
Jean-Marc Valinf77410d2013-04-19 22:44:03 -04001307 int transient_got_disabled=0;
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04001308 opus_val16 surround_masking=0;
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001309 opus_val16 temporal_vbr=0;
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001310 opus_val16 surround_trim = 0;
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001311 opus_int32 equiv_rate = 510000;
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001312 VARDECL(opus_val16, surround_dynalloc);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001313 ALLOC_STACK;
1314
1315 mode = st->mode;
1316 nbEBands = mode->nbEBands;
1317 overlap = mode->overlap;
1318 eBands = mode->eBands;
Jean-Marc Valindae16fb2012-12-13 21:40:58 -05001319 tf_estimate = 0;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001320 if (nbCompressedBytes<2 || pcm==NULL)
Jean-Marc Valine83d2aa2013-11-15 01:52:28 -05001321 {
Jean-Marc Valin1b28e0c2013-11-15 01:57:25 -05001322 RESTORE_STACK;
Jean-Marc Valine83d2aa2013-11-15 01:52:28 -05001323 return OPUS_BAD_ARG;
1324 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001325
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)
Jean-Marc Valine83d2aa2013-11-15 01:52:28 -05001331 {
Jean-Marc Valin1b28e0c2013-11-15 01:57:25 -05001332 RESTORE_STACK;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001333 return OPUS_BAD_ARG;
Jean-Marc Valine83d2aa2013-11-15 01:52:28 -05001334 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001335 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)
Jean-Marc Valine83d2aa2013-11-15 01:52:28 -05001365 {
Jean-Marc Valin1b28e0c2013-11-15 01:57:25 -05001366 RESTORE_STACK;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001367 return OPUS_BAD_ARG;
Jean-Marc Valine83d2aa2013-11-15 01:52:28 -05001368 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001369 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 }
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001402 if (st->bitrate != OPUS_BITRATE_MAX)
1403 equiv_rate = st->bitrate - (40*C+20)*((400>>LM) - 50);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001404
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
Jean-Marc Valinb7bd4c22013-05-18 23:33:48 -04001445 sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample));
Jean-Marc Valin69062102012-11-08 09:42:27 -05001446 st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample);
Jean-Marc Valinb7bd4c22013-05-18 23:33:48 -04001447 sample_max=MAX32(sample_max, st->overlap_max);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001448#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 {
Jean-Marc Valin2dc27df2013-11-13 19:35:43 -05001477 celt_preemphasis(pcm+c, in+c*(N+st->overlap)+st->overlap, N, CC, st->upsample,
Jean-Marc Valin69062102012-11-08 09:42:27 -05001478 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;
Jean-Marc Valin0d584b92013-11-13 22:42:04 -05001487 enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && st->start==0 && !silence && !st->disable_pf
Jean-Marc Valin39cbc452013-06-13 15:28:53 -04001488 && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001489
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);
Gregory Maxwell5280c712013-07-15 15:51:24 -07001492 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))
Jean-Marc Valin69062102012-11-08 09:42:27 -05001494 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;
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04001516 if (st->complexity >= 1 && !st->lfe)
Jean-Marc Valin2a5f0562012-11-19 23:17:06 -05001517 {
1518 isTransient = transient_analysis(in, N+st->overlap, CC,
1519 &tf_estimate, &tf_chan);
1520 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001521 if (LM>0 && ec_tell(enc)+3<=total_bits)
1522 {
Jean-Marc Valin2a5f0562012-11-19 23:17:06 -05001523 if (isTransient)
1524 shortBlocks = M;
Jean-Marc Valin2a5f0562012-11-19 23:17:06 -05001525 } else {
1526 isTransient = 0;
Jean-Marc Valin3252bf22013-04-19 03:14:28 -04001527 transient_got_disabled=1;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001528 }
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 {
Jean-Marc Valin851f8032013-02-18 01:43:43 -05001538 compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001539 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
Jean-Marc Valin851f8032013-02-18 01:43:43 -05001545 compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
Jean-Marc Valin69c3dcd2013-02-19 03:42:18 -05001546 if (CC==2&&C==1)
1547 tf_chan = 0;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001548 compute_band_energies(mode, freq, bandE, effEnd, C, M);
1549
Jean-Marc Valin172f66a2013-04-27 02:29:52 -04001550 if (st->lfe)
1551 {
1552 for (i=2;i<st->end;i++)
Jean-Marc Valin43654982013-07-07 00:39:35 -04001553 {
Jean-Marc Valin172f66a2013-04-27 02:29:52 -04001554 bandE[i] = IMIN(bandE[i], MULT16_32_Q15(QCONST16(1e-4f,15),bandE[0]));
Jean-Marc Valin43654982013-07-07 00:39:35 -04001555 bandE[i] = MAX32(bandE[i], EPSILON);
1556 }
Jean-Marc Valin172f66a2013-04-27 02:29:52 -04001557 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001558 amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001559
1560 ALLOC(surround_dynalloc, C*nbEBands, opus_val16);
1561 for(i=0;i<st->end;i++)
1562 surround_dynalloc[i] = 0;
Jean-Marc Valind2c484b2013-05-06 16:02:31 -04001563 /* This computes how much masking takes place between surround channels */
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001564 if (st->start==0&&st->energy_mask&&!st->lfe)
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04001565 {
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001566 int mask_end;
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001567 int midband;
1568 int count_dynalloc;
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04001569 opus_val32 mask_avg=0;
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001570 opus_val32 diff=0;
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001571 int count=0;
Jean-Marc Valin942fc812013-10-01 19:27:30 -04001572 mask_end = IMAX(2,st->lastCodedBands);
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04001573 for (c=0;c<C;c++)
Jean-Marc Valind2c484b2013-05-06 16:02:31 -04001574 {
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001575 for(i=0;i<mask_end;i++)
Jean-Marc Valind2c484b2013-05-06 16:02:31 -04001576 {
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001577 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);
Jean-Marc Valind2c484b2013-05-06 16:02:31 -04001585 }
1586 }
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001587 mask_avg = DIV32_16(mask_avg,count);
Jean-Marc Valin36a21ed2013-09-14 15:46:09 -04001588 mask_avg += QCONST16(.2f, DB_SHIFT);
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001589 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));
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001593 /* 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;
Jean-Marc Valin039e9ab2013-09-12 03:05:43 -04001596 for(i=0;i<mask_end;i++)
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001597 {
1598 opus_val32 lin;
1599 opus_val16 unmask;
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001600 lin = mask_avg + diff*(i-midband);
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001601 if (C==2)
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001602 unmask = MAX16(st->energy_mask[i], st->energy_mask[nbEBands+i]);
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001603 else
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001604 unmask = st->energy_mask[i];
1605 unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT));
1606 unmask -= lin;
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001607 if (unmask > QCONST16(.25f, DB_SHIFT))
1608 {
1609 surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT);
Jean-Marc Valinae7dc8a2013-09-13 15:05:50 -04001610 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));
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001629 }
1630 }
Jean-Marc Valin36a21ed2013-09-14 15:46:09 -04001631 mask_avg += QCONST16(.2f, DB_SHIFT);
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001632 /* 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;
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04001636 }
Jean-Marc Valin92a06f52013-07-01 16:27:07 -04001637 /* Temporal VBR (but not for LFE) */
1638 if (!st->lfe)
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001639 {
1640 opus_val16 follow=-QCONST16(10.0f,DB_SHIFT);
Jean-Marc Valin8f466272013-10-28 21:50:10 -04001641 opus_val32 frame_avg=0;
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001642 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 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001655 /*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
Jean-Marc Valin541a4722013-02-17 21:21:30 -05001665 /* Last chance to catch any transient we might have missed in the
1666 time-domain analysis */
Jean-Marc Valin172f66a2013-04-27 02:29:52 -04001667 if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe)
Jean-Marc Valin541a4722013-02-17 21:21:30 -05001668 {
1669 if (patch_transient_decision(bandLogE, oldBandE, nbEBands, st->end, C))
1670 {
1671 isTransient = 1;
1672 shortBlocks = M;
Jean-Marc Valin851f8032013-02-18 01:43:43 -05001673 compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
Jean-Marc Valin541a4722013-02-17 21:21:30 -05001674 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));
Jean-Marc Valin16ba19a2013-06-27 03:40:44 -04001679 tf_estimate = QCONST16(.2f,14);
Jean-Marc Valin541a4722013-02-17 21:21:30 -05001680 }
1681 }
1682
1683 if (LM>0 && ec_tell(enc)+3<=total_bits)
1684 ec_enc_bit_logp(enc, isTransient, 3);
1685
Jean-Marc Valin69062102012-11-08 09:42:27 -05001686 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);
Jean-Marc Valina6d663c2012-11-08 13:26:49 -05001692 /* Disable variable tf resolution for hybrid and at very low bitrate */
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04001693 if (effectiveBytes>=15*C && st->start==0 && st->complexity>=2 && !st->lfe)
Jean-Marc Valina6d663c2012-11-08 13:26:49 -05001694 {
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 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05001714
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,
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04001719 &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001720
1721 tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc);
1722
1723 if (ec_tell(enc)+4<=total_bits)
1724 {
Jean-Marc Valin172f66a2013-04-27 02:29:52 -04001725 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)
Jean-Marc Valin69062102012-11-08 09:42:27 -05001730 {
1731 if (st->complexity == 0)
1732 st->spread_decision = SPREAD_NONE;
Jean-Marc Valin1fd1d7d2012-11-08 17:22:07 -05001733 else
1734 st->spread_decision = SPREAD_NORMAL;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001735 } else {
Jean-Marc Valin41fd7a12012-12-12 14:41:29 -05001736 /* 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. */
Jean-Marc Valinab86a9c2013-11-13 23:06:25 -05001739#if 0
1740 if (st->analysis.valid)
Jean-Marc Valin69062102012-11-08 09:42:27 -05001741 {
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);
Jean-Marc Valinab86a9c2013-11-13 23:06:25 -05001748 } else
1749#endif
1750 {
Jean-Marc Valin69062102012-11-08 09:42:27 -05001751 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
Jean-Marc Valin69062102012-11-08 09:42:27 -05001761 ALLOC(offsets, nbEBands, int);
1762
Jean-Marc Valin10b30e72012-11-10 00:44:03 -05001763 maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, st->start, st->end, C, offsets,
1764 st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr,
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001765 eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc);
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04001766 /* For LFE, everything interesting is in the first band */
1767 if (st->lfe)
1768 offsets[0] = IMIN(8, effectiveBytes/3);
Jean-Marc Valin10b30e72012-11-10 00:44:03 -05001769 ALLOC(cap, nbEBands, int);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001770 init_caps(mode,cap,LM,C);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001771
Jean-Marc Valin69062102012-11-08 09:42:27 -05001772 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 {
Jean-Marc Valin2924af42013-11-25 21:24:30 -05001809 static const opus_val16 intensity_thresholds[21]=
Jean-Marc Valin69062102012-11-08 09:42:27 -05001810 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 off*/
Jean-Marc Valin2924af42013-11-25 21:24:30 -05001811 { 1, 2, 3, 4, 5, 6, 7, 8,16,24,36,44,50,56,62,67,72,79,88,106,134};
Jean-Marc Valin69062102012-11-08 09:42:27 -05001812 static const opus_val16 intensity_histeresis[21]=
Jean-Marc Valina47d6f32013-11-24 23:59:09 -05001813 { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 6, 8, 8};
Jean-Marc Valin69062102012-11-08 09:42:27 -05001814
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
Jean-Marc Valin086ea7c2013-11-29 16:47:52 -05001819 st->intensity = hysteresis_decision((opus_val16)(equiv_rate/1000),
Jean-Marc Valin2924af42013-11-25 21:24:30 -05001820 intensity_thresholds, intensity_histeresis, 21, st->intensity);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001821 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 {
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04001827 if (st->lfe)
1828 alloc_trim = 5;
1829 else
1830 alloc_trim = alloc_trim_analysis(mode, X, bandLogE,
Jean-Marc Valin0f686962013-09-05 12:49:55 -04001831 st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001832 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;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001844 int lm_diff = mode->maxLM - LM;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001845
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));
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001849 base_target = vbr_rate - ((40*C+20)<<BITRES);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001850
1851 if (st->constrained_vbr)
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001852 base_target += (st->vbr_offset>>lm_diff);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001853
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001854 target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate,
Jean-Marc Valin28733d12013-06-10 03:30:01 -04001855 st->lastCodedBands, C, st->intensity, st->constrained_vbr,
1856 st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth,
Jean-Marc Valin3c0aa8f2013-06-25 14:10:27 -04001857 st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking,
1858 temporal_vbr);
Jean-Marc Valin69062102012-11-08 09:42:27 -05001859
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;
Jean-Marc Valin5fb50ad2012-12-21 01:23:26 -05001933 signalBandwidth = st->end-1;
Jean-Marc Valin3ab03e02013-09-06 16:00:39 -04001934#ifndef DISABLE_FLOAT_API
Jean-Marc Valin5fb50ad2012-12-21 01:23:26 -05001935 if (st->analysis.valid)
Jean-Marc Valin6e277c62013-05-17 14:15:31 -04001936 {
1937 int min_bandwidth;
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001938 if (equiv_rate < (opus_int32)32000*C)
Jean-Marc Valin6e277c62013-05-17 14:15:31 -04001939 min_bandwidth = 13;
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001940 else if (equiv_rate < (opus_int32)48000*C)
Jean-Marc Valin6e277c62013-05-17 14:15:31 -04001941 min_bandwidth = 16;
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001942 else if (equiv_rate < (opus_int32)60000*C)
Jean-Marc Valin6e277c62013-05-17 14:15:31 -04001943 min_bandwidth = 18;
Jean-Marc Valinc1959e72013-11-08 19:24:10 -05001944 else if (equiv_rate < (opus_int32)80000*C)
Jean-Marc Valin6e277c62013-05-17 14:15:31 -04001945 min_bandwidth = 19;
1946 else
1947 min_bandwidth = 20;
1948 signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth);
1949 }
Jean-Marc Valin5fb50ad2012-12-21 01:23:26 -05001950#endif
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04001951 if (st->lfe)
1952 signalBandwidth = 1;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001953 codedBands = compute_allocation(mode, st->start, st->end, offsets, cap,
1954 alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
Jean-Marc Valin5fb50ad2012-12-21 01:23:26 -05001955 fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth);
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04001956 if (st->lastCodedBands)
1957 st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands));
1958 else
1959 st->lastCodedBands = codedBands;
Jean-Marc Valin69062102012-11-08 09:42:27 -05001960
1961 quant_fine_energy(mode, st->start, st->end, oldBandE, error, fine_quant, enc, C);
1962
Jean-Marc Valin69062102012-11-08 09:42:27 -05001963 /* 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
Jean-Marc Valin69062102012-11-08 09:42:27 -05001990 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
Jean-Marc Valin3afc6ff2013-06-16 15:40:10 -04001996 if (silence)
1997 {
1998 for (i=0;i<C*N;i++)
1999 freq[i] = 0;
2000 } else {
Jean-Marc Valin3afc6ff2013-06-16 15:40:10 -04002001 /* Synthesis */
Jean-Marc Valinee2506b2013-06-16 20:24:52 -04002002 denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M);
Jean-Marc Valin3afc6ff2013-06-16 15:40:10 -04002003 }
Jean-Marc Valin69062102012-11-08 09:42:27 -05002004
2005 c=0; do {
Nils Wallméniuse0884fe2012-12-01 21:11:50 +01002006 OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2);
Jean-Marc Valin69062102012-11-08 09:42:27 -05002007 } 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
Jean-Marc Valin3252bf22013-04-19 03:14:28 -04002083 if (isTransient || transient_got_disabled)
Jean-Marc Valin69062102012-11-08 09:42:27 -05002084 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;
Jean-Marc Valin3252bf22013-04-19 03:14:28 -04002267 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;
Jean-Marc Valin69062102012-11-08 09:42:27 -05002273 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;
Jean-Marc Valinb08c4ca2013-04-26 16:32:10 -04002330 case OPUS_SET_LFE_REQUEST:
2331 {
2332 opus_int32 value = va_arg(ap, opus_int32);
2333 st->lfe = value;
2334 }
2335 break;
Jean-Marc Valina4dccd32013-05-04 23:54:20 -04002336 case OPUS_SET_ENERGY_MASK_REQUEST:
2337 {
2338 opus_val16 *value = va_arg(ap, opus_val16*);
2339 st->energy_mask = value;
2340 }
2341 break;
Jean-Marc Valin69062102012-11-08 09:42:27 -05002342 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}