Update SILK code using the CELT range coder
[opus.git] / src_common / SKP_Silk_PLC.c
similarity index 86%
rename from src/SKP_Silk_PLC.c
rename to src_common/SKP_Silk_PLC.c
index 746ae10..0129d83 100644 (file)
@@ -59,6 +59,8 @@ void SKP_Silk_PLC(
         /* Generate Signal          */\r
         /****************************/\r
         SKP_Silk_PLC_conceal( psDec, psDecCtrl, signal, length );\r
+\r
+        psDec->lossCnt++;\r
     } else {\r
         /****************************/\r
         /* Update state             */\r
@@ -88,18 +90,21 @@ void SKP_Silk_PLC_update(
     LTP_Gain_Q14 = 0;\r
     if( psDecCtrl->sigtype == SIG_TYPE_VOICED ) {\r
         /* Find the parameters for the last subframe which contains a pitch pulse */\r
-        for( j = 0; j * psDec->subfr_length  < psDecCtrl->pitchL[ NB_SUBFR - 1 ]; j++ ) {\r
+        for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; j++ ) {\r
+            if( j == psDec->nb_subfr ){\r
+                break;\r
+            }\r
             temp_LTP_Gain_Q14 = 0;\r
             for( i = 0; i < LTP_ORDER; i++ ) {\r
-                temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( NB_SUBFR - 1 - j ) * LTP_ORDER  + i ];\r
+                temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( psDec->nb_subfr - 1 - j ) * LTP_ORDER  + i ];\r
             }\r
             if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) {\r
                 LTP_Gain_Q14 = temp_LTP_Gain_Q14;\r
                 SKP_memcpy( psPLC->LTPCoef_Q14,\r
-                    &psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( NB_SUBFR - 1 - j, LTP_ORDER ) ],\r
+                    &psDecCtrl->LTPCoef_Q14[ SKP_SMULBB( psDec->nb_subfr - 1 - j, LTP_ORDER ) ],\r
                     LTP_ORDER * sizeof( SKP_int16 ) );\r
 \r
-                psPLC->pitchL_Q8 = SKP_LSHIFT( psDecCtrl->pitchL[ NB_SUBFR - 1 - j ], 8 );\r
+                psPLC->pitchL_Q8 = SKP_LSHIFT( psDecCtrl->pitchL[ psDec->nb_subfr - 1 - j ], 8 );\r
             }\r
         }\r
 \r
@@ -138,7 +143,7 @@ void SKP_Silk_PLC_update(
     psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14;\r
 \r
     /* Save Gains */\r
-    SKP_memcpy( psPLC->prevGain_Q16, psDecCtrl->Gains_Q16, NB_SUBFR * sizeof( SKP_int32 ) );\r
+    SKP_memcpy( psPLC->prevGain_Q16, psDecCtrl->Gains_Q16, psDec->nb_subfr * sizeof( SKP_int32 ) );\r
 }\r
 \r
 void SKP_Silk_PLC_conceal(\r
@@ -153,14 +158,13 @@ void SKP_Silk_PLC_conceal(
     SKP_int16 rand_scale_Q14, A_Q12_tmp[ MAX_LPC_ORDER ];\r
     SKP_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15;\r
     SKP_int   lag, idx, shift1, shift2;\r
-    SKP_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr, Atmp;\r
+    SKP_int32 energy1, energy2, *rand_ptr, *pred_lag_ptr;\r
     SKP_int32 sig_Q10[ MAX_FRAME_LENGTH ], *sig_Q10_ptr, LPC_exc_Q10, LPC_pred_Q10,  LTP_pred_Q14;\r
     SKP_Silk_PLC_struct *psPLC;\r
-\r
     psPLC = &psDec->sPLC;\r
 \r
     /* Update LTP buffer */\r
-    SKP_memcpy( psDec->sLTP_Q16, &psDec->sLTP_Q16[ psDec->frame_length ], psDec->frame_length * sizeof( SKP_int32 ) );\r
+    SKP_memmove( psDec->sLTP_Q16, &psDec->sLTP_Q16[ psDec->frame_length ], psDec->ltp_mem_length * sizeof( SKP_int32 ) );\r
 \r
     /* LPC concealment. Apply BWE to previous LPC */\r
     SKP_Silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, BWE_COEF_Q16 );\r
@@ -168,7 +172,7 @@ void SKP_Silk_PLC_conceal(
     /* Find random noise component */\r
     /* Scale previous excitation signal */\r
     exc_buf_ptr = exc_buf;\r
-    for( k = ( NB_SUBFR >> 1 ); k < NB_SUBFR; k++ ) {\r
+    for( k = ( psDec->nb_subfr >> 1 ); k < psDec->nb_subfr; k++ ) {\r
         for( i = 0; i < psDec->subfr_length; i++ ) {\r
             exc_buf_ptr[ i ] = ( SKP_int16 )SKP_RSHIFT( \r
                 SKP_SMULWW( psDec->exc_Q10[ i + k * psDec->subfr_length ], psPLC->prevGain_Q16[ k ] ), 10 );\r
@@ -228,13 +232,13 @@ void SKP_Silk_PLC_conceal(
 \r
     rand_seed           = psPLC->rand_seed;\r
     lag                 = SKP_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 );\r
-    psDec->sLTP_buf_idx = psDec->frame_length;\r
+    psDec->sLTP_buf_idx = psDec->ltp_mem_length;\r
 \r
     /***************************/\r
     /* LTP synthesis filtering */\r
     /***************************/\r
     sig_Q10_ptr = sig_Q10;\r
-    for( k = 0; k < NB_SUBFR; k++ ) {\r
+    for( k = 0; k < psDec->nb_subfr; k++ ) {\r
         /* Setup pointer */\r
         pred_lag_ptr = &psDec->sLTP_Q16[ psDec->sLTP_buf_idx - lag + LTP_ORDER / 2 ];\r
         for( i = 0; i < psDec->subfr_length; i++ ) {\r
@@ -281,28 +285,22 @@ void SKP_Silk_PLC_conceal(
     /* Preload LPC coeficients to array on stack. Gives small performance gain */\r
     SKP_memcpy( A_Q12_tmp, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( SKP_int16 ) );\r
     SKP_assert( psDec->LPC_order >= 10 ); /* check that unrolling works */\r
-    for( k = 0; k < NB_SUBFR; k++ ) {\r
+    for( k = 0; k < psDec->nb_subfr; k++ ) {\r
         for( i = 0; i < psDec->subfr_length; i++ ){\r
-            /* unrolled */\r
-            Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 0 ] );    /* read two coefficients at once */\r
-            LPC_pred_Q10 = SKP_SMULWB(               psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  1 ], Atmp );\r
-            LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  2 ], Atmp );\r
-            Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 2 ] );\r
-            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  3 ], Atmp );\r
-            LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  4 ], Atmp );\r
-            Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 4 ] );\r
-            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  5 ], Atmp );\r
-            LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  6 ], Atmp );\r
-            Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 6 ] );\r
-            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  7 ], Atmp );\r
-            LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  8 ], Atmp );\r
-            Atmp = *( ( SKP_int32* )&A_Q12_tmp[ 8 ] );\r
-            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  9 ], Atmp );\r
-            LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], Atmp );\r
-            for( j = 10 ; j < psDec->LPC_order ; j+=2 ) {\r
-                Atmp = *( ( SKP_int32* )&A_Q12_tmp[ j ] );\r
-                LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  1 - j ], Atmp );\r
-                LPC_pred_Q10 = SKP_SMLAWT( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  2 - j ], Atmp );\r
+            /* partly unrolled */\r
+            LPC_pred_Q10 = SKP_SMULWB(               psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  1 ], A_Q12_tmp[ 0 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  2 ], A_Q12_tmp[ 1 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  3 ], A_Q12_tmp[ 2 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  4 ], A_Q12_tmp[ 3 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  5 ], A_Q12_tmp[ 4 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  6 ], A_Q12_tmp[ 5 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  7 ], A_Q12_tmp[ 6 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  8 ], A_Q12_tmp[ 7 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i -  9 ], A_Q12_tmp[ 8 ] );\r
+            LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] );\r
+\r
+            for( j = 10; j < psDec->LPC_order; j++ ) {\r
+                LPC_pred_Q10 = SKP_SMLAWB( LPC_pred_Q10, psDec->sLPC_Q14[ MAX_LPC_ORDER + i - j - 1 ], A_Q12_tmp[ j ] );\r
             }\r
 \r
             /* Add prediction to LPC residual */\r
@@ -318,7 +316,7 @@ void SKP_Silk_PLC_conceal(
 \r
     /* Scale with Gain */\r
     for( i = 0; i < psDec->frame_length; i++ ) {\r
-        signal[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( sig_Q10[ i ], psPLC->prevGain_Q16[ NB_SUBFR - 1 ] ), 10 ) );\r
+        signal[ i ] = ( SKP_int16 )SKP_SAT16( SKP_RSHIFT_ROUND( SKP_SMULWW( sig_Q10[ i ], psPLC->prevGain_Q16[ psDec->nb_subfr - 1 ] ), 10 ) );\r
     }\r
 \r
     /**************************************/\r
@@ -326,7 +324,7 @@ void SKP_Silk_PLC_conceal(
     /**************************************/\r
     psPLC->rand_seed     = rand_seed;\r
     psPLC->randScale_Q14 = rand_scale_Q14;\r
-    for( i = 0; i < NB_SUBFR; i++ ) {\r
+    for( i = 0; i < MAX_NB_SUBFR; i++ ) {\r
         psDecCtrl->pitchL[ i ] = lag;\r
     }\r
 }\r