1*4d5d8b54SAndroid Build Coastguard Worker<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 2*4d5d8b54SAndroid Build Coastguard Worker<html> 3*4d5d8b54SAndroid Build Coastguard Worker<head> 4*4d5d8b54SAndroid Build Coastguard Worker 5*4d5d8b54SAndroid Build Coastguard Worker<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15"/> 6*4d5d8b54SAndroid Build Coastguard Worker<title>Ogg Documentation</title> 7*4d5d8b54SAndroid Build Coastguard Worker 8*4d5d8b54SAndroid Build Coastguard Worker<style type="text/css"> 9*4d5d8b54SAndroid Build Coastguard Workerbody { 10*4d5d8b54SAndroid Build Coastguard Worker margin: 0 18px 0 18px; 11*4d5d8b54SAndroid Build Coastguard Worker padding-bottom: 30px; 12*4d5d8b54SAndroid Build Coastguard Worker font-family: Verdana, Arial, Helvetica, sans-serif; 13*4d5d8b54SAndroid Build Coastguard Worker color: #333333; 14*4d5d8b54SAndroid Build Coastguard Worker font-size: .8em; 15*4d5d8b54SAndroid Build Coastguard Worker} 16*4d5d8b54SAndroid Build Coastguard Worker 17*4d5d8b54SAndroid Build Coastguard Workera { 18*4d5d8b54SAndroid Build Coastguard Worker color: #3366cc; 19*4d5d8b54SAndroid Build Coastguard Worker} 20*4d5d8b54SAndroid Build Coastguard Worker 21*4d5d8b54SAndroid Build Coastguard Workerimg { 22*4d5d8b54SAndroid Build Coastguard Worker border: 0; 23*4d5d8b54SAndroid Build Coastguard Worker} 24*4d5d8b54SAndroid Build Coastguard Worker 25*4d5d8b54SAndroid Build Coastguard Worker#xiphlogo { 26*4d5d8b54SAndroid Build Coastguard Worker margin: 30px 0 16px 0; 27*4d5d8b54SAndroid Build Coastguard Worker} 28*4d5d8b54SAndroid Build Coastguard Worker 29*4d5d8b54SAndroid Build Coastguard Worker#content p { 30*4d5d8b54SAndroid Build Coastguard Worker line-height: 1.4; 31*4d5d8b54SAndroid Build Coastguard Worker} 32*4d5d8b54SAndroid Build Coastguard Worker 33*4d5d8b54SAndroid Build Coastguard Workerh1, h1 a, h2, h2 a, h3, h3 a { 34*4d5d8b54SAndroid Build Coastguard Worker font-weight: bold; 35*4d5d8b54SAndroid Build Coastguard Worker color: #ff9900; 36*4d5d8b54SAndroid Build Coastguard Worker margin: 1.3em 0 8px 0; 37*4d5d8b54SAndroid Build Coastguard Worker} 38*4d5d8b54SAndroid Build Coastguard Worker 39*4d5d8b54SAndroid Build Coastguard Workerh1 { 40*4d5d8b54SAndroid Build Coastguard Worker font-size: 1.3em; 41*4d5d8b54SAndroid Build Coastguard Worker} 42*4d5d8b54SAndroid Build Coastguard Worker 43*4d5d8b54SAndroid Build Coastguard Workerh2 { 44*4d5d8b54SAndroid Build Coastguard Worker font-size: 1.2em; 45*4d5d8b54SAndroid Build Coastguard Worker} 46*4d5d8b54SAndroid Build Coastguard Worker 47*4d5d8b54SAndroid Build Coastguard Workerh3 { 48*4d5d8b54SAndroid Build Coastguard Worker font-size: 1.1em; 49*4d5d8b54SAndroid Build Coastguard Worker} 50*4d5d8b54SAndroid Build Coastguard Worker 51*4d5d8b54SAndroid Build Coastguard Workerli { 52*4d5d8b54SAndroid Build Coastguard Worker line-height: 1.4; 53*4d5d8b54SAndroid Build Coastguard Worker} 54*4d5d8b54SAndroid Build Coastguard Worker 55*4d5d8b54SAndroid Build Coastguard Worker#copyright { 56*4d5d8b54SAndroid Build Coastguard Worker margin-top: 30px; 57*4d5d8b54SAndroid Build Coastguard Worker line-height: 1.5em; 58*4d5d8b54SAndroid Build Coastguard Worker text-align: center; 59*4d5d8b54SAndroid Build Coastguard Worker font-size: .8em; 60*4d5d8b54SAndroid Build Coastguard Worker color: #888888; 61*4d5d8b54SAndroid Build Coastguard Worker clear: both; 62*4d5d8b54SAndroid Build Coastguard Worker} 63*4d5d8b54SAndroid Build Coastguard Worker</style> 64*4d5d8b54SAndroid Build Coastguard Worker 65*4d5d8b54SAndroid Build Coastguard Worker</head> 66*4d5d8b54SAndroid Build Coastguard Worker 67*4d5d8b54SAndroid Build Coastguard Worker<body> 68*4d5d8b54SAndroid Build Coastguard Worker 69*4d5d8b54SAndroid Build Coastguard Worker<div id="xiphlogo"> 70*4d5d8b54SAndroid Build Coastguard Worker <a href="http://www.xiph.org/"><img src="fish_xiph_org.png" alt="Fish Logo and Xiph.org"/></a> 71*4d5d8b54SAndroid Build Coastguard Worker</div> 72*4d5d8b54SAndroid Build Coastguard Worker 73*4d5d8b54SAndroid Build Coastguard Worker<h1>Ogg logical bitstream framing</h1> 74*4d5d8b54SAndroid Build Coastguard Worker 75*4d5d8b54SAndroid Build Coastguard Worker<h2>Ogg bitstreams</h2> 76*4d5d8b54SAndroid Build Coastguard Worker 77*4d5d8b54SAndroid Build Coastguard Worker<p>The Ogg transport bitstream is designed to provide framing, error 78*4d5d8b54SAndroid Build Coastguard Workerprotection and seeking structure for higher-level codec streams that 79*4d5d8b54SAndroid Build Coastguard Workerconsist of raw, unencapsulated data packets, such as the Vorbis audio 80*4d5d8b54SAndroid Build Coastguard Workercodec or Theora video codec.</p> 81*4d5d8b54SAndroid Build Coastguard Worker 82*4d5d8b54SAndroid Build Coastguard Worker<h2>Application example: Vorbis</h2> 83*4d5d8b54SAndroid Build Coastguard Worker 84*4d5d8b54SAndroid Build Coastguard Worker<p>Vorbis encodes short-time blocks of PCM data into raw packets of 85*4d5d8b54SAndroid Build Coastguard Workerbit-packed data. These raw packets may be used directly by transport 86*4d5d8b54SAndroid Build Coastguard Workermechanisms that provide their own framing and packet-separation 87*4d5d8b54SAndroid Build Coastguard Workermechanisms (such as UDP datagrams). For stream based storage (such as 88*4d5d8b54SAndroid Build Coastguard Workerfiles) and transport (such as TCP streams or pipes), Vorbis uses the 89*4d5d8b54SAndroid Build Coastguard WorkerOgg bitstream format to provide framing/sync, sync recapture 90*4d5d8b54SAndroid Build Coastguard Workerafter error, landmarks during seeking, and enough information to 91*4d5d8b54SAndroid Build Coastguard Workerproperly separate data back into packets at the original packet 92*4d5d8b54SAndroid Build Coastguard Workerboundaries without relying on decoding to find packet boundaries.</p> 93*4d5d8b54SAndroid Build Coastguard Worker 94*4d5d8b54SAndroid Build Coastguard Worker<h2>Design constraints for Ogg bitstreams</h2> 95*4d5d8b54SAndroid Build Coastguard Worker 96*4d5d8b54SAndroid Build Coastguard Worker<ol> 97*4d5d8b54SAndroid Build Coastguard Worker<li>True streaming; we must not need to seek to build a 100% 98*4d5d8b54SAndroid Build Coastguard Worker complete bitstream.</li> 99*4d5d8b54SAndroid Build Coastguard Worker<li>Use no more than approximately 1-2% of bitstream bandwidth for 100*4d5d8b54SAndroid Build Coastguard Worker packet boundary marking, high-level framing, sync and seeking.</li> 101*4d5d8b54SAndroid Build Coastguard Worker<li>Specification of absolute position within the original sample 102*4d5d8b54SAndroid Build Coastguard Worker stream.</li> 103*4d5d8b54SAndroid Build Coastguard Worker<li>Simple mechanism to ease limited editing, such as a simplified 104*4d5d8b54SAndroid Build Coastguard Worker concatenation mechanism.</li> 105*4d5d8b54SAndroid Build Coastguard Worker<li>Detection of corruption, recapture after error and direct, random 106*4d5d8b54SAndroid Build Coastguard Worker access to data at arbitrary positions in the bitstream.</li> 107*4d5d8b54SAndroid Build Coastguard Worker</ol> 108*4d5d8b54SAndroid Build Coastguard Worker 109*4d5d8b54SAndroid Build Coastguard Worker<h2>Logical and Physical Bitstreams</h2> 110*4d5d8b54SAndroid Build Coastguard Worker 111*4d5d8b54SAndroid Build Coastguard Worker<p>A <em>logical</em> Ogg bitstream is a contiguous stream of 112*4d5d8b54SAndroid Build Coastguard Workersequential pages belonging only to the logical bitstream. A 113*4d5d8b54SAndroid Build Coastguard Worker<em>physical</em> Ogg bitstream is constructed from one or more 114*4d5d8b54SAndroid Build Coastguard Workerthan one logical Ogg bitstream (the simplest physical bitstream 115*4d5d8b54SAndroid Build Coastguard Workeris simply a single logical bitstream). We describe below the exact 116*4d5d8b54SAndroid Build Coastguard Workerformatting of an Ogg logical bitstream. Combining logical 117*4d5d8b54SAndroid Build Coastguard Workerbitstreams into more complex physical bitstreams is described in the 118*4d5d8b54SAndroid Build Coastguard Worker<a href="oggstream.html">Ogg bitstream overview</a>. The exact 119*4d5d8b54SAndroid Build Coastguard Workermapping of raw Vorbis packets into a valid Ogg Vorbis physical 120*4d5d8b54SAndroid Build Coastguard Workerbitstream is described in the Vorbis I Specification.</p> 121*4d5d8b54SAndroid Build Coastguard Worker 122*4d5d8b54SAndroid Build Coastguard Worker<h2>Bitstream structure</h2> 123*4d5d8b54SAndroid Build Coastguard Worker 124*4d5d8b54SAndroid Build Coastguard Worker<p>An Ogg stream is structured by dividing incoming packets into 125*4d5d8b54SAndroid Build Coastguard Workersegments of up to 255 bytes and then wrapping a group of contiguous 126*4d5d8b54SAndroid Build Coastguard Workerpacket segments into a variable length page preceded by a page 127*4d5d8b54SAndroid Build Coastguard Workerheader. Both the header size and page size are variable; the page 128*4d5d8b54SAndroid Build Coastguard Workerheader contains sizing information and checksum data to determine 129*4d5d8b54SAndroid Build Coastguard Workerheader/page size and data integrity.</p> 130*4d5d8b54SAndroid Build Coastguard Worker 131*4d5d8b54SAndroid Build Coastguard Worker<p>The bitstream is captured (or recaptured) by looking for the beginning 132*4d5d8b54SAndroid Build Coastguard Workerof a page, specifically the capture pattern. Once the capture pattern 133*4d5d8b54SAndroid Build Coastguard Workeris found, the decoder verifies page sync and integrity by computing 134*4d5d8b54SAndroid Build Coastguard Workerand comparing the checksum. At that point, the decoder can extract the 135*4d5d8b54SAndroid Build Coastguard Workerpackets themselves.</p> 136*4d5d8b54SAndroid Build Coastguard Worker 137*4d5d8b54SAndroid Build Coastguard Worker<h3>Packet segmentation</h3> 138*4d5d8b54SAndroid Build Coastguard Worker 139*4d5d8b54SAndroid Build Coastguard Worker<p>Packets are logically divided into multiple segments before encoding 140*4d5d8b54SAndroid Build Coastguard Workerinto a page. Note that the segmentation and fragmentation process is a 141*4d5d8b54SAndroid Build Coastguard Workerlogical one; it's used to compute page header values and the original 142*4d5d8b54SAndroid Build Coastguard Workerpage data need not be disturbed, even when a packet spans page 143*4d5d8b54SAndroid Build Coastguard Workerboundaries.</p> 144*4d5d8b54SAndroid Build Coastguard Worker 145*4d5d8b54SAndroid Build Coastguard Worker<p>The raw packet is logically divided into [n] 255 byte segments and a 146*4d5d8b54SAndroid Build Coastguard Workerlast fractional segment of < 255 bytes. A packet size may well 147*4d5d8b54SAndroid Build Coastguard Workerconsist only of the trailing fractional segment, and a fractional 148*4d5d8b54SAndroid Build Coastguard Workersegment may be zero length. These values, called "lacing values" are 149*4d5d8b54SAndroid Build Coastguard Workerthen saved and placed into the header segment table.</p> 150*4d5d8b54SAndroid Build Coastguard Worker 151*4d5d8b54SAndroid Build Coastguard Worker<p>An example should make the basic concept clear:</p> 152*4d5d8b54SAndroid Build Coastguard Worker 153*4d5d8b54SAndroid Build Coastguard Worker<pre> 154*4d5d8b54SAndroid Build Coastguard Worker<tt> 155*4d5d8b54SAndroid Build Coastguard Workerraw packet: 156*4d5d8b54SAndroid Build Coastguard Worker ___________________________________________ 157*4d5d8b54SAndroid Build Coastguard Worker |______________packet data__________________| 753 bytes 158*4d5d8b54SAndroid Build Coastguard Worker 159*4d5d8b54SAndroid Build Coastguard Workerlacing values for page header segment table: 255,255,243 160*4d5d8b54SAndroid Build Coastguard Worker</tt> 161*4d5d8b54SAndroid Build Coastguard Worker</pre> 162*4d5d8b54SAndroid Build Coastguard Worker 163*4d5d8b54SAndroid Build Coastguard Worker<p>We simply add the lacing values for the total size; the last lacing 164*4d5d8b54SAndroid Build Coastguard Workervalue for a packet is always the value that is less than 255. Note 165*4d5d8b54SAndroid Build Coastguard Workerthat this encoding both avoids imposing a maximum packet size as well 166*4d5d8b54SAndroid Build Coastguard Workeras imposing minimum overhead on small packets (as opposed to, eg, 167*4d5d8b54SAndroid Build Coastguard Workersimply using two bytes at the head of every packet and having a max 168*4d5d8b54SAndroid Build Coastguard Workerpacket size of 32k. Small packets (<255, the typical case) are 169*4d5d8b54SAndroid Build Coastguard Workerpenalized with twice the segmentation overhead). Using the lacing 170*4d5d8b54SAndroid Build Coastguard Workervalues as suggested, small packets see the minimum possible 171*4d5d8b54SAndroid Build Coastguard Workerbyte-aligned overhead (1 byte) and large packets, over 512 bytes or 172*4d5d8b54SAndroid Build Coastguard Workerso, see a fairly constant ~.5% overhead on encoding space.</p> 173*4d5d8b54SAndroid Build Coastguard Worker 174*4d5d8b54SAndroid Build Coastguard Worker<p>Note that a lacing value of 255 implies that a second lacing value 175*4d5d8b54SAndroid Build Coastguard Workerfollows in the packet, and a value of < 255 marks the end of the 176*4d5d8b54SAndroid Build Coastguard Workerpacket after that many additional bytes. A packet of 255 bytes (or a 177*4d5d8b54SAndroid Build Coastguard Workermultiple of 255 bytes) is terminated by a lacing value of 0:</p> 178*4d5d8b54SAndroid Build Coastguard Worker 179*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 180*4d5d8b54SAndroid Build Coastguard Workerraw packet: 181*4d5d8b54SAndroid Build Coastguard Worker _______________________________ 182*4d5d8b54SAndroid Build Coastguard Worker |________packet data____________| 255 bytes 183*4d5d8b54SAndroid Build Coastguard Worker 184*4d5d8b54SAndroid Build Coastguard Workerlacing values: 255, 0 185*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 186*4d5d8b54SAndroid Build Coastguard Worker 187*4d5d8b54SAndroid Build Coastguard Worker<p>Note also that a 'nil' (zero length) packet is not an error; it 188*4d5d8b54SAndroid Build Coastguard Workerconsists of nothing more than a lacing value of zero in the header.</p> 189*4d5d8b54SAndroid Build Coastguard Worker 190*4d5d8b54SAndroid Build Coastguard Worker<h3>Packets spanning pages</h3> 191*4d5d8b54SAndroid Build Coastguard Worker 192*4d5d8b54SAndroid Build Coastguard Worker<p>Packets are not restricted to beginning and ending within a page, 193*4d5d8b54SAndroid Build Coastguard Workeralthough individual segments are, by definition, required to do so. 194*4d5d8b54SAndroid Build Coastguard WorkerPackets are not restricted to a maximum size, although excessively 195*4d5d8b54SAndroid Build Coastguard Workerlarge packets in the data stream are discouraged.</p> 196*4d5d8b54SAndroid Build Coastguard Worker 197*4d5d8b54SAndroid Build Coastguard Worker<p>After segmenting a packet, the encoder may decide not to place all the 198*4d5d8b54SAndroid Build Coastguard Workerresulting segments into the current page; to do so, the encoder places 199*4d5d8b54SAndroid Build Coastguard Workerthe lacing values of the segments it wishes to belong to the current 200*4d5d8b54SAndroid Build Coastguard Workerpage into the current segment table, then finishes the page. The next 201*4d5d8b54SAndroid Build Coastguard Workerpage is begun with the first value in the segment table belonging to 202*4d5d8b54SAndroid Build Coastguard Workerthe next packet segment, thus continuing the packet (data in the 203*4d5d8b54SAndroid Build Coastguard Workerpacket body must also correspond properly to the lacing values in the 204*4d5d8b54SAndroid Build Coastguard Workerspanned pages. The segment data in the first packet corresponding to 205*4d5d8b54SAndroid Build Coastguard Workerthe lacing values of the first page belong in that page; packet 206*4d5d8b54SAndroid Build Coastguard Workersegments listed in the segment table of the following page must begin 207*4d5d8b54SAndroid Build Coastguard Workerthe page body of the subsequent page).</p> 208*4d5d8b54SAndroid Build Coastguard Worker 209*4d5d8b54SAndroid Build Coastguard Worker<p>The last mechanic to spanning a page boundary is to set the header 210*4d5d8b54SAndroid Build Coastguard Workerflag in the new page to indicate that the first lacing value in the 211*4d5d8b54SAndroid Build Coastguard Workersegment table continues rather than begins a packet; a header flag of 212*4d5d8b54SAndroid Build Coastguard Worker0x01 is set to indicate a continued packet. Although mandatory, it 213*4d5d8b54SAndroid Build Coastguard Workeris not actually algorithmically necessary; one could inspect the 214*4d5d8b54SAndroid Build Coastguard Workerpreceding segment table to determine if the packet is new or 215*4d5d8b54SAndroid Build Coastguard Workercontinued. Adding the information to the packet_header flag allows a 216*4d5d8b54SAndroid Build Coastguard Workersimpler design (with no overhead) that needs only inspect the current 217*4d5d8b54SAndroid Build Coastguard Workerpage header after frame capture. This also allows faster error 218*4d5d8b54SAndroid Build Coastguard Workerrecovery in the event that the packet originates in a corrupt 219*4d5d8b54SAndroid Build Coastguard Workerpreceding page, implying that the previous page's segment table 220*4d5d8b54SAndroid Build Coastguard Workercannot be trusted.</p> 221*4d5d8b54SAndroid Build Coastguard Worker 222*4d5d8b54SAndroid Build Coastguard Worker<p>Note that a packet can span an arbitrary number of pages; the above 223*4d5d8b54SAndroid Build Coastguard Workerspanning process is repeated for each spanned page boundary. Also a 224*4d5d8b54SAndroid Build Coastguard Worker'zero termination' on a packet size that is an even multiple of 255 225*4d5d8b54SAndroid Build Coastguard Workermust appear even if the lacing value appears in the next page as a 226*4d5d8b54SAndroid Build Coastguard Workerzero-length continuation of the current packet. The header flag 227*4d5d8b54SAndroid Build Coastguard Workershould be set to 0x01 to indicate that the packet spanned, even though 228*4d5d8b54SAndroid Build Coastguard Workerthe span is a nil case as far as data is concerned.</p> 229*4d5d8b54SAndroid Build Coastguard Worker 230*4d5d8b54SAndroid Build Coastguard Worker<p>The encoding looks odd, but is properly optimized for speed and the 231*4d5d8b54SAndroid Build Coastguard Workerexpected case of the majority of packets being between 50 and 200 232*4d5d8b54SAndroid Build Coastguard Workerbytes (note that it is designed such that packets of wildly different 233*4d5d8b54SAndroid Build Coastguard Workersizes can be handled within the model; placing packet size 234*4d5d8b54SAndroid Build Coastguard Workerrestrictions on the encoder would have only slightly simplified design 235*4d5d8b54SAndroid Build Coastguard Workerin page generation and increased overall encoder complexity).</p> 236*4d5d8b54SAndroid Build Coastguard Worker 237*4d5d8b54SAndroid Build Coastguard Worker<p>The main point behind tracking individual packets (and packet 238*4d5d8b54SAndroid Build Coastguard Workersegments) is to allow more flexible encoding tricks that requiring 239*4d5d8b54SAndroid Build Coastguard Workerexplicit knowledge of packet size. An example is simple bandwidth 240*4d5d8b54SAndroid Build Coastguard Workerlimiting, implemented by simply truncating packets in the nominal case 241*4d5d8b54SAndroid Build Coastguard Workerif the packet is arranged so that the least sensitive portion of the 242*4d5d8b54SAndroid Build Coastguard Workerdata comes last.</p> 243*4d5d8b54SAndroid Build Coastguard Worker 244*4d5d8b54SAndroid Build Coastguard Worker<a name="page_header"></a> 245*4d5d8b54SAndroid Build Coastguard Worker<h3>Page header</h3> 246*4d5d8b54SAndroid Build Coastguard Worker 247*4d5d8b54SAndroid Build Coastguard Worker<p>The headering mechanism is designed to avoid copying and re-assembly 248*4d5d8b54SAndroid Build Coastguard Workerof the packet data (ie, making the packet segmentation process a 249*4d5d8b54SAndroid Build Coastguard Workerlogical one); the header can be generated directly from incoming 250*4d5d8b54SAndroid Build Coastguard Workerpacket data. The encoder buffers packet data until it finishes a 251*4d5d8b54SAndroid Build Coastguard Workercomplete page at which point it writes the header followed by the 252*4d5d8b54SAndroid Build Coastguard Workerbuffered packet segments.</p> 253*4d5d8b54SAndroid Build Coastguard Worker 254*4d5d8b54SAndroid Build Coastguard Worker<h4>capture_pattern</h4> 255*4d5d8b54SAndroid Build Coastguard Worker 256*4d5d8b54SAndroid Build Coastguard Worker<p>A header begins with a capture pattern that simplifies identifying 257*4d5d8b54SAndroid Build Coastguard Workerpages; once the decoder has found the capture pattern it can do a more 258*4d5d8b54SAndroid Build Coastguard Workerintensive job of verifying that it has in fact found a page boundary 259*4d5d8b54SAndroid Build Coastguard Worker(as opposed to an inadvertent coincidence in the byte stream).</p> 260*4d5d8b54SAndroid Build Coastguard Worker 261*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 262*4d5d8b54SAndroid Build Coastguard Worker byte value 263*4d5d8b54SAndroid Build Coastguard Worker 264*4d5d8b54SAndroid Build Coastguard Worker 0 0x4f 'O' 265*4d5d8b54SAndroid Build Coastguard Worker 1 0x67 'g' 266*4d5d8b54SAndroid Build Coastguard Worker 2 0x67 'g' 267*4d5d8b54SAndroid Build Coastguard Worker 3 0x53 'S' 268*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 269*4d5d8b54SAndroid Build Coastguard Worker 270*4d5d8b54SAndroid Build Coastguard Worker<h4>stream_structure_version</h4> 271*4d5d8b54SAndroid Build Coastguard Worker 272*4d5d8b54SAndroid Build Coastguard Worker<p>The capture pattern is followed by the stream structure revision:</p> 273*4d5d8b54SAndroid Build Coastguard Worker 274*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 275*4d5d8b54SAndroid Build Coastguard Worker byte value 276*4d5d8b54SAndroid Build Coastguard Worker 277*4d5d8b54SAndroid Build Coastguard Worker 4 0x00 278*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 279*4d5d8b54SAndroid Build Coastguard Worker 280*4d5d8b54SAndroid Build Coastguard Worker<h4>header_type_flag</h4> 281*4d5d8b54SAndroid Build Coastguard Worker 282*4d5d8b54SAndroid Build Coastguard Worker<p>The header type flag identifies this page's context in the bitstream:</p> 283*4d5d8b54SAndroid Build Coastguard Worker 284*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 285*4d5d8b54SAndroid Build Coastguard Worker byte value 286*4d5d8b54SAndroid Build Coastguard Worker 287*4d5d8b54SAndroid Build Coastguard Worker 5 bitflags: 0x01: unset = fresh packet 288*4d5d8b54SAndroid Build Coastguard Worker set = continued packet 289*4d5d8b54SAndroid Build Coastguard Worker 0x02: unset = not first page of logical bitstream 290*4d5d8b54SAndroid Build Coastguard Worker set = first page of logical bitstream (bos) 291*4d5d8b54SAndroid Build Coastguard Worker 0x04: unset = not last page of logical bitstream 292*4d5d8b54SAndroid Build Coastguard Worker set = last page of logical bitstream (eos) 293*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 294*4d5d8b54SAndroid Build Coastguard Worker 295*4d5d8b54SAndroid Build Coastguard Worker<h4>absolute granule position</h4> 296*4d5d8b54SAndroid Build Coastguard Worker 297*4d5d8b54SAndroid Build Coastguard Worker<p>(This is packed in the same way the rest of Ogg data is packed; LSb 298*4d5d8b54SAndroid Build Coastguard Workerof LSB first. Note that the 'position' data specifies a 'sample' 299*4d5d8b54SAndroid Build Coastguard Workernumber (eg, in a CD quality sample is four octets, 16 bits for left 300*4d5d8b54SAndroid Build Coastguard Workerand 16 bits for right; in video it would likely be the frame number. 301*4d5d8b54SAndroid Build Coastguard WorkerIt is up to the specific codec in use to define the semantic meaning 302*4d5d8b54SAndroid Build Coastguard Workerof the granule position value). The position specified is the total 303*4d5d8b54SAndroid Build Coastguard Workersamples encoded after including all packets finished on this page 304*4d5d8b54SAndroid Build Coastguard Worker(packets begun on this page but continuing on to the next page do not 305*4d5d8b54SAndroid Build Coastguard Workercount). The rationale here is that the position specified in the 306*4d5d8b54SAndroid Build Coastguard Workerframe header of the last page tells how long the data coded by the 307*4d5d8b54SAndroid Build Coastguard Workerbitstream is. A truncated stream will still return the proper number 308*4d5d8b54SAndroid Build Coastguard Workerof samples that can be decoded fully.</p> 309*4d5d8b54SAndroid Build Coastguard Worker 310*4d5d8b54SAndroid Build Coastguard Worker<p>A special value of '-1' (in two's complement) indicates that no packets 311*4d5d8b54SAndroid Build Coastguard Workerfinish on this page.</p> 312*4d5d8b54SAndroid Build Coastguard Worker 313*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 314*4d5d8b54SAndroid Build Coastguard Worker byte value 315*4d5d8b54SAndroid Build Coastguard Worker 316*4d5d8b54SAndroid Build Coastguard Worker 6 0xXX LSB 317*4d5d8b54SAndroid Build Coastguard Worker 7 0xXX 318*4d5d8b54SAndroid Build Coastguard Worker 8 0xXX 319*4d5d8b54SAndroid Build Coastguard Worker 9 0xXX 320*4d5d8b54SAndroid Build Coastguard Worker 10 0xXX 321*4d5d8b54SAndroid Build Coastguard Worker 11 0xXX 322*4d5d8b54SAndroid Build Coastguard Worker 12 0xXX 323*4d5d8b54SAndroid Build Coastguard Worker 13 0xXX MSB 324*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 325*4d5d8b54SAndroid Build Coastguard Worker 326*4d5d8b54SAndroid Build Coastguard Worker<h4>stream serial number</h4> 327*4d5d8b54SAndroid Build Coastguard Worker 328*4d5d8b54SAndroid Build Coastguard Worker<p>Ogg allows for separate logical bitstreams to be mixed at page 329*4d5d8b54SAndroid Build Coastguard Workergranularity in a physical bitstream. The most common case would be 330*4d5d8b54SAndroid Build Coastguard Workersequential arrangement, but it is possible to interleave pages for 331*4d5d8b54SAndroid Build Coastguard Workertwo separate bitstreams to be decoded concurrently. The serial 332*4d5d8b54SAndroid Build Coastguard Workernumber is the means by which pages physical pages are associated with 333*4d5d8b54SAndroid Build Coastguard Workera particular logical stream. Each logical stream must have a unique 334*4d5d8b54SAndroid Build Coastguard Workerserial number within a physical stream:</p> 335*4d5d8b54SAndroid Build Coastguard Worker 336*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 337*4d5d8b54SAndroid Build Coastguard Worker byte value 338*4d5d8b54SAndroid Build Coastguard Worker 339*4d5d8b54SAndroid Build Coastguard Worker 14 0xXX LSB 340*4d5d8b54SAndroid Build Coastguard Worker 15 0xXX 341*4d5d8b54SAndroid Build Coastguard Worker 16 0xXX 342*4d5d8b54SAndroid Build Coastguard Worker 17 0xXX MSB 343*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 344*4d5d8b54SAndroid Build Coastguard Worker 345*4d5d8b54SAndroid Build Coastguard Worker<h4>page sequence no</h4> 346*4d5d8b54SAndroid Build Coastguard Worker 347*4d5d8b54SAndroid Build Coastguard Worker<p>Page counter; lets us know if a page is lost (useful where packets 348*4d5d8b54SAndroid Build Coastguard Workerspan page boundaries).</p> 349*4d5d8b54SAndroid Build Coastguard Worker 350*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 351*4d5d8b54SAndroid Build Coastguard Worker byte value 352*4d5d8b54SAndroid Build Coastguard Worker 353*4d5d8b54SAndroid Build Coastguard Worker 18 0xXX LSB 354*4d5d8b54SAndroid Build Coastguard Worker 19 0xXX 355*4d5d8b54SAndroid Build Coastguard Worker 20 0xXX 356*4d5d8b54SAndroid Build Coastguard Worker 21 0xXX MSB 357*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 358*4d5d8b54SAndroid Build Coastguard Worker 359*4d5d8b54SAndroid Build Coastguard Worker<h4>page checksum</h4> 360*4d5d8b54SAndroid Build Coastguard Worker 361*4d5d8b54SAndroid Build Coastguard Worker<p>32 bit CRC value (direct algorithm, initial val and final XOR = 0, 362*4d5d8b54SAndroid Build Coastguard Workergenerator polynomial=0x04c11db7). The value is computed over the 363*4d5d8b54SAndroid Build Coastguard Workerentire header (with the CRC field in the header set to zero) and then 364*4d5d8b54SAndroid Build Coastguard Workercontinued over the page. The CRC field is then filled with the 365*4d5d8b54SAndroid Build Coastguard Workercomputed value.</p> 366*4d5d8b54SAndroid Build Coastguard Worker 367*4d5d8b54SAndroid Build Coastguard Worker<p>(A thorough discussion of CRC algorithms can be found in <a 368*4d5d8b54SAndroid Build Coastguard Workerhref="http://www.ross.net/crc/download/crc_v3.txt">"A 369*4d5d8b54SAndroid Build Coastguard WorkerPainless Guide to CRC Error Detection Algorithms"</a> by Ross 370*4d5d8b54SAndroid Build Coastguard WorkerWilliams <a href="mailto:[email protected]">[email protected]</a>.)</p> 371*4d5d8b54SAndroid Build Coastguard Worker 372*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 373*4d5d8b54SAndroid Build Coastguard Worker byte value 374*4d5d8b54SAndroid Build Coastguard Worker 375*4d5d8b54SAndroid Build Coastguard Worker 22 0xXX LSB 376*4d5d8b54SAndroid Build Coastguard Worker 23 0xXX 377*4d5d8b54SAndroid Build Coastguard Worker 24 0xXX 378*4d5d8b54SAndroid Build Coastguard Worker 25 0xXX MSB 379*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 380*4d5d8b54SAndroid Build Coastguard Worker 381*4d5d8b54SAndroid Build Coastguard Worker<h4>page_segments</h4> 382*4d5d8b54SAndroid Build Coastguard Worker 383*4d5d8b54SAndroid Build Coastguard Worker<p>The number of segment entries to appear in the segment table. The 384*4d5d8b54SAndroid Build Coastguard Workermaximum number of 255 segments (255 bytes each) sets the maximum 385*4d5d8b54SAndroid Build Coastguard Workerpossible physical page size at 65307 bytes or just under 64kB (thus 386*4d5d8b54SAndroid Build Coastguard Workerwe know that a header corrupted so as destroy sizing/alignment 387*4d5d8b54SAndroid Build Coastguard Workerinformation will not cause a runaway bitstream. We'll read in the 388*4d5d8b54SAndroid Build Coastguard Workerpage according to the corrupted size information that's guaranteed to 389*4d5d8b54SAndroid Build Coastguard Workerbe a reasonable size regardless, notice the checksum mismatch, drop 390*4d5d8b54SAndroid Build Coastguard Workersync and then look for recapture).</p> 391*4d5d8b54SAndroid Build Coastguard Worker 392*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 393*4d5d8b54SAndroid Build Coastguard Worker byte value 394*4d5d8b54SAndroid Build Coastguard Worker 395*4d5d8b54SAndroid Build Coastguard Worker 26 0x00-0xff (0-255) 396*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 397*4d5d8b54SAndroid Build Coastguard Worker 398*4d5d8b54SAndroid Build Coastguard Worker<h4>segment_table (containing packet lacing values)</h4> 399*4d5d8b54SAndroid Build Coastguard Worker 400*4d5d8b54SAndroid Build Coastguard Worker<p>The lacing values for each packet segment physically appearing in 401*4d5d8b54SAndroid Build Coastguard Workerthis page are listed in contiguous order.</p> 402*4d5d8b54SAndroid Build Coastguard Worker 403*4d5d8b54SAndroid Build Coastguard Worker<pre><tt> 404*4d5d8b54SAndroid Build Coastguard Worker byte value 405*4d5d8b54SAndroid Build Coastguard Worker 406*4d5d8b54SAndroid Build Coastguard Worker 27 0x00-0xff (0-255) 407*4d5d8b54SAndroid Build Coastguard Worker [...] 408*4d5d8b54SAndroid Build Coastguard Worker n 0x00-0xff (0-255, n=page_segments+26) 409*4d5d8b54SAndroid Build Coastguard Worker</tt></pre> 410*4d5d8b54SAndroid Build Coastguard Worker 411*4d5d8b54SAndroid Build Coastguard Worker<p>Total page size is calculated directly from the known header size and 412*4d5d8b54SAndroid Build Coastguard Workerlacing values in the segment table. Packet data segments follow 413*4d5d8b54SAndroid Build Coastguard Workerimmediately after the header.</p> 414*4d5d8b54SAndroid Build Coastguard Worker 415*4d5d8b54SAndroid Build Coastguard Worker<p>Page headers typically impose a flat .25-.5% space overhead assuming 416*4d5d8b54SAndroid Build Coastguard Workernominal ~8k page sizes. The segmentation table needed for exact 417*4d5d8b54SAndroid Build Coastguard Workerpacket recovery in the streaming layer adds approximately .5-1% 418*4d5d8b54SAndroid Build Coastguard Workernominal assuming expected encoder behavior in the 44.1kHz, 128kbps 419*4d5d8b54SAndroid Build Coastguard Workerstereo encodings.</p> 420*4d5d8b54SAndroid Build Coastguard Worker 421*4d5d8b54SAndroid Build Coastguard Worker<div id="copyright"> 422*4d5d8b54SAndroid Build Coastguard Worker The Xiph Fish Logo is a 423*4d5d8b54SAndroid Build Coastguard Worker trademark (™) of Xiph.Org.<br/> 424*4d5d8b54SAndroid Build Coastguard Worker 425*4d5d8b54SAndroid Build Coastguard Worker These pages © 1994 - 2005 Xiph.Org. All rights reserved. 426*4d5d8b54SAndroid Build Coastguard Worker</div> 427*4d5d8b54SAndroid Build Coastguard Worker 428*4d5d8b54SAndroid Build Coastguard Worker</body> 429*4d5d8b54SAndroid Build Coastguard Worker</html> 430