From 975e8199ff19d7d41b194ea1c1e51bda0fb344da Mon Sep 17 00:00:00 2001 From: Matthew Gregan Date: Thu, 18 Mar 2010 15:23:19 +1300 Subject: [PATCH] Bug 468296 - Update libogg to SVN r16911. r=chris.double --- media/libogg/CHANGES | 9 + media/libogg/README | 38 +- media/libogg/README_MOZILLA | 6 +- media/libogg/include/ogg/ogg.h | 56 +- media/libogg/include/ogg/os_types.h | 49 +- media/libogg/src/ogg_bitwise.c | 166 +++--- media/libogg/src/ogg_framing.c | 842 +++++++++++++++------------- 7 files changed, 676 insertions(+), 490 deletions(-) diff --git a/media/libogg/CHANGES b/media/libogg/CHANGES index cab24c3fa8b4..35de4b6b458d 100644 --- a/media/libogg/CHANGES +++ b/media/libogg/CHANGES @@ -1,3 +1,12 @@ +Version 1.1.4 (2009 June 24) + +* New async error reporting mechanism. Calls made after a fatal error are + now safely handled in the event an error code is ignored +* Added allocation checks useful to some embedded applications +* fix possible read past end of buffer when reading 0 bits +* Updates to API documentation +* Build fixes + Version 1.1.3 (2005 November 27) * Correct a bug in the granulepos field of pages where no packet ends diff --git a/media/libogg/README b/media/libogg/README index b36195e781f1..e31d40a1392b 100644 --- a/media/libogg/README +++ b/media/libogg/README @@ -23,13 +23,16 @@ Directory: ./include Library API headers and codebooks -./debian Rules/spec files for building Debian .deb packages - ./doc Ogg specification documents ./win32 Win32 projects and build automation -./mac MacOS 9 projects and build automation +./macosx MacOS X project and build files + +./macos Classic MacOS 9 projects and build automation + +./debian Rules/spec files for building Debian .deb packages + (may not be present, depending on your distribution) WHAT IS OGG?: @@ -82,6 +85,33 @@ You can also run one of the batch files from the commandline. E.g.: build_ogg_dynamic +CROSS COMPILING FROM LINUX TO WIN32: + +It is also possible to cross compile from Linux to windows using the MinGW +cross tools and even to run the test suite under Wine, the Linux/*nix +windows emulator. + +On Debian and Ubuntu systems, these cross compiler tools can be installed +by doing: + + sudo apt-get mingw32 mingw32-binutils mingw32-runtime wine + +Once these tools are installed its possible to compile and test by +executing the following commands: + + ./configure --host=i586-mingw32msvc --target=i586-mingw32msvc \ + --build=i586-linux + make + make check + +The above has been tested with the following versions of the tools on +Ubuntu's Hardy Heron release: + + mingw32 4.2.1.dfsg-1ubuntu1 + mingw32-binutils 2.17.50-20070129.1-1 + mingw32-runtime 3.13-1 + wine 0.9.59-0ubuntu4 + BUILDING ON MACOS 9: Ogg on MacOS 9 is built using CodeWarrior 5.3. To build it, first @@ -100,4 +130,4 @@ and #include "ogg/ogg.h" wherever you need to acces Ogg functionality. (Build instructions for Ogg codecs such as vorbis are similar and may be found in those source modules' README files) -$Id: README 10478 2005-11-28 04:23:35Z giles $ +$Id: README 14726 2008-04-14 08:40:46Z erikd $ diff --git a/media/libogg/README_MOZILLA b/media/libogg/README_MOZILLA index cfbe99ac4095..5336b319192d 100644 --- a/media/libogg/README_MOZILLA +++ b/media/libogg/README_MOZILLA @@ -1,8 +1,10 @@ -The source from this directory was copied from the libogg-1.1.3 source -distribution using the update.sh script. The only changes made were +The source from this directory was copied from the libogg subversion +repository using the update.sh script. The only changes made were those applied by update.sh and the addition/upate of Makefile.in files for the Mozilla build system. +The svn revision number used was r16911. + The int-types.patch address a bug that config_types.h generated from Linux platform can't be used on OpenSolaris directly see Mozilla bug 449754 diff --git a/media/libogg/include/ogg/ogg.h b/media/libogg/include/ogg/ogg.h index 9082679d97b8..ae0cfd534753 100644 --- a/media/libogg/include/ogg/ogg.h +++ b/media/libogg/include/ogg/ogg.h @@ -5,13 +5,13 @@ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: toplevel libogg include - last mod: $Id: ogg.h 7188 2004-07-20 07:26:04Z xiphmont $ + last mod: $Id: ogg.h 16051 2009-05-27 05:00:06Z xiphmont $ ********************************************************************/ #ifndef _OGG_H @@ -21,8 +21,14 @@ extern "C" { #endif +#include #include +typedef struct { + void *iov_base; + size_t iov_len; +} ogg_iovec_t; + typedef struct { long endbyte; int endbit; @@ -53,8 +59,8 @@ typedef struct { int *lacing_vals; /* The values that will go to the segment table */ ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact - this way, but it is simple coupled to the - lacing fifo */ + this way, but it is simple coupled to the + lacing fifo */ long lacing_storage; long lacing_fill; long lacing_packet; @@ -69,7 +75,7 @@ typedef struct { of a logical bitstream */ long serialno; long pageno; - ogg_int64_t packetno; /* sequence number for decode; the framing + ogg_int64_t packetno; /* sequence number for decode; the framing knows where there's a hole in the data, but we need coupling so that the codec (which is in a seperate abstraction @@ -88,12 +94,12 @@ typedef struct { long e_o_s; ogg_int64_t granulepos; - + ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a seperate abstraction - layer) also knows about the gap */ + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ } ogg_packet; typedef struct { @@ -110,6 +116,7 @@ typedef struct { /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ extern void oggpack_writeinit(oggpack_buffer *b); +extern int oggpack_writecheck(oggpack_buffer *b); extern void oggpack_writetrunc(oggpack_buffer *b,long bits); extern void oggpack_writealign(oggpack_buffer *b); extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); @@ -128,6 +135,7 @@ extern long oggpack_bits(oggpack_buffer *b); extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); extern void oggpackB_writeinit(oggpack_buffer *b); +extern int oggpackB_writecheck(oggpack_buffer *b); extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); extern void oggpackB_writealign(oggpack_buffer *b); extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); @@ -148,6 +156,8 @@ extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); /* Ogg BITSTREAM PRIMITIVES: encoding **************************/ extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, + int count, long e_o_s, ogg_int64_t granulepos); extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); @@ -156,7 +166,8 @@ extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); extern int ogg_sync_init(ogg_sync_state *oy); extern int ogg_sync_clear(ogg_sync_state *oy); extern int ogg_sync_reset(ogg_sync_state *oy); -extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_check(ogg_sync_state *oy); extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); @@ -173,18 +184,19 @@ extern int ogg_stream_clear(ogg_stream_state *os); extern int ogg_stream_reset(ogg_stream_state *os); extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_check(ogg_stream_state *os); extern int ogg_stream_eos(ogg_stream_state *os); extern void ogg_page_checksum_set(ogg_page *og); -extern int ogg_page_version(ogg_page *og); -extern int ogg_page_continued(ogg_page *og); -extern int ogg_page_bos(ogg_page *og); -extern int ogg_page_eos(ogg_page *og); -extern ogg_int64_t ogg_page_granulepos(ogg_page *og); -extern int ogg_page_serialno(ogg_page *og); -extern long ogg_page_pageno(ogg_page *og); -extern int ogg_page_packets(ogg_page *og); +extern int ogg_page_version(const ogg_page *og); +extern int ogg_page_continued(const ogg_page *og); +extern int ogg_page_bos(const ogg_page *og); +extern int ogg_page_eos(const ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(const ogg_page *og); +extern int ogg_page_serialno(const ogg_page *og); +extern long ogg_page_pageno(const ogg_page *og); +extern int ogg_page_packets(const ogg_page *og); extern void ogg_packet_clear(ogg_packet *op); @@ -194,9 +206,3 @@ extern void ogg_packet_clear(ogg_packet *op); #endif #endif /* _OGG_H */ - - - - - - diff --git a/media/libogg/include/ogg/os_types.h b/media/libogg/include/ogg/os_types.h index 32dcb8bff0a0..f6f8b381870f 100644 --- a/media/libogg/include/ogg/os_types.h +++ b/media/libogg/include/ogg/os_types.h @@ -11,7 +11,7 @@ ******************************************************************** function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $ + last mod: $Id: os_types.h 16649 2009-10-25 00:49:58Z ds $ ********************************************************************/ #ifndef _OS_TYPES_H @@ -27,19 +27,21 @@ #if defined(_WIN32) # if defined(__CYGWIN__) -# include <_G_config.h> - typedef _G_int64_t ogg_int64_t; - typedef _G_int32_t ogg_int32_t; - typedef _G_uint32_t ogg_uint32_t; - typedef _G_int16_t ogg_int16_t; - typedef _G_uint16_t ogg_uint16_t; +# include + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + typedef uint64_t ogg_uint64_t; # elif defined(__MINGW32__) - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - typedef unsigned long long ogg_uint64_t; +# include + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + typedef unsigned long long ogg_uint64_t; # elif defined(__MWERKS__) typedef long long ogg_int64_t; typedef int ogg_int32_t; @@ -64,7 +66,7 @@ typedef UInt32 ogg_uint32_t; typedef SInt64 ogg_int64_t; -#elif defined(__MACOSX__) /* MacOS X Framework build */ +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ # include typedef int16_t ogg_int16_t; @@ -73,6 +75,16 @@ typedef u_int32_t ogg_uint32_t; typedef int64_t ogg_int64_t; +#elif defined(__HAIKU__) + + /* Haiku */ +# include + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + #elif defined(__BEOS__) /* Be */ @@ -117,6 +129,15 @@ typedef unsigned int ogg_uint32_t; typedef long long int ogg_int64_t; +#elif defined(__TMS320C6X__) + + /* TI C64x compiler */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + #else # include diff --git a/media/libogg/src/ogg_bitwise.c b/media/libogg/src/ogg_bitwise.c index 15246db09f6d..6eb58ad3d980 100644 --- a/media/libogg/src/ogg_bitwise.c +++ b/media/libogg/src/ogg_bitwise.c @@ -5,13 +5,13 @@ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: packing variable sized words into an octet stream - last mod: $Id: bitwise.c 7675 2004-09-01 00:34:39Z xiphmont $ + last mod: $Id: bitwise.c 16051 2009-05-27 05:00:06Z xiphmont $ ********************************************************************/ @@ -47,28 +47,48 @@ void oggpackB_writeinit(oggpack_buffer *b){ oggpack_writeinit(b); } +int oggpack_writecheck(oggpack_buffer *b){ + if(!b->ptr || !b->storage)return -1; + return 0; +} + +int oggpackB_writecheck(oggpack_buffer *b){ + return oggpack_writecheck(b); +} + void oggpack_writetrunc(oggpack_buffer *b,long bits){ long bytes=bits>>3; - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask[bits]; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask[bits]; + } } void oggpackB_writetrunc(oggpack_buffer *b,long bits){ long bytes=bits>>3; - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask8B[bits]; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask8B[bits]; + } } /* Takes only up to 32 bits. */ void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ if(b->endbyte+4>=b->storage){ - b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + void *ret; + if(!b->ptr)return; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret){ + oggpack_writeclear(b); + return; + } + b->buffer=ret; b->storage+=BUFFER_INCREMENT; b->ptr=b->buffer+b->endbyte; } @@ -83,13 +103,13 @@ void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ if(bits>=16){ b->ptr[2]=(unsigned char)(value>>(16-b->endbit)); if(bits>=24){ - b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); - if(bits>=32){ - if(b->endbit) - b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); - else - b->ptr[4]=0; - } + b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); + else + b->ptr[4]=0; + } } } } @@ -102,7 +122,14 @@ void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ /* Takes only up to 32 bits. */ void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ if(b->endbyte+4>=b->storage){ - b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + void *ret; + if(!b->ptr)return; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret){ + oggpack_writeclear(b); + return; + } + b->buffer=ret; b->storage+=BUFFER_INCREMENT; b->ptr=b->buffer+b->endbyte; } @@ -117,13 +144,13 @@ void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ if(bits>=16){ b->ptr[2]=(unsigned char)(value>>(8+b->endbit)); if(bits>=24){ - b->ptr[3]=(unsigned char)(value>>(b->endbit)); - if(bits>=32){ - if(b->endbit) - b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); - else - b->ptr[4]=0; - } + b->ptr[3]=(unsigned char)(value>>(b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); + else + b->ptr[4]=0; + } } } } @@ -146,12 +173,12 @@ void oggpackB_writealign(oggpack_buffer *b){ } static void oggpack_writecopy_helper(oggpack_buffer *b, - void *source, - long bits, - void (*w)(oggpack_buffer *, - unsigned long, - int), - int msb){ + void *source, + long bits, + void (*w)(oggpack_buffer *, + unsigned long, + int), + int msb){ unsigned char *ptr=(unsigned char *)source; long bytes=bits/8; @@ -165,8 +192,15 @@ static void oggpack_writecopy_helper(oggpack_buffer *b, }else{ /* aligned block copy */ if(b->endbyte+bytes+1>=b->storage){ + void *ret; + if(!b->ptr)return; b->storage=b->endbyte+bytes+BUFFER_INCREMENT; - b->buffer=_ogg_realloc(b->buffer,b->storage); + ret=_ogg_realloc(b->buffer,b->storage); + if(!ret){ + oggpack_writeclear(b); + return; + } + b->buffer=ret; b->ptr=b->buffer+b->endbyte; } @@ -193,6 +227,7 @@ void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ } void oggpack_reset(oggpack_buffer *b){ + if(!b->ptr)return; b->ptr=b->buffer; b->buffer[0]=0; b->endbit=b->endbyte=0; @@ -203,7 +238,7 @@ void oggpackB_reset(oggpack_buffer *b){ } void oggpack_writeclear(oggpack_buffer *b){ - _ogg_free(b->buffer); + if(b->buffer)_ogg_free(b->buffer); memset(b,0,sizeof(*b)); } @@ -239,9 +274,9 @@ long oggpack_look(oggpack_buffer *b,int bits){ if(bits>16){ ret|=b->ptr[2]<<(16-b->endbit); if(bits>24){ - ret|=b->ptr[3]<<(24-b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]<<(32-b->endbit); + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]<<(32-b->endbit); } } } @@ -266,9 +301,9 @@ long oggpackB_look(oggpack_buffer *b,int bits){ if(bits>16){ ret|=b->ptr[2]<<(8+b->endbit); if(bits>24){ - ret|=b->ptr[3]<<(b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]>>(8-b->endbit); + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); } } } @@ -327,10 +362,10 @@ long oggpack_read(oggpack_buffer *b,int bits){ if(bits>16){ ret|=b->ptr[2]<<(16-b->endbit); if(bits>24){ - ret|=b->ptr[3]<<(24-b->endbit); - if(bits>32 && b->endbit){ - ret|=b->ptr[4]<<(32-b->endbit); - } + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit){ + ret|=b->ptr[4]<<(32-b->endbit); + } } } } @@ -355,6 +390,9 @@ long oggpackB_read(oggpack_buffer *b,int bits){ /* not the main path */ ret=-1L; if(b->endbyte*8+bits>b->storage*8)goto overflow; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); } ret=b->ptr[0]<<(24+b->endbit); @@ -363,9 +401,9 @@ long oggpackB_read(oggpack_buffer *b,int bits){ if(bits>16){ ret|=b->ptr[2]<<(8+b->endbit); if(bits>24){ - ret|=b->ptr[3]<<(b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]>>(8-b->endbit); + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); } } } @@ -493,10 +531,10 @@ void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ report("looked at incorrect value!\n"); if(tbit==1) if(oggpack_look1(&r)!=(b[i]&mask[tbit])) - report("looked at single bit incorrect value!\n"); + report("looked at single bit incorrect value!\n"); if(tbit==1){ if(oggpack_read1(&r)!=(b[i]&mask[tbit])) - report("read incorrect single bit value!\n"); + report("read incorrect single bit value!\n"); }else{ if(oggpack_read(&r,tbit)!=(b[i]&mask[tbit])) report("read incorrect value!\n"); @@ -528,10 +566,10 @@ void cliptestB(unsigned long *b,int vals,int bits,int *comp,int compsize){ report("looked at incorrect value!\n"); if(tbit==1) if(oggpackB_look1(&r)!=(b[i]&mask[tbit])) - report("looked at single bit incorrect value!\n"); + report("looked at single bit incorrect value!\n"); if(tbit==1){ if(oggpackB_read1(&r)!=(b[i]&mask[tbit])) - report("read incorrect single bit value!\n"); + report("read incorrect single bit value!\n"); }else{ if(oggpackB_read(&r,tbit)!=(b[i]&mask[tbit])) report("read incorrect value!\n"); @@ -569,8 +607,8 @@ int main(void){ 34,242,223,136,35,222,211,86,171,50,225,135,214,75,172, 223,4}; static int oneB[33]={150,101,131,33,203,15,204,216,105,193,156,65,84,85,222, - 8,139,145,227,126,34,55,244,171,85,100,39,195,173,18, - 245,251,128}; + 8,139,145,227,126,34,55,244,171,85,100,39,195,173,18, + 245,251,128}; int twosize=6; static int two[6]={61,255,255,251,231,29}; @@ -582,25 +620,25 @@ int main(void){ 58,135,196,61,55,129,183,54,101,100,170,37,127,126,10, 100,52,4,14,18,86,77,1}; static int threeB[54]={206,128,42,153,57,8,183,251,13,89,36,30,32,144,183, - 130,59,240,121,59,85,223,19,228,180,134,33,107,74,98, - 233,253,196,135,63,2,110,114,50,155,90,127,37,170,104, - 200,20,254,4,58,106,176,144,0}; + 130,59,240,121,59,85,223,19,228,180,134,33,107,74,98, + 233,253,196,135,63,2,110,114,50,155,90,127,37,170,104, + 200,20,254,4,58,106,176,144,0}; int foursize=38; static int four[38]={18,6,163,252,97,194,104,131,32,1,7,82,137,42,129,11,72, 132,60,220,112,8,196,109,64,179,86,9,137,195,208,122,169, 28,2,133,0,1}; static int fourB[38]={36,48,102,83,243,24,52,7,4,35,132,10,145,21,2,93,2,41, - 1,219,184,16,33,184,54,149,170,132,18,30,29,98,229,67, - 129,10,4,32}; + 1,219,184,16,33,184,54,149,170,132,18,30,29,98,229,67, + 129,10,4,32}; int fivesize=45; static int five[45]={169,2,126,139,144,172,30,4,80,72,240,59,130,218,73,62, 241,24,210,44,4,20,0,248,116,49,135,100,110,130,181,169, 84,75,159,2,1,0,132,192,8,0,0,18,22}; static int fiveB[45]={1,84,145,111,245,100,128,8,56,36,40,71,126,78,213,226, - 124,105,12,0,133,128,0,162,233,242,67,152,77,205,77, - 172,150,169,129,79,128,0,6,4,32,0,27,9,0}; + 124,105,12,0,133,128,0,162,233,242,67,152,77,205,77, + 172,150,169,129,79,128,0,6,4,32,0,27,9,0}; int sixsize=7; static int six[7]={17,177,170,242,169,19,148}; @@ -633,7 +671,7 @@ int main(void){ if(oggpack_look(&r,32)==-1)report("out of data. failed!"); if(oggpack_look(&r,32)!=large[i]){ fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpack_look(&r,32),large[i], - oggpack_look(&r,32),large[i]); + oggpack_look(&r,32),large[i]); report("read incorrect value!\n"); } oggpack_adv(&r,32); @@ -719,7 +757,7 @@ int main(void){ if(oggpackB_look(&r,32)==-1)report("out of data. failed!"); if(oggpackB_look(&r,32)!=large[i]){ fprintf(stderr,"%ld != %ld (%lx!=%lx):",oggpackB_look(&r,32),large[i], - oggpackB_look(&r,32),large[i]); + oggpackB_look(&r,32),large[i]); report("read incorrect value!\n"); } oggpackB_adv(&r,32); diff --git a/media/libogg/src/ogg_framing.c b/media/libogg/src/ogg_framing.c index d9942d3ea4f9..b8a6fb0c9a8a 100644 --- a/media/libogg/src/ogg_framing.c +++ b/media/libogg/src/ogg_framing.c @@ -5,14 +5,14 @@ * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** - function: code raw [Vorbis] packets into framed OggSquish stream and + function: code raw packets into framed OggSquish stream and decode Ogg streams back into raw packets - last mod: $Id: framing.c 9601 2005-07-23 00:19:14Z giles $ + last mod: $Id: framing.c 16051 2009-05-27 05:00:06Z xiphmont $ note: The CRC code is directly derived from public domain code by Ross Williams (ross@guest.adelaide.edu.au). See docs/framing.html @@ -26,23 +26,23 @@ /* A complete description of Ogg framing exists in docs/framing.html */ -int ogg_page_version(ogg_page *og){ +int ogg_page_version(const ogg_page *og){ return((int)(og->header[4])); } -int ogg_page_continued(ogg_page *og){ +int ogg_page_continued(const ogg_page *og){ return((int)(og->header[5]&0x01)); } -int ogg_page_bos(ogg_page *og){ +int ogg_page_bos(const ogg_page *og){ return((int)(og->header[5]&0x02)); } -int ogg_page_eos(ogg_page *og){ +int ogg_page_eos(const ogg_page *og){ return((int)(og->header[5]&0x04)); } -ogg_int64_t ogg_page_granulepos(ogg_page *og){ +ogg_int64_t ogg_page_granulepos(const ogg_page *og){ unsigned char *page=og->header; ogg_int64_t granulepos=page[13]&(0xff); granulepos= (granulepos<<8)|(page[12]&0xff); @@ -55,18 +55,18 @@ ogg_int64_t ogg_page_granulepos(ogg_page *og){ return(granulepos); } -int ogg_page_serialno(ogg_page *og){ +int ogg_page_serialno(const ogg_page *og){ return(og->header[14] | - (og->header[15]<<8) | - (og->header[16]<<16) | - (og->header[17]<<24)); + (og->header[15]<<8) | + (og->header[16]<<16) | + (og->header[17]<<24)); } -long ogg_page_pageno(ogg_page *og){ +long ogg_page_pageno(const ogg_page *og){ return(og->header[18] | - (og->header[19]<<8) | - (og->header[20]<<16) | - (og->header[21]<<24)); + (og->header[19]<<8) | + (og->header[20]<<16) | + (og->header[21]<<24)); } @@ -88,7 +88,7 @@ more page packet), the return will be: ogg_page_continued(page) !=0 */ -int ogg_page_packets(ogg_page *og){ +int ogg_page_packets(const ogg_page *og){ int i,n=og->header[26],count=0; for(i=0;iheader[27+i]<255)count++; @@ -108,9 +108,9 @@ static ogg_uint32_t _ogg_crc_entry(unsigned long index){ for (i=0; i<8; i++) if (r & 0x80000000UL) r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator - polynomial, although we use an - unreflected alg and an init/final - of 0, not 0xffffffff */ + polynomial, although we use an + unreflected alg and an init/final + of 0, not 0xffffffff */ else r<<=1; return (r & 0xffffffffUL); @@ -189,12 +189,17 @@ int ogg_stream_init(ogg_stream_state *os,int serialno){ if(os){ memset(os,0,sizeof(*os)); os->body_storage=16*1024; - os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); - os->lacing_storage=1024; + + os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); os->lacing_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); os->granule_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); + if(!os->body_data || !os->lacing_vals || !os->granule_vals){ + ogg_stream_clear(os); + return -1; + } + os->serialno=serialno; return(0); @@ -202,6 +207,12 @@ int ogg_stream_init(ogg_stream_state *os,int serialno){ return(-1); } +/* async/delayed error detection for the ogg_stream_state */ +int ogg_stream_check(ogg_stream_state *os){ + if(!os || !os->body_data) return -1; + return 0; +} + /* _clear does not free os, only the non-flat storage within */ int ogg_stream_clear(ogg_stream_state *os){ if(os){ @@ -225,19 +236,41 @@ int ogg_stream_destroy(ogg_stream_state *os){ /* Helpers for ogg_stream_encode; this keeps the structure and what's happening fairly clear */ -static void _os_body_expand(ogg_stream_state *os,int needed){ +static int _os_body_expand(ogg_stream_state *os,int needed){ if(os->body_storage<=os->body_fill+needed){ + void *ret; + ret=_ogg_realloc(os->body_data,(os->body_storage+needed+1024)* + sizeof(*os->body_data)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } os->body_storage+=(needed+1024); - os->body_data=_ogg_realloc(os->body_data,os->body_storage*sizeof(*os->body_data)); + os->body_data=ret; } + return 0; } -static void _os_lacing_expand(ogg_stream_state *os,int needed){ +static int _os_lacing_expand(ogg_stream_state *os,int needed){ if(os->lacing_storage<=os->lacing_fill+needed){ + void *ret; + ret=_ogg_realloc(os->lacing_vals,(os->lacing_storage+needed+32)* + sizeof(*os->lacing_vals)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->lacing_vals=ret; + ret=_ogg_realloc(os->granule_vals,(os->lacing_storage+needed+32)* + sizeof(*os->granule_vals)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->granule_vals=ret; os->lacing_storage+=(needed+32); - os->lacing_vals=_ogg_realloc(os->lacing_vals,os->lacing_storage*sizeof(*os->lacing_vals)); - os->granule_vals=_ogg_realloc(os->granule_vals,os->lacing_storage*sizeof(*os->granule_vals)); } + return 0; } /* checksum the page */ @@ -268,8 +301,16 @@ void ogg_page_checksum_set(ogg_page *og){ } /* submit data to the internal buffer of the framing engine */ -int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ - int lacing_vals=op->bytes/255+1,i; +int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, + long e_o_s, ogg_int64_t granulepos){ + + int bytes = 0, lacing_vals, i; + + if(ogg_stream_check(os)) return -1; + if(!iov) return 0; + + for (i = 0; i < count; ++i) bytes += (int)iov[i].iov_len; + lacing_vals=bytes/255+1; if(os->body_returned){ /* advance packet data according to the body_returned pointer. We @@ -279,29 +320,31 @@ int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ os->body_fill-=os->body_returned; if(os->body_fill) memmove(os->body_data,os->body_data+os->body_returned, - os->body_fill); + os->body_fill); os->body_returned=0; } /* make sure we have the buffer storage */ - _os_body_expand(os,op->bytes); - _os_lacing_expand(os,lacing_vals); + if(_os_body_expand(os,bytes) || _os_lacing_expand(os,lacing_vals)) + return -1; /* Copy in the submitted packet. Yes, the copy is a waste; this is the liability of overly clean abstraction for the time being. It will actually be fairly easy to eliminate the extra copy in the future */ - memcpy(os->body_data+os->body_fill,op->packet,op->bytes); - os->body_fill+=op->bytes; + for (i = 0; i < count; ++i) { + memcpy(os->body_data+os->body_fill, iov[i].iov_base, iov[i].iov_len); + os->body_fill += (int)iov[i].iov_len; + } /* Store lacing vals for this packet */ for(i=0;ilacing_vals[os->lacing_fill+i]=255; os->granule_vals[os->lacing_fill+i]=os->granulepos; } - os->lacing_vals[os->lacing_fill+i]=(op->bytes)%255; - os->granulepos=os->granule_vals[os->lacing_fill+i]=op->granulepos; + os->lacing_vals[os->lacing_fill+i]=bytes%255; + os->granulepos=os->granule_vals[os->lacing_fill+i]=granulepos; /* flag the first segment as the beginning of the packet */ os->lacing_vals[os->lacing_fill]|= 0x100; @@ -311,11 +354,18 @@ int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ /* for the sake of completeness */ os->packetno++; - if(op->e_o_s)os->e_o_s=1; + if(e_o_s)os->e_o_s=1; return(0); } +int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ + ogg_iovec_t iov; + iov.iov_base = op->packet; + iov.iov_len = op->bytes; + return ogg_stream_iovecin(os, &iov, 1, op->e_o_s, op->granulepos); +} + /* This will flush remaining packets into a page (returning nonzero), even if there is not enough data to trigger a flush normally (undersized page). If there are no packets or partial packets to @@ -338,7 +388,8 @@ int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ long acc=0; ogg_int64_t granule_pos=-1; - if(maxvals==0)return(0); + if(ogg_stream_check(os)) return 0; + if(maxvals==0)return 0; /* construct a page */ /* decide how many segments to include */ @@ -349,8 +400,8 @@ int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ granule_pos=0; for(vals=0;valslacing_vals[vals]&0x0ff)<255){ - vals++; - break; + vals++; + break; } } }else{ @@ -395,10 +446,10 @@ int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ /* 32 bits of page counter (we have both counter and page header because this val can roll over) */ if(os->pageno==-1)os->pageno=0; /* because someone called - stream_reset; this would be a - strange thing to do in an - encode stream, but it has - plausible uses */ + stream_reset; this would be a + strange thing to do in an + encode stream, but it has + plausible uses */ { long pageno=os->pageno++; for(i=18;i<22;i++){ @@ -445,6 +496,7 @@ returned are to static buffers; do not free. The returned buffers are good only until the next call (using the same ogg_stream_state) */ int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ + if(ogg_stream_check(os)) return 0; if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ os->body_fill-os->body_returned > 4096 ||/* 'page nominal size' case */ @@ -455,10 +507,11 @@ int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ } /* not enough data to construct a page and not end of stream */ - return(0); + return 0; } int ogg_stream_eos(ogg_stream_state *os){ + if(ogg_stream_check(os)) return 1; return os->e_o_s; } @@ -480,6 +533,7 @@ int ogg_stream_eos(ogg_stream_state *os){ /* initialize the struct to a known state */ int ogg_sync_init(ogg_sync_state *oy){ if(oy){ + oy->storage = -1; /* used as a readiness flag */ memset(oy,0,sizeof(*oy)); } return(0); @@ -489,7 +543,7 @@ int ogg_sync_init(ogg_sync_state *oy){ int ogg_sync_clear(ogg_sync_state *oy){ if(oy){ if(oy->data)_ogg_free(oy->data); - ogg_sync_init(oy); + memset(oy,0,sizeof(*oy)); } return(0); } @@ -502,7 +556,13 @@ int ogg_sync_destroy(ogg_sync_state *oy){ return(0); } +int ogg_sync_check(ogg_sync_state *oy){ + if(oy->storage<0) return -1; + return 0; +} + char *ogg_sync_buffer(ogg_sync_state *oy, long size){ + if(ogg_sync_check(oy)) return NULL; /* first, clear out any space that has been previously returned */ if(oy->returned){ @@ -515,11 +575,17 @@ char *ogg_sync_buffer(ogg_sync_state *oy, long size){ if(size>oy->storage-oy->fill){ /* We need to extend the internal buffer */ long newsize=size+oy->fill+4096; /* an extra page to be nice */ + void *ret; if(oy->data) - oy->data=_ogg_realloc(oy->data,newsize); + ret=_ogg_realloc(oy->data,newsize); else - oy->data=_ogg_malloc(newsize); + ret=_ogg_malloc(newsize); + if(!ret){ + ogg_sync_clear(oy); + return NULL; + } + oy->data=ret; oy->storage=newsize; } @@ -528,7 +594,8 @@ char *ogg_sync_buffer(ogg_sync_state *oy, long size){ } int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ - if(oy->fill+bytes>oy->storage)return(-1); + if(ogg_sync_check(oy))return -1; + if(oy->fill+bytes>oy->storage)return -1; oy->fill+=bytes; return(0); } @@ -547,6 +614,8 @@ long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ unsigned char *page=oy->data+oy->returned; unsigned char *next; long bytes=oy->fill-oy->returned; + + if(ogg_sync_check(oy))return 0; if(oy->headerbytes==0){ int headerbytes,i; @@ -586,7 +655,7 @@ long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ /* Compare */ if(memcmp(chksum,page+22,4)){ /* D'oh. Mismatch! Corrupt page (or miscapture and not a page - at all) */ + at all) */ /* replace the computed checksum with the one actually read in */ memcpy(page+22,chksum,4); @@ -624,8 +693,8 @@ long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ if(!next) next=oy->data+oy->fill; - oy->returned=next-oy->data; - return(-(next-page)); + oy->returned=(int)(next-oy->data); + return((long)-(next-page)); } /* sync the stream and get a page. Keep trying until we find a page. @@ -641,6 +710,8 @@ long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ + if(ogg_sync_check(oy))return 0; + /* all we need to do is verify a page at the head of the stream buffer. If it doesn't verify, we look for the next potential frame */ @@ -685,6 +756,8 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ long pageno=ogg_page_pageno(og); int segments=header[26]; + if(ogg_stream_check(os)) return -1; + /* clean up 'returned data' */ { long lr=os->lacing_returned; @@ -694,17 +767,17 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ if(br){ os->body_fill-=br; if(os->body_fill) - memmove(os->body_data,os->body_data+br,os->body_fill); + memmove(os->body_data,os->body_data+br,os->body_fill); os->body_returned=0; } if(lr){ /* segment table */ if(os->lacing_fill-lr){ - memmove(os->lacing_vals,os->lacing_vals+lr, - (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); - memmove(os->granule_vals,os->granule_vals+lr, - (os->lacing_fill-lr)*sizeof(*os->granule_vals)); + memmove(os->lacing_vals,os->lacing_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->granule_vals)); } os->lacing_fill-=lr; os->lacing_packet-=lr; @@ -716,7 +789,7 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ if(serialno!=os->serialno)return(-1); if(version>0)return(-1); - _os_lacing_expand(os,segments+1); + if(_os_lacing_expand(os,segments+1)) return -1; /* are we in sequence? */ if(pageno!=os->pageno){ @@ -741,19 +814,19 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ os->lacing_vals[os->lacing_fill-1]==0x400){ bos=0; for(;segptrbody_data+os->body_fill,body,bodysize); os->body_fill+=bodysize; } @@ -766,8 +839,8 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ os->granule_vals[os->lacing_fill]=-1; if(bos){ - os->lacing_vals[os->lacing_fill]|=0x100; - bos=0; + os->lacing_vals[os->lacing_fill]|=0x100; + bos=0; } if(val<255)saved=os->lacing_fill; @@ -798,6 +871,8 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ /* clear things to an initial state. Good to call, eg, before seeking */ int ogg_sync_reset(ogg_sync_state *oy){ + if(ogg_sync_check(oy))return -1; + oy->fill=0; oy->returned=0; oy->unsynced=0; @@ -807,6 +882,8 @@ int ogg_sync_reset(ogg_sync_state *oy){ } int ogg_stream_reset(ogg_stream_state *os){ + if(ogg_stream_check(os)) return -1; + os->body_fill=0; os->body_returned=0; @@ -826,6 +903,7 @@ int ogg_stream_reset(ogg_stream_state *os){ } int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ + if(ogg_stream_check(os)) return -1; ogg_stream_reset(os); os->serialno=serialno; return(0); @@ -886,10 +964,12 @@ static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ } int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ + if(ogg_stream_check(os)) return 0; return _packetout(os,op,1); } int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ + if(ogg_stream_check(os)) return 0; return _packetout(os,op,0); } @@ -930,7 +1010,7 @@ void checkpacket(ogg_packet *op,int len, int no, int pos){ lastno=no; if(op->packetno!=sequence){ fprintf(stderr,"incorrect packet sequence %ld != %d\n", - (long)(op->packetno),sequence); + (long)(op->packetno),sequence); exit(1); } @@ -938,7 +1018,7 @@ void checkpacket(ogg_packet *op,int len, int no, int pos){ for(j=0;jbytes;j++) if(op->packet[j]!=((j+no)&0xff)){ fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", - j,op->packet[j],(j+no)&0xff); + j,op->packet[j],(j+no)&0xff); exit(1); } } @@ -949,7 +1029,7 @@ void check_page(unsigned char *data,const int *header,ogg_page *og){ for(j=0;jbody_len;j++) if(og->body[j]!=data[j]){ fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", - j,data[j],og->body[j]); + j,data[j],og->body[j]); exit(1); } @@ -958,14 +1038,14 @@ void check_page(unsigned char *data,const int *header,ogg_page *og){ if(og->header[j]!=header[j]){ fprintf(stderr,"header content mismatch at pos %ld:\n",j); for(j=0;jheader[j]); + fprintf(stderr," (%ld)%02x:%02x",j,header[j],og->header[j]); fprintf(stderr,"\n"); exit(1); } } if(og->header_len!=header[26]+27){ fprintf(stderr,"header length incorrect! (%ld!=%d)\n", - og->header_len,header[26]+27); + og->header_len,header[26]+27); exit(1); } } @@ -974,21 +1054,21 @@ void print_header(ogg_page *og){ int j; fprintf(stderr,"\nHEADER:\n"); fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", - og->header[0],og->header[1],og->header[2],og->header[3], - (int)og->header[4],(int)og->header[5]); + og->header[0],og->header[1],og->header[2],og->header[3], + (int)og->header[4],(int)og->header[5]); fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", - (og->header[9]<<24)|(og->header[8]<<16)| - (og->header[7]<<8)|og->header[6], - (og->header[17]<<24)|(og->header[16]<<16)| - (og->header[15]<<8)|og->header[14], - ((long)(og->header[21])<<24)|(og->header[20]<<16)| - (og->header[19]<<8)|og->header[18]); + (og->header[9]<<24)|(og->header[8]<<16)| + (og->header[7]<<8)|og->header[6], + (og->header[17]<<24)|(og->header[16]<<16)| + (og->header[15]<<8)|og->header[14], + ((long)(og->header[21])<<24)|(og->header[20]<<16)| + (og->header[19]<<8)|og->header[18]); fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", - (int)og->header[22],(int)og->header[23], - (int)og->header[24],(int)og->header[25], - (int)og->header[26]); + (int)og->header[22],(int)og->header[23], + (int)og->header[24],(int)og->header[25], + (int)og->header[26]); for(j=27;jheader_len;j++) fprintf(stderr,"%d ",(int)og->header[j]); @@ -1017,192 +1097,192 @@ void error(void){ /* 17 only */ const int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x15,0xed,0xec,0x91, - 1, - 17}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x15,0xed,0xec,0x91, + 1, + 17}; /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ const int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x59,0x10,0x6c,0x2c, - 1, - 17}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x59,0x10,0x6c,0x2c, + 1, + 17}; const int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x89,0x33,0x85,0xce, - 13, - 254,255,0,255,1,255,245,255,255,0, - 255,255,90}; + 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x89,0x33,0x85,0xce, + 13, + 254,255,0,255,1,255,245,255,255,0, + 255,255,90}; /* nil packets; beginning,middle,end */ const int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; const int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x5c,0x3f,0x66,0xcb, - 17, - 17,254,255,0,0,255,1,0,255,245,255,255,0, - 255,255,90,0}; + 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x5c,0x3f,0x66,0xcb, + 17, + 17,254,255,0,0,255,1,0,255,245,255,255,0, + 255,255,90,0}; /* large initial packet */ const int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x01,0x27,0x31,0xaa, - 18, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,10}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x01,0x27,0x31,0xaa, + 18, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10}; const int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x7f,0x4e,0x8a,0xd2, - 4, - 255,4,255,0}; + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x7f,0x4e,0x8a,0xd2, + 4, + 255,4,255,0}; /* continuing packet test */ const int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; const int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x54,0x05,0x51,0xc8, - 17, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255}; + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x54,0x05,0x51,0xc8, + 17, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255}; const int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0xc8,0xc3,0xcb,0xed, - 5, - 10,255,4,255,0}; + 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xc8,0xc3,0xcb,0xed, + 5, + 10,255,4,255,0}; /* page with the 255 segment limit */ const int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; const int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0xed,0x2a,0x2e,0xa7, - 255, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10}; + 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xed,0x2a,0x2e,0xa7, + 255, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10}; const int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x6c,0x3b,0x82,0x3d, - 1, - 50}; + 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x6c,0x3b,0x82,0x3d, + 1, + 50}; /* packet that overspans over an entire page */ const int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; const int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x3c,0xd9,0x4d,0x3f, - 17, - 100,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255}; + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x3c,0xd9,0x4d,0x3f, + 17, + 100,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255}; const int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x01,0xd2,0xe5,0xe5, - 17, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255}; + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x01,0xd2,0xe5,0xe5, + 17, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255}; const int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,3,0,0,0, - 0xef,0xdd,0x88,0xde, - 7, - 255,255,75,255,4,255,0}; + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,3,0,0,0, + 0xef,0xdd,0x88,0xde, + 7, + 255,255,75,255,4,255,0}; /* packet that overspans over an entire page */ const int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; const int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x3c,0xd9,0x4d,0x3f, - 17, - 100,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255}; + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x3c,0xd9,0x4d,0x3f, + 17, + 100,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255}; const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0xd4,0xe0,0x60,0xe5, - 1,0}; + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xd4,0xe0,0x60,0xe5, + 1,0}; void test_pack(const int *pl, const int **headers, int byteskip, - int pageskip, int packetskip){ + int pageskip, int packetskip){ unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ long inptr=0; long outptr=0; @@ -1246,109 +1326,109 @@ void test_pack(const int *pl, const int **headers, int byteskip, ogg_page og; while(ogg_stream_pageout(&os_en,&og)){ - /* We have a page. Check it carefully */ + /* We have a page. Check it carefully */ - fprintf(stderr,"%ld, ",pageno); + fprintf(stderr,"%ld, ",pageno); - if(headers[pageno]==NULL){ - fprintf(stderr,"coded too many pages!\n"); - exit(1); - } + if(headers[pageno]==NULL){ + fprintf(stderr,"coded too many pages!\n"); + exit(1); + } - check_page(data+outptr,headers[pageno],&og); + check_page(data+outptr,headers[pageno],&og); - outptr+=og.body_len; - pageno++; - if(pageskip){ - bosflag=1; - pageskip--; - deptr+=og.body_len; - } + outptr+=og.body_len; + pageno++; + if(pageskip){ + bosflag=1; + pageskip--; + deptr+=og.body_len; + } - /* have a complete page; submit it to sync/decode */ + /* have a complete page; submit it to sync/decode */ - { - ogg_page og_de; - ogg_packet op_de,op_de2; - char *buf=ogg_sync_buffer(&oy,og.header_len+og.body_len); - char *next=buf; - byteskipcount+=og.header_len; - if(byteskipcount>byteskip){ - memcpy(next,og.header,byteskipcount-byteskip); - next+=byteskipcount-byteskip; - byteskipcount=byteskip; - } + { + ogg_page og_de; + ogg_packet op_de,op_de2; + char *buf=ogg_sync_buffer(&oy,og.header_len+og.body_len); + char *next=buf; + byteskipcount+=og.header_len; + if(byteskipcount>byteskip){ + memcpy(next,og.header,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } - byteskipcount+=og.body_len; - if(byteskipcount>byteskip){ - memcpy(next,og.body,byteskipcount-byteskip); - next+=byteskipcount-byteskip; - byteskipcount=byteskip; - } + byteskipcount+=og.body_len; + if(byteskipcount>byteskip){ + memcpy(next,og.body,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } - ogg_sync_wrote(&oy,next-buf); + ogg_sync_wrote(&oy,next-buf); - while(1){ - int ret=ogg_sync_pageout(&oy,&og_de); - if(ret==0)break; - if(ret<0)continue; - /* got a page. Happy happy. Verify that it's good. */ - - fprintf(stderr,"(%ld), ",pageout); + while(1){ + int ret=ogg_sync_pageout(&oy,&og_de); + if(ret==0)break; + if(ret<0)continue; + /* got a page. Happy happy. Verify that it's good. */ + + fprintf(stderr,"(%ld), ",pageout); - check_page(data+deptr,headers[pageout],&og_de); - deptr+=og_de.body_len; - pageout++; + check_page(data+deptr,headers[pageout],&og_de); + deptr+=og_de.body_len; + pageout++; - /* submit it to deconstitution */ - ogg_stream_pagein(&os_de,&og_de); + /* submit it to deconstitution */ + ogg_stream_pagein(&os_de,&og_de); - /* packets out? */ - while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ - ogg_stream_packetpeek(&os_de,NULL); - ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ - - /* verify peek and out match */ - if(memcmp(&op_de,&op_de2,sizeof(op_de))){ - fprintf(stderr,"packetout != packetpeek! pos=%ld\n", - depacket); - exit(1); - } + /* packets out? */ + while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ + ogg_stream_packetpeek(&os_de,NULL); + ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ + + /* verify peek and out match */ + if(memcmp(&op_de,&op_de2,sizeof(op_de))){ + fprintf(stderr,"packetout != packetpeek! pos=%ld\n", + depacket); + exit(1); + } - /* verify the packet! */ - /* check data */ - if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ - fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", - depacket); - exit(1); - } - /* check bos flag */ - if(bosflag==0 && op_de.b_o_s==0){ - fprintf(stderr,"b_o_s flag not set on packet!\n"); - exit(1); - } - if(bosflag && op_de.b_o_s){ - fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); - exit(1); - } - bosflag=1; - depacket+=op_de.bytes; - - /* check eos flag */ - if(eosflag){ - fprintf(stderr,"Multiple decoded packets with eos flag!\n"); - exit(1); - } + /* verify the packet! */ + /* check data */ + if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ + fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", + depacket); + exit(1); + } + /* check bos flag */ + if(bosflag==0 && op_de.b_o_s==0){ + fprintf(stderr,"b_o_s flag not set on packet!\n"); + exit(1); + } + if(bosflag && op_de.b_o_s){ + fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); + exit(1); + } + bosflag=1; + depacket+=op_de.bytes; + + /* check eos flag */ + if(eosflag){ + fprintf(stderr,"Multiple decoded packets with eos flag!\n"); + exit(1); + } - if(op_de.e_o_s)eosflag=1; + if(op_de.e_o_s)eosflag=1; - /* check granulepos flag */ - if(op_de.granulepos!=-1){ - fprintf(stderr," granule:%ld ",(long)op_de.granulepos); - } - } - } - } + /* check granulepos flag */ + if(op_de.granulepos!=-1){ + fprintf(stderr," granule:%ld ",(long)op_de.granulepos); + } + } + } + } } } } @@ -1438,37 +1518,37 @@ int main(void){ { const int packets[]={0,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,50,-1}; + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,50,-1}; const int *headret[]={head1_5,head2_5,head3_5,NULL}; fprintf(stderr,"testing max packet segments... "); @@ -1532,8 +1612,8 @@ int main(void){ /* retrieve finished pages */ for(i=0;i<5;i++){ if(ogg_stream_pageout(&os_en,&og[i])==0){ - fprintf(stderr,"Too few pages output building sync tests!\n"); - exit(1); + fprintf(stderr,"Too few pages output building sync tests!\n"); + exit(1); } copy_page(&og[i]); } @@ -1548,11 +1628,11 @@ int main(void){ ogg_sync_reset(&oy); ogg_stream_reset(&os_de); for(i=0;i<5;i++){ - memcpy(ogg_sync_buffer(&oy,og[i].header_len),og[i].header, - og[i].header_len); - ogg_sync_wrote(&oy,og[i].header_len); - memcpy(ogg_sync_buffer(&oy,og[i].body_len),og[i].body,og[i].body_len); - ogg_sync_wrote(&oy,og[i].body_len); + memcpy(ogg_sync_buffer(&oy,og[i].header_len),og[i].header, + og[i].header_len); + ogg_sync_wrote(&oy,og[i].header_len); + memcpy(ogg_sync_buffer(&oy,og[i].body_len),og[i].body,og[i].body_len); + ogg_sync_wrote(&oy,og[i].body_len); } ogg_sync_pageout(&oy,&temp); @@ -1573,8 +1653,8 @@ int main(void){ if(ogg_stream_packetout(&os_de,&test)!=1)error(); checkpacket(&test,4079,2,3000); if(ogg_stream_packetout(&os_de,&test)!=-1){ - fprintf(stderr,"Error: loss of page did not return error\n"); - exit(1); + fprintf(stderr,"Error: loss of page did not return error\n"); + exit(1); } if(ogg_stream_packetout(&os_de,&test)!=1)error(); checkpacket(&test,76,5,-1); @@ -1593,11 +1673,11 @@ int main(void){ ogg_sync_reset(&oy); ogg_stream_reset(&os_de); for(i=0;i<5;i++){ - memcpy(ogg_sync_buffer(&oy,og[i].header_len),og[i].header, - og[i].header_len); - ogg_sync_wrote(&oy,og[i].header_len); - memcpy(ogg_sync_buffer(&oy,og[i].body_len),og[i].body,og[i].body_len); - ogg_sync_wrote(&oy,og[i].body_len); + memcpy(ogg_sync_buffer(&oy,og[i].header_len),og[i].header, + og[i].header_len); + ogg_sync_wrote(&oy,og[i].header_len); + memcpy(ogg_sync_buffer(&oy,og[i].body_len),og[i].body,og[i].body_len); + ogg_sync_wrote(&oy,og[i].body_len); } ogg_sync_pageout(&oy,&temp); @@ -1622,8 +1702,8 @@ int main(void){ if(ogg_stream_packetout(&os_de,&test)!=1)error(); checkpacket(&test,2956,3,4000); if(ogg_stream_packetout(&os_de,&test)!=-1){ - fprintf(stderr,"Error: loss of page did not return error\n"); - exit(1); + fprintf(stderr,"Error: loss of page did not return error\n"); + exit(1); } if(ogg_stream_packetout(&os_de,&test)!=1)error(); checkpacket(&test,300,13,14000); @@ -1637,26 +1717,26 @@ int main(void){ fprintf(stderr,"Testing sync on partial inputs... "); ogg_sync_reset(&oy); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - 3); + 3); ogg_sync_wrote(&oy,3); if(ogg_sync_pageout(&oy,&og_de)>0)error(); /* Test fractional page inputs: incomplete fixed header */ memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, - 20); + 20); ogg_sync_wrote(&oy,20); if(ogg_sync_pageout(&oy,&og_de)>0)error(); /* Test fractional page inputs: incomplete header */ memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, - 5); + 5); ogg_sync_wrote(&oy,5); if(ogg_sync_pageout(&oy,&og_de)>0)error(); /* Test fractional page inputs: incomplete body */ memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, - og[1].header_len-28); + og[1].header_len-28); ogg_sync_wrote(&oy,og[1].header_len-28); if(ogg_sync_pageout(&oy,&og_de)>0)error(); @@ -1665,7 +1745,7 @@ int main(void){ if(ogg_sync_pageout(&oy,&og_de)>0)error(); memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, - og[1].body_len-1000); + og[1].body_len-1000); ogg_sync_wrote(&oy,og[1].body_len-1000); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); @@ -1679,24 +1759,24 @@ int main(void){ ogg_sync_reset(&oy); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); + og[1].header_len); ogg_sync_wrote(&oy,og[1].header_len); memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); + og[1].body_len); ogg_sync_wrote(&oy,og[1].body_len); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - 20); + 20); ogg_sync_wrote(&oy,20); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); if(ogg_sync_pageout(&oy,&og_de)>0)error(); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, - og[1].header_len-20); + og[1].header_len-20); ogg_sync_wrote(&oy,og[1].header_len-20); memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); + og[1].body_len); ogg_sync_wrote(&oy,og[1].body_len); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); @@ -1711,29 +1791,29 @@ int main(void){ /* 'garbage' */ memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); + og[1].body_len); ogg_sync_wrote(&oy,og[1].body_len); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); + og[1].header_len); ogg_sync_wrote(&oy,og[1].header_len); memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); + og[1].body_len); ogg_sync_wrote(&oy,og[1].body_len); memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - 20); + 20); ogg_sync_wrote(&oy,20); if(ogg_sync_pageout(&oy,&og_de)>0)error(); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); if(ogg_sync_pageout(&oy,&og_de)>0)error(); memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, - og[2].header_len-20); + og[2].header_len-20); ogg_sync_wrote(&oy,og[2].header_len-20); memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, - og[2].body_len); + og[2].body_len); ogg_sync_wrote(&oy,og[2].body_len); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); @@ -1747,33 +1827,33 @@ int main(void){ ogg_sync_reset(&oy); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); + og[1].header_len); ogg_sync_wrote(&oy,og[1].header_len); memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); + og[1].body_len); ogg_sync_wrote(&oy,og[1].body_len); memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - og[2].header_len); + og[2].header_len); ogg_sync_wrote(&oy,og[2].header_len); memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - og[2].header_len); + og[2].header_len); ogg_sync_wrote(&oy,og[2].header_len); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, - og[2].body_len-5); + og[2].body_len-5); ogg_sync_wrote(&oy,og[2].body_len-5); memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, - og[3].header_len); + og[3].header_len); ogg_sync_wrote(&oy,og[3].header_len); memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, - og[3].body_len); + og[3].body_len); ogg_sync_wrote(&oy,og[3].body_len); if(ogg_sync_pageout(&oy,&og_de)>0)error(); @@ -1785,7 +1865,7 @@ int main(void){ /* Free page data that was previously copied */ { for(i=0;i<5;i++){ - free_page(&og[i]); + free_page(&og[i]); } } }