xref: /aosp_15_r20/external/libogg/doc/framing.html (revision 4d5d8b54cec1a9622d79143ad0e145ea73da2224)
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 &lt; 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 (&lt;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 &lt; 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 (&trade;) of Xiph.Org.<br/>
424*4d5d8b54SAndroid Build Coastguard Worker
425*4d5d8b54SAndroid Build Coastguard Worker  These pages &copy; 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