1 /* Copyright (c) 2010 Xiph.Org Foundation, Skype Limited
2 Written by Jean-Marc Valin and Koen Vos */
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
8 - Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
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.
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 FOUNDATION OR
19 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.
36 #include "opus_decoder.h"
39 #include "SKP_Silk_SDK_API.h"
42 OpusDecoder *opus_decoder_create(int Fs, int channels)
45 int ret, silkDecSizeBytes, celtDecSizeBytes;
48 /* Initialize SILK encoder */
49 ret = SKP_Silk_SDK_Get_Decoder_Size( &silkDecSizeBytes );
53 celtDecSizeBytes = celt_decoder_get_size(channels);
54 raw_state = calloc(sizeof(OpusDecoder)+silkDecSizeBytes+celtDecSizeBytes, 1);
55 st = (OpusDecoder*)raw_state;
56 st->silk_dec = (void*)(raw_state+sizeof(OpusDecoder));
57 st->celt_dec = (CELTDecoder*)(raw_state+sizeof(OpusDecoder)+silkDecSizeBytes);
58 st->stream_channels = st->channels = channels;
63 ret = SKP_Silk_SDK_InitDecoder( st->silk_dec );
68 /* Initialize CELT decoder */
69 st->celt_dec = celt_decoder_init(st->celt_dec, Fs, channels, NULL);
70 celt_decoder_ctl(st->celt_dec, CELT_SET_SIGNALLING(0));
76 static void smooth_fade(const short *in1, const short *in2, short *out,
77 int overlap, int channels, const celt_word16 *window, int Fs)
81 for (c=0;c<channels;c++)
83 for (i=0;i<overlap;i++)
85 celt_word16 w = MULT16_16_Q15(window[i*inc], window[i*inc]);
86 out[i*channels+c] = SHR32(MAC16_16(MULT16_16(w,in2[i*channels+c]),
87 Q15ONE-w, in1[i*channels+c]), 15);
92 static int opus_packet_get_mode(const unsigned char *data)
97 mode = MODE_CELT_ONLY;
98 } else if ((data[0]&0x60) == 0x60)
103 mode = MODE_SILK_ONLY;
108 static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
109 int len, short *pcm, int frame_size, int decode_fec)
111 int i, silk_ret=0, celt_ret=0;
113 SKP_SILK_SDK_DecControlStruct DecControl;
114 SKP_int32 silk_frame_size;
115 short pcm_celt[960*2];
116 short pcm_transition[960*2];
122 int redundancy_bytes = 0;
124 short redundant_audio[240*2];
127 const celt_word16 *window;
132 /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */
136 audiosize = st->frame_size;
140 ec_dec_init(&dec,(unsigned char*)data,len);
142 mode = st->prev_mode;
145 if (st->stream_channels > st->channels)
146 return OPUS_CORRUPTED_DATA;
148 if (data!=NULL && !st->prev_redundancy && mode != st->prev_mode && st->prev_mode > 0
149 && !(mode == MODE_SILK_ONLY && st->prev_mode == MODE_HYBRID)
150 && !(mode == MODE_HYBRID && st->prev_mode == MODE_SILK_ONLY))
153 if (mode == MODE_CELT_ONLY)
154 opus_decode_frame(st, NULL, 0, pcm_transition, IMAX(F10, audiosize), 0);
156 if (audiosize > frame_size)
158 fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosize, frame_size, mode);
161 frame_size = audiosize;
164 /* SILK processing */
165 if (mode != MODE_CELT_ONLY)
167 int lost_flag, decoded_samples;
168 SKP_int16 *pcm_ptr = pcm;
170 if (st->prev_mode==MODE_CELT_ONLY)
171 SKP_Silk_SDK_InitDecoder( st->silk_dec );
173 DecControl.API_sampleRate = st->Fs;
174 DecControl.payloadSize_ms = 1000 * audiosize / st->Fs;
175 if( mode == MODE_SILK_ONLY ) {
176 if( st->bandwidth == BANDWIDTH_NARROWBAND ) {
177 DecControl.internalSampleRate = 8000;
178 } else if( st->bandwidth == BANDWIDTH_MEDIUMBAND ) {
179 DecControl.internalSampleRate = 12000;
180 } else if( st->bandwidth == BANDWIDTH_WIDEBAND ) {
181 DecControl.internalSampleRate = 16000;
183 DecControl.internalSampleRate = 16000;
188 DecControl.internalSampleRate = 16000;
190 DecControl.nChannels = st->channels;
192 lost_flag = data == NULL ? 1 : 2 * decode_fec;
195 /* Call SILK decoder */
196 int first_frame = decoded_samples == 0;
197 silk_ret = SKP_Silk_SDK_Decode( st->silk_dec, &DecControl,
198 lost_flag, first_frame, &dec, pcm_ptr, &silk_frame_size );
200 fprintf (stderr, "SILK decode error\n");
203 pcm_ptr += silk_frame_size * st->channels;
204 decoded_samples += silk_frame_size;
205 } while( decoded_samples < frame_size );
207 for (i=0;i<frame_size*st->channels;i++)
212 if (mode != MODE_CELT_ONLY && data != NULL)
214 /* Check if we have a redundant 0-8 kHz band */
215 redundancy = ec_dec_bit_logp(&dec, 12);
218 celt_to_silk = ec_dec_bit_logp(&dec, 1);
219 if (mode == MODE_HYBRID)
220 redundancy_bytes = 2 + ec_dec_uint(&dec, 256);
222 redundancy_bytes = len - ((ec_tell(&dec)+7)>>3);
223 len -= redundancy_bytes;
225 return CELT_CORRUPTED_DATA;
226 /* Shrink decoder because of raw bits */
227 dec.storage -= redundancy_bytes;
230 if (mode != MODE_CELT_ONLY)
233 if (mode != MODE_SILK_ONLY)
237 switch(st->bandwidth)
239 case BANDWIDTH_NARROWBAND:
242 case BANDWIDTH_WIDEBAND:
245 case BANDWIDTH_SUPERWIDEBAND:
248 case BANDWIDTH_FULLBAND:
252 celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(endband));
253 celt_decoder_ctl(st->celt_dec, CELT_SET_CHANNELS(st->stream_channels));
259 if (transition && mode != MODE_CELT_ONLY)
260 opus_decode_frame(st, NULL, 0, pcm_transition, IMAX(F10, audiosize), 0);
262 /* 5 ms redundant frame for CELT->SILK*/
263 if (redundancy && celt_to_silk)
265 celt_decode(st->celt_dec, data+len, redundancy_bytes, redundant_audio, F5);
266 celt_decoder_ctl(st->celt_dec, CELT_RESET_STATE);
269 /* MUST be after PLC */
270 celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(start_band));
273 celt_decoder_ctl(st->celt_dec, CELT_RESET_STATE);
275 if (mode != MODE_SILK_ONLY)
278 celt_ret = celt_decode_with_ec(st->celt_dec, decode_fec?NULL:data, len, pcm_celt, frame_size, &dec);
279 for (i=0;i<frame_size*st->channels;i++)
280 pcm[i] = ADD_SAT16(pcm[i], pcm_celt[i]);
285 const CELTMode *celt_mode;
286 celt_decoder_ctl(st->celt_dec, CELT_GET_MODE(&celt_mode));
287 window = celt_mode->window;
290 /* 5 ms redundant frame for SILK->CELT */
291 if (redundancy && !celt_to_silk)
293 celt_decoder_ctl(st->celt_dec, CELT_RESET_STATE);
294 celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(0));
296 celt_decode(st->celt_dec, data+len, redundancy_bytes, redundant_audio, F5);
297 smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5,
298 pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs);
300 if (redundancy && celt_to_silk)
302 for (c=0;c<st->channels;c++)
305 pcm[st->channels*i+c] = redundant_audio[st->channels*i];
307 smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5,
308 pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs);
313 pcm[i] = pcm_transition[i];
315 smooth_fade(pcm_transition+F2_5, pcm+F2_5, pcm+F2_5, F2_5,
316 st->channels, window, st->Fs);
318 #if OPUS_TEST_RANGE_CODER_STATE
319 st->rangeFinal = dec.rng;
322 st->prev_mode = mode;
323 st->prev_redundancy = redundancy;
324 return celt_ret<0 ? celt_ret : audiosize;
328 static int parse_size(const unsigned char *data, int len, short *size)
334 } else if (data[0]<252)
343 *size = 4*data[1] + data[0];
348 int opus_decode(OpusDecoder *st, const unsigned char *data,
349 int len, short *pcm, int frame_size, int decode_fec)
351 int i, bytes, nb_samples;
353 unsigned char ch, toc;
354 /* 48 x 2.5 ms = 120 ms */
356 if (len==0 || data==NULL)
357 return opus_decode_frame(st, NULL, 0, pcm, frame_size, 0);
360 st->mode = opus_packet_get_mode(data);
361 st->bandwidth = opus_packet_get_bandwidth(data);
362 st->frame_size = opus_packet_get_samples_per_frame(data, st->Fs);
363 st->stream_channels = opus_packet_get_nb_channels(data);
377 return OPUS_CORRUPTED_DATA;
378 size[0] = size[1] = len/2;
383 bytes = parse_size(data, len, size);
385 if (size[0]<0 || size[0] > len)
386 return OPUS_CORRUPTED_DATA;
388 size[1] = len-size[0];
390 /* Multiple CBR/VBR frames (from 0 to 120 ms) */
393 return OPUS_CORRUPTED_DATA;
394 /* Number of frames encoded in bits 0 to 5 */
397 if (st->frame_size*count*25 > 3*st->Fs)
398 return OPUS_CORRUPTED_DATA;
407 return OPUS_CORRUPTED_DATA;
410 padding += p==255 ? 254: p;
415 return OPUS_CORRUPTED_DATA;
416 /* Bit 7 is VBR flag (bit 6 is ignored) */
421 for (i=0;i<count-1;i++)
423 bytes = parse_size(data, len, size+i);
425 if (size[i]<0 || size[i] > len)
426 return OPUS_CORRUPTED_DATA;
428 last_size -= bytes+size[i];
431 return OPUS_CORRUPTED_DATA;
433 size[count-1]=last_size;
436 int sz = count != 0 ? len/count : 0;
438 return OPUS_CORRUPTED_DATA;
439 for (i=0;i<count;i++)
444 if (count*st->frame_size > frame_size)
447 for (i=0;i<count;i++)
450 ret = opus_decode_frame(st, data, len, pcm, frame_size-nb_samples, decode_fec);
459 int opus_decoder_ctl(OpusDecoder *st, int request, ...)
463 va_start(ap, request);
467 case OPUS_GET_MODE_REQUEST:
469 int *value = va_arg(ap, int*);
470 *value = st->prev_mode;
473 case OPUS_SET_BANDWIDTH_REQUEST:
475 int value = va_arg(ap, int);
476 st->bandwidth = value;
479 case OPUS_GET_BANDWIDTH_REQUEST:
481 int *value = va_arg(ap, int*);
482 *value = st->bandwidth;
486 fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);
494 void opus_decoder_destroy(OpusDecoder *st)
499 #if OPUS_TEST_RANGE_CODER_STATE
500 int opus_decoder_get_final_range(OpusDecoder *st)
502 return st->rangeFinal;
507 int opus_packet_get_bandwidth(const unsigned char *data)
512 bandwidth = BANDWIDTH_MEDIUMBAND + ((data[0]>>5)&0x3);
513 if (bandwidth == BANDWIDTH_MEDIUMBAND)
514 bandwidth = BANDWIDTH_NARROWBAND;
515 } else if ((data[0]&0x60) == 0x60)
517 bandwidth = (data[0]&0x10) ? BANDWIDTH_FULLBAND : BANDWIDTH_SUPERWIDEBAND;
520 bandwidth = BANDWIDTH_NARROWBAND + ((data[0]>>5)&0x3);
525 int opus_packet_get_samples_per_frame(const unsigned char *data, int Fs)
530 audiosize = ((data[0]>>3)&0x3);
531 audiosize = (Fs<<audiosize)/400;
532 } else if ((data[0]&0x60) == 0x60)
534 audiosize = (data[0]&0x08) ? Fs/50 : Fs/100;
537 audiosize = ((data[0]>>3)&0x3);
539 audiosize = Fs*60/1000;
541 audiosize = (Fs<<audiosize)/100;
546 int opus_packet_get_nb_channels(const unsigned char *data)
548 return (data[0]&0x4) ? 2 : 1;
551 int opus_packet_get_nb_frames(const unsigned char packet[], int len)
556 count = packet[0]&0x3;
562 return OPUS_CORRUPTED_DATA;
564 return packet[1]&0x3F;
567 int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], int len)
570 int count = opus_packet_get_nb_frames(packet, len);
571 samples = count*opus_packet_get_samples_per_frame(packet, dec->Fs);
572 /* Can't have more than 120 ms */
573 if (samples*25 > dec->Fs*3)
574 return OPUS_CORRUPTED_DATA;