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

Side by Side Diff: silk/dec_API.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 | « silk/control_codec.c ('k') | silk/decode_core.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 /*********************************************************************** 1 /***********************************************************************
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3 Redistribution and use in source and binary forms, with or without 3 Redistribution and use in source and binary forms, with or without
4 modification, are permitted provided that the following conditions 4 modification, are permitted provided that the following conditions
5 are met: 5 are met:
6 - Redistributions of source code must retain the above copyright notice, 6 - Redistributions of source code must retain the above copyright notice,
7 this list of conditions and the following disclaimer. 7 this list of conditions and the following disclaimer.
8 - Redistributions in binary form must reproduce the above copyright 8 - Redistributions in binary form must reproduce the above copyright
9 notice, this list of conditions and the following disclaimer in the 9 notice, this list of conditions and the following disclaimer in the
10 documentation and/or other materials provided with the distribution. 10 documentation and/or other materials provided with the distribution.
(...skipping 12 matching lines...) Expand all
23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 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 24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 POSSIBILITY OF SUCH DAMAGE. 25 POSSIBILITY OF SUCH DAMAGE.
26 ***********************************************************************/ 26 ***********************************************************************/
27 27
28 #ifdef HAVE_CONFIG_H 28 #ifdef HAVE_CONFIG_H
29 #include "config.h" 29 #include "config.h"
30 #endif 30 #endif
31 #include "API.h" 31 #include "API.h"
32 #include "main.h" 32 #include "main.h"
33 #include "stack_alloc.h"
33 34
34 /************************/ 35 /************************/
35 /* Decoder Super Struct */ 36 /* Decoder Super Struct */
36 /************************/ 37 /************************/
37 typedef struct { 38 typedef struct {
38 silk_decoder_state channel_state[ DECODER_NUM_CHANNELS ]; 39 silk_decoder_state channel_state[ DECODER_NUM_CHANNELS ];
39 stereo_dec_state sStereo; 40 stereo_dec_state sStereo;
40 opus_int nChannelsAPI; 41 opus_int nChannelsAPI;
41 opus_int nChannelsInternal; 42 opus_int nChannelsInternal;
42 opus_int prev_decode_only_middle; 43 opus_int prev_decode_only_middle;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 silk_DecControlStruct* decControl, /* I/O Control Structur e */ 79 silk_DecControlStruct* decControl, /* I/O Control Structur e */
79 opus_int lostFlag, /* I 0: no loss, 1 lo ss, 2 decode fec */ 80 opus_int lostFlag, /* I 0: no loss, 1 lo ss, 2 decode fec */
80 opus_int newPacketFlag, /* I Indicates first decoder call for this packet */ 81 opus_int newPacketFlag, /* I Indicates first decoder call for this packet */
81 ec_dec *psRangeDec, /* I/O Compressor data structure */ 82 ec_dec *psRangeDec, /* I/O Compressor data structure */
82 opus_int16 *samplesOut, /* O Decoded output s peech vector */ 83 opus_int16 *samplesOut, /* O Decoded output s peech vector */
83 opus_int32 *nSamplesOut /* O Number of sample s decoded */ 84 opus_int32 *nSamplesOut /* O Number of sample s decoded */
84 ) 85 )
85 { 86 {
86 opus_int i, n, decode_only_middle = 0, ret = SILK_NO_ERROR; 87 opus_int i, n, decode_only_middle = 0, ret = SILK_NO_ERROR;
87 opus_int32 nSamplesOutDec, LBRR_symbol; 88 opus_int32 nSamplesOutDec, LBRR_symbol;
88 opus_int16 samplesOut1_tmp[ 2 ][ MAX_FS_KHZ * MAX_FRAME_LENGTH_MS + 2 ]; 89 opus_int16 *samplesOut1_tmp[ 2 ];
89 opus_int16 samplesOut2_tmp[ MAX_API_FS_KHZ * MAX_FRAME_LENGTH_MS ]; 90 VARDECL( opus_int16, samplesOut1_tmp_storage );
91 VARDECL( opus_int16, samplesOut2_tmp );
90 opus_int32 MS_pred_Q13[ 2 ] = { 0 }; 92 opus_int32 MS_pred_Q13[ 2 ] = { 0 };
91 opus_int16 *resample_out_ptr; 93 opus_int16 *resample_out_ptr;
92 silk_decoder *psDec = ( silk_decoder * )decState; 94 silk_decoder *psDec = ( silk_decoder * )decState;
93 silk_decoder_state *channel_state = psDec->channel_state; 95 silk_decoder_state *channel_state = psDec->channel_state;
94 opus_int has_side; 96 opus_int has_side;
95 opus_int stereo_to_mono; 97 opus_int stereo_to_mono;
98 SAVE_STACK;
96 99
97 /**********************************/ 100 /**********************************/
98 /* Test if first frame in payload */ 101 /* Test if first frame in payload */
99 /**********************************/ 102 /**********************************/
100 if( newPacketFlag ) { 103 if( newPacketFlag ) {
101 for( n = 0; n < decControl->nChannelsInternal; n++ ) { 104 for( n = 0; n < decControl->nChannelsInternal; n++ ) {
102 channel_state[ n ].nFramesDecoded = 0; /* Used to count frames in p acket */ 105 channel_state[ n ].nFramesDecoded = 0; /* Used to count frames in p acket */
103 } 106 }
104 } 107 }
105 108
(...skipping 19 matching lines...) Expand all
125 channel_state[ n ].nFramesPerPacket = 1; 128 channel_state[ n ].nFramesPerPacket = 1;
126 channel_state[ n ].nb_subfr = 4; 129 channel_state[ n ].nb_subfr = 4;
127 } else if( decControl->payloadSize_ms == 40 ) { 130 } else if( decControl->payloadSize_ms == 40 ) {
128 channel_state[ n ].nFramesPerPacket = 2; 131 channel_state[ n ].nFramesPerPacket = 2;
129 channel_state[ n ].nb_subfr = 4; 132 channel_state[ n ].nb_subfr = 4;
130 } else if( decControl->payloadSize_ms == 60 ) { 133 } else if( decControl->payloadSize_ms == 60 ) {
131 channel_state[ n ].nFramesPerPacket = 3; 134 channel_state[ n ].nFramesPerPacket = 3;
132 channel_state[ n ].nb_subfr = 4; 135 channel_state[ n ].nb_subfr = 4;
133 } else { 136 } else {
134 silk_assert( 0 ); 137 silk_assert( 0 );
138 RESTORE_STACK;
135 return SILK_DEC_INVALID_FRAME_SIZE; 139 return SILK_DEC_INVALID_FRAME_SIZE;
136 } 140 }
137 fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1; 141 fs_kHz_dec = ( decControl->internalSampleRate >> 10 ) + 1;
138 if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) { 142 if( fs_kHz_dec != 8 && fs_kHz_dec != 12 && fs_kHz_dec != 16 ) {
139 silk_assert( 0 ); 143 silk_assert( 0 );
144 RESTORE_STACK;
140 return SILK_DEC_INVALID_SAMPLING_FREQUENCY; 145 return SILK_DEC_INVALID_SAMPLING_FREQUENCY;
141 } 146 }
142 ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decCont rol->API_sampleRate ); 147 ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decCont rol->API_sampleRate );
143 } 148 }
144 } 149 }
145 150
146 if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) { 151 if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) {
147 silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pre d_prev_Q13 ) ); 152 silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pre d_prev_Q13 ) );
148 silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) ); 153 silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) );
149 silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].re sampler_state, sizeof( silk_resampler_state_struct ) ); 154 silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].re sampler_state, sizeof( silk_resampler_state_struct ) );
150 } 155 }
151 psDec->nChannelsAPI = decControl->nChannelsAPI; 156 psDec->nChannelsAPI = decControl->nChannelsAPI;
152 psDec->nChannelsInternal = decControl->nChannelsInternal; 157 psDec->nChannelsInternal = decControl->nChannelsInternal;
153 158
154 if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decCon trol->API_sampleRate < 8000 ) { 159 if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decCon trol->API_sampleRate < 8000 ) {
155 ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY; 160 ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY;
161 RESTORE_STACK;
156 return( ret ); 162 return( ret );
157 } 163 }
158 164
159 if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) { 165 if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) {
160 /* First decoder call for this payload */ 166 /* First decoder call for this payload */
161 /* Decode VAD flags and LBRR flag */ 167 /* Decode VAD flags and LBRR flag */
162 for( n = 0; n < decControl->nChannelsInternal; n++ ) { 168 for( n = 0; n < decControl->nChannelsInternal; n++ ) {
163 for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { 169 for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) {
164 channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1); 170 channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1);
165 } 171 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 /* Reset side channel decoder prediction memory for first frame with side co ding */ 239 /* Reset side channel decoder prediction memory for first frame with side co ding */
234 if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec-> prev_decode_only_middle == 1 ) { 240 if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec-> prev_decode_only_middle == 1 ) {
235 silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_ state[ 1 ].outBuf) ); 241 silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_ state[ 1 ].outBuf) );
236 silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->ch annel_state[ 1 ].sLPC_Q14_buf) ); 242 silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->ch annel_state[ 1 ].sLPC_Q14_buf) );
237 psDec->channel_state[ 1 ].lagPrev = 100; 243 psDec->channel_state[ 1 ].lagPrev = 100;
238 psDec->channel_state[ 1 ].LastGainIndex = 10; 244 psDec->channel_state[ 1 ].LastGainIndex = 10;
239 psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY; 245 psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY;
240 psDec->channel_state[ 1 ].first_frame_after_reset = 1; 246 psDec->channel_state[ 1 ].first_frame_after_reset = 1;
241 } 247 }
242 248
249 ALLOC( samplesOut1_tmp_storage,
250 decControl->nChannelsInternal*(
251 channel_state[ 0 ].frame_length + 2 ),
252 opus_int16 );
253 samplesOut1_tmp[ 0 ] = samplesOut1_tmp_storage;
254 samplesOut1_tmp[ 1 ] = samplesOut1_tmp_storage
255 + channel_state[ 0 ].frame_length + 2;
256
243 if( lostFlag == FLAG_DECODE_NORMAL ) { 257 if( lostFlag == FLAG_DECODE_NORMAL ) {
244 has_side = !decode_only_middle; 258 has_side = !decode_only_middle;
245 } else { 259 } else {
246 has_side = !psDec->prev_decode_only_middle 260 has_side = !psDec->prev_decode_only_middle
247 || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_ LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 ); 261 || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_ LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 );
248 } 262 }
249 /* Call decoder for one frame */ 263 /* Call decoder for one frame */
250 for( n = 0; n < decControl->nChannelsInternal; n++ ) { 264 for( n = 0; n < decControl->nChannelsInternal; n++ ) {
251 if( n == 0 || has_side ) { 265 if( n == 0 || has_side ) {
252 opus_int FrameIndex; 266 opus_int FrameIndex;
(...skipping 25 matching lines...) Expand all
278 } else { 292 } else {
279 /* Buffering */ 293 /* Buffering */
280 silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus _int16 ) ); 294 silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus _int16 ) );
281 silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) ); 295 silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) );
282 } 296 }
283 297
284 /* Number of output samples */ 298 /* Number of output samples */
285 *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk _SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) ); 299 *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk _SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) );
286 300
287 /* Set up pointers to temp buffers */ 301 /* Set up pointers to temp buffers */
302 ALLOC( samplesOut2_tmp,
303 decControl->nChannelsAPI == 2 ? *nSamplesOut : 0, opus_int16 );
288 if( decControl->nChannelsAPI == 2 ) { 304 if( decControl->nChannelsAPI == 2 ) {
289 resample_out_ptr = samplesOut2_tmp; 305 resample_out_ptr = samplesOut2_tmp;
290 } else { 306 } else {
291 resample_out_ptr = samplesOut; 307 resample_out_ptr = samplesOut;
292 } 308 }
293 309
294 for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInt ernal ); n++ ) { 310 for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInt ernal ); n++ ) {
295 311
296 /* Resample decoded signal to API_sampleRate */ 312 /* Resample decoded signal to API_sampleRate */
297 ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out _ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec ); 313 ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out _ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec );
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 } 346 }
331 347
332 if( lostFlag == FLAG_PACKET_LOST ) { 348 if( lostFlag == FLAG_PACKET_LOST ) {
333 /* On packet loss, remove the gain clamping to prevent having the energy "bounce back" 349 /* On packet loss, remove the gain clamping to prevent having the energy "bounce back"
334 if we lose packets when the energy is going down */ 350 if we lose packets when the energy is going down */
335 for ( i = 0; i < psDec->nChannelsInternal; i++ ) 351 for ( i = 0; i < psDec->nChannelsInternal; i++ )
336 psDec->channel_state[ i ].LastGainIndex = 10; 352 psDec->channel_state[ i ].LastGainIndex = 10;
337 } else { 353 } else {
338 psDec->prev_decode_only_middle = decode_only_middle; 354 psDec->prev_decode_only_middle = decode_only_middle;
339 } 355 }
356 RESTORE_STACK;
340 return ret; 357 return ret;
341 } 358 }
342 359
343 #if 0 360 #if 0
344 /* Getting table of contents for a packet */ 361 /* Getting table of contents for a packet */
345 opus_int silk_get_TOC( 362 opus_int silk_get_TOC(
346 const opus_uint8 *payload, /* I Payload data */ 363 const opus_uint8 *payload, /* I Payload data */
347 const opus_int nBytesIn, /* I Number of input bytes */ 364 const opus_int nBytesIn, /* I Number of input bytes */
348 const opus_int nFramesPerPayload, /* I Number of SILK f rames per payload */ 365 const opus_int nFramesPerPayload, /* I Number of SILK f rames per payload */
349 silk_TOC_struct *Silk_TOC /* O Type of content */ 366 silk_TOC_struct *Silk_TOC /* O Type of content */
(...skipping 16 matching lines...) Expand all
366 Silk_TOC->inbandFECFlag = flags & 1; 383 Silk_TOC->inbandFECFlag = flags & 1;
367 for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) { 384 for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) {
368 flags = silk_RSHIFT( flags, 1 ); 385 flags = silk_RSHIFT( flags, 1 );
369 Silk_TOC->VADFlags[ i ] = flags & 1; 386 Silk_TOC->VADFlags[ i ] = flags & 1;
370 Silk_TOC->VADFlag |= flags & 1; 387 Silk_TOC->VADFlag |= flags & 1;
371 } 388 }
372 389
373 return ret; 390 return ret;
374 } 391 }
375 #endif 392 #endif
OLDNEW
« no previous file with comments | « silk/control_codec.c ('k') | silk/decode_core.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698