OLD | NEW |
1 /* Copyright (c) 2010 Xiph.Org Foundation, Skype Limited | 1 /* Copyright (c) 2010 Xiph.Org Foundation, Skype Limited |
2 Written by Jean-Marc Valin and Koen Vos */ | 2 Written by Jean-Marc Valin and Koen Vos */ |
3 /* | 3 /* |
4 Redistribution and use in source and binary forms, with or without | 4 Redistribution and use in source and binary forms, with or without |
5 modification, are permitted provided that the following conditions | 5 modification, are permitted provided that the following conditions |
6 are met: | 6 are met: |
7 | 7 |
8 - Redistributions of source code must retain the above copyright | 8 - Redistributions of source code must retain the above copyright |
9 notice, this list of conditions and the following disclaimer. | 9 notice, this list of conditions and the following disclaimer. |
10 | 10 |
11 - Redistributions in binary form must reproduce the above copyright | 11 - Redistributions in binary form must reproduce the above copyright |
12 notice, this list of conditions and the following disclaimer in the | 12 notice, this list of conditions and the following disclaimer in the |
13 documentation and/or other materials provided with the distribution. | 13 documentation and/or other materials provided with the distribution. |
14 | 14 |
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | 18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER |
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 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. | 25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 */ | 26 */ |
27 | 27 |
28 #ifdef HAVE_CONFIG_H | 28 #ifdef HAVE_CONFIG_H |
29 #include "config.h" | 29 # include "config.h" |
30 #endif | 30 #endif |
31 | 31 |
32 #ifndef OPUS_BUILD | 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 detai
ls." | 33 # error "OPUS_BUILD _MUST_ be defined to build Opus. This probably means you nee
d other defines as well, as in a config.h. See the included build files for deta
ils." |
| 34 #endif |
| 35 |
| 36 #if defined(__GNUC__) && (__GNUC__ >= 2) && !defined(__OPTIMIZE__) |
| 37 # pragma message "You appear to be compiling without optimization, if so opus wi
ll be very slow." |
34 #endif | 38 #endif |
35 | 39 |
36 #include <stdarg.h> | 40 #include <stdarg.h> |
37 #include "celt.h" | 41 #include "celt.h" |
38 #include "opus.h" | 42 #include "opus.h" |
39 #include "entdec.h" | 43 #include "entdec.h" |
40 #include "modes.h" | 44 #include "modes.h" |
41 #include "API.h" | 45 #include "API.h" |
42 #include "stack_alloc.h" | 46 #include "stack_alloc.h" |
43 #include "float_cast.h" | 47 #include "float_cast.h" |
(...skipping 20 matching lines...) Expand all Loading... |
64 int mode; | 68 int mode; |
65 int prev_mode; | 69 int prev_mode; |
66 int frame_size; | 70 int frame_size; |
67 int prev_redundancy; | 71 int prev_redundancy; |
68 int last_packet_duration; | 72 int last_packet_duration; |
69 #ifndef FIXED_POINT | 73 #ifndef FIXED_POINT |
70 opus_val16 softclip_mem[2]; | 74 opus_val16 softclip_mem[2]; |
71 #endif | 75 #endif |
72 | 76 |
73 opus_uint32 rangeFinal; | 77 opus_uint32 rangeFinal; |
74 int arch; | |
75 }; | 78 }; |
76 | 79 |
77 #ifdef FIXED_POINT | 80 #ifdef FIXED_POINT |
78 static inline opus_int16 SAT16(opus_int32 x) { | 81 static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { |
79 return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; | 82 return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; |
80 } | 83 } |
81 #endif | 84 #endif |
82 | 85 |
83 | 86 |
84 int opus_decoder_get_size(int channels) | 87 int opus_decoder_get_size(int channels) |
85 { | 88 { |
86 int silkDecSizeBytes, celtDecSizeBytes; | 89 int silkDecSizeBytes, celtDecSizeBytes; |
87 int ret; | 90 int ret; |
88 if (channels<1 || channels > 2) | 91 if (channels<1 || channels > 2) |
(...skipping 25 matching lines...) Expand all Loading... |
114 silkDecSizeBytes = align(silkDecSizeBytes); | 117 silkDecSizeBytes = align(silkDecSizeBytes); |
115 st->silk_dec_offset = align(sizeof(OpusDecoder)); | 118 st->silk_dec_offset = align(sizeof(OpusDecoder)); |
116 st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes; | 119 st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes; |
117 silk_dec = (char*)st+st->silk_dec_offset; | 120 silk_dec = (char*)st+st->silk_dec_offset; |
118 celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); | 121 celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); |
119 st->stream_channels = st->channels = channels; | 122 st->stream_channels = st->channels = channels; |
120 | 123 |
121 st->Fs = Fs; | 124 st->Fs = Fs; |
122 st->DecControl.API_sampleRate = st->Fs; | 125 st->DecControl.API_sampleRate = st->Fs; |
123 st->DecControl.nChannelsAPI = st->channels; | 126 st->DecControl.nChannelsAPI = st->channels; |
124 st->arch = opus_select_arch(); | |
125 | 127 |
126 /* Reset decoder */ | 128 /* Reset decoder */ |
127 ret = silk_InitDecoder( silk_dec ); | 129 ret = silk_InitDecoder( silk_dec ); |
128 if(ret)return OPUS_INTERNAL_ERROR; | 130 if(ret)return OPUS_INTERNAL_ERROR; |
129 | 131 |
130 /* Initialize CELT decoder */ | 132 /* Initialize CELT decoder */ |
131 ret = celt_decoder_init(celt_dec, Fs, channels); | 133 ret = celt_decoder_init(celt_dec, Fs, channels); |
132 if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR; | 134 if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR; |
133 | 135 |
134 celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0)); | 136 celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0)); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 /* In that case, don't conceal more than what the ToC says */ | 252 /* In that case, don't conceal more than what the ToC says */ |
251 frame_size = IMIN(frame_size, st->frame_size); | 253 frame_size = IMIN(frame_size, st->frame_size); |
252 } | 254 } |
253 if (data != NULL) | 255 if (data != NULL) |
254 { | 256 { |
255 audiosize = st->frame_size; | 257 audiosize = st->frame_size; |
256 mode = st->mode; | 258 mode = st->mode; |
257 ec_dec_init(&dec,(unsigned char*)data,len); | 259 ec_dec_init(&dec,(unsigned char*)data,len); |
258 } else { | 260 } else { |
259 audiosize = frame_size; | 261 audiosize = frame_size; |
| 262 mode = st->prev_mode; |
260 | 263 |
261 if (st->prev_mode == 0) | 264 if (mode == 0) |
262 { | 265 { |
263 /* If we haven't got any packet yet, all we can do is return zeros */ | 266 /* If we haven't got any packet yet, all we can do is return zeros */ |
264 for (i=0;i<audiosize*st->channels;i++) | 267 for (i=0;i<audiosize*st->channels;i++) |
265 pcm[i] = 0; | 268 pcm[i] = 0; |
266 RESTORE_STACK; | 269 RESTORE_STACK; |
267 return audiosize; | 270 return audiosize; |
268 } else { | 271 } |
269 mode = st->prev_mode; | 272 |
| 273 /* Avoids trying to run the PLC on sizes other than 2.5 (CELT), 5 (CELT), |
| 274 10, or 20 (e.g. 12.5 or 30 ms). */ |
| 275 if (audiosize > F20) |
| 276 { |
| 277 do { |
| 278 int ret = opus_decode_frame(st, NULL, 0, pcm, IMIN(audiosize, F20),
0); |
| 279 if (ret<0) |
| 280 { |
| 281 RESTORE_STACK; |
| 282 return ret; |
| 283 } |
| 284 pcm += ret*st->channels; |
| 285 audiosize -= ret; |
| 286 } while (audiosize > 0); |
| 287 RESTORE_STACK; |
| 288 return frame_size; |
| 289 } else if (audiosize < F20) |
| 290 { |
| 291 if (audiosize > F10) |
| 292 audiosize = F10; |
| 293 else if (mode != MODE_SILK_ONLY && audiosize > F5 && audiosize < F10) |
| 294 audiosize = F5; |
270 } | 295 } |
271 } | 296 } |
272 | 297 |
273 /* For CELT/hybrid PLC of more than 20 ms, opus_decode_native() will do | 298 pcm_transition_silk_size = ALLOC_NONE; |
274 multiple calls */ | 299 pcm_transition_celt_size = ALLOC_NONE; |
275 if (data==NULL && mode != MODE_SILK_ONLY) | |
276 frame_size = IMIN(frame_size, F20); | |
277 | |
278 pcm_transition_silk_size = 0; | |
279 pcm_transition_celt_size = 0; | |
280 if (data!=NULL && st->prev_mode > 0 && ( | 300 if (data!=NULL && st->prev_mode > 0 && ( |
281 (mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY && !st->prev_r
edundancy) | 301 (mode == MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY && !st->prev_r
edundancy) |
282 || (mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) ) | 302 || (mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) ) |
283 ) | 303 ) |
284 { | 304 { |
285 transition = 1; | 305 transition = 1; |
286 /* Decide where to allocate the stack memory for pcm_transition */ | 306 /* Decide where to allocate the stack memory for pcm_transition */ |
287 if (mode == MODE_CELT_ONLY) | 307 if (mode == MODE_CELT_ONLY) |
288 pcm_transition_celt_size = F5*st->channels; | 308 pcm_transition_celt_size = F5*st->channels; |
289 else | 309 else |
290 pcm_transition_silk_size = F5*st->channels; | 310 pcm_transition_silk_size = F5*st->channels; |
291 } | 311 } |
292 ALLOC(pcm_transition_celt, pcm_transition_celt_size, opus_val16); | 312 ALLOC(pcm_transition_celt, pcm_transition_celt_size, opus_val16); |
293 if (transition && mode == MODE_CELT_ONLY) | 313 if (transition && mode == MODE_CELT_ONLY) |
294 { | 314 { |
295 pcm_transition = pcm_transition_celt; | 315 pcm_transition = pcm_transition_celt; |
296 opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); | 316 opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); |
297 } | 317 } |
298 if (audiosize > frame_size) | 318 if (audiosize > frame_size) |
299 { | 319 { |
300 /*fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosiz
e, frame_size, mode);*/ | 320 /*fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosiz
e, frame_size, mode);*/ |
301 RESTORE_STACK; | 321 RESTORE_STACK; |
302 return OPUS_BAD_ARG; | 322 return OPUS_BAD_ARG; |
303 } else { | 323 } else { |
304 frame_size = audiosize; | 324 frame_size = audiosize; |
305 } | 325 } |
306 | 326 |
307 /* Don't allocate any memory when in CELT-only mode */ | 327 /* Don't allocate any memory when in CELT-only mode */ |
308 pcm_silk_size = (mode != MODE_CELT_ONLY) ? IMAX(F10, frame_size)*st->channels
: 0; | 328 pcm_silk_size = (mode != MODE_CELT_ONLY) ? IMAX(F10, frame_size)*st->channels
: ALLOC_NONE; |
309 ALLOC(pcm_silk, pcm_silk_size, opus_int16); | 329 ALLOC(pcm_silk, pcm_silk_size, opus_int16); |
310 | 330 |
311 /* SILK processing */ | 331 /* SILK processing */ |
312 if (mode != MODE_CELT_ONLY) | 332 if (mode != MODE_CELT_ONLY) |
313 { | 333 { |
314 int lost_flag, decoded_samples; | 334 int lost_flag, decoded_samples; |
315 opus_int16 *pcm_ptr = pcm_silk; | 335 opus_int16 *pcm_ptr = pcm_silk; |
316 | 336 |
317 if (st->prev_mode==MODE_CELT_ONLY) | 337 if (st->prev_mode==MODE_CELT_ONLY) |
318 silk_InitDecoder( silk_dec ); | 338 silk_InitDecoder( silk_dec ); |
(...skipping 29 matching lines...) Expand all Loading... |
348 silk_ret = silk_Decode( silk_dec, &st->DecControl, | 368 silk_ret = silk_Decode( silk_dec, &st->DecControl, |
349 lost_flag, first_frame, &dec, pcm_ptr, &silk_fra
me_size ); | 369 lost_flag, first_frame, &dec, pcm_ptr, &silk_fra
me_size ); |
350 if( silk_ret ) { | 370 if( silk_ret ) { |
351 if (lost_flag) { | 371 if (lost_flag) { |
352 /* PLC failure should not be fatal */ | 372 /* PLC failure should not be fatal */ |
353 silk_frame_size = frame_size; | 373 silk_frame_size = frame_size; |
354 for (i=0;i<frame_size*st->channels;i++) | 374 for (i=0;i<frame_size*st->channels;i++) |
355 pcm_ptr[i] = 0; | 375 pcm_ptr[i] = 0; |
356 } else { | 376 } else { |
357 RESTORE_STACK; | 377 RESTORE_STACK; |
358 return OPUS_INVALID_PACKET; | 378 return OPUS_INTERNAL_ERROR; |
359 } | 379 } |
360 } | 380 } |
361 pcm_ptr += silk_frame_size * st->channels; | 381 pcm_ptr += silk_frame_size * st->channels; |
362 decoded_samples += silk_frame_size; | 382 decoded_samples += silk_frame_size; |
363 } while( decoded_samples < frame_size ); | 383 } while( decoded_samples < frame_size ); |
364 } | 384 } |
365 | 385 |
366 start_band = 0; | 386 start_band = 0; |
367 if (!decode_fec && mode != MODE_CELT_ONLY && data != NULL | 387 if (!decode_fec && mode != MODE_CELT_ONLY && data != NULL |
368 && ec_tell(&dec)+17+20*(st->mode == MODE_HYBRID) <= 8*len) | 388 && ec_tell(&dec)+17+20*(st->mode == MODE_HYBRID) <= 8*len) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 endband = 21; | 435 endband = 21; |
416 break; | 436 break; |
417 } | 437 } |
418 celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband)); | 438 celt_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband)); |
419 celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels)); | 439 celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels)); |
420 } | 440 } |
421 | 441 |
422 if (redundancy) | 442 if (redundancy) |
423 { | 443 { |
424 transition = 0; | 444 transition = 0; |
425 pcm_transition_silk_size=0; | 445 pcm_transition_silk_size=ALLOC_NONE; |
426 } | 446 } |
427 | 447 |
428 ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); | 448 ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16); |
429 | 449 |
430 if (transition && mode != MODE_CELT_ONLY) | 450 if (transition && mode != MODE_CELT_ONLY) |
431 { | 451 { |
432 pcm_transition = pcm_transition_silk; | 452 pcm_transition = pcm_transition_silk; |
433 opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); | 453 opus_decode_frame(st, NULL, 0, pcm_transition, IMIN(F5, audiosize), 0); |
434 } | 454 } |
435 | 455 |
436 /* Only allocation memory for redundancy if/when needed */ | 456 /* Only allocation memory for redundancy if/when needed */ |
437 redundant_audio_size = redundancy ? F5*st->channels : 0; | 457 redundant_audio_size = redundancy ? F5*st->channels : ALLOC_NONE; |
438 ALLOC(redundant_audio, redundant_audio_size, opus_val16); | 458 ALLOC(redundant_audio, redundant_audio_size, opus_val16); |
439 | 459 |
440 /* 5 ms redundant frame for CELT->SILK*/ | 460 /* 5 ms redundant frame for CELT->SILK*/ |
441 if (redundancy && celt_to_silk) | 461 if (redundancy && celt_to_silk) |
442 { | 462 { |
443 celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); | 463 celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)); |
444 celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, | 464 celt_decode_with_ec(celt_dec, data+len, redundancy_bytes, |
445 redundant_audio, F5, NULL); | 465 redundant_audio, F5, NULL); |
446 celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); | 466 celt_decoder_ctl(celt_dec, OPUS_GET_FINAL_RANGE(&redundant_rng)); |
447 } | 467 } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 { | 574 { |
555 if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels)) | 575 if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels)) |
556 OPUS_PRINT_INT(audiosize); | 576 OPUS_PRINT_INT(audiosize); |
557 } | 577 } |
558 | 578 |
559 RESTORE_STACK; | 579 RESTORE_STACK; |
560 return celt_ret < 0 ? celt_ret : audiosize; | 580 return celt_ret < 0 ? celt_ret : audiosize; |
561 | 581 |
562 } | 582 } |
563 | 583 |
564 static int parse_size(const unsigned char *data, opus_int32 len, opus_int16 *siz
e) | |
565 { | |
566 if (len<1) | |
567 { | |
568 *size = -1; | |
569 return -1; | |
570 } else if (data[0]<252) | |
571 { | |
572 *size = data[0]; | |
573 return 1; | |
574 } else if (len<2) | |
575 { | |
576 *size = -1; | |
577 return -1; | |
578 } else { | |
579 *size = 4*data[1] + data[0]; | |
580 return 2; | |
581 } | |
582 } | |
583 | |
584 static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len, | |
585 int self_delimited, unsigned char *out_toc, | |
586 const unsigned char *frames[48], opus_int16 size[48], int *payload_offset) | |
587 { | |
588 int i, bytes; | |
589 int count; | |
590 int cbr; | |
591 unsigned char ch, toc; | |
592 int framesize; | |
593 opus_int32 last_size; | |
594 const unsigned char *data0 = data; | |
595 | |
596 if (size==NULL) | |
597 return OPUS_BAD_ARG; | |
598 | |
599 framesize = opus_packet_get_samples_per_frame(data, 48000); | |
600 | |
601 cbr = 0; | |
602 toc = *data++; | |
603 len--; | |
604 last_size = len; | |
605 switch (toc&0x3) | |
606 { | |
607 /* One frame */ | |
608 case 0: | |
609 count=1; | |
610 break; | |
611 /* Two CBR frames */ | |
612 case 1: | |
613 count=2; | |
614 cbr = 1; | |
615 if (!self_delimited) | |
616 { | |
617 if (len&0x1) | |
618 return OPUS_INVALID_PACKET; | |
619 last_size = len/2; | |
620 /* If last_size doesn't fit in size[0], we'll catch it later */ | |
621 size[0] = (opus_int16)last_size; | |
622 } | |
623 break; | |
624 /* Two VBR frames */ | |
625 case 2: | |
626 count = 2; | |
627 bytes = parse_size(data, len, size); | |
628 len -= bytes; | |
629 if (size[0]<0 || size[0] > len) | |
630 return OPUS_INVALID_PACKET; | |
631 data += bytes; | |
632 last_size = len-size[0]; | |
633 break; | |
634 /* Multiple CBR/VBR frames (from 0 to 120 ms) */ | |
635 default: /*case 3:*/ | |
636 if (len<1) | |
637 return OPUS_INVALID_PACKET; | |
638 /* Number of frames encoded in bits 0 to 5 */ | |
639 ch = *data++; | |
640 count = ch&0x3F; | |
641 if (count <= 0 || framesize*count > 5760) | |
642 return OPUS_INVALID_PACKET; | |
643 len--; | |
644 /* Padding flag is bit 6 */ | |
645 if (ch&0x40) | |
646 { | |
647 int p; | |
648 do { | |
649 if (len<=0) | |
650 return OPUS_INVALID_PACKET; | |
651 p = *data++; | |
652 len--; | |
653 len -= p==255 ? 254: p; | |
654 } while (p==255); | |
655 } | |
656 if (len<0) | |
657 return OPUS_INVALID_PACKET; | |
658 /* VBR flag is bit 7 */ | |
659 cbr = !(ch&0x80); | |
660 if (!cbr) | |
661 { | |
662 /* VBR case */ | |
663 last_size = len; | |
664 for (i=0;i<count-1;i++) | |
665 { | |
666 bytes = parse_size(data, len, size+i); | |
667 len -= bytes; | |
668 if (size[i]<0 || size[i] > len) | |
669 return OPUS_INVALID_PACKET; | |
670 data += bytes; | |
671 last_size -= bytes+size[i]; | |
672 } | |
673 if (last_size<0) | |
674 return OPUS_INVALID_PACKET; | |
675 } else if (!self_delimited) | |
676 { | |
677 /* CBR case */ | |
678 last_size = len/count; | |
679 if (last_size*count!=len) | |
680 return OPUS_INVALID_PACKET; | |
681 for (i=0;i<count-1;i++) | |
682 size[i] = (opus_int16)last_size; | |
683 } | |
684 break; | |
685 } | |
686 /* Self-delimited framing has an extra size for the last frame. */ | |
687 if (self_delimited) | |
688 { | |
689 bytes = parse_size(data, len, size+count-1); | |
690 len -= bytes; | |
691 if (size[count-1]<0 || size[count-1] > len) | |
692 return OPUS_INVALID_PACKET; | |
693 data += bytes; | |
694 /* For CBR packets, apply the size to all the frames. */ | |
695 if (cbr) | |
696 { | |
697 if (size[count-1]*count > len) | |
698 return OPUS_INVALID_PACKET; | |
699 for (i=0;i<count-1;i++) | |
700 size[i] = size[count-1]; | |
701 } else if(size[count-1] > last_size) | |
702 return OPUS_INVALID_PACKET; | |
703 } else | |
704 { | |
705 /* Because it's not encoded explicitly, it's possible the size of the | |
706 last packet (or all the packets, for the CBR case) is larger than | |
707 1275. Reject them here.*/ | |
708 if (last_size > 1275) | |
709 return OPUS_INVALID_PACKET; | |
710 size[count-1] = (opus_int16)last_size; | |
711 } | |
712 | |
713 if (frames) | |
714 { | |
715 for (i=0;i<count;i++) | |
716 { | |
717 frames[i] = data; | |
718 data += size[i]; | |
719 } | |
720 } | |
721 | |
722 if (out_toc) | |
723 *out_toc = toc; | |
724 | |
725 if (payload_offset) | |
726 *payload_offset = (int)(data-data0); | |
727 | |
728 return count; | |
729 } | |
730 | |
731 int opus_packet_parse(const unsigned char *data, opus_int32 len, | |
732 unsigned char *out_toc, const unsigned char *frames[48], | |
733 opus_int16 size[48], int *payload_offset) | |
734 { | |
735 return opus_packet_parse_impl(data, len, 0, out_toc, | |
736 frames, size, payload_offset); | |
737 } | |
738 | |
739 int opus_decode_native(OpusDecoder *st, const unsigned char *data, | 584 int opus_decode_native(OpusDecoder *st, const unsigned char *data, |
740 opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec, | 585 opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec, |
741 int self_delimited, int *packet_offset, int soft_clip) | 586 int self_delimited, opus_int32 *packet_offset, int soft_clip) |
742 { | 587 { |
743 int i, nb_samples; | 588 int i, nb_samples; |
744 int count, offset; | 589 int count, offset; |
745 unsigned char toc; | 590 unsigned char toc; |
746 int tot_offset; | |
747 int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels; | 591 int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels; |
748 /* 48 x 2.5 ms = 120 ms */ | 592 /* 48 x 2.5 ms = 120 ms */ |
749 opus_int16 size[48]; | 593 opus_int16 size[48]; |
750 if (decode_fec<0 || decode_fec>1) | 594 if (decode_fec<0 || decode_fec>1) |
751 return OPUS_BAD_ARG; | 595 return OPUS_BAD_ARG; |
752 /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ | 596 /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ |
753 if ((decode_fec || len==0 || data==NULL) && frame_size%(st->Fs/400)!=0) | 597 if ((decode_fec || len==0 || data==NULL) && frame_size%(st->Fs/400)!=0) |
754 return OPUS_BAD_ARG; | 598 return OPUS_BAD_ARG; |
755 if (len==0 || data==NULL) | 599 if (len==0 || data==NULL) |
756 { | 600 { |
(...skipping 11 matching lines...) Expand all Loading... |
768 st->last_packet_duration = pcm_count; | 612 st->last_packet_duration = pcm_count; |
769 return pcm_count; | 613 return pcm_count; |
770 } else if (len<0) | 614 } else if (len<0) |
771 return OPUS_BAD_ARG; | 615 return OPUS_BAD_ARG; |
772 | 616 |
773 packet_mode = opus_packet_get_mode(data); | 617 packet_mode = opus_packet_get_mode(data); |
774 packet_bandwidth = opus_packet_get_bandwidth(data); | 618 packet_bandwidth = opus_packet_get_bandwidth(data); |
775 packet_frame_size = opus_packet_get_samples_per_frame(data, st->Fs); | 619 packet_frame_size = opus_packet_get_samples_per_frame(data, st->Fs); |
776 packet_stream_channels = opus_packet_get_nb_channels(data); | 620 packet_stream_channels = opus_packet_get_nb_channels(data); |
777 | 621 |
778 count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, size, &
offset); | 622 count = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL, |
| 623 size, &offset, packet_offset); |
| 624 if (count<0) |
| 625 return count; |
779 | 626 |
780 data += offset; | 627 data += offset; |
781 | 628 |
782 if (decode_fec) | 629 if (decode_fec) |
783 { | 630 { |
784 int duration_copy; | 631 int duration_copy; |
785 int ret; | 632 int ret; |
786 /* If no FEC can be present, run the PLC (recursive call) */ | 633 /* If no FEC can be present, run the PLC (recursive call) */ |
787 if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st-
>mode == MODE_CELT_ONLY) | 634 if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st-
>mode == MODE_CELT_ONLY) |
788 return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, sof
t_clip); | 635 return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, sof
t_clip); |
(...skipping 18 matching lines...) Expand all Loading... |
807 packet_frame_size, 1); | 654 packet_frame_size, 1); |
808 if (ret<0) | 655 if (ret<0) |
809 return ret; | 656 return ret; |
810 else { | 657 else { |
811 if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels)) | 658 if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels)) |
812 OPUS_PRINT_INT(frame_size); | 659 OPUS_PRINT_INT(frame_size); |
813 st->last_packet_duration = frame_size; | 660 st->last_packet_duration = frame_size; |
814 return frame_size; | 661 return frame_size; |
815 } | 662 } |
816 } | 663 } |
817 tot_offset = 0; | |
818 if (count < 0) | |
819 return count; | |
820 | |
821 tot_offset += offset; | |
822 | 664 |
823 if (count*packet_frame_size > frame_size) | 665 if (count*packet_frame_size > frame_size) |
824 return OPUS_BUFFER_TOO_SMALL; | 666 return OPUS_BUFFER_TOO_SMALL; |
825 | 667 |
826 /* Update the state as the last step to avoid updating it on an invalid packe
t */ | 668 /* Update the state as the last step to avoid updating it on an invalid packe
t */ |
827 st->mode = packet_mode; | 669 st->mode = packet_mode; |
828 st->bandwidth = packet_bandwidth; | 670 st->bandwidth = packet_bandwidth; |
829 st->frame_size = packet_frame_size; | 671 st->frame_size = packet_frame_size; |
830 st->stream_channels = packet_stream_channels; | 672 st->stream_channels = packet_stream_channels; |
831 | 673 |
832 nb_samples=0; | 674 nb_samples=0; |
833 for (i=0;i<count;i++) | 675 for (i=0;i<count;i++) |
834 { | 676 { |
835 int ret; | 677 int ret; |
836 ret = opus_decode_frame(st, data, size[i], pcm+nb_samples*st->channels, fr
ame_size-nb_samples, 0); | 678 ret = opus_decode_frame(st, data, size[i], pcm+nb_samples*st->channels, fr
ame_size-nb_samples, 0); |
837 if (ret<0) | 679 if (ret<0) |
838 return ret; | 680 return ret; |
839 celt_assert(ret==packet_frame_size); | 681 celt_assert(ret==packet_frame_size); |
840 data += size[i]; | 682 data += size[i]; |
841 tot_offset += size[i]; | |
842 nb_samples += ret; | 683 nb_samples += ret; |
843 } | 684 } |
844 if (packet_offset != NULL) | |
845 *packet_offset = tot_offset; | |
846 st->last_packet_duration = nb_samples; | 685 st->last_packet_duration = nb_samples; |
847 if (OPUS_CHECK_ARRAY(pcm, nb_samples*st->channels)) | 686 if (OPUS_CHECK_ARRAY(pcm, nb_samples*st->channels)) |
848 OPUS_PRINT_INT(nb_samples); | 687 OPUS_PRINT_INT(nb_samples); |
849 #ifndef FIXED_POINT | 688 #ifndef FIXED_POINT |
850 if (soft_clip) | 689 if (soft_clip) |
851 opus_pcm_soft_clip(pcm, nb_samples, st->channels, st->softclip_mem); | 690 opus_pcm_soft_clip(pcm, nb_samples, st->channels, st->softclip_mem); |
852 else | 691 else |
853 st->softclip_mem[0]=st->softclip_mem[1]=0; | 692 st->softclip_mem[0]=st->softclip_mem[1]=0; |
854 #endif | 693 #endif |
855 return nb_samples; | 694 return nb_samples; |
856 } | 695 } |
857 | 696 |
858 #ifdef FIXED_POINT | 697 #ifdef FIXED_POINT |
859 | 698 |
860 int opus_decode(OpusDecoder *st, const unsigned char *data, | 699 int opus_decode(OpusDecoder *st, const unsigned char *data, |
861 opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) | 700 opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) |
862 { | 701 { |
| 702 if(frame_size<=0) |
| 703 return OPUS_BAD_ARG; |
863 return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL
, 0); | 704 return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL
, 0); |
864 } | 705 } |
865 | 706 |
866 #ifndef DISABLE_FLOAT_API | 707 #ifndef DISABLE_FLOAT_API |
867 int opus_decode_float(OpusDecoder *st, const unsigned char *data, | 708 int opus_decode_float(OpusDecoder *st, const unsigned char *data, |
868 opus_int32 len, float *pcm, int frame_size, int decode_fec) | 709 opus_int32 len, float *pcm, int frame_size, int decode_fec) |
869 { | 710 { |
870 VARDECL(opus_int16, out); | 711 VARDECL(opus_int16, out); |
871 int ret, i; | 712 int ret, i; |
872 ALLOC_STACK; | 713 ALLOC_STACK; |
873 | 714 |
| 715 if(frame_size<=0) |
| 716 { |
| 717 RESTORE_STACK; |
| 718 return OPUS_BAD_ARG; |
| 719 } |
874 ALLOC(out, frame_size*st->channels, opus_int16); | 720 ALLOC(out, frame_size*st->channels, opus_int16); |
875 | 721 |
876 ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL,
0); | 722 ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL,
0); |
877 if (ret > 0) | 723 if (ret > 0) |
878 { | 724 { |
879 for (i=0;i<ret*st->channels;i++) | 725 for (i=0;i<ret*st->channels;i++) |
880 pcm[i] = (1.f/32768.f)*(out[i]); | 726 pcm[i] = (1.f/32768.f)*(out[i]); |
881 } | 727 } |
882 RESTORE_STACK; | 728 RESTORE_STACK; |
883 return ret; | 729 return ret; |
884 } | 730 } |
885 #endif | 731 #endif |
886 | 732 |
887 | 733 |
888 #else | 734 #else |
889 int opus_decode(OpusDecoder *st, const unsigned char *data, | 735 int opus_decode(OpusDecoder *st, const unsigned char *data, |
890 opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) | 736 opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) |
891 { | 737 { |
892 VARDECL(float, out); | 738 VARDECL(float, out); |
893 int ret, i; | 739 int ret, i; |
894 ALLOC_STACK; | 740 ALLOC_STACK; |
895 | 741 |
896 if(frame_size<0) | 742 if(frame_size<=0) |
897 { | 743 { |
898 RESTORE_STACK; | 744 RESTORE_STACK; |
899 return OPUS_BAD_ARG; | 745 return OPUS_BAD_ARG; |
900 } | 746 } |
901 | 747 |
902 ALLOC(out, frame_size*st->channels, float); | 748 ALLOC(out, frame_size*st->channels, float); |
903 | 749 |
904 ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL,
1); | 750 ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL,
1); |
905 if (ret > 0) | 751 if (ret > 0) |
906 { | 752 { |
907 for (i=0;i<ret*st->channels;i++) | 753 for (i=0;i<ret*st->channels;i++) |
908 pcm[i] = FLOAT2INT16(out[i]); | 754 pcm[i] = FLOAT2INT16(out[i]); |
909 } | 755 } |
910 RESTORE_STACK; | 756 RESTORE_STACK; |
911 return ret; | 757 return ret; |
912 } | 758 } |
913 | 759 |
914 int opus_decode_float(OpusDecoder *st, const unsigned char *data, | 760 int opus_decode_float(OpusDecoder *st, const unsigned char *data, |
915 opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) | 761 opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) |
916 { | 762 { |
| 763 if(frame_size<=0) |
| 764 return OPUS_BAD_ARG; |
917 return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL
, 0); | 765 return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL
, 0); |
918 } | 766 } |
919 | 767 |
920 #endif | 768 #endif |
921 | 769 |
922 int opus_decoder_ctl(OpusDecoder *st, int request, ...) | 770 int opus_decoder_ctl(OpusDecoder *st, int request, ...) |
923 { | 771 { |
924 int ret = OPUS_OK; | 772 int ret = OPUS_OK; |
925 va_list ap; | 773 va_list ap; |
926 void *silk_dec; | 774 void *silk_dec; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 return OPUS_INVALID_PACKET; | 961 return OPUS_INVALID_PACKET; |
1114 else | 962 else |
1115 return samples; | 963 return samples; |
1116 } | 964 } |
1117 | 965 |
1118 int opus_decoder_get_nb_samples(const OpusDecoder *dec, | 966 int opus_decoder_get_nb_samples(const OpusDecoder *dec, |
1119 const unsigned char packet[], opus_int32 len) | 967 const unsigned char packet[], opus_int32 len) |
1120 { | 968 { |
1121 return opus_packet_get_nb_samples(packet, len, dec->Fs); | 969 return opus_packet_get_nb_samples(packet, len, dec->Fs); |
1122 } | 970 } |
OLD | NEW |