bitwise.c revision d52f6d76f66e2e419bd18cc09395a0008edd649c
137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang/************************************************************************ 22da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Copyright (C) 2002-2009, Xiph.org Foundation 32da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd 437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * All rights reserved. 537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * 637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * Redistribution and use in source and binary forms, with or without 72da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * modification, are permitted provided that the following conditions 82da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * are met: 937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * 1037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * * Redistributions of source code must retain the above copyright 1137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * notice, this list of conditions and the following disclaimer. 1237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * * Redistributions in binary form must reproduce the above 1337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * copyright notice, this list of conditions and the following disclaimer 1437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * in the documentation and/or other materials provided with the 1537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * distribution. 162da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * * Neither the names of the Xiph.org Foundation nor Pinknoise 172da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * Productions Ltd nor the names of its contributors may be used to 182da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * endorse or promote products derived from this software without 192da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang * specific prior written permission. 2037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * 2137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2737fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2837fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang ************************************************************************ 337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang function: packing variable sized words into an octet stream 357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang ************************************************************************/ 377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* We're 'LSb' endian; if we write a word but read individual bits, 397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang then we'll read the lsb first */ 407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h> 427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h> 437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "misc.h" 447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "ogg.h" 457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h> 477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#if !defined(ARM_LITTLE_ENDIAN) || defined(_V_BIT_TEST) 507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic unsigned long mask[]= 517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, 527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, 537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, 547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, 557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, 567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, 577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0x3fffffff,0x7fffffff,0xffffffff }; 587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef DEBUGGING_BITWISE 637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern void oggpack_readinitARM(oggpack_buffer *b,ogg_reference *r); 647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_readinit(oggpack_buffer *b,ogg_reference *r){ 667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinitARM(b,r); 677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Init: buffer=(%d,%x,%d,%d) %08x%08x\n", 687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count, 697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0]); 707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern long oggpack_lookARM(oggpack_buffer *b,int bits); 747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_look(oggpack_buffer *b,int bits){ 767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long l; 777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "PreLook: buffer=(%x,%x,%x) %08x%08x (%d bits)\n", 797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, 807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0], bits); 817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang l = oggpack_lookARM(b,bits); 837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Look: buffer=(%d,%x,%d,%d) %08x%08x (%d bits) (result=%x)\n", 847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count, 857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0], bits, l); 867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return l; 897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern void oggpack_advARM(oggpack_buffer *b,int bits); 927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_adv(oggpack_buffer *b,int bits){ 947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Adv before: buffer=(%x,%x,%x) %08x%08x (%d bits)\n", 957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, 967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0],bits); 977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_advARM(b,bits); 997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Adv: buffer=(%d,%x,%d,%d) %08x%08x\n", 1007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count, 1017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0]); 1027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 1037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangextern long oggpack_readARM(oggpack_buffer *b,int bits); 1067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* bits <= 32 */ 1087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_read(oggpack_buffer *b,int bits){ 1097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long l; 1107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "PreRead: buffer=(%d,%x,%d,%d) %08x%08x (%d bits)\n", 1127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count, 1137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0], bits); 1147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 1157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang l = oggpack_readARM(b,bits); 1167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Read: buffer=(%d,%x,%d,%d) %08x%08x (%d bits) (result=%x)\n", 1177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->bitsLeftInSegment, b->ptr, b->bitsLeftInWord, b->count, 1187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->ptr[1], b->ptr[0], bits, l); 1197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 1207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return l; 1227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 1247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint oggpack_eop(oggpack_buffer *b){ 1267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ret; 1277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->bitsLeftInSegment<0)ret= -1; 1287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = 0; 1297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "EOP %d\n", ret); 1307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 1317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 1327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bytes(oggpack_buffer *b){ 1357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret; 1367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->bitsLeftInSegment<0) ret = b->count+b->head->length; 1377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = b->count + b->head->length - (b->bitsLeftInSegment)/8; 1387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "count=%d length=%d bitsLeftInSegment=%d\n", 1397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->count, b->head->length, b->bitsLeftInSegment); 1407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 1417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 1427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bits(oggpack_buffer *b){ 1457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret; 1467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->bitsLeftInSegment<0) ret=(b->count+b->head->length)*8; 1477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = b->count*8 + b->head->length*8 - b->bitsLeftInSegment; 1487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "count=%d length=%d bitsLeftInSegment=%d\n", 1497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->count, b->head->length, b->bitsLeftInSegment); 1507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 1517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 1527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 1557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* spans forward, skipping as many bytes as headend is negative; if 1577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang headend is zero, simply finds next byte. If we're up to the end 1587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang of the buffer, leaves headend at zero. If we've read past the end, 1597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang halt the decode process. */ 1607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic void _span(oggpack_buffer *b){ 1627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(b->headend-(b->headbit>>3)<1){ 1637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend-=b->headbit>>3; 1647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headbit&=0x7; 1657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->head && b->head->next){ 1677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->count+=b->head->length; 1687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->head=b->head->next; 1697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend+b->head->length>0) 1717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headptr=b->head->buffer->data+b->head->begin-b->headend; 1727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend+=b->head->length; 1747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 1757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* we've either met the end of decode, or gone past it. halt 1767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang only if we're past */ 1777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend*8<b->headbit) 1787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* read has fallen off the end */ 1797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend=-1; 1807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang break; 1817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_readinit(oggpack_buffer *b,ogg_reference *r){ 1867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang memset(b,0,sizeof(*b)); 1877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->tail=b->head=r; 1897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->count=0; 1907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (b->head) { 1917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headptr=b->head->buffer->data+b->head->begin; 1927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend=b->head->length; 1937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } else { 1947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headptr=0; 1957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend=0; 1967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _span(b); 1987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, 2007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // "Init: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x\n", 2017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, b->count, 2027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 2037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0]); 2047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 2057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#define _lookspan() while(!end){\ 2087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang head=head->next;\ 2097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(!head) return -1;\ 2107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ptr=head->buffer->data + head->begin;\ 2117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang end=head->length;\ 2127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* Read in bits without advancing the bitptr; bits <= 32 */ 2157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_look(oggpack_buffer *b,int bits){ 2167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long m=mask[bits]; 217d52f6d76f66e2e419bd18cc09395a0008edd649cBruce Beare unsigned long ret = 0; 2187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int BITS = bits; 2197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bits+=b->headbit; 2217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits >= b->headend<<3){ 2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int end=b->headend; 2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char *ptr=b->headptr; 2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference *head=b->head; 2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(end<0)return -1; 2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!head || !end)return -1; 2297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits){ 2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret=*ptr++>>b->headbit; 2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>8){ 2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr++<<(8-b->headbit); 2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>16){ 2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr++<<(16-b->headbit); 2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>24){ 2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr++<<(24-b->headbit); 2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>32 && b->headbit){ 2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr<<(32-b->headbit); 2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* make this a switch jump-table */ 2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret=b->headptr[0]>>b->headbit; 2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>8){ 2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[1]<<(8-b->headbit); 2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>16){ 2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[2]<<(16-b->headbit); 2637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>24){ 2647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[3]<<(24-b->headbit); 2657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>32 && b->headbit) 2667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[4]<<(32-b->headbit); 2677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret&=m; 2737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, 2747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // "Look: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits) return=%x\n", 2757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, b->count, 2767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 2777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 2787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // BITS, ret); 2797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 2807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 2817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* limited to 32 at a time */ 2847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_adv(oggpack_buffer *b,int bits){ 2857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int BITS=bits; 2867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bits+=b->headbit; 2877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headbit=bits&7; 2887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend-=(bits>>3); 2897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headptr+=(bits>>3); 2907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<1)_span(b); 2917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Adv: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n", 2927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend,b->count, 2937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 2947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 2957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // BITS); 2967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 2977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint oggpack_eop(oggpack_buffer *b){ 3007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ret; 3017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<0)ret= -1; 3027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = 0; 3037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "EOP %d\n", ret); 3047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 3057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 3067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bytes(oggpack_buffer *b){ 3097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret; 3107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<0) ret = b->count+b->head->length; 3117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret = b->count + b->head->length-b->headend + (b->headbit+7)/8; 3127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Bytes: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bytes)\n", 3137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, b->count, 3147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 3157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 3167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // ret); 3177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 3187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 3197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bits(oggpack_buffer *b){ 3227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret; 3237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<0) ret = (b->count+b->head->length)*8; 3247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = (b->count + b->head->length-b->headend)*8 + b->headbit; 3257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Bits: buffer=(%x,%x,%x) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n", 3267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, 3277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 3287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 3297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // ret); 3307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 3317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 3327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* bits <= 32 */ 3357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_read(oggpack_buffer *b,int bits){ 3367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret=oggpack_look(b,bits); 3377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(b,bits); 3387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(ret); 3397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 3427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* Self test of the bitwise routines; everything else is based on 3447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang them, so they damned well better be solid. */ 3457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _V_BIT_TEST 3477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h> 3487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h> 3497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h> 3507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "framing.c" 3517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic int ilog(unsigned long v){ 3537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ret=0; 3547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(v){ 3557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret++; 3567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang v>>=1; 3577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(ret); 3597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer r; 3627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer o; 3637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_buffer_state *bs; 3647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *or; 3657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#define TESTWORDS 256 3667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid report(char *in){ 3687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%s",in); 3697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 3707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint getbyte(ogg_reference *or,int position){ 3737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or && position>=or->length){ 3747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang position-=or->length; 3757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 3767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or==NULL){ 3777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\n\tERROR: getbyte ran off end of buffer.\n"); 3787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 3797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((position+or->begin)&1) 3837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return (or->buffer->data[(position+or->begin)>>1])&0xff; 3847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 3857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return (or->buffer->data[(position+or->begin)>>1]>>8)&0xff; 3867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ 3897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long i,bitcount=0; 3907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference *or=ogg_buffer_alloc(bs,64); 3917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<compsize;i++) 3927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i]= comp[i]; 3937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->length=i; 3947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,or); 3967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<vals;i++){ 3977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long test; 3987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int tbit=bits?bits:ilog(b[i]); 3997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,tbit))==0xffffffff) 4007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("out of data!\n"); 4017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(test!=(b[i]&mask[tbit])){ 4027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test); 4037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("looked at incorrect value!\n"); 4047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_read(&r,tbit))==0xffffffff){ 4067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("premature end of data when reading!\n"); 4077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(test!=(b[i]&mask[tbit])){ 4097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test); 4107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("read incorrect value!\n"); 4117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=tbit; 4137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bitcount!=oggpack_bits(&r)) 4157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("wrong number of bits while reading!\n"); 4167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((bitcount+7)/8!=oggpack_bytes(&r)) 4177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("wrong number of bytes while reading!\n"); 4187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&r)!=(bitcount+7)/8){ 4217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), (bitcount+7)/8); 4227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("leftover bytes after read!\n"); 4237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or); 4257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify(int count){ 4287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int i; 4297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* are the proper number of bits left over? */ 4317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int leftover=count*8-oggpack_bits(&o); 4327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(leftover>7) 4337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: too many bits reported left over.\n"); 4347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does reading to exactly byte alignment *not* trip EOF? */ 4367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&o,leftover)==-1) 4377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end tripped EOF.\n"); 4387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end reported bad bitcount.\n"); 4407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF trip properly after a single additional bit? */ 4427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&o,1)!=-1) 4437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end did not trip EOF.\n"); 4447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF stay set over additional bit reads? */ 4487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<=32;i++){ 4497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&o,i)!=-1) 4507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: EOF did not stay set on stream.\n"); 4517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify2(int count){ 4577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int i; 4587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* are the proper number of bits left over? */ 4607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int leftover=count*8-oggpack_bits(&o); 4617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(leftover>7) 4627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: too many bits reported left over.\n"); 4637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does reading to exactly byte alignment *not* trip EOF? */ 4657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,leftover); 4667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 4677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.bitsLeftInSegment!=0) 4687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 4697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.headend!=0) 4707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 4717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end tripped EOF.\n"); 4727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end reported bad bitcount.\n"); 4747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF trip properly after a single additional bit? */ 4767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,1); 4777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 4787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.bitsLeftInSegment>=0) 4797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 4807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.headend>=0) 4817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 4827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end did not trip EOF.\n"); 4837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF stay set over additional bit reads? */ 4877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<=32;i++){ 4887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,i); 4897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 4907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.bitsLeftInSegment>=0) 4917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 4927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.headend>=0) 4937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 4947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: EOF did not stay set on stream.\n"); 4957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong ogg_buffer_length(ogg_reference *or){ 5017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int count=0; 5027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or){ 5037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang count+=or->length; 5047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 5057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return count; 5077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *ogg_buffer_extend(ogg_reference *or,long bytes){ 5107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or){ 5117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or->next){ 5127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 5137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->next=ogg_buffer_alloc(or->buffer->ptr.owner,bytes); 5157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(or->next); 5167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return 0; 5187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ogg_buffer_posttruncate(ogg_reference *or,long pos){ 5217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* walk to the point where we want to begin truncate */ 5227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or && pos>or->length){ 5237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pos-=or->length; 5247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 5257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or){ 5277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or->next); 5287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->next=0; 5297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->length=pos; 5307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint main(void){ 5347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long i; 5357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long testbuffer1[]= 5367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7, 5377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4}; 5387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int test1size=43; 5397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long testbuffer2[]= 5417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212, 5427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1233432,534,5,346435231,14436467,7869299,76326614,167548585, 5437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 85525151,0,12321,1,349528352}; 5447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int test2size=21; 5457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long testbuffer3[]= 5477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {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, 5487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1}; 5497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int test3size=56; 5507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long large[]= 5527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212, 5537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1233432,534,5,2146435231,14436467,7869299,76326614,167548585, 5547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 85525151,0,12321,1,2146528352}; 5557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int onesize=33; 5577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40, 5587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 34,242,223,136,35,222,211,86,171,50,225,135,214,75,172, 5597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 223,4}; 5607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int twosize=6; 5627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int two[6]={61,255,255,251,231,29}; 5637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int threesize=54; 5657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254, 5667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83, 5677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 58,135,196,61,55,129,183,54,101,100,170,37,127,126,10, 5687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 100,52,4,14,18,86,77,1}; 5697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int foursize=38; 5717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72, 5727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169, 5737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 28,2,133,0,1}; 5747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int fivesize=45; 5767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62, 5777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169, 5787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 84,75,159,2,1,0,132,192,8,0,0,18,22}; 5797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int sixsize=7; 5817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int six[7]={17,177,170,242,169,19,148}; 5827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* Test read/write together */ 5847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* Later we test against pregenerated bitstreams */ 5857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bs=ogg_buffer_create(); 5867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nSmall preclipped packing (LSb): "); 5887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer1,test1size,0,one,onesize); 5897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 5907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nNull bit call (LSb): "); 5927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer3,test3size,0,two,twosize); 5937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 5947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nLarge preclipped packing (LSb): "); 5967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer2,test2size,0,three,threesize); 5977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 5987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\n32 bit preclipped packing (LSb): "); 6007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=ogg_buffer_alloc(bs,128); 6027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<test2size;i++){ 6037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4] = large[i]&0xff; 6047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4+1] = (large[i]>>8)&0xff; 6057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4+2] = (large[i]>>16)&0xff; 6067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4+3] = (large[i]>>24)&0xff; 6077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->length=test2size*4; 6097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,or); 6107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<test2size;i++){ 6117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long test; 6127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,32))==0xffffffffUL)report("out of data. failed!"); 6137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(test!=large[i]){ 6147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%ld != %ld (%lx!=%lx):",test,large[i], 6157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang test,large[i]); 6167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("read incorrect value!\n"); 6177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&r,32); 6197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or); 6217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&r)!=test2size*4){ 6227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), test2size*4); 6237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("leftover bytes after read!\n"); 6247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nSmall unclipped packing (LSb): "); 6287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer1,test1size,7,four,foursize); 6297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nLarge unclipped packing (LSb): "); 6327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer2,test2size,17,five,fivesize); 6337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nSingle bit unclipped packing (LSb): "); 6367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer3,test3size,1,six,sixsize); 6377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nTesting read past end (LSb): "); 6407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 6417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char dda[]={0,0,0,0}; 6427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer lob={dda,8,0,{0}}; 6437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference lor={&lob,0,8,0}; 6447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,&lor); 6467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<64;i++){ 6477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&r,1)<0){ 6487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; got -1 prematurely.\n"); 6497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_look(&r,1)!=-1 || 6537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_read(&r,1)!=-1){ 6547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; read past end without -1.\n"); 6557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 6597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char dda[]={0,0,0,0}; 6607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer lob={dda,8,0,{0}}; 6617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference lor={&lob,0,8,0}; 6627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long test; 6637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,&lor); 6657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_read(&r,30))==0xffffffffUL || 6667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (test=oggpack_read(&r,16))==0xffffffffUL){ 6677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed 2; got -1 prematurely.\n"); 6687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,18))==0xffffffffUL){ 6727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed 3; got -1 prematurely.\n"); 6737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,19))!=0xffffffffUL){ 6767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; read past end without -1.\n"); 6777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,32))!=0xffffffffUL){ 6807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; read past end without -1.\n"); 6817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok.\n"); 6857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* now the scary shit: randomized testing */ 6877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<10000;i++){ 6897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long j,count=0,count2=0,bitcount=0; 6907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long values[TESTWORDS]; 6917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int len[TESTWORDS]; 6927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char flat[4*TESTWORDS]; /* max possible needed size */ 6937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang memset(flat,0,sizeof(flat)); 6957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\rRandomized testing (LSb)... (%ld) ",10000-i); 6967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* generate a list of words and lengths */ 6987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* write the required number of bits out to packbuffer */ 6997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 7007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long word=0; 7017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long bit=0; 7027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int k; 7037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=0;j<TESTWORDS;j++){ 7057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang values[j]=rand(); 7067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang len[j]=(rand()%33); 7077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(k=0;k<len[j];k++){ 7097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang flat[word] |= ((values[j]>>k)&0x1)<<bit; 7107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bit++; 7117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount++; 7127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bit>7){ 7137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bit=0; 7147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang word++; 7157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang count2=(bitcount+7)>>3; 7207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* construct random-length buffer chain from flat vector; random 7227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang byte starting offset within the length of the vector */ 7237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 7247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference *or=NULL,*orl=NULL; 7257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long pos=0; 7267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* build buffer chain */ 7287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(count2){ 7297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ilen=(rand()%32),k; 7307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ibegin=(rand()%32); 7317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ilen>count2)ilen=count2; 7347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or) 7367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl=ogg_buffer_extend(orl,64); 7377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 7387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=orl=ogg_buffer_alloc(bs,64); 7397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl->length=ilen; 7417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl->begin=ibegin; 7427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(k=0;k<ilen;k++) 7447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl->buffer->data[ibegin++]= flat[pos++]; 7457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang count2-=ilen; 7477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ogg_buffer_length(or)!=(bitcount+7)/8){ 7507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: buffer length incorrect after build.\n"); 7517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 7567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int begin=0; //=(rand()%TESTWORDS); 7577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ilen=(rand()%(TESTWORDS-begin)); 7587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int bitoffset,bitcount=0; 7597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long temp; 7607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=0;j<begin;j++) 7627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 7637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=ogg_buffer_pretruncate(or,bitcount/8); 7647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitoffset=bitcount%=8; 7657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(;j<begin+ilen;j++) 7667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 7677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_posttruncate(or,((bitcount+7)/8)); 7687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((count=ogg_buffer_length(or))!=(bitcount+7)/8){ 7707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: buffer length incorrect after truncate.\n"); 7717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&o,or); 7757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* verify bit count */ 7777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=0){ 7787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bitcounter not zero!\n"); 7797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&o)!=0){ 7827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bytecounter not zero!\n"); 7837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount=bitoffset; 7877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_read(&o,bitoffset); 7887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* read and compare to original list */ 7907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=begin;j<begin+ilen;j++){ 7917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang temp=oggpack_read(&o,len[j]); 7927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp==0xffffffffUL){ 7937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: End of stream too soon! word: %ld,%d\n", 7947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang j-begin,ilen); 7957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp!=(values[j]&mask[len[j]])){ 7987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Incorrect read %lx != %lx, word %ld, len %d\n" 7997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang, 8007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang values[j]&mask[len[j]],temp,j-begin,len[j]); 8017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 8047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=bitcount){ 8057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bitcounter %d != %ld!\n", 8067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount,oggpack_bits(&o)); 8077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&o)!=(bitcount+7)/8){ 8107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bytecounter %d != %ld!\n", 8117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (bitcount+7)/8,oggpack_bytes(&o)); 8127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _end_verify(count); 8177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* look/adv version */ 8197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&o,or); 8207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount=bitoffset; 8217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,bitoffset); 8227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* read and compare to original list */ 8247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=begin;j<begin+ilen;j++){ 8257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang temp=oggpack_look(&o,len[j]); 8267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp==0xffffffffUL){ 8287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: End of stream too soon! word: %ld\n", 8297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang j-begin); 8307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp!=(values[j]&mask[len[j]])){ 8337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Incorrect look %lx != %lx, word %ld, len %d\n" 8347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang, 8357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang values[j]&mask[len[j]],temp,j-begin,len[j]); 8367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,len[j]); 8397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 8407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=bitcount){ 8417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Look/Adv bitcounter %d != %ld!\n", 8427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount,oggpack_bits(&o)); 8437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&o)!=(bitcount+7)/8){ 8467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Look/Adv bytecounter %d != %ld!\n", 8477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (bitcount+7)/8,oggpack_bytes(&o)); 8487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _end_verify2(count); 8537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or); 8567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\rRandomized testing (LSb)... ok. \n"); 8597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(0); 8617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 8627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _WIN32_WCE 8647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint WinMain(void){ 8657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return main(); 8667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 8677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 8687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 870