author | Chris Pearce <chris@pearce.org.nz> |
Thu, 10 Jun 2010 16:40:18 +1200 | |
changeset 43448 | 8b2f4c1f0d67881157eed67fd7c1fd83eb695783 |
parent 43447 | 9b49ef1d36dd98cadd77f3e293eb1d01266855f1 |
child 43449 | 536b86bfc05fe649d7e79b2a7060b79c37c18f88 |
push id | 13714 |
push user | cpearce@mozilla.com |
push date | Thu, 10 Jun 2010 04:41:47 +0000 |
treeherder | mozilla-central@8b2f4c1f0d67 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
milestone | 1.9.3a5pre |
backs out | 9b49ef1d36dd98cadd77f3e293eb1d01266855f1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/media/libogg/CHANGES +++ b/media/libogg/CHANGES @@ -1,15 +1,8 @@ -Version 1.2.0 (2010 March 25) - -* Alter default flushing behavior to span less often and use larger page - sizes when packet sizes are large. -* Build fixes for additional compilers -* Documentation updates - 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
--- a/media/libogg/README_MOZILLA +++ b/media/libogg/README_MOZILLA @@ -1,10 +1,10 @@ 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 r17270. +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
--- a/media/libogg/include/ogg/ogg.h +++ b/media/libogg/include/ogg/ogg.h @@ -6,17 +6,17 @@ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * 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 17098 2010-03-29 05:35:11Z gmaxwell $ + last mod: $Id: ogg.h 16051 2009-05-27 05:00:06Z xiphmont $ ********************************************************************/ #ifndef _OGG_H #define _OGG_H #ifdef __cplusplus extern "C" { #endif @@ -154,17 +154,16 @@ extern long oggpackB_bits(oggpack_buffe 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_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill); extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); /* Ogg BITSTREAM PRIMITIVES: decoding **************************/ 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);
--- a/media/libogg/include/ogg/os_types.h +++ b/media/libogg/include/ogg/os_types.h @@ -6,42 +6,29 @@ * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os_types.h 17270 2010-06-04 06:01:33Z xiphmont $ + last mod: $Id: os_types.h 16649 2009-10-25 00:49:58Z ds $ ********************************************************************/ #ifndef _OS_TYPES_H #define _OS_TYPES_H /* make it easy on the folks that want to compile the libs with a different malloc than stdlib */ #define _ogg_malloc malloc #define _ogg_calloc calloc #define _ogg_realloc realloc #define _ogg_free free -/* get non-brittle portable type-based MIN/MAX. Assumes 2's-complement - math */ -#define TYPE_HALF_MAX_SIGNED(type) \ - ((typeof(type))1 << (sizeof(type)*8-2)) -#define TYPE_MAX_SIGNED(type) \ - (TYPE_HALF_MAX_SIGNED(type) - 1 + TYPE_HALF_MAX_SIGNED(type)) -#define TYPE_MIN_SIGNED(type) \ - (-1 - TYPE_MAX_SIGNED(type)) -#define TYPE_MIN(type) \ - ((typeof(type))-1 < 1?TYPE_MIN_SIGNED(type):(typeof(type))0) -#define TYPE_MAX(type) \ - ((typeof(type))~TYPE_MIN(type)) - #if defined(_WIN32) # if defined(__CYGWIN__) # include <stdint.h> typedef int16_t ogg_int16_t; typedef uint16_t ogg_uint16_t; typedef int32_t ogg_int32_t; typedef uint32_t ogg_uint32_t;
--- a/media/libogg/src/ogg_bitwise.c +++ b/media/libogg/src/ogg_bitwise.c @@ -1,22 +1,22 @@ /******************************************************************** * * - * THIS FILE IS PART OF THE Ogg CONTAINER SOURCE CODE. * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * 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-2010 * + * 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 17270 2010-06-04 06:01:33Z xiphmont $ + last mod: $Id: bitwise.c 16051 2009-05-27 05:00:06Z xiphmont $ ********************************************************************/ /* We're 'LSb' endian; if we write a word but read individual bits, then we'll read the lsb first */ #include <string.h> #include <stdlib.h> @@ -75,23 +75,24 @@ void oggpackB_writetrunc(oggpack_buffer 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(bits<0 || bits>32) goto err; - if(b->endbyte>=b->storage-4){ + if(b->endbyte+4>=b->storage){ void *ret; if(!b->ptr)return; - if(b->storage>TYPE_MAX(b->storage)-BUFFER_INCREMENT) goto err; ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); - if(!ret) goto err; + if(!ret){ + oggpack_writeclear(b); + return; + } b->buffer=ret; b->storage+=BUFFER_INCREMENT; b->ptr=b->buffer+b->endbyte; } value&=mask[bits]; bits+=b->endbit; @@ -111,30 +112,28 @@ void oggpack_write(oggpack_buffer *b,uns } } } } b->endbyte+=bits/8; b->ptr+=bits/8; b->endbit=bits&7; - return; - err: - oggpack_writeclear(b); } /* Takes only up to 32 bits. */ void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ - if(bits<0 || bits>32) goto err; - if(b->endbyte>=b->storage-4){ + if(b->endbyte+4>=b->storage){ void *ret; if(!b->ptr)return; - if(b->storage>TYPE_MAX(b->storage)-BUFFER_INCREMENT) goto err; ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); - if(!ret) goto err; + if(!ret){ + oggpack_writeclear(b); + return; + } b->buffer=ret; b->storage+=BUFFER_INCREMENT; b->ptr=b->buffer+b->endbyte; } value=(value&mask[bits])<<(32-bits); bits+=b->endbit; @@ -154,19 +153,16 @@ void oggpackB_write(oggpack_buffer *b,un } } } } b->endbyte+=bits/8; b->ptr+=bits/8; b->endbit=bits&7; - return; - err: - oggpack_writeclear(b); } void oggpack_writealign(oggpack_buffer *b){ int bits=8-b->endbit; if(bits<8) oggpack_write(b,0,bits); } @@ -192,40 +188,39 @@ static void oggpack_writecopy_helper(ogg int i; /* unaligned copy. Do it the hard way. */ for(i=0;i<bytes;i++) w(b,(unsigned long)(ptr[i]),8); }else{ /* aligned block copy */ if(b->endbyte+bytes+1>=b->storage){ void *ret; - if(!b->ptr) goto err; - if(b->endbyte+bytes+BUFFER_INCREMENT>b->storage) goto err; + if(!b->ptr)return; b->storage=b->endbyte+bytes+BUFFER_INCREMENT; ret=_ogg_realloc(b->buffer,b->storage); - if(!ret) goto err; + if(!ret){ + oggpack_writeclear(b); + return; + } b->buffer=ret; b->ptr=b->buffer+b->endbyte; } memmove(b->ptr,source,bytes); b->ptr+=bytes; b->endbyte+=bytes; *b->ptr=0; } if(bits){ if(msb) w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits); else w(b,(unsigned long)(ptr[bytes]),bits); } - return; - err: - oggpack_writeclear(b); } void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ oggpack_writecopy_helper(b,source,bits,oggpack_write,0); } void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ oggpack_writecopy_helper(b,source,bits,oggpackB_write,1); @@ -259,30 +254,25 @@ void oggpack_readinit(oggpack_buffer *b, void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ oggpack_readinit(b,buf,bytes); } /* Read in bits without advancing the bitptr; bits <= 32 */ long oggpack_look(oggpack_buffer *b,int bits){ unsigned long ret; - unsigned long m; + unsigned long m=mask[bits]; - if(bits<0 || bits>32) return -1; - m=mask[bits]; bits+=b->endbit; - if(b->endbyte >= b->storage-4){ + if(b->endbyte+4>=b->storage){ /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) return -1; - /* 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); + if(b->endbyte*8+bits>b->storage*8)return(-1); } - + ret=b->ptr[0]>>b->endbit; if(bits>8){ ret|=b->ptr[1]<<(8-b->endbit); 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) @@ -293,27 +283,23 @@ long oggpack_look(oggpack_buffer *b,int return(m&ret); } /* Read in bits without advancing the bitptr; bits <= 32 */ long oggpackB_look(oggpack_buffer *b,int bits){ unsigned long ret; int m=32-bits; - if(m<0 || m>32) return -1; bits+=b->endbit; - if(b->endbyte >= b->storage-4){ + if(b->endbyte+4>=b->storage){ /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) return -1; - /* 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); + if(b->endbyte*8+bits>b->storage*8)return(-1); } - + ret=b->ptr[0]<<(24+b->endbit); if(bits>8){ ret|=b->ptr[1]<<(16+b->endbit); if(bits>16){ ret|=b->ptr[2]<<(8+b->endbit); if(bits>24){ ret|=b->ptr[3]<<(b->endbit); if(bits>32 && b->endbit) @@ -331,28 +317,19 @@ long oggpack_look1(oggpack_buffer *b){ long oggpackB_look1(oggpack_buffer *b){ if(b->endbyte>=b->storage)return(-1); return((b->ptr[0]>>(7-b->endbit))&1); } void oggpack_adv(oggpack_buffer *b,int bits){ bits+=b->endbit; - - if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; - b->ptr+=bits/8; b->endbyte+=bits/8; b->endbit=bits&7; - return; - - overflow: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; } void oggpackB_adv(oggpack_buffer *b,int bits){ oggpack_adv(b,bits); } void oggpack_adv1(oggpack_buffer *b){ if(++(b->endbit)>7){ @@ -364,140 +341,129 @@ void oggpack_adv1(oggpack_buffer *b){ void oggpackB_adv1(oggpack_buffer *b){ oggpack_adv1(b); } /* bits <= 32 */ long oggpack_read(oggpack_buffer *b,int bits){ long ret; - unsigned long m; + unsigned long m=mask[bits]; - if(bits<0 || bits>32) goto err; - m=mask[bits]; bits+=b->endbit; - if(b->endbyte >= b->storage-4){ + if(b->endbyte+4>=b->storage){ /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) 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=-1L; + if(b->endbyte*8+bits>b->storage*8)goto overflow; } - + ret=b->ptr[0]>>b->endbit; if(bits>8){ ret|=b->ptr[1]<<(8-b->endbit); 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&=m; + + overflow: + b->ptr+=bits/8; b->endbyte+=bits/8; b->endbit=bits&7; - return ret; - - overflow: - err: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; + return(ret); } /* bits <= 32 */ long oggpackB_read(oggpack_buffer *b,int bits){ long ret; long m=32-bits; - - if(m<0 || m>32) goto err; + bits+=b->endbit; if(b->endbyte+4>=b->storage){ /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + 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); if(bits>8){ ret|=b->ptr[1]<<(16+b->endbit); 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=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1); + + overflow: b->ptr+=bits/8; b->endbyte+=bits/8; b->endbit=bits&7; - return ret; - - overflow: - err: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; + return(ret); } long oggpack_read1(oggpack_buffer *b){ long ret; + + if(b->endbyte>=b->storage){ + /* not the main path */ + ret=-1L; + goto overflow; + } - if(b->endbyte >= b->storage) goto overflow; ret=(b->ptr[0]>>b->endbit)&1; + + overflow: b->endbit++; if(b->endbit>7){ b->endbit=0; b->ptr++; b->endbyte++; } - return ret; - - overflow: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; + return(ret); } long oggpackB_read1(oggpack_buffer *b){ long ret; + + if(b->endbyte>=b->storage){ + /* not the main path */ + ret=-1L; + goto overflow; + } - if(b->endbyte >= b->storage) goto overflow; ret=(b->ptr[0]>>(7-b->endbit))&1; + + overflow: b->endbit++; if(b->endbit>7){ b->endbit=0; b->ptr++; b->endbyte++; } - return ret; - - overflow: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; + return(ret); } long oggpack_bytes(oggpack_buffer *b){ return(b->endbyte+(b->endbit+7)/8); } long oggpack_bits(oggpack_buffer *b){ return(b->endbyte*8+b->endbit); @@ -721,29 +687,29 @@ int main(void){ cliptest(testbuffer2,test2size,17,five,fivesize); fprintf(stderr,"ok."); fprintf(stderr,"\nSingle bit unclipped packing (LSb): "); cliptest(testbuffer3,test3size,1,six,sixsize); fprintf(stderr,"ok."); fprintf(stderr,"\nTesting read past end (LSb): "); - oggpack_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8); + oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8); for(i=0;i<64;i++){ if(oggpack_read(&r,1)!=0){ fprintf(stderr,"failed; got -1 prematurely.\n"); exit(1); } } if(oggpack_look(&r,1)!=-1 || oggpack_read(&r,1)!=-1){ fprintf(stderr,"failed; read past end without -1.\n"); exit(1); } - oggpack_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8); + oggpack_readinit(&r,"\0\0\0\0\0\0\0\0",8); if(oggpack_read(&r,30)!=0 || oggpack_read(&r,16)!=0){ fprintf(stderr,"failed 2; got -1 prematurely.\n"); exit(1); } if(oggpack_look(&r,18)!=0 || oggpack_look(&r,18)!=0){ fprintf(stderr,"failed 3; got -1 prematurely.\n"); @@ -807,29 +773,29 @@ int main(void){ cliptestB(testbuffer2,test2size,17,fiveB,fivesize); fprintf(stderr,"ok."); fprintf(stderr,"\nSingle bit unclipped packing (MSb): "); cliptestB(testbuffer3,test3size,1,sixB,sixsize); fprintf(stderr,"ok."); fprintf(stderr,"\nTesting read past end (MSb): "); - oggpackB_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8); + oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8); for(i=0;i<64;i++){ if(oggpackB_read(&r,1)!=0){ fprintf(stderr,"failed; got -1 prematurely.\n"); exit(1); } } if(oggpackB_look(&r,1)!=-1 || oggpackB_read(&r,1)!=-1){ fprintf(stderr,"failed; read past end without -1.\n"); exit(1); } - oggpackB_readinit(&r,(unsigned char *)"\0\0\0\0\0\0\0\0",8); + oggpackB_readinit(&r,"\0\0\0\0\0\0\0\0",8); if(oggpackB_read(&r,30)!=0 || oggpackB_read(&r,16)!=0){ fprintf(stderr,"failed 2; got -1 prematurely.\n"); exit(1); } if(oggpackB_look(&r,18)!=0 || oggpackB_look(&r,18)!=0){ fprintf(stderr,"failed 3; got -1 prematurely.\n");
--- a/media/libogg/src/ogg_framing.c +++ b/media/libogg/src/ogg_framing.c @@ -1,23 +1,23 @@ /******************************************************************** * * - * THIS FILE IS PART OF THE Ogg CONTAINER SOURCE CODE. * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * 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-2010 * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * * by the Xiph.Org Foundation http://www.xiph.org/ * * * ******************************************************************** function: code raw packets into framed OggSquish stream and decode Ogg streams back into raw packets - last mod: $Id: framing.c 17269 2010-06-04 05:39:45Z xiphmont $ + 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 for details. ********************************************************************/ #include <stdlib.h> @@ -361,79 +361,69 @@ int ogg_stream_iovecin(ogg_stream_state 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); } -/* Conditionally flush a page; force==0 will only flush nominal-size - pages, force==1 forces us to flush a page regardless of page size - so long as there's any data available at all. */ -static int ogg_stream_flush_i(ogg_stream_state *os,ogg_page *og, int force, int nfill){ +/* 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 + flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will + try to flush a normal sized page like ogg_stream_pageout; a call to + ogg_stream_flush does not guarantee that all packets have flushed. + Only a return value of 0 from ogg_stream_flush indicates all packet + data is flushed into pages. + + since ogg_stream_flush will flush the last page in a stream even if + it's undersized, you almost certainly want to use ogg_stream_pageout + (and *not* ogg_stream_flush) unless you specifically need to flush + an page regardless of size in the middle of a stream. */ + +int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ int i; int vals=0; int maxvals=(os->lacing_fill>255?255:os->lacing_fill); int bytes=0; long acc=0; ogg_int64_t granule_pos=-1; - if(ogg_stream_check(os)) return(0); - 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 */ - + /* If this is the initial header case, the first page must only include the initial header packet */ if(os->b_o_s==0){ /* 'initial header page' case */ granule_pos=0; for(vals=0;vals<maxvals;vals++){ if((os->lacing_vals[vals]&0x0ff)<255){ vals++; break; } } }else{ - - /* The extra packets_done, packet_just_done logic here attempts to do two things: - 1) Don't unneccessarily span pages. - 2) Unless necessary, don't flush pages if there are less than four packets on - them; this expands page size to reduce unneccessary overhead if incoming packets - are large. - These are not necessary behaviors, just 'always better than naive flushing' - without requiring an application to explicitly request a specific optimized - behavior. We'll want an explicit behavior setup pathway eventually as well. */ - - int packets_done=0; - int packet_just_done=0; for(vals=0;vals<maxvals;vals++){ - if(acc>nfill && packet_just_done>=8){ - force=1; - break; - } + if(acc>4096)break; acc+=os->lacing_vals[vals]&0x0ff; - if((os->lacing_vals[vals]&0xff)<255){ + if((os->lacing_vals[vals]&0xff)<255) granule_pos=os->granule_vals[vals]; - packet_just_done=++packets_done; - }else - packet_just_done=0; } - if(vals==255)force=1; } - - if(!force) return(0); - + /* construct the header in temp storage */ memcpy(os->header,"OggS",4); - + /* stream structure version */ os->header[4]=0x00; - + /* continued packet flag? */ os->header[5]=0x00; if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; /* first page flag? */ if(os->b_o_s==0)os->header[5]|=0x02; /* last page flag? */ if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; os->b_o_s=1; @@ -495,62 +485,34 @@ static int ogg_stream_flush_i(ogg_stream /* calculate the checksum */ ogg_page_checksum_set(og); /* done */ return(1); } -/* 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 - flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will - try to flush a normal sized page like ogg_stream_pageout; a call to - ogg_stream_flush does not guarantee that all packets have flushed. - Only a return value of 0 from ogg_stream_flush indicates all packet - data is flushed into pages. - - since ogg_stream_flush will flush the last page in a stream even if - it's undersized, you almost certainly want to use ogg_stream_pageout - (and *not* ogg_stream_flush) unless you specifically need to flush - an page regardless of size in the middle of a stream. */ - -int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ - return ogg_stream_flush_i(os,og,1,4096); -} /* This constructs pages from buffered packet segments. The pointers 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){ - int force=0; if(ogg_stream_check(os)) return 0; if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ - (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ - force=1; - - return(ogg_stream_flush_i(os,og,force,4096)); -} - -/* Like the above, but an argument is provided to adjust the nominal -page size for applications which are smart enough to provide their -own delay based flushing */ - -int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill){ - int force=0; - if(ogg_stream_check(os)) return 0; - - if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ - (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ - force=1; - - return(ogg_stream_flush_i(os,og,force,nfill)); + os->body_fill-os->body_returned > 4096 ||/* 'page nominal size' case */ + os->lacing_fill>=255 || /* 'segment table full' case */ + (os->lacing_fill&&!os->b_o_s)){ /* 'initial header page' case */ + + return(ogg_stream_flush(os,og)); + } + + /* not enough data to construct a page and not end of stream */ + return 0; } int ogg_stream_eos(ogg_stream_state *os){ if(ogg_stream_check(os)) return 1; return os->e_o_s; } /* DECODING PRIMITIVES: packet streaming layer **********************/ @@ -967,17 +929,17 @@ static int _packetout(ogg_stream_state * if(!op && !adv)return(1); /* just using peek as an inexpensive way to ask if there's a whole packet waiting */ /* Gather the whole packet. We'll have no holes or a partial packet */ { int size=os->lacing_vals[ptr]&0xff; - long bytes=size; + int bytes=size; int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ while(size==255){ int val=os->lacing_vals[++ptr]; size=val&0xff; if(val&0x200)eos=0x200; bytes+=size; @@ -1017,27 +979,27 @@ void ogg_packet_clear(ogg_packet *op) { } #ifdef _V_SELFTEST #include <stdio.h> ogg_stream_state os_en, os_de; ogg_sync_state oy; -void checkpacket(ogg_packet *op,long len, int no, long pos){ +void checkpacket(ogg_packet *op,int len, int no, int pos){ long j; static int sequence=0; static int lastno=0; if(op->bytes!=len){ - fprintf(stderr,"incorrect packet length (%ld != %ld)!\n",op->bytes,len); + fprintf(stderr,"incorrect packet length!\n"); exit(1); } if(op->granulepos!=pos){ - fprintf(stderr,"incorrect packet granpos (%ld != %ld)!\n",(long)op->granulepos,pos); + fprintf(stderr,"incorrect packet position!\n"); exit(1); } /* packet number just follows sequence/gap; adjust the input number for that */ if(no==0){ sequence=0; }else{ @@ -1194,83 +1156,28 @@ const int head1_4[] = {0x4f,0x67,0x67,0x 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, - 0xf8,0x3c,0x19,0x79, - 255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, + 0x54,0x05,0x51,0xc8, + 17, 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,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, - 0x38,0xe6,0xb6,0x28, - 6, - 255,220,255,4,255,0}; - - -/* spill expansion test */ -const int head1_4b[] = {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}; + 0xc8,0xc3,0xcb,0xed, + 5, + 10,255,4,255,0}; -const int head2_4b[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0xe6,0x54,0xfe,0x7d, - 27, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,10,255,4,255,0,0,0,0,0,0}; - - -const int head3_4b[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x24,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x77,0x62,0xe0,0x12, - 1, - 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}; @@ -1327,152 +1234,59 @@ const int head1_6[] = {0x4f,0x67,0x67,0x 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, - 0x68,0x22,0x7c,0x3d, - 255, - 100, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255}; + 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, - 0xf4,0x87,0xba,0xf3, - 255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, + 0x01,0xd2,0xe5,0xe5, + 17, 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,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, - 0xf7,0x2f,0x6c,0x60, - 5, - 254,255,4,255,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}; 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, - 0x68,0x22,0x7c,0x3d, - 255, - 100, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255}; + 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}; + 1,0}; -void test_pack(const int *pl, const int **headers, int byteskip, +void test_pack(const int *pl, const int **headers, int byteskip, int pageskip, int packetskip){ unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ long inptr=0; long outptr=0; long deptr=0; long depacket=0; long granule_pos=7,pageno=0; int i,j,packets,pageout=pageskip; @@ -1555,17 +1369,17 @@ void test_pack(const int *pl, const int 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,"(%d), ",pageout); + fprintf(stderr,"(%ld), ",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); @@ -1654,67 +1468,57 @@ int main(void){ /* Exercise each code path in the framing code. Also verify that the checksums are working. */ { /* 17 only */ const int packets[]={17, -1}; const int *headret[]={head1_0,NULL}; - + fprintf(stderr,"testing single page encoding... "); test_pack(packets,headret,0,0,0); } { /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; const int *headret[]={head1_1,head2_1,NULL}; - + fprintf(stderr,"testing basic page encoding... "); test_pack(packets,headret,0,0,0); } { /* nil packets; beginning,middle,end */ const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; const int *headret[]={head1_2,head2_2,NULL}; - + fprintf(stderr,"testing basic nil packets... "); test_pack(packets,headret,0,0,0); } { /* large initial packet */ const int packets[]={4345,259,255,-1}; const int *headret[]={head1_3,head2_3,NULL}; - + fprintf(stderr,"testing initial-packet lacing > 4k... "); test_pack(packets,headret,0,0,0); } { - /* continuing packet test; with page spill expansion, we have to - overflow the lacing table. */ - const int packets[]={0,65500,259,255,-1}; + /* continuing packet test */ + const int packets[]={0,4345,259,255,-1}; const int *headret[]={head1_4,head2_4,head3_4,NULL}; - + fprintf(stderr,"testing single packet page span... "); test_pack(packets,headret,0,0,0); } - { - /* spill expand packet test */ - const int packets[]={0,4345,259,255,0,0,0,0,0,0,-1}; - const int *headret[]={head1_4b,head2_4b,head3_4b,NULL}; - - fprintf(stderr,"testing page spill expansion... "); - test_pack(packets,headret,0,0,0); - } - /* page with the 255 segment limit */ { 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, @@ -1748,48 +1552,48 @@ int main(void){ const int *headret[]={head1_5,head2_5,head3_5,NULL}; fprintf(stderr,"testing max packet segments... "); test_pack(packets,headret,0,0,0); } { /* packet that overspans over an entire page */ - const int packets[]={0,100,130049,259,255,-1}; + const int packets[]={0,100,9000,259,255,-1}; const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; fprintf(stderr,"testing very large packets... "); test_pack(packets,headret,0,0,0); } { /* test for the libogg 1.1.1 resync in large continuation bug found by Josh Coalson) */ - const int packets[]={0,100,130049,259,255,-1}; + const int packets[]={0,100,9000,259,255,-1}; const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; fprintf(stderr,"testing continuation resync in very large packets... "); test_pack(packets,headret,100,2,3); } { /* term only page. why not? */ - const int packets[]={0,100,64770,-1}; + const int packets[]={0,100,4080,-1}; const int *headret[]={head1_7,head2_7,head3_7,NULL}; fprintf(stderr,"testing zero data page (1 nil packet)... "); test_pack(packets,headret,0,0,0); } { /* build a bunch of pages for testing */ unsigned char *data=_ogg_malloc(1024*1024); - int pl[]={0, 0,0,0,0,1,1,98,4079, 0,0,0,0,1,1,2954,2057, 0,0,0,0,76,34,912,0,234,1000,1000, 1000,300,-1}; + int pl[]={0,100,4079,2956,2057,76,34,912,0,234,1000,1000,1000,300,-1}; int inptr=0,i,j; ogg_page og[5]; ogg_stream_reset(&os_en); for(i=0;pl[i]!=-1;i++){ ogg_packet op; int len=pl[i]; @@ -1840,47 +1644,27 @@ int main(void){ ogg_sync_pageout(&oy,&temp); ogg_stream_pagein(&os_de,&temp); /* do we get the expected results/packets? */ if(ogg_stream_packetout(&os_de,&test)!=1)error(); checkpacket(&test,0,0,0); if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,1,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,2,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,3,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,4,-1); + checkpacket(&test,100,1,-1); if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,1,5,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,1,6,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,98,7,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,4079,8,9000); + 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); } if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,17,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,18,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,19,-1); + checkpacket(&test,76,5,-1); if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,20,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,76,21,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,34,22,-1); + checkpacket(&test,34,6,-1); fprintf(stderr,"ok.\n"); } /* Test lost pages on pagein/packetout: rollback with continuation */ { ogg_page temp; ogg_packet test; @@ -1903,107 +1687,81 @@ int main(void){ ogg_sync_pageout(&oy,&temp); ogg_stream_pagein(&os_de,&temp); ogg_sync_pageout(&oy,&temp); /* skip */ ogg_sync_pageout(&oy,&temp); ogg_stream_pagein(&os_de,&temp); /* do we get the expected results/packets? */ - + if(ogg_stream_packetout(&os_de,&test)!=1)error(); checkpacket(&test,0,0,0); if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,1,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,2,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,3,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,4,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,1,5,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,1,6,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,98,7,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,4079,8,9000); + checkpacket(&test,100,1,-1); if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,9,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,10,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,11,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,0,12,-1); + checkpacket(&test,4079,2,3000); if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,1,13,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,1,14,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,2954,15,-1); - if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,2057,16,17000); + 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); } if(ogg_stream_packetout(&os_de,&test)!=1)error(); - checkpacket(&test,300,29,30000); + checkpacket(&test,300,13,14000); fprintf(stderr,"ok.\n"); } - + /* the rest only test sync */ { ogg_page og_de; /* Test fractional page inputs: incomplete capture */ fprintf(stderr,"Testing sync on partial inputs... "); ogg_sync_reset(&oy); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 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); 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); 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); ogg_sync_wrote(&oy,og[1].header_len-28); if(ogg_sync_pageout(&oy,&og_de)>0)error(); - + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); ogg_sync_wrote(&oy,1000); 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); ogg_sync_wrote(&oy,og[1].body_len-1000); if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - + fprintf(stderr,"ok.\n"); } /* Test fractional page inputs: page + incomplete capture */ { ogg_page og_de; fprintf(stderr,"Testing sync on 1+partial inputs... "); - ogg_sync_reset(&oy); + ogg_sync_reset(&oy); memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 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); ogg_sync_wrote(&oy,og[1].body_len);