16b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation,
26b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org                           Gregory Maxwell
36b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
46b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org/*
56b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
66b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   modification, are permitted provided that the following conditions
76b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   are met:
86b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
96b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
106b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
116b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
126b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
136b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
146b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
156b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org
166b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
206b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
216b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
226b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
236b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
246b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
256b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
266b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@chromium.org*/
286b6bee25314cfac02cc555cddedb9680c63a26d6sergeyu@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 <stdio.h>
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <string.h>
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef CUSTOM_MODES
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CUSTOM_MODES
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define TEST_CUSTOM_MODES
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define CELT_C
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "stack_alloc.h"
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.c"
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.c"
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entcode.c"
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "cwrs.c"
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "mathops.c"
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "rate.h"
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define NMAX (240)
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define KMAX (128)
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef TEST_CUSTOM_MODES
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
56e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#define NDIMS (44)
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pn[NDIMS]={
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   2,   3,   4,   5,   6,   7,   8,   9,  10,
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  11,  12,  13,  14,  15,  16,  18,  20,  22,
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  24,  26,  28,  30,  32,  36,  40,  44,  48,
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  52,  56,  60,  64,  72,  80,  88,  96, 104,
62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 112, 120, 128, 144, 160, 176, 192, 208
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org};
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pkmax[NDIMS]={
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 128, 128, 128, 128,  88,  52,  36,  26,  22,
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  18,  16,  15,  13,  12,  12,  11,  10,   9,
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   9,   8,   8,   7,   7,   7,   7,   6,   6,
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   6,   6,   6,   5,   5,   5,   5,   5,   5,
69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org   4,   4,   4,   4,   4,   4,   4,   4
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org};
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#else /* TEST_CUSTOM_MODES */
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define NDIMS (22)
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pn[NDIMS]={
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   2,   3,   4,   6,   8,   9,  11,  12,  16,
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  18,  22,  24,  32,  36,  44,  48,  64,  72,
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  88,  96, 144, 176
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org};
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgstatic const int pkmax[NDIMS]={
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 128, 128, 128,  88,  36,  26,  18,  16,  12,
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  11,   9,   9,   7,   7,   6,   6,   5,   5,
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   5,   5,   4,   4
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org};
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint main(void){
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  int t;
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  int n;
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  ALLOC_STACK;
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  for(t=0;t<NDIMS;t++){
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    int pseudo;
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    n=pn[t];
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    for(pseudo=1;pseudo<41;pseudo++)
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    {
97885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      int k;
98e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT)
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_uint32 uu[KMAX+2U];
100e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_uint32 inc;
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_uint32 nc;
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      opus_uint32 i;
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      k=get_pulses(pseudo);
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (k>pkmax[t])break;
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      printf("Testing CWRS with N=%i, K=%i...\n",n,k);
107e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT)
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      nc=ncwrs_urow(n,k,uu);
109e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
110e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org      nc=CELT_PVQ_V(n,k);
111e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      inc=nc/20000;
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if(inc<1)inc=1;
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      for(i=0;i<nc;i+=inc){
115e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT)
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        opus_uint32 u[KMAX+2U];
117e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
118e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        int         y[NMAX];
119e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        int         sy;
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        opus_uint32 v;
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        opus_uint32 ii;
122e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        int         j;
123e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT)
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        memcpy(u,uu,(k+2U)*sizeof(*u));
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        cwrsi(n,k,i,y,u);
126e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
127e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        cwrsi(n,k,i,y);
128e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        sy=0;
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        for(j=0;j<n;j++)sy+=ABS(y[j]);
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        if(sy!=k){
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n",
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org           n,sy,k);
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          return 99;
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        }
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        /*printf("%6u of %u:",i,nc);
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        for(j=0;j<n;j++)printf(" %+3i",y[j]);
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        printf(" ->");*/
139e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#if defined(SMALL_FOOTPRINT)
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        ii=icwrs(n,k,&v,y,u);
141e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#else
142e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        ii=icwrs(n,y);
143e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org        v=CELT_PVQ_V(n,k);
144e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org#endif
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        if(ii!=i){
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n",
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org           (long)ii,(long)i);
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          return 1;
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        }
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        if(v!=nc){
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n",
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org           (long)v,(long)nc);
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org          return 2;
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        }
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        /*printf(" %6u\n",i);*/
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      }
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      /*printf("\n");*/
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  }
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org  return 0;
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
162