Fixes 60 ms speech mode
[opus.git] / src / test_opus.c
index e322be0..797c872 100644 (file)
 #include "SKP_debug.h"
 
 
-#define MAX_PACKET 1024
+#define MAX_PACKET 1500
 
 void print_usage( char* argv[] ) 
 {
     fprintf(stderr, "Usage: %s <mode (0/1/2)> <sampling rate (Hz)> <channels> "
         "<bits per second>  [options] <input> <output>\n\n", argv[0]);
-    fprintf(stderr, "mode: 0 for SILK, 1 for hybrid, 2 for CELT:\n" );
+    fprintf(stderr, "mode: 0 for auto, 1 for voice, 2 for audio:\n" );
     fprintf(stderr, "options:\n" );
     fprintf(stderr, "-cbr                 : enable constant bitrate; default: VBR\n" );
     fprintf(stderr, "-bandwidth <NB|MB|WB|SWB|FB>  : audio bandwidth (from narrowband to fullband); default: sampling rate\n" );
@@ -82,6 +82,7 @@ int main(int argc, char *argv[])
    int complexity;
    int use_inbandfec;
    int use_dtx;
+   int cvbr = 0;
    int packet_loss_perc;
    int count=0, count_act=0, k;
    int skip;
@@ -103,7 +104,7 @@ int main(int argc, char *argv[])
       return 1;
    }
 
-   mode = atoi(argv[1]) + MODE_SILK_ONLY;
+   mode = atoi(argv[1]) + OPUS_MODE_AUTO;
    sampling_rate = atoi(argv[2]);
    channels = atoi(argv[3]);
    bitrate_bps = atoi(argv[4]);
@@ -112,7 +113,7 @@ int main(int argc, char *argv[])
 
    /* defaults: */
    use_vbr = 1;
-   bandwidth=-1;
+   bandwidth=BANDWIDTH_AUTO;
    internal_sampling_rate_Hz = sampling_rate;
    max_payload_bytes = MAX_PACKET;
    complexity = 10;
@@ -120,24 +121,6 @@ int main(int argc, char *argv[])
    use_dtx = 0;
    packet_loss_perc = 0;
 
-   switch(sampling_rate)
-   {
-   case 8000:
-          bandwidth = BANDWIDTH_NARROWBAND;
-          break;
-   case 12000:
-          bandwidth = BANDWIDTH_MEDIUMBAND;
-          break;
-   case 16000:
-          bandwidth = BANDWIDTH_WIDEBAND;
-          break;
-   case 24000:
-          bandwidth = BANDWIDTH_SUPERWIDEBAND;
-          break;
-   case 48000:
-          bandwidth = BANDWIDTH_FULLBAND;
-          break;
-   }
    args = 5;
    while( args < argc - 2 ) {
        /* process command line options */
@@ -187,6 +170,9 @@ int main(int argc, char *argv[])
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-inbandfec" ) == 0 ) {
             use_inbandfec = 1;
             args++;
+        } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-cvbr" ) == 0 ) {
+            cvbr = 1;
+            args++;
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-dtx") == 0 ) {
             use_dtx = 1;
             args++;
@@ -200,7 +186,7 @@ int main(int argc, char *argv[])
         }
    }
 
-   if( mode < MODE_SILK_ONLY || mode > MODE_CELT_ONLY ) {
+   if( mode < OPUS_MODE_AUTO || mode > OPUS_MODE_AUDIO) {
       fprintf (stderr, "mode must be: 0, 1 or 2\n");
       return 1;
    }
@@ -233,43 +219,14 @@ int main(int argc, char *argv[])
       return 1;
    }
 
-   if (mode==MODE_SILK_ONLY)
-   {
-       if (bandwidth == BANDWIDTH_SUPERWIDEBAND || bandwidth == BANDWIDTH_FULLBAND)
-       {
-           fprintf (stderr, "Predictive mode only supports up to wideband\n");
-           return 1;
-       }
-   }
-   if (mode==MODE_HYBRID)
-   {
-       if (bandwidth != BANDWIDTH_SUPERWIDEBAND && bandwidth != BANDWIDTH_FULLBAND)
-       {
-           fprintf (stderr, "Hybrid mode only supports superwideband and fullband\n");
-           return 1;
-       }
-   }
-   if (mode==MODE_CELT_ONLY)
-   {
-       if (bandwidth == BANDWIDTH_MEDIUMBAND)
-       {
-           fprintf (stderr, "Transform mode does not support mediumband\n");
-           return 1;
-       }
-   }
-
    enc = opus_encoder_create(sampling_rate, channels);
    dec = opus_decoder_create(sampling_rate, channels);
 
-   if (bandwidth == -1)
-   {
-       fprintf (stderr, "Please specify a bandwidth when the sampling rate does not match one exactly\n");
-       return 1;
-   }
    opus_encoder_ctl(enc, OPUS_SET_MODE(mode));
    opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
    opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));
    opus_encoder_ctl(enc, OPUS_SET_VBR_FLAG(use_vbr));
+   opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(cvbr));
    opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
    opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC_FLAG(use_inbandfec));
    opus_encoder_ctl(enc, OPUS_SET_DTX_FLAG(use_dtx));
@@ -277,8 +234,8 @@ int main(int argc, char *argv[])
 
    skip = 5*sampling_rate/1000;
    /* When SILK resamples, add 18 samples delay */
-   if (mode != MODE_SILK_ONLY || sampling_rate > 16000)
-          skip += 18;
+   /*if (mode != MODE_SILK_ONLY || sampling_rate > 16000)
+          skip += 18;*/
 
    switch(bandwidth)
    {
@@ -297,6 +254,9 @@ int main(int argc, char *argv[])
    case BANDWIDTH_FULLBAND:
           bandwidth_string = "fullband";
           break;
+   case BANDWIDTH_AUTO:
+          bandwidth_string = "auto";
+          break;
    default:
           bandwidth_string = "unknown";
    }
@@ -325,13 +285,13 @@ int main(int argc, char *argv[])
 #if OPUS_TEST_RANGE_CODER_STATE
       enc_final_range[toggle] = opus_encoder_get_final_range( enc );
 #endif
-      if (len[toggle] <= 0)
+      if (len[toggle] < 0)
       {
          fprintf (stderr, "opus_encode() returned %d\n", len[toggle]);
          return 1;
       }
 
-      lost = rand()%100<packet_loss_perc;
+      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  ) {
@@ -391,6 +351,9 @@ int main(int argc, char *argv[])
    SKP_TimerSave("opus_timing.txt");
    opus_encoder_destroy(enc);
    opus_decoder_destroy(dec);
+   free(data[0]);
+   if (use_inbandfec)
+          free(data[1]);
    fclose(fin);
    fclose(fout);
    free(in);