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