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 /* FIXME: Remove this when we add SILK stereo support */
149 if (st->stream_channels == 2 && mode != MODE_CELT_ONLY)
150 return OPUS_UNIMPLEMENTED;
152 if (data!=NULL && !st->prev_redundancy && mode != st->prev_mode && st->prev_mode > 0
153 && !(mode == MODE_SILK_ONLY && st->prev_mode == MODE_HYBRID)
154 && !(mode == MODE_HYBRID && st->prev_mode == MODE_SILK_ONLY))
157 if (mode == MODE_CELT_ONLY)
158 opus_decode_frame(st, NULL, 0, pcm_transition, IMAX(F10, audiosize), 0);
160 if (audiosize > frame_size)
162 fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosize, frame_size, mode);
165 frame_size = audiosize;
168 /* SILK processing */
169 if (mode != MODE_CELT_ONLY)
171 int lost_flag, decoded_samples;
172 SKP_int16 *pcm_ptr = pcm;
174 if (st->prev_mode==MODE_CELT_ONLY)
175 SKP_Silk_SDK_InitDecoder( st->silk_dec );
177 DecControl.API_sampleRate = st->Fs;
178 DecControl.payloadSize_ms = 1000 * audiosize / st->Fs;
179 if( mode == MODE_SILK_ONLY ) {
180 if( st->bandwidth == BANDWIDTH_NARROWBAND ) {
181 DecControl.internalSampleRate = 8000;
182 } else if( st->bandwidth == BANDWIDTH_MEDIUMBAND ) {
183 DecControl.internalSampleRate = 12000;
184 } else if( st->bandwidth == BANDWIDTH_WIDEBAND ) {
185 DecControl.internalSampleRate = 16000;
187 DecControl.internalSampleRate = 16000;
192 DecControl.internalSampleRate = 16000;
195 lost_flag = data == NULL ? 1 : 2 * decode_fec;
198 /* Call SILK decoder */
199 int first_frame = decoded_samples == 0;
200 silk_ret = SKP_Silk_SDK_Decode( st->silk_dec, &DecControl,
201 lost_flag, first_frame, &dec, len, pcm_ptr, &silk_frame_size );
203 fprintf (stderr, "SILK decode error\n");
206 pcm_ptr += silk_frame_size;
207 decoded_samples += silk_frame_size;
208 } while( decoded_samples < frame_size );
210 for (i=0;i<frame_size*st->channels;i++)
215 if (mode != MODE_CELT_ONLY && data != NULL)
217 /* Check if we have a redundant 0-8 kHz band */
218 redundancy = ec_dec_bit_logp(&dec, 12);
221 celt_to_silk = ec_dec_bit_logp(&dec, 1);
222 if (mode == MODE_HYBRID)
223 redundancy_bytes = 2 + ec_dec_uint(&dec, 256);
225 redundancy_bytes = len - ((ec_tell(&dec)+7)>>3);
226 len -= redundancy_bytes;
228 return CELT_CORRUPTED_DATA;
229 /* Shrink decoder because of raw bits */
230 dec.storage -= redundancy_bytes;
233 if (mode != MODE_CELT_ONLY)
236 if (mode != MODE_SILK_ONLY)
240 switch(st->bandwidth)
242 case BANDWIDTH_NARROWBAND:
245 case BANDWIDTH_WIDEBAND:
248 case BANDWIDTH_SUPERWIDEBAND:
251 case BANDWIDTH_FULLBAND:
255 celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(endband));
256 celt_decoder_ctl(st->celt_dec, CELT_SET_CHANNELS(st->stream_channels));
262 if (transition && mode != MODE_CELT_ONLY)
263 opus_decode_frame(st, NULL, 0, pcm_transition, IMAX(F10, audiosize), 0);
265 /* 5 ms redundant frame for CELT->SILK*/
266 if (redundancy && celt_to_silk)
268 celt_decode(st->celt_dec, data+len, redundancy_bytes, redundant_audio, F5);
269 celt_decoder_ctl(st->celt_dec, CELT_RESET_STATE);
272 /* MUST be after PLC */
273 celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(start_band));
276 celt_decoder_ctl(st->celt_dec, CELT_RESET_STATE);
278 if (mode != MODE_SILK_ONLY)
281 celt_ret = celt_decode_with_ec(st->celt_dec, decode_fec?NULL:data, len, pcm_celt, frame_size, &dec);
282 for (i=0;i<frame_size*st->channels;i++)
283 pcm[i] = ADD_SAT16(pcm[i], pcm_celt[i]);
287 const CELTMode *celt_mode;
288 celt_decoder_ctl(st->celt_dec, CELT_GET_MODE(&celt_mode));
289 window = celt_mode->window;
291 /* 5 ms redundant frame for SILK->CELT */
292 if (redundancy && !celt_to_silk)
294 celt_decoder_ctl(st->celt_dec, CELT_RESET_STATE);
295 celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(0));
297 celt_decode(st->celt_dec, data+len, redundancy_bytes, redundant_audio, F5);
298 smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5,
299 pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs);
301 if (redundancy && celt_to_silk)
303 for (c=0;c<st->channels;c++)
306 pcm[st->channels*i+c] = redundant_audio[st->channels*i];
308 smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5,
309 pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs);
314 pcm[i] = pcm_transition[i];
316 smooth_fade(pcm_transition+F2_5, pcm+F2_5, pcm+F2_5, F2_5,
317 st->channels, window, st->Fs);
319 #if OPUS_TEST_RANGE_CODER_STATE
320 st->rangeFinal = dec.rng;
323 st->prev_mode = mode;
324 st->prev_redundancy = redundancy;
325 return celt_ret<0 ? celt_ret : audiosize;
329 static int parse_size(const unsigned char *data, int len, short *size)
335 } else if (data[0]<252)
344 *size = 4*data[1] + data[0];
349 int opus_decode(OpusDecoder *st, const unsigned char *data,
350 int len, short *pcm, int frame_size, int decode_fec)
352 int i, bytes, nb_samples;
354 unsigned char ch, toc;
355 /* 48 x 2.5 ms = 120 ms */
357 if (len==0 || data==NULL)
358 return opus_decode_frame(st, NULL, 0, pcm, frame_size, 0);
361 st->mode = opus_packet_get_mode(data);
362 st->bandwidth = opus_packet_get_bandwidth(data);
363 st->frame_size = opus_packet_get_samples_per_frame(data, st->Fs);
364 st->stream_channels = opus_packet_get_nb_channels(data);
378 return OPUS_CORRUPTED_DATA;
379 size[0] = size[1] = len/2;
384 bytes = parse_size(data, len, size);
386 if (size[0]<0 || size[0] > len)
387 return OPUS_CORRUPTED_DATA;
389 size[1] = len-size[0];
391 /* Multiple CBR/VBR frames (from 0 to 120 ms) */
394 return OPUS_CORRUPTED_DATA;
395 /* Number of frames encoded in bits 0 to 5 */
398 if (st->frame_size*count*25 > 3*st->Fs)
399 return OPUS_CORRUPTED_DATA;
401 /* Bit 7 is VBR flag (bit 6 is ignored) */
406 for (i=0;i<count-1;i++)
408 bytes = parse_size(data, len, size+i);
410 if (size[i]<0 || size[i] > len)
411 return OPUS_CORRUPTED_DATA;
413 last_size -= bytes+size[i];
416 return OPUS_CORRUPTED_DATA;
418 size[count-1]=last_size;
421 int sz = count != 0 ? len/count : 0;
423 return OPUS_CORRUPTED_DATA;
424 for (i=0;i<count;i++)
429 if (count*st->frame_size > frame_size)
432 for (i=0;i<count;i++)
435 ret = opus_decode_frame(st, data, len, pcm, frame_size-nb_samples, decode_fec);
444 int opus_decoder_ctl(OpusDecoder *st, int request, ...)
448 va_start(ap, request);
452 case OPUS_GET_MODE_REQUEST:
454 int *value = va_arg(ap, int*);
455 *value = st->prev_mode;
458 case OPUS_SET_BANDWIDTH_REQUEST:
460 int value = va_arg(ap, int);
461 st->bandwidth = value;
464 case OPUS_GET_BANDWIDTH_REQUEST:
466 int *value = va_arg(ap, int*);
467 *value = st->bandwidth;
471 fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);
479 void opus_decoder_destroy(OpusDecoder *st)
484 #if OPUS_TEST_RANGE_CODER_STATE
485 int opus_decoder_get_final_range(OpusDecoder *st)
487 return st->rangeFinal;
492 int opus_packet_get_bandwidth(const unsigned char *data)
497 bandwidth = BANDWIDTH_MEDIUMBAND + ((data[0]>>5)&0x3);
498 if (bandwidth == BANDWIDTH_MEDIUMBAND)
499 bandwidth = BANDWIDTH_NARROWBAND;
500 } else if ((data[0]&0x60) == 0x60)
502 bandwidth = (data[0]&0x10) ? BANDWIDTH_FULLBAND : BANDWIDTH_SUPERWIDEBAND;
505 bandwidth = BANDWIDTH_NARROWBAND + ((data[0]>>5)&0x3);
510 int opus_packet_get_samples_per_frame(const unsigned char *data, int Fs)
515 audiosize = ((data[0]>>3)&0x3);
516 audiosize = (Fs<<audiosize)/400;
517 } else if ((data[0]&0x60) == 0x60)
519 audiosize = (data[0]&0x08) ? Fs/50 : Fs/100;
522 audiosize = ((data[0]>>3)&0x3);
524 audiosize = Fs*60/1000;
526 audiosize = (Fs<<audiosize)/100;
531 int opus_packet_get_nb_channels(const unsigned char *data)
533 return (data[0]&0x4) ? 2 : 1;
536 int opus_packet_get_nb_frames(const unsigned char packet[], int len)
541 count = packet[0]&0x3;
547 return OPUS_CORRUPTED_DATA;
549 return packet[1]&0x3F;
552 int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], int len)
555 int count = opus_packet_get_nb_frames(packet, len);
556 samples = count*opus_packet_get_samples_per_frame(packet, dec->Fs);
557 /* Can't have more than 120 ms */
558 if (samples*25 > dec->Fs*3)
559 return OPUS_CORRUPTED_DATA;