1f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/******************************************************************** 2f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * * 3f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * THIS FILE IS PART OF THE Ogg CONTAINER SOURCE CODE. * 4f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 5f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 6f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 7f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * * 8f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * 9f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/ * 10f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels * * 11f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ******************************************************************** 12f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 13f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels function: code raw packets into framed OggSquish stream and 14f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels decode Ogg streams back into raw packets 15f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels last mod: $Id: framing.c 17039 2010-03-26 00:34:54Z xiphmont $ 16f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 17f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels note: The CRC code is directly derived from public domain code by 18f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels Ross Williams (ross@guest.adelaide.edu.au). See docs/framing.html 19f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for details. 20f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 21f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ********************************************************************/ 22f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 23f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#include <stdlib.h> 24f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#include <string.h> 25f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#include <ogg/ogg.h> 26f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 27f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* A complete description of Ogg framing exists in docs/framing.html */ 28f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 29f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_page_version(const ogg_page *og){ 30f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return((int)(og->header[4])); 31f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 32f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 33f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_page_continued(const ogg_page *og){ 34f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return((int)(og->header[5]&0x01)); 35f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 36f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 37f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_page_bos(const ogg_page *og){ 38f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return((int)(og->header[5]&0x02)); 39f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 40f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 41f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_page_eos(const ogg_page *og){ 42f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return((int)(og->header[5]&0x04)); 43f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 44f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 45f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsogg_int64_t ogg_page_granulepos(const ogg_page *og){ 46f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *page=og->header; 47f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_int64_t granulepos=page[13]&(0xff); 48f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[12]&0xff); 49f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[11]&0xff); 50f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[10]&0xff); 51f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[9]&0xff); 52f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[8]&0xff); 53f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[7]&0xff); 54f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granulepos= (granulepos<<8)|(page[6]&0xff); 55f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(granulepos); 56f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 57f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 58f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_page_serialno(const ogg_page *og){ 59f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(og->header[14] | 60f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[15]<<8) | 61f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[16]<<16) | 62f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[17]<<24)); 63f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 64f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 65f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelslong ogg_page_pageno(const ogg_page *og){ 66f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(og->header[18] | 67f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[19]<<8) | 68f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[20]<<16) | 69f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[21]<<24)); 70f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 71f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 72f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 73f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 74f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* returns the number of packets that are completed on this page (if 75f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels the leading packet is begun on a previous page, but ends on this 76f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels page, it's counted */ 77f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 78f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* NOTE: 79f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas EckelsIf a page consists of a packet begun on a previous page, and a new 80f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelspacket begun (but not completed) on this page, the return will be: 81f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page_packets(page) ==1, 82f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page_continued(page) !=0 83f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 84f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas EckelsIf a page happens to be a single packet that was begun on a 85f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsprevious page, and spans to the next page (in the case of a three or 86f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsmore page packet), the return will be: 87f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page_packets(page) ==0, 88f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page_continued(page) !=0 89f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels*/ 90f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 91f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_page_packets(const ogg_page *og){ 92f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int i,n=og->header[26],count=0; 93f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<n;i++) 94f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(og->header[27+i]<255)count++; 95f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(count); 96f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 97f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 98f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 99f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#if 0 100f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* helper to initialize lookup for direct-table CRC (illustrative; we 101f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels use the static init below) */ 102f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 103f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsstatic ogg_uint32_t _ogg_crc_entry(unsigned long index){ 104f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int i; 105f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned long r; 106f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 107f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels r = index << 24; 108f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for (i=0; i<8; i++) 109f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if (r & 0x80000000UL) 110f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator 111f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels polynomial, although we use an 112f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unreflected alg and an init/final 113f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels of 0, not 0xffffffff */ 114f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels else 115f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels r<<=1; 116f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return (r & 0xffffffffUL); 117f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 118f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#endif 119f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 120f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsstatic const ogg_uint32_t crc_lookup[256]={ 121f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, 122f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, 123f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, 124f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, 125f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9, 126f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, 127f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011, 128f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, 129f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039, 130f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, 131f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81, 132f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, 133f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49, 134f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, 135f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1, 136f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, 137f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae, 138f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, 139f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16, 140f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, 141f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde, 142f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, 143f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066, 144f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, 145f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e, 146f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, 147f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6, 148f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, 149f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e, 150f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, 151f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686, 152f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, 153f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637, 154f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, 155f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f, 156f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, 157f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47, 158f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, 159f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff, 160f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, 161f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7, 162f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, 163f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f, 164f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, 165f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7, 166f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, 167f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f, 168f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, 169f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640, 170f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, 171f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8, 172f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, 173f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30, 174f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, 175f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088, 176f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, 177f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0, 178f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, 179f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18, 180f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, 181f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0, 182f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, 183f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668, 184f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4}; 185f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 186f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* init the encode/decode logical stream state */ 187f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 188f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_init(ogg_stream_state *os,int serialno){ 189f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os){ 190f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memset(os,0,sizeof(*os)); 191f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_storage=16*1024; 192f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_storage=1024; 193f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 194f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); 195f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); 196f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granule_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); 197f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 198f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!os->body_data || !os->lacing_vals || !os->granule_vals){ 199f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_clear(os); 200f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return -1; 201f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 202f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 203f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->serialno=serialno; 204f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 205f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 206f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 207f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(-1); 208f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 209f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 210f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* async/delayed error detection for the ogg_stream_state */ 211f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_check(ogg_stream_state *os){ 212f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!os || !os->body_data) return -1; 213f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return 0; 214f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 215f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 216f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* _clear does not free os, only the non-flat storage within */ 217f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_clear(ogg_stream_state *os){ 218f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os){ 219f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->body_data)_ogg_free(os->body_data); 220f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_vals)_ogg_free(os->lacing_vals); 221f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->granule_vals)_ogg_free(os->granule_vals); 222f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 223f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memset(os,0,sizeof(*os)); 224f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 225f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 226f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 227f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 228f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_destroy(ogg_stream_state *os){ 229f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os){ 230f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_clear(os); 231f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free(os); 232f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 233f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 234f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 235f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 236f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* Helpers for ogg_stream_encode; this keeps the structure and 237f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels what's happening fairly clear */ 238f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 239f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsstatic int _os_body_expand(ogg_stream_state *os,int needed){ 240f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->body_storage<=os->body_fill+needed){ 241f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels void *ret; 242f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ret=_ogg_realloc(os->body_data,(os->body_storage+needed+1024)* 243f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sizeof(*os->body_data)); 244f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!ret){ 245f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_clear(os); 246f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return -1; 247f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 248f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_storage+=(needed+1024); 249f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_data=ret; 250f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 251f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return 0; 252f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 253f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 254f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsstatic int _os_lacing_expand(ogg_stream_state *os,int needed){ 255f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_storage<=os->lacing_fill+needed){ 256f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels void *ret; 257f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ret=_ogg_realloc(os->lacing_vals,(os->lacing_storage+needed+32)* 258f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sizeof(*os->lacing_vals)); 259f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!ret){ 260f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_clear(os); 261f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return -1; 262f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 263f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals=ret; 264f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ret=_ogg_realloc(os->granule_vals,(os->lacing_storage+needed+32)* 265f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sizeof(*os->granule_vals)); 266f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!ret){ 267f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_clear(os); 268f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return -1; 269f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 270f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granule_vals=ret; 271f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_storage+=(needed+32); 272f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 273f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return 0; 274f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 275f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 276f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* checksum the page */ 277f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* Direct table CRC; note that this will be faster in the future if we 278f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels perform the checksum silmultaneously with other copies */ 279f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 280f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid ogg_page_checksum_set(ogg_page *og){ 281f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(og){ 282f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_uint32_t crc_reg=0; 283f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int i; 284f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 285f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* safety; needed for API behavior, but not framing code */ 286f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[22]=0; 287f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[23]=0; 288f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[24]=0; 289f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[25]=0; 290f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 291f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<og->header_len;i++) 292f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->header[i]]; 293f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<og->body_len;i++) 294f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->body[i]]; 295f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 296f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[22]=(unsigned char)(crc_reg&0xff); 297f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[23]=(unsigned char)((crc_reg>>8)&0xff); 298f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[24]=(unsigned char)((crc_reg>>16)&0xff); 299f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[25]=(unsigned char)((crc_reg>>24)&0xff); 300f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 301f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 302f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 303f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* submit data to the internal buffer of the framing engine */ 304f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, 305f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long e_o_s, ogg_int64_t granulepos){ 306f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 307f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int bytes = 0, lacing_vals, i; 308f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 309f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return -1; 310f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!iov) return 0; 311f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 312f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for (i = 0; i < count; ++i) bytes += (int)iov[i].iov_len; 313f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels lacing_vals=bytes/255+1; 314f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 315f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->body_returned){ 316f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* advance packet data according to the body_returned pointer. We 317f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels had to keep it around to return a pointer into the buffer last 318f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels call */ 319f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 320f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill-=os->body_returned; 321f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->body_fill) 322f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(os->body_data,os->body_data+os->body_returned, 323f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill); 324f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_returned=0; 325f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 326f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 327f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* make sure we have the buffer storage */ 328f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(_os_body_expand(os,bytes) || _os_lacing_expand(os,lacing_vals)) 329f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return -1; 330f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 331f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Copy in the submitted packet. Yes, the copy is a waste; this is 332f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels the liability of overly clean abstraction for the time being. It 333f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels will actually be fairly easy to eliminate the extra copy in the 334f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels future */ 335f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 336f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for (i = 0; i < count; ++i) { 337f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(os->body_data+os->body_fill, iov[i].iov_base, iov[i].iov_len); 338f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill += (int)iov[i].iov_len; 339f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 340f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 341f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Store lacing vals for this packet */ 342f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<lacing_vals-1;i++){ 343f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill+i]=255; 344f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granule_vals[os->lacing_fill+i]=os->granulepos; 345f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 346f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill+i]=bytes%255; 347f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granulepos=os->granule_vals[os->lacing_fill+i]=granulepos; 348f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 349f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* flag the first segment as the beginning of the packet */ 350f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill]|= 0x100; 351f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 352f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_fill+=lacing_vals; 353f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 354f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* for the sake of completeness */ 355f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->packetno++; 356f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 357f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(e_o_s)os->e_o_s=1; 358f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 359f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 360f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 361f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 362f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ 363f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_iovec_t iov; 364f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels iov.iov_base = op->packet; 365f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels iov.iov_len = op->bytes; 366f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return ogg_stream_iovecin(os, &iov, 1, op->e_o_s, op->granulepos); 367f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 368f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 369f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* Conditionally flush a page; force==0 will only flush nominal-size 370f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels pages, force==1 forces us to flush a page regardless of page size 371f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels so long as there's any data available at all. */ 372f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsstatic int ogg_stream_flush_i(ogg_stream_state *os,ogg_page *og, int force){ 373f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int i; 374f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int vals=0; 375f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int maxvals=(os->lacing_fill>255?255:os->lacing_fill); 376f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int bytes=0; 377f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long acc=0; 378f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_int64_t granule_pos=-1; 379f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 380f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return(0); 381f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(maxvals==0) return(0); 382f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 383f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* construct a page */ 384f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* decide how many segments to include */ 385f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 386f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* If this is the initial header case, the first page must only include 387f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels the initial header packet */ 388f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->b_o_s==0){ /* 'initial header page' case */ 389f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granule_pos=0; 390f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(vals=0;vals<maxvals;vals++){ 391f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if((os->lacing_vals[vals]&0x0ff)<255){ 392f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels vals++; 393f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels break; 394f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 395f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 396f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels }else{ 397f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 398f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* The extra packets_done, packet_just_done logic here attempts to do two things: 399f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1) Don't unneccessarily span pages. 400f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2) Unless necessary, don't flush pages if there are less than four packets on 401f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels them; this expands page size to reduce unneccessary overhead if incoming packets 402f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels are large. 403f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels These are not necessary behaviors, just 'always better than naive flushing' 404f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels without requiring an application to explicitly request a specific optimized 405f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels behavior. We'll want an explicit behavior setup pathway eventually as well. */ 406f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 407f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int packets_done=0; 408f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int packet_just_done=0; 409f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(vals=0;vals<maxvals;vals++){ 410f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(acc>4096 && packet_just_done>=4){ 411f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels force=1; 412f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels break; 413f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 414f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels acc+=os->lacing_vals[vals]&0x0ff; 415f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if((os->lacing_vals[vals]&0xff)<255){ 416f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granule_pos=os->granule_vals[vals]; 417f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels packet_just_done=++packets_done; 418f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels }else 419f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels packet_just_done=0; 420f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 421f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(vals==255)force=1; 422f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 423f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 424f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!force) return(0); 425f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 426f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* construct the header in temp storage */ 427f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(os->header,"OggS",4); 428f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 429f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* stream structure version */ 430f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[4]=0x00; 431f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 432f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* continued packet flag? */ 433f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[5]=0x00; 434f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; 435f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* first page flag? */ 436f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->b_o_s==0)os->header[5]|=0x02; 437f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* last page flag? */ 438f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; 439f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->b_o_s=1; 440f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 441f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* 64 bits of PCM position */ 442f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=6;i<14;i++){ 443f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[i]=(unsigned char)(granule_pos&0xff); 444f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granule_pos>>=8; 445f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 446f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 447f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* 32 bits of stream serial number */ 448f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 449f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long serialno=os->serialno; 450f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=14;i<18;i++){ 451f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[i]=(unsigned char)(serialno&0xff); 452f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels serialno>>=8; 453f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 454f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 455f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 456f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* 32 bits of page counter (we have both counter and page header 457f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels because this val can roll over) */ 458f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->pageno==-1)os->pageno=0; /* because someone called 459f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels stream_reset; this would be a 460f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels strange thing to do in an 461f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels encode stream, but it has 462f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels plausible uses */ 463f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 464f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long pageno=os->pageno++; 465f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=18;i<22;i++){ 466f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[i]=(unsigned char)(pageno&0xff); 467f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels pageno>>=8; 468f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 469f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 470f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 471f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* zero for computation; filled in later */ 472f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[22]=0; 473f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[23]=0; 474f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[24]=0; 475f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[25]=0; 476f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 477f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* segment table */ 478f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header[26]=(unsigned char)(vals&0xff); 479f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<vals;i++) 480f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bytes+=os->header[i+27]=(unsigned char)(os->lacing_vals[i]&0xff); 481f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 482f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* set pointers in the ogg_page struct */ 483f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header=os->header; 484f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header_len=os->header_fill=vals+27; 485f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->body=os->body_data+os->body_returned; 486f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->body_len=bytes; 487f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 488f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* advance the lacing data and set the body_returned pointer */ 489f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 490f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_fill-=vals; 491f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(os->lacing_vals,os->lacing_vals+vals,os->lacing_fill*sizeof(*os->lacing_vals)); 492f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(os->granule_vals,os->granule_vals+vals,os->lacing_fill*sizeof(*os->granule_vals)); 493f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_returned+=bytes; 494f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 495f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* calculate the checksum */ 496f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 497f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page_checksum_set(og); 498f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 499f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* done */ 500f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(1); 501f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 502f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 503f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* This will flush remaining packets into a page (returning nonzero), 504f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels even if there is not enough data to trigger a flush normally 505f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (undersized page). If there are no packets or partial packets to 506f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will 507f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels try to flush a normal sized page like ogg_stream_pageout; a call to 508f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_flush does not guarantee that all packets have flushed. 509f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels Only a return value of 0 from ogg_stream_flush indicates all packet 510f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels data is flushed into pages. 511f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 512f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels since ogg_stream_flush will flush the last page in a stream even if 513f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels it's undersized, you almost certainly want to use ogg_stream_pageout 514f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (and *not* ogg_stream_flush) unless you specifically need to flush 515f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels an page regardless of size in the middle of a stream. */ 516f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 517f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ 518f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return ogg_stream_flush_i(os,og,1); 519f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 520f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 521f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* This constructs pages from buffered packet segments. The pointers 522f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsreturned are to static buffers; do not free. The returned buffers are 523f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsgood only until the next call (using the same ogg_stream_state) */ 524f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 525f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ 526f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int force=0; 527f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return 0; 528f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 529f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ 530f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ 531f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels force=1; 532f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 533f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(ogg_stream_flush_i(os,og,force)); 534f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 535f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 536f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_eos(ogg_stream_state *os){ 537f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return 1; 538f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return os->e_o_s; 539f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 540f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 541f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* DECODING PRIMITIVES: packet streaming layer **********************/ 542f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 543f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* This has two layers to place more of the multi-serialno and paging 544f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels control in the application's hands. First, we expose a data buffer 545f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels using ogg_sync_buffer(). The app either copies into the 546f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels buffer, or passes it directly to read(), etc. We then call 547f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote() to tell how many bytes we just added. 548f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 549f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels Pages are returned (pointers into the buffer in ogg_sync_state) 550f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels by ogg_sync_pageout(). The page is then submitted to 551f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein() along with the appropriate 552f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_state* (ie, matching serialno). We then get raw 553f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels packets out calling ogg_stream_packetout() with a 554f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_state. */ 555f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 556f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* initialize the struct to a known state */ 557f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_init(ogg_sync_state *oy){ 558f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy){ 559f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->storage = -1; /* used as a readiness flag */ 560f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memset(oy,0,sizeof(*oy)); 561f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 562f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 563f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 564f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 565f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* clear non-flat storage within */ 566f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_clear(ogg_sync_state *oy){ 567f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy){ 568f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->data)_ogg_free(oy->data); 569f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memset(oy,0,sizeof(*oy)); 570f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 571f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 572f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 573f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 574f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_destroy(ogg_sync_state *oy){ 575f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy){ 576f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_clear(oy); 577f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free(oy); 578f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 579f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 580f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 581f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 582f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_check(ogg_sync_state *oy){ 583f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->storage<0) return -1; 584f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return 0; 585f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 586f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 587f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelschar *ogg_sync_buffer(ogg_sync_state *oy, long size){ 588f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_check(oy)) return NULL; 589f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 590f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* first, clear out any space that has been previously returned */ 591f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->returned){ 592f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->fill-=oy->returned; 593f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->fill>0) 594f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(oy->data,oy->data+oy->returned,oy->fill); 595f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->returned=0; 596f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 597f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 598f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(size>oy->storage-oy->fill){ 599f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* We need to extend the internal buffer */ 600f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long newsize=size+oy->fill+4096; /* an extra page to be nice */ 601f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels void *ret; 602f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 603f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->data) 604f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ret=_ogg_realloc(oy->data,newsize); 605f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels else 606f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ret=_ogg_malloc(newsize); 607f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!ret){ 608f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_clear(oy); 609f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return NULL; 610f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 611f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->data=ret; 612f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->storage=newsize; 613f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 614f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 615f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* expose a segment at least as large as requested at the fill mark */ 616f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return((char *)oy->data+oy->fill); 617f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 618f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 619f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_wrote(ogg_sync_state *oy, long bytes){ 620f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_check(oy))return -1; 621f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->fill+bytes>oy->storage)return -1; 622f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->fill+=bytes; 623f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 624f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 625f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 626f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* sync the stream. This is meant to be useful for finding page 627f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels boundaries. 628f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 629f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return values for this: 630f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels -n) skipped n bytes 631f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0) page not ready; more data (no bytes skipped) 632f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels n) page synced at current location; page length n bytes 633f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 634f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels*/ 635f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 636f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelslong ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ 637f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *page=oy->data+oy->returned; 638f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *next; 639f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long bytes=oy->fill-oy->returned; 640f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 641f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_check(oy))return 0; 642f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 643f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->headerbytes==0){ 644f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int headerbytes,i; 645f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(bytes<27)return(0); /* not enough for a header */ 646f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 647f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* verify capture pattern */ 648f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(memcmp(page,"OggS",4))goto sync_fail; 649f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 650f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels headerbytes=page[26]+27; 651f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(bytes<headerbytes)return(0); /* not enough for header + seg table */ 652f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 653f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* count up body length in the segment table */ 654f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 655f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<page[26];i++) 656f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->bodybytes+=page[27+i]; 657f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->headerbytes=headerbytes; 658f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 659f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 660f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(oy->bodybytes+oy->headerbytes>bytes)return(0); 661f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 662f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* The whole test page is buffered. Verify the checksum */ 663f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 664f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Grab the checksum bytes, set the header field to zero */ 665f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels char chksum[4]; 666f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page log; 667f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 668f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(chksum,page+22,4); 669f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memset(page+22,0,4); 670f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 671f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* set up a temp page struct and recompute the checksum */ 672f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels log.header=page; 673f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels log.header_len=oy->headerbytes; 674f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels log.body=page+oy->headerbytes; 675f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels log.body_len=oy->bodybytes; 676f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page_checksum_set(&log); 677f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 678f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Compare */ 679f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(memcmp(chksum,page+22,4)){ 680f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* D'oh. Mismatch! Corrupt page (or miscapture and not a page 681f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels at all) */ 682f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* replace the computed checksum with the one actually read in */ 683f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(page+22,chksum,4); 684f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 685f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Bad checksum. Lose sync */ 686f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels goto sync_fail; 687f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 688f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 689f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 690f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* yes, have a whole page all ready to go */ 691f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 692f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *page=oy->data+oy->returned; 693f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long bytes; 694f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 695f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(og){ 696f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header=page; 697f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header_len=oy->headerbytes; 698f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->body=page+oy->headerbytes; 699f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->body_len=oy->bodybytes; 700f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 701f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 702f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->unsynced=0; 703f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->returned+=(bytes=oy->headerbytes+oy->bodybytes); 704f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->headerbytes=0; 705f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->bodybytes=0; 706f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(bytes); 707f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 708f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 709f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sync_fail: 710f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 711f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->headerbytes=0; 712f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->bodybytes=0; 713f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 714f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* search for possible capture */ 715f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels next=memchr(page+1,'O',bytes-1); 716f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!next) 717f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels next=oy->data+oy->fill; 718f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 719f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->returned=(int)(next-oy->data); 720f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return((long)-(next-page)); 721f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 722f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 723f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* sync the stream and get a page. Keep trying until we find a page. 724f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels Supress 'sync errors' after reporting the first. 725f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 726f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return values: 727f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels -1) recapture (hole in data) 728f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0) need more data 729f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1) page returned 730f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 731f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels Returns pointers into buffered data; invalidated by next call to 732f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _stream, _clear, _init, or _buffer */ 733f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 734f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ 735f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 736f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_check(oy))return 0; 737f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 738f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* all we need to do is verify a page at the head of the stream 739f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels buffer. If it doesn't verify, we look for the next potential 740f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels frame */ 741f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 742f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(;;){ 743f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long ret=ogg_sync_pageseek(oy,og); 744f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ret>0){ 745f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* have a page */ 746f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(1); 747f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 748f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ret==0){ 749f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* need more data */ 750f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 751f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 752f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 753f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* head did not start a synced page... skipped some bytes */ 754f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!oy->unsynced){ 755f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->unsynced=1; 756f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(-1); 757f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 758f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 759f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* loop. keep looking */ 760f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 761f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 762f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 763f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 764f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* add the incoming page to the stream state; we decompose the page 765f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels into packet segments here as well. */ 766f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 767f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ 768f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *header=og->header; 769f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *body=og->body; 770f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long bodysize=og->body_len; 771f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int segptr=0; 772f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 773f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int version=ogg_page_version(og); 774f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int continued=ogg_page_continued(og); 775f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int bos=ogg_page_bos(og); 776f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int eos=ogg_page_eos(og); 777f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_int64_t granulepos=ogg_page_granulepos(og); 778f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int serialno=ogg_page_serialno(og); 779f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long pageno=ogg_page_pageno(og); 780f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int segments=header[26]; 781f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 782f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return -1; 783f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 784f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* clean up 'returned data' */ 785f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 786f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long lr=os->lacing_returned; 787f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long br=os->body_returned; 788f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 789f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* body data */ 790f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(br){ 791f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill-=br; 792f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->body_fill) 793f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(os->body_data,os->body_data+br,os->body_fill); 794f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_returned=0; 795f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 796f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 797f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(lr){ 798f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* segment table */ 799f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_fill-lr){ 800f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(os->lacing_vals,os->lacing_vals+lr, 801f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); 802f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memmove(os->granule_vals,os->granule_vals+lr, 803f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (os->lacing_fill-lr)*sizeof(*os->granule_vals)); 804f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 805f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_fill-=lr; 806f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_packet-=lr; 807f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_returned=0; 808f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 809f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 810f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 811f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* check the serial number */ 812f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(serialno!=os->serialno)return(-1); 813f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(version>0)return(-1); 814f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 815f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(_os_lacing_expand(os,segments+1)) return -1; 816f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 817f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* are we in sequence? */ 818f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(pageno!=os->pageno){ 819f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int i; 820f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 821f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* unroll previous partial packet (if any) */ 822f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=os->lacing_packet;i<os->lacing_fill;i++) 823f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill-=os->lacing_vals[i]&0xff; 824f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_fill=os->lacing_packet; 825f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 826f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* make a note of dropped data in segment table */ 827f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->pageno!=-1){ 828f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill++]=0x400; 829f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_packet++; 830f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 831f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 832f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 833f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* are we a 'continued packet' page? If so, we may need to skip 834f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels some segments */ 835f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(continued){ 836f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_fill<1 || 837f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill-1]==0x400){ 838f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bos=0; 839f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(;segptr<segments;segptr++){ 840f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int val=header[27+segptr]; 841f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels body+=val; 842f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bodysize-=val; 843f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(val<255){ 844f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels segptr++; 845f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels break; 846f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 847f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 848f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 849f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 850f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 851f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(bodysize){ 852f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(_os_body_expand(os,bodysize)) return -1; 853f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(os->body_data+os->body_fill,body,bodysize); 854f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill+=bodysize; 855f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 856f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 857f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 858f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int saved=-1; 859f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels while(segptr<segments){ 860f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int val=header[27+segptr]; 861f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill]=val; 862f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granule_vals[os->lacing_fill]=-1; 863f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 864f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(bos){ 865f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill]|=0x100; 866f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bos=0; 867f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 868f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 869f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(val<255)saved=os->lacing_fill; 870f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 871f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_fill++; 872f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels segptr++; 873f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 874f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(val<255)os->lacing_packet=os->lacing_fill; 875f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 876f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 877f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* set the granulepos on the last granuleval of the last full packet */ 878f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(saved!=-1){ 879f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granule_vals[saved]=granulepos; 880f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 881f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 882f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 883f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 884f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(eos){ 885f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->e_o_s=1; 886f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_fill>0) 887f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_vals[os->lacing_fill-1]|=0x200; 888f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 889f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 890f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->pageno=pageno+1; 891f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 892f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 893f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 894f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 895f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* clear things to an initial state. Good to call, eg, before seeking */ 896f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_sync_reset(ogg_sync_state *oy){ 897f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_check(oy))return -1; 898f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 899f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->fill=0; 900f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->returned=0; 901f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->unsynced=0; 902f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->headerbytes=0; 903f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels oy->bodybytes=0; 904f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 905f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 906f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 907f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_reset(ogg_stream_state *os){ 908f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return -1; 909f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 910f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_fill=0; 911f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_returned=0; 912f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 913f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_fill=0; 914f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_packet=0; 915f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_returned=0; 916f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 917f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->header_fill=0; 918f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 919f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->e_o_s=0; 920f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->b_o_s=0; 921f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->pageno=-1; 922f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->packetno=0; 923f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->granulepos=0; 924f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 925f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 926f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 927f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 928f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ 929f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return -1; 930f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_reset(os); 931f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->serialno=serialno; 932f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 933f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 934f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 935f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsstatic int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ 936f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 937f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* The last part of decode. We have the stream broken into packet 938f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels segments. Now we need to group them into packets (or return the 939f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels out of sync markers) */ 940f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 941f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int ptr=os->lacing_returned; 942f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 943f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_packet<=ptr)return(0); 944f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 945f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(os->lacing_vals[ptr]&0x400){ 946f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* we need to tell the codec there's a gap; it might need to 947f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels handle previous packet dependencies. */ 948f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_returned++; 949f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->packetno++; 950f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(-1); 951f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 952f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 953f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!op && !adv)return(1); /* just using peek as an inexpensive way 954f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels to ask if there's a whole packet 955f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels waiting */ 956f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 957f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Gather the whole packet. We'll have no holes or a partial packet */ 958f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 959f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int size=os->lacing_vals[ptr]&0xff; 960f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int bytes=size; 961f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ 962f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ 963f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 964f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels while(size==255){ 965f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int val=os->lacing_vals[++ptr]; 966f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels size=val&0xff; 967f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(val&0x200)eos=0x200; 968f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bytes+=size; 969f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 970f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 971f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op){ 972f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op->e_o_s=eos; 973f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op->b_o_s=bos; 974f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op->packet=os->body_data+os->body_returned; 975f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op->packetno=os->packetno; 976f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op->granulepos=os->granule_vals[ptr]; 977f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op->bytes=bytes; 978f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 979f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 980f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(adv){ 981f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->body_returned+=bytes; 982f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->lacing_returned=ptr+1; 983f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels os->packetno++; 984f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 985f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 986f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(1); 987f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 988f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 989f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ 990f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return 0; 991f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return _packetout(os,op,1); 992f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 993f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 994f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ 995f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_check(os)) return 0; 996f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return _packetout(os,op,0); 997f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 998f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 999f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid ogg_packet_clear(ogg_packet *op) { 1000f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free(op->packet); 1001f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memset(op, 0, sizeof(*op)); 1002f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1003f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1004f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#ifdef _V_SELFTEST 1005f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#include <stdio.h> 1006f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1007f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsogg_stream_state os_en, os_de; 1008f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsogg_sync_state oy; 1009f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1010f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid checkpacket(ogg_packet *op,int len, int no, int pos){ 1011f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long j; 1012f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels static int sequence=0; 1013f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels static int lastno=0; 1014f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1015f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op->bytes!=len){ 1016f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"incorrect packet length (%d != %d)!\n",op->bytes,len); 1017f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1018f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1019f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op->granulepos!=pos){ 1020f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"incorrect packet granpos (%ld != %ld)!\n",(long)op->granulepos,pos); 1021f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1022f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1023f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1024f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* packet number just follows sequence/gap; adjust the input number 1025f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for that */ 1026f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(no==0){ 1027f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sequence=0; 1028f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels }else{ 1029f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sequence++; 1030f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(no>lastno+1) 1031f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels sequence++; 1032f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1033f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels lastno=no; 1034f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op->packetno!=sequence){ 1035f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"incorrect packet sequence %ld != %d\n", 1036f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (long)(op->packetno),sequence); 1037f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1038f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1039f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1040f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test data */ 1041f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=0;j<op->bytes;j++) 1042f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op->packet[j]!=((j+no)&0xff)){ 1043f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", 1044f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels j,op->packet[j],(j+no)&0xff); 1045f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1046f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1047f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1048f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1049f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid check_page(unsigned char *data,const int *header,ogg_page *og){ 1050f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long j; 1051f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test data */ 1052f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=0;j<og->body_len;j++) 1053f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(og->body[j]!=data[j]){ 1054f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", 1055f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels j,data[j],og->body[j]); 1056f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1057f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1058f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1059f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test header */ 1060f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=0;j<og->header_len;j++){ 1061f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(og->header[j]!=header[j]){ 1062f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"header content mismatch at pos %ld:\n",j); 1063f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=0;j<header[26]+27;j++) 1064f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr," (%ld)%02x:%02x",j,header[j],og->header[j]); 1065f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"\n"); 1066f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1067f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1068f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1069f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(og->header_len!=header[26]+27){ 1070f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"header length incorrect! (%ld!=%d)\n", 1071f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header_len,header[26]+27); 1072f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1073f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1074f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1075f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1076f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid print_header(ogg_page *og){ 1077f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int j; 1078f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"\nHEADER:\n"); 1079f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", 1080f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header[0],og->header[1],og->header[2],og->header[3], 1081f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (int)og->header[4],(int)og->header[5]); 1082f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1083f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", 1084f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[9]<<24)|(og->header[8]<<16)| 1085f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[7]<<8)|og->header[6], 1086f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[17]<<24)|(og->header[16]<<16)| 1087f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[15]<<8)|og->header[14], 1088f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ((long)(og->header[21])<<24)|(og->header[20]<<16)| 1089f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (og->header[19]<<8)|og->header[18]); 1090f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1091f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", 1092f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (int)og->header[22],(int)og->header[23], 1093f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (int)og->header[24],(int)og->header[25], 1094f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels (int)og->header[26]); 1095f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1096f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=27;j<og->header_len;j++) 1097f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"%d ",(int)og->header[j]); 1098f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,")\n\n"); 1099f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1100f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1101f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid copy_page(ogg_page *og){ 1102f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *temp=_ogg_malloc(og->header_len); 1103f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(temp,og->header,og->header_len); 1104f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->header=temp; 1105f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1106f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels temp=_ogg_malloc(og->body_len); 1107f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(temp,og->body,og->body_len); 1108f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og->body=temp; 1109f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1110f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1111f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid free_page(ogg_page *og){ 1112f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free (og->header); 1113f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free (og->body); 1114f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1115f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1116f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid error(void){ 1117f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"error!\n"); 1118f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1119f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1120f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1121f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* 17 only */ 1122f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, 1123f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1124f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1125f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x15,0xed,0xec,0x91, 1126f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1127f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 17}; 1128f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1129f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* 17, 254, 255, 256, 500, 510, 600 byte, pad */ 1130f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, 1131f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1132f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1133f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x59,0x10,0x6c,0x2c, 1134f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1135f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 17}; 1136f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, 1137f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 1138f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1139f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x89,0x33,0x85,0xce, 1140f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 13, 1141f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 254,255,0,255,1,255,245,255,255,0, 1142f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,90}; 1143f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1144f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* nil packets; beginning,middle,end */ 1145f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, 1146f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1147f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1148f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xff,0x7b,0x23,0x17, 1149f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1150f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1151f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, 1152f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, 1153f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1154f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x5c,0x3f,0x66,0xcb, 1155f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 17, 1156f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 17,254,255,0,0,255,1,0,255,245,255,255,0, 1157f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,90,0}; 1158f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1159f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* large initial packet */ 1160f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, 1161f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1162f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1163f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x27,0x31,0xaa, 1164f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 18, 1165f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1166f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255,255,10}; 1167f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1168f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, 1169f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 1170f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1171f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x7f,0x4e,0x8a,0xd2, 1172f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 4, 1173f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,4,255,0}; 1174f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1175f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1176f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* continuing packet test */ 1177f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, 1178f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1179f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1180f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xff,0x7b,0x23,0x17, 1181f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1182f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1183f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1184f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, 1185f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 1186f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1187f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf8,0x3c,0x19,0x79, 1188f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255, 1189f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1190f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1191f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1192f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1193f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1194f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1195f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1196f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1197f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1198f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1199f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1200f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1201f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1202f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1203f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1204f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1205f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1206f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1207f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1208f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1209f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1210f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1211f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1212f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1213f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1214f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1215f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1216f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1217f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1218f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1219f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1220f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255}; 1221f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1222f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, 1223f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, 1224f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,2,0,0,0, 1225f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x38,0xe6,0xb6,0x28, 1226f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 6, 1227f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,220,255,4,255,0}; 1228f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1229f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1230f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* spill expansion test */ 1231f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_4b[] = {0x4f,0x67,0x67,0x53,0,0x02, 1232f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1233f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1234f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xff,0x7b,0x23,0x17, 1235f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1236f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1237f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1238f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_4b[] = {0x4f,0x67,0x67,0x53,0,0x00, 1239f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 1240f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1241f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xce,0x8f,0x17,0x1a, 1242f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 23, 1243f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1244f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255,255,10,255,4,255,0,0}; 1245f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1246f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1247f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head3_4b[] = {0x4f,0x67,0x67,0x53,0,0x04, 1248f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00, 1249f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,2,0,0,0, 1250f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x9b,0xb2,0x50,0xa1, 1251f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1252f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1253f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1254f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* page with the 255 segment limit */ 1255f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, 1256f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1257f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1258f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xff,0x7b,0x23,0x17, 1259f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1260f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1261f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1262f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, 1263f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, 1264f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1265f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xed,0x2a,0x2e,0xa7, 1266f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255, 1267f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1268f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1269f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1270f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1271f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1272f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1273f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1274f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1275f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1276f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1277f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1278f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1279f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1280f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1281f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1282f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1283f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1284f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1285f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1286f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1287f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1288f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1289f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1290f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1291f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1292f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1293f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1294f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1295f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1296f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1297f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1298f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10}; 1299f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1300f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, 1301f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, 1302f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,2,0,0,0, 1303f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x6c,0x3b,0x82,0x3d, 1304f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1305f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 50}; 1306f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1307f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1308f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* packet that overspans over an entire page */ 1309f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, 1310f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1311f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1312f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xff,0x7b,0x23,0x17, 1313f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1314f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1315f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1316f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, 1317f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 1318f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1319f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x68,0x22,0x7c,0x3d, 1320f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255, 1321f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 100, 1322f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1323f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1324f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1325f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1326f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1327f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1328f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1329f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1330f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1331f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1332f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1333f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1334f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1335f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1336f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1337f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1338f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1339f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1340f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1341f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1342f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1343f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1344f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1345f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1346f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1347f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1348f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1349f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1350f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1351f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1352f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1353f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255}; 1354f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1355f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, 1356f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 1357f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,2,0,0,0, 1358f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf4,0x87,0xba,0xf3, 1359f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255, 1360f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1361f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1362f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1363f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1364f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1365f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1366f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1367f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1368f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1369f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1370f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1371f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1372f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1373f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1374f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1375f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1376f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1377f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1378f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1379f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1380f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1381f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1382f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1383f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1384f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1385f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1386f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1387f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1388f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1389f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1390f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1391f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255}; 1392f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1393f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, 1394f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 1395f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,3,0,0,0, 1396f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xf7,0x2f,0x6c,0x60, 1397f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 5, 1398f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 254,255,4,255,0}; 1399f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1400f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels/* packet that overspans over an entire page */ 1401f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, 1402f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1403f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,0,0,0,0, 1404f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xff,0x7b,0x23,0x17, 1405f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1406f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1407f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1408f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, 1409f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 1410f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,1,0,0,0, 1411f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x68,0x22,0x7c,0x3d, 1412f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255, 1413f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 100, 1414f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1415f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1416f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1417f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1418f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1419f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1420f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1421f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1422f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1423f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1424f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1425f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1426f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1427f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1428f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1429f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1430f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1431f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1432f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1433f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1434f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1435f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1436f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1437f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1438f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1439f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1440f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1441f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1442f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1443f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1444f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255,255,255, 1445f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 255,255,255,255,255,255}; 1446f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1447f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsconst int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, 1448f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 1449f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0x01,0x02,0x03,0x04,2,0,0,0, 1450f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0xd4,0xe0,0x60,0xe5, 1451f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1, 1452f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 0}; 1453f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1454f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsvoid test_pack(const int *pl, const int **headers, int byteskip, 1455f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int pageskip, int packetskip){ 1456f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ 1457f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long inptr=0; 1458f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long outptr=0; 1459f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long deptr=0; 1460f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long depacket=0; 1461f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels long granule_pos=7,pageno=0; 1462f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int i,j,packets,pageout=pageskip; 1463f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int eosflag=0; 1464f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int bosflag=0; 1465f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1466f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int byteskipcount=0; 1467f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1468f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_reset(&os_en); 1469f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_reset(&os_de); 1470f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 1471f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1472f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(packets=0;packets<packetskip;packets++) 1473f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels depacket+=pl[packets]; 1474f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1475f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(packets=0;;packets++)if(pl[packets]==-1)break; 1476f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1477f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<packets;i++){ 1478f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* construct a test packet */ 1479f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_packet op; 1480f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int len=pl[i]; 1481f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1482f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.packet=data+inptr; 1483f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.bytes=len; 1484f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.e_o_s=(pl[i+1]<0?1:0); 1485f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.granulepos=granule_pos; 1486f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1487f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels granule_pos+=1024; 1488f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1489f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=0;j<len;j++)data[inptr++]=i+j; 1490f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1491f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* submit the test packet */ 1492f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_packetin(&os_en,&op); 1493f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1494f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* retrieve any finished pages */ 1495f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1496f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og; 1497f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1498f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels while(ogg_stream_pageout(&os_en,&og)){ 1499f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* We have a page. Check it carefully */ 1500f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1501f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"%ld, ",pageno); 1502f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1503f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(headers[pageno]==NULL){ 1504f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"coded too many pages!\n"); 1505f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1506f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1507f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1508f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels check_page(data+outptr,headers[pageno],&og); 1509f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1510f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels outptr+=og.body_len; 1511f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels pageno++; 1512f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(pageskip){ 1513f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bosflag=1; 1514f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels pageskip--; 1515f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels deptr+=og.body_len; 1516f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1517f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1518f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* have a complete page; submit it to sync/decode */ 1519f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1520f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1521f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og_de; 1522f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_packet op_de,op_de2; 1523f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels char *buf=ogg_sync_buffer(&oy,og.header_len+og.body_len); 1524f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels char *next=buf; 1525f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels byteskipcount+=og.header_len; 1526f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(byteskipcount>byteskip){ 1527f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(next,og.header,byteskipcount-byteskip); 1528f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels next+=byteskipcount-byteskip; 1529f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels byteskipcount=byteskip; 1530f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1531f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1532f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels byteskipcount+=og.body_len; 1533f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(byteskipcount>byteskip){ 1534f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(next,og.body,byteskipcount-byteskip); 1535f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels next+=byteskipcount-byteskip; 1536f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels byteskipcount=byteskip; 1537f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1538f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1539f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,next-buf); 1540f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1541f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels while(1){ 1542f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int ret=ogg_sync_pageout(&oy,&og_de); 1543f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ret==0)break; 1544f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ret<0)continue; 1545f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* got a page. Happy happy. Verify that it's good. */ 1546f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1547f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"(%ld), ",pageout); 1548f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1549f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels check_page(data+deptr,headers[pageout],&og_de); 1550f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels deptr+=og_de.body_len; 1551f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels pageout++; 1552f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1553f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* submit it to deconstitution */ 1554f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&og_de); 1555f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1556f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* packets out? */ 1557f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ 1558f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_packetpeek(&os_de,NULL); 1559f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ 1560f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1561f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* verify peek and out match */ 1562f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(memcmp(&op_de,&op_de2,sizeof(op_de))){ 1563f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"packetout != packetpeek! pos=%ld\n", 1564f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels depacket); 1565f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1566f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1567f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1568f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* verify the packet! */ 1569f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* check data */ 1570f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ 1571f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", 1572f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels depacket); 1573f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1574f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1575f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* check bos flag */ 1576f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(bosflag==0 && op_de.b_o_s==0){ 1577f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"b_o_s flag not set on packet!\n"); 1578f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1579f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1580f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(bosflag && op_de.b_o_s){ 1581f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); 1582f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1583f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1584f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels bosflag=1; 1585f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels depacket+=op_de.bytes; 1586f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1587f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* check eos flag */ 1588f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(eosflag){ 1589f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Multiple decoded packets with eos flag!\n"); 1590f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1591f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1592f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1593f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op_de.e_o_s)eosflag=1; 1594f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1595f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* check granulepos flag */ 1596f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(op_de.granulepos!=-1){ 1597f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr," granule:%ld ",(long)op_de.granulepos); 1598f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1599f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1600f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1601f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1602f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1603f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1604f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1605f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free(data); 1606f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(headers[pageno]!=NULL){ 1607f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"did not write last page!\n"); 1608f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1609f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1610f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(headers[pageout]!=NULL){ 1611f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"did not decode last page!\n"); 1612f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1613f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1614f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(inptr!=outptr){ 1615f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"encoded page data incomplete!\n"); 1616f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1617f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1618f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(inptr!=deptr){ 1619f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"decoded page data incomplete!\n"); 1620f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1621f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1622f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(inptr!=depacket){ 1623f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"decoded packet data incomplete!\n"); 1624f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1625f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1626f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(!eosflag){ 1627f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Never got a packet with EOS set!\n"); 1628f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1629f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1630f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 1631f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 1632f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1633f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckelsint main(void){ 1634f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1635f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_init(&os_en,0x04030201); 1636f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_init(&os_de,0x04030201); 1637f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_init(&oy); 1638f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1639f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Exercise each code path in the framing code. Also verify that 1640f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels the checksums are working. */ 1641f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1642f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1643f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* 17 only */ 1644f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={17, -1}; 1645f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_0,NULL}; 1646f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1647f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing single page encoding... "); 1648f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1649f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1650f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1651f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1652f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ 1653f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; 1654f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_1,head2_1,NULL}; 1655f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1656f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing basic page encoding... "); 1657f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1658f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1659f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1660f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1661f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* nil packets; beginning,middle,end */ 1662f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; 1663f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_2,head2_2,NULL}; 1664f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1665f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing basic nil packets... "); 1666f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1667f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1668f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1669f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1670f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* large initial packet */ 1671f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={4345,259,255,-1}; 1672f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_3,head2_3,NULL}; 1673f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1674f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing initial-packet lacing > 4k... "); 1675f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1676f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1677f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1678f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1679f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* continuing packet test; with page spill expansion, we have to 1680f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels overflow the lacing table. */ 1681f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,65500,259,255,-1}; 1682f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_4,head2_4,head3_4,NULL}; 1683f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1684f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing single packet page span... "); 1685f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1686f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1687f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1688f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1689f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* spill expand packet test */ 1690f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,4345,259,255,0,0,-1}; 1691f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_4b,head2_4b,head3_4b,NULL}; 1692f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1693f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing page spill expansion... "); 1694f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1695f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1696f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1697f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* page with the 255 segment limit */ 1698f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1699f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1700f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,10,10,10,10,10,10,10,10, 1701f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1702f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1703f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1704f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1705f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1706f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1707f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1708f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1709f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1710f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1711f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1712f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1713f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1714f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1715f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1716f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1717f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1718f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1719f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1720f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1721f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1722f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1723f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1724f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1725f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1726f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1727f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1728f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1729f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1730f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,10, 1731f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 10,10,10,10,10,10,10,50,-1}; 1732f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_5,head2_5,head3_5,NULL}; 1733f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1734f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing max packet segments... "); 1735f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1736f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1737f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1738f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1739f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* packet that overspans over an entire page */ 1740f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,100,130049,259,255,-1}; 1741f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; 1742f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1743f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing very large packets... "); 1744f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1745f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1746f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1747f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1748f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* test for the libogg 1.1.1 resync in large continuation bug 1749f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels found by Josh Coalson) */ 1750f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,100,130049,259,255,-1}; 1751f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; 1752f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1753f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing continuation resync in very large packets... "); 1754f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,100,2,3); 1755f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1756f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1757f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1758f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* term only page. why not? */ 1759f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int packets[]={0,100,64770,-1}; 1760f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels const int *headret[]={head1_7,head2_7,head3_7,NULL}; 1761f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1762f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"testing zero data page (1 nil packet)... "); 1763f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels test_pack(packets,headret,0,0,0); 1764f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1765f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1766f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1767f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1768f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1769f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* build a bunch of pages for testing */ 1770f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels unsigned char *data=_ogg_malloc(1024*1024); 1771f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int pl[]={0, 1,1,98,4079, 1,1,2954,2057, 76,34,912,0,234,1000,1000, 1000,300,-1}; 1772f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int inptr=0,i,j; 1773f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og[5]; 1774f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1775f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_reset(&os_en); 1776f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1777f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;pl[i]!=-1;i++){ 1778f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_packet op; 1779f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels int len=pl[i]; 1780f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1781f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.packet=data+inptr; 1782f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.bytes=len; 1783f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.e_o_s=(pl[i+1]<0?1:0); 1784f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels op.granulepos=(i+1)*1000; 1785f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1786f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(j=0;j<len;j++)data[inptr++]=i+j; 1787f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_packetin(&os_en,&op); 1788f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1789f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1790f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels _ogg_free(data); 1791f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1792f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* retrieve finished pages */ 1793f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<5;i++){ 1794f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_pageout(&os_en,&og[i])==0){ 1795f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Too few pages output building sync tests!\n"); 1796f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1797f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1798f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels copy_page(&og[i]); 1799f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1800f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1801f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test lost pages on pagein/packetout: no rollback */ 1802f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1803f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page temp; 1804f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_packet test; 1805f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1806f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Testing loss of pages... "); 1807f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1808f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 1809f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_reset(&os_de); 1810f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<5;i++){ 1811f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[i].header_len),og[i].header, 1812f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[i].header_len); 1813f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[i].header_len); 1814f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[i].body_len),og[i].body,og[i].body_len); 1815f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[i].body_len); 1816f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1817f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1818f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1819f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1820f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1821f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1822f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1823f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* skip */ 1824f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1825f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1826f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1827f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* do we get the expected results/packets? */ 1828f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1829f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1830f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,0,0,0); 1831f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1832f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,1,1,-1); 1833f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1834f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,1,2,-1); 1835f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1836f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,98,3,-1); 1837f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1838f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,4079,4,5000); 1839f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=-1){ 1840f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Error: loss of page did not return error\n"); 1841f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1842f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1843f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1844f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,76,9,-1); 1845f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1846f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,34,10,-1); 1847f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 1848f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1849f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1850f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test lost pages on pagein/packetout: rollback with continuation */ 1851f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1852f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page temp; 1853f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_packet test; 1854f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1855f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Testing loss of pages (rollback required)... "); 1856f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1857f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 1858f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_reset(&os_de); 1859f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<5;i++){ 1860f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[i].header_len),og[i].header, 1861f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[i].header_len); 1862f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[i].header_len); 1863f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[i].body_len),og[i].body,og[i].body_len); 1864f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[i].body_len); 1865f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1866f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1867f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1868f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1869f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1870f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1871f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1872f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1873f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1874f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* skip */ 1875f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_pageout(&oy,&temp); 1876f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_stream_pagein(&os_de,&temp); 1877f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1878f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* do we get the expected results/packets? */ 1879f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1880f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1881f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,0,0,0); 1882f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1883f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,1,1,-1); 1884f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1885f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,1,2,-1); 1886f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1887f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,98,3,-1); 1888f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1889f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,4079,4,5000); 1890f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1891f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,1,5,-1); 1892f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1893f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,1,6,-1); 1894f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1895f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,2954,7,-1); 1896f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1897f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,2057,8,9000); 1898f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=-1){ 1899f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Error: loss of page did not return error\n"); 1900f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels exit(1); 1901f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1902f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_stream_packetout(&os_de,&test)!=1)error(); 1903f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels checkpacket(&test,300,17,18000); 1904f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 1905f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1906f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1907f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* the rest only test sync */ 1908f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1909f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og_de; 1910f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test fractional page inputs: incomplete capture */ 1911f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Testing sync on partial inputs... "); 1912f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 1913f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 1914f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 3); 1915f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,3); 1916f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 1917f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1918f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test fractional page inputs: incomplete fixed header */ 1919f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, 1920f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 20); 1921f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,20); 1922f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 1923f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1924f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test fractional page inputs: incomplete header */ 1925f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, 1926f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 5); 1927f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,5); 1928f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 1929f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1930f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test fractional page inputs: incomplete body */ 1931f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1932f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, 1933f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].header_len-28); 1934f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].header_len-28); 1935f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 1936f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1937f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); 1938f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,1000); 1939f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 1940f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1941f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, 1942f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].body_len-1000); 1943f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].body_len-1000); 1944f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 1945f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1946f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 1947f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1948f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1949f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test fractional page inputs: page + incomplete capture */ 1950f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1951f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og_de; 1952f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Testing sync on 1+partial inputs... "); 1953f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 1954f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1955f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 1956f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].header_len); 1957f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].header_len); 1958f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1959f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, 1960f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].body_len); 1961f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].body_len); 1962f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1963f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 1964f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 20); 1965f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,20); 1966f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 1967f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 1968f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1969f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, 1970f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].header_len-20); 1971f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].header_len-20); 1972f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, 1973f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].body_len); 1974f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].body_len); 1975f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 1976f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1977f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 1978f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 1979f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1980f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test recapture: garbage + page */ 1981f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 1982f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og_de; 1983f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Testing search for capture... "); 1984f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 1985f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1986f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* 'garbage' */ 1987f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, 1988f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].body_len); 1989f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].body_len); 1990f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1991f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 1992f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].header_len); 1993f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].header_len); 1994f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1995f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, 1996f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].body_len); 1997f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].body_len); 1998f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 1999f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, 2000f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 20); 2001f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,20); 2002f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 2003f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 2004f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 2005f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2006f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, 2007f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[2].header_len-20); 2008f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[2].header_len-20); 2009f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, 2010f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[2].body_len); 2011f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[2].body_len); 2012f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 2013f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2014f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 2015f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 2016f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2017f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Test recapture: page + garbage + page */ 2018f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 2019f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_page og_de; 2020f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"Testing recapture... "); 2021f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_reset(&oy); 2022f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2023f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, 2024f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].header_len); 2025f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].header_len); 2026f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2027f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, 2028f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[1].body_len); 2029f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[1].body_len); 2030f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2031f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, 2032f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[2].header_len); 2033f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[2].header_len); 2034f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2035f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, 2036f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[2].header_len); 2037f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[2].header_len); 2038f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2039f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 2040f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2041f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, 2042f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[2].body_len-5); 2043f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[2].body_len-5); 2044f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2045f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, 2046f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[3].header_len); 2047f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[3].header_len); 2048f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2049f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, 2050f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels og[3].body_len); 2051f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels ogg_sync_wrote(&oy,og[3].body_len); 2052f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2053f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)>0)error(); 2054f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels if(ogg_sync_pageout(&oy,&og_de)<=0)error(); 2055f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2056f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels fprintf(stderr,"ok.\n"); 2057f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 2058f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2059f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels /* Free page data that was previously copied */ 2060f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels { 2061f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels for(i=0;i<5;i++){ 2062f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels free_page(&og[i]); 2063f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 2064f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 2065f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels } 2066f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2067f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels return(0); 2068f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels} 2069f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2070f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels#endif 2071f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2072f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2073f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2074f869a6f5f794dddc9bee2a9fdddecf41d99035aeLucas Eckels 2075