Setting fine_priority for skipped bands
[opus.git] / libcelt / testcelt.c
index 091f21a..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
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
 #include "celt.h"
+#include "arch.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include <string.h>
 
+#define MAX_PACKET 1275
+
 int main(int argc, char *argv[])
 {
-   int i;
+   int err;
    char *inFile, *outFile;
    FILE *fin, *fout;
-   const CELTMode *mode = celt_mono;
+   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];
-
+   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;
-   
-   if (argc != 5)
+   celt_int32 skip;
+   celt_int16 *in, *out;
+   if (argc != 9 && argc != 8 && argc != 7)
    {
-      fprintf (stderr, "Usage: testcelt -<mode> <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;
    }
-   if (strcmp(argv[1], "-mono")==0)
-      mode = celt_mono;
-   else if (strcmp(argv[1], "-stereo")==0)
-      mode = celt_stereo;
-   else {
-      fprintf (stderr, "mode must be -mono or -stereo\n");
+   
+   rate = atoi(argv[1]);
+   channels = atoi(argv[2]);
+   frame_size = atoi(argv[3]);
+   mode = celt_mode_create(rate, frame_size, NULL);
+   celt_mode_info(mode, CELT_GET_LOOKAHEAD, &skip);
+   
+   if (mode == NULL)
+   {
+      fprintf(stderr, "failed to create a mode\n");
       return 1;
    }
    
-   bytes_per_packet = atoi(argv[2]);
-   if (bytes_per_packet < 15 || 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 15 and 120\n");
+      fprintf (stderr, "bytes per packet must be between 0 and %d\n",
+                        MAX_PACKET);
       return 1;
    }
-   inFile = argv[3];
+
+   inFile = argv[argc-2];
    fin = fopen(inFile, "rb");
    if (!fin)
    {
-      fprintf (stderr, "Could not open input file %s\n", argv[3]);
+      fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
       return 1;
    }
-   outFile = argv[4];
+   outFile = argv[argc-1];
    fout = fopen(outFile, "wb+");
    if (!fout)
    {
-      fprintf (stderr, "Could not open output file %s\n", argv[4]);
+      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_new(mode);
-   dec = celt_decoder_new(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*)malloc(frame_size*channels*sizeof(celt_int16));
+   out = (celt_int16*)malloc(frame_size*channels*sizeof(celt_int16));
+
    while (!feof(fin))
    {
-      celt_int16_t in[frame_size*channels];
-      celt_int16_t out[frame_size*channels];
-      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() failed: %s\n", celt_strerror(len));
+
+      /* This is for simulating bit errors */
+#if 0
+      int errors = 0;
+      int eid = 0;
+      /* This simulates random bit error */
+      for (i=0;i<len*8;i++)
       {
-         fprintf (stderr, "celt_encode() returned %d\n", len);
-         return 1;
+         if (rand()%atoi(argv[8])==0)
+         {
+            if (i<64)
+            {
+               errors++;
+               eid = i;
+            }
+            data[i/8] ^= 1<<(7-(i%8));
+         }
       }
-      //printf ("\n");
-      //printf ("%d\n", len);
+      if (errors == 1)
+         data[eid/8] ^= 1<<(7-(eid%8));
+      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 1
-      if (rand()%100==-1)
-         celt_decode(dec, NULL, len, out);
+      if (argc==9 && rand()%1000<atoi(argv[argc-3]))
+      /*if (errors && (errors%2==0))*/
+         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
-      //printf ("\n");
+#if !(defined (FIXED_POINT) && defined(STATIC_MODES))
       for (i=0;i<frame_size*channels;i++)
+      {
          rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
+         /*out[i] -= in[i];*/
+      }
+#endif
       count++;
-      fwrite(out, sizeof(short), frame_size*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);
+   celt_mode_destroy(mode);
+   free(in);
+   free(out);
+#ifdef RESYNTH
    if (rmsd > 0)
    {
       rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
@@ -137,6 +204,7 @@ int main(int argc, char *argv[])
    } else {
       fprintf (stderr, "Encoder matches decoder!!\n");
    }
+#endif
    return 0;
 }