xref: /aosp_15_r20/external/libopus/celt/tests/test_unit_entropy.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /* Copyright (c) 2007-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 <stdlib.h>
34*a58d3d2aSXin Li #include <stdio.h>
35*a58d3d2aSXin Li #include <math.h>
36*a58d3d2aSXin Li #include <time.h>
37*a58d3d2aSXin Li #define CELT_C
38*a58d3d2aSXin Li #include "entcode.h"
39*a58d3d2aSXin Li #include "entenc.h"
40*a58d3d2aSXin Li #include "entdec.h"
41*a58d3d2aSXin Li #include <string.h>
42*a58d3d2aSXin Li 
43*a58d3d2aSXin Li #include "entenc.c"
44*a58d3d2aSXin Li #include "entdec.c"
45*a58d3d2aSXin Li #include "entcode.c"
46*a58d3d2aSXin Li 
47*a58d3d2aSXin Li #ifndef M_LOG2E
48*a58d3d2aSXin Li # define M_LOG2E    1.4426950408889634074
49*a58d3d2aSXin Li #endif
50*a58d3d2aSXin Li #define DATA_SIZE 10000000
51*a58d3d2aSXin Li #define DATA_SIZE2 10000
52*a58d3d2aSXin Li 
main(int _argc,char ** _argv)53*a58d3d2aSXin Li int main(int _argc,char **_argv){
54*a58d3d2aSXin Li   ec_enc         enc;
55*a58d3d2aSXin Li   ec_dec         dec;
56*a58d3d2aSXin Li   long           nbits;
57*a58d3d2aSXin Li   long           nbits2;
58*a58d3d2aSXin Li   double         entropy;
59*a58d3d2aSXin Li   int            ft;
60*a58d3d2aSXin Li   int            ftb;
61*a58d3d2aSXin Li   int            sz;
62*a58d3d2aSXin Li   int            i;
63*a58d3d2aSXin Li   int            ret;
64*a58d3d2aSXin Li   unsigned int   sym;
65*a58d3d2aSXin Li   unsigned int   seed;
66*a58d3d2aSXin Li   unsigned char *ptr;
67*a58d3d2aSXin Li   const char    *env_seed;
68*a58d3d2aSXin Li   ret=0;
69*a58d3d2aSXin Li   entropy=0;
70*a58d3d2aSXin Li   if (_argc > 2) {
71*a58d3d2aSXin Li     fprintf(stderr, "Usage: %s [<seed>]\n", _argv[0]);
72*a58d3d2aSXin Li     return 1;
73*a58d3d2aSXin Li   }
74*a58d3d2aSXin Li   env_seed = getenv("SEED");
75*a58d3d2aSXin Li   if (_argc > 1)
76*a58d3d2aSXin Li     seed = atoi(_argv[1]);
77*a58d3d2aSXin Li   else if (env_seed)
78*a58d3d2aSXin Li     seed = atoi(env_seed);
79*a58d3d2aSXin Li   else
80*a58d3d2aSXin Li     seed = time(NULL);
81*a58d3d2aSXin Li   /*Testing encoding of raw bit values.*/
82*a58d3d2aSXin Li   ptr = (unsigned char *)malloc(DATA_SIZE);
83*a58d3d2aSXin Li   ec_enc_init(&enc,ptr, DATA_SIZE);
84*a58d3d2aSXin Li   for(ft=2;ft<1024;ft++){
85*a58d3d2aSXin Li     for(i=0;i<ft;i++){
86*a58d3d2aSXin Li       entropy+=log(ft)*M_LOG2E;
87*a58d3d2aSXin Li       ec_enc_uint(&enc,i,ft);
88*a58d3d2aSXin Li     }
89*a58d3d2aSXin Li   }
90*a58d3d2aSXin Li   /*Testing encoding of raw bit values.*/
91*a58d3d2aSXin Li   for(ftb=1;ftb<16;ftb++){
92*a58d3d2aSXin Li     for(i=0;i<(1<<ftb);i++){
93*a58d3d2aSXin Li       entropy+=ftb;
94*a58d3d2aSXin Li       nbits=ec_tell(&enc);
95*a58d3d2aSXin Li       ec_enc_bits(&enc,i,ftb);
96*a58d3d2aSXin Li       nbits2=ec_tell(&enc);
97*a58d3d2aSXin Li       if(nbits2-nbits!=ftb){
98*a58d3d2aSXin Li         fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
99*a58d3d2aSXin Li          nbits2-nbits,ftb);
100*a58d3d2aSXin Li         ret=-1;
101*a58d3d2aSXin Li       }
102*a58d3d2aSXin Li     }
103*a58d3d2aSXin Li   }
104*a58d3d2aSXin Li   nbits=ec_tell_frac(&enc);
105*a58d3d2aSXin Li   ec_enc_done(&enc);
106*a58d3d2aSXin Li   fprintf(stderr,
107*a58d3d2aSXin Li    "Encoded %0.2f bits of entropy to %0.2f bits (%0.3f%% wasted).\n",
108*a58d3d2aSXin Li    entropy,ldexp(nbits,-3),100*(nbits-ldexp(entropy,3))/nbits);
109*a58d3d2aSXin Li   fprintf(stderr,"Packed to %li bytes.\n",(long)ec_range_bytes(&enc));
110*a58d3d2aSXin Li   ec_dec_init(&dec,ptr,DATA_SIZE);
111*a58d3d2aSXin Li   for(ft=2;ft<1024;ft++){
112*a58d3d2aSXin Li     for(i=0;i<ft;i++){
113*a58d3d2aSXin Li       sym=ec_dec_uint(&dec,ft);
114*a58d3d2aSXin Li       if(sym!=(unsigned)i){
115*a58d3d2aSXin Li         fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
116*a58d3d2aSXin Li         ret=-1;
117*a58d3d2aSXin Li       }
118*a58d3d2aSXin Li     }
119*a58d3d2aSXin Li   }
120*a58d3d2aSXin Li   for(ftb=1;ftb<16;ftb++){
121*a58d3d2aSXin Li     for(i=0;i<(1<<ftb);i++){
122*a58d3d2aSXin Li       sym=ec_dec_bits(&dec,ftb);
123*a58d3d2aSXin Li       if(sym!=(unsigned)i){
124*a58d3d2aSXin Li         fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
125*a58d3d2aSXin Li         ret=-1;
126*a58d3d2aSXin Li       }
127*a58d3d2aSXin Li     }
128*a58d3d2aSXin Li   }
129*a58d3d2aSXin Li   nbits2=ec_tell_frac(&dec);
130*a58d3d2aSXin Li   if(nbits!=nbits2){
131*a58d3d2aSXin Li     fprintf(stderr,
132*a58d3d2aSXin Li      "Reported number of bits used was %0.2f, should be %0.2f.\n",
133*a58d3d2aSXin Li      ldexp(nbits2,-3),ldexp(nbits,-3));
134*a58d3d2aSXin Li     ret=-1;
135*a58d3d2aSXin Li   }
136*a58d3d2aSXin Li   /*Testing an encoder bust prefers range coder data over raw bits.
137*a58d3d2aSXin Li     This isn't a general guarantee, will only work for data that is buffered in
138*a58d3d2aSXin Li      the encoder state and not yet stored in the user buffer, and should never
139*a58d3d2aSXin Li      get used in practice.
140*a58d3d2aSXin Li     It's mostly here for code coverage completeness.*/
141*a58d3d2aSXin Li   /*Start with a 16-bit buffer.*/
142*a58d3d2aSXin Li   ec_enc_init(&enc,ptr,2);
143*a58d3d2aSXin Li   /*Write 7 raw bits.*/
144*a58d3d2aSXin Li   ec_enc_bits(&enc,0x55,7);
145*a58d3d2aSXin Li   /*Write 12.3 bits of range coder data.*/
146*a58d3d2aSXin Li   ec_enc_uint(&enc,1,2);
147*a58d3d2aSXin Li   ec_enc_uint(&enc,1,3);
148*a58d3d2aSXin Li   ec_enc_uint(&enc,1,4);
149*a58d3d2aSXin Li   ec_enc_uint(&enc,1,5);
150*a58d3d2aSXin Li   ec_enc_uint(&enc,2,6);
151*a58d3d2aSXin Li   ec_enc_uint(&enc,6,7);
152*a58d3d2aSXin Li   ec_enc_done(&enc);
153*a58d3d2aSXin Li   ec_dec_init(&dec,ptr,2);
154*a58d3d2aSXin Li   if(!enc.error
155*a58d3d2aSXin Li    /*The raw bits should have been overwritten by the range coder data.*/
156*a58d3d2aSXin Li    ||ec_dec_bits(&dec,7)!=0x05
157*a58d3d2aSXin Li    /*And all the range coder data should have been encoded correctly.*/
158*a58d3d2aSXin Li    ||ec_dec_uint(&dec,2)!=1
159*a58d3d2aSXin Li    ||ec_dec_uint(&dec,3)!=1
160*a58d3d2aSXin Li    ||ec_dec_uint(&dec,4)!=1
161*a58d3d2aSXin Li    ||ec_dec_uint(&dec,5)!=1
162*a58d3d2aSXin Li    ||ec_dec_uint(&dec,6)!=2
163*a58d3d2aSXin Li    ||ec_dec_uint(&dec,7)!=6){
164*a58d3d2aSXin Li     fprintf(stderr,"Encoder bust overwrote range coder data with raw bits.\n");
165*a58d3d2aSXin Li     ret=-1;
166*a58d3d2aSXin Li   }
167*a58d3d2aSXin Li   srand(seed);
168*a58d3d2aSXin Li   fprintf(stderr,"Testing random streams... Random seed: %u (%.4X)\n", seed, rand() % 65536);
169*a58d3d2aSXin Li   for(i=0;i<409600;i++){
170*a58d3d2aSXin Li     unsigned *data;
171*a58d3d2aSXin Li     unsigned *tell;
172*a58d3d2aSXin Li     unsigned tell_bits;
173*a58d3d2aSXin Li     int       j;
174*a58d3d2aSXin Li     int zeros;
175*a58d3d2aSXin Li     ft=rand()/((RAND_MAX>>(rand()%11U))+1U)+10;
176*a58d3d2aSXin Li     sz=rand()/((RAND_MAX>>(rand()%9U))+1U);
177*a58d3d2aSXin Li     data=(unsigned *)malloc(sz*sizeof(*data));
178*a58d3d2aSXin Li     tell=(unsigned *)malloc((sz+1)*sizeof(*tell));
179*a58d3d2aSXin Li     ec_enc_init(&enc,ptr,DATA_SIZE2);
180*a58d3d2aSXin Li     zeros = rand()%13==0;
181*a58d3d2aSXin Li     tell[0]=ec_tell_frac(&enc);
182*a58d3d2aSXin Li     for(j=0;j<sz;j++){
183*a58d3d2aSXin Li       if (zeros)
184*a58d3d2aSXin Li         data[j]=0;
185*a58d3d2aSXin Li       else
186*a58d3d2aSXin Li         data[j]=rand()%ft;
187*a58d3d2aSXin Li       ec_enc_uint(&enc,data[j],ft);
188*a58d3d2aSXin Li       tell[j+1]=ec_tell_frac(&enc);
189*a58d3d2aSXin Li     }
190*a58d3d2aSXin Li     if (rand()%2==0)
191*a58d3d2aSXin Li       while(ec_tell(&enc)%8 != 0)
192*a58d3d2aSXin Li         ec_enc_uint(&enc, rand()%2, 2);
193*a58d3d2aSXin Li     tell_bits = ec_tell(&enc);
194*a58d3d2aSXin Li     ec_enc_done(&enc);
195*a58d3d2aSXin Li     if(tell_bits!=(unsigned)ec_tell(&enc)){
196*a58d3d2aSXin Li       fprintf(stderr,"ec_tell() changed after ec_enc_done(): %i instead of %i (Random seed: %u)\n",
197*a58d3d2aSXin Li        ec_tell(&enc),tell_bits,seed);
198*a58d3d2aSXin Li       ret=-1;
199*a58d3d2aSXin Li     }
200*a58d3d2aSXin Li     if ((tell_bits+7)/8 < ec_range_bytes(&enc))
201*a58d3d2aSXin Li     {
202*a58d3d2aSXin Li       fprintf (stderr, "ec_tell() lied, there's %i bytes instead of %d (Random seed: %u)\n",
203*a58d3d2aSXin Li                ec_range_bytes(&enc), (tell_bits+7)/8,seed);
204*a58d3d2aSXin Li       ret=-1;
205*a58d3d2aSXin Li     }
206*a58d3d2aSXin Li     ec_dec_init(&dec,ptr,DATA_SIZE2);
207*a58d3d2aSXin Li     if(ec_tell_frac(&dec)!=tell[0]){
208*a58d3d2aSXin Li       fprintf(stderr,
209*a58d3d2aSXin Li        "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
210*a58d3d2aSXin Li        0,ec_tell_frac(&dec),tell[0],seed);
211*a58d3d2aSXin Li     }
212*a58d3d2aSXin Li     for(j=0;j<sz;j++){
213*a58d3d2aSXin Li       sym=ec_dec_uint(&dec,ft);
214*a58d3d2aSXin Li       if(sym!=data[j]){
215*a58d3d2aSXin Li         fprintf(stderr,
216*a58d3d2aSXin Li          "Decoded %i instead of %i with ft of %i at position %i of %i (Random seed: %u).\n",
217*a58d3d2aSXin Li          sym,data[j],ft,j,sz,seed);
218*a58d3d2aSXin Li         ret=-1;
219*a58d3d2aSXin Li       }
220*a58d3d2aSXin Li       if(ec_tell_frac(&dec)!=tell[j+1]){
221*a58d3d2aSXin Li         fprintf(stderr,
222*a58d3d2aSXin Li          "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
223*a58d3d2aSXin Li          j+1,ec_tell_frac(&dec),tell[j+1],seed);
224*a58d3d2aSXin Li       }
225*a58d3d2aSXin Li     }
226*a58d3d2aSXin Li     free(tell);
227*a58d3d2aSXin Li     free(data);
228*a58d3d2aSXin Li   }
229*a58d3d2aSXin Li   /*Test compatibility between multiple different encode/decode routines.*/
230*a58d3d2aSXin Li   for(i=0;i<409600;i++){
231*a58d3d2aSXin Li     unsigned *logp1;
232*a58d3d2aSXin Li     unsigned *data;
233*a58d3d2aSXin Li     unsigned *tell;
234*a58d3d2aSXin Li     unsigned *enc_method;
235*a58d3d2aSXin Li     int       j;
236*a58d3d2aSXin Li     sz=rand()/((RAND_MAX>>(rand()%9U))+1U);
237*a58d3d2aSXin Li     logp1=(unsigned *)malloc(sz*sizeof(*logp1));
238*a58d3d2aSXin Li     data=(unsigned *)malloc(sz*sizeof(*data));
239*a58d3d2aSXin Li     tell=(unsigned *)malloc((sz+1)*sizeof(*tell));
240*a58d3d2aSXin Li     enc_method=(unsigned *)malloc(sz*sizeof(*enc_method));
241*a58d3d2aSXin Li     ec_enc_init(&enc,ptr,DATA_SIZE2);
242*a58d3d2aSXin Li     tell[0]=ec_tell_frac(&enc);
243*a58d3d2aSXin Li     for(j=0;j<sz;j++){
244*a58d3d2aSXin Li       data[j]=rand()/((RAND_MAX>>1)+1);
245*a58d3d2aSXin Li       logp1[j]=(rand()%15)+1;
246*a58d3d2aSXin Li       enc_method[j]=rand()/((RAND_MAX>>2)+1);
247*a58d3d2aSXin Li       switch(enc_method[j]){
248*a58d3d2aSXin Li         case 0:{
249*a58d3d2aSXin Li           ec_encode(&enc,data[j]?(1<<logp1[j])-1:0,
250*a58d3d2aSXin Li            (1<<logp1[j])-(data[j]?0:1),1<<logp1[j]);
251*a58d3d2aSXin Li         }break;
252*a58d3d2aSXin Li         case 1:{
253*a58d3d2aSXin Li           ec_encode_bin(&enc,data[j]?(1<<logp1[j])-1:0,
254*a58d3d2aSXin Li            (1<<logp1[j])-(data[j]?0:1),logp1[j]);
255*a58d3d2aSXin Li         }break;
256*a58d3d2aSXin Li         case 2:{
257*a58d3d2aSXin Li           ec_enc_bit_logp(&enc,data[j],logp1[j]);
258*a58d3d2aSXin Li         }break;
259*a58d3d2aSXin Li         case 3:{
260*a58d3d2aSXin Li           unsigned char icdf[2];
261*a58d3d2aSXin Li           icdf[0]=1;
262*a58d3d2aSXin Li           icdf[1]=0;
263*a58d3d2aSXin Li           ec_enc_icdf(&enc,data[j],icdf,logp1[j]);
264*a58d3d2aSXin Li         }break;
265*a58d3d2aSXin Li       }
266*a58d3d2aSXin Li       tell[j+1]=ec_tell_frac(&enc);
267*a58d3d2aSXin Li     }
268*a58d3d2aSXin Li     ec_enc_done(&enc);
269*a58d3d2aSXin Li     if((ec_tell(&enc)+7U)/8U<ec_range_bytes(&enc)){
270*a58d3d2aSXin Li       fprintf(stderr,"tell() lied, there's %i bytes instead of %d (Random seed: %u)\n",
271*a58d3d2aSXin Li        ec_range_bytes(&enc),(ec_tell(&enc)+7)/8,seed);
272*a58d3d2aSXin Li       ret=-1;
273*a58d3d2aSXin Li     }
274*a58d3d2aSXin Li     ec_dec_init(&dec,ptr,DATA_SIZE2);
275*a58d3d2aSXin Li     if(ec_tell_frac(&dec)!=tell[0]){
276*a58d3d2aSXin Li       fprintf(stderr,
277*a58d3d2aSXin Li        "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
278*a58d3d2aSXin Li        0,ec_tell_frac(&dec),tell[0],seed);
279*a58d3d2aSXin Li     }
280*a58d3d2aSXin Li     for(j=0;j<sz;j++){
281*a58d3d2aSXin Li       int fs;
282*a58d3d2aSXin Li       int dec_method;
283*a58d3d2aSXin Li       dec_method=rand()/((RAND_MAX>>2)+1);
284*a58d3d2aSXin Li       switch(dec_method){
285*a58d3d2aSXin Li         case 0:{
286*a58d3d2aSXin Li           fs=ec_decode(&dec,1<<logp1[j]);
287*a58d3d2aSXin Li           sym=fs>=(1<<logp1[j])-1;
288*a58d3d2aSXin Li           ec_dec_update(&dec,sym?(1<<logp1[j])-1:0,
289*a58d3d2aSXin Li            (1<<logp1[j])-(sym?0:1),1<<logp1[j]);
290*a58d3d2aSXin Li         }break;
291*a58d3d2aSXin Li         case 1:{
292*a58d3d2aSXin Li           fs=ec_decode_bin(&dec,logp1[j]);
293*a58d3d2aSXin Li           sym=fs>=(1<<logp1[j])-1;
294*a58d3d2aSXin Li           ec_dec_update(&dec,sym?(1<<logp1[j])-1:0,
295*a58d3d2aSXin Li            (1<<logp1[j])-(sym?0:1),1<<logp1[j]);
296*a58d3d2aSXin Li         }break;
297*a58d3d2aSXin Li         case 2:{
298*a58d3d2aSXin Li           sym=ec_dec_bit_logp(&dec,logp1[j]);
299*a58d3d2aSXin Li         }break;
300*a58d3d2aSXin Li         case 3:{
301*a58d3d2aSXin Li           unsigned char icdf[2];
302*a58d3d2aSXin Li           icdf[0]=1;
303*a58d3d2aSXin Li           icdf[1]=0;
304*a58d3d2aSXin Li           sym=ec_dec_icdf(&dec,icdf,logp1[j]);
305*a58d3d2aSXin Li         }break;
306*a58d3d2aSXin Li       }
307*a58d3d2aSXin Li       if(sym!=data[j]){
308*a58d3d2aSXin Li         fprintf(stderr,
309*a58d3d2aSXin Li          "Decoded %i instead of %i with logp1 of %i at position %i of %i (Random seed: %u).\n",
310*a58d3d2aSXin Li          sym,data[j],logp1[j],j,sz,seed);
311*a58d3d2aSXin Li         fprintf(stderr,"Encoding method: %i, decoding method: %i\n",
312*a58d3d2aSXin Li          enc_method[j],dec_method);
313*a58d3d2aSXin Li         ret=-1;
314*a58d3d2aSXin Li       }
315*a58d3d2aSXin Li       if(ec_tell_frac(&dec)!=tell[j+1]){
316*a58d3d2aSXin Li         fprintf(stderr,
317*a58d3d2aSXin Li          "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
318*a58d3d2aSXin Li          j+1,ec_tell_frac(&dec),tell[j+1],seed);
319*a58d3d2aSXin Li       }
320*a58d3d2aSXin Li     }
321*a58d3d2aSXin Li     free(enc_method);
322*a58d3d2aSXin Li     free(tell);
323*a58d3d2aSXin Li     free(data);
324*a58d3d2aSXin Li     free(logp1);
325*a58d3d2aSXin Li   }
326*a58d3d2aSXin Li   ec_enc_init(&enc,ptr,DATA_SIZE2);
327*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,1);
328*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,1);
329*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,1);
330*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,1);
331*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,2);
332*a58d3d2aSXin Li   ec_enc_patch_initial_bits(&enc,3,2);
333*a58d3d2aSXin Li   if(enc.error){
334*a58d3d2aSXin Li     fprintf(stderr,"patch_initial_bits failed");
335*a58d3d2aSXin Li     ret=-1;
336*a58d3d2aSXin Li   }
337*a58d3d2aSXin Li   ec_enc_patch_initial_bits(&enc,0,5);
338*a58d3d2aSXin Li   if(!enc.error){
339*a58d3d2aSXin Li     fprintf(stderr,"patch_initial_bits didn't fail when it should have");
340*a58d3d2aSXin Li     ret=-1;
341*a58d3d2aSXin Li   }
342*a58d3d2aSXin Li   ec_enc_done(&enc);
343*a58d3d2aSXin Li   if(ec_range_bytes(&enc)!=1||ptr[0]!=192){
344*a58d3d2aSXin Li     fprintf(stderr,"Got %d when expecting 192 for patch_initial_bits",ptr[0]);
345*a58d3d2aSXin Li     ret=-1;
346*a58d3d2aSXin Li   }
347*a58d3d2aSXin Li   ec_enc_init(&enc,ptr,DATA_SIZE2);
348*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,1);
349*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,1);
350*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,1,6);
351*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,2);
352*a58d3d2aSXin Li   ec_enc_patch_initial_bits(&enc,0,2);
353*a58d3d2aSXin Li   if(enc.error){
354*a58d3d2aSXin Li     fprintf(stderr,"patch_initial_bits failed");
355*a58d3d2aSXin Li     ret=-1;
356*a58d3d2aSXin Li   }
357*a58d3d2aSXin Li   ec_enc_done(&enc);
358*a58d3d2aSXin Li   if(ec_range_bytes(&enc)!=2||ptr[0]!=63){
359*a58d3d2aSXin Li     fprintf(stderr,"Got %d when expecting 63 for patch_initial_bits",ptr[0]);
360*a58d3d2aSXin Li     ret=-1;
361*a58d3d2aSXin Li   }
362*a58d3d2aSXin Li   ec_enc_init(&enc,ptr,2);
363*a58d3d2aSXin Li   ec_enc_bit_logp(&enc,0,2);
364*a58d3d2aSXin Li   for(i=0;i<48;i++){
365*a58d3d2aSXin Li     ec_enc_bits(&enc,0,1);
366*a58d3d2aSXin Li   }
367*a58d3d2aSXin Li   ec_enc_done(&enc);
368*a58d3d2aSXin Li   if(!enc.error){
369*a58d3d2aSXin Li     fprintf(stderr,"Raw bits overfill didn't fail when it should have");
370*a58d3d2aSXin Li     ret=-1;
371*a58d3d2aSXin Li   }
372*a58d3d2aSXin Li   ec_enc_init(&enc,ptr,2);
373*a58d3d2aSXin Li   for(i=0;i<17;i++){
374*a58d3d2aSXin Li     ec_enc_bits(&enc,0,1);
375*a58d3d2aSXin Li   }
376*a58d3d2aSXin Li   ec_enc_done(&enc);
377*a58d3d2aSXin Li   if(!enc.error){
378*a58d3d2aSXin Li     fprintf(stderr,"17 raw bits encoded in two bytes");
379*a58d3d2aSXin Li     ret=-1;
380*a58d3d2aSXin Li   }
381*a58d3d2aSXin Li   free(ptr);
382*a58d3d2aSXin Li   return ret;
383*a58d3d2aSXin Li }
384