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