Remove warning added by 4cc9a459.
[opus.git] / src / test_opus.c
index 7ec1e05..0e88681 100644 (file)
 #include <math.h>
 #include <string.h>
 #include "opus.h"
-#include "silk_debug.h"
+#include "debug.h"
 #include "opus_types.h"
 
 #define MAX_PACKET 1500
 
 void print_usage( char* argv[] )
 {
-    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, "Usage: %s [-e] <application> <sampling rate (Hz)> <channels (1/2)> "
+        "<bits per second>  [options] <input> <output>\n", argv[0]);
+    fprintf(stderr, "       %s -d <sampling rate (Hz)> <channels (1/2)> "
+        "[options] <input> <output>\n\n", argv[0]);
+    fprintf(stderr, "mode: voip | audio | restricted-lowdelay\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" );
@@ -63,6 +65,7 @@ void print_usage( char* argv[] )
 #ifdef _WIN32
 #   define STR_CASEINSENSITIVE_COMPARE(x, y) _stricmp(x, y)
 #else
+#   include <strings.h>
 #   define STR_CASEINSENSITIVE_COMPARE(x, y) strcasecmp(x, y)
 #endif
 
@@ -85,27 +88,28 @@ int main(int argc, char *argv[])
     int err;
     char *inFile, *outFile;
     FILE *fin, *fout;
-    OpusEncoder *enc;
-    OpusDecoder *dec;
+    OpusEncoder *enc=NULL;
+    OpusDecoder *dec=NULL;
     int args;
     int len[2];
     int frame_size, channels;
-    int bitrate_bps;
+    opus_int32 bitrate_bps=0;
     unsigned char *data[2];
-    int sampling_rate;
+    opus_int32 sampling_rate;
     int use_vbr;
     int max_payload_bytes;
     int complexity;
     int use_inbandfec;
     int use_dtx;
-    int forcemono;
+    int forcechannels;
     int cvbr = 0;
     int packet_loss_perc;
-    int count=0, count_act=0, k;
-    int skip;
+    opus_int32 count=0, count_act=0;
+    int k;
+    int skip=0;
     int stop=0;
     short *in, *out;
-    int application;
+    int application=OPUS_APPLICATION_AUDIO;
     double bits=0.0, bits_act=0.0, bits2=0.0, nrg;
     int bandwidth=-1;
     const char *bandwidth_string;
@@ -116,8 +120,9 @@ int main(int argc, char *argv[])
     int encode_only=0, decode_only=0;
     int max_frame_size = 960*6;
     int curr_read=0;
+    int sweep_bps = 0;
 
-    if (argc < 7 )
+    if (argc < 5 )
     {
        print_usage( argv );
        return 1;
@@ -125,21 +130,44 @@ int main(int argc, char *argv[])
 
     fprintf(stderr, "%s\n", opus_get_version_string());
 
-    if (strcmp(argv[1], "-e")==0)
+    args = 1;
+    if (strcmp(argv[args], "-e")==0)
     {
         encode_only = 1;
-        argv++;
-        argc--;
-    } else if (strcmp(argv[1], "-d")==0)
+        args++;
+    } else if (strcmp(argv[args], "-d")==0)
     {
         decode_only = 1;
-        argv++;
-        argc--;
+        args++;
+    }
+    if (!decode_only && argc < 7 )
+    {
+       print_usage( argv );
+       return 1;
+    }
+
+    if (!decode_only)
+    {
+       if (strcmp(argv[args], "voip")==0)
+          application = OPUS_APPLICATION_VOIP;
+       else if (strcmp(argv[args], "restricted-lowdelay")==0)
+          application = OPUS_APPLICATION_RESTRICTED_LOWDELAY;
+       else if (strcmp(argv[args], "audio")!=0) {
+          fprintf(stderr, "unknown application: %s\n", argv[args]);
+          print_usage(argv);
+          return 1;
+       }
+       args++;
+    }
+    sampling_rate = (opus_int32)atol(argv[args]);
+    args++;
+    channels = atoi(argv[args]);
+    args++;
+    if (!decode_only)
+    {
+       bitrate_bps = (opus_int32)atol(argv[args]);
+       args++;
     }
-    application = atoi(argv[1]) + OPUS_APPLICATION_VOIP;
-    sampling_rate = atoi(argv[2]);
-    channels = atoi(argv[3]);
-    bitrate_bps = atoi(argv[4]);
 
     if (sampling_rate != 8000 && sampling_rate != 12000 && sampling_rate != 16000
      && sampling_rate != 24000 && sampling_rate != 48000)
@@ -152,17 +180,16 @@ int main(int argc, char *argv[])
 
     /* defaults: */
     use_vbr = 1;
-    bandwidth = OPUS_BANDWIDTH_AUTO;
+    bandwidth = OPUS_AUTO;
     max_payload_bytes = MAX_PACKET;
     complexity = 10;
     use_inbandfec = 0;
-    forcemono = 0;
+    forcechannels = OPUS_AUTO;
     use_dtx = 0;
     packet_loss_perc = 0;
     max_frame_size = 960*6;
     curr_read=0;
 
-    args = 5;
     while( args < argc - 2 ) {
         /* process command line options */
         if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-cbr" ) == 0 ) {
@@ -212,7 +239,7 @@ int main(int argc, char *argv[])
             use_inbandfec = 1;
             args++;
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-forcemono" ) == 0 ) {
-            forcemono = 1;
+            forcechannels = 1;
             args++;
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-cvbr" ) == 0 ) {
             cvbr = 1;
@@ -223,6 +250,9 @@ int main(int argc, char *argv[])
         } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-loss" ) == 0 ) {
             packet_loss_perc = atoi( argv[ args + 1 ] );
             args += 2;
+        } else if( STR_CASEINSENSITIVE_COMPARE( argv[ args ], "-sweep" ) == 0 ) {
+            sweep_bps = atoi( argv[ args + 1 ] );
+            args += 2;
         } else {
             printf( "Error: unrecognized setting: %s\n\n", argv[ args ] );
             print_usage( argv );
@@ -230,11 +260,6 @@ int main(int argc, char *argv[])
         }
     }
 
-    if( application < OPUS_APPLICATION_VOIP || application > OPUS_APPLICATION_AUDIO) {
-        fprintf (stderr, "mode must be: 0 or 1\n");
-        return 1;
-    }
-
     if (max_payload_bytes < 0 || max_payload_bytes > MAX_PACKET)
     {
         fprintf (stderr, "max_payload_bytes must be between 0 and %d\n",
@@ -257,44 +282,36 @@ int main(int argc, char *argv[])
         return 1;
     }
 
-    enc = opus_encoder_create(sampling_rate, channels, application, &err);
-    if (err != OPUS_OK)
+    if (!decode_only)
     {
-       fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err));
-       return 1;
+       enc = opus_encoder_create(sampling_rate, channels, application, &err);
+       if (err != OPUS_OK)
+       {
+          fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err));
+          return 1;
+       }
+       opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
+       opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));
+       opus_encoder_ctl(enc, OPUS_SET_VBR(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(use_inbandfec));
+       opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(forcechannels));
+       opus_encoder_ctl(enc, OPUS_SET_DTX(use_dtx));
+       opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(packet_loss_perc));
+
+       opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip));
     }
-    dec = opus_decoder_create(sampling_rate, channels, &err);
-    if (err != OPUS_OK)
+    if (!encode_only)
     {
-       fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err));
-       return 1;
+       dec = opus_decoder_create(sampling_rate, channels, &err);
+       if (err != OPUS_OK)
+       {
+          fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err));
+          return 1;
+       }
     }
 
-    if (enc==NULL)
-    {
-        fprintf(stderr, "Failed to create an encoder\n");
-        exit(1);
-    }
-    if (dec==NULL)
-    {
-        fprintf(stderr, "Failed to create a decoder\n");
-        exit(1);
-    }
-
-    opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
-    opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));
-    opus_encoder_ctl(enc, OPUS_SET_VBR(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(use_inbandfec));
-    opus_encoder_ctl(enc, OPUS_SET_FORCE_MONO(forcemono));
-    opus_encoder_ctl(enc, OPUS_SET_DTX(use_dtx));
-    opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(packet_loss_perc));
-
-    skip = 5*sampling_rate/1000;
-    /* When SILK resamples, add 18 samples delay */
-    /*if (mode != MODE_SILK_ONLY || sampling_rate > 16000)
-        skip += 18;*/
 
     switch(bandwidth)
     {
@@ -313,7 +330,7 @@ int main(int argc, char *argv[])
     case OPUS_BANDWIDTH_FULLBAND:
          bandwidth_string = "fullband";
          break;
-    case OPUS_BANDWIDTH_AUTO:
+    case OPUS_AUTO:
          bandwidth_string = "auto";
          break;
     default:
@@ -321,7 +338,10 @@ int main(int argc, char *argv[])
          break;
     }
 
-    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);
+    if (decode_only)
+       fprintf(stderr, "Decoding with %ld Hz output (%d channels)\n", (long)sampling_rate, channels);
+    else
+       fprintf(stderr, "Encoding %ld Hz input at %.3f kb/s in %s mode with %d-sample frames.\n", (long)sampling_rate, bitrate_bps*0.001, bandwidth_string, frame_size);
 
     in = (short*)malloc(frame_size*channels*sizeof(short));
     out = (short*)malloc(max_frame_size*channels*sizeof(short));
@@ -363,6 +383,14 @@ int main(int argc, char *argv[])
             }
 
             len[toggle] = opus_encode(enc, in, frame_size, data[toggle], max_payload_bytes);
+            if (sweep_bps!=0)
+            {
+               bitrate_bps += sweep_bps;
+               /* safety */
+               if (bitrate_bps<1000)
+                  bitrate_bps = 1000;
+               opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
+            }
             opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range[toggle]));
             if (len[toggle] < 0)
             {
@@ -405,11 +433,12 @@ int main(int argc, char *argv[])
             }
         }
 
-        opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
+        if (!encode_only)
+           opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
         /* compare final range encoder rng values of encoder and decoder */
         if( enc_final_range[toggle^use_inbandfec]!=0  && !encode_only && !lost && !lost_prev &&
                        dec_final_range != enc_final_range[toggle^use_inbandfec] ) {
-            fprintf (stderr, "Error: Range coder state mismatch between encoder and decoder in frame %d: 0x%8x vs 0x%8x\n", count,  enc_final_range[toggle^use_inbandfec], dec_final_range);
+            fprintf (stderr, "Error: Range coder state mismatch between encoder and decoder in frame %ld: 0x%8lx vs 0x%8lx\n", (long)count, (unsigned long)enc_final_range[toggle^use_inbandfec], (unsigned long)dec_final_range);
             return 0;
         }
 
@@ -436,7 +465,8 @@ int main(int argc, char *argv[])
         toggle = (toggle + use_inbandfec) & 1;
     }
     fprintf (stderr, "average bitrate:             %7.3f kb/s\n", 1e-3*bits*sampling_rate/(frame_size*(double)count));
-    fprintf (stderr, "active bitrate:              %7.3f kb/s\n", 1e-3*bits_act*sampling_rate/(frame_size*(double)count_act));
+    if (!decode_only)
+       fprintf (stderr, "active bitrate:              %7.3f kb/s\n", 1e-3*bits_act*sampling_rate/(frame_size*(double)count_act));
     fprintf (stderr, "bitrate standard deviation:  %7.3f kb/s\n", 1e-3*sqrt(bits2/count - bits*bits/(count*(double)count))*sampling_rate/frame_size);
     /* Close any files to which intermediate results were stored */
     SILK_DEBUG_STORE_CLOSE_FILES