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

Side by Side Diff: third_party/opus/src/silk/enc_API.c

Issue 2195313002: Remove Opus from DEPS and import a local copy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Local copy of opus, opus/src/.gitignore, opus/DEPS, update README.chromium Created 4 years, 4 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
« no previous file with comments | « third_party/opus/src/silk/define.h ('k') | third_party/opus/src/silk/encode_indices.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /***********************************************************************
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3 Redistribution and use in source and binary forms, with or without
4 modification, are permitted provided that the following conditions
5 are met:
6 - Redistributions of source code must retain the above copyright notice,
7 this list of conditions and the following disclaimer.
8 - Redistributions in binary form must reproduce the above copyright
9 notice, this list of conditions and the following disclaimer in the
10 documentation and/or other materials provided with the distribution.
11 - Neither the name of Internet Society, IETF or IETF Trust, nor the
12 names of specific contributors, may be used to endorse or promote
13 products derived from this software without specific prior written
14 permission.
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 POSSIBILITY OF SUCH DAMAGE.
26 ***********************************************************************/
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31 #include "define.h"
32 #include "API.h"
33 #include "control.h"
34 #include "typedef.h"
35 #include "stack_alloc.h"
36 #include "structs.h"
37 #include "tuning_parameters.h"
38 #ifdef FIXED_POINT
39 #include "main_FIX.h"
40 #else
41 #include "main_FLP.h"
42 #endif
43
44 /***************************************/
45 /* Read control structure from encoder */
46 /***************************************/
47 static opus_int silk_QueryEncoder( /* O Returns error co de */
48 const void *encState, /* I State */
49 silk_EncControlStruct *encStatus /* O Encoder Status */
50 );
51
52 /****************************************/
53 /* Encoder functions */
54 /****************************************/
55
56 opus_int silk_Get_Encoder_Size( /* O Returns error co de */
57 opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */
58 )
59 {
60 opus_int ret = SILK_NO_ERROR;
61
62 *encSizeBytes = sizeof( silk_encoder );
63
64 return ret;
65 }
66
67 /*************************/
68 /* Init or Reset encoder */
69 /*************************/
70 opus_int silk_InitEncoder( /* O Returns error co de */
71 void *encState, /* I/O State */
72 int arch, /* I Run-time archite cture */
73 silk_EncControlStruct *encStatus /* O Encoder Status */
74 )
75 {
76 silk_encoder *psEnc;
77 opus_int n, ret = SILK_NO_ERROR;
78
79 psEnc = (silk_encoder *)encState;
80
81 /* Reset encoder */
82 silk_memset( psEnc, 0, sizeof( silk_encoder ) );
83 for( n = 0; n < ENCODER_NUM_CHANNELS; n++ ) {
84 if( ret += silk_init_encoder( &psEnc->state_Fxx[ n ], arch ) ) {
85 silk_assert( 0 );
86 }
87 }
88
89 psEnc->nChannelsAPI = 1;
90 psEnc->nChannelsInternal = 1;
91
92 /* Read control structure */
93 if( ret += silk_QueryEncoder( encState, encStatus ) ) {
94 silk_assert( 0 );
95 }
96
97 return ret;
98 }
99
100 /***************************************/
101 /* Read control structure from encoder */
102 /***************************************/
103 static opus_int silk_QueryEncoder( /* O Returns error co de */
104 const void *encState, /* I State */
105 silk_EncControlStruct *encStatus /* O Encoder Status */
106 )
107 {
108 opus_int ret = SILK_NO_ERROR;
109 silk_encoder_state_Fxx *state_Fxx;
110 silk_encoder *psEnc = (silk_encoder *)encState;
111
112 state_Fxx = psEnc->state_Fxx;
113
114 encStatus->nChannelsAPI = psEnc->nChannelsAPI;
115 encStatus->nChannelsInternal = psEnc->nChannelsInternal;
116 encStatus->API_sampleRate = state_Fxx[ 0 ].sCmn.API_fs_Hz;
117 encStatus->maxInternalSampleRate = state_Fxx[ 0 ].sCmn.maxInternal_fs_Hz ;
118 encStatus->minInternalSampleRate = state_Fxx[ 0 ].sCmn.minInternal_fs_Hz ;
119 encStatus->desiredInternalSampleRate = state_Fxx[ 0 ].sCmn.desiredInternal_f s_Hz;
120 encStatus->payloadSize_ms = state_Fxx[ 0 ].sCmn.PacketSize_ms;
121 encStatus->bitRate = state_Fxx[ 0 ].sCmn.TargetRate_bps;
122 encStatus->packetLossPercentage = state_Fxx[ 0 ].sCmn.PacketLoss_perc;
123 encStatus->complexity = state_Fxx[ 0 ].sCmn.Complexity;
124 encStatus->useInBandFEC = state_Fxx[ 0 ].sCmn.useInBandFEC;
125 encStatus->useDTX = state_Fxx[ 0 ].sCmn.useDTX;
126 encStatus->useCBR = state_Fxx[ 0 ].sCmn.useCBR;
127 encStatus->internalSampleRate = silk_SMULBB( state_Fxx[ 0 ].sCmn.fs_k Hz, 1000 );
128 encStatus->allowBandwidthSwitch = state_Fxx[ 0 ].sCmn.allow_bandwidth_s witch;
129 encStatus->inWBmodeWithoutVariableLP = state_Fxx[ 0 ].sCmn.fs_kHz == 16 && s tate_Fxx[ 0 ].sCmn.sLP.mode == 0;
130
131 return ret;
132 }
133
134
135 /**************************/
136 /* Encode frame with Silk */
137 /**************************/
138 /* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespect ive of what */
139 /* encControl->payloadSize_ms is set to */
140 opus_int silk_Encode( /* O Returns error co de */
141 void *encState, /* I/O State */
142 silk_EncControlStruct *encControl, /* I Control status */
143 const opus_int16 *samplesIn, /* I Speech sample in put vector */
144 opus_int nSamplesIn, /* I Number of sample s in input vector */
145 ec_enc *psRangeEnc, /* I/O Compressor data structure */
146 opus_int32 *nBytesOut, /* I/O Number of bytes in payload (input: Max bytes) */
147 const opus_int prefillFlag /* I Flag to indicate prefilling buffers no coding */
148 )
149 {
150 opus_int n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, r et = 0;
151 opus_int nSamplesToBuffer, nSamplesToBufferMax, nBlocksOf10ms;
152 opus_int nSamplesFromInput = 0, nSamplesFromInputMax;
153 opus_int speech_act_thr_for_switch_Q8;
154 opus_int32 TargetRate_bps, MStargetRates_bps[ 2 ], channelRate_bps, LBRR_sym bol, sum;
155 silk_encoder *psEnc = ( silk_encoder * )encState;
156 VARDECL( opus_int16, buf );
157 opus_int transition, curr_block, tot_blocks;
158 SAVE_STACK;
159
160 if (encControl->reducedDependency)
161 {
162 psEnc->state_Fxx[0].sCmn.first_frame_after_reset = 1;
163 psEnc->state_Fxx[1].sCmn.first_frame_after_reset = 1;
164 }
165 psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded = psEnc->state_Fxx[ 1 ].sCmn.nFram esEncoded = 0;
166
167 /* Check values in encoder control structure */
168 if( ( ret = check_control_input( encControl ) ) != 0 ) {
169 silk_assert( 0 );
170 RESTORE_STACK;
171 return ret;
172 }
173
174 encControl->switchReady = 0;
175
176 if( encControl->nChannelsInternal > psEnc->nChannelsInternal ) {
177 /* Mono -> Stereo transition: init state of second channel and stereo st ate */
178 ret += silk_init_encoder( &psEnc->state_Fxx[ 1 ], psEnc->state_Fxx[ 0 ]. sCmn.arch );
179 silk_memset( psEnc->sStereo.pred_prev_Q13, 0, sizeof( psEnc->sStereo.pre d_prev_Q13 ) );
180 silk_memset( psEnc->sStereo.sSide, 0, sizeof( psEnc->sStereo.sSide ) );
181 psEnc->sStereo.mid_side_amp_Q0[ 0 ] = 0;
182 psEnc->sStereo.mid_side_amp_Q0[ 1 ] = 1;
183 psEnc->sStereo.mid_side_amp_Q0[ 2 ] = 0;
184 psEnc->sStereo.mid_side_amp_Q0[ 3 ] = 1;
185 psEnc->sStereo.width_prev_Q14 = 0;
186 psEnc->sStereo.smth_width_Q14 = SILK_FIX_CONST( 1, 14 );
187 if( psEnc->nChannelsAPI == 2 ) {
188 silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->st ate_Fxx[ 0 ].sCmn.resampler_state, sizeof( silk_resampler_state_struct ) );
189 silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.In_HP_State, &psEnc->st ate_Fxx[ 0 ].sCmn.In_HP_State, sizeof( psEnc->state_Fxx[ 1 ].sCmn.In_HP_Stat e ) );
190 }
191 }
192
193 transition = (encControl->payloadSize_ms != psEnc->state_Fxx[ 0 ].sCmn.Packe tSize_ms) || (psEnc->nChannelsInternal != encControl->nChannelsInternal);
194
195 psEnc->nChannelsAPI = encControl->nChannelsAPI;
196 psEnc->nChannelsInternal = encControl->nChannelsInternal;
197
198 nBlocksOf10ms = silk_DIV32( 100 * nSamplesIn, encControl->API_sampleRate );
199 tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1;
200 curr_block = 0;
201 if( prefillFlag ) {
202 /* Only accept input length of 10 ms */
203 if( nBlocksOf10ms != 1 ) {
204 silk_assert( 0 );
205 RESTORE_STACK;
206 return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
207 }
208 /* Reset Encoder */
209 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
210 ret = silk_init_encoder( &psEnc->state_Fxx[ n ], psEnc->state_Fxx[ n ].sCmn.arch );
211 silk_assert( !ret );
212 }
213 tmp_payloadSize_ms = encControl->payloadSize_ms;
214 encControl->payloadSize_ms = 10;
215 tmp_complexity = encControl->complexity;
216 encControl->complexity = 0;
217 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
218 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
219 psEnc->state_Fxx[ n ].sCmn.prefillFlag = 1;
220 }
221 } else {
222 /* Only accept input lengths that are a multiple of 10 ms */
223 if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nS amplesIn < 0 ) {
224 silk_assert( 0 );
225 RESTORE_STACK;
226 return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
227 }
228 /* Make sure no more than one packet can be produced */
229 if( 1000 * (opus_int32)nSamplesIn > encControl->payloadSize_ms * encCont rol->API_sampleRate ) {
230 silk_assert( 0 );
231 RESTORE_STACK;
232 return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES;
233 }
234 }
235
236 TargetRate_bps = silk_RSHIFT32( encControl->bitRate, encControl->nChannelsIn ternal - 1 );
237 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
238 /* Force the side channel to the same rate as the mid */
239 opus_int force_fs_kHz = (n==1) ? psEnc->state_Fxx[0].sCmn.fs_kHz : 0;
240 if( ( ret = silk_control_encoder( &psEnc->state_Fxx[ n ], encControl, Ta rgetRate_bps, psEnc->allowBandwidthSwitch, n, force_fs_kHz ) ) != 0 ) {
241 silk_assert( 0 );
242 RESTORE_STACK;
243 return ret;
244 }
245 if( psEnc->state_Fxx[n].sCmn.first_frame_after_reset || transition ) {
246 for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
247 psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] = 0;
248 }
249 }
250 psEnc->state_Fxx[ n ].sCmn.inDTX = psEnc->state_Fxx[ n ].sCmn.useDTX;
251 }
252 silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 0 ].sCm n.fs_kHz == psEnc->state_Fxx[ 1 ].sCmn.fs_kHz );
253
254 /* Input buffering/resampling and encoding */
255 nSamplesToBufferMax =
256 10 * nBlocksOf10ms * psEnc->state_Fxx[ 0 ].sCmn.fs_kHz;
257 nSamplesFromInputMax =
258 silk_DIV32_16( nSamplesToBufferMax *
259 psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz,
260 psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 );
261 ALLOC( buf, nSamplesFromInputMax, opus_int16 );
262 while( 1 ) {
263 nSamplesToBuffer = psEnc->state_Fxx[ 0 ].sCmn.frame_length - psEnc->sta te_Fxx[ 0 ].sCmn.inputBufIx;
264 nSamplesToBuffer = silk_min( nSamplesToBuffer, nSamplesToBufferMax );
265 nSamplesFromInput = silk_DIV32_16( nSamplesToBuffer * psEnc->state_Fxx[ 0 ].sCmn.API_fs_Hz, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz * 1000 );
266 /* Resample and write to buffer */
267 if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 2 ) {
268 opus_int id = psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded;
269 for( n = 0; n < nSamplesFromInput; n++ ) {
270 buf[ n ] = samplesIn[ 2 * n ];
271 }
272 /* Making sure to start both resamplers from the same state when swi tching from mono to stereo */
273 if( psEnc->nPrevChannelsInternal == 1 && id==0 ) {
274 silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc- >state_Fxx[ 0 ].sCmn.resampler_state, sizeof(psEnc->state_Fxx[ 1 ].sCmn.resample r_state));
275 }
276
277 ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
278 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn .inputBufIx + 2 ], buf, nSamplesFromInput );
279 psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
280
281 nSamplesToBuffer = psEnc->state_Fxx[ 1 ].sCmn.frame_length - psEnc- >state_Fxx[ 1 ].sCmn.inputBufIx;
282 nSamplesToBuffer = silk_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 1 ].sCmn.fs_kHz );
283 for( n = 0; n < nSamplesFromInput; n++ ) {
284 buf[ n ] = samplesIn[ 2 * n + 1 ];
285 }
286 ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state,
287 &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn .inputBufIx + 2 ], buf, nSamplesFromInput );
288
289 psEnc->state_Fxx[ 1 ].sCmn.inputBufIx += nSamplesToBuffer;
290 } else if( encControl->nChannelsAPI == 2 && encControl->nChannelsInterna l == 1 ) {
291 /* Combine left and right channels before resampling */
292 for( n = 0; n < nSamplesFromInput; n++ ) {
293 sum = samplesIn[ 2 * n ] + samplesIn[ 2 * n + 1 ];
294 buf[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 );
295 }
296 ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
297 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn .inputBufIx + 2 ], buf, nSamplesFromInput );
298 /* On the first mono frame, average the results for the two resample r states */
299 if( psEnc->nPrevChannelsInternal == 2 && psEnc->state_Fxx[ 0 ].sCmn. nFramesEncoded == 0 ) {
300 ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_stat e,
301 &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].s Cmn.inputBufIx + 2 ], buf, nSamplesFromInput );
302 for( n = 0; n < psEnc->state_Fxx[ 0 ].sCmn.frame_length; n++ ) {
303 psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCm n.inputBufIx+n+2 ] =
304 silk_RSHIFT(psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc-> state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ]
305 + psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc-> state_Fxx[ 1 ].sCmn.inputBufIx+n+2 ], 1);
306 }
307 }
308 psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
309 } else {
310 silk_assert( encControl->nChannelsAPI == 1 && encControl->nChannelsI nternal == 1 );
311 silk_memcpy(buf, samplesIn, nSamplesFromInput*sizeof(opus_int16));
312 ret += silk_resampler( &psEnc->state_Fxx[ 0 ].sCmn.resampler_state,
313 &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn .inputBufIx + 2 ], buf, nSamplesFromInput );
314 psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer;
315 }
316
317 samplesIn += nSamplesFromInput * encControl->nChannelsAPI;
318 nSamplesIn -= nSamplesFromInput;
319
320 /* Default */
321 psEnc->allowBandwidthSwitch = 0;
322
323 /* Silk encoder */
324 if( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx >= psEnc->state_Fxx[ 0 ].sCmn. frame_length ) {
325 /* Enough data in input buffer, so encode */
326 silk_assert( psEnc->state_Fxx[ 0 ].sCmn.inputBufIx == psEnc->state_F xx[ 0 ].sCmn.frame_length );
327 silk_assert( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inputBufIx == psEnc->state_Fxx[ 1 ].sCmn.frame_length );
328
329 /* Deal with LBRR data */
330 if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) {
331 /* Create space at start of payload for VAD and FEC flags */
332 opus_uint8 iCDF[ 2 ] = { 0, 0 };
333 iCDF[ 0 ] = 256 - silk_RSHIFT( 256, ( psEnc->state_Fxx[ 0 ].sCmn .nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
334 ec_enc_icdf( psRangeEnc, 0, iCDF, 8 );
335
336 /* Encode any LBRR data from previous packet */
337 /* Encode LBRR flags */
338 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
339 LBRR_symbol = 0;
340 for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
341 LBRR_symbol |= silk_LSHIFT( psEnc->state_Fxx[ n ].sCmn.L BRR_flags[ i ], i );
342 }
343 psEnc->state_Fxx[ n ].sCmn.LBRR_flag = LBRR_symbol > 0 ? 1 : 0;
344 if( LBRR_symbol && psEnc->state_Fxx[ n ].sCmn.nFramesPerPack et > 1 ) {
345 ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, silk_LBRR_flag s_iCDF_ptr[ psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket - 2 ], 8 );
346 }
347 }
348
349 /* Code LBRR indices and excitation signals */
350 for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
351 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
352 if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) {
353 opus_int condCoding;
354
355 if( encControl->nChannelsInternal == 2 && n == 0 ) {
356 silk_stereo_encode_pred( psRangeEnc, psEnc->sSte reo.predIx[ i ] );
357 /* For LBRR data there's no need to code the mid -only flag if the side-channel LBRR flag is set */
358 if( psEnc->state_Fxx[ 1 ].sCmn.LBRR_flags[ i ] = = 0 ) {
359 silk_stereo_encode_mid_only( psRangeEnc, psE nc->sStereo.mid_only_flags[ i ] );
360 }
361 }
362 /* Use conditional coding if previous frame availabl e */
363 if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) {
364 condCoding = CODE_CONDITIONALLY;
365 } else {
366 condCoding = CODE_INDEPENDENTLY;
367 }
368 silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, ps RangeEnc, i, 1, condCoding );
369 silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].qu antOffsetType,
370 psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psE nc->state_Fxx[ n ].sCmn.frame_length );
371 }
372 }
373 }
374
375 /* Reset LBRR flags */
376 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
377 silk_memset( psEnc->state_Fxx[ n ].sCmn.LBRR_flags, 0, sizeo f( psEnc->state_Fxx[ n ].sCmn.LBRR_flags ) );
378 }
379
380 psEnc->nBitsUsedLBRR = ec_tell( psRangeEnc );
381 }
382
383 silk_HP_variable_cutoff( psEnc->state_Fxx );
384
385 /* Total target bits for packet */
386 nBits = silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->pa yloadSize_ms ), 1000 );
387 /* Subtract bits used for LBRR */
388 if( !prefillFlag ) {
389 nBits -= psEnc->nBitsUsedLBRR;
390 }
391 /* Divide by number of uncoded frames left in packet */
392 nBits = silk_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerP acket );
393 /* Convert to bits/second */
394 if( encControl->payloadSize_ms == 10 ) {
395 TargetRate_bps = silk_SMULBB( nBits, 100 );
396 } else {
397 TargetRate_bps = silk_SMULBB( nBits, 50 );
398 }
399 /* Subtract fraction of bits in excess of target in previous frames and packets */
400 TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 100 0 ), BITRESERVOIR_DECAY_TIME_MS );
401 if( !prefillFlag && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded > 0 ) {
402 /* Compare actual vs target bits so far in this packet */
403 opus_int32 bitsBalance = ec_tell( psRangeEnc ) - psEnc->nBitsUse dLBRR - nBits * psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded;
404 TargetRate_bps -= silk_DIV32_16( silk_MUL( bitsBalance, 1000 ), BITRESERVOIR_DECAY_TIME_MS );
405 }
406 /* Never exceed input bitrate */
407 TargetRate_bps = silk_LIMIT( TargetRate_bps, encControl->bitRate, 50 00 );
408
409 /* Convert Left/Right to Mid/Side */
410 if( encControl->nChannelsInternal == 2 ) {
411 silk_stereo_LR_to_MS( &psEnc->sStereo, &psEnc->state_Fxx[ 0 ].sC mn.inputBuf[ 2 ], &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ 2 ],
412 psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEnc oded ], &psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncode d ],
413 MStargetRates_bps, TargetRate_bps, psEnc->state_Fxx[ 0 ].sCm n.speech_activity_Q8, encControl->toMono,
414 psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCm n.frame_length );
415 if( psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nF ramesEncoded ] == 0 ) {
416 /* Reset side channel encoder memory for first frame with si de coding */
417 if( psEnc->prev_decode_only_middle == 1 ) {
418 silk_memset( &psEnc->state_Fxx[ 1 ].sShape, 0, sizeof( psEnc->state_Fxx[ 1 ].sShape ) );
419 silk_memset( &psEnc->state_Fxx[ 1 ].sPrefilt, 0, sizeof( psEnc->state_Fxx[ 1 ].sPrefilt ) );
420 silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sNSQ, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sNSQ ) );
421 silk_memset( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15, 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.prev_NLSFq_Q15 ) );
422 silk_memset( &psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State , 0, sizeof( psEnc->state_Fxx[ 1 ].sCmn.sLP.In_LP_State ) );
423 psEnc->state_Fxx[ 1 ].sCmn.prevLag = 100 ;
424 psEnc->state_Fxx[ 1 ].sCmn.sNSQ.lagPrev = 100 ;
425 psEnc->state_Fxx[ 1 ].sShape.LastGainIndex = 10;
426 psEnc->state_Fxx[ 1 ].sCmn.prevSignalType = TYP E_NO_VOICE_ACTIVITY;
427 psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_gain_Q16 = 655 36;
428 psEnc->state_Fxx[ 1 ].sCmn.first_frame_after_reset = 1;
429 }
430 silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 1 ] );
431 } else {
432 psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ]. sCmn.nFramesEncoded ] = 0;
433 }
434 if( !prefillFlag ) {
435 silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
436 if( psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) {
437 silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo. mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
438 }
439 }
440 } else {
441 /* Buffering */
442 silk_memcpy( psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->sStereo .sMid, 2 * sizeof( opus_int16 ) );
443 silk_memcpy( psEnc->sStereo.sMid, &psEnc->state_Fxx[ 0 ].sCmn.in putBuf[ psEnc->state_Fxx[ 0 ].sCmn.frame_length ], 2 * sizeof( opus_int16 ) );
444 }
445 silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ] );
446
447 /* Encode */
448 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
449 opus_int maxBits, useCBR;
450
451 /* Handling rate constraints */
452 maxBits = encControl->maxBits;
453 if( tot_blocks == 2 && curr_block == 0 ) {
454 maxBits = maxBits * 3 / 5;
455 } else if( tot_blocks == 3 ) {
456 if( curr_block == 0 ) {
457 maxBits = maxBits * 2 / 5;
458 } else if( curr_block == 1 ) {
459 maxBits = maxBits * 3 / 4;
460 }
461 }
462 useCBR = encControl->useCBR && curr_block == tot_blocks - 1;
463
464 if( encControl->nChannelsInternal == 1 ) {
465 channelRate_bps = TargetRate_bps;
466 } else {
467 channelRate_bps = MStargetRates_bps[ n ];
468 if( n == 0 && MStargetRates_bps[ 1 ] > 0 ) {
469 useCBR = 0;
470 /* Give mid up to 1/2 of the max bits for that frame */
471 maxBits -= encControl->maxBits / ( tot_blocks * 2 );
472 }
473 }
474
475 if( channelRate_bps > 0 ) {
476 opus_int condCoding;
477
478 silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_b ps );
479
480 /* Use independent coding if no previous frame available */
481 if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) {
482 condCoding = CODE_INDEPENDENTLY;
483 } else if( n > 0 && psEnc->prev_decode_only_middle ) {
484 /* If we skipped a side frame in this packet, we don't
485 need LTP scaling; the LTP state is well-defined. */
486 condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
487 } else {
488 condCoding = CODE_CONDITIONALLY;
489 }
490 if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], n BytesOut, psRangeEnc, condCoding, maxBits, useCBR ) ) != 0 ) {
491 silk_assert( 0 );
492 }
493 }
494 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
495 psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0;
496 psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++;
497 }
498 psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEn c->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ];
499
500 /* Insert VAD and FEC flags at beginning of bitstream */
501 if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == p sEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) {
502 flags = 0;
503 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
504 for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) {
505 flags = silk_LSHIFT( flags, 1 );
506 flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ];
507 }
508 flags = silk_LSHIFT( flags, 1 );
509 flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag;
510 }
511 if( !prefillFlag ) {
512 ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state _Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
513 }
514
515 /* Return zero bytes if all channels DTXed */
516 if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannelsI nternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) {
517 *nBytesOut = 0;
518 }
519
520 psEnc->nBitsExceeded += *nBytesOut * 8;
521 psEnc->nBitsExceeded -= silk_DIV32_16( silk_MUL( encControl->bit Rate, encControl->payloadSize_ms ), 1000 );
522 psEnc->nBitsExceeded = silk_LIMIT( psEnc->nBitsExceeded, 0, 100 00 );
523
524 /* Update flag indicating if bandwidth switching is allowed */
525 speech_act_thr_for_switch_Q8 = silk_SMLAWB( SILK_FIX_CONST( SPEE CH_ACTIVITY_DTX_THRES, 8 ),
526 SILK_FIX_CONST( ( 1 - SPEECH_ACTIVITY_DTX_THRES ) / MAX_BAND WIDTH_SWITCH_DELAY_MS, 16 + 8 ), psEnc->timeSinceSwitchAllowed_ms );
527 if( psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8 < speech_act_t hr_for_switch_Q8 ) {
528 psEnc->allowBandwidthSwitch = 1;
529 psEnc->timeSinceSwitchAllowed_ms = 0;
530 } else {
531 psEnc->allowBandwidthSwitch = 0;
532 psEnc->timeSinceSwitchAllowed_ms += encControl->payloadSize_ ms;
533 }
534 }
535
536 if( nSamplesIn == 0 ) {
537 break;
538 }
539 } else {
540 break;
541 }
542 curr_block++;
543 }
544
545 psEnc->nPrevChannelsInternal = encControl->nChannelsInternal;
546
547 encControl->allowBandwidthSwitch = psEnc->allowBandwidthSwitch;
548 encControl->inWBmodeWithoutVariableLP = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == 16 && psEnc->state_Fxx[ 0 ].sCmn.sLP.mode == 0;
549 encControl->internalSampleRate = silk_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_ kHz, 1000 );
550 encControl->stereoWidth_Q14 = encControl->toMono ? 0 : psEnc->sStereo.smth_w idth_Q14;
551 if( prefillFlag ) {
552 encControl->payloadSize_ms = tmp_payloadSize_ms;
553 encControl->complexity = tmp_complexity;
554 for( n = 0; n < encControl->nChannelsInternal; n++ ) {
555 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
556 psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0;
557 }
558 }
559
560 RESTORE_STACK;
561 return ret;
562 }
563
OLDNEW
« no previous file with comments | « third_party/opus/src/silk/define.h ('k') | third_party/opus/src/silk/encode_indices.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698