cannam@154
|
1 /* Copyright (c) 2007-2011 Xiph.Org Foundation, Mozilla Corporation,
|
cannam@154
|
2 Gregory Maxwell
|
cannam@154
|
3 Written by Jean-Marc Valin, Gregory Maxwell, and Timothy B. Terriberry */
|
cannam@154
|
4 /*
|
cannam@154
|
5 Redistribution and use in source and binary forms, with or without
|
cannam@154
|
6 modification, are permitted provided that the following conditions
|
cannam@154
|
7 are met:
|
cannam@154
|
8
|
cannam@154
|
9 - Redistributions of source code must retain the above copyright
|
cannam@154
|
10 notice, this list of conditions and the following disclaimer.
|
cannam@154
|
11
|
cannam@154
|
12 - Redistributions in binary form must reproduce the above copyright
|
cannam@154
|
13 notice, this list of conditions and the following disclaimer in the
|
cannam@154
|
14 documentation and/or other materials provided with the distribution.
|
cannam@154
|
15
|
cannam@154
|
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
cannam@154
|
17 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
cannam@154
|
18 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
cannam@154
|
19 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
cannam@154
|
20 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
cannam@154
|
21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
cannam@154
|
22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
cannam@154
|
23 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
cannam@154
|
24 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
cannam@154
|
25 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
cannam@154
|
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
cannam@154
|
27 */
|
cannam@154
|
28
|
cannam@154
|
29 #ifdef HAVE_CONFIG_H
|
cannam@154
|
30 #include "config.h"
|
cannam@154
|
31 #endif
|
cannam@154
|
32
|
cannam@154
|
33 #include <stdlib.h>
|
cannam@154
|
34 #include <stdio.h>
|
cannam@154
|
35 #include <math.h>
|
cannam@154
|
36 #include <time.h>
|
cannam@154
|
37 #define CELT_C
|
cannam@154
|
38 #include "entcode.h"
|
cannam@154
|
39 #include "entenc.h"
|
cannam@154
|
40 #include "entdec.h"
|
cannam@154
|
41 #include <string.h>
|
cannam@154
|
42
|
cannam@154
|
43 #include "entenc.c"
|
cannam@154
|
44 #include "entdec.c"
|
cannam@154
|
45 #include "entcode.c"
|
cannam@154
|
46
|
cannam@154
|
47 #ifndef M_LOG2E
|
cannam@154
|
48 # define M_LOG2E 1.4426950408889634074
|
cannam@154
|
49 #endif
|
cannam@154
|
50 #define DATA_SIZE 10000000
|
cannam@154
|
51 #define DATA_SIZE2 10000
|
cannam@154
|
52
|
cannam@154
|
53 int main(int _argc,char **_argv){
|
cannam@154
|
54 ec_enc enc;
|
cannam@154
|
55 ec_dec dec;
|
cannam@154
|
56 long nbits;
|
cannam@154
|
57 long nbits2;
|
cannam@154
|
58 double entropy;
|
cannam@154
|
59 int ft;
|
cannam@154
|
60 int ftb;
|
cannam@154
|
61 int sz;
|
cannam@154
|
62 int i;
|
cannam@154
|
63 int ret;
|
cannam@154
|
64 unsigned int sym;
|
cannam@154
|
65 unsigned int seed;
|
cannam@154
|
66 unsigned char *ptr;
|
cannam@154
|
67 const char *env_seed;
|
cannam@154
|
68 ret=0;
|
cannam@154
|
69 entropy=0;
|
cannam@154
|
70 if (_argc > 2) {
|
cannam@154
|
71 fprintf(stderr, "Usage: %s [<seed>]\n", _argv[0]);
|
cannam@154
|
72 return 1;
|
cannam@154
|
73 }
|
cannam@154
|
74 env_seed = getenv("SEED");
|
cannam@154
|
75 if (_argc > 1)
|
cannam@154
|
76 seed = atoi(_argv[1]);
|
cannam@154
|
77 else if (env_seed)
|
cannam@154
|
78 seed = atoi(env_seed);
|
cannam@154
|
79 else
|
cannam@154
|
80 seed = time(NULL);
|
cannam@154
|
81 /*Testing encoding of raw bit values.*/
|
cannam@154
|
82 ptr = (unsigned char *)malloc(DATA_SIZE);
|
cannam@154
|
83 ec_enc_init(&enc,ptr, DATA_SIZE);
|
cannam@154
|
84 for(ft=2;ft<1024;ft++){
|
cannam@154
|
85 for(i=0;i<ft;i++){
|
cannam@154
|
86 entropy+=log(ft)*M_LOG2E;
|
cannam@154
|
87 ec_enc_uint(&enc,i,ft);
|
cannam@154
|
88 }
|
cannam@154
|
89 }
|
cannam@154
|
90 /*Testing encoding of raw bit values.*/
|
cannam@154
|
91 for(ftb=1;ftb<16;ftb++){
|
cannam@154
|
92 for(i=0;i<(1<<ftb);i++){
|
cannam@154
|
93 entropy+=ftb;
|
cannam@154
|
94 nbits=ec_tell(&enc);
|
cannam@154
|
95 ec_enc_bits(&enc,i,ftb);
|
cannam@154
|
96 nbits2=ec_tell(&enc);
|
cannam@154
|
97 if(nbits2-nbits!=ftb){
|
cannam@154
|
98 fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
|
cannam@154
|
99 nbits2-nbits,ftb);
|
cannam@154
|
100 ret=-1;
|
cannam@154
|
101 }
|
cannam@154
|
102 }
|
cannam@154
|
103 }
|
cannam@154
|
104 nbits=ec_tell_frac(&enc);
|
cannam@154
|
105 ec_enc_done(&enc);
|
cannam@154
|
106 fprintf(stderr,
|
cannam@154
|
107 "Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
|
cannam@154
|
108 entropy,ldexp(nbits,-3),100*(nbits-ldexp(entropy,3))/nbits);
|
cannam@154
|
109 fprintf(stderr,"Packed to %li bytes.\n",(long)ec_range_bytes(&enc));
|
cannam@154
|
110 ec_dec_init(&dec,ptr,DATA_SIZE);
|
cannam@154
|
111 for(ft=2;ft<1024;ft++){
|
cannam@154
|
112 for(i=0;i<ft;i++){
|
cannam@154
|
113 sym=ec_dec_uint(&dec,ft);
|
cannam@154
|
114 if(sym!=(unsigned)i){
|
cannam@154
|
115 fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
|
cannam@154
|
116 ret=-1;
|
cannam@154
|
117 }
|
cannam@154
|
118 }
|
cannam@154
|
119 }
|
cannam@154
|
120 for(ftb=1;ftb<16;ftb++){
|
cannam@154
|
121 for(i=0;i<(1<<ftb);i++){
|
cannam@154
|
122 sym=ec_dec_bits(&dec,ftb);
|
cannam@154
|
123 if(sym!=(unsigned)i){
|
cannam@154
|
124 fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
|
cannam@154
|
125 ret=-1;
|
cannam@154
|
126 }
|
cannam@154
|
127 }
|
cannam@154
|
128 }
|
cannam@154
|
129 nbits2=ec_tell_frac(&dec);
|
cannam@154
|
130 if(nbits!=nbits2){
|
cannam@154
|
131 fprintf(stderr,
|
cannam@154
|
132 "Reported number of bits used was %0.2lf, should be %0.2lf.\n",
|
cannam@154
|
133 ldexp(nbits2,-3),ldexp(nbits,-3));
|
cannam@154
|
134 ret=-1;
|
cannam@154
|
135 }
|
cannam@154
|
136 /*Testing an encoder bust prefers range coder data over raw bits.
|
cannam@154
|
137 This isn't a general guarantee, will only work for data that is buffered in
|
cannam@154
|
138 the encoder state and not yet stored in the user buffer, and should never
|
cannam@154
|
139 get used in practice.
|
cannam@154
|
140 It's mostly here for code coverage completeness.*/
|
cannam@154
|
141 /*Start with a 16-bit buffer.*/
|
cannam@154
|
142 ec_enc_init(&enc,ptr,2);
|
cannam@154
|
143 /*Write 7 raw bits.*/
|
cannam@154
|
144 ec_enc_bits(&enc,0x55,7);
|
cannam@154
|
145 /*Write 12.3 bits of range coder data.*/
|
cannam@154
|
146 ec_enc_uint(&enc,1,2);
|
cannam@154
|
147 ec_enc_uint(&enc,1,3);
|
cannam@154
|
148 ec_enc_uint(&enc,1,4);
|
cannam@154
|
149 ec_enc_uint(&enc,1,5);
|
cannam@154
|
150 ec_enc_uint(&enc,2,6);
|
cannam@154
|
151 ec_enc_uint(&enc,6,7);
|
cannam@154
|
152 ec_enc_done(&enc);
|
cannam@154
|
153 ec_dec_init(&dec,ptr,2);
|
cannam@154
|
154 if(!enc.error
|
cannam@154
|
155 /*The raw bits should have been overwritten by the range coder data.*/
|
cannam@154
|
156 ||ec_dec_bits(&dec,7)!=0x05
|
cannam@154
|
157 /*And all the range coder data should have been encoded correctly.*/
|
cannam@154
|
158 ||ec_dec_uint(&dec,2)!=1
|
cannam@154
|
159 ||ec_dec_uint(&dec,3)!=1
|
cannam@154
|
160 ||ec_dec_uint(&dec,4)!=1
|
cannam@154
|
161 ||ec_dec_uint(&dec,5)!=1
|
cannam@154
|
162 ||ec_dec_uint(&dec,6)!=2
|
cannam@154
|
163 ||ec_dec_uint(&dec,7)!=6){
|
cannam@154
|
164 fprintf(stderr,"Encoder bust overwrote range coder data with raw bits.\n");
|
cannam@154
|
165 ret=-1;
|
cannam@154
|
166 }
|
cannam@154
|
167 srand(seed);
|
cannam@154
|
168 fprintf(stderr,"Testing random streams... Random seed: %u (%.4X)\n", seed, rand() % 65536);
|
cannam@154
|
169 for(i=0;i<409600;i++){
|
cannam@154
|
170 unsigned *data;
|
cannam@154
|
171 unsigned *tell;
|
cannam@154
|
172 unsigned tell_bits;
|
cannam@154
|
173 int j;
|
cannam@154
|
174 int zeros;
|
cannam@154
|
175 ft=rand()/((RAND_MAX>>(rand()%11U))+1U)+10;
|
cannam@154
|
176 sz=rand()/((RAND_MAX>>(rand()%9U))+1U);
|
cannam@154
|
177 data=(unsigned *)malloc(sz*sizeof(*data));
|
cannam@154
|
178 tell=(unsigned *)malloc((sz+1)*sizeof(*tell));
|
cannam@154
|
179 ec_enc_init(&enc,ptr,DATA_SIZE2);
|
cannam@154
|
180 zeros = rand()%13==0;
|
cannam@154
|
181 tell[0]=ec_tell_frac(&enc);
|
cannam@154
|
182 for(j=0;j<sz;j++){
|
cannam@154
|
183 if (zeros)
|
cannam@154
|
184 data[j]=0;
|
cannam@154
|
185 else
|
cannam@154
|
186 data[j]=rand()%ft;
|
cannam@154
|
187 ec_enc_uint(&enc,data[j],ft);
|
cannam@154
|
188 tell[j+1]=ec_tell_frac(&enc);
|
cannam@154
|
189 }
|
cannam@154
|
190 if (rand()%2==0)
|
cannam@154
|
191 while(ec_tell(&enc)%8 != 0)
|
cannam@154
|
192 ec_enc_uint(&enc, rand()%2, 2);
|
cannam@154
|
193 tell_bits = ec_tell(&enc);
|
cannam@154
|
194 ec_enc_done(&enc);
|
cannam@154
|
195 if(tell_bits!=(unsigned)ec_tell(&enc)){
|
cannam@154
|
196 fprintf(stderr,"ec_tell() changed after ec_enc_done(): %i instead of %i (Random seed: %u)\n",
|
cannam@154
|
197 ec_tell(&enc),tell_bits,seed);
|
cannam@154
|
198 ret=-1;
|
cannam@154
|
199 }
|
cannam@154
|
200 if ((tell_bits+7)/8 < ec_range_bytes(&enc))
|
cannam@154
|
201 {
|
cannam@154
|
202 fprintf (stderr, "ec_tell() lied, there's %i bytes instead of %d (Random seed: %u)\n",
|
cannam@154
|
203 ec_range_bytes(&enc), (tell_bits+7)/8,seed);
|
cannam@154
|
204 ret=-1;
|
cannam@154
|
205 }
|
cannam@154
|
206 ec_dec_init(&dec,ptr,DATA_SIZE2);
|
cannam@154
|
207 if(ec_tell_frac(&dec)!=tell[0]){
|
cannam@154
|
208 fprintf(stderr,
|
cannam@154
|
209 "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
cannam@154
|
210 0,ec_tell_frac(&dec),tell[0],seed);
|
cannam@154
|
211 }
|
cannam@154
|
212 for(j=0;j<sz;j++){
|
cannam@154
|
213 sym=ec_dec_uint(&dec,ft);
|
cannam@154
|
214 if(sym!=data[j]){
|
cannam@154
|
215 fprintf(stderr,
|
cannam@154
|
216 "Decoded %i instead of %i with ft of %i at position %i of %i (Random seed: %u).\n",
|
cannam@154
|
217 sym,data[j],ft,j,sz,seed);
|
cannam@154
|
218 ret=-1;
|
cannam@154
|
219 }
|
cannam@154
|
220 if(ec_tell_frac(&dec)!=tell[j+1]){
|
cannam@154
|
221 fprintf(stderr,
|
cannam@154
|
222 "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
cannam@154
|
223 j+1,ec_tell_frac(&dec),tell[j+1],seed);
|
cannam@154
|
224 }
|
cannam@154
|
225 }
|
cannam@154
|
226 free(tell);
|
cannam@154
|
227 free(data);
|
cannam@154
|
228 }
|
cannam@154
|
229 /*Test compatibility between multiple different encode/decode routines.*/
|
cannam@154
|
230 for(i=0;i<409600;i++){
|
cannam@154
|
231 unsigned *logp1;
|
cannam@154
|
232 unsigned *data;
|
cannam@154
|
233 unsigned *tell;
|
cannam@154
|
234 unsigned *enc_method;
|
cannam@154
|
235 int j;
|
cannam@154
|
236 sz=rand()/((RAND_MAX>>(rand()%9U))+1U);
|
cannam@154
|
237 logp1=(unsigned *)malloc(sz*sizeof(*logp1));
|
cannam@154
|
238 data=(unsigned *)malloc(sz*sizeof(*data));
|
cannam@154
|
239 tell=(unsigned *)malloc((sz+1)*sizeof(*tell));
|
cannam@154
|
240 enc_method=(unsigned *)malloc(sz*sizeof(*enc_method));
|
cannam@154
|
241 ec_enc_init(&enc,ptr,DATA_SIZE2);
|
cannam@154
|
242 tell[0]=ec_tell_frac(&enc);
|
cannam@154
|
243 for(j=0;j<sz;j++){
|
cannam@154
|
244 data[j]=rand()/((RAND_MAX>>1)+1);
|
cannam@154
|
245 logp1[j]=(rand()%15)+1;
|
cannam@154
|
246 enc_method[j]=rand()/((RAND_MAX>>2)+1);
|
cannam@154
|
247 switch(enc_method[j]){
|
cannam@154
|
248 case 0:{
|
cannam@154
|
249 ec_encode(&enc,data[j]?(1<<logp1[j])-1:0,
|
cannam@154
|
250 (1<<logp1[j])-(data[j]?0:1),1<<logp1[j]);
|
cannam@154
|
251 }break;
|
cannam@154
|
252 case 1:{
|
cannam@154
|
253 ec_encode_bin(&enc,data[j]?(1<<logp1[j])-1:0,
|
cannam@154
|
254 (1<<logp1[j])-(data[j]?0:1),logp1[j]);
|
cannam@154
|
255 }break;
|
cannam@154
|
256 case 2:{
|
cannam@154
|
257 ec_enc_bit_logp(&enc,data[j],logp1[j]);
|
cannam@154
|
258 }break;
|
cannam@154
|
259 case 3:{
|
cannam@154
|
260 unsigned char icdf[2];
|
cannam@154
|
261 icdf[0]=1;
|
cannam@154
|
262 icdf[1]=0;
|
cannam@154
|
263 ec_enc_icdf(&enc,data[j],icdf,logp1[j]);
|
cannam@154
|
264 }break;
|
cannam@154
|
265 }
|
cannam@154
|
266 tell[j+1]=ec_tell_frac(&enc);
|
cannam@154
|
267 }
|
cannam@154
|
268 ec_enc_done(&enc);
|
cannam@154
|
269 if((ec_tell(&enc)+7U)/8U<ec_range_bytes(&enc)){
|
cannam@154
|
270 fprintf(stderr,"tell() lied, there's %i bytes instead of %d (Random seed: %u)\n",
|
cannam@154
|
271 ec_range_bytes(&enc),(ec_tell(&enc)+7)/8,seed);
|
cannam@154
|
272 ret=-1;
|
cannam@154
|
273 }
|
cannam@154
|
274 ec_dec_init(&dec,ptr,DATA_SIZE2);
|
cannam@154
|
275 if(ec_tell_frac(&dec)!=tell[0]){
|
cannam@154
|
276 fprintf(stderr,
|
cannam@154
|
277 "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
cannam@154
|
278 0,ec_tell_frac(&dec),tell[0],seed);
|
cannam@154
|
279 }
|
cannam@154
|
280 for(j=0;j<sz;j++){
|
cannam@154
|
281 int fs;
|
cannam@154
|
282 int dec_method;
|
cannam@154
|
283 dec_method=rand()/((RAND_MAX>>2)+1);
|
cannam@154
|
284 switch(dec_method){
|
cannam@154
|
285 case 0:{
|
cannam@154
|
286 fs=ec_decode(&dec,1<<logp1[j]);
|
cannam@154
|
287 sym=fs>=(1<<logp1[j])-1;
|
cannam@154
|
288 ec_dec_update(&dec,sym?(1<<logp1[j])-1:0,
|
cannam@154
|
289 (1<<logp1[j])-(sym?0:1),1<<logp1[j]);
|
cannam@154
|
290 }break;
|
cannam@154
|
291 case 1:{
|
cannam@154
|
292 fs=ec_decode_bin(&dec,logp1[j]);
|
cannam@154
|
293 sym=fs>=(1<<logp1[j])-1;
|
cannam@154
|
294 ec_dec_update(&dec,sym?(1<<logp1[j])-1:0,
|
cannam@154
|
295 (1<<logp1[j])-(sym?0:1),1<<logp1[j]);
|
cannam@154
|
296 }break;
|
cannam@154
|
297 case 2:{
|
cannam@154
|
298 sym=ec_dec_bit_logp(&dec,logp1[j]);
|
cannam@154
|
299 }break;
|
cannam@154
|
300 case 3:{
|
cannam@154
|
301 unsigned char icdf[2];
|
cannam@154
|
302 icdf[0]=1;
|
cannam@154
|
303 icdf[1]=0;
|
cannam@154
|
304 sym=ec_dec_icdf(&dec,icdf,logp1[j]);
|
cannam@154
|
305 }break;
|
cannam@154
|
306 }
|
cannam@154
|
307 if(sym!=data[j]){
|
cannam@154
|
308 fprintf(stderr,
|
cannam@154
|
309 "Decoded %i instead of %i with logp1 of %i at position %i of %i (Random seed: %u).\n",
|
cannam@154
|
310 sym,data[j],logp1[j],j,sz,seed);
|
cannam@154
|
311 fprintf(stderr,"Encoding method: %i, decoding method: %i\n",
|
cannam@154
|
312 enc_method[j],dec_method);
|
cannam@154
|
313 ret=-1;
|
cannam@154
|
314 }
|
cannam@154
|
315 if(ec_tell_frac(&dec)!=tell[j+1]){
|
cannam@154
|
316 fprintf(stderr,
|
cannam@154
|
317 "Tell mismatch between encoder and decoder at symbol %i: %i instead of %i (Random seed: %u).\n",
|
cannam@154
|
318 j+1,ec_tell_frac(&dec),tell[j+1],seed);
|
cannam@154
|
319 }
|
cannam@154
|
320 }
|
cannam@154
|
321 free(enc_method);
|
cannam@154
|
322 free(tell);
|
cannam@154
|
323 free(data);
|
cannam@154
|
324 free(logp1);
|
cannam@154
|
325 }
|
cannam@154
|
326 ec_enc_init(&enc,ptr,DATA_SIZE2);
|
cannam@154
|
327 ec_enc_bit_logp(&enc,0,1);
|
cannam@154
|
328 ec_enc_bit_logp(&enc,0,1);
|
cannam@154
|
329 ec_enc_bit_logp(&enc,0,1);
|
cannam@154
|
330 ec_enc_bit_logp(&enc,0,1);
|
cannam@154
|
331 ec_enc_bit_logp(&enc,0,2);
|
cannam@154
|
332 ec_enc_patch_initial_bits(&enc,3,2);
|
cannam@154
|
333 if(enc.error){
|
cannam@154
|
334 fprintf(stderr,"patch_initial_bits failed");
|
cannam@154
|
335 ret=-1;
|
cannam@154
|
336 }
|
cannam@154
|
337 ec_enc_patch_initial_bits(&enc,0,5);
|
cannam@154
|
338 if(!enc.error){
|
cannam@154
|
339 fprintf(stderr,"patch_initial_bits didn't fail when it should have");
|
cannam@154
|
340 ret=-1;
|
cannam@154
|
341 }
|
cannam@154
|
342 ec_enc_done(&enc);
|
cannam@154
|
343 if(ec_range_bytes(&enc)!=1||ptr[0]!=192){
|
cannam@154
|
344 fprintf(stderr,"Got %d when expecting 192 for patch_initial_bits",ptr[0]);
|
cannam@154
|
345 ret=-1;
|
cannam@154
|
346 }
|
cannam@154
|
347 ec_enc_init(&enc,ptr,DATA_SIZE2);
|
cannam@154
|
348 ec_enc_bit_logp(&enc,0,1);
|
cannam@154
|
349 ec_enc_bit_logp(&enc,0,1);
|
cannam@154
|
350 ec_enc_bit_logp(&enc,1,6);
|
cannam@154
|
351 ec_enc_bit_logp(&enc,0,2);
|
cannam@154
|
352 ec_enc_patch_initial_bits(&enc,0,2);
|
cannam@154
|
353 if(enc.error){
|
cannam@154
|
354 fprintf(stderr,"patch_initial_bits failed");
|
cannam@154
|
355 ret=-1;
|
cannam@154
|
356 }
|
cannam@154
|
357 ec_enc_done(&enc);
|
cannam@154
|
358 if(ec_range_bytes(&enc)!=2||ptr[0]!=63){
|
cannam@154
|
359 fprintf(stderr,"Got %d when expecting 63 for patch_initial_bits",ptr[0]);
|
cannam@154
|
360 ret=-1;
|
cannam@154
|
361 }
|
cannam@154
|
362 ec_enc_init(&enc,ptr,2);
|
cannam@154
|
363 ec_enc_bit_logp(&enc,0,2);
|
cannam@154
|
364 for(i=0;i<48;i++){
|
cannam@154
|
365 ec_enc_bits(&enc,0,1);
|
cannam@154
|
366 }
|
cannam@154
|
367 ec_enc_done(&enc);
|
cannam@154
|
368 if(!enc.error){
|
cannam@154
|
369 fprintf(stderr,"Raw bits overfill didn't fail when it should have");
|
cannam@154
|
370 ret=-1;
|
cannam@154
|
371 }
|
cannam@154
|
372 ec_enc_init(&enc,ptr,2);
|
cannam@154
|
373 for(i=0;i<17;i++){
|
cannam@154
|
374 ec_enc_bits(&enc,0,1);
|
cannam@154
|
375 }
|
cannam@154
|
376 ec_enc_done(&enc);
|
cannam@154
|
377 if(!enc.error){
|
cannam@154
|
378 fprintf(stderr,"17 raw bits encoded in two bytes");
|
cannam@154
|
379 ret=-1;
|
cannam@154
|
380 }
|
cannam@154
|
381 free(ptr);
|
cannam@154
|
382 return ret;
|
cannam@154
|
383 }
|