Update SILK code using the CELT range coder
[opus.git] / src_common / SKP_Silk_encode_pulses.c
similarity index 81%
rename from src/SKP_Silk_encode_pulses.c
rename to src_common/SKP_Silk_encode_pulses.c
index d649003..8292337 100644 (file)
@@ -27,6 +27,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 #include "SKP_Silk_main.h"\r
 \r
+/* Tables generated with pyramid_combinations_generalized_tree.m  */\r
+/* Pyramid L1 norm */\r
+static const float PVQ_W_SIGNS_BITS[ 32 ] = \r
+{\r
+     0.0000f,  5.0000f,  9.0000f, 12.4179f, 15.4263f, 18.1210f, 20.5637f, 22.7972f,\r
+    24.8536f, 26.7576f, 28.5290f, 30.1838f, 31.7353f, 33.1949f, 34.5719f, 35.8747f,\r
+    37.1102f, 38.2847f, 39.4034f, 40.4712f, 41.4922f, 42.4702f, 43.4083f, 44.3097f,\r
+    45.1769f, 46.0123f, 46.8181f, 47.5961f, 48.3483f, 49.0762f, 49.7813f, 50.4648f\r
+};\r
+\r
+static const float PVQ_WO_SIGNS_BITS[ 32 ] = \r
+{\r
+     0.0000f,  4.0000f,  7.0875f,  9.6724f, 11.9204f, 13.9204f, 15.7277f, 17.3798f, \r
+    18.9033f, 20.3184f, 21.6403f, 22.8813f, 24.0512f, 25.1582f, 26.2088f, 27.2088f, \r
+    28.1630f, 29.0755f, 29.9500f, 30.7895f, 31.5969f, 32.3745f, 33.1245f, 33.8489f, \r
+    34.5493f, 35.2274f, 35.8845f, 36.5219f, 37.1408f, 37.7423f, 38.3273f, 38.8966f\r
+};\r
+\r
 /*********************************************/\r
 /* Encode quantization indices of excitation */\r
 /*********************************************/\r
@@ -56,7 +74,7 @@ void SKP_Silk_encode_pulses(
     SKP_Silk_range_coder_state      *psRC,          /* I/O  Range coder state               */\r
     const SKP_int                   sigtype,        /* I    Sigtype                         */\r
     const SKP_int                   QuantOffsetType,/* I    QuantOffsetType                 */\r
-    const SKP_int                   q[],            /* I    quantization indices            */\r
+    SKP_int8                        q[],            /* I    quantization indices            */\r
     const SKP_int                   frame_length    /* I    Frame length                    */\r
 )\r
 {\r
@@ -64,12 +82,13 @@ void SKP_Silk_encode_pulses(
     SKP_int32 abs_q, minSumBits_Q6, sumBits_Q6;\r
     SKP_int   abs_pulses[ MAX_FRAME_LENGTH ];\r
     SKP_int   sum_pulses[ MAX_NB_SHELL_BLOCKS ];\r
-       SKP_int   nRshifts[   MAX_NB_SHELL_BLOCKS ]; \r
+    SKP_int   nRshifts[   MAX_NB_SHELL_BLOCKS ];\r
     SKP_int   pulses_comb[ 8 ];\r
     SKP_int   *abs_pulses_ptr;\r
-    const SKP_int *pulses_ptr;\r
+    const SKP_int8 *pulses_ptr;\r
     const SKP_uint16 *cdf_ptr;\r
     const SKP_int16 *nBits_ptr;\r
+    //extern SKP_int nbits_extra;\r
 \r
     SKP_memset( pulses_comb, 0, 8 * sizeof( SKP_int ) ); // Fixing Valgrind reported problem\r
 \r
@@ -77,10 +96,16 @@ void SKP_Silk_encode_pulses(
     /* Prepare for shell coding */\r
     /****************************/\r
     /* Calculate number of shell blocks */\r
-    iter = frame_length / SHELL_CODEC_FRAME_LENGTH;\r
-    \r
+    SKP_assert( 1 << LOG2_SHELL_CODEC_FRAME_LENGTH == SHELL_CODEC_FRAME_LENGTH );\r
+    iter = SKP_RSHIFT( frame_length, LOG2_SHELL_CODEC_FRAME_LENGTH );\r
+    if( iter * SHELL_CODEC_FRAME_LENGTH < frame_length ){\r
+        SKP_assert( frame_length == 12 * 10 ); /* Make sure only happens for 10 ms @ 12 kHz */\r
+        iter++;\r
+        SKP_memset( &q[ frame_length ], 0, SHELL_CODEC_FRAME_LENGTH * sizeof(SKP_int8));\r
+    }\r
+\r
     /* Take the absolute value of the pulses */\r
-    for( i = 0; i < frame_length; i+=4 ) {\r
+    for( i = 0; i < iter * SHELL_CODEC_FRAME_LENGTH; i+=4 ) {\r
         abs_pulses[i+0] = ( SKP_int )SKP_abs( q[ i + 0 ] );\r
         abs_pulses[i+1] = ( SKP_int )SKP_abs( q[ i + 1 ] );\r
         abs_pulses[i+2] = ( SKP_int )SKP_abs( q[ i + 2 ] );\r
@@ -177,7 +202,7 @@ void SKP_Silk_encode_pulses(
             pulses_ptr = &q[ i * SHELL_CODEC_FRAME_LENGTH ];\r
             nLS = nRshifts[ i ] - 1;\r
             for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) {\r
-                abs_q = SKP_abs( pulses_ptr[ k ] );\r
+                abs_q = (SKP_int8)SKP_abs( pulses_ptr[ k ] );\r
                 for( j = nLS; j > 0; j-- ) {\r
                     bit = SKP_RSHIFT( abs_q, j ) & 1;\r
                     SKP_Silk_range_encoder( psRC, bit, SKP_Silk_lsb_CDF );\r
@@ -188,8 +213,10 @@ void SKP_Silk_encode_pulses(
         }\r
     }\r
 \r
+#if! USE_CELT_PVQ\r
     /****************/\r
     /* Encode signs */\r
     /****************/\r
     SKP_Silk_encode_signs( psRC, q, frame_length, sigtype, QuantOffsetType, RateLevelIndex );\r
+#endif\r
 }\r