Define a fallback version string.
[opus.git] / src / test_opus.c
index 86d2c46..55e1c9e 100644 (file)
 #include <string.h>
 #include "opus.h"
 #include "silk_debug.h"
-#include "celt_types.h"
+#include "opus_types.h"
 
 #define MAX_PACKET 1500
 
 void print_usage( char* argv[] ) 
 {
-    fprintf(stderr, "Usage: %s <application (0/1)> <sampling rate (Hz)> <channels (1/2)> "
+    fprintf(stderr, "Usage: %s [-e | -d] <application (0/1)> <sampling rate (Hz)> <channels (1/2)> "
         "<bits per second>  [options] <input> <output>\n\n", argv[0]);
     fprintf(stderr, "mode: 0 for VoIP, 1 for audio:\n" );
     fprintf(stderr, "options:\n" );
+    fprintf(stderr, "-e                   : only runs the encoder (output the bit-stream)\n" );
+    fprintf(stderr, "-d                   : only runs the decoder (reads the bit-stream as input)\n" );
     fprintf(stderr, "-cbr                 : enable constant bitrate; default: variable bitrate\n" );
     fprintf(stderr, "-cvbr                : enable constraint variable bitrate; default: unconstraint\n" );
-    fprintf(stderr, "-bandwidth <NB|MB|WB|SWB|FB>  : audio bandwidth (from narrowband to fullband); default: sampling rate\n" );
-    fprintf(stderr, "-framesize <2.5|5|10|20|40|60>  : frame size in ms; default: 20 \n" );
+    fprintf(stderr, "-bandwidth <NB|MB|WB|SWB|FB> : audio bandwidth (from narrowband to fullband); default: sampling rate\n" );
+    fprintf(stderr, "-framesize <2.5|5|10|20|40|60> : frame size in ms; default: 20 \n" );
     fprintf(stderr, "-max_payload <bytes> : maximum payload size in bytes, default: 1024\n" );
     fprintf(stderr, "-complexity <comp>   : complexity, 0 (lowest) ... 10 (highest); default: 10\n" );
     fprintf(stderr, "-inbandfec           : enable SILK inband FEC\n" );
@@ -64,7 +66,7 @@ void print_usage( char* argv[] )
 #      define STR_CASEINSENSITIVE_COMPARE(x, y) strcasecmp(x, y)
 #endif 
 
-static void int_to_char(celt_uint32 i, unsigned char ch[4])
+static void int_to_char(opus_uint32 i, unsigned char ch[4])
 {
     ch[0] = i>>24;
     ch[1] = (i>>16)&0xFF;
@@ -72,10 +74,10 @@ static void int_to_char(celt_uint32 i, unsigned char ch[4])
     ch[3] = i&0xFF;
 }
 
-static celt_uint32 char_to_int(unsigned char ch[4])
+static opus_uint32 char_to_int(unsigned char ch[4])
 {
-    return ((celt_uint32)ch[0]<<24) | ((celt_uint32)ch[1]<<16)
-         | ((celt_uint32)ch[2]<< 8) |  (celt_uint32)ch[3];
+    return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16)
+         | ((opus_uint32)ch[2]<< 8) |  (opus_uint32)ch[3];
 }
 
 int main(int argc, char *argv[])
@@ -92,7 +94,6 @@ int main(int argc, char *argv[])
    unsigned char *data[2];
    int sampling_rate;
    int use_vbr;
-   int internal_sampling_rate_Hz;
    int max_payload_bytes;
    int complexity;
    int use_inbandfec;
@@ -110,7 +111,7 @@ int main(int argc, char *argv[])
    int bandwidth=-1;
    const char *bandwidth_string;
    int write_samples;
-   int lost, lost_prev = 1;
+   int lost = 0, lost_prev = 1;
    int toggle = 0;
    int enc_final_range[2];
    int encode_only=0, decode_only=0;
@@ -149,13 +150,13 @@ int main(int argc, char *argv[])
    /* defaults: */
    use_vbr = 1;
    bandwidth=OPUS_BANDWIDTH_AUTO;
-   internal_sampling_rate_Hz = sampling_rate;
    max_payload_bytes = MAX_PACKET;
    complexity = 10;
    use_inbandfec = 0;
    forcemono = 0;
    use_dtx = 0;
    packet_loss_perc = 0;
+   int max_frame_size = 960*3;
 
    args = 5;
    while( args < argc - 2 ) {
@@ -314,7 +315,7 @@ int main(int argc, char *argv[])
    fprintf(stderr, "Encoding %d Hz input at %.3f kb/s in %s mode with %d-sample frames.\n", sampling_rate, bitrate_bps*0.001, bandwidth_string, frame_size);
 
    in = (short*)malloc(frame_size*channels*sizeof(short));
-   out = (short*)malloc(frame_size*channels*sizeof(short));
+   out = (short*)malloc(max_frame_size*channels*sizeof(short));
    data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(char));
    if( use_inbandfec ) {
        data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(char));
@@ -326,6 +327,11 @@ int main(int argc, char *argv[])
           unsigned char ch[4];
           err = fread(ch, 1, 4, fin);
           len[toggle] = char_to_int(ch);
+          if (len[toggle]>max_payload_bytes || len[toggle]<0)
+          {
+                 fprintf(stderr, "Invalid payload length\n");
+                 break;
+          }
           err = fread(ch, 1, 4, fin);
           enc_final_range[toggle] = char_to_int(ch);
           err = fread(data[toggle], 1, len[toggle], fin);
@@ -344,9 +350,7 @@ int main(int argc, char *argv[])
           }
 
           len[toggle] = opus_encode(enc, in, frame_size, data[toggle], max_payload_bytes);
-#if OPUS_TEST_RANGE_CODER_STATE
           enc_final_range[toggle] = opus_encoder_get_final_range( enc );
-#endif
           if (len[toggle] < 0)
           {
               fprintf (stderr, "opus_encode() returned %d\n", len[toggle]);
@@ -363,39 +367,41 @@ int main(int argc, char *argv[])
           fwrite(int_field, 1, 4, fout);
           fwrite(data[toggle], 1, len[toggle], fout);
       } else {
+         int output_samples;
           lost = rand()%100 < packet_loss_perc || len[toggle]==0;
           if( count >= use_inbandfec ) {
               /* delay by one packet when using in-band FEC */
               if( use_inbandfec  ) {
                   if( lost_prev ) {
                       /* attempt to decode with in-band FEC from next packet */
-                      opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, frame_size, 1);
+                         output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, max_frame_size, 1);
                   } else {
                       /* regular decode */
-                      opus_decode(dec, data[1-toggle], len[1-toggle], out, frame_size, 0);
+                         output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, max_frame_size, 0);
                   }
               } else {
-                  opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, frame_size, 0);
+                 output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, max_frame_size, 0);
               }
-              write_samples = frame_size-skip;
-              tot_written += write_samples*channels;
-              if (tot_written > tot_read)
+              if (output_samples>0)
               {
-                  write_samples -= (tot_written-tot_read)/channels;
+                 write_samples = output_samples-skip;
+                 tot_written += write_samples*channels;
+                 if (tot_written > tot_read)
+                 {
+                         write_samples -= (tot_written-tot_read)/channels;
+                 }
+                 fwrite(out+skip, sizeof(short), write_samples*channels, fout);
+                 skip = 0;
               }
-              fwrite(out+skip, sizeof(short), write_samples*channels, fout);
-              skip = 0;
           }
       }
 
-#if OPUS_TEST_RANGE_CODER_STATE
       /* compare final range encoder rng values of encoder and decoder */
       if( !encode_only && !lost && !lost_prev
          && opus_decoder_get_final_range( dec ) != enc_final_range[toggle^use_inbandfec] ) {
           fprintf (stderr, "Error: Range coder state mismatch between encoder and decoder in frame %d.\n", count);
           return 0;
       }
-#endif
 
       lost_prev = lost;
 
@@ -403,8 +409,11 @@ int main(int argc, char *argv[])
       bits += len[toggle]*8;
       if( count >= use_inbandfec ) {
           nrg = 0.0;
-          for ( k = 0; k < frame_size * channels; k++ ) {
-              nrg += in[ k ] * (double)in[ k ];
+          if (!decode_only)
+          {
+                 for ( k = 0; k < frame_size * channels; k++ ) {
+                         nrg += in[ k ] * (double)in[ k ];
+                 }
           }
           if ( ( nrg / ( frame_size * channels ) ) > 1e5 ) {
               bits_act += len[toggle]*8;