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; 190ea4d754fcb81fced7bd1f33ad67f7b50d5fbb291Marco Nelissen if (b->head && r->length) { 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 220ea4d754fcb81fced7bd1f33ad67f7b50d5fbb291Marco Nelissen if (!b->headptr) return 0; 221ea4d754fcb81fced7bd1f33ad67f7b50d5fbb291Marco Nelissen 2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bits+=b->headbit; 2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits >= b->headend<<3){ 2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int end=b->headend; 2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char *ptr=b->headptr; 2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference *head=b->head; 2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 229b46673f19ebfff0984b7cbc69554239992ea21bbDouglas Leung if(end<0)return 0; 230b46673f19ebfff0984b7cbc69554239992ea21bbDouglas Leung if (!head || !end)return 0; 2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits){ 2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret=*ptr++>>b->headbit; 2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>8){ 2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr++<<(8-b->headbit); 2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>16){ 2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr++<<(16-b->headbit); 2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>24){ 2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr++<<(24-b->headbit); 2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>32 && b->headbit){ 2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --end; 2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _lookspan(); 2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=*ptr<<(32-b->headbit); 2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang }else{ 2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* make this a switch jump-table */ 2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret=b->headptr[0]>>b->headbit; 2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>8){ 2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[1]<<(8-b->headbit); 2637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>16){ 2647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[2]<<(16-b->headbit); 2657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>24){ 2667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[3]<<(24-b->headbit); 2677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bits>32 && b->headbit) 2687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret|=b->headptr[4]<<(32-b->headbit); 2697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret&=m; 2757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, 2767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // "Look: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits) return=%x\n", 2777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, b->count, 2787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 2797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 2807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // BITS, ret); 2817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 2827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 2837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* limited to 32 at a time */ 2867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid oggpack_adv(oggpack_buffer *b,int bits){ 2877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int BITS=bits; 2887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bits+=b->headbit; 2897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headbit=bits&7; 2907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headend-=(bits>>3); 2917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang b->headptr+=(bits>>3); 2927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<1)_span(b); 2937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Adv: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n", 2947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend,b->count, 2957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 2967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 2977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // BITS); 2987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 2997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint oggpack_eop(oggpack_buffer *b){ 3027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ret; 3037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<0)ret= -1; 3047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = 0; 3057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "EOP %d\n", ret); 3067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 3077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 3087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bytes(oggpack_buffer *b){ 3117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret; 3127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<0) ret = b->count+b->head->length; 3137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret = b->count + b->head->length-b->headend + (b->headbit+7)/8; 3147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Bytes: buffer=(%d,%x,%d,%d) %02x%02x%02x%02x%02x%02x%02x%02x (%d bytes)\n", 3157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, b->count, 3167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 3177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 3187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // ret); 3197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 3207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 3217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_bits(oggpack_buffer *b){ 3247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret; 3257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(b->headend<0) ret = (b->count+b->head->length)*8; 3267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else ret = (b->count + b->head->length-b->headend)*8 + b->headbit; 3277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fprintf(stderr, "Bits: buffer=(%x,%x,%x) %02x%02x%02x%02x%02x%02x%02x%02x (%d bits)\n", 3287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headbit, b->headptr, b->headend, 3297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[7], b->headptr[6], b->headptr[5], b->headptr[4], 3307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // b->headptr[3], b->headptr[2], b->headptr[1], b->headptr[0], 3317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // ret); 3327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang //fflush(stderr); 3337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return ret; 3347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* bits <= 32 */ 3377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong oggpack_read(oggpack_buffer *b,int bits){ 3387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long ret=oggpack_look(b,bits); 3397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(b,bits); 3407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(ret); 3417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 3447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang/* Self test of the bitwise routines; everything else is based on 3467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang them, so they damned well better be solid. */ 3477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _V_BIT_TEST 3497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <string.h> 3507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdlib.h> 3517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include <stdio.h> 3527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "framing.c" 3537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangstatic int ilog(unsigned long v){ 3557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ret=0; 3567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(v){ 3577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ret++; 3587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang v>>=1; 3597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(ret); 3617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer r; 3647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangoggpack_buffer o; 3657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_buffer_state *bs; 3667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *or; 3677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#define TESTWORDS 256 3687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid report(char *in){ 3707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%s",in); 3717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 3727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint getbyte(ogg_reference *or,int position){ 3757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or && position>=or->length){ 3767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang position-=or->length; 3777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 3787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or==NULL){ 3797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\n\tERROR: getbyte ran off end of buffer.\n"); 3807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 3817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((position+or->begin)&1) 3857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return (or->buffer->data[(position+or->begin)>>1])&0xff; 3867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 3877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return (or->buffer->data[(position+or->begin)>>1]>>8)&0xff; 3887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ 3917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long i,bitcount=0; 3927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference *or=ogg_buffer_alloc(bs,64); 3937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<compsize;i++) 3947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i]= comp[i]; 3957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->length=i; 3967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,or); 3987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<vals;i++){ 3997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long test; 4007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int tbit=bits?bits:ilog(b[i]); 4017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,tbit))==0xffffffff) 4027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("out of data!\n"); 4037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(test!=(b[i]&mask[tbit])){ 4047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test); 4057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("looked at incorrect value!\n"); 4067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_read(&r,tbit))==0xffffffff){ 4087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("premature end of data when reading!\n"); 4097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(test!=(b[i]&mask[tbit])){ 4117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%ld) %lx %lx\n",i,(b[i]&mask[tbit]),test); 4127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("read incorrect value!\n"); 4137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=tbit; 4157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bitcount!=oggpack_bits(&r)) 4177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("wrong number of bits while reading!\n"); 4187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((bitcount+7)/8!=oggpack_bytes(&r)) 4197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("wrong number of bytes while reading!\n"); 4207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&r)!=(bitcount+7)/8){ 4237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), (bitcount+7)/8); 4247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("leftover bytes after read!\n"); 4257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or); 4277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify(int count){ 4307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int i; 4317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* are the proper number of bits left over? */ 4337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int leftover=count*8-oggpack_bits(&o); 4347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(leftover>7) 4357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: too many bits reported left over.\n"); 4367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does reading to exactly byte alignment *not* trip EOF? */ 4387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&o,leftover)==-1) 4397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end tripped EOF.\n"); 4407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end reported bad bitcount.\n"); 4427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF trip properly after a single additional bit? */ 4447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&o,1)!=-1) 4457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end did not trip EOF.\n"); 4467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF stay set over additional bit reads? */ 4507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<=32;i++){ 4517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&o,i)!=-1) 4527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: EOF did not stay set on stream.\n"); 4537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid _end_verify2(int count){ 4597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int i; 4607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* are the proper number of bits left over? */ 4627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int leftover=count*8-oggpack_bits(&o); 4637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(leftover>7) 4647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: too many bits reported left over.\n"); 4657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does reading to exactly byte alignment *not* trip EOF? */ 4677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,leftover); 4687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 4697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.bitsLeftInSegment!=0) 4707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 4717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.headend!=0) 4727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 4737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end tripped EOF.\n"); 4747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read to but not past exact end reported bad bitcount.\n"); 4767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF trip properly after a single additional bit? */ 4787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,1); 4797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 4807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.bitsLeftInSegment>=0) 4817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 4827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.headend>=0) 4837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 4847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end did not trip EOF.\n"); 4857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* does EOF stay set over additional bit reads? */ 4897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<=32;i++){ 4907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,i); 4917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef ARM_LITTLE_ENDIAN 4927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.bitsLeftInSegment>=0) 4937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#else 4947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(o.headend>=0) 4957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 4967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: EOF did not stay set on stream.\n"); 4977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=count*8) 4987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("\nERROR: read past exact end reported bad bitcount.\n"); 4997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wanglong ogg_buffer_length(ogg_reference *or){ 5037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int count=0; 5047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or){ 5057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang count+=or->length; 5067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 5077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return count; 5097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangogg_reference *ogg_buffer_extend(ogg_reference *or,long bytes){ 5127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or){ 5137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or->next){ 5147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 5157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->next=ogg_buffer_alloc(or->buffer->ptr.owner,bytes); 5177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(or->next); 5187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return 0; 5207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ogg_buffer_posttruncate(ogg_reference *or,long pos){ 5237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* walk to the point where we want to begin truncate */ 5247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(or && pos>or->length){ 5257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang pos-=or->length; 5267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=or->next; 5277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or){ 5297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or->next); 5307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->next=0; 5317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->length=pos; 5327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 5337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 5347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint main(void){ 5367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long i; 5377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long testbuffer1[]= 5387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {18,12,103948,4325,543,76,432,52,3,65,4,56,32,42,34,21,1,23,32,546,456,7, 5397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 567,56,8,8,55,3,52,342,341,4,265,7,67,86,2199,21,7,1,5,1,4}; 5407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int test1size=43; 5417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long testbuffer2[]= 5437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {216531625L,1237861823,56732452,131,3212421,12325343,34547562,12313212, 5447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1233432,534,5,346435231,14436467,7869299,76326614,167548585, 5457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 85525151,0,12321,1,349528352}; 5467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int test2size=21; 5477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long testbuffer3[]= 5497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria 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, 5507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 0,1,30,1,1,1,0,0,1,0,0,0,12,0,11,0,1,0,0,1}; 5517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int test3size=56; 5527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static unsigned long large[]= 5547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang {2136531625L,2137861823,56732452,131,3212421,12325343,34547562,12313212, 5557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1233432,534,5,2146435231,14436467,7869299,76326614,167548585, 5567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 85525151,0,12321,1,2146528352}; 5577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int onesize=33; 5597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int one[33]={146,25,44,151,195,15,153,176,233,131,196,65,85,172,47,40, 5607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 34,242,223,136,35,222,211,86,171,50,225,135,214,75,172, 5617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 223,4}; 5627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int twosize=6; 5647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int two[6]={61,255,255,251,231,29}; 5657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int threesize=54; 5677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int three[54]={169,2,232,252,91,132,156,36,89,13,123,176,144,32,254, 5687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 142,224,85,59,121,144,79,124,23,67,90,90,216,79,23,83, 5697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 58,135,196,61,55,129,183,54,101,100,170,37,127,126,10, 5707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 100,52,4,14,18,86,77,1}; 5717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int foursize=38; 5737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72, 5747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169, 5757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 28,2,133,0,1}; 5767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int fivesize=45; 5787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62, 5797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169, 5807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 84,75,159,2,1,0,132,192,8,0,0,18,22}; 5817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int sixsize=7; 5837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang static int six[7]={17,177,170,242,169,19,148}; 5847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* Test read/write together */ 5867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* Later we test against pregenerated bitstreams */ 5877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bs=ogg_buffer_create(); 5887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nSmall preclipped packing (LSb): "); 5907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer1,test1size,0,one,onesize); 5917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 5927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nNull bit call (LSb): "); 5947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer3,test3size,0,two,twosize); 5957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 5967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 5977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nLarge preclipped packing (LSb): "); 5987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer2,test2size,0,three,threesize); 5997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\n32 bit preclipped packing (LSb): "); 6027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=ogg_buffer_alloc(bs,128); 6047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<test2size;i++){ 6057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4] = large[i]&0xff; 6067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4+1] = (large[i]>>8)&0xff; 6077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4+2] = (large[i]>>16)&0xff; 6087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->buffer->data[i*4+3] = (large[i]>>24)&0xff; 6097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or->length=test2size*4; 6117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,or); 6127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<test2size;i++){ 6137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long test; 6147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,32))==0xffffffffUL)report("out of data. failed!"); 6157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(test!=large[i]){ 6167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"%ld != %ld (%lx!=%lx):",test,large[i], 6177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang test,large[i]); 6187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("read incorrect value!\n"); 6197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&r,32); 6217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or); 6237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&r)!=test2size*4){ 6247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr, "%d vs %d\n", oggpack_bytes(&r), test2size*4); 6257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang report("leftover bytes after read!\n"); 6267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nSmall unclipped packing (LSb): "); 6307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer1,test1size,7,four,foursize); 6317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nLarge unclipped packing (LSb): "); 6347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer2,test2size,17,five,fivesize); 6357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nSingle bit unclipped packing (LSb): "); 6387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang cliptest(testbuffer3,test3size,1,six,sixsize); 6397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok."); 6407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nTesting read past end (LSb): "); 6427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 6437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char dda[]={0,0,0,0}; 6447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer lob={dda,8,0,{0}}; 6457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference lor={&lob,0,8,0}; 6467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,&lor); 6487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<64;i++){ 6497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_read(&r,1)<0){ 6507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; got -1 prematurely.\n"); 6517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_look(&r,1)!=-1 || 6557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_read(&r,1)!=-1){ 6567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; read past end without -1.\n"); 6577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 6617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char dda[]={0,0,0,0}; 6627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer lob={dda,8,0,{0}}; 6637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference lor={&lob,0,8,0}; 6647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long test; 6657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&r,&lor); 6677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_read(&r,30))==0xffffffffUL || 6687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (test=oggpack_read(&r,16))==0xffffffffUL){ 6697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed 2; got -1 prematurely.\n"); 6707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,18))==0xffffffffUL){ 6747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed 3; got -1 prematurely.\n"); 6757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,19))!=0xffffffffUL){ 6787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; read past end without -1.\n"); 6797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((test=oggpack_look(&r,32))!=0xffffffffUL){ 6827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"failed; read past end without -1.\n"); 6837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 6847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 6867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"ok.\n"); 6877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* now the scary shit: randomized testing */ 6897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(i=0;i<10000;i++){ 6917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long j,count=0,count2=0,bitcount=0; 6927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long values[TESTWORDS]; 6937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int len[TESTWORDS]; 6947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned char flat[4*TESTWORDS]; /* max possible needed size */ 6957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang memset(flat,0,sizeof(flat)); 6977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\rRandomized testing (LSb)... (%ld) ",10000-i); 6987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 6997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* generate a list of words and lengths */ 7007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* write the required number of bits out to packbuffer */ 7017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 7027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long word=0; 7037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long bit=0; 7047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int k; 7057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=0;j<TESTWORDS;j++){ 7077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang values[j]=rand(); 7087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang len[j]=(rand()%33); 7097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(k=0;k<len[j];k++){ 7117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang flat[word] |= ((values[j]>>k)&0x1)<<bit; 7127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bit++; 7137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount++; 7147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(bit>7){ 7157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bit=0; 7167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang word++; 7177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang count2=(bitcount+7)>>3; 7227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* construct random-length buffer chain from flat vector; random 7247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang byte starting offset within the length of the vector */ 7257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 7267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_reference *or=NULL,*orl=NULL; 7277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang long pos=0; 7287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* build buffer chain */ 7307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang while(count2){ 7317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ilen=(rand()%32),k; 7327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ibegin=(rand()%32); 7337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ilen>count2)ilen=count2; 7367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(or) 7387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl=ogg_buffer_extend(orl,64); 7397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang else 7407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=orl=ogg_buffer_alloc(bs,64); 7417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl->length=ilen; 7437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl->begin=ibegin; 7447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(k=0;k<ilen;k++) 7467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang orl->buffer->data[ibegin++]= flat[pos++]; 7477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang count2-=ilen; 7497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(ogg_buffer_length(or)!=(bitcount+7)/8){ 7527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: buffer length incorrect after build.\n"); 7537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang { 7587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int begin=0; //=(rand()%TESTWORDS); 7597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int ilen=(rand()%(TESTWORDS-begin)); 7607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int bitoffset,bitcount=0; 7617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang unsigned long temp; 7627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=0;j<begin;j++) 7647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 7657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang or=ogg_buffer_pretruncate(or,bitcount/8); 7667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitoffset=bitcount%=8; 7677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(;j<begin+ilen;j++) 7687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 7697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_posttruncate(or,((bitcount+7)/8)); 7707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if((count=ogg_buffer_length(or))!=(bitcount+7)/8){ 7727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: buffer length incorrect after truncate.\n"); 7737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&o,or); 7777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* verify bit count */ 7797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=0){ 7807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bitcounter not zero!\n"); 7817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&o)!=0){ 7847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bytecounter not zero!\n"); 7857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount=bitoffset; 7897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_read(&o,bitoffset); 7907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 7917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* read and compare to original list */ 7927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=begin;j<begin+ilen;j++){ 7937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang temp=oggpack_read(&o,len[j]); 7947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp==0xffffffffUL){ 7957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: End of stream too soon! word: %ld,%d\n", 7967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang j-begin,ilen); 7977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 7987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 7997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp!=(values[j]&mask[len[j]])){ 8007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Incorrect read %lx != %lx, word %ld, len %d\n" 8017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang, 8027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang values[j]&mask[len[j]],temp,j-begin,len[j]); 8037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 8067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=bitcount){ 8077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bitcounter %d != %ld!\n", 8087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount,oggpack_bits(&o)); 8097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&o)!=(bitcount+7)/8){ 8127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Read bytecounter %d != %ld!\n", 8137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (bitcount+7)/8,oggpack_bytes(&o)); 8147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _end_verify(count); 8197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* look/adv version */ 8217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_readinit(&o,or); 8227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount=bitoffset; 8237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,bitoffset); 8247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang /* read and compare to original list */ 8267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for(j=begin;j<begin+ilen;j++){ 8277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang temp=oggpack_look(&o,len[j]); 8287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp==0xffffffffUL){ 8307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: End of stream too soon! word: %ld\n", 8317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang j-begin); 8327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(temp!=(values[j]&mask[len[j]])){ 8357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Incorrect look %lx != %lx, word %ld, len %d\n" 8367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang, 8377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang values[j]&mask[len[j]],temp,j-begin,len[j]); 8387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang oggpack_adv(&o,len[j]); 8417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount+=len[j]; 8427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bits(&o)!=bitcount){ 8437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Look/Adv bitcounter %d != %ld!\n", 8447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bitcount,oggpack_bits(&o)); 8457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if(oggpack_bytes(&o)!=(bitcount+7)/8){ 8487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\nERROR: Look/Adv bytecounter %d != %ld!\n", 8497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (bitcount+7)/8,oggpack_bytes(&o)); 8507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang exit(1); 8517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang _end_verify2(count); 8557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ogg_buffer_release(or); 8587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 8607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fprintf(stderr,"\rRandomized testing (LSb)... ok. \n"); 8617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return(0); 8637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 8647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#ifdef _WIN32_WCE 8667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint WinMain(void){ 8677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return main(); 8687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 8697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 8707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 8717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#endif 872