Update SILK code using the CELT range coder
[opus.git] / test / Decoder.c
index 6c0605e..1e0cbe8 100644 (file)
@@ -25,6 +25,7 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
 ***********************************************************************/\r
 \r
+\r
 /*****************************/\r
 /* Silk decoder test program */\r
 /*****************************/\r
@@ -38,42 +39,74 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <string.h>\r
 #include "SKP_Silk_SDK_API.h"\r
 #include "SKP_Silk_SigProc_FIX.h"\r
+#include "SKP_debug.h"\r
 \r
 /* Define codec specific settings should be moved to h file */\r
 #define MAX_BYTES_PER_FRAME     1024\r
 #define MAX_INPUT_FRAMES        5\r
 #define MAX_FRAME_LENGTH        480\r
+#define MAX_FRAME_LENGTH_MS     20\r
+#define MAX_API_FS_KHZ          48\r
 #define MAX_LBRR_DELAY          2\r
 \r
+#ifdef _SYSTEM_IS_BIG_ENDIAN\r
+/* Function to convert a little endian int16 to a */\r
+/* big endian int16 or vica verca                 */\r
+void swap_endian(\r
+    SKP_int16       vec[],\r
+    SKP_int         len\r
+)\r
+{\r
+    SKP_int i;\r
+    SKP_int16 tmp;\r
+    SKP_uint8 *p1, *p2;\r
+\r
+    for( i = 0; i < len; i++ ){\r
+        tmp = vec[ i ];\r
+        p1 = (SKP_uint8 *)&vec[ i ]; p2 = (SKP_uint8 *)&tmp;\r
+        p1[ 0 ] = p2[ 1 ]; p1[ 1 ] = p2[ 0 ];\r
+    }\r
+}\r
+#endif\r
+\r
 static void print_usage(char* argv[]) {\r
     printf( "\nusage: %s in.bit out.pcm [settings]\n", argv[ 0 ] );\r
-    printf( "\nin.bit        : Bitstream input to decoder" );\r
-    printf( "\nout.pcm       : Speech output from decoder" );\r
+    printf( "\nin.bit       : Bitstream input to decoder" );\r
+    printf( "\nout.pcm      : Speech output from decoder" );\r
     printf( "\n   settings:" );\r
-    printf( "\n-fs <kHz>     : Sampling rate of output signal in kHz; default: 24" );\r
-    printf( "\n-loss <perc>  : Simulated packet loss percentage (0-100); default: 0" );\r
+    printf( "\n-Fs_API <Hz> : Sampling rate of output signal in Hz; default: 24000" );\r
+    printf( "\n-loss <perc> : Simulated packet loss percentage (0-100); default: 0" );\r
     printf( "\n" );\r
 }\r
 \r
+#ifdef SKP_MACRO_COUNT\r
+    varDefine /* Define and reset global counters */\r
+#endif\r
+\r
 int main( int argc, char* argv[] )\r
 {\r
+    unsigned long tottime, starttime;\r
+    double    filetime;\r
     size_t    counter;\r
-    SKP_int   args, totPackets, i, k;\r
+    SKP_int32 args, totPackets, i, k;\r
     SKP_int16 ret, len, tot_len;\r
     SKP_int16 nBytes;\r
     SKP_uint8 payload[    MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES * ( MAX_LBRR_DELAY + 1 ) ];\r
-    SKP_uint8 FECpayload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ], *payloadPtr;\r
     SKP_uint8 *payloadEnd = NULL, *payloadToDec = NULL;\r
+    SKP_uint8 FECpayload[ MAX_BYTES_PER_FRAME * MAX_INPUT_FRAMES ], *payloadPtr;\r
     SKP_int16 nBytesFEC;\r
     SKP_int16 nBytesPerPacket[ MAX_LBRR_DELAY + 1 ], totBytes;\r
-    SKP_int16 out[ ( MAX_FRAME_LENGTH << 1 ) * MAX_INPUT_FRAMES ], *outPtr;\r
+    SKP_int16 out[ ( ( MAX_FRAME_LENGTH_MS * MAX_API_FS_KHZ ) << 1 ) * MAX_INPUT_FRAMES ], *outPtr;\r
     char      speechOutFileName[ 150 ], bitInFileName[ 150 ];\r
     FILE      *bitInFile, *speechOutFile;\r
-    SKP_int   Fs_kHz = 0;\r
+    SKP_int32 API_Fs_Hz = 0, packetSize_ms=0;\r
     SKP_int32 decSizeBytes;\r
     void      *psDec;\r
+#ifdef SKP_MACRO_COUNT\r
+    SKP_int64  Ops, maxOps = 0, totOps = 0;\r
+#endif\r
     float     loss_prob;\r
-    SKP_int   frames, lost, quiet;\r
+    SKP_int32 frames, lost, quiet;\r
     SKP_SILK_SDK_DecControlStruct DecControl;\r
 \r
     if( argc < 3 ) {\r
@@ -95,8 +128,8 @@ int main( int argc, char* argv[] )
         if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-loss" ) == 0 ) {\r
             sscanf( argv[ args + 1 ], "%f", &loss_prob );\r
             args += 2;\r
-        } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-fs" ) == 0 ) {\r
-            sscanf( argv[ args + 1 ], "%d", &Fs_kHz );\r
+        } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-Fs_API" ) == 0 ) {\r
+            sscanf( argv[ args + 1 ], "%d", &API_Fs_Hz );\r
             args += 2;\r
         } else if( SKP_STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-quiet" ) == 0 ) {\r
             quiet = 1;\r
@@ -127,11 +160,11 @@ int main( int argc, char* argv[] )
         exit( 0 );\r
     }\r
 \r
-       /* Set the samplingrate that is requested for the output */\r
-    if( Fs_kHz == 0 ) {\r
-        DecControl.sampleRate = 24000;\r
+    /* Set the samplingrate that is requested for the output */\r
+    if( API_Fs_Hz == 0 ) {\r
+        DecControl.API_sampleRate = 24000;\r
     } else {\r
-        DecControl.sampleRate = Fs_kHz * 1000;\r
+        DecControl.API_sampleRate = API_Fs_Hz;\r
     }\r
 \r
     /* Create decoder */\r
@@ -147,6 +180,7 @@ int main( int argc, char* argv[] )
         printf( "\nSKP_Silk_InitDecoder returned %d", ret );\r
     }\r
 \r
+    tottime    = 0;\r
     totPackets = 0;\r
     payloadEnd = payload;\r
 \r
@@ -154,10 +188,13 @@ int main( int argc, char* argv[] )
     for( i = 0; i < MAX_LBRR_DELAY; i++ ) {\r
         /* Read payload size */\r
         counter = fread( &nBytes, sizeof( SKP_int16 ), 1, bitInFile );\r
+#ifdef _SYSTEM_IS_BIG_ENDIAN\r
+        swap_endian( &nBytes, 1 );\r
+#endif\r
         /* Read payload */\r
         counter = fread( payloadEnd, sizeof( SKP_uint8 ), nBytes, bitInFile );\r
 \r
-        if( (SKP_int16)counter < nBytes ) {\r
+        if( ( SKP_int16 )counter < nBytes ) {\r
             break;\r
         }\r
         nBytesPerPacket[ i ] = nBytes;\r
@@ -167,13 +204,16 @@ int main( int argc, char* argv[] )
     while( 1 ) {\r
         /* Read payload size */\r
         counter = fread( &nBytes, sizeof( SKP_int16 ), 1, bitInFile );\r
+#ifdef _SYSTEM_IS_BIG_ENDIAN\r
+        swap_endian( &nBytes, 1 );\r
+#endif\r
         if( nBytes < 0 || counter < 1 ) {\r
             break;\r
         }\r
         \r
         /* Read payload */\r
         counter = fread( payloadEnd, sizeof( SKP_uint8 ), nBytes, bitInFile );\r
-        if( (SKP_int16)counter < nBytes ) {\r
+        if( ( SKP_int16 )counter < nBytes ) {\r
             break;\r
         }\r
 \r
@@ -193,7 +233,9 @@ int main( int argc, char* argv[] )
             payloadPtr = payload;\r
             for( i = 0; i < MAX_LBRR_DELAY; i++ ) {\r
                 if( nBytesPerPacket[ i + 1 ] > 0 ) {\r
-                    SKP_Silk_SDK_search_for_LBRR( psDec, payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );\r
+                    starttime = GetHighResolutionTime();\r
+                    SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );\r
+                    tottime += GetHighResolutionTime() - starttime;\r
                     if( nBytesFEC > 0 ) {\r
                         payloadToDec = FECpayload;\r
                         nBytes = nBytesFEC;\r
@@ -218,11 +260,17 @@ int main( int argc, char* argv[] )
             frames = 0;\r
             do {\r
                 /* Decode 20 ms */\r
+                starttime = GetHighResolutionTime();\r
                 ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 0, payloadToDec, nBytes, outPtr, &len );\r
+                tottime += GetHighResolutionTime() - starttime;\r
                 if( ret ) {\r
                     printf( "\nSKP_Silk_SDK_Decode returned %d", ret );\r
                 }\r
-\r
+#ifdef SKP_MACRO_COUNT\r
+                Ops = SKP_SaveResetCount();\r
+                if( Ops > maxOps ){ maxOps = Ops; }\r
+                totOps += Ops;\r
+#endif\r
                 frames++;\r
                 outPtr  += len;\r
                 tot_len += len;\r
@@ -238,17 +286,28 @@ int main( int argc, char* argv[] )
             /* Loss: Decode enough frames to cover one packet duration */\r
             for( i = 0; i < DecControl.framesPerPacket; i++ ) {\r
                 /* Generate 20 ms */\r
+                starttime = GetHighResolutionTime();\r
                 ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, payloadToDec, nBytes, outPtr, &len );\r
+                tottime += GetHighResolutionTime() - starttime;\r
                 if( ret ) {\r
                     printf( "\nSKP_Silk_Decode returned %d", ret );\r
                 }\r
+#ifdef SKP_MACRO_COUNT\r
+                Ops = SKP_SaveResetCount();\r
+                if( Ops > maxOps ){ maxOps = Ops; }\r
+                totOps += Ops;\r
+#endif\r
                 outPtr  += len;\r
                 tot_len += len;\r
             }\r
         }\r
         totPackets++;\r
+        packetSize_ms = tot_len / ( DecControl.API_sampleRate / 1000 );\r
 \r
         /* Write output to file */\r
+#ifdef _SYSTEM_IS_BIG_ENDIAN   \r
+        swap_endian( out, tot_len );\r
+#endif\r
         fwrite( out, sizeof( SKP_int16 ), tot_len, speechOutFile );\r
 \r
         /* Update buffer */\r
@@ -261,7 +320,7 @@ int main( int argc, char* argv[] )
         SKP_memmove( nBytesPerPacket, &nBytesPerPacket[ 1 ], MAX_LBRR_DELAY * sizeof( SKP_int16 ) );\r
 \r
         if( !quiet ) {\r
-            fprintf( stderr, "\rFrames decoded:              %d", totPackets );\r
+            fprintf( stderr, "\rPackets decoded:             %d", totPackets );\r
         }\r
     }\r
 \r
@@ -275,7 +334,9 @@ int main( int argc, char* argv[] )
             payloadPtr = payload;\r
             for( i = 0; i < MAX_LBRR_DELAY; i++ ) {\r
                 if( nBytesPerPacket[ i + 1 ] > 0 ) {\r
-                    SKP_Silk_SDK_search_for_LBRR( psDec, payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );\r
+                    starttime = GetHighResolutionTime();\r
+                    SKP_Silk_SDK_search_for_LBRR( payloadPtr, nBytesPerPacket[ i + 1 ], i + 1, FECpayload, &nBytesFEC );\r
+                    tottime += GetHighResolutionTime() - starttime;\r
                     if( nBytesFEC > 0 ) {\r
                         payloadToDec = FECpayload;\r
                         nBytes = nBytesFEC;\r
@@ -300,7 +361,9 @@ int main( int argc, char* argv[] )
             frames = 0;\r
             do {\r
                 /* Decode 20 ms */\r
+                starttime = GetHighResolutionTime();\r
                 ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 0, payloadToDec, nBytes, outPtr, &len );\r
+                tottime += GetHighResolutionTime() - starttime;\r
                 if( ret ) {\r
                     printf( "\nSKP_Silk_SDK_Decode returned %d", ret );\r
                 }\r
@@ -321,7 +384,9 @@ int main( int argc, char* argv[] )
 \r
             /* Generate 20 ms */\r
             for( i = 0; i < DecControl.framesPerPacket; i++ ) {\r
+                starttime = GetHighResolutionTime();\r
                 ret = SKP_Silk_SDK_Decode( psDec, &DecControl, 1, payloadToDec, nBytes, outPtr, &len );\r
+                tottime += GetHighResolutionTime() - starttime;\r
                 if( ret ) {\r
                     printf( "\nSKP_Silk_Decode returned %d", ret );\r
                 }\r
@@ -332,6 +397,9 @@ int main( int argc, char* argv[] )
         totPackets++;\r
 \r
         /* Write output to file */\r
+#ifdef _SYSTEM_IS_BIG_ENDIAN   \r
+        swap_endian( out, tot_len );\r
+#endif\r
         fwrite( out, sizeof( SKP_int16 ), tot_len, speechOutFile );\r
 \r
         /* Update Buffer */\r
@@ -348,8 +416,27 @@ int main( int argc, char* argv[] )
         }\r
     }\r
 \r
+    filetime = totPackets * 1e-3 * packetSize_ms;\r
     if( !quiet ) {\r
-        printf( "\nDecoding Finished \n" );\r
+        printf("\nFile length:                 %.3f s", filetime);\r
+        printf("\nTime for decoding:           %.3f s (%.3f%% of realtime)", 1e-6 * tottime, 1e-4 * tottime / filetime);\r
+\r
+#ifdef SKP_MACRO_COUNT\r
+        printf("\n \nWMOPS calculation");\r
+        printf("\nMean:                        %.3f WMOPS", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3));\r
+        printf("\nMax:                         %.3f WMOPS", (float)maxOps / ((float)packetSize_ms * 1e3));\r
+#endif\r
+        printf("\n\n");\r
+    } else {\r
+        /* print time and % of realtime */\r
+        printf( "%.3f %.3f %d ", 1e-6 * tottime, 1e-4 * tottime / filetime, totPackets );\r
+#ifdef SKP_MACRO_COUNT\r
+        /* print average and max WMOPS */\r
+        printf( "%.3f %.3f \n", (float)totOps / ((float)packetSize_ms * (float)totPackets * 1e3), \r
+            (float)maxOps / ((float)packetSize_ms * 1e3));\r
+#else\r
+        printf( "%.3f %.3f \n", 0, 0);\r
+#endif\r
     }\r
 \r
     /* Free decoder */\r
@@ -359,5 +446,8 @@ int main( int argc, char* argv[] )
     fclose( speechOutFile );\r
     fclose( bitInFile );\r
 \r
+    /* Save timing file if TIC/TOC used */\r
+    SKP_TimerSave("decoder_timings.txt");\r
+\r
     return 0;\r
 }\r