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_DECODER_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/*                                                                    */
56/*                             DECODER                                */
57/*                                                                    */
58/**********************************************************************/
59#define DECODE_BUFFER_SIZE 2048
60
61/** Decoder state
62 @brief Decoder state
63 */
64struct OpusCustomDecoder {
65   const OpusCustomMode *mode;
66   int overlap;
67   int channels;
68   int stream_channels;
69
70   int downsample;
71   int start, end;
72   int signalling;
73   int arch;
74
75   /* Everything beyond this point gets cleared on a reset */
76#define DECODER_RESET_START rng
77
78   opus_uint32 rng;
79   int error;
80   int last_pitch_index;
81   int loss_count;
82   int postfilter_period;
83   int postfilter_period_old;
84   opus_val16 postfilter_gain;
85   opus_val16 postfilter_gain_old;
86   int postfilter_tapset;
87   int postfilter_tapset_old;
88
89   celt_sig preemph_memD[2];
90
91   celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */
92   /* opus_val16 lpc[],  Size = channels*LPC_ORDER */
93   /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */
94   /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */
95   /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */
96   /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */
97};
98
99int celt_decoder_get_size(int channels)
100{
101   const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
102   return opus_custom_decoder_get_size(mode, channels);
103}
104
105OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
106{
107   int size = sizeof(struct CELTDecoder)
108            + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig)
109            + channels*LPC_ORDER*sizeof(opus_val16)
110            + 4*2*mode->nbEBands*sizeof(opus_val16);
111   return size;
112}
113
114#ifdef CUSTOM_MODES
115CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error)
116{
117   int ret;
118   CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels));
119   ret = opus_custom_decoder_init(st, mode, channels);
120   if (ret != OPUS_OK)
121   {
122      opus_custom_decoder_destroy(st);
123      st = NULL;
124   }
125   if (error)
126      *error = ret;
127   return st;
128}
129#endif /* CUSTOM_MODES */
130
131int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels)
132{
133   int ret;
134   ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels);
135   if (ret != OPUS_OK)
136      return ret;
137   st->downsample = resampling_factor(sampling_rate);
138   if (st->downsample==0)
139      return OPUS_BAD_ARG;
140   else
141      return OPUS_OK;
142}
143
144OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
145{
146   if (channels < 0 || channels > 2)
147      return OPUS_BAD_ARG;
148
149   if (st==NULL)
150      return OPUS_ALLOC_FAIL;
151
152   OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels));
153
154   st->mode = mode;
155   st->overlap = mode->overlap;
156   st->stream_channels = st->channels = channels;
157
158   st->downsample = 1;
159   st->start = 0;
160   st->end = st->mode->effEBands;
161   st->signalling = 1;
162   st->arch = opus_select_arch();
163
164   st->loss_count = 0;
165
166   opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
167
168   return OPUS_OK;
169}
170
171#ifdef CUSTOM_MODES
172void opus_custom_decoder_destroy(CELTDecoder *st)
173{
174   opus_free(st);
175}
176#endif /* CUSTOM_MODES */
177
178static OPUS_INLINE opus_val16 SIG2WORD16(celt_sig x)
179{
180#ifdef FIXED_POINT
181   x = PSHR32(x, SIG_SHIFT);
182   x = MAX32(x, -32768);
183   x = MIN32(x, 32767);
184   return EXTRACT16(x);
185#else
186   return (opus_val16)x;
187#endif
188}
189
190#ifndef RESYNTH
191static
192#endif
193void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem, celt_sig * OPUS_RESTRICT scratch)
194{
195   int c;
196   int Nd;
197   int apply_downsampling=0;
198   opus_val16 coef0;
199
200   coef0 = coef[0];
201   Nd = N/downsample;
202   c=0; do {
203      int j;
204      celt_sig * OPUS_RESTRICT x;
205      opus_val16  * OPUS_RESTRICT y;
206      celt_sig m = mem[c];
207      x =in[c];
208      y = pcm+c;
209#ifdef CUSTOM_MODES
210      if (coef[1] != 0)
211      {
212         opus_val16 coef1 = coef[1];
213         opus_val16 coef3 = coef[3];
214         for (j=0;j<N;j++)
215         {
216            celt_sig tmp = x[j] + m + VERY_SMALL;
217            m = MULT16_32_Q15(coef0, tmp)
218                          - MULT16_32_Q15(coef1, x[j]);
219            tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
220            scratch[j] = tmp;
221         }
222         apply_downsampling=1;
223      } else
224#endif
225      if (downsample>1)
226      {
227         /* Shortcut for the standard (non-custom modes) case */
228         for (j=0;j<N;j++)
229         {
230            celt_sig tmp = x[j] + m + VERY_SMALL;
231            m = MULT16_32_Q15(coef0, tmp);
232            scratch[j] = tmp;
233         }
234         apply_downsampling=1;
235      } else {
236         /* Shortcut for the standard (non-custom modes) case */
237         for (j=0;j<N;j++)
238         {
239            celt_sig tmp = x[j] + m + VERY_SMALL;
240            m = MULT16_32_Q15(coef0, tmp);
241            y[j*C] = SCALEOUT(SIG2WORD16(tmp));
242         }
243      }
244      mem[c] = m;
245
246      if (apply_downsampling)
247      {
248         /* Perform down-sampling */
249         for (j=0;j<Nd;j++)
250            y[j*C] = SCALEOUT(SIG2WORD16(scratch[j*downsample]));
251      }
252   } while (++c<C);
253}
254
255/** Compute the IMDCT and apply window for all sub-frames and
256    all channels in a frame */
257#ifndef RESYNTH
258static
259#endif
260void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X,
261      celt_sig * OPUS_RESTRICT out_mem[], int C, int LM)
262{
263   int b, c;
264   int B;
265   int N;
266   int shift;
267   const int overlap = OVERLAP(mode);
268
269   if (shortBlocks)
270   {
271      B = shortBlocks;
272      N = mode->shortMdctSize;
273      shift = mode->maxLM;
274   } else {
275      B = 1;
276      N = mode->shortMdctSize<<LM;
277      shift = mode->maxLM-LM;
278   }
279   c=0; do {
280      /* IMDCT on the interleaved the sub-frames, overlap-add is performed by the IMDCT */
281      for (b=0;b<B;b++)
282         clt_mdct_backward(&mode->mdct, &X[b+c*N*B], out_mem[c]+N*b, mode->window, overlap, shift, B);
283   } while (++c<C);
284}
285
286static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, ec_dec *dec)
287{
288   int i, curr, tf_select;
289   int tf_select_rsv;
290   int tf_changed;
291   int logp;
292   opus_uint32 budget;
293   opus_uint32 tell;
294
295   budget = dec->storage*8;
296   tell = ec_tell(dec);
297   logp = isTransient ? 2 : 4;
298   tf_select_rsv = LM>0 && tell+logp+1<=budget;
299   budget -= tf_select_rsv;
300   tf_changed = curr = 0;
301   for (i=start;i<end;i++)
302   {
303      if (tell+logp<=budget)
304      {
305         curr ^= ec_dec_bit_logp(dec, logp);
306         tell = ec_tell(dec);
307         tf_changed |= curr;
308      }
309      tf_res[i] = curr;
310      logp = isTransient ? 4 : 5;
311   }
312   tf_select = 0;
313   if (tf_select_rsv &&
314     tf_select_table[LM][4*isTransient+0+tf_changed] !=
315     tf_select_table[LM][4*isTransient+2+tf_changed])
316   {
317      tf_select = ec_dec_bit_logp(dec, 1);
318   }
319   for (i=start;i<end;i++)
320   {
321      tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
322   }
323}
324
325/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save
326   CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The
327   current value corresponds to a pitch of 66.67 Hz. */
328#define PLC_PITCH_LAG_MAX (720)
329/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a
330   pitch of 480 Hz. */
331#define PLC_PITCH_LAG_MIN (100)
332
333static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_RESTRICT pcm, int N, int LM)
334{
335   int c;
336   int i;
337   const int C = st->channels;
338   celt_sig *decode_mem[2];
339   celt_sig *out_syn[2];
340   opus_val16 *lpc;
341   opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
342   const OpusCustomMode *mode;
343   int nbEBands;
344   int overlap;
345   int start;
346   int downsample;
347   int loss_count;
348   int noise_based;
349   const opus_int16 *eBands;
350   VARDECL(celt_sig, scratch);
351   SAVE_STACK;
352
353   mode = st->mode;
354   nbEBands = mode->nbEBands;
355   overlap = mode->overlap;
356   eBands = mode->eBands;
357
358   c=0; do {
359      decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap);
360      out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N;
361   } while (++c<C);
362   lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C);
363   oldBandE = lpc+C*LPC_ORDER;
364   oldLogE = oldBandE + 2*nbEBands;
365   oldLogE2 = oldLogE + 2*nbEBands;
366   backgroundLogE = oldLogE2  + 2*nbEBands;
367
368   loss_count = st->loss_count;
369   start = st->start;
370   downsample = st->downsample;
371   noise_based = loss_count >= 5 || start != 0;
372   ALLOC(scratch, noise_based?N*C:N, celt_sig);
373   if (noise_based)
374   {
375      /* Noise-based PLC/CNG */
376      celt_sig *freq;
377      VARDECL(celt_norm, X);
378      opus_uint32 seed;
379      opus_val16 *plcLogE;
380      int end;
381      int effEnd;
382
383      end = st->end;
384      effEnd = IMAX(start, IMIN(end, mode->effEBands));
385
386      /* Share the interleaved signal MDCT coefficient buffer with the
387         deemphasis scratch buffer. */
388      freq = scratch;
389      ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
390
391      if (loss_count >= 5)
392         plcLogE = backgroundLogE;
393      else {
394         /* Energy decay */
395         opus_val16 decay = loss_count==0 ?
396               QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT);
397         c=0; do
398         {
399            for (i=start;i<end;i++)
400               oldBandE[c*nbEBands+i] -= decay;
401         } while (++c<C);
402         plcLogE = oldBandE;
403      }
404      seed = st->rng;
405      for (c=0;c<C;c++)
406      {
407         for (i=start;i<effEnd;i++)
408         {
409            int j;
410            int boffs;
411            int blen;
412            boffs = N*c+(eBands[i]<<LM);
413            blen = (eBands[i+1]-eBands[i])<<LM;
414            for (j=0;j<blen;j++)
415            {
416               seed = celt_lcg_rand(seed);
417               X[boffs+j] = (celt_norm)((opus_int32)seed>>20);
418            }
419            renormalise_vector(X+boffs, blen, Q15ONE);
420         }
421      }
422      st->rng = seed;
423
424      denormalise_bands(mode, X, freq, plcLogE, start, effEnd, C, 1<<LM);
425
426      c=0; do {
427         int bound = eBands[effEnd]<<LM;
428         if (downsample!=1)
429            bound = IMIN(bound, N/downsample);
430         for (i=bound;i<N;i++)
431            freq[c*N+i] = 0;
432      } while (++c<C);
433      c=0; do {
434         OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
435               DECODE_BUFFER_SIZE-N+(overlap>>1));
436      } while (++c<C);
437      compute_inv_mdcts(mode, 0, freq, out_syn, C, LM);
438   } else {
439      /* Pitch-based PLC */
440      const opus_val16 *window;
441      opus_val16 fade = Q15ONE;
442      int pitch_index;
443      VARDECL(opus_val32, etmp);
444      VARDECL(opus_val16, exc);
445
446      if (loss_count == 0)
447      {
448         VARDECL( opus_val16, lp_pitch_buf );
449         ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
450         pitch_downsample(decode_mem, lp_pitch_buf,
451               DECODE_BUFFER_SIZE, C, st->arch);
452         pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
453               DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX,
454               PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, st->arch);
455         pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
456         st->last_pitch_index = pitch_index;
457      } else {
458         pitch_index = st->last_pitch_index;
459         fade = QCONST16(.8f,15);
460      }
461
462      ALLOC(etmp, overlap, opus_val32);
463      ALLOC(exc, MAX_PERIOD, opus_val16);
464      window = mode->window;
465      c=0; do {
466         opus_val16 decay;
467         opus_val16 attenuation;
468         opus_val32 S1=0;
469         celt_sig *buf;
470         int extrapolation_offset;
471         int extrapolation_len;
472         int exc_length;
473         int j;
474
475         buf = decode_mem[c];
476         for (i=0;i<MAX_PERIOD;i++) {
477            exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT);
478         }
479
480         if (loss_count == 0)
481         {
482            opus_val32 ac[LPC_ORDER+1];
483            /* Compute LPC coefficients for the last MAX_PERIOD samples before
484               the first loss so we can work in the excitation-filter domain. */
485            _celt_autocorr(exc, ac, window, overlap,
486                   LPC_ORDER, MAX_PERIOD, st->arch);
487            /* Add a noise floor of -40 dB. */
488#ifdef FIXED_POINT
489            ac[0] += SHR32(ac[0],13);
490#else
491            ac[0] *= 1.0001f;
492#endif
493            /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
494            for (i=1;i<=LPC_ORDER;i++)
495            {
496               /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
497#ifdef FIXED_POINT
498               ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
499#else
500               ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
501#endif
502            }
503            _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER);
504         }
505         /* We want the excitation for 2 pitch periods in order to look for a
506            decaying signal, but we can't get more than MAX_PERIOD. */
507         exc_length = IMIN(2*pitch_index, MAX_PERIOD);
508         /* Initialize the LPC history with the samples just before the start
509            of the region for which we're computing the excitation. */
510         {
511            opus_val16 lpc_mem[LPC_ORDER];
512            for (i=0;i<LPC_ORDER;i++)
513            {
514               lpc_mem[i] =
515                     ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT);
516            }
517            /* Compute the excitation for exc_length samples before the loss. */
518            celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER,
519                  exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem);
520         }
521
522         /* Check if the waveform is decaying, and if so how fast.
523            We do this to avoid adding energy when concealing in a segment
524            with decaying energy. */
525         {
526            opus_val32 E1=1, E2=1;
527            int decay_length;
528#ifdef FIXED_POINT
529            int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_length], exc_length))-20);
530#endif
531            decay_length = exc_length>>1;
532            for (i=0;i<decay_length;i++)
533            {
534               opus_val16 e;
535               e = exc[MAX_PERIOD-decay_length+i];
536               E1 += SHR32(MULT16_16(e, e), shift);
537               e = exc[MAX_PERIOD-2*decay_length+i];
538               E2 += SHR32(MULT16_16(e, e), shift);
539            }
540            E1 = MIN32(E1, E2);
541            decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
542         }
543
544         /* Move the decoder memory one frame to the left to give us room to
545            add the data for the new frame. We ignore the overlap that extends
546            past the end of the buffer, because we aren't going to use it. */
547         OPUS_MOVE(buf, buf+N, DECODE_BUFFER_SIZE-N);
548
549         /* Extrapolate from the end of the excitation with a period of
550            "pitch_index", scaling down each period by an additional factor of
551            "decay". */
552         extrapolation_offset = MAX_PERIOD-pitch_index;
553         /* We need to extrapolate enough samples to cover a complete MDCT
554            window (including overlap/2 samples on both sides). */
555         extrapolation_len = N+overlap;
556         /* We also apply fading if this is not the first loss. */
557         attenuation = MULT16_16_Q15(fade, decay);
558         for (i=j=0;i<extrapolation_len;i++,j++)
559         {
560            opus_val16 tmp;
561            if (j >= pitch_index) {
562               j -= pitch_index;
563               attenuation = MULT16_16_Q15(attenuation, decay);
564            }
565            buf[DECODE_BUFFER_SIZE-N+i] =
566                  SHL32(EXTEND32(MULT16_16_Q15(attenuation,
567                        exc[extrapolation_offset+j])), SIG_SHIFT);
568            /* Compute the energy of the previously decoded signal whose
569               excitation we're copying. */
570            tmp = ROUND16(
571                  buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j],
572                  SIG_SHIFT);
573            S1 += SHR32(MULT16_16(tmp, tmp), 8);
574         }
575
576         {
577            opus_val16 lpc_mem[LPC_ORDER];
578            /* Copy the last decoded samples (prior to the overlap region) to
579               synthesis filter memory so we can have a continuous signal. */
580            for (i=0;i<LPC_ORDER;i++)
581               lpc_mem[i] = ROUND16(buf[DECODE_BUFFER_SIZE-N-1-i], SIG_SHIFT);
582            /* Apply the synthesis filter to convert the excitation back into
583               the signal domain. */
584            celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER,
585                  buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER,
586                  lpc_mem);
587         }
588
589         /* Check if the synthesis energy is higher than expected, which can
590            happen with the signal changes during our window. If so,
591            attenuate. */
592         {
593            opus_val32 S2=0;
594            for (i=0;i<extrapolation_len;i++)
595            {
596               opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT);
597               S2 += SHR32(MULT16_16(tmp, tmp), 8);
598            }
599            /* This checks for an "explosion" in the synthesis. */
600#ifdef FIXED_POINT
601            if (!(S1 > SHR32(S2,2)))
602#else
603            /* The float test is written this way to catch NaNs in the output
604               of the IIR filter at the same time. */
605            if (!(S1 > 0.2f*S2))
606#endif
607            {
608               for (i=0;i<extrapolation_len;i++)
609                  buf[DECODE_BUFFER_SIZE-N+i] = 0;
610            } else if (S1 < S2)
611            {
612               opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
613               for (i=0;i<overlap;i++)
614               {
615                  opus_val16 tmp_g = Q15ONE
616                        - MULT16_16_Q15(window[i], Q15ONE-ratio);
617                  buf[DECODE_BUFFER_SIZE-N+i] =
618                        MULT16_32_Q15(tmp_g, buf[DECODE_BUFFER_SIZE-N+i]);
619               }
620               for (i=overlap;i<extrapolation_len;i++)
621               {
622                  buf[DECODE_BUFFER_SIZE-N+i] =
623                        MULT16_32_Q15(ratio, buf[DECODE_BUFFER_SIZE-N+i]);
624               }
625            }
626         }
627
628         /* Apply the pre-filter to the MDCT overlap for the next frame because
629            the post-filter will be re-applied in the decoder after the MDCT
630            overlap. */
631         comb_filter(etmp, buf+DECODE_BUFFER_SIZE,
632              st->postfilter_period, st->postfilter_period, overlap,
633              -st->postfilter_gain, -st->postfilter_gain,
634              st->postfilter_tapset, st->postfilter_tapset, NULL, 0);
635
636         /* Simulate TDAC on the concealed audio so that it blends with the
637            MDCT of the next frame. */
638         for (i=0;i<overlap/2;i++)
639         {
640            buf[DECODE_BUFFER_SIZE+i] =
641               MULT16_32_Q15(window[i], etmp[overlap-1-i])
642               + MULT16_32_Q15(window[overlap-i-1], etmp[i]);
643         }
644      } while (++c<C);
645   }
646
647   deemphasis(out_syn, pcm, N, C, downsample,
648         mode->preemph, st->preemph_memD, scratch);
649
650   st->loss_count = loss_count+1;
651
652   RESTORE_STACK;
653}
654
655int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec)
656{
657   int c, i, N;
658   int spread_decision;
659   opus_int32 bits;
660   ec_dec _dec;
661   VARDECL(celt_sig, freq);
662   VARDECL(celt_norm, X);
663   VARDECL(int, fine_quant);
664   VARDECL(int, pulses);
665   VARDECL(int, cap);
666   VARDECL(int, offsets);
667   VARDECL(int, fine_priority);
668   VARDECL(int, tf_res);
669   VARDECL(unsigned char, collapse_masks);
670   celt_sig *decode_mem[2];
671   celt_sig *out_syn[2];
672   opus_val16 *lpc;
673   opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
674
675   int shortBlocks;
676   int isTransient;
677   int intra_ener;
678   const int CC = st->channels;
679   int LM, M;
680   int effEnd;
681   int codedBands;
682   int alloc_trim;
683   int postfilter_pitch;
684   opus_val16 postfilter_gain;
685   int intensity=0;
686   int dual_stereo=0;
687   opus_int32 total_bits;
688   opus_int32 balance;
689   opus_int32 tell;
690   int dynalloc_logp;
691   int postfilter_tapset;
692   int anti_collapse_rsv;
693   int anti_collapse_on=0;
694   int silence;
695   int C = st->stream_channels;
696   const OpusCustomMode *mode;
697   int nbEBands;
698   int overlap;
699   const opus_int16 *eBands;
700   ALLOC_STACK;
701
702   mode = st->mode;
703   nbEBands = mode->nbEBands;
704   overlap = mode->overlap;
705   eBands = mode->eBands;
706   frame_size *= st->downsample;
707
708   c=0; do {
709      decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap);
710   } while (++c<CC);
711   lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC);
712   oldBandE = lpc+CC*LPC_ORDER;
713   oldLogE = oldBandE + 2*nbEBands;
714   oldLogE2 = oldLogE + 2*nbEBands;
715   backgroundLogE = oldLogE2  + 2*nbEBands;
716
717#ifdef CUSTOM_MODES
718   if (st->signalling && data!=NULL)
719   {
720      int data0=data[0];
721      /* Convert "standard mode" to Opus header */
722      if (mode->Fs==48000 && mode->shortMdctSize==120)
723      {
724         data0 = fromOpus(data0);
725         if (data0<0)
726            return OPUS_INVALID_PACKET;
727      }
728      st->end = IMAX(1, mode->effEBands-2*(data0>>5));
729      LM = (data0>>3)&0x3;
730      C = 1 + ((data0>>2)&0x1);
731      data++;
732      len--;
733      if (LM>mode->maxLM)
734         return OPUS_INVALID_PACKET;
735      if (frame_size < mode->shortMdctSize<<LM)
736         return OPUS_BUFFER_TOO_SMALL;
737      else
738         frame_size = mode->shortMdctSize<<LM;
739   } else {
740#else
741   {
742#endif
743      for (LM=0;LM<=mode->maxLM;LM++)
744         if (mode->shortMdctSize<<LM==frame_size)
745            break;
746      if (LM>mode->maxLM)
747         return OPUS_BAD_ARG;
748   }
749   M=1<<LM;
750
751   if (len<0 || len>1275 || pcm==NULL)
752      return OPUS_BAD_ARG;
753
754   N = M*mode->shortMdctSize;
755
756   effEnd = st->end;
757   if (effEnd > mode->effEBands)
758      effEnd = mode->effEBands;
759
760   if (data == NULL || len<=1)
761   {
762      celt_decode_lost(st, pcm, N, LM);
763      RESTORE_STACK;
764      return frame_size/st->downsample;
765   }
766
767   if (dec == NULL)
768   {
769      ec_dec_init(&_dec,(unsigned char*)data,len);
770      dec = &_dec;
771   }
772
773   if (C==1)
774   {
775      for (i=0;i<nbEBands;i++)
776         oldBandE[i]=MAX16(oldBandE[i],oldBandE[nbEBands+i]);
777   }
778
779   total_bits = len*8;
780   tell = ec_tell(dec);
781
782   if (tell >= total_bits)
783      silence = 1;
784   else if (tell==1)
785      silence = ec_dec_bit_logp(dec, 15);
786   else
787      silence = 0;
788   if (silence)
789   {
790      /* Pretend we've read all the remaining bits */
791      tell = len*8;
792      dec->nbits_total+=tell-ec_tell(dec);
793   }
794
795   postfilter_gain = 0;
796   postfilter_pitch = 0;
797   postfilter_tapset = 0;
798   if (st->start==0 && tell+16 <= total_bits)
799   {
800      if(ec_dec_bit_logp(dec, 1))
801      {
802         int qg, octave;
803         octave = ec_dec_uint(dec, 6);
804         postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
805         qg = ec_dec_bits(dec, 3);
806         if (ec_tell(dec)+2<=total_bits)
807            postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
808         postfilter_gain = QCONST16(.09375f,15)*(qg+1);
809      }
810      tell = ec_tell(dec);
811   }
812
813   if (LM > 0 && tell+3 <= total_bits)
814   {
815      isTransient = ec_dec_bit_logp(dec, 3);
816      tell = ec_tell(dec);
817   }
818   else
819      isTransient = 0;
820
821   if (isTransient)
822      shortBlocks = M;
823   else
824      shortBlocks = 0;
825
826   /* Decode the global flags (first symbols in the stream) */
827   intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
828   /* Get band energies */
829   unquant_coarse_energy(mode, st->start, st->end, oldBandE,
830         intra_ener, dec, C, LM);
831
832   ALLOC(tf_res, nbEBands, int);
833   tf_decode(st->start, st->end, isTransient, tf_res, LM, dec);
834
835   tell = ec_tell(dec);
836   spread_decision = SPREAD_NORMAL;
837   if (tell+4 <= total_bits)
838      spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
839
840   ALLOC(cap, nbEBands, int);
841
842   init_caps(mode,cap,LM,C);
843
844   ALLOC(offsets, nbEBands, int);
845
846   dynalloc_logp = 6;
847   total_bits<<=BITRES;
848   tell = ec_tell_frac(dec);
849   for (i=st->start;i<st->end;i++)
850   {
851      int width, quanta;
852      int dynalloc_loop_logp;
853      int boost;
854      width = C*(eBands[i+1]-eBands[i])<<LM;
855      /* quanta is 6 bits, but no more than 1 bit/sample
856         and no less than 1/8 bit/sample */
857      quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
858      dynalloc_loop_logp = dynalloc_logp;
859      boost = 0;
860      while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
861      {
862         int flag;
863         flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
864         tell = ec_tell_frac(dec);
865         if (!flag)
866            break;
867         boost += quanta;
868         total_bits -= quanta;
869         dynalloc_loop_logp = 1;
870      }
871      offsets[i] = boost;
872      /* Making dynalloc more likely */
873      if (boost>0)
874         dynalloc_logp = IMAX(2, dynalloc_logp-1);
875   }
876
877   ALLOC(fine_quant, nbEBands, int);
878   alloc_trim = tell+(6<<BITRES) <= total_bits ?
879         ec_dec_icdf(dec, trim_icdf, 7) : 5;
880
881   bits = (((opus_int32)len*8)<<BITRES) - ec_tell_frac(dec) - 1;
882   anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
883   bits -= anti_collapse_rsv;
884
885   ALLOC(pulses, nbEBands, int);
886   ALLOC(fine_priority, nbEBands, int);
887
888   codedBands = compute_allocation(mode, st->start, st->end, offsets, cap,
889         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
890         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
891
892   unquant_fine_energy(mode, st->start, st->end, oldBandE, fine_quant, dec, C);
893
894   /* Decode fixed codebook */
895   ALLOC(collapse_masks, C*nbEBands, unsigned char);
896   ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
897
898   quant_all_bands(0, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks,
899         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
900         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng);
901
902   if (anti_collapse_rsv > 0)
903   {
904      anti_collapse_on = ec_dec_bits(dec, 1);
905   }
906
907   unquant_energy_finalise(mode, st->start, st->end, oldBandE,
908         fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
909
910   if (anti_collapse_on)
911      anti_collapse(mode, X, collapse_masks, LM, C, N,
912            st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng);
913
914   ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */
915
916   if (silence)
917   {
918      for (i=0;i<C*nbEBands;i++)
919         oldBandE[i] = -QCONST16(28.f,DB_SHIFT);
920      for (i=0;i<C*N;i++)
921         freq[i] = 0;
922   } else {
923      /* Synthesis */
924      denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M);
925   }
926   c=0; do {
927      OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap/2);
928   } while (++c<CC);
929
930   c=0; do {
931      int bound = M*eBands[effEnd];
932      if (st->downsample!=1)
933         bound = IMIN(bound, N/st->downsample);
934      for (i=bound;i<N;i++)
935         freq[c*N+i] = 0;
936   } while (++c<C);
937
938   c=0; do {
939      out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N;
940   } while (++c<CC);
941
942   if (CC==2&&C==1)
943   {
944      for (i=0;i<N;i++)
945         freq[N+i] = freq[i];
946   }
947   if (CC==1&&C==2)
948   {
949      for (i=0;i<N;i++)
950         freq[i] = HALF32(ADD32(freq[i],freq[N+i]));
951   }
952
953   /* Compute inverse MDCTs */
954   compute_inv_mdcts(mode, shortBlocks, freq, out_syn, CC, LM);
955
956   c=0; do {
957      st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
958      st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
959      comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
960            st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
961            mode->window, overlap);
962      if (LM!=0)
963         comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
964               st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
965               mode->window, overlap);
966
967   } while (++c<CC);
968   st->postfilter_period_old = st->postfilter_period;
969   st->postfilter_gain_old = st->postfilter_gain;
970   st->postfilter_tapset_old = st->postfilter_tapset;
971   st->postfilter_period = postfilter_pitch;
972   st->postfilter_gain = postfilter_gain;
973   st->postfilter_tapset = postfilter_tapset;
974   if (LM!=0)
975   {
976      st->postfilter_period_old = st->postfilter_period;
977      st->postfilter_gain_old = st->postfilter_gain;
978      st->postfilter_tapset_old = st->postfilter_tapset;
979   }
980
981   if (C==1) {
982      for (i=0;i<nbEBands;i++)
983         oldBandE[nbEBands+i]=oldBandE[i];
984   }
985
986   /* In case start or end were to change */
987   if (!isTransient)
988   {
989      for (i=0;i<2*nbEBands;i++)
990         oldLogE2[i] = oldLogE[i];
991      for (i=0;i<2*nbEBands;i++)
992         oldLogE[i] = oldBandE[i];
993      for (i=0;i<2*nbEBands;i++)
994         backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIFT), oldBandE[i]);
995   } else {
996      for (i=0;i<2*nbEBands;i++)
997         oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
998   }
999   c=0; do
1000   {
1001      for (i=0;i<st->start;i++)
1002      {
1003         oldBandE[c*nbEBands+i]=0;
1004         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
1005      }
1006      for (i=st->end;i<nbEBands;i++)
1007      {
1008         oldBandE[c*nbEBands+i]=0;
1009         oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
1010      }
1011   } while (++c<2);
1012   st->rng = dec->rng;
1013
1014   /* We reuse freq[] as scratch space for the de-emphasis */
1015   deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, freq);
1016   st->loss_count = 0;
1017   RESTORE_STACK;
1018   if (ec_tell(dec) > 8*len)
1019      return OPUS_INTERNAL_ERROR;
1020   if(ec_get_error(dec))
1021      st->error = 1;
1022   return frame_size/st->downsample;
1023}
1024
1025
1026#ifdef CUSTOM_MODES
1027
1028#ifdef FIXED_POINT
1029int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
1030{
1031   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL);
1032}
1033
1034#ifndef DISABLE_FLOAT_API
1035int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
1036{
1037   int j, ret, C, N;
1038   VARDECL(opus_int16, out);
1039   ALLOC_STACK;
1040
1041   if (pcm==NULL)
1042      return OPUS_BAD_ARG;
1043
1044   C = st->channels;
1045   N = frame_size;
1046
1047   ALLOC(out, C*N, opus_int16);
1048   ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL);
1049   if (ret>0)
1050      for (j=0;j<C*ret;j++)
1051         pcm[j]=out[j]*(1.f/32768.f);
1052
1053   RESTORE_STACK;
1054   return ret;
1055}
1056#endif /* DISABLE_FLOAT_API */
1057
1058#else
1059
1060int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
1061{
1062   return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL);
1063}
1064
1065int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
1066{
1067   int j, ret, C, N;
1068   VARDECL(celt_sig, out);
1069   ALLOC_STACK;
1070
1071   if (pcm==NULL)
1072      return OPUS_BAD_ARG;
1073
1074   C = st->channels;
1075   N = frame_size;
1076   ALLOC(out, C*N, celt_sig);
1077
1078   ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL);
1079
1080   if (ret>0)
1081      for (j=0;j<C*ret;j++)
1082         pcm[j] = FLOAT2INT16 (out[j]);
1083
1084   RESTORE_STACK;
1085   return ret;
1086}
1087
1088#endif
1089#endif /* CUSTOM_MODES */
1090
1091int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...)
1092{
1093   va_list ap;
1094
1095   va_start(ap, request);
1096   switch (request)
1097   {
1098      case CELT_SET_START_BAND_REQUEST:
1099      {
1100         opus_int32 value = va_arg(ap, opus_int32);
1101         if (value<0 || value>=st->mode->nbEBands)
1102            goto bad_arg;
1103         st->start = value;
1104      }
1105      break;
1106      case CELT_SET_END_BAND_REQUEST:
1107      {
1108         opus_int32 value = va_arg(ap, opus_int32);
1109         if (value<1 || value>st->mode->nbEBands)
1110            goto bad_arg;
1111         st->end = value;
1112      }
1113      break;
1114      case CELT_SET_CHANNELS_REQUEST:
1115      {
1116         opus_int32 value = va_arg(ap, opus_int32);
1117         if (value<1 || value>2)
1118            goto bad_arg;
1119         st->stream_channels = value;
1120      }
1121      break;
1122      case CELT_GET_AND_CLEAR_ERROR_REQUEST:
1123      {
1124         opus_int32 *value = va_arg(ap, opus_int32*);
1125         if (value==NULL)
1126            goto bad_arg;
1127         *value=st->error;
1128         st->error = 0;
1129      }
1130      break;
1131      case OPUS_GET_LOOKAHEAD_REQUEST:
1132      {
1133         opus_int32 *value = va_arg(ap, opus_int32*);
1134         if (value==NULL)
1135            goto bad_arg;
1136         *value = st->overlap/st->downsample;
1137      }
1138      break;
1139      case OPUS_RESET_STATE:
1140      {
1141         int i;
1142         opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2;
1143         lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels);
1144         oldBandE = lpc+st->channels*LPC_ORDER;
1145         oldLogE = oldBandE + 2*st->mode->nbEBands;
1146         oldLogE2 = oldLogE + 2*st->mode->nbEBands;
1147         OPUS_CLEAR((char*)&st->DECODER_RESET_START,
1148               opus_custom_decoder_get_size(st->mode, st->channels)-
1149               ((char*)&st->DECODER_RESET_START - (char*)st));
1150         for (i=0;i<2*st->mode->nbEBands;i++)
1151            oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
1152      }
1153      break;
1154      case OPUS_GET_PITCH_REQUEST:
1155      {
1156         opus_int32 *value = va_arg(ap, opus_int32*);
1157         if (value==NULL)
1158            goto bad_arg;
1159         *value = st->postfilter_period;
1160      }
1161      break;
1162      case CELT_GET_MODE_REQUEST:
1163      {
1164         const CELTMode ** value = va_arg(ap, const CELTMode**);
1165         if (value==0)
1166            goto bad_arg;
1167         *value=st->mode;
1168      }
1169      break;
1170      case CELT_SET_SIGNALLING_REQUEST:
1171      {
1172         opus_int32 value = va_arg(ap, opus_int32);
1173         st->signalling = value;
1174      }
1175      break;
1176      case OPUS_GET_FINAL_RANGE_REQUEST:
1177      {
1178         opus_uint32 * value = va_arg(ap, opus_uint32 *);
1179         if (value==0)
1180            goto bad_arg;
1181         *value=st->rng;
1182      }
1183      break;
1184      default:
1185         goto bad_request;
1186   }
1187   va_end(ap);
1188   return OPUS_OK;
1189bad_arg:
1190   va_end(ap);
1191   return OPUS_BAD_ARG;
1192bad_request:
1193      va_end(ap);
1194  return OPUS_UNIMPLEMENTED;
1195}
1196