1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2007-2008 CSIRO
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Copyright (c) 2007-2009 Xiph.Org Foundation
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Written by Jean-Marc Valin */
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   modification, are permitted provided that the following conditions
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   are met:
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h"
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus_custom.h"
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "arch.h"
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdio.h>
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdlib.h>
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <math.h>
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <string.h>
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define MAX_PACKET 1275
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint main(int argc, char *argv[])
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int err;
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   char *inFile, *outFile;
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   FILE *fin, *fout;
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OpusCustomMode *mode=NULL;
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OpusCustomEncoder *enc;
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OpusCustomDecoder *dec;
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int len;
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 frame_size, channels, rate;
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int bytes_per_packet;
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   unsigned char data[MAX_PACKET];
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int complexity;
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i;
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   double rmsd = 0;
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int count = 0;
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int32 skip;
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_int16 *in, *out;
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (argc != 9 && argc != 8 && argc != 7)
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "Usage: test_opus_custom <rate> <channels> <frame size> "
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               " <bytes per packet> [<complexity> [packet loss rate]] "
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               "<input> <output>\n");
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   rate = (opus_int32)atol(argv[1]);
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   channels = atoi(argv[2]);
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   frame_size = atoi(argv[3]);
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   mode = opus_custom_mode_create(rate, frame_size, NULL);
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (mode == NULL)
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf(stderr, "failed to create a mode\n");
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   bytes_per_packet = atoi(argv[4]);
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET)
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "bytes per packet must be between 0 and %d\n",
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org                        MAX_PACKET);
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   inFile = argv[argc-2];
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fin = fopen(inFile, "rb");
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (!fin)
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   outFile = argv[argc-1];
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fout = fopen(outFile, "wb+");
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (!fout)
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fclose(fin);
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   enc = opus_custom_encoder_create(mode, channels, &err);
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (err != 0)
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf(stderr, "Failed to create the encoder: %s\n", opus_strerror(err));
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fclose(fin);
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fclose(fout);
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   dec = opus_custom_decoder_create(mode, channels, &err);
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (err != 0)
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf(stderr, "Failed to create the decoder: %s\n", opus_strerror(err));
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fclose(fin);
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fclose(fout);
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_custom_decoder_ctl(dec, OPUS_GET_LOOKAHEAD(&skip));
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (argc>7)
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      complexity=atoi(argv[5]);
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_custom_encoder_ctl(enc,OPUS_SET_COMPLEXITY(complexity));
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   in = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   out = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   while (!feof(fin))
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int ret;
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      err = fread(in, sizeof(short), frame_size*channels, fin);
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (feof(fin))
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         break;
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      len = opus_custom_encode(enc, in, frame_size, data, bytes_per_packet);
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (len <= 0)
139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf (stderr, "opus_custom_encode() failed: %s\n", opus_strerror(len));
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      /* This is for simulating bit errors */
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#if 0
143885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int errors = 0;
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int eid = 0;
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      /* This simulates random bit error */
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      for (i=0;i<len*8;i++)
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         if (rand()%atoi(argv[8])==0)
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         {
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            if (i<64)
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            {
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               errors++;
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org               eid = i;
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            }
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            data[i/8] ^= 1<<(7-(i%8));
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         }
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (errors == 1)
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         data[eid/8] ^= 1<<(7-(eid%8));
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      else if (errors%2 == 1)
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         data[rand()%8] ^= 1<<rand()%8;
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#if 1 /* Set to zero to use the encoder's output instead */
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      /* This is to simulate packet loss */
166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (argc==9 && rand()%1000<atoi(argv[argc-3]))
167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      /*if (errors && (errors%2==0))*/
168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = opus_custom_decode(dec, NULL, len, out, frame_size);
169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      else
170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         ret = opus_custom_decode(dec, data, len, out, frame_size);
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (ret < 0)
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         fprintf(stderr, "opus_custom_decode() failed: %s\n", opus_strerror(ret));
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      for (i=0;i<ret*channels;i++)
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         out[i] = in[i];
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      for (i=0;i<ret*channels;i++)
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      {
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         /*out[i] -= in[i];*/
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      count++;
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fwrite(out+skip*channels, sizeof(short), (ret-skip)*channels, fout);
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      skip = 0;
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PRINT_MIPS(stderr);
189885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
190885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_custom_encoder_destroy(enc);
191885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_custom_decoder_destroy(dec);
192885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fclose(fin);
193885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   fclose(fout);
194885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   opus_custom_mode_destroy(mode);
195885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   free(in);
196885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   free(out);
197885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
198885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (rmsd > 0)
199885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
200885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
201885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "Error: encoder doesn't match decoder\n");
202885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "RMS mismatch is %f\n", rmsd);
203885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 1;
204885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   } else {
205885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      fprintf (stderr, "Encoder matches decoder!!\n");
206885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
207885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
208885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return 0;
209885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
210885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
211