Setting fine_priority for skipped bands
[opus.git] / libcelt / testcelt.c
index d8dd5df..6bfd0dd 100644 (file)
@@ -1,5 +1,6 @@
-/* (C) 2007 Jean-Marc Valin, CSIRO
-*/
+/* Copyright (c) 2007-2008 CSIRO
+   Copyright (c) 2007-2009 Xiph.Org Foundation
+   Written by Jean-Marc Valin */
 /*
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
 #include <math.h>
 #include <string.h>
 
+#define MAX_PACKET 1275
+
 int main(int argc, char *argv[])
 {
+   int err;
    char *inFile, *outFile;
    FILE *fin, *fout;
    CELTMode *mode=NULL;
    CELTEncoder *enc;
    CELTDecoder *dec;
    int len;
-   celt_int32_t frame_size, channels;
+   celt_int32 frame_size, channels;
    int bytes_per_packet;
-   unsigned char data[1024];
-   int rate, overlap;
+   unsigned char data[MAX_PACKET];
+   int rate;
+   int complexity;
 #if !(defined (FIXED_POINT) && defined(STATIC_MODES))
    int i;
    double rmsd = 0;
 #endif
    int count = 0;
-   int skip;
-   celt_int16_t *in, *out;
-   if (argc != 9 && argc != 8)
+   celt_int32 skip;
+   celt_int16 *in, *out;
+   if (argc != 9 && argc != 8 && argc != 7)
    {
-      fprintf (stderr, "Usage: testcelt <rate> <channels> <frame size> <overlap> <bytes per packet> <input> <output>\n");
+      fprintf (stderr, "Usage: testcelt <rate> <channels> <frame size> "
+               " <bytes per packet> [<complexity> [packet loss rate]] "
+               "<input> <output>\n");
       return 1;
    }
    
    rate = atoi(argv[1]);
    channels = atoi(argv[2]);
    frame_size = atoi(argv[3]);
-   overlap = atoi(argv[4]);
-   skip = overlap;
-   mode = celt_mode_create(rate, channels, frame_size, overlap, NULL);
+   mode = celt_mode_create(rate, frame_size, NULL);
+   celt_mode_info(mode, CELT_GET_LOOKAHEAD, &skip);
    
    if (mode == NULL)
    {
@@ -78,46 +84,60 @@ int main(int argc, char *argv[])
       return 1;
    }
    
-   bytes_per_packet = atoi(argv[5]);
-   if (bytes_per_packet < 0 || bytes_per_packet > 120)
+   bytes_per_packet = atoi(argv[4]);
+   if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET)
    {
-      fprintf (stderr, "bytes per packet must be between 10 and 120\n");
+      fprintf (stderr, "bytes per packet must be between 0 and %d\n",
+                        MAX_PACKET);
       return 1;
    }
-   inFile = argv[6];
+
+   inFile = argv[argc-2];
    fin = fopen(inFile, "rb");
    if (!fin)
    {
-      fprintf (stderr, "Could not open input file %s\n", argv[6]);
+      fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
       return 1;
    }
-   outFile = argv[7];
+   outFile = argv[argc-1];
    fout = fopen(outFile, "wb+");
    if (!fout)
    {
-      fprintf (stderr, "Could not open output file %s\n", argv[7]);
+      fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
       return 1;
    }
    
-   /* Use mode4 for stereo and don't forget to change the value of CHANNEL above */
-   enc = celt_encoder_create(mode);
-   dec = celt_decoder_create(mode);
+   enc = celt_encoder_create(mode, channels, &err);
+   if (err != 0)
+   {
+      fprintf(stderr, "Failed to create the encoder: %s\n", celt_strerror(err));
+      return 1;
+   }
+   dec = celt_decoder_create(mode, channels, &err);
+   if (err != 0)
+   {
+      fprintf(stderr, "Failed to create the decoder: %s\n", celt_strerror(err));
+      return 1;
+   }
+
+   if (argc>7)
+   {
+      complexity=atoi(argv[5]);
+      celt_encoder_ctl(enc,CELT_SET_COMPLEXITY(complexity));
+   }
    
-   celt_mode_info(mode, CELT_GET_FRAME_SIZE, &frame_size);
-   celt_mode_info(mode, CELT_GET_NB_CHANNELS, &channels);
-   in = (celt_int16_t*)malloc(frame_size*channels*sizeof(celt_int16_t));
-   out = (celt_int16_t*)malloc(frame_size*channels*sizeof(celt_int16_t));
+   in = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16));
+   out = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16));
+
    while (!feof(fin))
    {
-      fread(in, sizeof(short), frame_size*channels, fin);
+      err = fread(in, sizeof(short), frame_size*channels, fin);
       if (feof(fin))
          break;
-      len = celt_encode(enc, in, data, bytes_per_packet);
+      len = celt_encode(enc, in, frame_size, data, bytes_per_packet);
       if (len <= 0)
-      {
-         fprintf (stderr, "celt_encode() returned %d\n", len);
-         return 1;
-      }
+         fprintf (stderr, "celt_encode() failed: %s\n", celt_strerror(len));
+
       /* This is for simulating bit errors */
 #if 0
       int errors = 0;
@@ -140,12 +160,20 @@ int main(int argc, char *argv[])
       else if (errors%2 == 1)
          data[rand()%8] ^= 1<<rand()%8;
 #endif
+
+#if 1 /* Set to zero to use the encoder's output instead */
       /* This is to simulate packet loss */
-      if (argc==9 && rand()%1000<atoi(argv[8]))
+      if (argc==9 && rand()%1000<atoi(argv[argc-3]))
       /*if (errors && (errors%2==0))*/
-         celt_decode(dec, NULL, len, out);
+         err = celt_decode(dec, NULL, len, out, frame_size);
       else
-         celt_decode(dec, data, len, out);
+         err = celt_decode(dec, data, len, out, frame_size);
+      if (err != 0)
+         fprintf(stderr, "celt_decode() failed: %s\n", celt_strerror(err));
+#else
+      for (i=0;i<frame_size*channels;i++)
+         out[i] = in[i];
+#endif
 #if !(defined (FIXED_POINT) && defined(STATIC_MODES))
       for (i=0;i<frame_size*channels;i++)
       {
@@ -154,14 +182,19 @@ int main(int argc, char *argv[])
       }
 #endif
       count++;
-      fwrite(out, sizeof(short), (frame_size-skip)*channels, fout);
+      fwrite(out+skip, sizeof(short), (frame_size-skip)*channels, fout);
       skip = 0;
    }
+   PRINT_MIPS(stderr);
+   
    celt_encoder_destroy(enc);
    celt_decoder_destroy(dec);
    fclose(fin);
    fclose(fout);
-#if !(defined (FIXED_POINT) && defined(STATIC_MODES))
+   celt_mode_destroy(mode);
+   free(in);
+   free(out);
+#ifdef RESYNTH
    if (rmsd > 0)
    {
       rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
@@ -172,9 +205,6 @@ int main(int argc, char *argv[])
       fprintf (stderr, "Encoder matches decoder!!\n");
    }
 #endif
-   celt_mode_destroy(mode);
-   free(in);
-   free(out);
    return 0;
 }