• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2010 Xiph.Org Foundation, Skype Limited
2    Written by Jean-Marc Valin and Koen Vos */
3 /*
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions
6    are met:
7 
8    - Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10 
11    - Redistributions in binary form must reproduce the above copyright
12    notice, this list of conditions and the following disclaimer in the
13    documentation and/or other materials provided with the distribution.
14 
15    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31 
32 #ifndef OPUS_BUILD
33 # error "OPUS_BUILD _MUST_ be defined to build Opus. This probably means you need other defines as well, as in a config.h. See the included build files for details."
34 #endif
35 
36 #if defined(__GNUC__) && (__GNUC__ >= 2) && !defined(__OPTIMIZE__) && !defined(OPUS_WILL_BE_SLOW)
37 # pragma message "You appear to be compiling without optimization, if so opus will be very slow."
38 #endif
39 
40 #include <stdarg.h>
41 #include "celt.h"
42 #include "opus.h"
43 #include "entdec.h"
44 #include "modes.h"
45 #include "API.h"
46 #include "stack_alloc.h"
47 #include "float_cast.h"
48 #include "opus_private.h"
49 #include "os_support.h"
50 #include "structs.h"
51 #include "define.h"
52 #include "mathops.h"
53 #include "cpu_support.h"
54 
55 struct OpusDecoder {
56    int          celt_dec_offset;
57    int          silk_dec_offset;
58    int          channels;
59    opus_int32   Fs;          /** Sampling rate (at the API level) */
60    silk_DecControlStruct DecControl;
61    int          decode_gain;
62    int          arch;
63 
64    /* Everything beyond this point gets cleared on a reset */
65 #define OPUS_DECODER_RESET_START stream_channels
66    int          stream_channels;
67 
68    int          bandwidth;
69    int          mode;
70    int          prev_mode;
71    int          frame_size;
72    int          prev_redundancy;
73    int          last_packet_duration;
74 #ifndef FIXED_POINT
75    opus_val16   softclip_mem[2];
76 #endif
77 
78    opus_uint32  rangeFinal;
79 };
80 
81 
opus_decoder_get_size(int channels)82 int opus_decoder_get_size(int channels)
83 {
84    int silkDecSizeBytes, celtDecSizeBytes;
85    int ret;
86    if (channels<1 || channels > 2)
87       return 0;
88    ret = silk_Get_Decoder_Size( &silkDecSizeBytes );
89    if(ret)
90       return 0;
91    silkDecSizeBytes = align(silkDecSizeBytes);
92    celtDecSizeBytes = celt_decoder_get_size(channels);
93    return align(sizeof(OpusDecoder))+silkDecSizeBytes+celtDecSizeBytes;
94 }
95 
opus_decoder_init(OpusDecoder * st,opus_int32 Fs,int channels)96 int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels)
97 {
98    void *silk_dec;
99    CELTDecoder *celt_dec;
100    int ret, silkDecSizeBytes;
101 
102    if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000)
103     || (channels!=1&&channels!=2))
104       return OPUS_BAD_ARG;
105 
106    OPUS_CLEAR((char*)st, opus_decoder_get_size(channels));
107    /* Initialize SILK encoder */
108    ret = silk_Get_Decoder_Size(&silkDecSizeBytes);
109    if (ret)
110       return OPUS_INTERNAL_ERROR;
111 
112    silkDecSizeBytes = align(silkDecSizeBytes);
113    st->silk_dec_offset = align(sizeof(OpusDecoder));
114    st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes;
115    silk_dec = (char*)st+st->silk_dec_offset;
116    celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset);
117    st->stream_channels = st->channels = channels;
118 
119    st->Fs = Fs;
120    st->DecControl.API_sampleRate = st->Fs;
121    st->DecControl.nChannelsAPI      = st->channels;
122 
123    /* Reset decoder */
124    ret = silk_InitDecoder( silk_dec );
125    if(ret)return OPUS_INTERNAL_ERROR;
126 
127    /* Initialize CELT decoder */
128    ret = celt_decoder_init(celt_dec, Fs, channels);
129    if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR;
130 
131    celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0));
132 
133    st->prev_mode = 0;
134    st->frame_size = Fs/400;
135    st->arch = opus_select_arch();
136    return OPUS_OK;
137 }
138 
opus_decoder_create(opus_int32 Fs,int channels,int * error)139 OpusDecoder *opus_decoder_create(opus_int32 Fs, int channels, int *error)
140 {
141    int ret;
142    OpusDecoder *st;
143    if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000)
144     || (channels!=1&&channels!=2))
145    {
146       if (error)
147          *error = OPUS_BAD_ARG;
148       return NULL;
149    }
150    st = (OpusDecoder *)opus_alloc(opus_decoder_get_size(channels));
151    if (st == NULL)
152    {
153       if (error)
154          *error = OPUS_ALLOC_FAIL;
155       return NULL;
156    }
157    ret = opus_decoder_init(st, Fs, channels);
158    if (error)
159       *error = ret;
160    if (ret != OPUS_OK)
161    {
162       opus_free(st);
163       st = NULL;
164    }
165    return st;
166 }
167 
smooth_fade(const opus_val16 * in1,const opus_val16 * in2,opus_val16 * out,int overlap,int channels,const opus_val16 * window,opus_int32 Fs)168 static void smooth_fade(const opus_val16 *in1, const opus_val16 *in2,
169       opus_val16 *out, int overlap, int channels,
170       const opus_val16 *window, opus_int32 Fs)
171 {
172    int i, c;
173    int inc = 48000/Fs;
174    for (c=0;c<channels;c++)
175    {
176       for (i=0;i<overlap;i++)
177       {
178          opus_val16 w = MULT16_16_Q15(window[i*inc], window[i*inc]);
179          out[i*channels+c] = SHR32(MAC16_16(MULT16_16(w,in2[i*channels+c]),
180                                    Q15ONE-w, in1[i*channels+c]), 15);
181       }
182    }
183 }
184 
opus_packet_get_mode(const unsigned char * data)185 static int opus_packet_get_mode(const unsigned char *data)
186 {
187    int mode;
188    if (data[0]&0x80)
189    {
190       mode = MODE_CELT_ONLY;
191    } else if ((data[0]&0x60) == 0x60)
192    {
193       mode = MODE_HYBRID;
194    } else {
195       mode = MODE_SILK_ONLY;
196    }
197    return mode;
198 }
199 
opus_decode_frame(OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_val16 * pcm,int frame_size,int decode_fec)200 static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
201       opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec)
202 {
203    void *silk_dec;
204    CELTDecoder *celt_dec;
205    int i, silk_ret=0, celt_ret=0;
206    ec_dec dec;
207    opus_int32 silk_frame_size;
208    int pcm_silk_size;
209    VARDECL(opus_int16, pcm_silk);
210    int pcm_transition_silk_size;
211    VARDECL(opus_val16, pcm_transition_silk);
212    int pcm_transition_celt_size;
213    VARDECL(opus_val16, pcm_transition_celt);
214    opus_val16 *pcm_transition=NULL;
215    int redundant_audio_size;
216    VARDECL(opus_val16, redundant_audio);
217 
218    int audiosize;
219    int mode;
220    int transition=0;
221    int start_band;
222    int redundancy=0;
223    int redundancy_bytes = 0;
224    int celt_to_silk=0;
225    int c;
226    int F2_5, F5, F10, F20;
227    const opus_val16 *window;
228    opus_uint32 redundant_rng = 0;
229    int celt_accum;
230    ALLOC_STACK;
231 
232    silk_dec = (char*)st+st->silk_dec_offset;
233    celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset);
234    F20 = st->Fs/50;
235    F10 = F20>>1;
236    F5 = F10>>1;
237    F2_5 = F5>>1;
238    if (frame_size < F2_5)
239    {
240       RESTORE_STACK;
241       return OPUS_BUFFER_TOO_SMALL;
242    }
243    /* Limit frame_size to avoid excessive stack allocations. */
244    frame_size = IMIN(frame_size, st->Fs/25*3);
245    /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */
246    if (len<=1)
247    {
248       data = NULL;
249       /* In that case, don't conceal more than what the ToC says */
250       frame_size = IMIN(frame_size, st->frame_size);
251    }
252    if (data != NULL)
253    {
254       audiosize = st->frame_size;
255       mode = st->mode;
256       ec_dec_init(&dec,(unsigned char*)data,len);
257    } else {
258       audiosize = frame_size;
259       mode = st->prev_mode;
260 
261       if (mode == 0)
262       {
263          /* If we haven't got any packet yet, all we can do is return zeros */
264          for (i=0;i<audiosize*st->channels;i++)
265             pcm[i] = 0;
266          RESTORE_STACK;
267          return audiosize;
268       }
269 
270       /* Avoids trying to run the PLC on sizes other than 2.5 (CELT), 5 (CELT),
271          10, or 20 (e.g. 12.5 or 30 ms). */
272       if (audiosize > F20)
273       {
274          do {
275             int ret = opus_decode_frame(st, NULL, 0, pcm, IMIN(audiosize, F20), 0);
276             if (ret<0)
277             {
278                RESTORE_STACK;
279                return ret;
280             }
281             pcm += ret*st->channels;
282             audiosize -= ret;
283          } while (audiosize > 0);
284          RESTORE_STACK;
285          return frame_size;
286       } else if (audiosize < F20)
287       {
288          if (audiosize > F10)
289             audiosize = F10;
290          else if (mode != MODE_SILK_ONLY && audiosize > F5 && audiosize < F10)
291             audiosize = F5;
292       }
293    }
294 
295    /* In fixed-point, we can tell CELT to do the accumulation on top of the
296       SILK PCM buffer. This saves some stack space. */
297 #ifdef FIXED_POINT
298    celt_accum = (mode != MODE_CELT_ONLY) && (frame_size >= F10);
299 #else
300    celt_accum = 0;
301 #endif
302 
303    pcm_transition_silk_size = ALLOC_NONE;
304    pcm_transition_celt_size = ALLOC_NONE;
305    if (data!=NULL && st->prev_mode > 0 && (
306        (mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY && !st->prev_redundancy)
307     || (mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) )
308       )
309    {
310       transition = 1;
311       /* Decide where to allocate the stack memory for pcm_transition */
312       if (mode == MODE_CELT_ONLY)
313          pcm_transition_celt_size = F5*st->channels;
314       else
315          pcm_transition_silk_size = F5*st->channels;
316    }
317    ALLOC(pcm_transition_celt, pcm_transition_celt_size, opus_val16);
318    if (transition && mode == MODE_CELT_ONLY)
319    {
320       pcm_transition = pcm_transition_celt;
321       opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0);
322    }
323    if (audiosize > frame_size)
324    {
325       /*fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosize, frame_size, mode);*/
326       RESTORE_STACK;
327       return OPUS_BAD_ARG;
328    } else {
329       frame_size = audiosize;
330    }
331 
332    /* Don't allocate any memory when in CELT-only mode */
333    pcm_silk_size = (mode != MODE_CELT_ONLY && !celt_accum) ? IMAX(F10, frame_size)*st->channels : ALLOC_NONE;
334    ALLOC(pcm_silk, pcm_silk_size, opus_int16);
335 
336    /* SILK processing */
337    if (mode != MODE_CELT_ONLY)
338    {
339       int lost_flag, decoded_samples;
340       opus_int16 *pcm_ptr;
341 #ifdef FIXED_POINT
342       if (celt_accum)
343          pcm_ptr = pcm;
344       else
345 #endif
346          pcm_ptr = pcm_silk;
347 
348       if (st->prev_mode==MODE_CELT_ONLY)
349          silk_InitDecoder( silk_dec );
350 
351       /* The SILK PLC cannot produce frames of less than 10 ms */
352       st->DecControl.payloadSize_ms = IMAX(10, 1000 * audiosize / st->Fs);
353 
354       if (data != NULL)
355       {
356         st->DecControl.nChannelsInternal = st->stream_channels;
357         if( mode == MODE_SILK_ONLY ) {
358            if( st->bandwidth == OPUS_BANDWIDTH_NARROWBAND ) {
359               st->DecControl.internalSampleRate = 8000;
360            } else if( st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) {
361               st->DecControl.internalSampleRate = 12000;
362            } else if( st->bandwidth == OPUS_BANDWIDTH_WIDEBAND ) {
363               st->DecControl.internalSampleRate = 16000;
364            } else {
365               st->DecControl.internalSampleRate = 16000;
366               silk_assert( 0 );
367            }
368         } else {
369            /* Hybrid mode */
370            st->DecControl.internalSampleRate = 16000;
371         }
372      }
373 
374      lost_flag = data == NULL ? 1 : 2 * decode_fec;
375      decoded_samples = 0;
376      do {
377         /* Call SILK decoder */
378         int first_frame = decoded_samples == 0;
379         silk_ret = silk_Decode( silk_dec, &st->DecControl,
380                                 lost_flag, first_frame, &dec, pcm_ptr, &silk_frame_size, st->arch );
381         if( silk_ret ) {
382            if (lost_flag) {
383               /* PLC failure should not be fatal */
384               silk_frame_size = frame_size;
385               for (i=0;i<frame_size*st->channels;i++)
386                  pcm_ptr[i] = 0;
387            } else {
388              RESTORE_STACK;
389              return OPUS_INTERNAL_ERROR;
390            }
391         }
392         pcm_ptr += silk_frame_size * st->channels;
393         decoded_samples += silk_frame_size;
394       } while( decoded_samples < frame_size );
395    }
396 
397    start_band = 0;
398    if (!decode_fec && mode != MODE_CELT_ONLY && data != NULL
399     && ec_tell(&dec)+17+20*(st->mode == MODE_HYBRID) <= 8*len)
400    {
401       /* Check if we have a redundant 0-8 kHz band */
402       if (mode == MODE_HYBRID)
403          redundancy = ec_dec_bit_logp(&dec, 12);
404       else
405          redundancy = 1;
406       if (redundancy)
407       {
408          celt_to_silk = ec_dec_bit_logp(&dec, 1);
409          /* redundancy_bytes will be at least two, in the non-hybrid
410             case due to the ec_tell() check above */
411          redundancy_bytes = mode==MODE_HYBRID ?
412                (opus_int32)ec_dec_uint(&dec, 256)+2 :
413                len-((ec_tell(&dec)+7)>>3);
414          len -= redundancy_bytes;
415          /* This is a sanity check. It should never happen for a valid
416             packet, so the exact behaviour is not normative. */
417          if (len*8 < ec_tell(&dec))
418          {
419             len = 0;
420             redundancy_bytes = 0;
421             redundancy = 0;
422          }
423          /* Shrink decoder because of raw bits */
424          dec.storage -= redundancy_bytes;
425       }
426    }
427    if (mode != MODE_CELT_ONLY)
428       start_band = 17;
429 
430    {
431       int endband=21;
432 
433       switch(st->bandwidth)
434       {
435       case OPUS_BANDWIDTH_NARROWBAND:
436          endband = 13;
437          break;
438       case OPUS_BANDWIDTH_MEDIUMBAND:
439       case OPUS_BANDWIDTH_WIDEBAND:
440          endband = 17;
441          break;
442       case OPUS_BANDWIDTH_SUPERWIDEBAND:
443          endband = 19;
444          break;
445       case OPUS_BANDWIDTH_FULLBAND:
446          endband = 21;
447          break;
448       }
449       celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband));
450       celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels));
451    }
452 
453    if (redundancy)
454    {
455       transition = 0;
456       pcm_transition_silk_size=ALLOC_NONE;
457    }
458 
459    ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16);
460 
461    if (transition && mode != MODE_CELT_ONLY)
462    {
463       pcm_transition = pcm_transition_silk;
464       opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0);
465    }
466 
467    /* Only allocation memory for redundancy if/when needed */
468    redundant_audio_size = redundancy ? F5*st->channels : ALLOC_NONE;
469    ALLOC(redundant_audio, redundant_audio_size, opus_val16);
470 
471    /* 5 ms redundant frame for CELT->SILK*/
472    if (redundancy && celt_to_silk)
473    {
474       celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0));
475       celt_decode_with_ec(celt_dec, data+len, redundancy_bytes,
476                           redundant_audio, F5, NULL, 0);
477       celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng));
478    }
479 
480    /* MUST be after PLC */
481    celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(start_band));
482 
483    if (mode != MODE_SILK_ONLY)
484    {
485       int celt_frame_size = IMIN(F20, frame_size);
486       /* Make sure to discard any previous CELT state */
487       if (mode != st->prev_mode && st->prev_mode > 0 && !st->prev_redundancy)
488          celt_decoder_ctl(celt_dec, OPUS_RESET_STATE);
489       /* Decode CELT */
490       celt_ret = celt_decode_with_ec(celt_dec, decode_fec ? NULL : data,
491                                      len, pcm, celt_frame_size, &dec, celt_accum);
492    } else {
493       unsigned char silence[2] = {0xFF, 0xFF};
494       if (!celt_accum)
495       {
496          for (i=0;i<frame_size*st->channels;i++)
497             pcm[i] = 0;
498       }
499       /* For hybrid -> SILK transitions, we let the CELT MDCT
500          do a fade-out by decoding a silence frame */
501       if (st->prev_mode == MODE_HYBRID && !(redundancy && celt_to_silk && st->prev_redundancy) )
502       {
503          celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0));
504          celt_decode_with_ec(celt_dec, silence, 2, pcm, F2_5, NULL, celt_accum);
505       }
506    }
507 
508    if (mode != MODE_CELT_ONLY && !celt_accum)
509    {
510 #ifdef FIXED_POINT
511       for (i=0;i<frame_size*st->channels;i++)
512          pcm[i] = SAT16(ADD32(pcm[i], pcm_silk[i]));
513 #else
514       for (i=0;i<frame_size*st->channels;i++)
515          pcm[i] = pcm[i] + (opus_val16)((1.f/32768.f)*pcm_silk[i]);
516 #endif
517    }
518 
519    {
520       const CELTMode *celt_mode;
521       celt_decoder_ctl(celt_dec, CELT_GET_MODE(&celt_mode));
522       window = celt_mode->window;
523    }
524 
525    /* 5 ms redundant frame for SILK->CELT */
526    if (redundancy && !celt_to_silk)
527    {
528       celt_decoder_ctl(celt_dec, OPUS_RESET_STATE);
529       celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0));
530 
531       celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, redundant_audio, F5, NULL, 0);
532       celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng));
533       smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5,
534                   pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs);
535    }
536    if (redundancy && celt_to_silk)
537    {
538       for (c=0;c<st->channels;c++)
539       {
540          for (i=0;i<F2_5;i++)
541             pcm[st->channels*i+c] = redundant_audio[st->channels*i+c];
542       }
543       smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5,
544                   pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs);
545    }
546    if (transition)
547    {
548       if (audiosize >= F5)
549       {
550          for (i=0;i<st->channels*F2_5;i++)
551             pcm[i] = pcm_transition[i];
552          smooth_fade(pcm_transition+st->channels*F2_5, pcm+st->channels*F2_5,
553                      pcm+st->channels*F2_5, F2_5,
554                      st->channels, window, st->Fs);
555       } else {
556          /* Not enough time to do a clean transition, but we do it anyway
557             This will not preserve amplitude perfectly and may introduce
558             a bit of temporal aliasing, but it shouldn't be too bad and
559             that's pretty much the best we can do. In any case, generating this
560             transition it pretty silly in the first place */
561          smooth_fade(pcm_transition, pcm,
562                      pcm, F2_5,
563                      st->channels, window, st->Fs);
564       }
565    }
566 
567    if(st->decode_gain)
568    {
569       opus_val32 gain;
570       gain = celt_exp2(MULT16_16_P15(QCONST16(6.48814081e-4f, 25), st->decode_gain));
571       for (i=0;i<frame_size*st->channels;i++)
572       {
573          opus_val32 x;
574          x = MULT16_32_P16(pcm[i],gain);
575          pcm[i] = SATURATE(x, 32767);
576       }
577    }
578 
579    if (len <= 1)
580       st->rangeFinal = 0;
581    else
582       st->rangeFinal = dec.rng ^ redundant_rng;
583 
584    st->prev_mode = mode;
585    st->prev_redundancy = redundancy && !celt_to_silk;
586 
587    if (celt_ret>=0)
588    {
589       if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels))
590          OPUS_PRINT_INT(audiosize);
591    }
592 
593    RESTORE_STACK;
594    return celt_ret < 0 ? celt_ret : audiosize;
595 
596 }
597 
opus_decode_native(OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_val16 * pcm,int frame_size,int decode_fec,int self_delimited,opus_int32 * packet_offset,int soft_clip)598 int opus_decode_native(OpusDecoder *st, const unsigned char *data,
599       opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec,
600       int self_delimited, opus_int32 *packet_offset, int soft_clip)
601 {
602    int i, nb_samples;
603    int count, offset;
604    unsigned char toc;
605    int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels;
606    /* 48 x 2.5 ms = 120 ms */
607    opus_int16 size[48];
608    if (decode_fec<0 || decode_fec>1)
609       return OPUS_BAD_ARG;
610    /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */
611    if ((decode_fec || len==0 || data==NULL) && frame_size%(st->Fs/400)!=0)
612       return OPUS_BAD_ARG;
613    if (len==0 || data==NULL)
614    {
615       int pcm_count=0;
616       do {
617          int ret;
618          ret = opus_decode_frame(st, NULL, 0, pcm+pcm_count*st->channels, frame_size-pcm_count, 0);
619          if (ret<0)
620             return ret;
621          pcm_count += ret;
622       } while (pcm_count < frame_size);
623       celt_assert(pcm_count == frame_size);
624       if (OPUS_CHECK_ARRAY(pcm, pcm_count*st->channels))
625          OPUS_PRINT_INT(pcm_count);
626       st->last_packet_duration = pcm_count;
627       return pcm_count;
628    } else if (len<0)
629       return OPUS_BAD_ARG;
630 
631    packet_mode = opus_packet_get_mode(data);
632    packet_bandwidth = opus_packet_get_bandwidth(data);
633    packet_frame_size = opus_packet_get_samples_per_frame(data, st->Fs);
634    packet_stream_channels = opus_packet_get_nb_channels(data);
635 
636    count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL,
637                                   size, &offset, packet_offset);
638    if (count<0)
639       return count;
640 
641    data += offset;
642 
643    if (decode_fec)
644    {
645       int duration_copy;
646       int ret;
647       /* If no FEC can be present, run the PLC (recursive call) */
648       if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st->mode == MODE_CELT_ONLY)
649          return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, soft_clip);
650       /* Otherwise, run the PLC on everything except the size for which we might have FEC */
651       duration_copy = st->last_packet_duration;
652       if (frame_size-packet_frame_size!=0)
653       {
654          ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip);
655          if (ret<0)
656          {
657             st->last_packet_duration = duration_copy;
658             return ret;
659          }
660          celt_assert(ret==frame_size-packet_frame_size);
661       }
662       /* Complete with FEC */
663       st->mode = packet_mode;
664       st->bandwidth = packet_bandwidth;
665       st->frame_size = packet_frame_size;
666       st->stream_channels = packet_stream_channels;
667       ret = opus_decode_frame(st, data, size[0], pcm+st->channels*(frame_size-packet_frame_size),
668             packet_frame_size, 1);
669       if (ret<0)
670          return ret;
671       else {
672          if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels))
673             OPUS_PRINT_INT(frame_size);
674          st->last_packet_duration = frame_size;
675          return frame_size;
676       }
677    }
678 
679    if (count*packet_frame_size > frame_size)
680       return OPUS_BUFFER_TOO_SMALL;
681 
682    /* Update the state as the last step to avoid updating it on an invalid packet */
683    st->mode = packet_mode;
684    st->bandwidth = packet_bandwidth;
685    st->frame_size = packet_frame_size;
686    st->stream_channels = packet_stream_channels;
687 
688    nb_samples=0;
689    for (i=0;i<count;i++)
690    {
691       int ret;
692       ret = opus_decode_frame(st, data, size[i], pcm+nb_samples*st->channels, frame_size-nb_samples, 0);
693       if (ret<0)
694          return ret;
695       celt_assert(ret==packet_frame_size);
696       data += size[i];
697       nb_samples += ret;
698    }
699    st->last_packet_duration = nb_samples;
700    if (OPUS_CHECK_ARRAY(pcm, nb_samples*st->channels))
701       OPUS_PRINT_INT(nb_samples);
702 #ifndef FIXED_POINT
703    if (soft_clip)
704       opus_pcm_soft_clip(pcm, nb_samples, st->channels, st->softclip_mem);
705    else
706       st->softclip_mem[0]=st->softclip_mem[1]=0;
707 #endif
708    return nb_samples;
709 }
710 
711 #ifdef FIXED_POINT
712 
opus_decode(OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_val16 * pcm,int frame_size,int decode_fec)713 int opus_decode(OpusDecoder *st, const unsigned char *data,
714       opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec)
715 {
716    if(frame_size<=0)
717       return OPUS_BAD_ARG;
718    return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0);
719 }
720 
721 #ifndef DISABLE_FLOAT_API
opus_decode_float(OpusDecoder * st,const unsigned char * data,opus_int32 len,float * pcm,int frame_size,int decode_fec)722 int opus_decode_float(OpusDecoder *st, const unsigned char *data,
723       opus_int32 len, float *pcm, int frame_size, int decode_fec)
724 {
725    VARDECL(opus_int16, out);
726    int ret, i;
727    int nb_samples;
728    ALLOC_STACK;
729 
730    if(frame_size<=0)
731    {
732       RESTORE_STACK;
733       return OPUS_BAD_ARG;
734    }
735    if (data != NULL && len > 0 && !decode_fec)
736    {
737       nb_samples = opus_decoder_get_nb_samples(st, data, len);
738       if (nb_samples>0)
739          frame_size = IMIN(frame_size, nb_samples);
740       else
741          return OPUS_INVALID_PACKET;
742    }
743    ALLOC(out, frame_size*st->channels, opus_int16);
744 
745    ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 0);
746    if (ret > 0)
747    {
748       for (i=0;i<ret*st->channels;i++)
749          pcm[i] = (1.f/32768.f)*(out[i]);
750    }
751    RESTORE_STACK;
752    return ret;
753 }
754 #endif
755 
756 
757 #else
opus_decode(OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_int16 * pcm,int frame_size,int decode_fec)758 int opus_decode(OpusDecoder *st, const unsigned char *data,
759       opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec)
760 {
761    VARDECL(float, out);
762    int ret, i;
763    int nb_samples;
764    ALLOC_STACK;
765 
766    if(frame_size<=0)
767    {
768       RESTORE_STACK;
769       return OPUS_BAD_ARG;
770    }
771 
772    if (data != NULL && len > 0 && !decode_fec)
773    {
774       nb_samples = opus_decoder_get_nb_samples(st, data, len);
775       if (nb_samples>0)
776          frame_size = IMIN(frame_size, nb_samples);
777       else
778          return OPUS_INVALID_PACKET;
779    }
780    ALLOC(out, frame_size*st->channels, float);
781 
782    ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 1);
783    if (ret > 0)
784    {
785       for (i=0;i<ret*st->channels;i++)
786          pcm[i] = FLOAT2INT16(out[i]);
787    }
788    RESTORE_STACK;
789    return ret;
790 }
791 
opus_decode_float(OpusDecoder * st,const unsigned char * data,opus_int32 len,opus_val16 * pcm,int frame_size,int decode_fec)792 int opus_decode_float(OpusDecoder *st, const unsigned char *data,
793       opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec)
794 {
795    if(frame_size<=0)
796       return OPUS_BAD_ARG;
797    return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0);
798 }
799 
800 #endif
801 
opus_decoder_ctl(OpusDecoder * st,int request,...)802 int opus_decoder_ctl(OpusDecoder *st, int request, ...)
803 {
804    int ret = OPUS_OK;
805    va_list ap;
806    void *silk_dec;
807    CELTDecoder *celt_dec;
808 
809    silk_dec = (char*)st+st->silk_dec_offset;
810    celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset);
811 
812 
813    va_start(ap, request);
814 
815    switch (request)
816    {
817    case OPUS_GET_BANDWIDTH_REQUEST:
818    {
819       opus_int32 *value = va_arg(ap, opus_int32*);
820       if (!value)
821       {
822          goto bad_arg;
823       }
824       *value = st->bandwidth;
825    }
826    break;
827    case OPUS_GET_FINAL_RANGE_REQUEST:
828    {
829       opus_uint32 *value = va_arg(ap, opus_uint32*);
830       if (!value)
831       {
832          goto bad_arg;
833       }
834       *value = st->rangeFinal;
835    }
836    break;
837    case OPUS_RESET_STATE:
838    {
839       OPUS_CLEAR((char*)&st->OPUS_DECODER_RESET_START,
840             sizeof(OpusDecoder)-
841             ((char*)&st->OPUS_DECODER_RESET_START - (char*)st));
842 
843       celt_decoder_ctl(celt_dec, OPUS_RESET_STATE);
844       silk_InitDecoder( silk_dec );
845       st->stream_channels = st->channels;
846       st->frame_size = st->Fs/400;
847    }
848    break;
849    case OPUS_GET_SAMPLE_RATE_REQUEST:
850    {
851       opus_int32 *value = va_arg(ap, opus_int32*);
852       if (!value)
853       {
854          goto bad_arg;
855       }
856       *value = st->Fs;
857    }
858    break;
859    case OPUS_GET_PITCH_REQUEST:
860    {
861       opus_int32 *value = va_arg(ap, opus_int32*);
862       if (!value)
863       {
864          goto bad_arg;
865       }
866       if (st->prev_mode == MODE_CELT_ONLY)
867          celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value));
868       else
869          *value = st->DecControl.prevPitchLag;
870    }
871    break;
872    case OPUS_GET_GAIN_REQUEST:
873    {
874       opus_int32 *value = va_arg(ap, opus_int32*);
875       if (!value)
876       {
877          goto bad_arg;
878       }
879       *value = st->decode_gain;
880    }
881    break;
882    case OPUS_SET_GAIN_REQUEST:
883    {
884        opus_int32 value = va_arg(ap, opus_int32);
885        if (value<-32768 || value>32767)
886        {
887           goto bad_arg;
888        }
889        st->decode_gain = value;
890    }
891    break;
892    case OPUS_GET_LAST_PACKET_DURATION_REQUEST:
893    {
894       opus_uint32 *value = va_arg(ap, opus_uint32*);
895       if (!value)
896       {
897          goto bad_arg;
898       }
899       *value = st->last_packet_duration;
900    }
901    break;
902    default:
903       /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/
904       ret = OPUS_UNIMPLEMENTED;
905       break;
906    }
907 
908    va_end(ap);
909    return ret;
910 bad_arg:
911    va_end(ap);
912    return OPUS_BAD_ARG;
913 }
914 
opus_decoder_destroy(OpusDecoder * st)915 void opus_decoder_destroy(OpusDecoder *st)
916 {
917    opus_free(st);
918 }
919 
920 
opus_packet_get_bandwidth(const unsigned char * data)921 int opus_packet_get_bandwidth(const unsigned char *data)
922 {
923    int bandwidth;
924    if (data[0]&0x80)
925    {
926       bandwidth = OPUS_BANDWIDTH_MEDIUMBAND + ((data[0]>>5)&0x3);
927       if (bandwidth == OPUS_BANDWIDTH_MEDIUMBAND)
928          bandwidth = OPUS_BANDWIDTH_NARROWBAND;
929    } else if ((data[0]&0x60) == 0x60)
930    {
931       bandwidth = (data[0]&0x10) ? OPUS_BANDWIDTH_FULLBAND :
932                                    OPUS_BANDWIDTH_SUPERWIDEBAND;
933    } else {
934       bandwidth = OPUS_BANDWIDTH_NARROWBAND + ((data[0]>>5)&0x3);
935    }
936    return bandwidth;
937 }
938 
opus_packet_get_nb_channels(const unsigned char * data)939 int opus_packet_get_nb_channels(const unsigned char *data)
940 {
941    return (data[0]&0x4) ? 2 : 1;
942 }
943 
opus_packet_get_nb_frames(const unsigned char packet[],opus_int32 len)944 int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len)
945 {
946    int count;
947    if (len<1)
948       return OPUS_BAD_ARG;
949    count = packet[0]&0x3;
950    if (count==0)
951       return 1;
952    else if (count!=3)
953       return 2;
954    else if (len<2)
955       return OPUS_INVALID_PACKET;
956    else
957       return packet[1]&0x3F;
958 }
959 
opus_packet_get_nb_samples(const unsigned char packet[],opus_int32 len,opus_int32 Fs)960 int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len,
961       opus_int32 Fs)
962 {
963    int samples;
964    int count = opus_packet_get_nb_frames(packet, len);
965 
966    if (count<0)
967       return count;
968 
969    samples = count*opus_packet_get_samples_per_frame(packet, Fs);
970    /* Can't have more than 120 ms */
971    if (samples*25 > Fs*3)
972       return OPUS_INVALID_PACKET;
973    else
974       return samples;
975 }
976 
opus_decoder_get_nb_samples(const OpusDecoder * dec,const unsigned char packet[],opus_int32 len)977 int opus_decoder_get_nb_samples(const OpusDecoder *dec,
978       const unsigned char packet[], opus_int32 len)
979 {
980    return opus_packet_get_nb_samples(packet, len, dec->Fs);
981 }
982