xref: /aosp_15_r20/external/libopus/celt/tests/test_unit_cwrs32.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /* Copyright (c) 2008-2011 Xiph.Org Foundation, Mozilla Corporation,
2*a58d3d2aSXin Li                            Gregory Maxwell
3*a58d3d2aSXin Li    Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
4*a58d3d2aSXin Li /*
5*a58d3d2aSXin Li    Redistribution and use in source and binary forms, with or without
6*a58d3d2aSXin Li    modification, are permitted provided that the following conditions
7*a58d3d2aSXin Li    are met:
8*a58d3d2aSXin Li 
9*a58d3d2aSXin Li    - Redistributions of source code must retain the above copyright
10*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer.
11*a58d3d2aSXin Li 
12*a58d3d2aSXin Li    - Redistributions in binary form must reproduce the above copyright
13*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer in the
14*a58d3d2aSXin Li    documentation and/or other materials provided with the distribution.
15*a58d3d2aSXin Li 
16*a58d3d2aSXin Li    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17*a58d3d2aSXin Li    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18*a58d3d2aSXin Li    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19*a58d3d2aSXin Li    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20*a58d3d2aSXin Li    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21*a58d3d2aSXin Li    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22*a58d3d2aSXin Li    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23*a58d3d2aSXin Li    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24*a58d3d2aSXin Li    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25*a58d3d2aSXin Li    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26*a58d3d2aSXin Li    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*a58d3d2aSXin Li */
28*a58d3d2aSXin Li 
29*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
30*a58d3d2aSXin Li #include "config.h"
31*a58d3d2aSXin Li #endif
32*a58d3d2aSXin Li 
33*a58d3d2aSXin Li #include <stdio.h>
34*a58d3d2aSXin Li #include <string.h>
35*a58d3d2aSXin Li 
36*a58d3d2aSXin Li #ifndef CUSTOM_MODES
37*a58d3d2aSXin Li #define CUSTOM_MODES
38*a58d3d2aSXin Li #else
39*a58d3d2aSXin Li #define TEST_CUSTOM_MODES
40*a58d3d2aSXin Li #endif
41*a58d3d2aSXin Li 
42*a58d3d2aSXin Li #define CELT_C
43*a58d3d2aSXin Li #include "stack_alloc.h"
44*a58d3d2aSXin Li #include "entenc.c"
45*a58d3d2aSXin Li #include "entdec.c"
46*a58d3d2aSXin Li #include "entcode.c"
47*a58d3d2aSXin Li #include "cwrs.c"
48*a58d3d2aSXin Li #include "mathops.c"
49*a58d3d2aSXin Li #include "rate.h"
50*a58d3d2aSXin Li 
51*a58d3d2aSXin Li #define NMAX (240)
52*a58d3d2aSXin Li #define KMAX (128)
53*a58d3d2aSXin Li 
54*a58d3d2aSXin Li #ifdef TEST_CUSTOM_MODES
55*a58d3d2aSXin Li 
56*a58d3d2aSXin Li #define NDIMS (44)
57*a58d3d2aSXin Li static const int pn[NDIMS]={
58*a58d3d2aSXin Li    2,   3,   4,   5,   6,   7,   8,   9,  10,
59*a58d3d2aSXin Li   11,  12,  13,  14,  15,  16,  18,  20,  22,
60*a58d3d2aSXin Li   24,  26,  28,  30,  32,  36,  40,  44,  48,
61*a58d3d2aSXin Li   52,  56,  60,  64,  72,  80,  88,  96, 104,
62*a58d3d2aSXin Li  112, 120, 128, 144, 160, 176, 192, 208
63*a58d3d2aSXin Li };
64*a58d3d2aSXin Li static const int pkmax[NDIMS]={
65*a58d3d2aSXin Li  128, 128, 128, 128,  88,  52,  36,  26,  22,
66*a58d3d2aSXin Li   18,  16,  15,  13,  12,  12,  11,  10,   9,
67*a58d3d2aSXin Li    9,   8,   8,   7,   7,   7,   7,   6,   6,
68*a58d3d2aSXin Li    6,   6,   6,   5,   5,   5,   5,   5,   5,
69*a58d3d2aSXin Li    4,   4,   4,   4,   4,   4,   4,   4
70*a58d3d2aSXin Li };
71*a58d3d2aSXin Li 
72*a58d3d2aSXin Li #else /* TEST_CUSTOM_MODES */
73*a58d3d2aSXin Li 
74*a58d3d2aSXin Li #define NDIMS (22)
75*a58d3d2aSXin Li static const int pn[NDIMS]={
76*a58d3d2aSXin Li    2,   3,   4,   6,   8,   9,  11,  12,  16,
77*a58d3d2aSXin Li   18,  22,  24,  32,  36,  44,  48,  64,  72,
78*a58d3d2aSXin Li   88,  96, 144, 176
79*a58d3d2aSXin Li };
80*a58d3d2aSXin Li static const int pkmax[NDIMS]={
81*a58d3d2aSXin Li  128, 128, 128,  88,  36,  26,  18,  16,  12,
82*a58d3d2aSXin Li   11,   9,   9,   7,   7,   6,   6,   5,   5,
83*a58d3d2aSXin Li    5,   5,   4,   4
84*a58d3d2aSXin Li };
85*a58d3d2aSXin Li 
86*a58d3d2aSXin Li #endif
87*a58d3d2aSXin Li 
main(void)88*a58d3d2aSXin Li int main(void){
89*a58d3d2aSXin Li   int t;
90*a58d3d2aSXin Li   int n;
91*a58d3d2aSXin Li   ALLOC_STACK;
92*a58d3d2aSXin Li   for(t=0;t<NDIMS;t++){
93*a58d3d2aSXin Li     int pseudo;
94*a58d3d2aSXin Li     n=pn[t];
95*a58d3d2aSXin Li     for(pseudo=1;pseudo<41;pseudo++)
96*a58d3d2aSXin Li     {
97*a58d3d2aSXin Li       int k;
98*a58d3d2aSXin Li #if defined(SMALL_FOOTPRINT)
99*a58d3d2aSXin Li       opus_uint32 uu[KMAX+2U];
100*a58d3d2aSXin Li #endif
101*a58d3d2aSXin Li       opus_uint32 inc;
102*a58d3d2aSXin Li       opus_uint32 nc;
103*a58d3d2aSXin Li       opus_uint32 i;
104*a58d3d2aSXin Li       k=get_pulses(pseudo);
105*a58d3d2aSXin Li       if (k>pkmax[t])break;
106*a58d3d2aSXin Li       printf("Testing CWRS with N=%i, K=%i...\n",n,k);
107*a58d3d2aSXin Li #if defined(SMALL_FOOTPRINT)
108*a58d3d2aSXin Li       nc=ncwrs_urow(n,k,uu);
109*a58d3d2aSXin Li #else
110*a58d3d2aSXin Li       nc=CELT_PVQ_V(n,k);
111*a58d3d2aSXin Li #endif
112*a58d3d2aSXin Li       inc=nc/20000;
113*a58d3d2aSXin Li       if(inc<1)inc=1;
114*a58d3d2aSXin Li       for(i=0;i<nc;i+=inc){
115*a58d3d2aSXin Li #if defined(SMALL_FOOTPRINT)
116*a58d3d2aSXin Li         opus_uint32 u[KMAX+2U];
117*a58d3d2aSXin Li #endif
118*a58d3d2aSXin Li         int         y[NMAX];
119*a58d3d2aSXin Li         int         sy;
120*a58d3d2aSXin Li         opus_uint32 v;
121*a58d3d2aSXin Li         opus_uint32 ii;
122*a58d3d2aSXin Li         int         j;
123*a58d3d2aSXin Li #if defined(SMALL_FOOTPRINT)
124*a58d3d2aSXin Li         memcpy(u,uu,(k+2U)*sizeof(*u));
125*a58d3d2aSXin Li         cwrsi(n,k,i,y,u);
126*a58d3d2aSXin Li #else
127*a58d3d2aSXin Li         cwrsi(n,k,i,y);
128*a58d3d2aSXin Li #endif
129*a58d3d2aSXin Li         sy=0;
130*a58d3d2aSXin Li         for(j=0;j<n;j++)sy+=abs(y[j]);
131*a58d3d2aSXin Li         if(sy!=k){
132*a58d3d2aSXin Li           fprintf(stderr,"N=%d Pulse count mismatch in cwrsi (%d!=%d).\n",
133*a58d3d2aSXin Li            n,sy,k);
134*a58d3d2aSXin Li           return 99;
135*a58d3d2aSXin Li         }
136*a58d3d2aSXin Li         /*printf("%6u of %u:",i,nc);
137*a58d3d2aSXin Li         for(j=0;j<n;j++)printf(" %+3i",y[j]);
138*a58d3d2aSXin Li         printf(" ->");*/
139*a58d3d2aSXin Li #if defined(SMALL_FOOTPRINT)
140*a58d3d2aSXin Li         ii=icwrs(n,k,&v,y,u);
141*a58d3d2aSXin Li #else
142*a58d3d2aSXin Li         ii=icwrs(n,y);
143*a58d3d2aSXin Li         v=CELT_PVQ_V(n,k);
144*a58d3d2aSXin Li #endif
145*a58d3d2aSXin Li         if(ii!=i){
146*a58d3d2aSXin Li           fprintf(stderr,"Combination-index mismatch (%lu!=%lu).\n",
147*a58d3d2aSXin Li            (long)ii,(long)i);
148*a58d3d2aSXin Li           return 1;
149*a58d3d2aSXin Li         }
150*a58d3d2aSXin Li         if(v!=nc){
151*a58d3d2aSXin Li           fprintf(stderr,"Combination count mismatch (%lu!=%lu).\n",
152*a58d3d2aSXin Li            (long)v,(long)nc);
153*a58d3d2aSXin Li           return 2;
154*a58d3d2aSXin Li         }
155*a58d3d2aSXin Li         /*printf(" %6u\n",i);*/
156*a58d3d2aSXin Li       }
157*a58d3d2aSXin Li       /*printf("\n");*/
158*a58d3d2aSXin Li     }
159*a58d3d2aSXin Li   }
160*a58d3d2aSXin Li   RESTORE_STACK;
161*a58d3d2aSXin Li   return 0;
162*a58d3d2aSXin Li }
163