Update SILK code using the CELT range coder
[opus.git] / src_common / SKP_Silk_decode_frame.c
similarity index 79%
rename from src/SKP_Silk_decode_frame.c
rename to src_common/SKP_Silk_decode_frame.c
index 279179b..c3a5339 100644 (file)
@@ -43,9 +43,11 @@ SKP_int SKP_Silk_decode_frame(
 )\r
 {\r
     SKP_Silk_decoder_control sDecCtrl;\r
-    SKP_int         L, fs_Khz_old, LPC_order_old, ret = 0;\r
+    SKP_int         L, fs_Khz_old, nb_subfr_old, mv_len, ret = 0;\r
     SKP_int         Pulses[ MAX_FRAME_LENGTH ];\r
+    ec_byte_buffer range_dec_celt_buf;\r
 \r
+TIC(decode_frame)\r
 \r
     L = psDec->frame_length;\r
     sDecCtrl.LTP_scale_Q14 = 0;\r
@@ -62,45 +64,43 @@ SKP_int SKP_Silk_decode_frame(
         /* Initialize arithmetic coder              */\r
         /********************************************/\r
         fs_Khz_old    = psDec->fs_kHz;\r
-        LPC_order_old = psDec->LPC_order;\r
+        nb_subfr_old  = psDec->nb_subfr;\r
         if( psDec->nFramesDecoded == 0 ) {\r
             /* Initialize range decoder state */\r
-            SKP_Silk_range_dec_init( &psDec->sRC, pCode, nBytes );\r
-        \r
-            if( psDec->bitstream_v == BIT_STREAM_V4 ) {\r
-                SKP_Silk_decode_indices_v4( psDec );\r
+            /* check input */\r
+            psDec->sRC.error = 0;\r
+            if( nBytes > MAX_ARITHM_BYTES ) {\r
+                psDec->sRC.error = RANGE_CODER_DEC_PAYLOAD_TOO_LONG;\r
             }\r
+            ec_byte_writeinit_buffer( &range_dec_celt_buf, psDec->sRC.buffer, nBytes );\r
+            SKP_memcpy( psDec->sRC.buffer, pCode, nBytes * sizeof( SKP_uint8 ) );\r
+            ec_dec_init( &psDec->sRC.range_dec_celt_state, &range_dec_celt_buf );\r
+\r
+            SKP_Silk_decode_indices_v4( psDec );\r
         }\r
 \r
         /********************************************/\r
         /* Decode parameters and pulse signal       */\r
         /********************************************/\r
-        if( psDec->bitstream_v == BIT_STREAM_V4 ) {\r
-            SKP_Silk_decode_parameters_v4( psDec, &sDecCtrl, Pulses, 1 );\r
-        } else {\r
-            SKP_Silk_decode_parameters( psDec, &sDecCtrl, Pulses, 1 );\r
-        }\r
-\r
+TIC(decode_params)\r
+        SKP_Silk_decode_parameters_v4( psDec, &sDecCtrl, Pulses, 1 );\r
+TOC(decode_params)\r
 \r
         if( psDec->sRC.error ) {\r
             psDec->nBytesLeft = 0;\r
 \r
             action              = 1; /* PLC operation */\r
-            psDec->fs_kHz       = fs_Khz_old;    /* revert fs if changed in decode_parameters */\r
-            psDec->LPC_order    = LPC_order_old; /* revert lpc_order if changed in decode_parameters */\r
-            psDec->frame_length = fs_Khz_old * FRAME_LENGTH_MS;\r
-            psDec->subfr_length = fs_Khz_old * FRAME_LENGTH_MS / NB_SUBFR;\r
+            SKP_Silk_decoder_set_fs( psDec, fs_Khz_old, nb_subfr_old );\r
 \r
             /* Avoid crashing */\r
-            *decBytes = psDec->sRC.bufferLength;\r
-\r
+            *decBytes = psDec->sRC.range_dec_celt_state.buf->storage; \r
             if( psDec->sRC.error == RANGE_CODER_DEC_PAYLOAD_TOO_LONG ) {\r
                 ret = SKP_SILK_DEC_PAYLOAD_TOO_LARGE;\r
             } else {\r
                 ret = SKP_SILK_DEC_PAYLOAD_ERROR;\r
             }\r
         } else {\r
-            *decBytes = psDec->sRC.bufferLength - psDec->nBytesLeft;\r
+            *decBytes = psDec->sRC.range_dec_celt_state.buf->storage - psDec->nBytesLeft;\r
             psDec->nFramesDecoded++;\r
         \r
             /* Update lengths. Sampling frequency could have changed */\r
@@ -109,7 +109,9 @@ SKP_int SKP_Silk_decode_frame(
             /********************************************************/\r
             /* Run inverse NSQ                                      */\r
             /********************************************************/\r
+TIC(decode_core)\r
             SKP_Silk_decode_core( psDec, &sDecCtrl, pOut, Pulses );\r
+TOC(decode_core)\r
 \r
             /********************************************************/\r
             /* Update PLC state                                     */\r
@@ -124,19 +126,23 @@ SKP_int SKP_Silk_decode_frame(
         }\r
     }\r
     /*************************************************************/\r
-    /* Generate Concealment Frame if packet is lost, or corrupt  */\r
+    /* Generate Concealment frame if packet is lost, or corrupt  */\r
     /*************************************************************/\r
     if( action == 1 ) {\r
         /* Handle packet loss by extrapolation */\r
         SKP_Silk_PLC( psDec, &sDecCtrl, pOut, L, action );\r
         psDec->lossCnt++;\r
-    \r
     }\r
 \r
     /*************************/\r
     /* Update output buffer. */\r
     /*************************/\r
-    SKP_memcpy( psDec->outBuf, pOut, L * sizeof( SKP_int16 ) );\r
+    SKP_assert( psDec->ltp_mem_length >= psDec->frame_length );\r
+    mv_len = psDec->ltp_mem_length - psDec->frame_length;\r
+    SKP_memmove( psDec->outBuf, &psDec->outBuf[ psDec->ltp_mem_length - mv_len ], \r
+        mv_len * sizeof(SKP_int16) );\r
+    SKP_memcpy( &psDec->outBuf[ mv_len ], pOut, \r
+        psDec->frame_length * sizeof( SKP_int16 ) );\r
 \r
     /****************************************************************/\r
     /* Ensure smooth connection of extrapolated and good frames     */\r
@@ -153,7 +159,9 @@ SKP_int SKP_Silk_decode_frame(
     /********************************************/\r
     SKP_assert( ( ( psDec->fs_kHz == 12 ) && ( L % 3 ) == 0 ) || \r
                 ( ( psDec->fs_kHz != 12 ) && ( L % 2 ) == 0 ) );\r
+TIC(HP_out)\r
     SKP_Silk_biquad( pOut, psDec->HP_B, psDec->HP_A, psDec->HPState, pOut, L );\r
+TOC(HP_out)\r
 \r
     /********************************************/\r
     /* set output frame length                    */\r
@@ -161,7 +169,8 @@ SKP_int SKP_Silk_decode_frame(
     *pN = ( SKP_int16 )L;\r
 \r
     /* Update some decoder state variables */\r
-    psDec->lagPrev = sDecCtrl.pitchL[ NB_SUBFR - 1 ];\r
+    psDec->lagPrev = sDecCtrl.pitchL[ MAX_NB_SUBFR - 1 ];\r
+TOC(decode_frame)\r
 \r
     return ret;\r
 }\r