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