oops, unb0rked testcelt output
[opus.git] / libcelt / testcelt.c
index 8e16ae7..50d7243 100644 (file)
    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>
 
 int main(int argc, char *argv[])
 {
    int i;
    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;
    int bytes_per_packet;
-   char data[1024];
-
+   unsigned char data[1024];
+   int rate, overlap;
    double rmsd = 0;
    int count = 0;
-   
-   if (argc != 5)
+   int skip;
+   if (argc != 8)
    {
-      fprintf (stderr, "Usage: testcelt -<mode> <bytes per packet> <input> <output>\n");
+      fprintf (stderr, "Usage: testcelt <rate> <channels> <frame size> <overlap> <bytes per packet> <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]);
+   overlap = atoi(argv[4]);
+   skip = overlap;
+   mode = celt_mode_create(rate, channels, frame_size, overlap, NULL);
+   
+   if (mode == NULL)
+   {
+      fprintf(stderr, "failed to create a mode\n");
       return 1;
    }
    
-   bytes_per_packet = atoi(argv[2]);
-   if (bytes_per_packet < 25 || bytes_per_packet > 120)
+   bytes_per_packet = atoi(argv[5]);
+   if (bytes_per_packet < 0 || bytes_per_packet > 120)
    {
-      fprintf (stderr, "bytes per packet must be between 25 and 120\n");
+      fprintf (stderr, "bytes per packet must be between 10 and 120\n");
       return 1;
    }
-   inFile = argv[3];
+   inFile = argv[6];
    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[6]);
       return 1;
    }
-   outFile = argv[4];
+   outFile = argv[7];
    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[7]);
       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);
+   dec = celt_decoder_create(mode);
    
    celt_mode_info(mode, CELT_GET_FRAME_SIZE, &frame_size);
    celt_mode_info(mode, CELT_GET_NB_CHANNELS, &channels);
    while (!feof(fin))
    {
-      celt_int16_t in[frame_size*channels];
-      celt_int16_t out[frame_size*channels];
+      VARDECL(celt_int16_t *in);
+      VARDECL(celt_int16_t *out);
+      SAVE_STACK;
+      ALLOC(in, frame_size*channels, celt_int16_t);
+      ALLOC(out, frame_size*channels, celt_int16_t);
       fread(in, sizeof(short), frame_size*channels, fin);
+      if (feof(fin))
+         break;
       len = celt_encode(enc, in, data, bytes_per_packet);
       if (len <= 0)
       {
          fprintf (stderr, "celt_encode() returned %d\n", len);
+         RESTORE_STACK;
          return 1;
       }
-      //printf ("\n");
-      //printf ("%d\n", len);
       /* This is to simulate packet loss */
+#if 1
       if (rand()%100==-1)
          celt_decode(dec, NULL, len, out);
       else
          celt_decode(dec, data, len, out);
-      //printf ("\n");
+#else
+      for (i=0;i<frame_size*channels;i++)
+         out[i] = in[i];
+#endif
       for (i=0;i<frame_size*channels;i++)
+      {
          rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
+         /*out[i] -= in[i];*/
+      }
       count++;
-      fwrite(out, sizeof(short), frame_size*channels, fout);
+      fwrite(out, sizeof(short), (frame_size-skip)*channels, fout);
+      skip = 0;
+      RESTORE_STACK;
    }
    celt_encoder_destroy(enc);
    celt_decoder_destroy(dec);
@@ -129,6 +152,7 @@ int main(int argc, char *argv[])
    } else {
       fprintf (stderr, "Encoder matches decoder!!\n");
    }
+   celt_mode_destroy(mode);
    return 0;
 }