The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

785 lines
21KB

  1. /********************************************************************
  2. * *
  3. * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
  4. * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
  5. * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  6. * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
  7. * *
  8. * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
  9. * by the Xiph.Org Foundation http://www.xiph.org/ *
  10. * *
  11. ********************************************************************
  12. function: packing variable sized words into an octet stream
  13. last mod: $Id: bitwise.c,v 1.1 2007/06/07 17:48:18 jules_rms Exp $
  14. ********************************************************************/
  15. /* We're 'LSb' endian; if we write a word but read individual bits,
  16. then we'll read the lsb first */
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include "ogg.h"
  20. #define BUFFER_INCREMENT 256
  21. static const unsigned long mask[]=
  22. {0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f,
  23. 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff,
  24. 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff,
  25. 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff,
  26. 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
  27. 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff,
  28. 0x3fffffff,0x7fffffff,0xffffffff };
  29. static const unsigned int mask8B[]=
  30. {0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
  31. void oggpack_writeinit(oggpack_buffer *b){
  32. memset(b,0,sizeof(*b));
  33. b->ptr=b->buffer=(unsigned char*) _ogg_malloc(BUFFER_INCREMENT);
  34. b->buffer[0]='\0';
  35. b->storage=BUFFER_INCREMENT;
  36. }
  37. void oggpackB_writeinit(oggpack_buffer *b){
  38. oggpack_writeinit(b);
  39. }
  40. void oggpack_writetrunc(oggpack_buffer *b,long bits){
  41. long bytes=bits>>3;
  42. bits-=bytes*8;
  43. b->ptr=b->buffer+bytes;
  44. b->endbit=bits;
  45. b->endbyte=bytes;
  46. *b->ptr&=mask[bits];
  47. }
  48. void oggpackB_writetrunc(oggpack_buffer *b,long bits){
  49. long bytes=bits>>3;
  50. bits-=bytes*8;
  51. b->ptr=b->buffer+bytes;
  52. b->endbit=bits;
  53. b->endbyte=bytes;
  54. *b->ptr&=mask8B[bits];
  55. }
  56. /* Takes only up to 32 bits. */
  57. void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){
  58. if(b->endbyte+4>=b->storage){
  59. b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
  60. b->storage+=BUFFER_INCREMENT;
  61. b->ptr=b->buffer+b->endbyte;
  62. }
  63. value&=mask[bits];
  64. bits+=b->endbit;
  65. b->ptr[0]|=value<<b->endbit;
  66. if(bits>=8){
  67. b->ptr[1]=(unsigned char)(value>>(8-b->endbit));
  68. if(bits>=16){
  69. b->ptr[2]=(unsigned char)(value>>(16-b->endbit));
  70. if(bits>=24){
  71. b->ptr[3]=(unsigned char)(value>>(24-b->endbit));
  72. if(bits>=32){
  73. if(b->endbit)
  74. b->ptr[4]=(unsigned char)(value>>(32-b->endbit));
  75. else
  76. b->ptr[4]=0;
  77. }
  78. }
  79. }
  80. }
  81. b->endbyte+=bits/8;
  82. b->ptr+=bits/8;
  83. b->endbit=bits&7;
  84. }
  85. /* Takes only up to 32 bits. */
  86. void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){
  87. if(b->endbyte+4>=b->storage){
  88. b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT);
  89. b->storage+=BUFFER_INCREMENT;
  90. b->ptr=b->buffer+b->endbyte;
  91. }
  92. value=(value&mask[bits])<<(32-bits);
  93. bits+=b->endbit;
  94. b->ptr[0]|=value>>(24+b->endbit);
  95. if(bits>=8){
  96. b->ptr[1]=(unsigned char)(value>>(16+b->endbit));
  97. if(bits>=16){
  98. b->ptr[2]=(unsigned char)(value>>(8+b->endbit));
  99. if(bits>=24){
  100. b->ptr[3]=(unsigned char)(value>>(b->endbit));
  101. if(bits>=32){
  102. if(b->endbit)
  103. b->ptr[4]=(unsigned char)(value<<(8-b->endbit));
  104. else
  105. b->ptr[4]=0;
  106. }
  107. }
  108. }
  109. }
  110. b->endbyte+=bits/8;
  111. b->ptr+=bits/8;
  112. b->endbit=bits&7;
  113. }
  114. void oggpack_writealign(oggpack_buffer *b){
  115. int bits=8-b->endbit;
  116. if(bits<8)
  117. oggpack_write(b,0,bits);
  118. }
  119. void oggpackB_writealign(oggpack_buffer *b){
  120. int bits=8-b->endbit;
  121. if(bits<8)
  122. oggpackB_write(b,0,bits);
  123. }
  124. static void oggpack_writecopy_helper(oggpack_buffer *b,
  125. void *source,
  126. long bits,
  127. void (*w)(oggpack_buffer *,
  128. unsigned long,
  129. int),
  130. int msb){
  131. unsigned char *ptr=(unsigned char *)source;
  132. long bytes=bits/8;
  133. bits-=bytes*8;
  134. if(b->endbit){
  135. int i;
  136. /* unaligned copy. Do it the hard way. */
  137. for(i=0;i<bytes;i++)
  138. w(b,(unsigned long)(ptr[i]),8);
  139. }else{
  140. /* aligned block copy */
  141. if(b->endbyte+bytes+1>=b->storage){
  142. b->storage=b->endbyte+bytes+BUFFER_INCREMENT;
  143. b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage);
  144. b->ptr=b->buffer+b->endbyte;
  145. }
  146. memmove(b->ptr,source,bytes);
  147. b->ptr+=bytes;
  148. b->endbyte+=bytes;
  149. *b->ptr=0;
  150. }
  151. if(bits){
  152. if(msb)
  153. w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits);
  154. else
  155. w(b,(unsigned long)(ptr[bytes]),bits);
  156. }
  157. }
  158. void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){
  159. oggpack_writecopy_helper(b,source,bits,oggpack_write,0);
  160. }
  161. void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){
  162. oggpack_writecopy_helper(b,source,bits,oggpackB_write,1);
  163. }
  164. void oggpack_reset(oggpack_buffer *b){
  165. b->ptr=b->buffer;
  166. b->buffer[0]=0;
  167. b->endbit=b->endbyte=0;
  168. }
  169. void oggpackB_reset(oggpack_buffer *b){
  170. oggpack_reset(b);
  171. }
  172. void oggpack_writeclear(oggpack_buffer *b){
  173. _ogg_free(b->buffer);
  174. memset(b,0,sizeof(*b));
  175. }
  176. void oggpackB_writeclear(oggpack_buffer *b){
  177. oggpack_writeclear(b);
  178. }
  179. void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
  180. memset(b,0,sizeof(*b));
  181. b->buffer=b->ptr=buf;
  182. b->storage=bytes;
  183. }
  184. void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){
  185. oggpack_readinit(b,buf,bytes);
  186. }
  187. /* Read in bits without advancing the bitptr; bits <= 32 */
  188. long oggpack_look(oggpack_buffer *b,int bits){
  189. unsigned long ret;
  190. unsigned long m=mask[bits];
  191. bits+=b->endbit;
  192. if(b->endbyte+4>=b->storage){
  193. /* not the main path */
  194. if(b->endbyte*8+bits>b->storage*8)return(-1);
  195. }
  196. ret=b->ptr[0]>>b->endbit;
  197. if(bits>8){
  198. ret|=b->ptr[1]<<(8-b->endbit);
  199. if(bits>16){
  200. ret|=b->ptr[2]<<(16-b->endbit);
  201. if(bits>24){
  202. ret|=b->ptr[3]<<(24-b->endbit);
  203. if(bits>32 && b->endbit)
  204. ret|=b->ptr[4]<<(32-b->endbit);
  205. }
  206. }
  207. }
  208. return(m&ret);
  209. }
  210. /* Read in bits without advancing the bitptr; bits <= 32 */
  211. long oggpackB_look(oggpack_buffer *b,int bits){
  212. unsigned long ret;
  213. int m=32-bits;
  214. bits+=b->endbit;
  215. if(b->endbyte+4>=b->storage){
  216. /* not the main path */
  217. if(b->endbyte*8+bits>b->storage*8)return(-1);
  218. }
  219. ret=b->ptr[0]<<(24+b->endbit);
  220. if(bits>8){
  221. ret|=b->ptr[1]<<(16+b->endbit);
  222. if(bits>16){
  223. ret|=b->ptr[2]<<(8+b->endbit);
  224. if(bits>24){
  225. ret|=b->ptr[3]<<(b->endbit);
  226. if(bits>32 && b->endbit)
  227. ret|=b->ptr[4]>>(8-b->endbit);
  228. }
  229. }
  230. }
  231. return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1);
  232. }
  233. long oggpack_look1(oggpack_buffer *b){
  234. if(b->endbyte>=b->storage)return(-1);
  235. return((b->ptr[0]>>b->endbit)&1);
  236. }
  237. long oggpackB_look1(oggpack_buffer *b){
  238. if(b->endbyte>=b->storage)return(-1);
  239. return((b->ptr[0]>>(7-b->endbit))&1);
  240. }
  241. void oggpack_adv(oggpack_buffer *b,int bits){
  242. bits+=b->endbit;
  243. b->ptr+=bits/8;
  244. b->endbyte+=bits/8;
  245. b->endbit=bits&7;
  246. }
  247. void oggpackB_adv(oggpack_buffer *b,int bits){
  248. oggpack_adv(b,bits);
  249. }
  250. void oggpack_adv1(oggpack_buffer *b){
  251. if(++(b->endbit)>7){
  252. b->endbit=0;
  253. b->ptr++;
  254. b->endbyte++;
  255. }
  256. }
  257. void oggpackB_adv1(oggpack_buffer *b){
  258. oggpack_adv1(b);
  259. }
  260. /* bits <= 32 */
  261. long oggpack_read(oggpack_buffer *b,int bits){
  262. long ret;
  263. unsigned long m=mask[bits];
  264. bits+=b->endbit;
  265. if(b->endbyte+4>=b->storage){
  266. /* not the main path */
  267. ret=-1L;
  268. if(b->endbyte*8+bits>b->storage*8)goto overflow;
  269. }
  270. ret=b->ptr[0]>>b->endbit;
  271. if(bits>8){
  272. ret|=b->ptr[1]<<(8-b->endbit);
  273. if(bits>16){
  274. ret|=b->ptr[2]<<(16-b->endbit);
  275. if(bits>24){
  276. ret|=b->ptr[3]<<(24-b->endbit);
  277. if(bits>32 && b->endbit){
  278. ret|=b->ptr[4]<<(32-b->endbit);
  279. }
  280. }
  281. }
  282. }
  283. ret&=m;
  284. overflow:
  285. b->ptr+=bits/8;
  286. b->endbyte+=bits/8;
  287. b->endbit=bits&7;
  288. return(ret);
  289. }
  290. /* bits <= 32 */
  291. long oggpackB_read(oggpack_buffer *b,int bits){
  292. long ret;
  293. long m=32-bits;
  294. bits+=b->endbit;
  295. if(b->endbyte+4>=b->storage){
  296. /* not the main path */
  297. ret=-1L;
  298. if(b->endbyte*8+bits>b->storage*8)goto overflow;
  299. }
  300. ret=b->ptr[0]<<(24+b->endbit);
  301. if(bits>8){
  302. ret|=b->ptr[1]<<(16+b->endbit);
  303. if(bits>16){
  304. ret|=b->ptr[2]<<(8+b->endbit);
  305. if(bits>24){
  306. ret|=b->ptr[3]<<(b->endbit);
  307. if(bits>32 && b->endbit)
  308. ret|=b->ptr[4]>>(8-b->endbit);
  309. }
  310. }
  311. }
  312. ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1);
  313. overflow:
  314. b->ptr+=bits/8;
  315. b->endbyte+=bits/8;
  316. b->endbit=bits&7;
  317. return(ret);
  318. }
  319. long oggpack_read1(oggpack_buffer *b){
  320. long ret;
  321. if(b->endbyte>=b->storage){
  322. /* not the main path */
  323. ret=-1L;
  324. goto overflow;
  325. }
  326. ret=(b->ptr[0]>>b->endbit)&1;
  327. overflow:
  328. b->endbit++;
  329. if(b->endbit>7){
  330. b->endbit=0;
  331. b->ptr++;
  332. b->endbyte++;
  333. }
  334. return(ret);
  335. }
  336. long oggpackB_read1(oggpack_buffer *b){
  337. long ret;
  338. if(b->endbyte>=b->storage){
  339. /* not the main path */
  340. ret=-1L;
  341. goto overflow;
  342. }
  343. ret=(b->ptr[0]>>(7-b->endbit))&1;
  344. overflow:
  345. b->endbit++;
  346. if(b->endbit>7){
  347. b->endbit=0;
  348. b->ptr++;
  349. b->endbyte++;
  350. }
  351. return(ret);
  352. }
  353. long oggpack_bytes(oggpack_buffer *b){
  354. return(b->endbyte+(b->endbit+7)/8);
  355. }
  356. long oggpack_bits(oggpack_buffer *b){
  357. return(b->endbyte*8+b->endbit);
  358. }
  359. long oggpackB_bytes(oggpack_buffer *b){
  360. return oggpack_bytes(b);
  361. }
  362. long oggpackB_bits(oggpack_buffer *b){
  363. return oggpack_bits(b);
  364. }
  365. unsigned char *oggpack_get_buffer(oggpack_buffer *b){
  366. return(b->buffer);
  367. }
  368. unsigned char *oggpackB_get_buffer(oggpack_buffer *b){
  369. return oggpack_get_buffer(b);
  370. }
  371. /* Self test of the bitwise routines; everything else is based on
  372. them, so they damned well better be solid. */
  373. #ifdef _V_SELFTEST
  374. #include <stdio.h>
  375. static int ilog(unsigned int v){
  376. int ret=0;
  377. while(v){
  378. ret++;
  379. v>>=1;
  380. }
  381. return(ret);
  382. }
  383. oggpack_buffer o;
  384. oggpack_buffer r;
  385. void report(char *in){
  386. fprintf(stderr,"%s",in);
  387. exit(1);
  388. }
  389. void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){
  390. long bytes,i;
  391. unsigned char *buffer;
  392. oggpack_reset(&o);
  393. for(i=0;i<vals;i++)
  394. oggpack_write(&o,b[i],bits?bits:ilog(b[i]));
  395. buffer=oggpack_get_buffer(&o);
  396. bytes=oggpack_bytes(&o);
  397. if(bytes!=compsize)report("wrong number of bytes!\n");
  398. for(i=0;i<bytes;i++)if(buffer[i]!=comp[i]){
  399. for(i=0;i<bytes;i++)fprintf(stderr,"%x %x\n",(int)buffer[i],(int)comp[i]);
  400. report("wrote incorrect value!\n");
  401. }
  402. oggpack_readinit(&r,buffer,bytes);
  403. for(i=0;i<vals;i++){
  404. int tbit=bits?bits:ilog(b[i]);
  405. if(oggpack_look(&r,tbit)==-1)
  406. report("out of data!\n");
  407. if(oggpack_look(&r,tbit)!=(b[i]&mask[tbit]))
  408. report("looked at incorrect value!\n");
  409. if(tbit==1)
  410. if(oggpack_look1(&r)!=(b[i]&mask[tbit]))
  411. report("looked at single bit incorrect value!\n");
  412. if(tbit==1){
  413. if(oggpack_read1(&r)!=(b[i]&mask[tbit]))
  414. report("read incorrect single bit value!\n");
  415. }else{
  416. if(oggpack_read(&r,tbit)!=(b[i]&mask[tbit]))
  417. report("read incorrect value!\n");
  418. }
  419. }
  420. if(oggpack_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  421. }
  422. void cliptestB(unsigned long *b,int vals,int bits,int *comp,int compsize){
  423. long bytes,i;
  424. unsigned char *buffer;
  425. oggpackB_reset(&o);
  426. for(i=0;i<vals;i++)
  427. oggpackB_write(&o,b[i],bits?bits:ilog(b[i]));
  428. buffer=oggpackB_get_buffer(&o);
  429. bytes=oggpackB_bytes(&o);
  430. if(bytes!=compsize)report("wrong number of bytes!\n");
  431. for(i=0;i<bytes;i++)if(buffer[i]!=comp[i]){
  432. for(i=0;i<bytes;i++)fprintf(stderr,"%x %x\n",(int)buffer[i],(int)comp[i]);
  433. report("wrote incorrect value!\n");
  434. }
  435. oggpackB_readinit(&r,buffer,bytes);
  436. for(i=0;i<vals;i++){
  437. int tbit=bits?bits:ilog(b[i]);
  438. if(oggpackB_look(&r,tbit)==-1)
  439. report("out of data!\n");
  440. if(oggpackB_look(&r,tbit)!=(b[i]&mask[tbit]))
  441. report("looked at incorrect value!\n");
  442. if(tbit==1)
  443. if(oggpackB_look1(&r)!=(b[i]&mask[tbit]))
  444. report("looked at single bit incorrect value!\n");
  445. if(tbit==1){
  446. if(oggpackB_read1(&r)!=(b[i]&mask[tbit]))
  447. report("read incorrect single bit value!\n");
  448. }else{
  449. if(oggpackB_read(&r,tbit)!=(b[i]&mask[tbit]))
  450. report("read incorrect value!\n");
  451. }
  452. }
  453. if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  454. }
  455. int main(void){
  456. unsigned char *buffer;
  457. long bytes,i;
  458. static unsigned long testbuffer1[]=
  459. {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7,
  460. 567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4};
  461. int test1size=43;
  462. static unsigned long testbuffer2[]=
  463. {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212,
  464. 1233432,534,5,346435231,14436467,7869299,76326614,167548585,
  465. 85525151,0,12321,1,349528352};
  466. int test2size=21;
  467. static unsigned long testbuffer3[]=
  468. {1,0,14,0,1,0,12,0,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,
  469. 0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1};
  470. int test3size=56;
  471. static unsigned long large[]=
  472. {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212,
  473. 1233432,534,5,2146435231,14436467,7869299,76326614,167548585,
  474. 85525151,0,12321,1,2146528352};
  475. int onesize=33;
  476. static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40,
  477. 34,242,223,136,35,222,211,86,171,50,225,135,214,75,172,
  478. 223,4};
  479. static int oneB[33]={150,101,131,33,203,15,204,216,105,193,156,65,84,85,222,
  480. 8,139,145,227,126,34,55,244,171,85,100,39,195,173,18,
  481. 245,251,128};
  482. int twosize=6;
  483. static int two[6]={61,255,255,251,231,29};
  484. static int twoB[6]={247,63,255,253,249,120};
  485. int threesize=54;
  486. static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254,
  487. 142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83,
  488. 58,135,196,61,55,129,183,54,101,100,170,37,127,126,10,
  489. 100,52,4,14,18,86,77,1};
  490. static int threeB[54]={206,128,42,153,57,8,183,251,13,89,36,30,32,144,183,
  491. 130,59,240,121,59,85,223,19,228,180,134,33,107,74,98,
  492. 233,253,196,135,63,2,110,114,50,155,90,127,37,170,104,
  493. 200,20,254,4,58,106,176,144,0};
  494. int foursize=38;
  495. static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72,
  496. 132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169,
  497. 28,2,133,0,1};
  498. static int fourB[38]={36,48,102,83,243,24,52,7,4,35,132,10,145,21,2,93,2,41,
  499. 1,219,184,16,33,184,54,149,170,132,18,30,29,98,229,67,
  500. 129,10,4,32};
  501. int fivesize=45;
  502. static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62,
  503. 241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169,
  504. 84,75,159,2,1,0,132,192,8,0,0,18,22};
  505. static int fiveB[45]={1,84,145,111,245,100,128,8,56,36,40,71,126,78,213,226,
  506. 124,105,12,0,133,128,0,162,233,242,67,152,77,205,77,
  507. 172,150,169,129,79,128,0,6,4,32,0,27,9,0};
  508. int sixsize=7;
  509. static int six[7]={17,177,170,242,169,19,148};
  510. static int sixB[7]={136,141,85,79,149,200,41};
  511. /* Test read/write together */
  512. /* Later we test against pregenerated bitstreams */
  513. oggpack_writeinit(&o);
  514. fprintf(stderr,"\nSmall preclipped packing (LSb): ");
  515. cliptest(testbuffer1,test1size,0,one,onesize);
  516. fprintf(stderr,"ok.");
  517. fprintf(stderr,"\nNull bit call (LSb): ");
  518. cliptest(testbuffer3,test3size,0,two,twosize);
  519. fprintf(stderr,"ok.");
  520. fprintf(stderr,"\nLarge preclipped packing (LSb): ");
  521. cliptest(testbuffer2,test2size,0,three,threesize);
  522. fprintf(stderr,"ok.");
  523. fprintf(stderr,"\n32 bit preclipped packing (LSb): ");
  524. oggpack_reset(&o);
  525. for(i=0;i<test2size;i++)
  526. oggpack_write(&o,large[i],32);
  527. buffer=oggpack_get_buffer(&o);
  528. bytes=oggpack_bytes(&o);
  529. oggpack_readinit(&r,buffer,bytes);
  530. for(i=0;i<test2size;i++){
  531. if(oggpack_look(&r,32)==-1)report("out of data. failed!");
  532. if(oggpack_look(&r,32)!=large[i]){
  533. fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpack_look(&r,32),large[i],
  534. oggpack_look(&r,32),large[i]);
  535. report("read incorrect value!\n");
  536. }
  537. oggpack_adv(&r,32);
  538. }
  539. if(oggpack_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  540. fprintf(stderr,"ok.");
  541. fprintf(stderr,"\nSmall unclipped packing (LSb): ");
  542. cliptest(testbuffer1,test1size,7,four,foursize);
  543. fprintf(stderr,"ok.");
  544. fprintf(stderr,"\nLarge unclipped packing (LSb): ");
  545. cliptest(testbuffer2,test2size,17,five,fivesize);
  546. fprintf(stderr,"ok.");
  547. fprintf(stderr,"\nSingle bit unclipped packing (LSb): ");
  548. cliptest(testbuffer3,test3size,1,six,sixsize);
  549. fprintf(stderr,"ok.");
  550. fprintf(stderr,"\nTesting read past end (LSb): ");
  551. oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  552. for(i=0;i<64;i++){
  553. if(oggpack_read(&r,1)!=0){
  554. fprintf(stderr,"failed; got -1 prematurely.\n");
  555. exit(1);
  556. }
  557. }
  558. if(oggpack_look(&r,1)!=-1 ||
  559. oggpack_read(&r,1)!=-1){
  560. fprintf(stderr,"failed; read past end without -1.\n");
  561. exit(1);
  562. }
  563. oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  564. if(oggpack_read(&r,30)!=0 || oggpack_read(&r,16)!=0){
  565. fprintf(stderr,"failed 2; got -1 prematurely.\n");
  566. exit(1);
  567. }
  568. if(oggpack_look(&r,18)!=0 ||
  569. oggpack_look(&r,18)!=0){
  570. fprintf(stderr,"failed 3; got -1 prematurely.\n");
  571. exit(1);
  572. }
  573. if(oggpack_look(&r,19)!=-1 ||
  574. oggpack_look(&r,19)!=-1){
  575. fprintf(stderr,"failed; read past end without -1.\n");
  576. exit(1);
  577. }
  578. if(oggpack_look(&r,32)!=-1 ||
  579. oggpack_look(&r,32)!=-1){
  580. fprintf(stderr,"failed; read past end without -1.\n");
  581. exit(1);
  582. }
  583. oggpack_writeclear(&o);
  584. fprintf(stderr,"ok.\n");
  585. /********** lazy, cut-n-paste retest with MSb packing ***********/
  586. /* Test read/write together */
  587. /* Later we test against pregenerated bitstreams */
  588. oggpackB_writeinit(&o);
  589. fprintf(stderr,"\nSmall preclipped packing (MSb): ");
  590. cliptestB(testbuffer1,test1size,0,oneB,onesize);
  591. fprintf(stderr,"ok.");
  592. fprintf(stderr,"\nNull bit call (MSb): ");
  593. cliptestB(testbuffer3,test3size,0,twoB,twosize);
  594. fprintf(stderr,"ok.");
  595. fprintf(stderr,"\nLarge preclipped packing (MSb): ");
  596. cliptestB(testbuffer2,test2size,0,threeB,threesize);
  597. fprintf(stderr,"ok.");
  598. fprintf(stderr,"\n32 bit preclipped packing (MSb): ");
  599. oggpackB_reset(&o);
  600. for(i=0;i<test2size;i++)
  601. oggpackB_write(&o,large[i],32);
  602. buffer=oggpackB_get_buffer(&o);
  603. bytes=oggpackB_bytes(&o);
  604. oggpackB_readinit(&r,buffer,bytes);
  605. for(i=0;i<test2size;i++){
  606. if(oggpackB_look(&r,32)==-1)report("out of data. failed!");
  607. if(oggpackB_look(&r,32)!=large[i]){
  608. fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpackB_look(&r,32),large[i],
  609. oggpackB_look(&r,32),large[i]);
  610. report("read incorrect value!\n");
  611. }
  612. oggpackB_adv(&r,32);
  613. }
  614. if(oggpackB_bytes(&r)!=bytes)report("leftover bytes after read!\n");
  615. fprintf(stderr,"ok.");
  616. fprintf(stderr,"\nSmall unclipped packing (MSb): ");
  617. cliptestB(testbuffer1,test1size,7,fourB,foursize);
  618. fprintf(stderr,"ok.");
  619. fprintf(stderr,"\nLarge unclipped packing (MSb): ");
  620. cliptestB(testbuffer2,test2size,17,fiveB,fivesize);
  621. fprintf(stderr,"ok.");
  622. fprintf(stderr,"\nSingle bit unclipped packing (MSb): ");
  623. cliptestB(testbuffer3,test3size,1,sixB,sixsize);
  624. fprintf(stderr,"ok.");
  625. fprintf(stderr,"\nTesting read past end (MSb): ");
  626. oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  627. for(i=0;i<64;i++){
  628. if(oggpackB_read(&r,1)!=0){
  629. fprintf(stderr,"failed; got -1 prematurely.\n");
  630. exit(1);
  631. }
  632. }
  633. if(oggpackB_look(&r,1)!=-1 ||
  634. oggpackB_read(&r,1)!=-1){
  635. fprintf(stderr,"failed; read past end without -1.\n");
  636. exit(1);
  637. }
  638. oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8);
  639. if(oggpackB_read(&r,30)!=0 || oggpackB_read(&r,16)!=0){
  640. fprintf(stderr,"failed 2; got -1 prematurely.\n");
  641. exit(1);
  642. }
  643. if(oggpackB_look(&r,18)!=0 ||
  644. oggpackB_look(&r,18)!=0){
  645. fprintf(stderr,"failed 3; got -1 prematurely.\n");
  646. exit(1);
  647. }
  648. if(oggpackB_look(&r,19)!=-1 ||
  649. oggpackB_look(&r,19)!=-1){
  650. fprintf(stderr,"failed; read past end without -1.\n");
  651. exit(1);
  652. }
  653. if(oggpackB_look(&r,32)!=-1 ||
  654. oggpackB_look(&r,32)!=-1){
  655. fprintf(stderr,"failed; read past end without -1.\n");
  656. exit(1);
  657. }
  658. oggpackB_writeclear(&o);
  659. fprintf(stderr,"ok.\n\n");
  660. return(0);
  661. }
  662. #endif /* _V_SELFTEST */
  663. #undef BUFFER_INCREMENT