Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: src/opus_encoder.c

Issue 12388030: Update Opus to 1.0.2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/opus
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/opus_demo.c ('k') | src/opus_multistream.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited 1 /* Copyright (c) 2010-2011 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
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 { 284 {
285 toc = 0x60; 285 toc = 0x60;
286 toc |= (bandwidth-OPUS_BANDWIDTH_SUPERWIDEBAND)<<4; 286 toc |= (bandwidth-OPUS_BANDWIDTH_SUPERWIDEBAND)<<4;
287 toc |= (period-2)<<3; 287 toc |= (period-2)<<3;
288 } 288 }
289 toc |= (channels==2)<<2; 289 toc |= (channels==2)<<2;
290 return toc; 290 return toc;
291 } 291 }
292 292
293 #ifndef FIXED_POINT 293 #ifndef FIXED_POINT
294 void silk_biquad_float( 294 static void silk_biquad_float(
295 const opus_val16 *in, /* I: Input signal */ 295 const opus_val16 *in, /* I: Input signal */
296 const opus_int32 *B_Q28, /* I: MA coefficients [3] */ 296 const opus_int32 *B_Q28, /* I: MA coefficients [3] */
297 const opus_int32 *A_Q28, /* I: AR coefficients [2] */ 297 const opus_int32 *A_Q28, /* I: AR coefficients [2] */
298 opus_val32 *S, /* I/O: State vector [2] */ 298 opus_val32 *S, /* I/O: State vector [2] */
299 opus_val16 *out, /* O: Output signal */ 299 opus_val16 *out, /* O: Output signal */
300 const opus_int32 len, /* I: Signal length (must be even) */ 300 const opus_int32 len, /* I: Signal length (must be even) */
301 int stride 301 int stride
302 ) 302 )
303 { 303 {
304 /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ 304 /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 void *silk_enc; 451 void *silk_enc;
452 CELTEncoder *celt_enc; 452 CELTEncoder *celt_enc;
453 int i; 453 int i;
454 int ret=0; 454 int ret=0;
455 opus_int32 nBytes; 455 opus_int32 nBytes;
456 ec_enc enc; 456 ec_enc enc;
457 int bytes_target; 457 int bytes_target;
458 int prefill=0; 458 int prefill=0;
459 int start_band = 0; 459 int start_band = 0;
460 int redundancy = 0; 460 int redundancy = 0;
461 int redundancy_bytes = 0; 461 int redundancy_bytes = 0; /* Number of bytes to use for redundancy frame */
462 int celt_to_silk = 0; 462 int celt_to_silk = 0;
463 VARDECL(opus_val16, pcm_buf); 463 VARDECL(opus_val16, pcm_buf);
464 int nb_compr_bytes; 464 int nb_compr_bytes;
465 int to_celt = 0; 465 int to_celt = 0;
466 opus_uint32 redundant_rng = 0; 466 opus_uint32 redundant_rng = 0;
467 int cutoff_Hz, hp_freq_smth1; 467 int cutoff_Hz, hp_freq_smth1;
468 int voice_est; 468 int voice_est; /* Probability of voice in Q7 */
469 opus_int32 equiv_rate; 469 opus_int32 equiv_rate;
470 int delay_compensation; 470 int delay_compensation;
471 int frame_rate; 471 int frame_rate;
472 opus_int32 max_rate; 472 opus_int32 max_rate; /* Max bitrate we're allowed to use */
473 int curr_bandwidth; 473 int curr_bandwidth;
474 opus_int32 max_data_bytes; 474 opus_int32 max_data_bytes; /* Max number of bytes we're allowed to use */
475 VARDECL(opus_val16, tmp_prefill); 475 VARDECL(opus_val16, tmp_prefill);
476 476
477 ALLOC_STACK; 477 ALLOC_STACK;
478 478
479 max_data_bytes = IMIN(1276, out_data_bytes); 479 max_data_bytes = IMIN(1276, out_data_bytes);
480 480
481 st->rangeFinal = 0; 481 st->rangeFinal = 0;
482 if (400*frame_size != st->Fs && 200*frame_size != st->Fs && 100*frame_size ! = st->Fs && 482 if (400*frame_size != st->Fs && 200*frame_size != st->Fs && 100*frame_size ! = st->Fs &&
483 50*frame_size != st->Fs && 25*frame_size != st->Fs && 50*frame_size ! = 3*st->Fs) 483 50*frame_size != st->Fs && 25*frame_size != st->Fs && 50*frame_size ! = 3*st->Fs)
484 { 484 {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 /* Switch to SILK/hybrid if frame size is 10 ms or more*/ 645 /* Switch to SILK/hybrid if frame size is 10 ms or more*/
646 if (frame_size >= st->Fs/100) 646 if (frame_size >= st->Fs/100)
647 { 647 {
648 st->mode = st->prev_mode; 648 st->mode = st->prev_mode;
649 to_celt = 1; 649 to_celt = 1;
650 } else { 650 } else {
651 redundancy=0; 651 redundancy=0;
652 } 652 }
653 } 653 }
654 } 654 }
655 /* For the first frame at a new SILK bandwidth */
655 if (st->silk_bw_switch) 656 if (st->silk_bw_switch)
656 { 657 {
657 redundancy = 1; 658 redundancy = 1;
658 celt_to_silk = 1; 659 celt_to_silk = 1;
659 st->silk_bw_switch = 0; 660 st->silk_bw_switch = 0;
660 } 661 }
661 662
663 if (redundancy)
664 {
665 /* Fair share of the max size allowed */
666 redundancy_bytes = IMIN(257, max_data_bytes*(opus_int32)(st->Fs/200)/(fra me_size+st->Fs/200));
667 /* For VBR, target the actual bitrate (subject to the limit above) */
668 if (st->use_vbr)
669 redundancy_bytes = IMIN(redundancy_bytes, st->bitrate_bps/1600);
670 }
671
662 if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) 672 if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY)
663 { 673 {
664 silk_EncControlStruct dummy; 674 silk_EncControlStruct dummy;
665 silk_InitEncoder( silk_enc, &dummy); 675 silk_InitEncoder( silk_enc, &dummy);
666 prefill=1; 676 prefill=1;
667 } 677 }
668 678
669 /* Automatic (rate-dependent) bandwidth selection */ 679 /* Automatic (rate-dependent) bandwidth selection */
670 if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthS witch) 680 if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthS witch)
671 { 681 {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 curr_bandwidth = st->bandwidth; 826 curr_bandwidth = st->bandwidth;
817 827
818 /* Chooses the appropriate mode for speech 828 /* Chooses the appropriate mode for speech
819 *NEVER* switch to/from CELT-only mode here as this will invalidate some a ssumptions */ 829 *NEVER* switch to/from CELT-only mode here as this will invalidate some a ssumptions */
820 if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND) 830 if (st->mode == MODE_SILK_ONLY && curr_bandwidth > OPUS_BANDWIDTH_WIDEBAND)
821 st->mode = MODE_HYBRID; 831 st->mode = MODE_HYBRID;
822 if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND) 832 if (st->mode == MODE_HYBRID && curr_bandwidth <= OPUS_BANDWIDTH_WIDEBAND)
823 st->mode = MODE_SILK_ONLY; 833 st->mode = MODE_SILK_ONLY;
824 834
825 /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, c urr_bandwidth); */ 835 /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, c urr_bandwidth); */
826 bytes_target = IMIN(max_data_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1; 836 bytes_target = IMIN(max_data_bytes-redundancy_bytes, st->bitrate_bps * frame _size / (st->Fs * 8)) - 1;
827 837
828 data += 1; 838 data += 1;
829 839
830 ec_enc_init(&enc, data, max_data_bytes-1); 840 ec_enc_init(&enc, data, max_data_bytes-1);
831 841
832 ALLOC(pcm_buf, (delay_compensation+frame_size)*st->channels, opus_val16); 842 ALLOC(pcm_buf, (delay_compensation+frame_size)*st->channels, opus_val16);
833 for (i=0;i<delay_compensation*st->channels;i++) 843 for (i=0;i<delay_compensation*st->channels;i++)
834 pcm_buf[i] = st->delay_buffer[(st->encoder_buffer-delay_compensation)*st- >channels+i]; 844 pcm_buf[i] = st->delay_buffer[(st->encoder_buffer-delay_compensation)*st- >channels+i];
835 845
836 if (st->mode == MODE_CELT_ONLY) 846 if (st->mode == MODE_CELT_ONLY)
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 st->silk_mode.maxInternalSampleRate = 8000; 932 st->silk_mode.maxInternalSampleRate = 8000;
923 st->silk_mode.desiredInternalSampleRate = IMIN(8000, st->silk_mode .desiredInternalSampleRate); 933 st->silk_mode.desiredInternalSampleRate = IMIN(8000, st->silk_mode .desiredInternalSampleRate);
924 } 934 }
925 } else { 935 } else {
926 st->silk_mode.maxInternalSampleRate = 16000; 936 st->silk_mode.maxInternalSampleRate = 16000;
927 } 937 }
928 938
929 st->silk_mode.useCBR = !st->use_vbr; 939 st->silk_mode.useCBR = !st->use_vbr;
930 940
931 /* Call SILK encoder for the low band */ 941 /* Call SILK encoder for the low band */
932 nBytes = IMIN(1275, max_data_bytes-1); 942 nBytes = IMIN(1275, max_data_bytes-1-redundancy_bytes);
933 943
934 st->silk_mode.maxBits = nBytes*8; 944 st->silk_mode.maxBits = nBytes*8;
935 /* Only allow up to 90% of the bits for hybrid mode*/ 945 /* Only allow up to 90% of the bits for hybrid mode*/
936 if (st->mode == MODE_HYBRID) 946 if (st->mode == MODE_HYBRID)
937 st->silk_mode.maxBits = (opus_int32)st->silk_mode.maxBits*9/10; 947 st->silk_mode.maxBits = (opus_int32)st->silk_mode.maxBits*9/10;
938 if (st->silk_mode.useCBR) 948 if (st->silk_mode.useCBR)
939 { 949 {
940 st->silk_mode.maxBits = (st->silk_mode.bitRate * frame_size / (st->Fs * 8))*8; 950 st->silk_mode.maxBits = (st->silk_mode.bitRate * frame_size / (st->Fs * 8))*8;
941 /* Reduce the initial target to make it easier to reach the CBR rate */ 951 /* Reduce the initial target to make it easier to reach the CBR rate */
942 st->silk_mode.bitRate = IMAX(1, st->silk_mode.bitRate-2000); 952 st->silk_mode.bitRate = IMAX(1, st->silk_mode.bitRate-2000);
943 } 953 }
944 if (redundancy)
945 st->silk_mode.maxBits -= st->silk_mode.maxBits/(1 + frame_size/(st->F s/200));
946 954
947 if (prefill) 955 if (prefill)
948 { 956 {
949 opus_int32 zero=0; 957 opus_int32 zero=0;
950 #ifdef FIXED_POINT 958 #ifdef FIXED_POINT
951 pcm_silk = st->delay_buffer; 959 pcm_silk = st->delay_buffer;
952 #else 960 #else
953 for (i=0;i<st->encoder_buffer*st->channels;i++) 961 for (i=0;i<st->encoder_buffer*st->channels;i++)
954 pcm_silk[i] = FLOAT2INT16(st->delay_buffer[i]); 962 pcm_silk[i] = FLOAT2INT16(st->delay_buffer[i]);
955 #endif 963 #endif
(...skipping 27 matching lines...) Expand all
983 } else if( st->silk_mode.internalSampleRate == 12000 ) { 991 } else if( st->silk_mode.internalSampleRate == 12000 ) {
984 curr_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; 992 curr_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND;
985 } else if( st->silk_mode.internalSampleRate == 16000 ) { 993 } else if( st->silk_mode.internalSampleRate == 16000 ) {
986 curr_bandwidth = OPUS_BANDWIDTH_WIDEBAND; 994 curr_bandwidth = OPUS_BANDWIDTH_WIDEBAND;
987 } 995 }
988 } else { 996 } else {
989 silk_assert( st->silk_mode.internalSampleRate == 16000 ); 997 silk_assert( st->silk_mode.internalSampleRate == 16000 );
990 } 998 }
991 999
992 st->silk_mode.opusCanSwitch = st->silk_mode.switchReady; 1000 st->silk_mode.opusCanSwitch = st->silk_mode.switchReady;
1001 /* FIXME: How do we allocate the redundancy for CBR? */
993 if (st->silk_mode.opusCanSwitch) 1002 if (st->silk_mode.opusCanSwitch)
994 { 1003 {
995 redundancy = 1; 1004 redundancy = 1;
996 celt_to_silk = 0; 1005 celt_to_silk = 0;
997 st->silk_bw_switch = 1; 1006 st->silk_bw_switch = 1;
998 } 1007 }
999 } 1008 }
1000 1009
1001 /* CELT processing */ 1010 /* CELT processing */
1002 { 1011 {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 } else { 1049 } else {
1041 /* check if SILK used up too much */ 1050 /* check if SILK used up too much */
1042 nb_compr_bytes = len > bytes_target ? len : bytes_target; 1051 nb_compr_bytes = len > bytes_target ? len : bytes_target;
1043 } 1052 }
1044 } else { 1053 } else {
1045 if (st->use_vbr) 1054 if (st->use_vbr)
1046 { 1055 {
1047 celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1)); 1056 celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1));
1048 celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_const raint)); 1057 celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_const raint));
1049 celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps)); 1058 celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps));
1050 nb_compr_bytes = max_data_bytes-1; 1059 nb_compr_bytes = max_data_bytes-1-redundancy_bytes;
1051 } else { 1060 } else {
1052 nb_compr_bytes = bytes_target; 1061 nb_compr_bytes = bytes_target;
1053 } 1062 }
1054 } 1063 }
1055 1064
1056 } else { 1065 } else {
1057 nb_compr_bytes = 0; 1066 nb_compr_bytes = 0;
1058 } 1067 }
1059 1068
1060 ALLOC(tmp_prefill, st->channels*st->Fs/400, opus_val16); 1069 ALLOC(tmp_prefill, st->channels*st->Fs/400, opus_val16);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 redundancy_bytes = IMIN(max_redundancy, st->bitrate_bps/1600); 1121 redundancy_bytes = IMIN(max_redundancy, st->bitrate_bps/1600);
1113 redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); 1122 redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes));
1114 if (st->mode == MODE_HYBRID) 1123 if (st->mode == MODE_HYBRID)
1115 ec_enc_uint(&enc, redundancy_bytes-2, 256); 1124 ec_enc_uint(&enc, redundancy_bytes-2, 256);
1116 } 1125 }
1117 } else { 1126 } else {
1118 redundancy = 0; 1127 redundancy = 0;
1119 } 1128 }
1120 1129
1121 if (!redundancy) 1130 if (!redundancy)
1131 {
1122 st->silk_bw_switch = 0; 1132 st->silk_bw_switch = 0;
1123 1133 redundancy_bytes = 0;
1134 }
1124 if (st->mode != MODE_CELT_ONLY)start_band=17; 1135 if (st->mode != MODE_CELT_ONLY)start_band=17;
1125 1136
1126 if (st->mode == MODE_SILK_ONLY) 1137 if (st->mode == MODE_SILK_ONLY)
1127 { 1138 {
1128 ret = (ec_tell(&enc)+7)>>3; 1139 ret = (ec_tell(&enc)+7)>>3;
1129 ec_enc_done(&enc); 1140 ec_enc_done(&enc);
1130 nb_compr_bytes = ret; 1141 nb_compr_bytes = ret;
1131 } else { 1142 } else {
1132 nb_compr_bytes = IMIN((max_data_bytes-1)-redundancy_bytes, nb_compr_bytes ); 1143 nb_compr_bytes = IMIN((max_data_bytes-1)-redundancy_bytes, nb_compr_bytes );
1133 ec_enc_shrink(&enc, nb_compr_bytes); 1144 ec_enc_shrink(&enc, nb_compr_bytes);
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
1597 return ret; 1608 return ret;
1598 bad_arg: 1609 bad_arg:
1599 va_end(ap); 1610 va_end(ap);
1600 return OPUS_BAD_ARG; 1611 return OPUS_BAD_ARG;
1601 } 1612 }
1602 1613
1603 void opus_encoder_destroy(OpusEncoder *st) 1614 void opus_encoder_destroy(OpusEncoder *st)
1604 { 1615 {
1605 opus_free(st); 1616 opus_free(st);
1606 } 1617 }
OLDNEW
« no previous file with comments | « src/opus_demo.c ('k') | src/opus_multistream.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698