OLD | NEW |
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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 int first; | 97 int first; |
98 opus_val16 * energy_masking; | 98 opus_val16 * energy_masking; |
99 StereoWidthState width_mem; | 99 StereoWidthState width_mem; |
100 opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2]; | 100 opus_val16 delay_buffer[MAX_ENCODER_BUFFER*2]; |
101 #ifndef DISABLE_FLOAT_API | 101 #ifndef DISABLE_FLOAT_API |
102 TonalityAnalysisState analysis; | 102 TonalityAnalysisState analysis; |
103 int detected_bandwidth; | 103 int detected_bandwidth; |
104 int analysis_offset; | 104 int analysis_offset; |
105 #endif | 105 #endif |
106 opus_uint32 rangeFinal; | 106 opus_uint32 rangeFinal; |
107 int arch; | 107 int arch; |
108 }; | 108 }; |
109 | 109 |
110 /* Transition tables for the voice and music. First column is the | 110 /* Transition tables for the voice and music. First column is the |
111 middle (memoriless) threshold. The second column is the hysteresis | 111 middle (memoriless) threshold. The second column is the hysteresis |
112 (difference with the middle) */ | 112 (difference with the middle) */ |
113 static const opus_int32 mono_voice_bandwidth_thresholds[8] = { | 113 static const opus_int32 mono_voice_bandwidth_thresholds[8] = { |
114 11000, 1000, /* NB<->MB */ | 114 11000, 1000, /* NB<->MB */ |
115 14000, 1000, /* MB<->WB */ | 115 14000, 1000, /* MB<->WB */ |
116 17000, 1000, /* WB<->SWB */ | 116 17000, 1000, /* WB<->SWB */ |
117 20000, 1000, /* SWB<->FB */ | 117 21000, 2000, /* SWB<->FB */ |
118 }; | 118 }; |
119 static const opus_int32 mono_music_bandwidth_thresholds[8] = { | 119 static const opus_int32 mono_music_bandwidth_thresholds[8] = { |
120 14000, 1000, /* MB not allowed */ | 120 12000, 1000, /* NB<->MB */ |
121 18000, 2000, /* MB<->WB */ | 121 15000, 1000, /* MB<->WB */ |
122 24000, 2000, /* WB<->SWB */ | 122 18000, 2000, /* WB<->SWB */ |
123 33000, 2000, /* SWB<->FB */ | 123 22000, 2000, /* SWB<->FB */ |
124 }; | 124 }; |
125 static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { | 125 static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { |
126 11000, 1000, /* NB<->MB */ | 126 11000, 1000, /* NB<->MB */ |
127 14000, 1000, /* MB<->WB */ | 127 14000, 1000, /* MB<->WB */ |
128 21000, 2000, /* WB<->SWB */ | 128 21000, 2000, /* WB<->SWB */ |
129 32000, 2000, /* SWB<->FB */ | 129 28000, 2000, /* SWB<->FB */ |
130 }; | 130 }; |
131 static const opus_int32 stereo_music_bandwidth_thresholds[8] = { | 131 static const opus_int32 stereo_music_bandwidth_thresholds[8] = { |
132 14000, 1000, /* MB not allowed */ | 132 12000, 1000, /* NB<->MB */ |
133 18000, 2000, /* MB<->WB */ | 133 18000, 2000, /* MB<->WB */ |
134 24000, 2000, /* WB<->SWB */ | 134 21000, 2000, /* WB<->SWB */ |
135 48000, 2000, /* SWB<->FB */ | 135 30000, 2000, /* SWB<->FB */ |
136 }; | 136 }; |
137 /* Threshold bit-rates for switching between mono and stereo */ | 137 /* Threshold bit-rates for switching between mono and stereo */ |
138 static const opus_int32 stereo_voice_threshold = 31000; | 138 static const opus_int32 stereo_voice_threshold = 30000; |
139 static const opus_int32 stereo_music_threshold = 31000; | 139 static const opus_int32 stereo_music_threshold = 30000; |
140 | 140 |
141 /* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ | 141 /* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ |
142 static const opus_int32 mode_thresholds[2][2] = { | 142 static const opus_int32 mode_thresholds[2][2] = { |
143 /* voice */ /* music */ | 143 /* voice */ /* music */ |
144 { 64000, 20000}, /* mono */ | 144 { 64000, 16000}, /* mono */ |
145 { 36000, 20000}, /* stereo */ | 145 { 36000, 16000}, /* stereo */ |
146 }; | 146 }; |
147 | 147 |
148 int opus_encoder_get_size(int channels) | 148 int opus_encoder_get_size(int channels) |
149 { | 149 { |
150 int silkEncSizeBytes, celtEncSizeBytes; | 150 int silkEncSizeBytes, celtEncSizeBytes; |
151 int ret; | 151 int ret; |
152 if (channels<1 || channels > 2) | 152 if (channels<1 || channels > 2) |
153 return 0; | 153 return 0; |
154 ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); | 154 ret = silk_Get_Encoder_Size( &silkEncSizeBytes ); |
155 if (ret) | 155 if (ret) |
(...skipping 25 matching lines...) Expand all Loading... |
181 st->celt_enc_offset = st->silk_enc_offset+silkEncSizeBytes; | 181 st->celt_enc_offset = st->silk_enc_offset+silkEncSizeBytes; |
182 silk_enc = (char*)st+st->silk_enc_offset; | 182 silk_enc = (char*)st+st->silk_enc_offset; |
183 celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); | 183 celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); |
184 | 184 |
185 st->stream_channels = st->channels = channels; | 185 st->stream_channels = st->channels = channels; |
186 | 186 |
187 st->Fs = Fs; | 187 st->Fs = Fs; |
188 | 188 |
189 st->arch = opus_select_arch(); | 189 st->arch = opus_select_arch(); |
190 | 190 |
191 ret = silk_InitEncoder( silk_enc, &st->silk_mode ); | 191 ret = silk_InitEncoder( silk_enc, st->arch, &st->silk_mode ); |
192 if(ret)return OPUS_INTERNAL_ERROR; | 192 if(ret)return OPUS_INTERNAL_ERROR; |
193 | 193 |
194 /* default SILK parameters */ | 194 /* default SILK parameters */ |
195 st->silk_mode.nChannelsAPI = channels; | 195 st->silk_mode.nChannelsAPI = channels; |
196 st->silk_mode.nChannelsInternal = channels; | 196 st->silk_mode.nChannelsInternal = channels; |
197 st->silk_mode.API_sampleRate = st->Fs; | 197 st->silk_mode.API_sampleRate = st->Fs; |
198 st->silk_mode.maxInternalSampleRate = 16000; | 198 st->silk_mode.maxInternalSampleRate = 16000; |
199 st->silk_mode.minInternalSampleRate = 8000; | 199 st->silk_mode.minInternalSampleRate = 8000; |
200 st->silk_mode.desiredInternalSampleRate = 16000; | 200 st->silk_mode.desiredInternalSampleRate = 16000; |
201 st->silk_mode.payloadSize_ms = 20; | 201 st->silk_mode.payloadSize_ms = 20; |
202 st->silk_mode.bitRate = 25000; | 202 st->silk_mode.bitRate = 25000; |
203 st->silk_mode.packetLossPercentage = 0; | 203 st->silk_mode.packetLossPercentage = 0; |
204 st->silk_mode.complexity = 9; | 204 st->silk_mode.complexity = 9; |
205 st->silk_mode.useInBandFEC = 0; | 205 st->silk_mode.useInBandFEC = 0; |
206 st->silk_mode.useDTX = 0; | 206 st->silk_mode.useDTX = 0; |
207 st->silk_mode.useCBR = 0; | 207 st->silk_mode.useCBR = 0; |
| 208 st->silk_mode.reducedDependency = 0; |
208 | 209 |
209 /* Create CELT encoder */ | 210 /* Create CELT encoder */ |
210 /* Initialize CELT encoder */ | 211 /* Initialize CELT encoder */ |
211 err = celt_encoder_init(celt_enc, Fs, channels); | 212 err = celt_encoder_init(celt_enc, Fs, channels, st->arch); |
212 if(err!=OPUS_OK)return OPUS_INTERNAL_ERROR; | 213 if(err!=OPUS_OK)return OPUS_INTERNAL_ERROR; |
213 | 214 |
214 celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0)); | 215 celt_encoder_ctl(celt_enc, CELT_SET_SIGNALLING(0)); |
215 celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(st->silk_mode.complexity)); | 216 celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(st->silk_mode.complexity)); |
216 | 217 |
217 st->use_vbr = 1; | 218 st->use_vbr = 1; |
218 /* Makes constrained VBR the default (safer for real-time use) */ | 219 /* Makes constrained VBR the default (safer for real-time use) */ |
219 st->vbr_constraint = 1; | 220 st->vbr_constraint = 1; |
220 st->user_bitrate_bps = OPUS_AUTO; | 221 st->user_bitrate_bps = OPUS_AUTO; |
221 st->bitrate_bps = 3000+Fs*channels; | 222 st->bitrate_bps = 3000+Fs*channels; |
(...skipping 15 matching lines...) Expand all Loading... |
237 st->hybrid_stereo_width_Q14 = 1 << 14; | 238 st->hybrid_stereo_width_Q14 = 1 << 14; |
238 st->prev_HB_gain = Q15ONE; | 239 st->prev_HB_gain = Q15ONE; |
239 st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOF
F_HZ ), 8 ); | 240 st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOF
F_HZ ), 8 ); |
240 st->first = 1; | 241 st->first = 1; |
241 st->mode = MODE_HYBRID; | 242 st->mode = MODE_HYBRID; |
242 st->bandwidth = OPUS_BANDWIDTH_FULLBAND; | 243 st->bandwidth = OPUS_BANDWIDTH_FULLBAND; |
243 | 244 |
244 return OPUS_OK; | 245 return OPUS_OK; |
245 } | 246 } |
246 | 247 |
247 static int pad_frame(unsigned char *data, opus_int32 len, opus_int32 new_len) | |
248 { | |
249 if (len == new_len) | |
250 return 0; | |
251 if (len > new_len) | |
252 return 1; | |
253 | |
254 if ((data[0]&0x3)==0) | |
255 { | |
256 int i; | |
257 int padding, nb_255s; | |
258 | |
259 padding = new_len - len; | |
260 if (padding >= 2) | |
261 { | |
262 nb_255s = (padding-2)/255; | |
263 | |
264 for (i=len-1;i>=1;i--) | |
265 data[i+nb_255s+2] = data[i]; | |
266 data[0] |= 0x3; | |
267 data[1] = 0x41; | |
268 for (i=0;i<nb_255s;i++) | |
269 data[i+2] = 255; | |
270 data[nb_255s+2] = padding-255*nb_255s-2; | |
271 for (i=len+3+nb_255s;i<new_len;i++) | |
272 data[i] = 0; | |
273 } else { | |
274 for (i=len-1;i>=1;i--) | |
275 data[i+1] = data[i]; | |
276 data[0] |= 0x3; | |
277 data[1] = 1; | |
278 } | |
279 return 0; | |
280 } else { | |
281 return 1; | |
282 } | |
283 } | |
284 | |
285 static unsigned char gen_toc(int mode, int framerate, int bandwidth, int channel
s) | 248 static unsigned char gen_toc(int mode, int framerate, int bandwidth, int channel
s) |
286 { | 249 { |
287 int period; | 250 int period; |
288 unsigned char toc; | 251 unsigned char toc; |
289 period = 0; | 252 period = 0; |
290 while (framerate < 400) | 253 while (framerate < 400) |
291 { | 254 { |
292 framerate <<= 1; | 255 framerate <<= 1; |
293 period++; | 256 period++; |
294 } | 257 } |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 for (i=N-1;i>=0;i--) | 642 for (i=N-1;i>=0;i--) |
680 { | 643 { |
681 /*printf("%d ", best_state);*/ | 644 /*printf("%d ", best_state);*/ |
682 best_state = states[i][best_state]; | 645 best_state = states[i][best_state]; |
683 } | 646 } |
684 /*printf("%d\n", best_state);*/ | 647 /*printf("%d\n", best_state);*/ |
685 return best_state; | 648 return best_state; |
686 } | 649 } |
687 | 650 |
688 int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs, | 651 int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs, |
689 int bitrate, opus_val16 tonality, opus_val32 *mem, int buffering
, | 652 int bitrate, opus_val16 tonality, float *mem, int buffering, |
690 downmix_func downmix) | 653 downmix_func downmix) |
691 { | 654 { |
692 int N; | 655 int N; |
693 int i; | 656 int i; |
694 float e[MAX_DYNAMIC_FRAMESIZE+4]; | 657 float e[MAX_DYNAMIC_FRAMESIZE+4]; |
695 float e_1[MAX_DYNAMIC_FRAMESIZE+3]; | 658 float e_1[MAX_DYNAMIC_FRAMESIZE+3]; |
696 float memx; | 659 opus_val32 memx; |
697 int bestLM=0; | 660 int bestLM=0; |
698 int subframe; | 661 int subframe; |
699 int pos; | 662 int pos; |
700 VARDECL(opus_val32, sub); | 663 VARDECL(opus_val32, sub); |
701 | 664 |
702 subframe = Fs/400; | 665 subframe = Fs/400; |
703 ALLOC(sub, subframe, opus_val32); | 666 ALLOC(sub, subframe, opus_val32); |
704 e[0]=mem[0]; | 667 e[0]=mem[0]; |
705 e_1[0]=1.f/(EPSILON+mem[0]); | 668 e_1[0]=1.f/(EPSILON+mem[0]); |
706 if (buffering) | 669 if (buffering) |
707 { | 670 { |
708 /* Consider the CELT delay when not in restricted-lowdelay */ | 671 /* Consider the CELT delay when not in restricted-lowdelay */ |
709 /* We assume the buffering is between 2.5 and 5 ms */ | 672 /* We assume the buffering is between 2.5 and 5 ms */ |
710 int offset = 2*subframe - buffering; | 673 int offset = 2*subframe - buffering; |
711 celt_assert(offset>=0 && offset <= subframe); | 674 celt_assert(offset>=0 && offset <= subframe); |
712 x += C*offset; | 675 x += C*offset; |
713 len -= offset; | 676 len -= offset; |
714 e[1]=mem[1]; | 677 e[1]=mem[1]; |
715 e_1[1]=1.f/(EPSILON+mem[1]); | 678 e_1[1]=1.f/(EPSILON+mem[1]); |
716 e[2]=mem[2]; | 679 e[2]=mem[2]; |
717 e_1[2]=1.f/(EPSILON+mem[2]); | 680 e_1[2]=1.f/(EPSILON+mem[2]); |
718 pos = 3; | 681 pos = 3; |
719 } else { | 682 } else { |
720 pos=1; | 683 pos=1; |
721 } | 684 } |
722 N=IMIN(len/subframe, MAX_DYNAMIC_FRAMESIZE); | 685 N=IMIN(len/subframe, MAX_DYNAMIC_FRAMESIZE); |
723 memx = x[0]; | 686 /* Just silencing a warning, it's really initialized later */ |
| 687 memx = 0; |
724 for (i=0;i<N;i++) | 688 for (i=0;i<N;i++) |
725 { | 689 { |
726 float tmp; | 690 float tmp; |
727 float tmpx; | 691 opus_val32 tmpx; |
728 int j; | 692 int j; |
729 tmp=EPSILON; | 693 tmp=EPSILON; |
730 | 694 |
731 downmix(x, sub, subframe, i*subframe, 0, -2, C); | 695 downmix(x, sub, subframe, i*subframe, 0, -2, C); |
732 if (i==0) | 696 if (i==0) |
733 memx = sub[0]; | 697 memx = sub[0]; |
734 for (j=0;j<subframe;j++) | 698 for (j=0;j<subframe;j++) |
735 { | 699 { |
736 tmpx = sub[j]; | 700 tmpx = sub[j]; |
737 tmp += (tmpx-memx)*(tmpx-memx); | 701 tmp += (tmpx-memx)*(float)(tmpx-memx); |
738 memx = tmpx; | 702 memx = tmpx; |
739 } | 703 } |
740 e[i+pos] = tmp; | 704 e[i+pos] = tmp; |
741 e_1[i+pos] = 1.f/tmp; | 705 e_1[i+pos] = 1.f/tmp; |
742 } | 706 } |
743 /* Hack to get 20 ms working with APPLICATION_AUDIO | 707 /* Hack to get 20 ms working with APPLICATION_AUDIO |
744 The real problem is that the corresponding memory needs to use 1.5 ms | 708 The real problem is that the corresponding memory needs to use 1.5 ms |
745 from this frame and 1 ms from the next frame */ | 709 from this frame and 1 ms from the next frame */ |
746 e[i+pos] = e[i+pos-1]; | 710 e[i+pos] = e[i+pos-1]; |
747 if (buffering) | 711 if (buffering) |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 if (new_size>frame_size) | 813 if (new_size>frame_size) |
850 return -1; | 814 return -1; |
851 if (400*new_size!=Fs && 200*new_size!=Fs && 100*new_size!=Fs && | 815 if (400*new_size!=Fs && 200*new_size!=Fs && 100*new_size!=Fs && |
852 50*new_size!=Fs && 25*new_size!=Fs && 50*new_size!=3*Fs) | 816 50*new_size!=Fs && 25*new_size!=Fs && 50*new_size!=3*Fs) |
853 return -1; | 817 return -1; |
854 return new_size; | 818 return new_size; |
855 } | 819 } |
856 | 820 |
857 opus_int32 compute_frame_size(const void *analysis_pcm, int frame_size, | 821 opus_int32 compute_frame_size(const void *analysis_pcm, int frame_size, |
858 int variable_duration, int C, opus_int32 Fs, int bitrate_bps, | 822 int variable_duration, int C, opus_int32 Fs, int bitrate_bps, |
859 int delay_compensation, downmix_func downmix, opus_val32 *subframe_mem) | 823 int delay_compensation, downmix_func downmix |
| 824 #ifndef DISABLE_FLOAT_API |
| 825 , float *subframe_mem |
| 826 #endif |
| 827 ) |
860 { | 828 { |
861 #ifndef DISABLE_FLOAT_API | 829 #ifndef DISABLE_FLOAT_API |
862 if (variable_duration == OPUS_FRAMESIZE_VARIABLE && frame_size >= Fs/200) | 830 if (variable_duration == OPUS_FRAMESIZE_VARIABLE && frame_size >= Fs/200) |
863 { | 831 { |
864 int LM = 3; | 832 int LM = 3; |
865 LM = optimize_framesize(analysis_pcm, frame_size, C, Fs, bitrate_bps, | 833 LM = optimize_framesize(analysis_pcm, frame_size, C, Fs, bitrate_bps, |
866 0, subframe_mem, delay_compensation, downmix); | 834 0, subframe_mem, delay_compensation, downmix); |
867 while ((Fs/400<<LM)>frame_size) | 835 while ((Fs/400<<LM)>frame_size) |
868 LM--; | 836 LM--; |
869 frame_size = (Fs/400<<LM); | 837 frame_size = (Fs/400<<LM); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1088 if (!st->use_vbr) | 1056 if (!st->use_vbr) |
1089 { | 1057 { |
1090 int cbrBytes; | 1058 int cbrBytes; |
1091 cbrBytes = IMIN( (st->bitrate_bps + 4*frame_rate)/(8*frame_rate) , max_da
ta_bytes); | 1059 cbrBytes = IMIN( (st->bitrate_bps + 4*frame_rate)/(8*frame_rate) , max_da
ta_bytes); |
1092 st->bitrate_bps = cbrBytes * (8*frame_rate); | 1060 st->bitrate_bps = cbrBytes * (8*frame_rate); |
1093 max_data_bytes = cbrBytes; | 1061 max_data_bytes = cbrBytes; |
1094 } | 1062 } |
1095 max_rate = frame_rate*max_data_bytes*8; | 1063 max_rate = frame_rate*max_data_bytes*8; |
1096 | 1064 |
1097 /* Equivalent 20-ms rate for mode/channel/bandwidth decisions */ | 1065 /* Equivalent 20-ms rate for mode/channel/bandwidth decisions */ |
1098 equiv_rate = st->bitrate_bps - 60*(st->Fs/frame_size - 50); | 1066 equiv_rate = st->bitrate_bps - (40*st->channels+20)*(st->Fs/frame_size - 50)
; |
1099 | 1067 |
1100 if (st->signal_type == OPUS_SIGNAL_VOICE) | 1068 if (st->signal_type == OPUS_SIGNAL_VOICE) |
1101 voice_est = 127; | 1069 voice_est = 127; |
1102 else if (st->signal_type == OPUS_SIGNAL_MUSIC) | 1070 else if (st->signal_type == OPUS_SIGNAL_MUSIC) |
1103 voice_est = 0; | 1071 voice_est = 0; |
1104 else if (st->voice_ratio >= 0) | 1072 else if (st->voice_ratio >= 0) |
1105 { | 1073 { |
1106 voice_est = st->voice_ratio*327>>8; | 1074 voice_est = st->voice_ratio*327>>8; |
1107 /* For AUDIO, never be more than 90% confident of having speech */ | 1075 /* For AUDIO, never be more than 90% confident of having speech */ |
1108 if (st->application == OPUS_APPLICATION_AUDIO) | 1076 if (st->application == OPUS_APPLICATION_AUDIO) |
(...skipping 20 matching lines...) Expand all Loading... |
1129 if (st->stream_channels == 2) | 1097 if (st->stream_channels == 2) |
1130 stereo_threshold -= 1000; | 1098 stereo_threshold -= 1000; |
1131 else | 1099 else |
1132 stereo_threshold += 1000; | 1100 stereo_threshold += 1000; |
1133 st->stream_channels = (equiv_rate > stereo_threshold) ? 2 : 1; | 1101 st->stream_channels = (equiv_rate > stereo_threshold) ? 2 : 1; |
1134 } else { | 1102 } else { |
1135 st->stream_channels = st->channels; | 1103 st->stream_channels = st->channels; |
1136 } | 1104 } |
1137 #endif | 1105 #endif |
1138 } | 1106 } |
| 1107 equiv_rate = st->bitrate_bps - (40*st->stream_channels+20)*(st->Fs/frame_siz
e - 50); |
1139 | 1108 |
1140 /* Mode selection depending on application and signal type */ | 1109 /* Mode selection depending on application and signal type */ |
1141 if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) | 1110 if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) |
1142 { | 1111 { |
1143 st->mode = MODE_CELT_ONLY; | 1112 st->mode = MODE_CELT_ONLY; |
1144 } else if (st->user_forced_mode == OPUS_AUTO) | 1113 } else if (st->user_forced_mode == OPUS_AUTO) |
1145 { | 1114 { |
1146 #ifdef FUZZING | 1115 #ifdef FUZZING |
1147 /* Random mode switching */ | 1116 /* Random mode switching */ |
1148 if ((rand()&0xF)==0) | 1117 if ((rand()&0xF)==0) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 if (st->silk_mode.useDTX && voice_est > 100) | 1157 if (st->silk_mode.useDTX && voice_est > 100) |
1189 st->mode = MODE_SILK_ONLY; | 1158 st->mode = MODE_SILK_ONLY; |
1190 #endif | 1159 #endif |
1191 } else { | 1160 } else { |
1192 st->mode = st->user_forced_mode; | 1161 st->mode = st->user_forced_mode; |
1193 } | 1162 } |
1194 | 1163 |
1195 /* Override the chosen mode to make sure we meet the requested frame size */ | 1164 /* Override the chosen mode to make sure we meet the requested frame size */ |
1196 if (st->mode != MODE_CELT_ONLY && frame_size < st->Fs/100) | 1165 if (st->mode != MODE_CELT_ONLY && frame_size < st->Fs/100) |
1197 st->mode = MODE_CELT_ONLY; | 1166 st->mode = MODE_CELT_ONLY; |
| 1167 if (st->lfe) |
| 1168 st->mode = MODE_CELT_ONLY; |
| 1169 /* If max_data_bytes represents less than 8 kb/s, switch to CELT-only mode *
/ |
| 1170 if (max_data_bytes < (frame_rate > 50 ? 12000 : 8000)*frame_size / (st->Fs *
8)) |
| 1171 st->mode = MODE_CELT_ONLY; |
1198 | 1172 |
1199 if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMon
o==0 | 1173 if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMon
o==0 |
1200 && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) | 1174 && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY) |
1201 { | 1175 { |
1202 /* Delay stereo->mono transition by two frames so that SILK can do a smoo
th downmix */ | 1176 /* Delay stereo->mono transition by two frames so that SILK can do a smoo
th downmix */ |
1203 st->silk_mode.toMono = 1; | 1177 st->silk_mode.toMono = 1; |
1204 st->stream_channels = 2; | 1178 st->stream_channels = 2; |
1205 } else { | 1179 } else { |
1206 st->silk_mode.toMono = 0; | 1180 st->silk_mode.toMono = 0; |
1207 } | 1181 } |
(...skipping 30 matching lines...) Expand all Loading... |
1238 /* Fair share of the max size allowed */ | 1212 /* Fair share of the max size allowed */ |
1239 redundancy_bytes = IMIN(257, max_data_bytes*(opus_int32)(st->Fs/200)/(fra
me_size+st->Fs/200)); | 1213 redundancy_bytes = IMIN(257, max_data_bytes*(opus_int32)(st->Fs/200)/(fra
me_size+st->Fs/200)); |
1240 /* For VBR, target the actual bitrate (subject to the limit above) */ | 1214 /* For VBR, target the actual bitrate (subject to the limit above) */ |
1241 if (st->use_vbr) | 1215 if (st->use_vbr) |
1242 redundancy_bytes = IMIN(redundancy_bytes, st->bitrate_bps/1600); | 1216 redundancy_bytes = IMIN(redundancy_bytes, st->bitrate_bps/1600); |
1243 } | 1217 } |
1244 | 1218 |
1245 if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) | 1219 if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY) |
1246 { | 1220 { |
1247 silk_EncControlStruct dummy; | 1221 silk_EncControlStruct dummy; |
1248 silk_InitEncoder( silk_enc, &dummy); | 1222 silk_InitEncoder( silk_enc, st->arch, &dummy); |
1249 prefill=1; | 1223 prefill=1; |
1250 } | 1224 } |
1251 | 1225 |
1252 /* Automatic (rate-dependent) bandwidth selection */ | 1226 /* Automatic (rate-dependent) bandwidth selection */ |
1253 if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthS
witch) | 1227 if (st->mode == MODE_CELT_ONLY || st->first || st->silk_mode.allowBandwidthS
witch) |
1254 { | 1228 { |
1255 const opus_int32 *voice_bandwidth_thresholds, *music_bandwidth_threshold
s; | 1229 const opus_int32 *voice_bandwidth_thresholds, *music_bandwidth_threshold
s; |
1256 opus_int32 bandwidth_thresholds[8]; | 1230 opus_int32 bandwidth_thresholds[8]; |
1257 int bandwidth = OPUS_BANDWIDTH_FULLBAND; | 1231 int bandwidth = OPUS_BANDWIDTH_FULLBAND; |
1258 opus_int32 equiv_rate2; | 1232 opus_int32 equiv_rate2; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1316 /* Prevents Opus from wasting bits on frequencies that are above | 1290 /* Prevents Opus from wasting bits on frequencies that are above |
1317 the Nyquist rate of the input signal */ | 1291 the Nyquist rate of the input signal */ |
1318 if (st->Fs <= 24000 && st->bandwidth > OPUS_BANDWIDTH_SUPERWIDEBAND) | 1292 if (st->Fs <= 24000 && st->bandwidth > OPUS_BANDWIDTH_SUPERWIDEBAND) |
1319 st->bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; | 1293 st->bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; |
1320 if (st->Fs <= 16000 && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) | 1294 if (st->Fs <= 16000 && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) |
1321 st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; | 1295 st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; |
1322 if (st->Fs <= 12000 && st->bandwidth > OPUS_BANDWIDTH_MEDIUMBAND) | 1296 if (st->Fs <= 12000 && st->bandwidth > OPUS_BANDWIDTH_MEDIUMBAND) |
1323 st->bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; | 1297 st->bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; |
1324 if (st->Fs <= 8000 && st->bandwidth > OPUS_BANDWIDTH_NARROWBAND) | 1298 if (st->Fs <= 8000 && st->bandwidth > OPUS_BANDWIDTH_NARROWBAND) |
1325 st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; | 1299 st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; |
1326 #ifndef FIXED_POINT | 1300 #ifndef DISABLE_FLOAT_API |
1327 /* Use detected bandwidth to reduce the encoded bandwidth. */ | 1301 /* Use detected bandwidth to reduce the encoded bandwidth. */ |
1328 if (st->detected_bandwidth && st->user_bandwidth == OPUS_AUTO) | 1302 if (st->detected_bandwidth && st->user_bandwidth == OPUS_AUTO) |
1329 { | 1303 { |
1330 int min_detected_bandwidth; | 1304 int min_detected_bandwidth; |
1331 /* Makes bandwidth detection more conservative just in case the detector | 1305 /* Makes bandwidth detection more conservative just in case the detector |
1332 gets it wrong when we could have coded a high bandwidth transparently. | 1306 gets it wrong when we could have coded a high bandwidth transparently. |
1333 When operating in SILK/hybrid mode, we don't go below wideband to avoi
d | 1307 When operating in SILK/hybrid mode, we don't go below wideband to avoi
d |
1334 more complicated switches that require redundancy. */ | 1308 more complicated switches that require redundancy. */ |
1335 if (st->bitrate_bps <= 18000*st->stream_channels && st->mode == MODE_CELT
_ONLY) | 1309 if (equiv_rate <= 18000*st->stream_channels && st->mode == MODE_CELT_ONLY
) |
1336 min_detected_bandwidth = OPUS_BANDWIDTH_NARROWBAND; | 1310 min_detected_bandwidth = OPUS_BANDWIDTH_NARROWBAND; |
1337 else if (st->bitrate_bps <= 24000*st->stream_channels && st->mode == MODE
_CELT_ONLY) | 1311 else if (equiv_rate <= 24000*st->stream_channels && st->mode == MODE_CELT
_ONLY) |
1338 min_detected_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; | 1312 min_detected_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; |
1339 else if (st->bitrate_bps <= 30000*st->stream_channels) | 1313 else if (equiv_rate <= 30000*st->stream_channels) |
1340 min_detected_bandwidth = OPUS_BANDWIDTH_WIDEBAND; | 1314 min_detected_bandwidth = OPUS_BANDWIDTH_WIDEBAND; |
1341 else if (st->bitrate_bps <= 44000*st->stream_channels) | 1315 else if (equiv_rate <= 44000*st->stream_channels) |
1342 min_detected_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; | 1316 min_detected_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; |
1343 else | 1317 else |
1344 min_detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; | 1318 min_detected_bandwidth = OPUS_BANDWIDTH_FULLBAND; |
1345 | 1319 |
1346 st->detected_bandwidth = IMAX(st->detected_bandwidth, min_detected_bandwi
dth); | 1320 st->detected_bandwidth = IMAX(st->detected_bandwidth, min_detected_bandwi
dth); |
1347 st->bandwidth = IMIN(st->bandwidth, st->detected_bandwidth); | 1321 st->bandwidth = IMIN(st->bandwidth, st->detected_bandwidth); |
1348 } | 1322 } |
1349 #endif | 1323 #endif |
1350 celt_encoder_ctl(celt_enc, OPUS_SET_LSB_DEPTH(lsb_depth)); | 1324 celt_encoder_ctl(celt_enc, OPUS_SET_LSB_DEPTH(lsb_depth)); |
1351 | 1325 |
1352 /* If max_data_bytes represents less than 8 kb/s, switch to CELT-only mode *
/ | |
1353 if (max_data_bytes < (frame_rate > 50 ? 12000 : 8000)*frame_size / (st->Fs *
8)) | |
1354 st->mode = MODE_CELT_ONLY; | |
1355 | |
1356 /* CELT mode doesn't support mediumband, use wideband instead */ | 1326 /* CELT mode doesn't support mediumband, use wideband instead */ |
1357 if (st->mode == MODE_CELT_ONLY && st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND
) | 1327 if (st->mode == MODE_CELT_ONLY && st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND
) |
1358 st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; | 1328 st->bandwidth = OPUS_BANDWIDTH_WIDEBAND; |
1359 if (st->lfe) | 1329 if (st->lfe) |
1360 { | |
1361 st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; | 1330 st->bandwidth = OPUS_BANDWIDTH_NARROWBAND; |
1362 st->mode = MODE_CELT_ONLY; | |
1363 } | |
1364 | 1331 |
1365 /* Can't support higher than wideband for >20 ms frames */ | 1332 /* Can't support higher than wideband for >20 ms frames */ |
1366 if (frame_size > st->Fs/50 && (st->mode == MODE_CELT_ONLY || st->bandwidth >
OPUS_BANDWIDTH_WIDEBAND)) | 1333 if (frame_size > st->Fs/50 && (st->mode == MODE_CELT_ONLY || st->bandwidth >
OPUS_BANDWIDTH_WIDEBAND)) |
1367 { | 1334 { |
1368 VARDECL(unsigned char, tmp_data); | 1335 VARDECL(unsigned char, tmp_data); |
1369 int nb_frames; | 1336 int nb_frames; |
1370 int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; | 1337 int bak_mode, bak_bandwidth, bak_channels, bak_to_mono; |
1371 VARDECL(OpusRepacketizer, rp); | 1338 VARDECL(OpusRepacketizer, rp); |
1372 opus_int32 bytes_per_frame; | 1339 opus_int32 bytes_per_frame; |
| 1340 opus_int32 repacketize_len; |
1373 | 1341 |
| 1342 #ifndef DISABLE_FLOAT_API |
1374 if (analysis_read_pos_bak!= -1) | 1343 if (analysis_read_pos_bak!= -1) |
1375 { | 1344 { |
1376 st->analysis.read_pos = analysis_read_pos_bak; | 1345 st->analysis.read_pos = analysis_read_pos_bak; |
1377 st->analysis.read_subframe = analysis_read_subframe_bak; | 1346 st->analysis.read_subframe = analysis_read_subframe_bak; |
1378 } | 1347 } |
| 1348 #endif |
1379 | 1349 |
1380 nb_frames = frame_size > st->Fs/25 ? 3 : 2; | 1350 nb_frames = frame_size > st->Fs/25 ? 3 : 2; |
1381 bytes_per_frame = IMIN(1276,(out_data_bytes-3)/nb_frames); | 1351 bytes_per_frame = IMIN(1276,(out_data_bytes-3)/nb_frames); |
1382 | 1352 |
1383 ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); | 1353 ALLOC(tmp_data, nb_frames*bytes_per_frame, unsigned char); |
1384 | 1354 |
1385 ALLOC(rp, 1, OpusRepacketizer); | 1355 ALLOC(rp, 1, OpusRepacketizer); |
1386 opus_repacketizer_init(rp); | 1356 opus_repacketizer_init(rp); |
1387 | 1357 |
1388 bak_mode = st->user_forced_mode; | 1358 bak_mode = st->user_forced_mode; |
(...skipping 24 matching lines...) Expand all Loading... |
1413 RESTORE_STACK; | 1383 RESTORE_STACK; |
1414 return OPUS_INTERNAL_ERROR; | 1384 return OPUS_INTERNAL_ERROR; |
1415 } | 1385 } |
1416 ret = opus_repacketizer_cat(rp, tmp_data+i*bytes_per_frame, tmp_len); | 1386 ret = opus_repacketizer_cat(rp, tmp_data+i*bytes_per_frame, tmp_len); |
1417 if (ret<0) | 1387 if (ret<0) |
1418 { | 1388 { |
1419 RESTORE_STACK; | 1389 RESTORE_STACK; |
1420 return OPUS_INTERNAL_ERROR; | 1390 return OPUS_INTERNAL_ERROR; |
1421 } | 1391 } |
1422 } | 1392 } |
1423 ret = opus_repacketizer_out(rp, data, out_data_bytes); | 1393 if (st->use_vbr) |
| 1394 repacketize_len = out_data_bytes; |
| 1395 else |
| 1396 repacketize_len = IMIN(3*st->bitrate_bps/(3*8*50/nb_frames), out_data_
bytes); |
| 1397 ret = opus_repacketizer_out_range_impl(rp, 0, nb_frames, data, repacketiz
e_len, 0, !st->use_vbr); |
1424 if (ret<0) | 1398 if (ret<0) |
1425 { | 1399 { |
1426 RESTORE_STACK; | 1400 RESTORE_STACK; |
1427 return OPUS_INTERNAL_ERROR; | 1401 return OPUS_INTERNAL_ERROR; |
1428 } | 1402 } |
1429 st->user_forced_mode = bak_mode; | 1403 st->user_forced_mode = bak_mode; |
1430 st->user_bandwidth = bak_bandwidth; | 1404 st->user_bandwidth = bak_bandwidth; |
1431 st->force_channels = bak_channels; | 1405 st->force_channels = bak_channels; |
1432 st->silk_mode.toMono = bak_to_mono; | 1406 st->silk_mode.toMono = bak_to_mono; |
1433 RESTORE_STACK; | 1407 RESTORE_STACK; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1495 /* SILK gets 2/3 of the remaining bits */ | 1469 /* SILK gets 2/3 of the remaining bits */ |
1496 st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate
) * 2 / 3; | 1470 st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate
) * 2 / 3; |
1497 } else { /* FULLBAND */ | 1471 } else { /* FULLBAND */ |
1498 /* SILK gets 3/5 of the remaining bits */ | 1472 /* SILK gets 3/5 of the remaining bits */ |
1499 st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate
) * 3 / 5; | 1473 st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate
) * 3 / 5; |
1500 } | 1474 } |
1501 /* Don't let SILK use more than 80% */ | 1475 /* Don't let SILK use more than 80% */ |
1502 if( st->silk_mode.bitRate > total_bitRate * 4/5 ) { | 1476 if( st->silk_mode.bitRate > total_bitRate * 4/5 ) { |
1503 st->silk_mode.bitRate = total_bitRate * 4/5; | 1477 st->silk_mode.bitRate = total_bitRate * 4/5; |
1504 } | 1478 } |
1505 /* Increasingly attenuate high band when it gets allocated fewer bit
s */ | 1479 if (!st->energy_masking) |
1506 celt_rate = total_bitRate - st->silk_mode.bitRate; | 1480 { |
1507 HB_gain_ref = (curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND) ? 300
0 : 3600; | 1481 /* Increasingly attenuate high band when it gets allocated fewer
bits */ |
1508 HB_gain = SHL32((opus_val32)celt_rate, 9) / SHR32((opus_val32)celt_r
ate + st->stream_channels * HB_gain_ref, 6); | 1482 celt_rate = total_bitRate - st->silk_mode.bitRate; |
1509 HB_gain = HB_gain < Q15ONE*6/7 ? HB_gain + Q15ONE/7 : Q15ONE; | 1483 HB_gain_ref = (curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND) ?
3000 : 3600; |
| 1484 HB_gain = SHL32((opus_val32)celt_rate, 9) / SHR32((opus_val32)cel
t_rate + st->stream_channels * HB_gain_ref, 6); |
| 1485 HB_gain = HB_gain < Q15ONE*6/7 ? HB_gain + Q15ONE/7 : Q15ONE; |
| 1486 } |
1510 } else { | 1487 } else { |
1511 /* SILK gets all bits */ | 1488 /* SILK gets all bits */ |
1512 st->silk_mode.bitRate = total_bitRate; | 1489 st->silk_mode.bitRate = total_bitRate; |
1513 } | 1490 } |
1514 | 1491 |
1515 /* Surround masking for SILK */ | 1492 /* Surround masking for SILK */ |
1516 if (st->energy_masking && st->use_vbr && !st->lfe) | 1493 if (st->energy_masking && st->use_vbr && !st->lfe) |
1517 { | 1494 { |
1518 opus_val32 mask_sum=0; | 1495 opus_val32 mask_sum=0; |
1519 opus_val16 masking_depth; | 1496 opus_val16 masking_depth; |
1520 opus_int32 rate_offset; | 1497 opus_int32 rate_offset; |
1521 int c; | 1498 int c; |
1522 int end = 17; | 1499 int end = 17; |
1523 opus_int16 srate = 16000; | 1500 opus_int16 srate = 16000; |
1524 if (st->bandwidth == OPUS_BANDWIDTH_NARROWBAND) | 1501 if (st->bandwidth == OPUS_BANDWIDTH_NARROWBAND) |
1525 { | 1502 { |
1526 end = 13; | 1503 end = 13; |
1527 srate = 8000; | 1504 srate = 8000; |
1528 } else if (st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) | 1505 } else if (st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) |
1529 { | 1506 { |
1530 end = 15; | 1507 end = 15; |
1531 srate = 12000; | 1508 srate = 12000; |
1532 } | 1509 } |
1533 for (c=0;c<st->channels;c++) | 1510 for (c=0;c<st->channels;c++) |
1534 { | 1511 { |
1535 for(i=0;i<end;i++) | 1512 for(i=0;i<end;i++) |
1536 { | 1513 { |
1537 opus_val16 mask; | 1514 opus_val16 mask; |
1538 mask = MAX16(MIN16(st->energy_masking[21*c+i], | 1515 mask = MAX16(MIN16(st->energy_masking[21*c+i], |
1539 QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); | 1516 QCONST16(.5f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); |
1540 if (mask > 0) | 1517 if (mask > 0) |
1541 mask = HALF16(mask); | 1518 mask = HALF16(mask); |
1542 mask_sum += mask; | 1519 mask_sum += mask; |
1543 } | 1520 } |
1544 } | 1521 } |
1545 /* Conservative rate reduction, we cut the masking in half */ | 1522 /* Conservative rate reduction, we cut the masking in half */ |
1546 masking_depth = HALF16(mask_sum / end*st->channels); | 1523 masking_depth = mask_sum / end*st->channels; |
1547 rate_offset = PSHR32(MULT16_16(srate, masking_depth), DB_SHIFT); | 1524 masking_depth += QCONST16(.2f, DB_SHIFT); |
| 1525 rate_offset = (opus_int32)PSHR32(MULT16_16(srate, masking_depth), DB_
SHIFT); |
1548 rate_offset = MAX32(rate_offset, -2*st->silk_mode.bitRate/3); | 1526 rate_offset = MAX32(rate_offset, -2*st->silk_mode.bitRate/3); |
1549 rate_offset += QCONST16(.4f, DB_SHIFT); | 1527 /* Split the rate change between the SILK and CELT part for hybrid. *
/ |
1550 st->silk_mode.bitRate += rate_offset; | 1528 if (st->bandwidth==OPUS_BANDWIDTH_SUPERWIDEBAND || st->bandwidth==OPU
S_BANDWIDTH_FULLBAND) |
| 1529 st->silk_mode.bitRate += 3*rate_offset/5; |
| 1530 else |
| 1531 st->silk_mode.bitRate += rate_offset; |
1551 bytes_target += rate_offset * frame_size / (8 * st->Fs); | 1532 bytes_target += rate_offset * frame_size / (8 * st->Fs); |
1552 } | 1533 } |
1553 | 1534 |
1554 st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs; | 1535 st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs; |
1555 st->silk_mode.nChannelsAPI = st->channels; | 1536 st->silk_mode.nChannelsAPI = st->channels; |
1556 st->silk_mode.nChannelsInternal = st->stream_channels; | 1537 st->silk_mode.nChannelsInternal = st->stream_channels; |
1557 if (curr_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { | 1538 if (curr_bandwidth == OPUS_BANDWIDTH_NARROWBAND) { |
1558 st->silk_mode.desiredInternalSampleRate = 8000; | 1539 st->silk_mode.desiredInternalSampleRate = 8000; |
1559 } else if (curr_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { | 1540 } else if (curr_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) { |
1560 st->silk_mode.desiredInternalSampleRate = 12000; | 1541 st->silk_mode.desiredInternalSampleRate = 12000; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1691 case OPUS_BANDWIDTH_FULLBAND: | 1672 case OPUS_BANDWIDTH_FULLBAND: |
1692 endband = 21; | 1673 endband = 21; |
1693 break; | 1674 break; |
1694 } | 1675 } |
1695 celt_encoder_ctl(celt_enc, CELT_SET_END_BAND(endband)); | 1676 celt_encoder_ctl(celt_enc, CELT_SET_END_BAND(endband)); |
1696 celt_encoder_ctl(celt_enc, CELT_SET_CHANNELS(st->stream_channels)); | 1677 celt_encoder_ctl(celt_enc, CELT_SET_CHANNELS(st->stream_channels)); |
1697 } | 1678 } |
1698 celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); | 1679 celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(OPUS_BITRATE_MAX)); |
1699 if (st->mode != MODE_SILK_ONLY) | 1680 if (st->mode != MODE_SILK_ONLY) |
1700 { | 1681 { |
| 1682 opus_val32 celt_pred=2; |
1701 celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); | 1683 celt_encoder_ctl(celt_enc, OPUS_SET_VBR(0)); |
1702 /* Allow prediction unless we decide to disable it later */ | 1684 /* We may still decide to disable prediction later */ |
1703 celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(2)); | 1685 if (st->silk_mode.reducedDependency) |
| 1686 celt_pred = 0; |
| 1687 celt_encoder_ctl(celt_enc, CELT_SET_PREDICTION(celt_pred)); |
1704 | 1688 |
1705 if (st->mode == MODE_HYBRID) | 1689 if (st->mode == MODE_HYBRID) |
1706 { | 1690 { |
1707 int len; | 1691 int len; |
1708 | 1692 |
1709 len = (ec_tell(&enc)+7)>>3; | 1693 len = (ec_tell(&enc)+7)>>3; |
1710 if (redundancy) | 1694 if (redundancy) |
1711 len += st->mode == MODE_HYBRID ? 3 : 1; | 1695 len += st->mode == MODE_HYBRID ? 3 : 1; |
1712 if( st->use_vbr ) { | 1696 if( st->use_vbr ) { |
1713 nb_compr_bytes = len + bytes_target - (st->silk_mode.bitRate * f
rame_size) / (8 * st->Fs); | 1697 nb_compr_bytes = len + bytes_target - (st->silk_mode.bitRate * f
rame_size) / (8 * st->Fs); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1753 st->delay_buffer[i] = pcm_buf[(frame_size+total_buffer-st->encoder_buffe
r)*st->channels+i]; | 1737 st->delay_buffer[i] = pcm_buf[(frame_size+total_buffer-st->encoder_buffe
r)*st->channels+i]; |
1754 | 1738 |
1755 /* gain_fade() and stereo_fade() need to be after the buffer copying | 1739 /* gain_fade() and stereo_fade() need to be after the buffer copying |
1756 because we don't want any of this to affect the SILK part */ | 1740 because we don't want any of this to affect the SILK part */ |
1757 if( st->prev_HB_gain < Q15ONE || HB_gain < Q15ONE ) { | 1741 if( st->prev_HB_gain < Q15ONE || HB_gain < Q15ONE ) { |
1758 gain_fade(pcm_buf, pcm_buf, | 1742 gain_fade(pcm_buf, pcm_buf, |
1759 st->prev_HB_gain, HB_gain, celt_mode->overlap, frame_size, st->chan
nels, celt_mode->window, st->Fs); | 1743 st->prev_HB_gain, HB_gain, celt_mode->overlap, frame_size, st->chan
nels, celt_mode->window, st->Fs); |
1760 } | 1744 } |
1761 st->prev_HB_gain = HB_gain; | 1745 st->prev_HB_gain = HB_gain; |
1762 if (st->mode != MODE_HYBRID || st->stream_channels==1) | 1746 if (st->mode != MODE_HYBRID || st->stream_channels==1) |
1763 st->silk_mode.stereoWidth_Q14 = IMIN((1<<14),IMAX(0,st->bitrate_bps-32000
)); | 1747 st->silk_mode.stereoWidth_Q14 = IMIN((1<<14),2*IMAX(0,equiv_rate-30000)); |
1764 if( !st->energy_masking && st->channels == 2 ) { | 1748 if( !st->energy_masking && st->channels == 2 ) { |
1765 /* Apply stereo width reduction (at low bitrates) */ | 1749 /* Apply stereo width reduction (at low bitrates) */ |
1766 if( st->hybrid_stereo_width_Q14 < (1 << 14) || st->silk_mode.stereoWidth
_Q14 < (1 << 14) ) { | 1750 if( st->hybrid_stereo_width_Q14 < (1 << 14) || st->silk_mode.stereoWidth
_Q14 < (1 << 14) ) { |
1767 opus_val16 g1, g2; | 1751 opus_val16 g1, g2; |
1768 g1 = st->hybrid_stereo_width_Q14; | 1752 g1 = st->hybrid_stereo_width_Q14; |
1769 g2 = (opus_val16)(st->silk_mode.stereoWidth_Q14); | 1753 g2 = (opus_val16)(st->silk_mode.stereoWidth_Q14); |
1770 #ifdef FIXED_POINT | 1754 #ifdef FIXED_POINT |
1771 g1 = g1==16384 ? Q15ONE : SHL16(g1,1); | 1755 g1 = g1==16384 ? Q15ONE : SHL16(g1,1); |
1772 g2 = g2==16384 ? Q15ONE : SHL16(g2,1); | 1756 g2 = g2==16384 ? Q15ONE : SHL16(g2,1); |
1773 #else | 1757 #else |
1774 g1 *= (1.f/16384); | 1758 g1 *= (1.f/16384); |
1775 g2 *= (1.f/16384); | 1759 g2 *= (1.f/16384); |
1776 #endif | 1760 #endif |
1777 stereo_fade(pcm_buf, pcm_buf, g1, g2, celt_mode->overlap, | 1761 stereo_fade(pcm_buf, pcm_buf, g1, g2, celt_mode->overlap, |
1778 frame_size, st->channels, celt_mode->window, st->Fs); | 1762 frame_size, st->channels, celt_mode->window, st->Fs); |
1779 st->hybrid_stereo_width_Q14 = st->silk_mode.stereoWidth_Q14; | 1763 st->hybrid_stereo_width_Q14 = st->silk_mode.stereoWidth_Q14; |
1780 } | 1764 } |
1781 } | 1765 } |
1782 | 1766 |
1783 if ( st->mode != MODE_CELT_ONLY && ec_tell(&enc)+17+20*(st->mode == MODE_HYB
RID) <= 8*(max_data_bytes-1)) | 1767 if ( st->mode != MODE_CELT_ONLY && ec_tell(&enc)+17+20*(st->mode == MODE_HYB
RID) <= 8*(max_data_bytes-1)) |
1784 { | 1768 { |
1785 /* For SILK mode, the redundancy is inferred from the length */ | 1769 /* For SILK mode, the redundancy is inferred from the length */ |
1786 if (st->mode == MODE_HYBRID && (redundancy || ec_tell(&enc)+37 <= 8*nb_c
ompr_bytes)) | 1770 if (st->mode == MODE_HYBRID && (redundancy || ec_tell(&enc)+37 <= 8*nb_c
ompr_bytes)) |
1787 ec_enc_bit_logp(&enc, redundancy, 12); | 1771 ec_enc_bit_logp(&enc, redundancy, 12); |
1788 if (redundancy) | 1772 if (redundancy) |
1789 { | 1773 { |
1790 int max_redundancy; | 1774 int max_redundancy; |
1791 ec_enc_bit_logp(&enc, celt_to_silk, 1); | 1775 ec_enc_bit_logp(&enc, celt_to_silk, 1); |
1792 if (st->mode == MODE_HYBRID) | 1776 if (st->mode == MODE_HYBRID) |
1793 max_redundancy = (max_data_bytes-1)-nb_compr_bytes-1; | 1777 max_redundancy = (max_data_bytes-1)-nb_compr_bytes; |
1794 else | 1778 else |
1795 max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+7)>>3); | 1779 max_redundancy = (max_data_bytes-1)-((ec_tell(&enc)+7)>>3); |
1796 /* Target the same bit-rate for redundancy as for the rest, | 1780 /* Target the same bit-rate for redundancy as for the rest, |
1797 up to a max of 257 bytes */ | 1781 up to a max of 257 bytes */ |
1798 redundancy_bytes = IMIN(max_redundancy, st->bitrate_bps/1600); | 1782 redundancy_bytes = IMIN(max_redundancy, st->bitrate_bps/1600); |
1799 redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); | 1783 redundancy_bytes = IMIN(257, IMAX(2, redundancy_bytes)); |
1800 if (st->mode == MODE_HYBRID) | 1784 if (st->mode == MODE_HYBRID) |
1801 ec_enc_uint(&enc, redundancy_bytes-2, 256); | 1785 ec_enc_uint(&enc, redundancy_bytes-2, 256); |
1802 } | 1786 } |
1803 } else { | 1787 } else { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1926 /*When in LPC only mode it's perfectly | 1910 /*When in LPC only mode it's perfectly |
1927 reasonable to strip off trailing zero bytes as | 1911 reasonable to strip off trailing zero bytes as |
1928 the required range decoder behavior is to | 1912 the required range decoder behavior is to |
1929 fill these in. This can't be done when the MDCT | 1913 fill these in. This can't be done when the MDCT |
1930 modes are used because the decoder needs to know | 1914 modes are used because the decoder needs to know |
1931 the actual length for allocation purposes.*/ | 1915 the actual length for allocation purposes.*/ |
1932 while(ret>2&&data[ret]==0)ret--; | 1916 while(ret>2&&data[ret]==0)ret--; |
1933 } | 1917 } |
1934 /* Count ToC and redundancy */ | 1918 /* Count ToC and redundancy */ |
1935 ret += 1+redundancy_bytes; | 1919 ret += 1+redundancy_bytes; |
1936 if (!st->use_vbr && ret >= 3) | 1920 if (!st->use_vbr) |
1937 { | 1921 { |
1938 if (pad_frame(data, ret, max_data_bytes)) | 1922 if (opus_packet_pad(data, ret, max_data_bytes) != OPUS_OK) |
| 1923 |
1939 { | 1924 { |
1940 RESTORE_STACK; | 1925 RESTORE_STACK; |
1941 return OPUS_INTERNAL_ERROR; | 1926 return OPUS_INTERNAL_ERROR; |
1942 } | 1927 } |
1943 ret = max_data_bytes; | 1928 ret = max_data_bytes; |
1944 } | 1929 } |
1945 RESTORE_STACK; | 1930 RESTORE_STACK; |
1946 return ret; | 1931 return ret; |
1947 } | 1932 } |
1948 | 1933 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1980 unsigned char *data, opus_int32 out_data_bytes) | 1965 unsigned char *data, opus_int32 out_data_bytes) |
1981 { | 1966 { |
1982 int frame_size; | 1967 int frame_size; |
1983 int delay_compensation; | 1968 int delay_compensation; |
1984 if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) | 1969 if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) |
1985 delay_compensation = 0; | 1970 delay_compensation = 0; |
1986 else | 1971 else |
1987 delay_compensation = st->delay_compensation; | 1972 delay_compensation = st->delay_compensation; |
1988 frame_size = compute_frame_size(pcm, analysis_frame_size, | 1973 frame_size = compute_frame_size(pcm, analysis_frame_size, |
1989 st->variable_duration, st->channels, st->Fs, st->bitrate_bps, | 1974 st->variable_duration, st->channels, st->Fs, st->bitrate_bps, |
1990 delay_compensation, downmix_float, st->analysis.subframe_mem); | 1975 delay_compensation, downmix_int |
| 1976 #ifndef DISABLE_FLOAT_API |
| 1977 , st->analysis.subframe_mem |
| 1978 #endif |
| 1979 ); |
1991 return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 16, pcm,
analysis_frame_size, 0, -2, st->channels, downmix_int); | 1980 return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 16, pcm,
analysis_frame_size, 0, -2, st->channels, downmix_int); |
1992 } | 1981 } |
1993 | 1982 |
1994 #else | 1983 #else |
1995 opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_fram
e_size, | 1984 opus_int32 opus_encode(OpusEncoder *st, const opus_int16 *pcm, int analysis_fram
e_size, |
1996 unsigned char *data, opus_int32 max_data_bytes) | 1985 unsigned char *data, opus_int32 max_data_bytes) |
1997 { | 1986 { |
1998 int i, ret; | 1987 int i, ret; |
1999 int frame_size; | 1988 int frame_size; |
2000 int delay_compensation; | 1989 int delay_compensation; |
2001 VARDECL(float, in); | 1990 VARDECL(float, in); |
2002 ALLOC_STACK; | 1991 ALLOC_STACK; |
2003 | 1992 |
2004 if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) | 1993 if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) |
2005 delay_compensation = 0; | 1994 delay_compensation = 0; |
2006 else | 1995 else |
2007 delay_compensation = st->delay_compensation; | 1996 delay_compensation = st->delay_compensation; |
2008 frame_size = compute_frame_size(pcm, analysis_frame_size, | 1997 frame_size = compute_frame_size(pcm, analysis_frame_size, |
2009 st->variable_duration, st->channels, st->Fs, st->bitrate_bps, | 1998 st->variable_duration, st->channels, st->Fs, st->bitrate_bps, |
2010 delay_compensation, downmix_float, st->analysis.subframe_mem); | 1999 delay_compensation, downmix_int, st->analysis.subframe_mem); |
2011 | 2000 |
2012 ALLOC(in, frame_size*st->channels, float); | 2001 ALLOC(in, frame_size*st->channels, float); |
2013 | 2002 |
2014 for (i=0;i<frame_size*st->channels;i++) | 2003 for (i=0;i<frame_size*st->channels;i++) |
2015 in[i] = (1.0f/32768)*pcm[i]; | 2004 in[i] = (1.0f/32768)*pcm[i]; |
2016 ret = opus_encode_native(st, in, frame_size, data, max_data_bytes, 16, pcm, a
nalysis_frame_size, 0, -2, st->channels, downmix_int); | 2005 ret = opus_encode_native(st, in, frame_size, data, max_data_bytes, 16, pcm, a
nalysis_frame_size, 0, -2, st->channels, downmix_int); |
2017 RESTORE_STACK; | 2006 RESTORE_STACK; |
2018 return ret; | 2007 return ret; |
2019 } | 2008 } |
2020 opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_fra
me_size, | 2009 opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, int analysis_fra
me_size, |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2402 case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST: | 2391 case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST: |
2403 { | 2392 { |
2404 opus_int32 *value = va_arg(ap, opus_int32*); | 2393 opus_int32 *value = va_arg(ap, opus_int32*); |
2405 if (!value) | 2394 if (!value) |
2406 { | 2395 { |
2407 goto bad_arg; | 2396 goto bad_arg; |
2408 } | 2397 } |
2409 *value = st->variable_duration; | 2398 *value = st->variable_duration; |
2410 } | 2399 } |
2411 break; | 2400 break; |
| 2401 case OPUS_SET_PREDICTION_DISABLED_REQUEST: |
| 2402 { |
| 2403 opus_int32 value = va_arg(ap, opus_int32); |
| 2404 if (value > 1 || value < 0) |
| 2405 goto bad_arg; |
| 2406 st->silk_mode.reducedDependency = value; |
| 2407 } |
| 2408 break; |
| 2409 case OPUS_GET_PREDICTION_DISABLED_REQUEST: |
| 2410 { |
| 2411 opus_int32 *value = va_arg(ap, opus_int32*); |
| 2412 if (!value) |
| 2413 goto bad_arg; |
| 2414 *value = st->silk_mode.reducedDependency; |
| 2415 } |
| 2416 break; |
2412 case OPUS_RESET_STATE: | 2417 case OPUS_RESET_STATE: |
2413 { | 2418 { |
2414 void *silk_enc; | 2419 void *silk_enc; |
2415 silk_EncControlStruct dummy; | 2420 silk_EncControlStruct dummy; |
2416 silk_enc = (char*)st+st->silk_enc_offset; | 2421 silk_enc = (char*)st+st->silk_enc_offset; |
2417 | 2422 |
2418 OPUS_CLEAR((char*)&st->OPUS_ENCODER_RESET_START, | 2423 OPUS_CLEAR((char*)&st->OPUS_ENCODER_RESET_START, |
2419 sizeof(OpusEncoder)- | 2424 sizeof(OpusEncoder)- |
2420 ((char*)&st->OPUS_ENCODER_RESET_START - (char*)st)); | 2425 ((char*)&st->OPUS_ENCODER_RESET_START - (char*)st)); |
2421 | 2426 |
2422 celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); | 2427 celt_encoder_ctl(celt_enc, OPUS_RESET_STATE); |
2423 silk_InitEncoder( silk_enc, &dummy ); | 2428 silk_InitEncoder( silk_enc, st->arch, &dummy ); |
2424 st->stream_channels = st->channels; | 2429 st->stream_channels = st->channels; |
2425 st->hybrid_stereo_width_Q14 = 1 << 14; | 2430 st->hybrid_stereo_width_Q14 = 1 << 14; |
2426 st->prev_HB_gain = Q15ONE; | 2431 st->prev_HB_gain = Q15ONE; |
2427 st->first = 1; | 2432 st->first = 1; |
2428 st->mode = MODE_HYBRID; | 2433 st->mode = MODE_HYBRID; |
2429 st->bandwidth = OPUS_BANDWIDTH_FULLBAND; | 2434 st->bandwidth = OPUS_BANDWIDTH_FULLBAND; |
2430 st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MI
N_CUTOFF_HZ ), 8 ); | 2435 st->variable_HP_smth2_Q15 = silk_LSHIFT( silk_lin2log( VARIABLE_HP_MI
N_CUTOFF_HZ ), 8 ); |
2431 } | 2436 } |
2432 break; | 2437 break; |
2433 case OPUS_SET_FORCE_MODE_REQUEST: | 2438 case OPUS_SET_FORCE_MODE_REQUEST: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2474 return ret; | 2479 return ret; |
2475 bad_arg: | 2480 bad_arg: |
2476 va_end(ap); | 2481 va_end(ap); |
2477 return OPUS_BAD_ARG; | 2482 return OPUS_BAD_ARG; |
2478 } | 2483 } |
2479 | 2484 |
2480 void opus_encoder_destroy(OpusEncoder *st) | 2485 void opus_encoder_destroy(OpusEncoder *st) |
2481 { | 2486 { |
2482 opus_free(st); | 2487 opus_free(st); |
2483 } | 2488 } |
OLD | NEW |