VirtualBox

source: vbox/trunk/src/libs/libvorbis-1.3.7/doc/Vorbis_I_spec.html@ 103131

Last change on this file since 103131 was 96468, checked in by vboxsync, 2 years ago

libs/libvorbis-1.3.7: Re-exporting, hopefully this time everything is there. bugref:10275

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 535.2 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2 "http://www.w3.org/TR/html4/loose.dtd">
3<html >
4<head><title>Vorbis I specification</title>
5<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6<meta name="generator" content="TeX4ht (http://www.tug.org/tex4ht/)">
7<meta name="originator" content="TeX4ht (http://www.tug.org/tex4ht/)">
8<!-- html -->
9<meta name="src" content="Vorbis_I_spec.tex">
10<link rel="stylesheet" type="text/css" href="Vorbis_I_spec.css">
11</head><body
12>
13<div class="maketitle">
14
15
16
17
18<h2 class="titleHead">Vorbis I specification</h2>
19<div class="author" ><span
20class="cmr-17">Xiph.Org Foundation</span></div><br />
21<div class="date" ><span
22class="cmr-17">July 4, 2020</span></div>
23</div>
24<h3 class="likesectionHead"><a
25 id="x1-1000"></a>Contents</h3>
26<div class="tableofcontents">
27&#x00A0;<span class="sectionToc" >1 <a
28href="#x1-20001" id="QQ2-1-2">Introduction and Description</a></span>
29<br />&#x00A0;&#x00A0;<span class="subsectionToc" >1.1 <a
30href="#x1-30001.1" id="QQ2-1-3">Overview</a></span>
31<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.1.1 <a
32href="#x1-40001.1.1" id="QQ2-1-4">Application</a></span>
33<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.1.2 <a
34href="#x1-50001.1.2" id="QQ2-1-5">Classification</a></span>
35<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.1.3 <a
36href="#x1-60001.1.3" id="QQ2-1-6">Assumptions</a></span>
37<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.1.4 <a
38href="#x1-70001.1.4" id="QQ2-1-7">Codec Setup and Probability Model</a></span>
39<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.1.5 <a
40href="#x1-90001.1.5" id="QQ2-1-9">Format Specification</a></span>
41<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.1.6 <a
42href="#x1-100001.1.6" id="QQ2-1-10">Hardware Profile</a></span>
43<br />&#x00A0;&#x00A0;<span class="subsectionToc" >1.2 <a
44href="#x1-110001.2" id="QQ2-1-11">Decoder Configuration</a></span>
45<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.2.1 <a
46href="#x1-120001.2.1" id="QQ2-1-13">Global Config</a></span>
47<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.2.2 <a
48href="#x1-130001.2.2" id="QQ2-1-14">Mode</a></span>
49<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.2.3 <a
50href="#x1-140001.2.3" id="QQ2-1-15">Mapping</a></span>
51
52
53
54<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.2.4 <a
55href="#x1-150001.2.4" id="QQ2-1-16">Floor</a></span>
56<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.2.5 <a
57href="#x1-160001.2.5" id="QQ2-1-17">Residue</a></span>
58<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.2.6 <a
59href="#x1-170001.2.6" id="QQ2-1-18">Codebooks</a></span>
60<br />&#x00A0;&#x00A0;<span class="subsectionToc" >1.3 <a
61href="#x1-180001.3" id="QQ2-1-19">High-level Decode Process</a></span>
62<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.3.1 <a
63href="#x1-190001.3.1" id="QQ2-1-20">Decode Setup</a></span>
64<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >1.3.2 <a
65href="#x1-230001.3.2" id="QQ2-1-24">Decode Procedure</a></span>
66<br />&#x00A0;<span class="sectionToc" >2 <a
67href="#x1-360002" id="QQ2-1-39">Bitpacking Convention</a></span>
68<br />&#x00A0;&#x00A0;<span class="subsectionToc" >2.1 <a
69href="#x1-370002.1" id="QQ2-1-40">Overview</a></span>
70<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.1 <a
71href="#x1-380002.1.1" id="QQ2-1-41">octets, bytes and words</a></span>
72<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.2 <a
73href="#x1-390002.1.2" id="QQ2-1-42">bit order</a></span>
74<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.3 <a
75href="#x1-400002.1.3" id="QQ2-1-43">byte order</a></span>
76<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.4 <a
77href="#x1-410002.1.4" id="QQ2-1-44">coding bits into byte sequences</a></span>
78<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.5 <a
79href="#x1-420002.1.5" id="QQ2-1-45">signedness</a></span>
80<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.6 <a
81href="#x1-430002.1.6" id="QQ2-1-46">coding example</a></span>
82<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.7 <a
83href="#x1-440002.1.7" id="QQ2-1-47">decoding example</a></span>
84<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.8 <a
85href="#x1-450002.1.8" id="QQ2-1-48">end-of-packet alignment</a></span>
86<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >2.1.9 <a
87href="#x1-460002.1.9" id="QQ2-1-49">reading zero bits</a></span>
88<br />&#x00A0;<span class="sectionToc" >3 <a
89href="#x1-470003" id="QQ2-1-50">Probability Model and Codebooks</a></span>
90<br />&#x00A0;&#x00A0;<span class="subsectionToc" >3.1 <a
91href="#x1-480003.1" id="QQ2-1-51">Overview</a></span>
92<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >3.1.1 <a
93href="#x1-490003.1.1" id="QQ2-1-52">Bitwise operation</a></span>
94<br />&#x00A0;&#x00A0;<span class="subsectionToc" >3.2 <a
95href="#x1-500003.2" id="QQ2-1-53">Packed codebook format</a></span>
96<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >3.2.1 <a
97href="#x1-510003.2.1" id="QQ2-1-54">codebook decode</a></span>
98<br />&#x00A0;&#x00A0;<span class="subsectionToc" >3.3 <a
99href="#x1-580003.3" id="QQ2-1-63">Use of the codebook abstraction</a></span>
100<br />&#x00A0;<span class="sectionToc" >4 <a
101href="#x1-590004" id="QQ2-1-64">Codec Setup and Packet Decode</a></span>
102<br />&#x00A0;&#x00A0;<span class="subsectionToc" >4.1 <a
103href="#x1-600004.1" id="QQ2-1-65">Overview</a></span>
104<br />&#x00A0;&#x00A0;<span class="subsectionToc" >4.2 <a
105href="#x1-610004.2" id="QQ2-1-66">Header decode and decode setup</a></span>
106<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.2.1 <a
107href="#x1-620004.2.1" id="QQ2-1-67">Common header decode</a></span>
108<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.2.2 <a
109href="#x1-630004.2.2" id="QQ2-1-68">Identification header</a></span>
110<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.2.3 <a
111href="#x1-640004.2.3" id="QQ2-1-69">Comment header</a></span>
112
113
114
115<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.2.4 <a
116href="#x1-650004.2.4" id="QQ2-1-70">Setup header</a></span>
117<br />&#x00A0;&#x00A0;<span class="subsectionToc" >4.3 <a
118href="#x1-720004.3" id="QQ2-1-78">Audio packet decode and synthesis</a></span>
119<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.1 <a
120href="#x1-730004.3.1" id="QQ2-1-79">packet type, mode and window decode</a></span>
121<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.2 <a
122href="#x1-740004.3.2" id="QQ2-1-80">floor curve decode</a></span>
123<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.3 <a
124href="#x1-750004.3.3" id="QQ2-1-81">nonzero vector propagate</a></span>
125<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.4 <a
126href="#x1-760004.3.4" id="QQ2-1-82">residue decode</a></span>
127<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.5 <a
128href="#x1-770004.3.5" id="QQ2-1-83">inverse coupling</a></span>
129<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.6 <a
130href="#x1-780004.3.6" id="QQ2-1-84">dot product</a></span>
131<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.7 <a
132href="#x1-790004.3.7" id="QQ2-1-85">inverse MDCT</a></span>
133<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.8 <a
134href="#x1-800004.3.8" id="QQ2-1-86">overlap_add</a></span>
135<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >4.3.9 <a
136href="#x1-810004.3.9" id="QQ2-1-87">output channel order</a></span>
137<br />&#x00A0;<span class="sectionToc" >5 <a
138href="#x1-820005" id="QQ2-1-88">comment field and header specification</a></span>
139<br />&#x00A0;&#x00A0;<span class="subsectionToc" >5.1 <a
140href="#x1-830005.1" id="QQ2-1-89">Overview</a></span>
141<br />&#x00A0;&#x00A0;<span class="subsectionToc" >5.2 <a
142href="#x1-840005.2" id="QQ2-1-90">Comment encoding</a></span>
143<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >5.2.1 <a
144href="#x1-850005.2.1" id="QQ2-1-91">Structure</a></span>
145<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >5.2.2 <a
146href="#x1-860005.2.2" id="QQ2-1-92">Content vector format</a></span>
147<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >5.2.3 <a
148href="#x1-890005.2.3" id="QQ2-1-95">Encoding</a></span>
149<br />&#x00A0;<span class="sectionToc" >6 <a
150href="#x1-900006" id="QQ2-1-96">Floor type 0 setup and decode</a></span>
151<br />&#x00A0;&#x00A0;<span class="subsectionToc" >6.1 <a
152href="#x1-910006.1" id="QQ2-1-97">Overview</a></span>
153<br />&#x00A0;&#x00A0;<span class="subsectionToc" >6.2 <a
154href="#x1-920006.2" id="QQ2-1-98">Floor 0 format</a></span>
155<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >6.2.1 <a
156href="#x1-930006.2.1" id="QQ2-1-99">header decode</a></span>
157<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >6.2.2 <a
158href="#x1-940006.2.2" id="QQ2-1-100">packet decode</a></span>
159<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >6.2.3 <a
160href="#x1-950006.2.3" id="QQ2-1-101">curve computation</a></span>
161<br />&#x00A0;<span class="sectionToc" >7 <a
162href="#x1-970007" id="QQ2-1-103">Floor type 1 setup and decode</a></span>
163<br />&#x00A0;&#x00A0;<span class="subsectionToc" >7.1 <a
164href="#x1-980007.1" id="QQ2-1-104">Overview</a></span>
165<br />&#x00A0;&#x00A0;<span class="subsectionToc" >7.2 <a
166href="#x1-990007.2" id="QQ2-1-105">Floor 1 format</a></span>
167<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >7.2.1 <a
168href="#x1-1000007.2.1" id="QQ2-1-106">model</a></span>
169<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >7.2.2 <a
170href="#x1-1010007.2.2" id="QQ2-1-111">header decode</a></span>
171<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >7.2.3 <a
172href="#x1-1020007.2.3" id="QQ2-1-112">packet decode</a></span>
173
174
175
176<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >7.2.4 <a
177href="#x1-1030007.2.4" id="QQ2-1-113">curve computation</a></span>
178<br />&#x00A0;<span class="sectionToc" >8 <a
179href="#x1-1040008" id="QQ2-1-114">Residue setup and decode</a></span>
180<br />&#x00A0;&#x00A0;<span class="subsectionToc" >8.1 <a
181href="#x1-1050008.1" id="QQ2-1-115">Overview</a></span>
182<br />&#x00A0;&#x00A0;<span class="subsectionToc" >8.2 <a
183href="#x1-1060008.2" id="QQ2-1-116">Residue format</a></span>
184<br />&#x00A0;&#x00A0;<span class="subsectionToc" >8.3 <a
185href="#x1-1070008.3" id="QQ2-1-118">residue 0</a></span>
186<br />&#x00A0;&#x00A0;<span class="subsectionToc" >8.4 <a
187href="#x1-1080008.4" id="QQ2-1-119">residue 1</a></span>
188<br />&#x00A0;&#x00A0;<span class="subsectionToc" >8.5 <a
189href="#x1-1090008.5" id="QQ2-1-120">residue 2</a></span>
190<br />&#x00A0;&#x00A0;<span class="subsectionToc" >8.6 <a
191href="#x1-1100008.6" id="QQ2-1-122">Residue decode</a></span>
192<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >8.6.1 <a
193href="#x1-1110008.6.1" id="QQ2-1-123">header decode</a></span>
194<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >8.6.2 <a
195href="#x1-1120008.6.2" id="QQ2-1-124">packet decode</a></span>
196<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >8.6.3 <a
197href="#x1-1130008.6.3" id="QQ2-1-125">format 0 specifics</a></span>
198<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >8.6.4 <a
199href="#x1-1140008.6.4" id="QQ2-1-126">format 1 specifics</a></span>
200<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >8.6.5 <a
201href="#x1-1150008.6.5" id="QQ2-1-127">format 2 specifics</a></span>
202<br />&#x00A0;<span class="sectionToc" >9 <a
203href="#x1-1160009" id="QQ2-1-128">Helper equations</a></span>
204<br />&#x00A0;&#x00A0;<span class="subsectionToc" >9.1 <a
205href="#x1-1170009.1" id="QQ2-1-129">Overview</a></span>
206<br />&#x00A0;&#x00A0;<span class="subsectionToc" >9.2 <a
207href="#x1-1180009.2" id="QQ2-1-130">Functions</a></span>
208<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.1 <a
209href="#x1-1190009.2.1" id="QQ2-1-131">ilog</a></span>
210<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.2 <a
211href="#x1-1200009.2.2" id="QQ2-1-132">float32_unpack</a></span>
212<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.3 <a
213href="#x1-1210009.2.3" id="QQ2-1-133">lookup1_values</a></span>
214<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.4 <a
215href="#x1-1220009.2.4" id="QQ2-1-134">low_neighbor</a></span>
216<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.5 <a
217href="#x1-1230009.2.5" id="QQ2-1-135">high_neighbor</a></span>
218<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.6 <a
219href="#x1-1240009.2.6" id="QQ2-1-136">render_point</a></span>
220<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >9.2.7 <a
221href="#x1-1250009.2.7" id="QQ2-1-137">render_line</a></span>
222<br />&#x00A0;<span class="sectionToc" >10 <a
223href="#x1-12600010" id="QQ2-1-138">Tables</a></span>
224<br />&#x00A0;&#x00A0;<span class="subsectionToc" >10.1 <a
225href="#x1-12700010.1" id="QQ2-1-139">floor1_inverse_dB_table</a></span>
226<br />&#x00A0;<span class="sectionToc" >A <a
227href="#x1-128000A" id="QQ2-1-140">Embedding Vorbis into an Ogg stream</a></span>
228<br />&#x00A0;&#x00A0;<span class="subsectionToc" >A.1 <a
229href="#x1-129000A.1" id="QQ2-1-141">Overview</a></span>
230<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >A.1.1 <a
231href="#x1-130000A.1.1" id="QQ2-1-142">Restrictions</a></span>
232<br />&#x00A0;&#x00A0;&#x00A0;<span class="subsubsectionToc" >A.1.2 <a
233href="#x1-131000A.1.2" id="QQ2-1-143">MIME type</a></span>
234
235
236
237<br />&#x00A0;&#x00A0;<span class="subsectionToc" >A.2 <a
238href="#x1-132000A.2" id="QQ2-1-144">Encapsulation</a></span>
239<br />&#x00A0;<span class="sectionToc" >B <a
240href="#x1-134000B" id="QQ2-1-146">Vorbis encapsulation in RTP</a></span>
241</div>
242
243
244
245<h3 class="sectionHead"><span class="titlemark">1. </span> <a
246 id="x1-20001"></a>Introduction and Description</h3>
247<!--l. 5--><p class="noindent" >
248<h4 class="subsectionHead"><span class="titlemark">1.1. </span> <a
249 id="x1-30001.1"></a>Overview</h4>
250<!--l. 7--><p class="noindent" >This document provides a high level description of the Vorbis codec&#8217;s construction. A bit-by-bit
251specification appears beginning in <a
252href="#x1-590004">section&#x00A0;4</a>, &#8220;<a
253href="#x1-590004">Codec Setup and Packet Decode<!--tex4ht:ref: vorbis:spec:codec --></a>&#8221;. The later
254sections assume a high-level understanding of the Vorbis decode process, which is provided
255here.
256<!--l. 14--><p class="noindent" >
257<h5 class="subsubsectionHead"><span class="titlemark">1.1.1. </span> <a
258 id="x1-40001.1.1"></a>Application</h5>
259<!--l. 15--><p class="noindent" >Vorbis is a general purpose perceptual audio CODEC intended to allow maximum encoder
260flexibility, thus allowing it to scale competitively over an exceptionally wide range of bitrates. At
261the high quality/bitrate end of the scale (CD or DAT rate stereo, 16/24 bits) it is in the same
262league as MPEG-2 and MPC. Similarly, the 1.0 encoder can encode high-quality CD and DAT
263rate stereo at below 48kbps without resampling to a lower rate. Vorbis is also intended for lower
264and higher sample rates (from 8kHz telephony to 192kHz digital masters) and a range of channel
265representations (monaural, polyphonic, stereo, quadraphonic, 5.1, ambisonic, or up to 255
266discrete channels).
267<!--l. 28--><p class="noindent" >
268<h5 class="subsubsectionHead"><span class="titlemark">1.1.2. </span> <a
269 id="x1-50001.1.2"></a>Classification</h5>
270<!--l. 29--><p class="noindent" >Vorbis I is a forward-adaptive monolithic transform CODEC based on the Modified Discrete
271Cosine Transform. The codec is structured to allow addition of a hybrid wavelet filterbank in
272Vorbis II to offer better transient response and reproduction using a transform better suited to
273localized time events.
274
275
276
277<!--l. 36--><p class="noindent" >
278<h5 class="subsubsectionHead"><span class="titlemark">1.1.3. </span> <a
279 id="x1-60001.1.3"></a>Assumptions</h5>
280<!--l. 38--><p class="noindent" >The Vorbis CODEC design assumes a complex, psychoacoustically-aware encoder and simple,
281low-complexity decoder. Vorbis decode is computationally simpler than mp3, although it does
282require more working memory as Vorbis has no static probability model; the vector codebooks
283used in the first stage of decoding from the bitstream are packed in their entirety into the Vorbis
284bitstream headers. In packed form, these codebooks occupy only a few kilobytes; the extent to
285which they are pre-decoded into a cache is the dominant factor in decoder memory
286usage.
287<!--l. 49--><p class="noindent" >Vorbis provides none of its own framing, synchronization or protection against errors; it
288is solely a method of accepting input audio, dividing it into individual frames and
289compressing these frames into raw, unformatted &#8217;packets&#8217;. The decoder then accepts
290these raw packets in sequence, decodes them, synthesizes audio frames from them, and
291reassembles the frames into a facsimile of the original audio stream. Vorbis is a free-form
292variable bit rate (VBR) codec and packets have no minimum size, maximum size, or
293fixed/expected size. Packets are designed that they may be truncated (or padded)
294and remain decodable; this is not to be considered an error condition and is used
295extensively in bitrate management in peeling. Both the transport mechanism and
296decoder must allow that a packet may be any size, or end before or after packet decode
297expects.
298<!--l. 63--><p class="noindent" >Vorbis packets are thus intended to be used with a transport mechanism that provides free-form
299framing, sync, positioning and error correction in accordance with these design assumptions, such
300as Ogg (for file transport) or RTP (for network multicast). For purposes of a few examples in this
301document, we will assume that Vorbis is to be embedded in an Ogg stream specifically,
302although this is by no means a requirement or fundamental assumption in the Vorbis
303design.
304<!--l. 71--><p class="noindent" >The specification for embedding Vorbis into an Ogg transport stream is in <a
305href="#x1-128000A">section&#x00A0;A</a>,
306&#8220;<a
307href="#x1-128000A">Embedding Vorbis into an Ogg stream<!--tex4ht:ref: vorbis:over:ogg --></a>&#8221;.
308<!--l. 76--><p class="noindent" >
309<h5 class="subsubsectionHead"><span class="titlemark">1.1.4. </span> <a
310 id="x1-70001.1.4"></a>Codec Setup and Probability Model</h5>
311<!--l. 78--><p class="noindent" >Vorbis&#8217; heritage is as a research CODEC and its current design reflects a desire to allow multiple
312decades of continuous encoder improvement before running out of room within the codec
313specification. For these reasons, configurable aspects of codec setup intentionally lean toward the
314extreme of forward adaptive.
315
316
317
318<!--l. 84--><p class="noindent" >The single most controversial design decision in Vorbis (and the most unusual for a Vorbis
319developer to keep in mind) is that the entire probability model of the codec, the Huffman and
320VQ codebooks, is packed into the bitstream header along with extensive CODEC setup
321parameters (often several hundred fields). This makes it impossible, as it would be with
322MPEG audio layers, to embed a simple frame type flag in each audio packet, or begin
323decode at any frame in the stream without having previously fetched the codec setup
324header.
325<!--l. 94--><p class="noindent" ><span class="likesubparagraphHead"><a
326 id="x1-80001.1.4"></a><span
327class="cmbx-12">Note:</span></span> Vorbis <span
328class="cmti-12">can </span>initiate decode at any arbitrary packet within a bitstream so long as the codec
329has been initialized/setup with the setup headers.
330<!--l. 100--><p class="noindent" >Thus, Vorbis headers are both required for decode to begin and relatively large as bitstream
331headers go. The header size is unbounded, although for streaming a rule-of-thumb of 4kB or less
332is recommended (and Xiph.Org&#8217;s Vorbis encoder follows this suggestion).
333<!--l. 105--><p class="noindent" >Our own design work indicates the primary liability of the required header is in mindshare; it is
334an unusual design and thus causes some amount of complaint among engineers as this runs
335against current design trends (and also points out limitations in some existing software/interface
336designs, such as Windows&#8217; ACM codec framework). However, we find that it does not
337fundamentally limit Vorbis&#8217; suitable application space.
338<!--l. 114--><p class="noindent" >
339<h5 class="subsubsectionHead"><span class="titlemark">1.1.5. </span> <a
340 id="x1-90001.1.5"></a>Format Specification</h5>
341<!--l. 115--><p class="noindent" >The Vorbis format is well-defined by its decode specification; any encoder that produces packets
342that are correctly decoded by the reference Vorbis decoder described below may be considered
343a proper Vorbis encoder. A decoder must faithfully and completely implement the
344specification defined below (except where noted) to be considered a proper Vorbis
345decoder.
346<!--l. 122--><p class="noindent" >
347<h5 class="subsubsectionHead"><span class="titlemark">1.1.6. </span> <a
348 id="x1-100001.1.6"></a>Hardware Profile</h5>
349
350
351
352<!--l. 123--><p class="noindent" >Although Vorbis decode is computationally simple, it may still run into specific limitations of an
353embedded design. For this reason, embedded designs are allowed to deviate in limited ways from
354the &#8216;full&#8217; decode specification yet still be certified compliant. These optional omissions are
355labelled in the spec where relevant.
356<!--l. 130--><p class="noindent" >
357<h4 class="subsectionHead"><span class="titlemark">1.2. </span> <a
358 id="x1-110001.2"></a>Decoder Configuration</h4>
359<!--l. 132--><p class="noindent" >Decoder setup consists of configuration of multiple, self-contained component abstractions that
360perform specific functions in the decode pipeline. Each different component instance of a specific
361type is semantically interchangeable; decoder configuration consists both of internal component
362configuration, as well as arrangement of specific instances into a decode pipeline. Componentry
363arrangement is roughly as follows:
364<div class="center"
365>
366<!--l. 140--><p class="noindent" >
367
368<!--l. 141--><p class="noindent" ><img
369src="components.png" alt="PIC"
370>
371<br /> <div class="caption"
372><span class="id">Figure&#x00A0;1: </span><span
373class="content">decoder pipeline configuration</span></div><!--tex4ht:label?: x1-110011 -->
374</div>
375<!--l. 145--><p class="noindent" >
376<h5 class="subsubsectionHead"><span class="titlemark">1.2.1. </span> <a
377 id="x1-120001.2.1"></a>Global Config</h5>
378<!--l. 146--><p class="noindent" >Global codec configuration consists of a few audio related fields (sample rate, channels), Vorbis
379version (always &#8217;0&#8217; in Vorbis I), bitrate hints, and the lists of component instances. All other
380configuration is in the context of specific components.
381<!--l. 151--><p class="noindent" >
382<h5 class="subsubsectionHead"><span class="titlemark">1.2.2. </span> <a
383 id="x1-130001.2.2"></a>Mode</h5>
384
385
386
387<!--l. 153--><p class="noindent" >Each Vorbis frame is coded according to a master &#8217;mode&#8217;. A bitstream may use one or many
388modes.
389<!--l. 156--><p class="noindent" >The mode mechanism is used to encode a frame according to one of multiple possible
390methods with the intention of choosing a method best suited to that frame. Different
391modes are, e.g. how frame size is changed from frame to frame. The mode number of a
392frame serves as a top level configuration switch for all other specific aspects of frame
393decode.
394<!--l. 163--><p class="noindent" >A &#8217;mode&#8217; configuration consists of a frame size setting, window type (always 0, the Vorbis
395window, in Vorbis I), transform type (always type 0, the MDCT, in Vorbis I) and a mapping
396number. The mapping number specifies which mapping configuration instance to use for low-level
397packet decode and synthesis.
398<!--l. 170--><p class="noindent" >
399<h5 class="subsubsectionHead"><span class="titlemark">1.2.3. </span> <a
400 id="x1-140001.2.3"></a>Mapping</h5>
401<!--l. 172--><p class="noindent" >A mapping contains a channel coupling description and a list of &#8217;submaps&#8217; that bundle sets
402of channel vectors together for grouped encoding and decoding. These submaps are
403not references to external components; the submap list is internal and specific to a
404mapping.
405<!--l. 177--><p class="noindent" >A &#8217;submap&#8217; is a configuration/grouping that applies to a subset of floor and residue vectors
406within a mapping. The submap functions as a last layer of indirection such that specific special
407floor or residue settings can be applied not only to all the vectors in a given mode, but also
408specific vectors in a specific mode. Each submap specifies the proper floor and residue
409instance number to use for decoding that submap&#8217;s spectral floor and spectral residue
410vectors.
411<!--l. 185--><p class="noindent" >As an example:
412<!--l. 187--><p class="noindent" >Assume a Vorbis stream that contains six channels in the standard 5.1 format. The sixth
413channel, as is normal in 5.1, is bass only. Therefore it would be wasteful to encode a
414full-spectrum version of it as with the other channels. The submapping mechanism can be used
415to apply a full range floor and residue encoding to channels 0 through 4, and a bass-only
416representation to the bass channel, thus saving space. In this example, channels 0-4 belong to
417submap 0 (which indicates use of a full-range floor) and channel 5 belongs to submap 1, which
418uses a bass-only representation.
419
420
421
422<!--l. 198--><p class="noindent" >
423<h5 class="subsubsectionHead"><span class="titlemark">1.2.4. </span> <a
424 id="x1-150001.2.4"></a>Floor</h5>
425<!--l. 200--><p class="noindent" >Vorbis encodes a spectral &#8217;floor&#8217; vector for each PCM channel. This vector is a low-resolution
426representation of the audio spectrum for the given channel in the current frame, generally used
427akin to a whitening filter. It is named a &#8217;floor&#8217; because the Xiph.Org reference encoder has
428historically used it as a unit-baseline for spectral resolution.
429<!--l. 207--><p class="noindent" >A floor encoding may be of two types. Floor 0 uses a packed LSP representation on a dB
430amplitude scale and Bark frequency scale. Floor 1 represents the curve as a piecewise linear
431interpolated representation on a dB amplitude scale and linear frequency scale. The two floors
432are semantically interchangeable in encoding/decoding. However, floor type 1 provides more
433stable inter-frame behavior, and so is the preferred choice in all coupled-stereo and
434high bitrate modes. Floor 1 is also considerably less expensive to decode than floor
4350.
436<!--l. 217--><p class="noindent" >Floor 0 is not to be considered deprecated, but it is of limited modern use. No known Vorbis
437encoder past Xiph.Org&#8217;s own beta 4 makes use of floor 0.
438<!--l. 221--><p class="noindent" >The values coded/decoded by a floor are both compactly formatted and make use of entropy
439coding to save space. For this reason, a floor configuration generally refers to multiple
440codebooks in the codebook component list. Entropy coding is thus provided as an
441abstraction, and each floor instance may choose from any and all available codebooks when
442coding/decoding.
443<!--l. 229--><p class="noindent" >
444<h5 class="subsubsectionHead"><span class="titlemark">1.2.5. </span> <a
445 id="x1-160001.2.5"></a>Residue</h5>
446<!--l. 230--><p class="noindent" >The spectral residue is the fine structure of the audio spectrum once the floor curve has been
447subtracted out. In simplest terms, it is coded in the bitstream using cascaded (multi-pass) vector
448quantization according to one of three specific packing/coding algorithms numbered
4490 through 2. The packing algorithm details are configured by residue instance. As
450with the floor components, the final VQ/entropy encoding is provided by external
451codebook instances and each residue instance may choose from any and all available
452codebooks.
453<!--l. 240--><p class="noindent" >
454
455
456
457<h5 class="subsubsectionHead"><span class="titlemark">1.2.6. </span> <a
458 id="x1-170001.2.6"></a>Codebooks</h5>
459<!--l. 242--><p class="noindent" >Codebooks are a self-contained abstraction that perform entropy decoding and, optionally, use
460the entropy-decoded integer value as an offset into an index of output value vectors, returning
461the indicated vector of values.
462<!--l. 247--><p class="noindent" >The entropy coding in a Vorbis I codebook is provided by a standard Huffman binary tree
463representation. This tree is tightly packed using one of several methods, depending on whether
464codeword lengths are ordered or unordered, or the tree is sparse.
465<!--l. 252--><p class="noindent" >The codebook vector index is similarly packed according to index characteristic. Most commonly,
466the vector index is encoded as a single list of values of possible values that are then permuted
467into a list of n-dimensional rows (lattice VQ).
468<!--l. 259--><p class="noindent" >
469<h4 class="subsectionHead"><span class="titlemark">1.3. </span> <a
470 id="x1-180001.3"></a>High-level Decode Process</h4>
471<!--l. 261--><p class="noindent" >
472<h5 class="subsubsectionHead"><span class="titlemark">1.3.1. </span> <a
473 id="x1-190001.3.1"></a>Decode Setup</h5>
474<!--l. 263--><p class="noindent" >Before decoding can begin, a decoder must initialize using the bitstream headers matching the
475stream to be decoded. Vorbis uses three header packets; all are required, in-order, by
476this specification. Once set up, decode may begin at any audio packet belonging to
477the Vorbis stream. In Vorbis I, all packets after the three initial headers are audio
478packets.
479<!--l. 270--><p class="noindent" >The header packets are, in order, the identification header, the comments header, and the setup
480header.
481<!--l. 273--><p class="noindent" ><span class="paragraphHead"><a
482 id="x1-200001.3.1"></a><span
483class="cmbx-12">Identification Header</span></span>
484The identification header identifies the bitstream as Vorbis, Vorbis version, and the simple audio
485characteristics of the stream such as sample rate and number of channels.
486
487
488
489<!--l. 278--><p class="noindent" ><span class="paragraphHead"><a
490 id="x1-210001.3.1"></a><span
491class="cmbx-12">Comment Header</span></span>
492The comment header includes user text comments (&#8220;tags&#8221;) and a vendor string for the
493application/library that produced the bitstream. The encoding and proper use of the comment
494header is described in <a
495href="#x1-820005">section&#x00A0;5</a>, &#8220;<a
496href="#x1-820005">comment field and header specification<!--tex4ht:ref: vorbis:spec:comment --></a>&#8221;.
497<!--l. 283--><p class="noindent" ><span class="paragraphHead"><a
498 id="x1-220001.3.1"></a><span
499class="cmbx-12">Setup Header</span></span>
500The setup header includes extensive CODEC setup information as well as the complete VQ and
501Huffman codebooks needed for decode.
502<!--l. 288--><p class="noindent" >
503<h5 class="subsubsectionHead"><span class="titlemark">1.3.2. </span> <a
504 id="x1-230001.3.2"></a>Decode Procedure</h5>
505<!--l. 290--><p class="noindent" >The decoding and synthesis procedure for all audio packets is fundamentally the same.
506 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
507 1. </dt><dd
508class="enumerate-enumitem">decode packet type flag
509 </dd><dt class="enumerate-enumitem">
510 2. </dt><dd
511class="enumerate-enumitem">decode mode number
512 </dd><dt class="enumerate-enumitem">
513 3. </dt><dd
514class="enumerate-enumitem">decode window shape (long windows only)
515 </dd><dt class="enumerate-enumitem">
516 4. </dt><dd
517class="enumerate-enumitem">decode floor
518 </dd><dt class="enumerate-enumitem">
519 5. </dt><dd
520class="enumerate-enumitem">decode residue into residue vectors
521 </dd><dt class="enumerate-enumitem">
522 6. </dt><dd
523class="enumerate-enumitem">inverse channel coupling of residue vectors
524 </dd><dt class="enumerate-enumitem">
525 7. </dt><dd
526class="enumerate-enumitem">generate floor curve from decoded floor data
527 </dd><dt class="enumerate-enumitem">
528 8. </dt><dd
529class="enumerate-enumitem">compute dot product of floor and residue, producing audio spectrum vector
530 </dd><dt class="enumerate-enumitem">
531 9. </dt><dd
532class="enumerate-enumitem">inverse monolithic transform of audio spectrum vector, always an MDCT in Vorbis
533 I
534
535
536
537 </dd><dt class="enumerate-enumitem">
538 10. </dt><dd
539class="enumerate-enumitem">overlap/add left-hand output of transform with right-hand output of previous frame
540 </dd><dt class="enumerate-enumitem">
541 11. </dt><dd
542class="enumerate-enumitem">store right hand-data from transform of current frame for future lapping
543 </dd><dt class="enumerate-enumitem">
544 12. </dt><dd
545class="enumerate-enumitem">if not first frame, return results of overlap/add as audio result of current frame</dd></dl>
546<!--l. 307--><p class="noindent" >Note that clever rearrangement of the synthesis arithmetic is possible; as an example, one can
547take advantage of symmetries in the MDCT to store the right-hand transform data of a partial
548MDCT for a 50% inter-frame buffer space savings, and then complete the transform later before
549overlap/add with the next frame. This optimization produces entirely equivalent output and is
550naturally perfectly legal. The decoder must be <span
551class="cmti-12">entirely mathematically equivalent </span>to the
552specification, it need not be a literal semantic implementation.
553<!--l. 316--><p class="noindent" ><span class="paragraphHead"><a
554 id="x1-240001.3.2"></a><span
555class="cmbx-12">Packet type decode</span></span>
556Vorbis I uses four packet types. The first three packet types mark each of the three Vorbis
557headers described above. The fourth packet type marks an audio packet. All other packet types
558are reserved; packets marked with a reserved type should be ignored.
559<!--l. 323--><p class="noindent" >Following the three header packets, all packets in a Vorbis I stream are audio. The first step of
560audio packet decode is to read and verify the packet type; <span
561class="cmti-12">a non-audio packet when audio is</span>
562<span
563class="cmti-12">expected indicates stream corruption or a non-compliant stream. The decoder must ignore the</span>
564<span
565class="cmti-12">packet and not attempt decoding it to audio</span>.
566<!--l. 333--><p class="noindent" ><span class="paragraphHead"><a
567 id="x1-250001.3.2"></a><span
568class="cmbx-12">Mode decode</span></span>
569Vorbis allows an encoder to set up multiple, numbered packet &#8217;modes&#8217;, as described earlier, all of
570which may be used in a given Vorbis stream. The mode is encoded as an integer used as a direct
571offset into the mode instance index.
572<!--l. 340--><p class="noindent" ><span class="paragraphHead"><a
573 id="x1-260001.3.2"></a><span
574class="cmbx-12">Window shape decode (long windows only)</span></span>
575Vorbis frames may be one of two PCM sample sizes specified during codec setup. In Vorbis I,
576legal frame sizes are powers of two from 64 to 8192 samples. Aside from coupling, Vorbis
577handles channels as independent vectors and these frame sizes are in samples per
578channel.
579
580
581
582<!--l. 347--><p class="noindent" >Vorbis uses an overlapping transform, namely the MDCT, to blend one frame into the next,
583avoiding most inter-frame block boundary artifacts. The MDCT output of one frame is windowed
584according to MDCT requirements, overlapped 50% with the output of the previous frame and
585added. The window shape assures seamless reconstruction.
586<!--l. 353--><p class="noindent" >This is easy to visualize in the case of equal sized-windows:
587<div class="center"
588>
589<!--l. 355--><p class="noindent" >
590
591<!--l. 356--><p class="noindent" ><img
592src="window1.png" alt="PIC"
593>
594<br /> <div class="caption"
595><span class="id">Figure&#x00A0;2: </span><span
596class="content">overlap of two equal-sized windows</span></div><!--tex4ht:label?: x1-260012 -->
597</div>
598<!--l. 360--><p class="noindent" >And slightly more complex in the case of overlapping unequal sized windows:
599<div class="center"
600>
601<!--l. 363--><p class="noindent" >
602
603<!--l. 364--><p class="noindent" ><img
604src="window2.png" alt="PIC"
605>
606<br /> <div class="caption"
607><span class="id">Figure&#x00A0;3: </span><span
608class="content">overlap of a long and a short window</span></div><!--tex4ht:label?: x1-260023 -->
609</div>
610<!--l. 368--><p class="noindent" >In the unequal-sized window case, the window shape of the long window must be modified for
611seamless lapping as above. It is possible to correctly infer window shape to be applied to the
612current window from knowing the sizes of the current, previous and next window. It is legal for a
613decoder to use this method. However, in the case of a long window (short windows require no
614modification), Vorbis also codes two flag bits to specify pre- and post- window shape. Although
615not strictly necessary for function, this minor redundancy allows a packet to be fully decoded to
616the point of lapping entirely independently of any other packet, allowing easier abstraction of
617decode layers as well as allowing a greater level of easy parallelism in encode and
618decode.
619<!--l. 381--><p class="noindent" >A description of valid window functions for use with an inverse MDCT can be found in <span class="cite">[<a
620href="#XSporer/Brandenburg/Edler">1</a>]</span>.
621Vorbis windows all use the slope function
622<center class="math-display" >
623<img
624src="Vorbis_I_spec0x.png" alt="y = sin (.5 * &#x03C0; sin2((x + .5)&#x2215;n * &#x03C0;)).
625
626
627
628" class="math-display" ></center>
629<!--l. 384--><p class="nopar" >
630<!--l. 388--><p class="noindent" ><span class="paragraphHead"><a
631 id="x1-270001.3.2"></a><span
632class="cmbx-12">floor decode</span></span>
633Each floor is encoded/decoded in channel order, however each floor belongs to a &#8217;submap&#8217; that
634specifies which floor configuration to use. All floors are decoded before residue decode
635begins.
636<!--l. 394--><p class="noindent" ><span class="paragraphHead"><a
637 id="x1-280001.3.2"></a><span
638class="cmbx-12">residue decode</span></span>
639Although the number of residue vectors equals the number of channels, channel coupling may
640mean that the raw residue vectors extracted during decode do not map directly to specific
641channels. When channel coupling is in use, some vectors will correspond to coupled magnitude or
642angle. The coupling relationships are described in the codec setup and may differ from frame to
643frame, due to different mode numbers.
644<!--l. 403--><p class="noindent" >Vorbis codes residue vectors in groups by submap; the coding is done in submap order from
645submap 0 through n-1. This differs from floors which are coded using a configuration provided by
646submap number, but are coded individually in channel order.
647<!--l. 410--><p class="noindent" ><span class="paragraphHead"><a
648 id="x1-290001.3.2"></a><span
649class="cmbx-12">inverse channel coupling</span></span>
650A detailed discussion of stereo in the Vorbis codec can be found in the document
651<a
652href="stereo.html" >Stereo Channel Coupling in the Vorbis CODEC</a>. Vorbis is not limited to only stereo
653coupling, but the stereo document also gives a good overview of the generic coupling
654mechanism.
655<!--l. 418--><p class="noindent" >Vorbis coupling applies to pairs of residue vectors at a time; decoupling is done in-place a
656pair at a time in the order and using the vectors specified in the current mapping
657configuration. The decoupling operation is the same for all pairs, converting square polar
658representation (where one vector is magnitude and the second angle) back to Cartesian
659representation.
660<!--l. 425--><p class="noindent" >After decoupling, in order, each pair of vectors on the coupling list, the resulting residue vectors
661represent the fine spectral detail of each output channel.
662
663
664
665<!--l. 431--><p class="noindent" ><span class="paragraphHead"><a
666 id="x1-300001.3.2"></a><span
667class="cmbx-12">generate floor curve</span></span>
668The decoder may choose to generate the floor curve at any appropriate time. It is reasonable to
669generate the output curve when the floor data is decoded from the raw packet, or it
670can be generated after inverse coupling and applied to the spectral residue directly,
671combining generation and the dot product into one step and eliminating some working
672space.
673<!--l. 440--><p class="noindent" >Both floor 0 and floor 1 generate a linear-range, linear-domain output vector to be multiplied
674(dot product) by the linear-range, linear-domain spectral residue.
675<!--l. 446--><p class="noindent" ><span class="paragraphHead"><a
676 id="x1-310001.3.2"></a><span
677class="cmbx-12">compute floor/residue dot product</span></span>
678This step is straightforward; for each output channel, the decoder multiplies the floor curve and
679residue vectors element by element, producing the finished audio spectrum of each
680channel.
681<!--l. 454--><p class="noindent" >One point is worth mentioning about this dot product; a common mistake in a fixed point
682implementation might be to assume that a 32 bit fixed-point representation for floor and
683residue and direct multiplication of the vectors is sufficient for acceptable spectral depth
684in all cases because it happens to mostly work with the current Xiph.Org reference
685encoder.
686<!--l. 461--><p class="noindent" >However, floor vector values can span <span
687class="cmsy-10x-x-120">~</span>140dB (<span
688class="cmsy-10x-x-120">~</span>24 bits unsigned), and the audio spectrum
689vector should represent a minimum of 120dB (<span
690class="cmsy-10x-x-120">~</span>21 bits with sign), even when output is to a 16
691bit PCM device. For the residue vector to represent full scale if the floor is nailed
692to <span
693class="cmsy-10x-x-120">-</span>140dB, it must be able to span 0 to +140dB. For the residue vector to reach
694full scale if the floor is nailed at 0dB, it must be able to represent <span
695class="cmsy-10x-x-120">-</span>140dB to +0dB.
696Thus, in order to handle full range dynamics, a residue vector may span <span
697class="cmsy-10x-x-120">-</span>140dB to
698+140dB entirely within spec. A 280dB range is approximately 48 bits with sign; thus the
699residue vector must be able to represent a 48 bit range and the dot product must
700be able to handle an effective 48 bit times 24 bit multiplication. This range may be
701achieved using large (64 bit or larger) integers, or implementing a movable binary point
702representation.
703<!--l. 478--><p class="noindent" ><span class="paragraphHead"><a
704 id="x1-320001.3.2"></a><span
705class="cmbx-12">inverse monolithic transform (MDCT)</span></span>
706The audio spectrum is converted back into time domain PCM audio via an inverse Modified
707Discrete Cosine Transform (MDCT). A detailed description of the MDCT is available in
708<span class="cite">[<a
709href="#XSporer/Brandenburg/Edler">1</a>]</span>.
710<!--l. 484--><p class="noindent" >Note that the PCM produced directly from the MDCT is not yet finished audio; it must be
711
712
713
714lapped with surrounding frames using an appropriate window (such as the Vorbis window) before
715the MDCT can be considered orthogonal.
716<!--l. 491--><p class="noindent" ><span class="paragraphHead"><a
717 id="x1-330001.3.2"></a><span
718class="cmbx-12">overlap/add data</span></span>
719Windowed MDCT output is overlapped and added with the right hand data of the previous
720window such that the 3/4 point of the previous window is aligned with the 1/4 point of the
721current window (as illustrated in the window overlap diagram). At this point, the audio data
722between the center of the previous frame and the center of the current frame is now finished and
723ready to be returned.
724<!--l. 500--><p class="noindent" ><span class="paragraphHead"><a
725 id="x1-340001.3.2"></a><span
726class="cmbx-12">cache right hand data</span></span>
727The decoder must cache the right hand portion of the current frame to be lapped with the left
728hand portion of the next frame.
729<!--l. 506--><p class="noindent" ><span class="paragraphHead"><a
730 id="x1-350001.3.2"></a><span
731class="cmbx-12">return finished audio data</span></span>
732The overlapped portion produced from overlapping the previous and current frame data
733is finished data to be returned by the decoder. This data spans from the center of
734the previous window to the center of the current window. In the case of same-sized
735windows, the amount of data to return is one-half block consisting of and only of the
736overlapped portions. When overlapping a short and long window, much of the returned
737range is not actually overlap. This does not damage transform orthogonality. Pay
738attention however to returning the correct data range; the amount of data to be returned
739is:
740<!--l. 518--><p class="noindent" >
741<div class="fancyvrb" id="fancyvrb1"><a
742 id="x1-35002r1"></a><span
743class="cmr-6">1</span><span
744class="cmtt-8">window</span><span
745class="cmtt-8">_blocksize(previous</span><span
746class="cmtt-8">_window)/4+window</span><span
747class="cmtt-8">_blocksize(current</span><span
748class="cmtt-8">_window)/4</span></div>
749<!--l. 522--><p class="noindent" >from the center of the previous window to the center of the current window.
750<!--l. 525--><p class="noindent" >Data is not returned from the first frame; it must be used to &#8217;prime&#8217; the decode engine. The
751encoder accounts for this priming when calculating PCM offsets; after the first frame, the proper
752PCM output offset is &#8217;0&#8217; (as no data has been returned yet).
753
754
755
756
757
758
759<h3 class="sectionHead"><span class="titlemark">2. </span> <a
760 id="x1-360002"></a>Bitpacking Convention</h3>
761<!--l. 5--><p class="noindent" >
762<h4 class="subsectionHead"><span class="titlemark">2.1. </span> <a
763 id="x1-370002.1"></a>Overview</h4>
764<!--l. 7--><p class="noindent" >The Vorbis codec uses relatively unstructured raw packets containing arbitrary-width binary
765integer fields. Logically, these packets are a bitstream in which bits are coded one-by-one by the
766encoder and then read one-by-one in the same monotonically increasing order by the decoder.
767Most current binary storage arrangements group bits into a native word size of eight bits
768(octets), sixteen bits, thirty-two bits or, less commonly other fixed word sizes. The Vorbis
769bitpacking convention specifies the correct mapping of the logical packet bitstream into an actual
770representation in fixed-width words.
771<!--l. 18--><p class="noindent" >
772<h5 class="subsubsectionHead"><span class="titlemark">2.1.1. </span> <a
773 id="x1-380002.1.1"></a>octets, bytes and words</h5>
774<!--l. 20--><p class="noindent" >In most contemporary architectures, a &#8217;byte&#8217; is synonymous with an &#8217;octet&#8217;, that is, eight bits.
775This has not always been the case; seven, ten, eleven and sixteen bit &#8217;bytes&#8217; have been used.
776For purposes of the bitpacking convention, a byte implies the native, smallest integer
777storage representation offered by a platform. On modern platforms, this is generally
778assumed to be eight bits (not necessarily because of the processor but because of the
779filesystem/memory architecture. Modern filesystems invariably offer bytes as the fundamental
780atom of storage). A &#8217;word&#8217; is an integer size that is a grouped multiple of this smallest
781size.
782<!--l. 31--><p class="noindent" >The most ubiquitous architectures today consider a &#8217;byte&#8217; to be an octet (eight bits) and a word
783to be a group of two, four or eight bytes (16, 32 or 64 bits). Note however that the Vorbis
784bitpacking convention is still well defined for any native byte size; Vorbis uses the native
785bit-width of a given storage system. This document assumes that a byte is one octet for purposes
786of example.
787<!--l. 38--><p class="noindent" >
788
789
790
791<h5 class="subsubsectionHead"><span class="titlemark">2.1.2. </span> <a
792 id="x1-390002.1.2"></a>bit order</h5>
793<!--l. 40--><p class="noindent" >A byte has a well-defined &#8217;least significant&#8217; bit (LSb), which is the only bit set when the byte is
794storing the two&#8217;s complement integer value +1. A byte&#8217;s &#8217;most significant&#8217; bit (MSb) is at the
795opposite end of the byte. Bits in a byte are numbered from zero at the LSb to <span
796class="cmmi-12">n </span>(<span
797class="cmmi-12">n </span>= 7 in an
798octet) for the MSb.
799<!--l. 49--><p class="noindent" >
800<h5 class="subsubsectionHead"><span class="titlemark">2.1.3. </span> <a
801 id="x1-400002.1.3"></a>byte order</h5>
802<!--l. 51--><p class="noindent" >Words are native groupings of multiple bytes. Several byte orderings are possible in a word; the
803common ones are 3-2-1-0 (&#8217;big endian&#8217; or &#8217;most significant byte first&#8217; in which the
804highest-valued byte comes first), 0-1-2-3 (&#8217;little endian&#8217; or &#8217;least significant byte first&#8217; in
805which the lowest value byte comes first) and less commonly 3-1-2-0 and 0-2-1-3 (&#8217;mixed
806endian&#8217;).
807<!--l. 58--><p class="noindent" >The Vorbis bitpacking convention specifies storage and bitstream manipulation at the byte, not
808word, level, thus host word ordering is of a concern only during optimization when writing high
809performance code that operates on a word of storage at a time rather than by byte.
810Logically, bytes are always coded and decoded in order from byte zero through byte
811<span
812class="cmmi-12">n</span>.
813<!--l. 67--><p class="noindent" >
814<h5 class="subsubsectionHead"><span class="titlemark">2.1.4. </span> <a
815 id="x1-410002.1.4"></a>coding bits into byte sequences</h5>
816<!--l. 69--><p class="noindent" >The Vorbis codec has need to code arbitrary bit-width integers, from zero to 32 bits
817wide, into packets. These integer fields are not aligned to the boundaries of the byte
818representation; the next field is written at the bit position at which the previous field
819ends.
820<!--l. 74--><p class="noindent" >The encoder logically packs integers by writing the LSb of a binary integer to the logical
821bitstream first, followed by next least significant bit, etc, until the requested number of bits
822have been coded. When packing the bits into bytes, the encoder begins by placing
823the LSb of the integer to be written into the least significant unused bit position of
824the destination byte, followed by the next-least significant bit of the source integer
825and so on up to the requested number of bits. When all bits of the destination byte
826have been filled, encoding continues by zeroing all bits of the next byte and writing
827the next bit into the bit position 0 of that byte. Decoding follows the same process
828
829
830
831as encoding, but by reading bits from the byte stream and reassembling them into
832integers.
833<!--l. 89--><p class="noindent" >
834<h5 class="subsubsectionHead"><span class="titlemark">2.1.5. </span> <a
835 id="x1-420002.1.5"></a>signedness</h5>
836<!--l. 91--><p class="noindent" >The signedness of a specific number resulting from decode is to be interpreted by the decoder
837given decode context. That is, the three bit binary pattern &#8217;b111&#8217; can be taken to represent
838either &#8217;seven&#8217; as an unsigned integer, or &#8217;-1&#8217; as a signed, two&#8217;s complement integer. The
839encoder and decoder are responsible for knowing if fields are to be treated as signed or
840unsigned.
841<!--l. 100--><p class="noindent" >
842<h5 class="subsubsectionHead"><span class="titlemark">2.1.6. </span> <a
843 id="x1-430002.1.6"></a>coding example</h5>
844<!--l. 102--><p class="noindent" >Code the 4 bit integer value &#8217;12&#8217; [b1100] into an empty bytestream. Bytestream result:
845<!--l. 105--><p class="noindent" >
846<div class="fancyvrb" id="fancyvrb2"><a
847 id="x1-43002r1"></a><span
848class="cmr-6">1</span><span
849class="cmtt-8">&#x00A0;</span><span
850class="cmtt-8">&#x00A0;</span><span
851class="cmtt-8">&#x00A0;</span><span
852class="cmtt-8">&#x00A0;</span><span
853class="cmtt-8">&#x00A0;</span><span
854class="cmtt-8">&#x00A0;</span><span
855class="cmtt-8">&#x00A0;</span><span
856class="cmtt-8">&#x00A0;</span><span
857class="cmtt-8">&#x00A0;</span><span
858class="cmtt-8">&#x00A0;</span><span
859class="cmtt-8">&#x00A0;</span><span
860class="cmtt-8">&#x00A0;</span><span
861class="cmtt-8">&#x00A0;</span><span
862class="cmtt-8">&#x00A0;|</span><br class="fancyvrb" /><a
863 id="x1-43004r2"></a><span
864class="cmr-6">2</span><span
865class="cmtt-8">&#x00A0;</span><span
866class="cmtt-8">&#x00A0;</span><span
867class="cmtt-8">&#x00A0;</span><span
868class="cmtt-8">&#x00A0;</span><span
869class="cmtt-8">&#x00A0;</span><span
870class="cmtt-8">&#x00A0;</span><span
871class="cmtt-8">&#x00A0;</span><span
872class="cmtt-8">&#x00A0;</span><span
873class="cmtt-8">&#x00A0;</span><span
874class="cmtt-8">&#x00A0;</span><span
875class="cmtt-8">&#x00A0;</span><span
876class="cmtt-8">&#x00A0;</span><span
877class="cmtt-8">&#x00A0;</span><span
878class="cmtt-8">&#x00A0;V</span><br class="fancyvrb" /><a
879 id="x1-43006r3"></a><span
880class="cmr-6">3</span><br class="fancyvrb" /><a
881 id="x1-43008r4"></a><span
882class="cmr-6">4</span><span
883class="cmtt-8">&#x00A0;</span><span
884class="cmtt-8">&#x00A0;</span><span
885class="cmtt-8">&#x00A0;</span><span
886class="cmtt-8">&#x00A0;</span><span
887class="cmtt-8">&#x00A0;</span><span
888class="cmtt-8">&#x00A0;</span><span
889class="cmtt-8">&#x00A0;</span><span
890class="cmtt-8">&#x00A0;7</span><span
891class="cmtt-8">&#x00A0;6</span><span
892class="cmtt-8">&#x00A0;5</span><span
893class="cmtt-8">&#x00A0;4</span><span
894class="cmtt-8">&#x00A0;3</span><span
895class="cmtt-8">&#x00A0;2</span><span
896class="cmtt-8">&#x00A0;1</span><span
897class="cmtt-8">&#x00A0;0</span><br class="fancyvrb" /><a
898 id="x1-43010r5"></a><span
899class="cmr-6">5</span><span
900class="cmtt-8">byte</span><span
901class="cmtt-8">&#x00A0;0</span><span
902class="cmtt-8">&#x00A0;[0</span><span
903class="cmtt-8">&#x00A0;0</span><span
904class="cmtt-8">&#x00A0;0</span><span
905class="cmtt-8">&#x00A0;0</span><span
906class="cmtt-8">&#x00A0;1</span><span
907class="cmtt-8">&#x00A0;1</span><span
908class="cmtt-8">&#x00A0;0</span><span
909class="cmtt-8">&#x00A0;0]</span><span
910class="cmtt-8">&#x00A0;</span><span
911class="cmtt-8">&#x00A0;&#x003C;-</span><br class="fancyvrb" /><a
912 id="x1-43012r6"></a><span
913class="cmr-6">6</span><span
914class="cmtt-8">byte</span><span
915class="cmtt-8">&#x00A0;1</span><span
916class="cmtt-8">&#x00A0;[</span><span
917class="cmtt-8">&#x00A0;</span><span
918class="cmtt-8">&#x00A0;</span><span
919class="cmtt-8">&#x00A0;</span><span
920class="cmtt-8">&#x00A0;</span><span
921class="cmtt-8">&#x00A0;</span><span
922class="cmtt-8">&#x00A0;</span><span
923class="cmtt-8">&#x00A0;</span><span
924class="cmtt-8">&#x00A0;</span><span
925class="cmtt-8">&#x00A0;</span><span
926class="cmtt-8">&#x00A0;</span><span
927class="cmtt-8">&#x00A0;</span><span
928class="cmtt-8">&#x00A0;</span><span
929class="cmtt-8">&#x00A0;</span><span
930class="cmtt-8">&#x00A0;</span><span
931class="cmtt-8">&#x00A0;]</span>
932<br class="fancyvrb" /><a
933 id="x1-43014r7"></a><span
934class="cmr-6">7</span><span
935class="cmtt-8">byte</span><span
936class="cmtt-8">&#x00A0;2</span><span
937class="cmtt-8">&#x00A0;[</span><span
938class="cmtt-8">&#x00A0;</span><span
939class="cmtt-8">&#x00A0;</span><span
940class="cmtt-8">&#x00A0;</span><span
941class="cmtt-8">&#x00A0;</span><span
942class="cmtt-8">&#x00A0;</span><span
943class="cmtt-8">&#x00A0;</span><span
944class="cmtt-8">&#x00A0;</span><span
945class="cmtt-8">&#x00A0;</span><span
946class="cmtt-8">&#x00A0;</span><span
947class="cmtt-8">&#x00A0;</span><span
948class="cmtt-8">&#x00A0;</span><span
949class="cmtt-8">&#x00A0;</span><span
950class="cmtt-8">&#x00A0;</span><span
951class="cmtt-8">&#x00A0;</span><span
952class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
953 id="x1-43016r8"></a><span
954class="cmr-6">8</span><span
955class="cmtt-8">byte</span><span
956class="cmtt-8">&#x00A0;3</span><span
957class="cmtt-8">&#x00A0;[</span><span
958class="cmtt-8">&#x00A0;</span><span
959class="cmtt-8">&#x00A0;</span><span
960class="cmtt-8">&#x00A0;</span><span
961class="cmtt-8">&#x00A0;</span><span
962class="cmtt-8">&#x00A0;</span><span
963class="cmtt-8">&#x00A0;</span><span
964class="cmtt-8">&#x00A0;</span><span
965class="cmtt-8">&#x00A0;</span><span
966class="cmtt-8">&#x00A0;</span><span
967class="cmtt-8">&#x00A0;</span><span
968class="cmtt-8">&#x00A0;</span><span
969class="cmtt-8">&#x00A0;</span><span
970class="cmtt-8">&#x00A0;</span><span
971class="cmtt-8">&#x00A0;</span><span
972class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
973 id="x1-43018r9"></a><span
974class="cmr-6">9</span><span
975class="cmtt-8">&#x00A0;</span><span
976class="cmtt-8">&#x00A0;</span><span
977class="cmtt-8">&#x00A0;</span><span
978class="cmtt-8">&#x00A0;</span><span
979class="cmtt-8">&#x00A0;</span><span
980class="cmtt-8">&#x00A0;</span><span
981class="cmtt-8">&#x00A0;</span><span
982class="cmtt-8">&#x00A0;</span><span
983class="cmtt-8">&#x00A0;</span><span
984class="cmtt-8">&#x00A0;</span><span
985class="cmtt-8">&#x00A0;</span><span
986class="cmtt-8">&#x00A0;</span><span
987class="cmtt-8">&#x00A0;...</span><br class="fancyvrb" /><a
988 id="x1-43020r10"></a><span
989class="cmr-6">10</span><span
990class="cmtt-8">byte</span><span
991class="cmtt-8">&#x00A0;n</span><span
992class="cmtt-8">&#x00A0;[</span><span
993class="cmtt-8">&#x00A0;</span><span
994class="cmtt-8">&#x00A0;</span><span
995class="cmtt-8">&#x00A0;</span><span
996class="cmtt-8">&#x00A0;</span><span
997class="cmtt-8">&#x00A0;</span><span
998class="cmtt-8">&#x00A0;</span><span
999class="cmtt-8">&#x00A0;</span><span
1000class="cmtt-8">&#x00A0;</span><span
1001class="cmtt-8">&#x00A0;</span><span
1002class="cmtt-8">&#x00A0;</span><span
1003class="cmtt-8">&#x00A0;</span><span
1004class="cmtt-8">&#x00A0;</span><span
1005class="cmtt-8">&#x00A0;</span><span
1006class="cmtt-8">&#x00A0;</span><span
1007class="cmtt-8">&#x00A0;]</span><span
1008class="cmtt-8">&#x00A0;</span><span
1009class="cmtt-8">&#x00A0;bytestream</span><span
1010class="cmtt-8">&#x00A0;length</span><span
1011class="cmtt-8">&#x00A0;==</span><span
1012class="cmtt-8">&#x00A0;1</span><span
1013class="cmtt-8">&#x00A0;byte</span><br class="fancyvrb" /><a
1014 id="x1-43022r11"></a><span
1015class="cmr-6">11</span></div>
1016<!--l. 120--><p class="noindent" >Continue by coding the 3 bit integer value &#8217;-1&#8217; [b111]:
1017<!--l. 122--><p class="noindent" >
1018<div class="fancyvrb" id="fancyvrb3"><a
1019 id="x1-43024r1"></a><span
1020class="cmr-6">1</span><span
1021class="cmtt-8">&#x00A0;</span><span
1022class="cmtt-8">&#x00A0;</span><span
1023class="cmtt-8">&#x00A0;</span><span
1024class="cmtt-8">&#x00A0;</span><span
1025class="cmtt-8">&#x00A0;</span><span
1026class="cmtt-8">&#x00A0;</span><span
1027class="cmtt-8">&#x00A0;</span><span
1028class="cmtt-8">&#x00A0;|</span><br class="fancyvrb" /><a
1029 id="x1-43026r2"></a><span
1030class="cmr-6">2</span><span
1031class="cmtt-8">&#x00A0;</span><span
1032class="cmtt-8">&#x00A0;</span><span
1033class="cmtt-8">&#x00A0;</span><span
1034class="cmtt-8">&#x00A0;</span><span
1035class="cmtt-8">&#x00A0;</span><span
1036class="cmtt-8">&#x00A0;</span><span
1037class="cmtt-8">&#x00A0;</span><span
1038class="cmtt-8">&#x00A0;V</span><br class="fancyvrb" /><a
1039 id="x1-43028r3"></a><span
1040class="cmr-6">3</span><br class="fancyvrb" /><a
1041 id="x1-43030r4"></a><span
1042class="cmr-6">4</span><span
1043class="cmtt-8">&#x00A0;</span><span
1044class="cmtt-8">&#x00A0;</span><span
1045class="cmtt-8">&#x00A0;</span><span
1046class="cmtt-8">&#x00A0;</span><span
1047class="cmtt-8">&#x00A0;</span><span
1048class="cmtt-8">&#x00A0;</span><span
1049class="cmtt-8">&#x00A0;</span><span
1050class="cmtt-8">&#x00A0;7</span><span
1051class="cmtt-8">&#x00A0;6</span><span
1052class="cmtt-8">&#x00A0;5</span><span
1053class="cmtt-8">&#x00A0;4</span><span
1054class="cmtt-8">&#x00A0;3</span><span
1055class="cmtt-8">&#x00A0;2</span><span
1056class="cmtt-8">&#x00A0;1</span><span
1057class="cmtt-8">&#x00A0;0</span><br class="fancyvrb" /><a
1058 id="x1-43032r5"></a><span
1059class="cmr-6">5</span><span
1060class="cmtt-8">byte</span><span
1061class="cmtt-8">&#x00A0;0</span><span
1062class="cmtt-8">&#x00A0;[0</span><span
1063class="cmtt-8">&#x00A0;1</span><span
1064class="cmtt-8">&#x00A0;1</span><span
1065class="cmtt-8">&#x00A0;1</span><span
1066class="cmtt-8">&#x00A0;1</span><span
1067class="cmtt-8">&#x00A0;1</span><span
1068class="cmtt-8">&#x00A0;0</span><span
1069class="cmtt-8">&#x00A0;0]</span><span
1070class="cmtt-8">&#x00A0;</span><span
1071class="cmtt-8">&#x00A0;&#x003C;-</span><br class="fancyvrb" /><a
1072 id="x1-43034r6"></a><span
1073class="cmr-6">6</span><span
1074class="cmtt-8">byte</span><span
1075class="cmtt-8">&#x00A0;1</span><span
1076class="cmtt-8">&#x00A0;[</span><span
1077class="cmtt-8">&#x00A0;</span><span
1078class="cmtt-8">&#x00A0;</span><span
1079class="cmtt-8">&#x00A0;</span><span
1080class="cmtt-8">&#x00A0;</span><span
1081class="cmtt-8">&#x00A0;</span><span
1082class="cmtt-8">&#x00A0;</span><span
1083class="cmtt-8">&#x00A0;</span><span
1084class="cmtt-8">&#x00A0;</span><span
1085class="cmtt-8">&#x00A0;</span><span
1086class="cmtt-8">&#x00A0;</span><span
1087class="cmtt-8">&#x00A0;</span><span
1088class="cmtt-8">&#x00A0;</span><span
1089class="cmtt-8">&#x00A0;</span><span
1090class="cmtt-8">&#x00A0;</span><span
1091class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
1092 id="x1-43036r7"></a><span
1093class="cmr-6">7</span><span
1094class="cmtt-8">byte</span><span
1095class="cmtt-8">&#x00A0;2</span><span
1096class="cmtt-8">&#x00A0;[</span><span
1097class="cmtt-8">&#x00A0;</span><span
1098class="cmtt-8">&#x00A0;</span><span
1099class="cmtt-8">&#x00A0;</span><span
1100class="cmtt-8">&#x00A0;</span><span
1101class="cmtt-8">&#x00A0;</span><span
1102class="cmtt-8">&#x00A0;</span><span
1103class="cmtt-8">&#x00A0;</span><span
1104class="cmtt-8">&#x00A0;</span><span
1105class="cmtt-8">&#x00A0;</span><span
1106class="cmtt-8">&#x00A0;</span><span
1107class="cmtt-8">&#x00A0;</span><span
1108class="cmtt-8">&#x00A0;</span><span
1109class="cmtt-8">&#x00A0;</span><span
1110class="cmtt-8">&#x00A0;</span><span
1111class="cmtt-8">&#x00A0;]</span>
1112<br class="fancyvrb" /><a
1113 id="x1-43038r8"></a><span
1114class="cmr-6">8</span><span
1115class="cmtt-8">byte</span><span
1116class="cmtt-8">&#x00A0;3</span><span
1117class="cmtt-8">&#x00A0;[</span><span
1118class="cmtt-8">&#x00A0;</span><span
1119class="cmtt-8">&#x00A0;</span><span
1120class="cmtt-8">&#x00A0;</span><span
1121class="cmtt-8">&#x00A0;</span><span
1122class="cmtt-8">&#x00A0;</span><span
1123class="cmtt-8">&#x00A0;</span><span
1124class="cmtt-8">&#x00A0;</span><span
1125class="cmtt-8">&#x00A0;</span><span
1126class="cmtt-8">&#x00A0;</span><span
1127class="cmtt-8">&#x00A0;</span><span
1128class="cmtt-8">&#x00A0;</span><span
1129class="cmtt-8">&#x00A0;</span><span
1130class="cmtt-8">&#x00A0;</span><span
1131class="cmtt-8">&#x00A0;</span><span
1132class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
1133 id="x1-43040r9"></a><span
1134class="cmr-6">9</span><span
1135class="cmtt-8">&#x00A0;</span><span
1136class="cmtt-8">&#x00A0;</span><span
1137class="cmtt-8">&#x00A0;</span><span
1138class="cmtt-8">&#x00A0;</span><span
1139class="cmtt-8">&#x00A0;</span><span
1140class="cmtt-8">&#x00A0;</span><span
1141class="cmtt-8">&#x00A0;</span><span
1142class="cmtt-8">&#x00A0;</span><span
1143class="cmtt-8">&#x00A0;</span><span
1144class="cmtt-8">&#x00A0;</span><span
1145class="cmtt-8">&#x00A0;</span><span
1146class="cmtt-8">&#x00A0;</span><span
1147class="cmtt-8">&#x00A0;...</span><br class="fancyvrb" /><a
1148 id="x1-43042r10"></a><span
1149class="cmr-6">10</span><span
1150class="cmtt-8">byte</span><span
1151class="cmtt-8">&#x00A0;n</span><span
1152class="cmtt-8">&#x00A0;[</span><span
1153class="cmtt-8">&#x00A0;</span><span
1154class="cmtt-8">&#x00A0;</span><span
1155class="cmtt-8">&#x00A0;</span><span
1156class="cmtt-8">&#x00A0;</span><span
1157class="cmtt-8">&#x00A0;</span><span
1158class="cmtt-8">&#x00A0;</span><span
1159class="cmtt-8">&#x00A0;</span><span
1160class="cmtt-8">&#x00A0;</span><span
1161class="cmtt-8">&#x00A0;</span><span
1162class="cmtt-8">&#x00A0;</span><span
1163class="cmtt-8">&#x00A0;</span><span
1164class="cmtt-8">&#x00A0;</span><span
1165class="cmtt-8">&#x00A0;</span><span
1166class="cmtt-8">&#x00A0;</span><span
1167class="cmtt-8">&#x00A0;]</span><span
1168class="cmtt-8">&#x00A0;</span><span
1169class="cmtt-8">&#x00A0;bytestream</span><span
1170class="cmtt-8">&#x00A0;length</span><span
1171class="cmtt-8">&#x00A0;==</span><span
1172class="cmtt-8">&#x00A0;1</span><span
1173class="cmtt-8">&#x00A0;byte</span></div>
1174<!--l. 136--><p class="noindent" >Continue by coding the 7 bit integer value &#8217;17&#8217; [b0010001]:
1175<!--l. 138--><p class="noindent" >
1176<div class="fancyvrb" id="fancyvrb4"><a
1177 id="x1-43044r1"></a><span
1178class="cmr-6">1</span><span
1179class="cmtt-8">&#x00A0;</span><span
1180class="cmtt-8">&#x00A0;</span><span
1181class="cmtt-8">&#x00A0;</span><span
1182class="cmtt-8">&#x00A0;</span><span
1183class="cmtt-8">&#x00A0;</span><span
1184class="cmtt-8">&#x00A0;</span><span
1185class="cmtt-8">&#x00A0;</span><span
1186class="cmtt-8">&#x00A0;</span><span
1187class="cmtt-8">&#x00A0;</span><span
1188class="cmtt-8">&#x00A0;|</span><br class="fancyvrb" /><a
1189 id="x1-43046r2"></a><span
1190class="cmr-6">2</span><span
1191class="cmtt-8">&#x00A0;</span><span
1192class="cmtt-8">&#x00A0;</span><span
1193class="cmtt-8">&#x00A0;</span><span
1194class="cmtt-8">&#x00A0;</span><span
1195class="cmtt-8">&#x00A0;</span><span
1196class="cmtt-8">&#x00A0;</span><span
1197class="cmtt-8">&#x00A0;</span><span
1198class="cmtt-8">&#x00A0;</span><span
1199class="cmtt-8">&#x00A0;</span><span
1200class="cmtt-8">&#x00A0;V</span><br class="fancyvrb" /><a
1201 id="x1-43048r3"></a><span
1202class="cmr-6">3</span><br class="fancyvrb" /><a
1203 id="x1-43050r4"></a><span
1204class="cmr-6">4</span><span
1205class="cmtt-8">&#x00A0;</span><span
1206class="cmtt-8">&#x00A0;</span><span
1207class="cmtt-8">&#x00A0;</span><span
1208class="cmtt-8">&#x00A0;</span><span
1209class="cmtt-8">&#x00A0;</span><span
1210class="cmtt-8">&#x00A0;</span><span
1211class="cmtt-8">&#x00A0;</span><span
1212class="cmtt-8">&#x00A0;7</span><span
1213class="cmtt-8">&#x00A0;6</span><span
1214class="cmtt-8">&#x00A0;5</span><span
1215class="cmtt-8">&#x00A0;4</span><span
1216class="cmtt-8">&#x00A0;3</span><span
1217class="cmtt-8">&#x00A0;2</span><span
1218class="cmtt-8">&#x00A0;1</span><span
1219class="cmtt-8">&#x00A0;0</span><br class="fancyvrb" /><a
1220 id="x1-43052r5"></a><span
1221class="cmr-6">5</span><span
1222class="cmtt-8">byte</span><span
1223class="cmtt-8">&#x00A0;0</span><span
1224class="cmtt-8">&#x00A0;[1</span><span
1225class="cmtt-8">&#x00A0;1</span><span
1226class="cmtt-8">&#x00A0;1</span><span
1227class="cmtt-8">&#x00A0;1</span><span
1228class="cmtt-8">&#x00A0;1</span><span
1229class="cmtt-8">&#x00A0;1</span><span
1230class="cmtt-8">&#x00A0;0</span><span
1231class="cmtt-8">&#x00A0;0]</span><br class="fancyvrb" /><a
1232 id="x1-43054r6"></a><span
1233class="cmr-6">6</span><span
1234class="cmtt-8">byte</span><span
1235class="cmtt-8">&#x00A0;1</span><span
1236class="cmtt-8">&#x00A0;[0</span><span
1237class="cmtt-8">&#x00A0;0</span><span
1238class="cmtt-8">&#x00A0;0</span><span
1239class="cmtt-8">&#x00A0;0</span><span
1240class="cmtt-8">&#x00A0;1</span><span
1241class="cmtt-8">&#x00A0;0</span><span
1242class="cmtt-8">&#x00A0;0</span><span
1243class="cmtt-8">&#x00A0;0]</span><span
1244class="cmtt-8">&#x00A0;</span><span
1245class="cmtt-8">&#x00A0;&#x003C;-</span><br class="fancyvrb" /><a
1246 id="x1-43056r7"></a><span
1247class="cmr-6">7</span><span
1248class="cmtt-8">byte</span><span
1249class="cmtt-8">&#x00A0;2</span><span
1250class="cmtt-8">&#x00A0;[</span><span
1251class="cmtt-8">&#x00A0;</span><span
1252class="cmtt-8">&#x00A0;</span><span
1253class="cmtt-8">&#x00A0;</span><span
1254class="cmtt-8">&#x00A0;</span><span
1255class="cmtt-8">&#x00A0;</span><span
1256class="cmtt-8">&#x00A0;</span><span
1257class="cmtt-8">&#x00A0;</span><span
1258class="cmtt-8">&#x00A0;</span><span
1259class="cmtt-8">&#x00A0;</span><span
1260class="cmtt-8">&#x00A0;</span><span
1261class="cmtt-8">&#x00A0;</span><span
1262class="cmtt-8">&#x00A0;</span><span
1263class="cmtt-8">&#x00A0;</span><span
1264class="cmtt-8">&#x00A0;</span><span
1265class="cmtt-8">&#x00A0;]</span>
1266<br class="fancyvrb" /><a
1267 id="x1-43058r8"></a><span
1268class="cmr-6">8</span><span
1269class="cmtt-8">byte</span><span
1270class="cmtt-8">&#x00A0;3</span><span
1271class="cmtt-8">&#x00A0;[</span><span
1272class="cmtt-8">&#x00A0;</span><span
1273class="cmtt-8">&#x00A0;</span><span
1274class="cmtt-8">&#x00A0;</span><span
1275class="cmtt-8">&#x00A0;</span><span
1276class="cmtt-8">&#x00A0;</span><span
1277class="cmtt-8">&#x00A0;</span><span
1278class="cmtt-8">&#x00A0;</span><span
1279class="cmtt-8">&#x00A0;</span><span
1280class="cmtt-8">&#x00A0;</span><span
1281class="cmtt-8">&#x00A0;</span><span
1282class="cmtt-8">&#x00A0;</span><span
1283class="cmtt-8">&#x00A0;</span><span
1284class="cmtt-8">&#x00A0;</span><span
1285class="cmtt-8">&#x00A0;</span><span
1286class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
1287 id="x1-43060r9"></a><span
1288class="cmr-6">9</span><span
1289class="cmtt-8">&#x00A0;</span><span
1290class="cmtt-8">&#x00A0;</span><span
1291class="cmtt-8">&#x00A0;</span><span
1292class="cmtt-8">&#x00A0;</span><span
1293class="cmtt-8">&#x00A0;</span><span
1294class="cmtt-8">&#x00A0;</span><span
1295class="cmtt-8">&#x00A0;</span><span
1296class="cmtt-8">&#x00A0;</span><span
1297class="cmtt-8">&#x00A0;</span><span
1298class="cmtt-8">&#x00A0;</span><span
1299class="cmtt-8">&#x00A0;</span><span
1300class="cmtt-8">&#x00A0;</span><span
1301class="cmtt-8">&#x00A0;...</span><br class="fancyvrb" /><a
1302 id="x1-43062r10"></a><span
1303class="cmr-6">10</span><span
1304class="cmtt-8">byte</span><span
1305class="cmtt-8">&#x00A0;n</span><span
1306class="cmtt-8">&#x00A0;[</span><span
1307class="cmtt-8">&#x00A0;</span><span
1308class="cmtt-8">&#x00A0;</span><span
1309class="cmtt-8">&#x00A0;</span><span
1310class="cmtt-8">&#x00A0;</span><span
1311class="cmtt-8">&#x00A0;</span><span
1312class="cmtt-8">&#x00A0;</span><span
1313class="cmtt-8">&#x00A0;</span><span
1314class="cmtt-8">&#x00A0;</span><span
1315class="cmtt-8">&#x00A0;</span><span
1316class="cmtt-8">&#x00A0;</span><span
1317class="cmtt-8">&#x00A0;</span><span
1318class="cmtt-8">&#x00A0;</span><span
1319class="cmtt-8">&#x00A0;</span><span
1320class="cmtt-8">&#x00A0;</span><span
1321class="cmtt-8">&#x00A0;]</span><span
1322class="cmtt-8">&#x00A0;</span><span
1323class="cmtt-8">&#x00A0;bytestream</span><span
1324class="cmtt-8">&#x00A0;length</span><span
1325class="cmtt-8">&#x00A0;==</span><span
1326class="cmtt-8">&#x00A0;2</span><span
1327class="cmtt-8">&#x00A0;bytes</span><br class="fancyvrb" /><a
1328 id="x1-43064r11"></a><span
1329class="cmr-6">11</span><span
1330class="cmtt-8">&#x00A0;</span><span
1331class="cmtt-8">&#x00A0;</span><span
1332class="cmtt-8">&#x00A0;</span><span
1333class="cmtt-8">&#x00A0;</span><span
1334class="cmtt-8">&#x00A0;</span><span
1335class="cmtt-8">&#x00A0;</span><span
1336class="cmtt-8">&#x00A0;</span><span
1337class="cmtt-8">&#x00A0;</span><span
1338class="cmtt-8">&#x00A0;</span><span
1339class="cmtt-8">&#x00A0;</span><span
1340class="cmtt-8">&#x00A0;</span><span
1341class="cmtt-8">&#x00A0;</span><span
1342class="cmtt-8">&#x00A0;</span><span
1343class="cmtt-8">&#x00A0;</span><span
1344class="cmtt-8">&#x00A0;</span><span
1345class="cmtt-8">&#x00A0;</span><span
1346class="cmtt-8">&#x00A0;</span><span
1347class="cmtt-8">&#x00A0;</span><span
1348class="cmtt-8">&#x00A0;</span><span
1349class="cmtt-8">&#x00A0;</span><span
1350class="cmtt-8">&#x00A0;</span><span
1351class="cmtt-8">&#x00A0;</span><span
1352class="cmtt-8">&#x00A0;</span><span
1353class="cmtt-8">&#x00A0;</span><span
1354class="cmtt-8">&#x00A0;</span><span
1355class="cmtt-8">&#x00A0;bit</span><span
1356class="cmtt-8">&#x00A0;cursor</span><span
1357class="cmtt-8">&#x00A0;==</span><span
1358class="cmtt-8">&#x00A0;6</span></div>
1359<!--l. 153--><p class="noindent" >Continue by coding the 13 bit integer value &#8217;6969&#8217; [b110 11001110 01]:
1360<!--l. 155--><p class="noindent" >
1361<div class="fancyvrb" id="fancyvrb5"><a
1362 id="x1-43066r1"></a><span
1363class="cmr-6">1</span><span
1364class="cmtt-8">&#x00A0;</span><span
1365class="cmtt-8">&#x00A0;</span><span
1366class="cmtt-8">&#x00A0;</span><span
1367class="cmtt-8">&#x00A0;</span><span
1368class="cmtt-8">&#x00A0;</span><span
1369class="cmtt-8">&#x00A0;</span><span
1370class="cmtt-8">&#x00A0;</span><span
1371class="cmtt-8">&#x00A0;</span><span
1372class="cmtt-8">&#x00A0;</span><span
1373class="cmtt-8">&#x00A0;</span><span
1374class="cmtt-8">&#x00A0;</span><span
1375class="cmtt-8">&#x00A0;</span><span
1376class="cmtt-8">&#x00A0;</span><span
1377class="cmtt-8">&#x00A0;</span><span
1378class="cmtt-8">&#x00A0;</span><span
1379class="cmtt-8">&#x00A0;|</span><br class="fancyvrb" /><a
1380 id="x1-43068r2"></a><span
1381class="cmr-6">2</span><span
1382class="cmtt-8">&#x00A0;</span><span
1383class="cmtt-8">&#x00A0;</span><span
1384class="cmtt-8">&#x00A0;</span><span
1385class="cmtt-8">&#x00A0;</span><span
1386class="cmtt-8">&#x00A0;</span><span
1387class="cmtt-8">&#x00A0;</span><span
1388class="cmtt-8">&#x00A0;</span><span
1389class="cmtt-8">&#x00A0;</span><span
1390class="cmtt-8">&#x00A0;</span><span
1391class="cmtt-8">&#x00A0;</span><span
1392class="cmtt-8">&#x00A0;</span><span
1393class="cmtt-8">&#x00A0;</span><span
1394class="cmtt-8">&#x00A0;</span><span
1395class="cmtt-8">&#x00A0;</span><span
1396class="cmtt-8">&#x00A0;</span><span
1397class="cmtt-8">&#x00A0;V</span><br class="fancyvrb" /><a
1398 id="x1-43070r3"></a><span
1399class="cmr-6">3</span><br class="fancyvrb" /><a
1400 id="x1-43072r4"></a><span
1401class="cmr-6">4</span><span
1402class="cmtt-8">&#x00A0;</span><span
1403class="cmtt-8">&#x00A0;</span><span
1404class="cmtt-8">&#x00A0;</span><span
1405class="cmtt-8">&#x00A0;</span><span
1406class="cmtt-8">&#x00A0;</span><span
1407class="cmtt-8">&#x00A0;</span><span
1408class="cmtt-8">&#x00A0;</span><span
1409class="cmtt-8">&#x00A0;7</span><span
1410class="cmtt-8">&#x00A0;6</span><span
1411class="cmtt-8">&#x00A0;5</span><span
1412class="cmtt-8">&#x00A0;4</span><span
1413class="cmtt-8">&#x00A0;3</span><span
1414class="cmtt-8">&#x00A0;2</span><span
1415class="cmtt-8">&#x00A0;1</span><span
1416class="cmtt-8">&#x00A0;0</span><br class="fancyvrb" /><a
1417 id="x1-43074r5"></a><span
1418class="cmr-6">5</span><span
1419class="cmtt-8">byte</span><span
1420class="cmtt-8">&#x00A0;0</span><span
1421class="cmtt-8">&#x00A0;[1</span><span
1422class="cmtt-8">&#x00A0;1</span><span
1423class="cmtt-8">&#x00A0;1</span><span
1424class="cmtt-8">&#x00A0;1</span><span
1425class="cmtt-8">&#x00A0;1</span><span
1426class="cmtt-8">&#x00A0;1</span><span
1427class="cmtt-8">&#x00A0;0</span><span
1428class="cmtt-8">&#x00A0;0]</span><br class="fancyvrb" /><a
1429 id="x1-43076r6"></a><span
1430class="cmr-6">6</span><span
1431class="cmtt-8">byte</span><span
1432class="cmtt-8">&#x00A0;1</span><span
1433class="cmtt-8">&#x00A0;[0</span><span
1434class="cmtt-8">&#x00A0;1</span><span
1435class="cmtt-8">&#x00A0;0</span><span
1436class="cmtt-8">&#x00A0;0</span><span
1437class="cmtt-8">&#x00A0;1</span><span
1438class="cmtt-8">&#x00A0;0</span><span
1439class="cmtt-8">&#x00A0;0</span><span
1440class="cmtt-8">&#x00A0;0]</span>
1441<br class="fancyvrb" /><a
1442 id="x1-43078r7"></a><span
1443class="cmr-6">7</span><span
1444class="cmtt-8">byte</span><span
1445class="cmtt-8">&#x00A0;2</span><span
1446class="cmtt-8">&#x00A0;[1</span><span
1447class="cmtt-8">&#x00A0;1</span><span
1448class="cmtt-8">&#x00A0;0</span><span
1449class="cmtt-8">&#x00A0;0</span><span
1450class="cmtt-8">&#x00A0;1</span><span
1451class="cmtt-8">&#x00A0;1</span><span
1452class="cmtt-8">&#x00A0;1</span><span
1453class="cmtt-8">&#x00A0;0]</span><br class="fancyvrb" /><a
1454 id="x1-43080r8"></a><span
1455class="cmr-6">8</span><span
1456class="cmtt-8">byte</span><span
1457class="cmtt-8">&#x00A0;3</span><span
1458class="cmtt-8">&#x00A0;[0</span><span
1459class="cmtt-8">&#x00A0;0</span><span
1460class="cmtt-8">&#x00A0;0</span><span
1461class="cmtt-8">&#x00A0;0</span><span
1462class="cmtt-8">&#x00A0;0</span><span
1463class="cmtt-8">&#x00A0;1</span><span
1464class="cmtt-8">&#x00A0;1</span><span
1465class="cmtt-8">&#x00A0;0]</span><span
1466class="cmtt-8">&#x00A0;</span><span
1467class="cmtt-8">&#x00A0;&#x003C;-</span><br class="fancyvrb" /><a
1468 id="x1-43082r9"></a><span
1469class="cmr-6">9</span><span
1470class="cmtt-8">&#x00A0;</span><span
1471class="cmtt-8">&#x00A0;</span><span
1472class="cmtt-8">&#x00A0;</span><span
1473class="cmtt-8">&#x00A0;</span><span
1474class="cmtt-8">&#x00A0;</span><span
1475class="cmtt-8">&#x00A0;</span><span
1476class="cmtt-8">&#x00A0;</span><span
1477class="cmtt-8">&#x00A0;</span><span
1478class="cmtt-8">&#x00A0;</span><span
1479class="cmtt-8">&#x00A0;</span><span
1480class="cmtt-8">&#x00A0;</span><span
1481class="cmtt-8">&#x00A0;</span><span
1482class="cmtt-8">&#x00A0;...</span><br class="fancyvrb" /><a
1483 id="x1-43084r10"></a><span
1484class="cmr-6">10</span><span
1485class="cmtt-8">byte</span><span
1486class="cmtt-8">&#x00A0;n</span><span
1487class="cmtt-8">&#x00A0;[</span><span
1488class="cmtt-8">&#x00A0;</span><span
1489class="cmtt-8">&#x00A0;</span><span
1490class="cmtt-8">&#x00A0;</span><span
1491class="cmtt-8">&#x00A0;</span><span
1492class="cmtt-8">&#x00A0;</span><span
1493class="cmtt-8">&#x00A0;</span><span
1494class="cmtt-8">&#x00A0;</span><span
1495class="cmtt-8">&#x00A0;</span><span
1496class="cmtt-8">&#x00A0;</span><span
1497class="cmtt-8">&#x00A0;</span><span
1498class="cmtt-8">&#x00A0;</span><span
1499class="cmtt-8">&#x00A0;</span><span
1500class="cmtt-8">&#x00A0;</span><span
1501class="cmtt-8">&#x00A0;</span><span
1502class="cmtt-8">&#x00A0;]</span><span
1503class="cmtt-8">&#x00A0;</span><span
1504class="cmtt-8">&#x00A0;bytestream</span><span
1505class="cmtt-8">&#x00A0;length</span><span
1506class="cmtt-8">&#x00A0;==</span><span
1507class="cmtt-8">&#x00A0;4</span><span
1508class="cmtt-8">&#x00A0;bytes</span><br class="fancyvrb" /><a
1509 id="x1-43086r11"></a><span
1510class="cmr-6">11</span></div>
1511
1512
1513
1514<!--l. 172--><p class="noindent" >
1515<h5 class="subsubsectionHead"><span class="titlemark">2.1.7. </span> <a
1516 id="x1-440002.1.7"></a>decoding example</h5>
1517<!--l. 174--><p class="noindent" >Reading from the beginning of the bytestream encoded in the above example:
1518<!--l. 176--><p class="noindent" >
1519<div class="fancyvrb" id="fancyvrb6"><a
1520 id="x1-44002r1"></a><span
1521class="cmr-6">1</span><span
1522class="cmtt-8">&#x00A0;</span><span
1523class="cmtt-8">&#x00A0;</span><span
1524class="cmtt-8">&#x00A0;</span><span
1525class="cmtt-8">&#x00A0;</span><span
1526class="cmtt-8">&#x00A0;</span><span
1527class="cmtt-8">&#x00A0;</span><span
1528class="cmtt-8">&#x00A0;</span><span
1529class="cmtt-8">&#x00A0;</span><span
1530class="cmtt-8">&#x00A0;</span><span
1531class="cmtt-8">&#x00A0;</span><span
1532class="cmtt-8">&#x00A0;</span><span
1533class="cmtt-8">&#x00A0;</span><span
1534class="cmtt-8">&#x00A0;</span><span
1535class="cmtt-8">&#x00A0;</span><span
1536class="cmtt-8">&#x00A0;</span><span
1537class="cmtt-8">&#x00A0;</span><span
1538class="cmtt-8">&#x00A0;</span><span
1539class="cmtt-8">&#x00A0;</span><span
1540class="cmtt-8">&#x00A0;</span><span
1541class="cmtt-8">&#x00A0;</span><span
1542class="cmtt-8">&#x00A0;</span><span
1543class="cmtt-8">&#x00A0;|</span><br class="fancyvrb" /><a
1544 id="x1-44004r2"></a><span
1545class="cmr-6">2</span><span
1546class="cmtt-8">&#x00A0;</span><span
1547class="cmtt-8">&#x00A0;</span><span
1548class="cmtt-8">&#x00A0;</span><span
1549class="cmtt-8">&#x00A0;</span><span
1550class="cmtt-8">&#x00A0;</span><span
1551class="cmtt-8">&#x00A0;</span><span
1552class="cmtt-8">&#x00A0;</span><span
1553class="cmtt-8">&#x00A0;</span><span
1554class="cmtt-8">&#x00A0;</span><span
1555class="cmtt-8">&#x00A0;</span><span
1556class="cmtt-8">&#x00A0;</span><span
1557class="cmtt-8">&#x00A0;</span><span
1558class="cmtt-8">&#x00A0;</span><span
1559class="cmtt-8">&#x00A0;</span><span
1560class="cmtt-8">&#x00A0;</span><span
1561class="cmtt-8">&#x00A0;</span><span
1562class="cmtt-8">&#x00A0;</span><span
1563class="cmtt-8">&#x00A0;</span><span
1564class="cmtt-8">&#x00A0;</span><span
1565class="cmtt-8">&#x00A0;</span><span
1566class="cmtt-8">&#x00A0;</span><span
1567class="cmtt-8">&#x00A0;V</span><br class="fancyvrb" /><a
1568 id="x1-44006r3"></a><span
1569class="cmr-6">3</span><br class="fancyvrb" /><a
1570 id="x1-44008r4"></a><span
1571class="cmr-6">4</span><span
1572class="cmtt-8">&#x00A0;</span><span
1573class="cmtt-8">&#x00A0;</span><span
1574class="cmtt-8">&#x00A0;</span><span
1575class="cmtt-8">&#x00A0;</span><span
1576class="cmtt-8">&#x00A0;</span><span
1577class="cmtt-8">&#x00A0;</span><span
1578class="cmtt-8">&#x00A0;</span><span
1579class="cmtt-8">&#x00A0;7</span><span
1580class="cmtt-8">&#x00A0;6</span><span
1581class="cmtt-8">&#x00A0;5</span><span
1582class="cmtt-8">&#x00A0;4</span><span
1583class="cmtt-8">&#x00A0;3</span><span
1584class="cmtt-8">&#x00A0;2</span><span
1585class="cmtt-8">&#x00A0;1</span><span
1586class="cmtt-8">&#x00A0;0</span><br class="fancyvrb" /><a
1587 id="x1-44010r5"></a><span
1588class="cmr-6">5</span><span
1589class="cmtt-8">byte</span><span
1590class="cmtt-8">&#x00A0;0</span><span
1591class="cmtt-8">&#x00A0;[1</span><span
1592class="cmtt-8">&#x00A0;1</span><span
1593class="cmtt-8">&#x00A0;1</span><span
1594class="cmtt-8">&#x00A0;1</span><span
1595class="cmtt-8">&#x00A0;1</span><span
1596class="cmtt-8">&#x00A0;1</span><span
1597class="cmtt-8">&#x00A0;0</span><span
1598class="cmtt-8">&#x00A0;0]</span><span
1599class="cmtt-8">&#x00A0;</span><span
1600class="cmtt-8">&#x00A0;&#x003C;-</span><br class="fancyvrb" /><a
1601 id="x1-44012r6"></a><span
1602class="cmr-6">6</span><span
1603class="cmtt-8">byte</span><span
1604class="cmtt-8">&#x00A0;1</span><span
1605class="cmtt-8">&#x00A0;[0</span><span
1606class="cmtt-8">&#x00A0;1</span><span
1607class="cmtt-8">&#x00A0;0</span><span
1608class="cmtt-8">&#x00A0;0</span><span
1609class="cmtt-8">&#x00A0;1</span><span
1610class="cmtt-8">&#x00A0;0</span><span
1611class="cmtt-8">&#x00A0;0</span><span
1612class="cmtt-8">&#x00A0;0]</span>
1613<br class="fancyvrb" /><a
1614 id="x1-44014r7"></a><span
1615class="cmr-6">7</span><span
1616class="cmtt-8">byte</span><span
1617class="cmtt-8">&#x00A0;2</span><span
1618class="cmtt-8">&#x00A0;[1</span><span
1619class="cmtt-8">&#x00A0;1</span><span
1620class="cmtt-8">&#x00A0;0</span><span
1621class="cmtt-8">&#x00A0;0</span><span
1622class="cmtt-8">&#x00A0;1</span><span
1623class="cmtt-8">&#x00A0;1</span><span
1624class="cmtt-8">&#x00A0;1</span><span
1625class="cmtt-8">&#x00A0;0]</span><br class="fancyvrb" /><a
1626 id="x1-44016r8"></a><span
1627class="cmr-6">8</span><span
1628class="cmtt-8">byte</span><span
1629class="cmtt-8">&#x00A0;3</span><span
1630class="cmtt-8">&#x00A0;[0</span><span
1631class="cmtt-8">&#x00A0;0</span><span
1632class="cmtt-8">&#x00A0;0</span><span
1633class="cmtt-8">&#x00A0;0</span><span
1634class="cmtt-8">&#x00A0;0</span><span
1635class="cmtt-8">&#x00A0;1</span><span
1636class="cmtt-8">&#x00A0;1</span><span
1637class="cmtt-8">&#x00A0;0]</span><span
1638class="cmtt-8">&#x00A0;</span><span
1639class="cmtt-8">&#x00A0;bytestream</span><span
1640class="cmtt-8">&#x00A0;length</span><span
1641class="cmtt-8">&#x00A0;==</span><span
1642class="cmtt-8">&#x00A0;4</span><span
1643class="cmtt-8">&#x00A0;bytes</span><br class="fancyvrb" /><a
1644 id="x1-44018r9"></a><span
1645class="cmr-6">9</span></div>
1646<!--l. 189--><p class="noindent" >We read two, two-bit integer fields, resulting in the returned numbers &#8217;b00&#8217; and &#8217;b11&#8217;. Two things
1647are worth noting here:
1648 <ul class="itemize1">
1649 <li class="itemize">Although these four bits were originally written as a single four-bit integer, reading
1650 some other combination of bit-widths from the bitstream is well defined. There are
1651 no artificial alignment boundaries maintained in the bitstream.
1652 </li>
1653 <li class="itemize">The second value is the two-bit-wide integer &#8217;b11&#8217;. This value may be interpreted
1654 either as the unsigned value &#8217;3&#8217;, or the signed value &#8217;-1&#8217;. Signedness is dependent on
1655 decode context.</li></ul>
1656<!--l. 207--><p class="noindent" >
1657<h5 class="subsubsectionHead"><span class="titlemark">2.1.8. </span> <a
1658 id="x1-450002.1.8"></a>end-of-packet alignment</h5>
1659<!--l. 209--><p class="noindent" >The typical use of bitpacking is to produce many independent byte-aligned packets which are
1660embedded into a larger byte-aligned container structure, such as an Ogg transport bitstream.
1661Externally, each bytestream (encoded bitstream) must begin and end on a byte boundary. Often,
1662the encoded bitstream is not an integer number of bytes, and so there is unused (uncoded) space
1663in the last byte of a packet.
1664<!--l. 217--><p class="noindent" >Unused space in the last byte of a bytestream is always zeroed during the coding process. Thus,
1665should this unused space be read, it will return binary zeroes.
1666<!--l. 221--><p class="noindent" >Attempting to read past the end of an encoded packet results in an &#8217;end-of-packet&#8217; condition.
1667End-of-packet is not to be considered an error; it is merely a state indicating that there is
1668insufficient remaining data to fulfill the desired read size. Vorbis uses truncated packets as a
1669
1670
1671
1672normal mode of operation, and as such, decoders must handle reading past the end of a packet as
1673a typical mode of operation. Any further read operations after an &#8217;end-of-packet&#8217; condition shall
1674also return &#8217;end-of-packet&#8217;.
1675<!--l. 232--><p class="noindent" >
1676<h5 class="subsubsectionHead"><span class="titlemark">2.1.9. </span> <a
1677 id="x1-460002.1.9"></a>reading zero bits</h5>
1678<!--l. 234--><p class="noindent" >Reading a zero-bit-wide integer returns the value &#8217;0&#8217; and does not increment the stream cursor.
1679Reading to the end of the packet (but not past, such that an &#8217;end-of-packet&#8217; condition has not
1680triggered) and then reading a zero bit integer shall succeed, returning 0, and not trigger an
1681end-of-packet condition. Reading a zero-bit-wide integer after a previous read sets &#8217;end-of-packet&#8217;
1682shall also fail with &#8217;end-of-packet&#8217;.
1683
1684
1685
1686
1687
1688
1689<h3 class="sectionHead"><span class="titlemark">3. </span> <a
1690 id="x1-470003"></a>Probability Model and Codebooks</h3>
1691<!--l. 5--><p class="noindent" >
1692<h4 class="subsectionHead"><span class="titlemark">3.1. </span> <a
1693 id="x1-480003.1"></a>Overview</h4>
1694<!--l. 7--><p class="noindent" >Unlike practically every other mainstream audio codec, Vorbis has no statically configured
1695probability model, instead packing all entropy decoding configuration, VQ and Huffman, into the
1696bitstream itself in the third header, the codec setup header. This packed configuration consists of
1697multiple &#8217;codebooks&#8217;, each containing a specific Huffman-equivalent representation for decoding
1698compressed codewords as well as an optional lookup table of output vector values to which a
1699decoded Huffman value is applied as an offset, generating the final decoded output corresponding
1700to a given compressed codeword.
1701<!--l. 17--><p class="noindent" >
1702<h5 class="subsubsectionHead"><span class="titlemark">3.1.1. </span> <a
1703 id="x1-490003.1.1"></a>Bitwise operation</h5>
1704<!--l. 18--><p class="noindent" >The codebook mechanism is built on top of the vorbis bitpacker. Both the codebooks themselves
1705and the codewords they decode are unrolled from a packet as a series of arbitrary-width values
1706read from the stream according to <a
1707href="#x1-360002">section&#x00A0;2</a>, &#8220;<a
1708href="#x1-360002">Bitpacking Convention<!--tex4ht:ref: vorbis:spec:bitpacking --></a>&#8221;.
1709<!--l. 26--><p class="noindent" >
1710<h4 class="subsectionHead"><span class="titlemark">3.2. </span> <a
1711 id="x1-500003.2"></a>Packed codebook format</h4>
1712<!--l. 28--><p class="noindent" >For purposes of the examples below, we assume that the storage system&#8217;s native byte width is
1713eight bits. This is not universally true; see <a
1714href="#x1-360002">section&#x00A0;2</a>, &#8220;<a
1715href="#x1-360002">Bitpacking Convention<!--tex4ht:ref: vorbis:spec:bitpacking --></a>&#8221; for discussion
1716relating to non-eight-bit bytes.
1717
1718
1719
1720<!--l. 33--><p class="noindent" >
1721<h5 class="subsubsectionHead"><span class="titlemark">3.2.1. </span> <a
1722 id="x1-510003.2.1"></a>codebook decode</h5>
1723<!--l. 35--><p class="noindent" >A codebook begins with a 24 bit sync pattern, 0x564342:
1724<!--l. 37--><p class="noindent" >
1725<div class="fancyvrb" id="fancyvrb7"><a
1726 id="x1-51002r1"></a><span
1727class="cmr-6">1</span><span
1728class="cmtt-8">byte</span><span
1729class="cmtt-8">&#x00A0;0:</span><span
1730class="cmtt-8">&#x00A0;[</span><span
1731class="cmtt-8">&#x00A0;0</span><span
1732class="cmtt-8">&#x00A0;1</span><span
1733class="cmtt-8">&#x00A0;0</span><span
1734class="cmtt-8">&#x00A0;0</span><span
1735class="cmtt-8">&#x00A0;0</span><span
1736class="cmtt-8">&#x00A0;0</span><span
1737class="cmtt-8">&#x00A0;1</span><span
1738class="cmtt-8">&#x00A0;0</span><span
1739class="cmtt-8">&#x00A0;]</span><span
1740class="cmtt-8">&#x00A0;(0x42)</span><br class="fancyvrb" /><a
1741 id="x1-51004r2"></a><span
1742class="cmr-6">2</span><span
1743class="cmtt-8">byte</span><span
1744class="cmtt-8">&#x00A0;1:</span><span
1745class="cmtt-8">&#x00A0;[</span><span
1746class="cmtt-8">&#x00A0;0</span><span
1747class="cmtt-8">&#x00A0;1</span><span
1748class="cmtt-8">&#x00A0;0</span><span
1749class="cmtt-8">&#x00A0;0</span><span
1750class="cmtt-8">&#x00A0;0</span><span
1751class="cmtt-8">&#x00A0;0</span><span
1752class="cmtt-8">&#x00A0;1</span><span
1753class="cmtt-8">&#x00A0;1</span><span
1754class="cmtt-8">&#x00A0;]</span><span
1755class="cmtt-8">&#x00A0;(0x43)</span><br class="fancyvrb" /><a
1756 id="x1-51006r3"></a><span
1757class="cmr-6">3</span><span
1758class="cmtt-8">byte</span><span
1759class="cmtt-8">&#x00A0;2:</span><span
1760class="cmtt-8">&#x00A0;[</span><span
1761class="cmtt-8">&#x00A0;0</span><span
1762class="cmtt-8">&#x00A0;1</span><span
1763class="cmtt-8">&#x00A0;0</span><span
1764class="cmtt-8">&#x00A0;1</span><span
1765class="cmtt-8">&#x00A0;0</span><span
1766class="cmtt-8">&#x00A0;1</span><span
1767class="cmtt-8">&#x00A0;1</span><span
1768class="cmtt-8">&#x00A0;0</span><span
1769class="cmtt-8">&#x00A0;]</span><span
1770class="cmtt-8">&#x00A0;(0x56)</span></div>
1771<!--l. 43--><p class="noindent" >16 bit <span
1772class="cmtt-12">[codebook</span><span
1773class="cmtt-12">_dimensions] </span>and 24 bit <span
1774class="cmtt-12">[codebook</span><span
1775class="cmtt-12">_entries] </span>fields:
1776<!--l. 45--><p class="noindent" >
1777<div class="fancyvrb" id="fancyvrb8"><a
1778 id="x1-51008r1"></a><span
1779class="cmr-6">1</span><br class="fancyvrb" /><a
1780 id="x1-51010r2"></a><span
1781class="cmr-6">2</span><span
1782class="cmtt-8">byte</span><span
1783class="cmtt-8">&#x00A0;3:</span><span
1784class="cmtt-8">&#x00A0;[</span><span
1785class="cmtt-8">&#x00A0;X</span><span
1786class="cmtt-8">&#x00A0;X</span><span
1787class="cmtt-8">&#x00A0;X</span><span
1788class="cmtt-8">&#x00A0;X</span><span
1789class="cmtt-8">&#x00A0;X</span><span
1790class="cmtt-8">&#x00A0;X</span><span
1791class="cmtt-8">&#x00A0;X</span><span
1792class="cmtt-8">&#x00A0;X</span><span
1793class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
1794 id="x1-51012r3"></a><span
1795class="cmr-6">3</span><span
1796class="cmtt-8">byte</span><span
1797class="cmtt-8">&#x00A0;4:</span><span
1798class="cmtt-8">&#x00A0;[</span><span
1799class="cmtt-8">&#x00A0;X</span><span
1800class="cmtt-8">&#x00A0;X</span><span
1801class="cmtt-8">&#x00A0;X</span><span
1802class="cmtt-8">&#x00A0;X</span><span
1803class="cmtt-8">&#x00A0;X</span><span
1804class="cmtt-8">&#x00A0;X</span><span
1805class="cmtt-8">&#x00A0;X</span><span
1806class="cmtt-8">&#x00A0;X</span><span
1807class="cmtt-8">&#x00A0;]</span><span
1808class="cmtt-8">&#x00A0;[codebook</span><span
1809class="cmtt-8">_dimensions]</span><span
1810class="cmtt-8">&#x00A0;(16</span><span
1811class="cmtt-8">&#x00A0;bit</span><span
1812class="cmtt-8">&#x00A0;unsigned)</span><br class="fancyvrb" /><a
1813 id="x1-51014r4"></a><span
1814class="cmr-6">4</span><br class="fancyvrb" /><a
1815 id="x1-51016r5"></a><span
1816class="cmr-6">5</span><span
1817class="cmtt-8">byte</span><span
1818class="cmtt-8">&#x00A0;5:</span><span
1819class="cmtt-8">&#x00A0;[</span><span
1820class="cmtt-8">&#x00A0;X</span><span
1821class="cmtt-8">&#x00A0;X</span><span
1822class="cmtt-8">&#x00A0;X</span><span
1823class="cmtt-8">&#x00A0;X</span><span
1824class="cmtt-8">&#x00A0;X</span><span
1825class="cmtt-8">&#x00A0;X</span><span
1826class="cmtt-8">&#x00A0;X</span><span
1827class="cmtt-8">&#x00A0;X</span><span
1828class="cmtt-8">&#x00A0;]</span>
1829<br class="fancyvrb" /><a
1830 id="x1-51018r6"></a><span
1831class="cmr-6">6</span><span
1832class="cmtt-8">byte</span><span
1833class="cmtt-8">&#x00A0;6:</span><span
1834class="cmtt-8">&#x00A0;[</span><span
1835class="cmtt-8">&#x00A0;X</span><span
1836class="cmtt-8">&#x00A0;X</span><span
1837class="cmtt-8">&#x00A0;X</span><span
1838class="cmtt-8">&#x00A0;X</span><span
1839class="cmtt-8">&#x00A0;X</span><span
1840class="cmtt-8">&#x00A0;X</span><span
1841class="cmtt-8">&#x00A0;X</span><span
1842class="cmtt-8">&#x00A0;X</span><span
1843class="cmtt-8">&#x00A0;]</span><br class="fancyvrb" /><a
1844 id="x1-51020r7"></a><span
1845class="cmr-6">7</span><span
1846class="cmtt-8">byte</span><span
1847class="cmtt-8">&#x00A0;7:</span><span
1848class="cmtt-8">&#x00A0;[</span><span
1849class="cmtt-8">&#x00A0;X</span><span
1850class="cmtt-8">&#x00A0;X</span><span
1851class="cmtt-8">&#x00A0;X</span><span
1852class="cmtt-8">&#x00A0;X</span><span
1853class="cmtt-8">&#x00A0;X</span><span
1854class="cmtt-8">&#x00A0;X</span><span
1855class="cmtt-8">&#x00A0;X</span><span
1856class="cmtt-8">&#x00A0;X</span><span
1857class="cmtt-8">&#x00A0;]</span><span
1858class="cmtt-8">&#x00A0;[codebook</span><span
1859class="cmtt-8">_entries]</span><span
1860class="cmtt-8">&#x00A0;(24</span><span
1861class="cmtt-8">&#x00A0;bit</span><span
1862class="cmtt-8">&#x00A0;unsigned)</span><br class="fancyvrb" /><a
1863 id="x1-51022r8"></a><span
1864class="cmr-6">8</span></div>
1865<!--l. 56--><p class="noindent" >Next is the <span
1866class="cmtt-12">[ordered] </span>bit flag:
1867<!--l. 58--><p class="noindent" >
1868<div class="fancyvrb" id="fancyvrb9"><a
1869 id="x1-51024r1"></a><span
1870class="cmr-6">1</span><br class="fancyvrb" /><a
1871 id="x1-51026r2"></a><span
1872class="cmr-6">2</span><span
1873class="cmtt-8">byte</span><span
1874class="cmtt-8">&#x00A0;8:</span><span
1875class="cmtt-8">&#x00A0;[</span><span
1876class="cmtt-8">&#x00A0;</span><span
1877class="cmtt-8">&#x00A0;</span><span
1878class="cmtt-8">&#x00A0;</span><span
1879class="cmtt-8">&#x00A0;</span><span
1880class="cmtt-8">&#x00A0;</span><span
1881class="cmtt-8">&#x00A0;</span><span
1882class="cmtt-8">&#x00A0;</span><span
1883class="cmtt-8">&#x00A0;</span><span
1884class="cmtt-8">&#x00A0;</span><span
1885class="cmtt-8">&#x00A0;</span><span
1886class="cmtt-8">&#x00A0;</span><span
1887class="cmtt-8">&#x00A0;</span><span
1888class="cmtt-8">&#x00A0;</span><span
1889class="cmtt-8">&#x00A0;</span><span
1890class="cmtt-8">&#x00A0;X</span><span
1891class="cmtt-8">&#x00A0;]</span><span
1892class="cmtt-8">&#x00A0;[ordered]</span><span
1893class="cmtt-8">&#x00A0;(1</span><span
1894class="cmtt-8">&#x00A0;bit)</span><br class="fancyvrb" /><a
1895 id="x1-51028r3"></a><span
1896class="cmr-6">3</span></div>
1897<!--l. 64--><p class="noindent" >Each entry, numbering a total of <span
1898class="cmtt-12">[codebook</span><span
1899class="cmtt-12">_entries]</span>, is assigned a codeword length.
1900We now read the list of codeword lengths and store these lengths in the array
1901<span
1902class="cmtt-12">[codebook</span><span
1903class="cmtt-12">_codeword</span><span
1904class="cmtt-12">_lengths]</span>. Decode of lengths is according to whether the <span
1905class="cmtt-12">[ordered] </span>flag
1906is set or unset.
1907 <ul class="itemize1">
1908 <li class="itemize">If the <span
1909class="cmtt-12">[ordered] </span>flag is unset, the codeword list is not length ordered and the decoder
1910 needs to read each codeword length one-by-one.
1911 <!--l. 76--><p class="noindent" >The decoder first reads one additional bit flag, the <span
1912class="cmtt-12">[sparse] </span>flag. This flag determines
1913 whether or not the codebook contains unused entries that are not to be included in
1914 the codeword decode tree:
1915 <!--l. 81--><p class="noindent" >
1916 <div class="fancyvrb" id="fancyvrb10"><a
1917 id="x1-51030r1"></a><span
1918class="cmr-6">1</span><span
1919class="cmtt-8">byte</span><span
1920class="cmtt-8">&#x00A0;8:</span><span
1921class="cmtt-8">&#x00A0;[</span><span
1922class="cmtt-8">&#x00A0;</span><span
1923class="cmtt-8">&#x00A0;</span><span
1924class="cmtt-8">&#x00A0;</span><span
1925class="cmtt-8">&#x00A0;</span><span
1926class="cmtt-8">&#x00A0;</span><span
1927class="cmtt-8">&#x00A0;</span><span
1928class="cmtt-8">&#x00A0;</span><span
1929class="cmtt-8">&#x00A0;</span><span
1930class="cmtt-8">&#x00A0;</span><span
1931class="cmtt-8">&#x00A0;</span><span
1932class="cmtt-8">&#x00A0;</span><span
1933class="cmtt-8">&#x00A0;</span><span
1934class="cmtt-8">&#x00A0;X</span><span
1935class="cmtt-8">&#x00A0;1</span><span
1936class="cmtt-8">&#x00A0;]</span><span
1937class="cmtt-8">&#x00A0;[sparse]</span><span
1938class="cmtt-8">&#x00A0;flag</span><span
1939class="cmtt-8">&#x00A0;(1</span><span
1940class="cmtt-8">&#x00A0;bit)</span></div>
1941 <!--l. 85--><p class="noindent" >The decoder now performs for each of the <span
1942class="cmtt-12">[codebook</span><span
1943class="cmtt-12">_entries] </span>codebook entries:
1944 <!--l. 88--><p class="noindent" >
1945 <div class="fancyvrb" id="fancyvrb11"><a
1946 id="x1-51032r1"></a><span
1947class="cmr-6">1</span><br class="fancyvrb" /><a
1948 id="x1-51034r2"></a><span
1949class="cmr-6">2</span><span
1950class="cmtt-8">&#x00A0;</span><span
1951class="cmtt-8">&#x00A0;1)</span><span
1952class="cmtt-8">&#x00A0;if([sparse]</span><span
1953class="cmtt-8">&#x00A0;is</span><span
1954class="cmtt-8">&#x00A0;set)</span><span
1955class="cmtt-8">&#x00A0;</span><span
1956class="cmsy-8">{</span><br class="fancyvrb" /><a
1957 id="x1-51036r3"></a><span
1958class="cmr-6">3</span><br class="fancyvrb" /><a
1959 id="x1-51038r4"></a><span
1960class="cmr-6">4</span><span
1961class="cmtt-8">&#x00A0;</span><span
1962class="cmtt-8">&#x00A0;</span><span
1963class="cmtt-8">&#x00A0;</span><span
1964class="cmtt-8">&#x00A0;</span><span
1965class="cmtt-8">&#x00A0;</span><span
1966class="cmtt-8">&#x00A0;</span><span
1967class="cmtt-8">&#x00A0;</span><span
1968class="cmtt-8">&#x00A0;</span><span
1969class="cmtt-8">&#x00A0;2)</span><span
1970class="cmtt-8">&#x00A0;[flag]</span><span
1971class="cmtt-8">&#x00A0;=</span><span
1972class="cmtt-8">&#x00A0;read</span><span
1973class="cmtt-8">&#x00A0;one</span><span
1974class="cmtt-8">&#x00A0;bit;</span><br class="fancyvrb" /><a
1975 id="x1-51040r5"></a><span
1976class="cmr-6">5</span><span
1977class="cmtt-8">&#x00A0;</span><span
1978class="cmtt-8">&#x00A0;</span><span
1979class="cmtt-8">&#x00A0;</span><span
1980class="cmtt-8">&#x00A0;</span><span
1981class="cmtt-8">&#x00A0;</span><span
1982class="cmtt-8">&#x00A0;</span><span
1983class="cmtt-8">&#x00A0;</span><span
1984class="cmtt-8">&#x00A0;</span><span
1985class="cmtt-8">&#x00A0;3)</span><span
1986class="cmtt-8">&#x00A0;if([flag]</span><span
1987class="cmtt-8">&#x00A0;is</span><span
1988class="cmtt-8">&#x00A0;set)</span><span
1989class="cmtt-8">&#x00A0;</span><span
1990class="cmsy-8">{</span><br class="fancyvrb" /><a
1991 id="x1-51042r6"></a><span
1992class="cmr-6">6</span>
1993 <br class="fancyvrb" /><a
1994 id="x1-51044r7"></a><span
1995class="cmr-6">7</span><span
1996class="cmtt-8">&#x00A0;</span><span
1997class="cmtt-8">&#x00A0;</span><span
1998class="cmtt-8">&#x00A0;</span><span
1999class="cmtt-8">&#x00A0;</span><span
2000class="cmtt-8">&#x00A0;</span><span
2001class="cmtt-8">&#x00A0;</span><span
2002class="cmtt-8">&#x00A0;</span><span
2003class="cmtt-8">&#x00A0;</span><span
2004class="cmtt-8">&#x00A0;</span><span
2005class="cmtt-8">&#x00A0;</span><span
2006class="cmtt-8">&#x00A0;</span><span
2007class="cmtt-8">&#x00A0;</span><span
2008class="cmtt-8">&#x00A0;</span><span
2009class="cmtt-8">&#x00A0;4)</span><span
2010class="cmtt-8">&#x00A0;[length]</span><span
2011class="cmtt-8">&#x00A0;=</span><span
2012class="cmtt-8">&#x00A0;read</span><span
2013class="cmtt-8">&#x00A0;a</span><span
2014class="cmtt-8">&#x00A0;five</span><span
2015class="cmtt-8">&#x00A0;bit</span><span
2016class="cmtt-8">&#x00A0;unsigned</span><span
2017class="cmtt-8">&#x00A0;integer;</span><br class="fancyvrb" /><a
2018 id="x1-51046r8"></a><span
2019class="cmr-6">8</span><span
2020class="cmtt-8">&#x00A0;</span><span
2021class="cmtt-8">&#x00A0;</span><span
2022class="cmtt-8">&#x00A0;</span><span
2023class="cmtt-8">&#x00A0;</span><span
2024class="cmtt-8">&#x00A0;</span><span
2025class="cmtt-8">&#x00A0;</span><span
2026class="cmtt-8">&#x00A0;</span><span
2027class="cmtt-8">&#x00A0;</span><span
2028class="cmtt-8">&#x00A0;</span><span
2029class="cmtt-8">&#x00A0;</span><span
2030class="cmtt-8">&#x00A0;</span><span
2031class="cmtt-8">&#x00A0;</span><span
2032class="cmtt-8">&#x00A0;</span><span
2033class="cmtt-8">&#x00A0;5)</span><span
2034class="cmtt-8">&#x00A0;codeword</span><span
2035class="cmtt-8">&#x00A0;length</span><span
2036class="cmtt-8">&#x00A0;for</span><span
2037class="cmtt-8">&#x00A0;this</span><span
2038class="cmtt-8">&#x00A0;entry</span><span
2039class="cmtt-8">&#x00A0;is</span><span
2040class="cmtt-8">&#x00A0;[length]+1;</span><br class="fancyvrb" /><a
2041 id="x1-51048r9"></a><span
2042class="cmr-6">9</span>
2043 <br class="fancyvrb" /><a
2044 id="x1-51050r10"></a><span
2045class="cmr-6">10</span><span
2046class="cmtt-8">&#x00A0;</span><span
2047class="cmtt-8">&#x00A0;</span><span
2048class="cmtt-8">&#x00A0;</span><span
2049class="cmtt-8">&#x00A0;</span><span
2050class="cmtt-8">&#x00A0;</span><span
2051class="cmtt-8">&#x00A0;</span><span
2052class="cmtt-8">&#x00A0;</span><span
2053class="cmtt-8">&#x00A0;</span><span
2054class="cmtt-8">&#x00A0;</span><span
2055class="cmtt-8">&#x00A0;</span><span
2056class="cmtt-8">&#x00A0;</span><span
2057class="cmtt-8">&#x00A0;</span><span
2058class="cmsy-8">}</span><span
2059class="cmtt-8">&#x00A0;else</span><span
2060class="cmtt-8">&#x00A0;</span><span
2061class="cmsy-8">{</span><br class="fancyvrb" /><a
2062 id="x1-51052r11"></a><span
2063class="cmr-6">11</span><br class="fancyvrb" /><a
2064 id="x1-51054r12"></a><span
2065class="cmr-6">12</span><span
2066class="cmtt-8">&#x00A0;</span><span
2067class="cmtt-8">&#x00A0;</span><span
2068class="cmtt-8">&#x00A0;</span><span
2069class="cmtt-8">&#x00A0;</span><span
2070class="cmtt-8">&#x00A0;</span><span
2071class="cmtt-8">&#x00A0;</span><span
2072class="cmtt-8">&#x00A0;</span><span
2073class="cmtt-8">&#x00A0;</span><span
2074class="cmtt-8">&#x00A0;</span><span
2075class="cmtt-8">&#x00A0;</span><span
2076class="cmtt-8">&#x00A0;</span><span
2077class="cmtt-8">&#x00A0;</span><span
2078class="cmtt-8">&#x00A0;</span><span
2079class="cmtt-8">&#x00A0;6)</span><span
2080class="cmtt-8">&#x00A0;this</span><span
2081class="cmtt-8">&#x00A0;entry</span><span
2082class="cmtt-8">&#x00A0;is</span><span
2083class="cmtt-8">&#x00A0;unused.</span><span
2084class="cmtt-8">&#x00A0;</span><span
2085class="cmtt-8">&#x00A0;mark</span><span
2086class="cmtt-8">&#x00A0;it</span><span
2087class="cmtt-8">&#x00A0;as</span><span
2088class="cmtt-8">&#x00A0;such.</span><br class="fancyvrb" /><a
2089 id="x1-51056r13"></a><span
2090class="cmr-6">13</span><br class="fancyvrb" /><a
2091 id="x1-51058r14"></a><span
2092class="cmr-6">14</span><span
2093class="cmtt-8">&#x00A0;</span><span
2094class="cmtt-8">&#x00A0;</span><span
2095class="cmtt-8">&#x00A0;</span><span
2096class="cmtt-8">&#x00A0;</span><span
2097class="cmtt-8">&#x00A0;</span><span
2098class="cmtt-8">&#x00A0;</span><span
2099class="cmtt-8">&#x00A0;</span><span
2100class="cmtt-8">&#x00A0;</span><span
2101class="cmtt-8">&#x00A0;</span><span
2102class="cmtt-8">&#x00A0;</span><span
2103class="cmtt-8">&#x00A0;</span><span
2104class="cmtt-8">&#x00A0;</span><span
2105class="cmsy-8">}</span><br class="fancyvrb" /><a
2106 id="x1-51060r15"></a><span
2107class="cmr-6">15</span><br class="fancyvrb" /><a
2108 id="x1-51062r16"></a><span
2109class="cmr-6">16</span><span
2110class="cmtt-8">&#x00A0;</span><span
2111class="cmtt-8">&#x00A0;</span><span
2112class="cmtt-8">&#x00A0;</span><span
2113class="cmtt-8">&#x00A0;</span><span
2114class="cmtt-8">&#x00A0;</span><span
2115class="cmsy-8">}</span><span
2116class="cmtt-8">&#x00A0;else</span><span
2117class="cmtt-8">&#x00A0;the</span><span
2118class="cmtt-8">&#x00A0;sparse</span><span
2119class="cmtt-8">&#x00A0;flag</span><span
2120class="cmtt-8">&#x00A0;is</span><span
2121class="cmtt-8">&#x00A0;not</span><span
2122class="cmtt-8">&#x00A0;set</span><span
2123class="cmtt-8">&#x00A0;</span><span
2124class="cmsy-8">{</span><br class="fancyvrb" /><a
2125 id="x1-51064r17"></a><span
2126class="cmr-6">17</span>
2127 <br class="fancyvrb" /><a
2128 id="x1-51066r18"></a><span
2129class="cmr-6">18</span><span
2130class="cmtt-8">&#x00A0;</span><span
2131class="cmtt-8">&#x00A0;</span><span
2132class="cmtt-8">&#x00A0;</span><span
2133class="cmtt-8">&#x00A0;</span><span
2134class="cmtt-8">&#x00A0;</span><span
2135class="cmtt-8">&#x00A0;</span><span
2136class="cmtt-8">&#x00A0;</span><span
2137class="cmtt-8">&#x00A0;7)</span><span
2138class="cmtt-8">&#x00A0;[length]</span><span
2139class="cmtt-8">&#x00A0;=</span><span
2140class="cmtt-8">&#x00A0;read</span><span
2141class="cmtt-8">&#x00A0;a</span><span
2142class="cmtt-8">&#x00A0;five</span><span
2143class="cmtt-8">&#x00A0;bit</span><span
2144class="cmtt-8">&#x00A0;unsigned</span><span
2145class="cmtt-8">&#x00A0;integer;</span><br class="fancyvrb" /><a
2146 id="x1-51068r19"></a><span
2147class="cmr-6">19</span><span
2148class="cmtt-8">&#x00A0;</span><span
2149class="cmtt-8">&#x00A0;</span><span
2150class="cmtt-8">&#x00A0;</span><span
2151class="cmtt-8">&#x00A0;</span><span
2152class="cmtt-8">&#x00A0;</span><span
2153class="cmtt-8">&#x00A0;</span><span
2154class="cmtt-8">&#x00A0;</span><span
2155class="cmtt-8">&#x00A0;8)</span><span
2156class="cmtt-8">&#x00A0;the</span><span
2157class="cmtt-8">&#x00A0;codeword</span><span
2158class="cmtt-8">&#x00A0;length</span><span
2159class="cmtt-8">&#x00A0;for</span><span
2160class="cmtt-8">&#x00A0;this</span><span
2161class="cmtt-8">&#x00A0;entry</span><span
2162class="cmtt-8">&#x00A0;is</span><span
2163class="cmtt-8">&#x00A0;[length]+1;</span><br class="fancyvrb" /><a
2164 id="x1-51070r20"></a><span
2165class="cmr-6">20</span><br class="fancyvrb" /><a
2166 id="x1-51072r21"></a><span
2167class="cmr-6">21</span><span
2168class="cmtt-8">&#x00A0;</span><span
2169class="cmtt-8">&#x00A0;</span><span
2170class="cmtt-8">&#x00A0;</span><span
2171class="cmtt-8">&#x00A0;</span><span
2172class="cmtt-8">&#x00A0;</span><span
2173class="cmsy-8">}</span><br class="fancyvrb" /><a
2174 id="x1-51074r22"></a><span
2175class="cmr-6">22</span></div>
2176
2177
2178
2179 </li>
2180 <li class="itemize">If the <span
2181class="cmtt-12">[ordered] </span>flag is set, the codeword list for this codebook is encoded in
2182 ascending length order. Rather than reading a length for every codeword, the
2183 encoder reads the number of codewords per length. That is, beginning at entry
2184 zero:
2185 <!--l. 119--><p class="noindent" >
2186 <div class="fancyvrb" id="fancyvrb12"><a
2187 id="x1-51076r1"></a><span
2188class="cmr-6">1</span><span
2189class="cmtt-8">&#x00A0;</span><span
2190class="cmtt-8">&#x00A0;1)</span><span
2191class="cmtt-8">&#x00A0;[current</span><span
2192class="cmtt-8">_entry]</span><span
2193class="cmtt-8">&#x00A0;=</span><span
2194class="cmtt-8">&#x00A0;0;</span><br class="fancyvrb" /><a
2195 id="x1-51078r2"></a><span
2196class="cmr-6">2</span><span
2197class="cmtt-8">&#x00A0;</span><span
2198class="cmtt-8">&#x00A0;2)</span><span
2199class="cmtt-8">&#x00A0;[current</span><span
2200class="cmtt-8">_length]</span><span
2201class="cmtt-8">&#x00A0;=</span><span
2202class="cmtt-8">&#x00A0;read</span><span
2203class="cmtt-8">&#x00A0;a</span><span
2204class="cmtt-8">&#x00A0;five</span><span
2205class="cmtt-8">&#x00A0;bit</span><span
2206class="cmtt-8">&#x00A0;unsigned</span><span
2207class="cmtt-8">&#x00A0;integer</span><span
2208class="cmtt-8">&#x00A0;and</span><span
2209class="cmtt-8">&#x00A0;add</span><span
2210class="cmtt-8">&#x00A0;1;</span>
2211 <br class="fancyvrb" /><a
2212 id="x1-51080r3"></a><span
2213class="cmr-6">3</span><span
2214class="cmtt-8">&#x00A0;</span><span
2215class="cmtt-8">&#x00A0;3)</span><span
2216class="cmtt-8">&#x00A0;[number]</span><span
2217class="cmtt-8">&#x00A0;=</span><span
2218class="cmtt-8">&#x00A0;read</span><span
2219class="cmtt-8">&#x00A0;</span><a
2220href="#x1-1190009.2.1"><span
2221class="cmtt-8">ilog</span></a><span
2222class="cmtt-8">([codebook</span><span
2223class="cmtt-8">_entries]</span><span
2224class="cmtt-8">&#x00A0;-</span><span
2225class="cmtt-8">&#x00A0;[current</span><span
2226class="cmtt-8">_entry])</span><span
2227class="cmtt-8">&#x00A0;bits</span><span
2228class="cmtt-8">&#x00A0;as</span><span
2229class="cmtt-8">&#x00A0;an</span><span
2230class="cmtt-8">&#x00A0;unsigned</span><span
2231class="cmtt-8">&#x00A0;integer</span>
2232 <br class="fancyvrb" /><a
2233 id="x1-51082r4"></a><span
2234class="cmr-6">4</span><span
2235class="cmtt-8">&#x00A0;</span><span
2236class="cmtt-8">&#x00A0;4)</span><span
2237class="cmtt-8">&#x00A0;set</span><span
2238class="cmtt-8">&#x00A0;the</span><span
2239class="cmtt-8">&#x00A0;entries</span><span
2240class="cmtt-8">&#x00A0;[current</span><span
2241class="cmtt-8">_entry]</span><span
2242class="cmtt-8">&#x00A0;through</span><span
2243class="cmtt-8">&#x00A0;[current</span><span
2244class="cmtt-8">_entry]+[number]-1,</span><span
2245class="cmtt-8">&#x00A0;inclusive,</span>
2246 <br class="fancyvrb" /><a
2247 id="x1-51084r5"></a><span
2248class="cmr-6">5</span><span
2249class="cmtt-8">&#x00A0;</span><span
2250class="cmtt-8">&#x00A0;</span><span
2251class="cmtt-8">&#x00A0;</span><span
2252class="cmtt-8">&#x00A0;of</span><span
2253class="cmtt-8">&#x00A0;the</span><span
2254class="cmtt-8">&#x00A0;[codebook</span><span
2255class="cmtt-8">_codeword</span><span
2256class="cmtt-8">_lengths]</span><span
2257class="cmtt-8">&#x00A0;array</span><span
2258class="cmtt-8">&#x00A0;to</span><span
2259class="cmtt-8">&#x00A0;[current</span><span
2260class="cmtt-8">_length]</span><br class="fancyvrb" /><a
2261 id="x1-51086r6"></a><span
2262class="cmr-6">6</span><span
2263class="cmtt-8">&#x00A0;</span><span
2264class="cmtt-8">&#x00A0;5)</span><span
2265class="cmtt-8">&#x00A0;set</span><span
2266class="cmtt-8">&#x00A0;[current</span><span
2267class="cmtt-8">_entry]</span><span
2268class="cmtt-8">&#x00A0;to</span><span
2269class="cmtt-8">&#x00A0;[number]</span><span
2270class="cmtt-8">&#x00A0;+</span><span
2271class="cmtt-8">&#x00A0;[current</span><span
2272class="cmtt-8">_entry]</span>
2273 <br class="fancyvrb" /><a
2274 id="x1-51088r7"></a><span
2275class="cmr-6">7</span><span
2276class="cmtt-8">&#x00A0;</span><span
2277class="cmtt-8">&#x00A0;6)</span><span
2278class="cmtt-8">&#x00A0;increment</span><span
2279class="cmtt-8">&#x00A0;[current</span><span
2280class="cmtt-8">_length]</span><span
2281class="cmtt-8">&#x00A0;by</span><span
2282class="cmtt-8">&#x00A0;1</span><br class="fancyvrb" /><a
2283 id="x1-51090r8"></a><span
2284class="cmr-6">8</span><span
2285class="cmtt-8">&#x00A0;</span><span
2286class="cmtt-8">&#x00A0;7)</span><span
2287class="cmtt-8">&#x00A0;if</span><span
2288class="cmtt-8">&#x00A0;[current</span><span
2289class="cmtt-8">_entry]</span><span
2290class="cmtt-8">&#x00A0;is</span><span
2291class="cmtt-8">&#x00A0;greater</span><span
2292class="cmtt-8">&#x00A0;than</span><span
2293class="cmtt-8">&#x00A0;[codebook</span><span
2294class="cmtt-8">_entries]</span><span
2295class="cmtt-8">&#x00A0;ERROR</span><span
2296class="cmtt-8">&#x00A0;CONDITION;</span>
2297 <br class="fancyvrb" /><a
2298 id="x1-51092r9"></a><span
2299class="cmr-6">9</span><span
2300class="cmtt-8">&#x00A0;</span><span
2301class="cmtt-8">&#x00A0;</span><span
2302class="cmtt-8">&#x00A0;</span><span
2303class="cmtt-8">&#x00A0;the</span><span
2304class="cmtt-8">&#x00A0;decoder</span><span
2305class="cmtt-8">&#x00A0;will</span><span
2306class="cmtt-8">&#x00A0;not</span><span
2307class="cmtt-8">&#x00A0;be</span><span
2308class="cmtt-8">&#x00A0;able</span><span
2309class="cmtt-8">&#x00A0;to</span><span
2310class="cmtt-8">&#x00A0;read</span><span
2311class="cmtt-8">&#x00A0;this</span><span
2312class="cmtt-8">&#x00A0;stream.</span><br class="fancyvrb" /><a
2313 id="x1-51094r10"></a><span
2314class="cmr-6">10</span><span
2315class="cmtt-8">&#x00A0;</span><span
2316class="cmtt-8">&#x00A0;8)</span><span
2317class="cmtt-8">&#x00A0;if</span><span
2318class="cmtt-8">&#x00A0;[current</span><span
2319class="cmtt-8">_entry]</span><span
2320class="cmtt-8">&#x00A0;is</span><span
2321class="cmtt-8">&#x00A0;less</span><span
2322class="cmtt-8">&#x00A0;than</span><span
2323class="cmtt-8">&#x00A0;[codebook</span><span
2324class="cmtt-8">_entries],</span><span
2325class="cmtt-8">&#x00A0;repeat</span><span
2326class="cmtt-8">&#x00A0;process</span><span
2327class="cmtt-8">&#x00A0;starting</span><span
2328class="cmtt-8">&#x00A0;at</span><span
2329class="cmtt-8">&#x00A0;3)</span>
2330 <br class="fancyvrb" /><a
2331 id="x1-51096r11"></a><span
2332class="cmr-6">11</span><span
2333class="cmtt-8">&#x00A0;</span><span
2334class="cmtt-8">&#x00A0;9)</span><span
2335class="cmtt-8">&#x00A0;done.</span></div>
2336 </li></ul>
2337<!--l. 135--><p class="noindent" >After all codeword lengths have been decoded, the decoder reads the vector lookup table. Vorbis
2338I supports three lookup types:
2339 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
2340 1. </dt><dd
2341class="enumerate-enumitem">No lookup
2342 </dd><dt class="enumerate-enumitem">
2343 2. </dt><dd
2344class="enumerate-enumitem">Implicitly populated value mapping (lattice VQ)
2345 </dd><dt class="enumerate-enumitem">
2346 3. </dt><dd
2347class="enumerate-enumitem">Explicitly populated value mapping (tessellated or &#8217;foam&#8217; VQ)</dd></dl>
2348<!--l. 148--><p class="noindent" >The lookup table type is read as a four bit unsigned integer:
2349<div class="fancyvrb" id="fancyvrb13"><a
2350 id="x1-51101r1"></a><span
2351class="cmr-6">1</span><span
2352class="cmtt-8">&#x00A0;</span><span
2353class="cmtt-8">&#x00A0;1)</span><span
2354class="cmtt-8">&#x00A0;[codebook</span><span
2355class="cmtt-8">_lookup</span><span
2356class="cmtt-8">_type]</span><span
2357class="cmtt-8">&#x00A0;=</span><span
2358class="cmtt-8">&#x00A0;read</span><span
2359class="cmtt-8">&#x00A0;four</span><span
2360class="cmtt-8">&#x00A0;bits</span><span
2361class="cmtt-8">&#x00A0;as</span><span
2362class="cmtt-8">&#x00A0;an</span><span
2363class="cmtt-8">&#x00A0;unsigned</span><span
2364class="cmtt-8">&#x00A0;integer</span></div>
2365<!--l. 153--><p class="noindent" >Codebook decode precedes according to <span
2366class="cmtt-12">[codebook</span><span
2367class="cmtt-12">_lookup</span><span
2368class="cmtt-12">_type]</span>:
2369 <ul class="itemize1">
2370 <li class="itemize">Lookup type zero indicates no lookup to be read. Proceed past lookup decode.
2371 </li>
2372 <li class="itemize">Lookup types one and two are similar, differing only in the number of lookup values to
2373 be read. Lookup type one reads a list of values that are permuted in a set pattern to
2374 build a list of vectors, each vector of order <span
2375class="cmtt-12">[codebook</span><span
2376class="cmtt-12">_dimensions] </span>scalars. Lookup
2377 type two builds the same vector list, but reads each scalar for each vector explicitly,
2378 rather than building vectors from a smaller list of possible scalar values. Lookup
2379 decode proceeds as follows:
2380 <!--l. 167--><p class="noindent" >
2381 <div class="fancyvrb" id="fancyvrb14"><a
2382 id="x1-51103r1"></a><span
2383class="cmr-6">1</span><span
2384class="cmtt-8">&#x00A0;</span><span
2385class="cmtt-8">&#x00A0;1)</span><span
2386class="cmtt-8">&#x00A0;[codebook</span><span
2387class="cmtt-8">_minimum</span><span
2388class="cmtt-8">_value]</span><span
2389class="cmtt-8">&#x00A0;=</span><span
2390class="cmtt-8">&#x00A0;</span><a
2391href="#x1-1200009.2.2"><span
2392class="cmtt-8">float32</span><span
2393class="cmtt-8">_unpack</span></a><span
2394class="cmtt-8">(</span><span
2395class="cmtt-8">&#x00A0;read</span><span
2396class="cmtt-8">&#x00A0;32</span><span
2397class="cmtt-8">&#x00A0;bits</span><span
2398class="cmtt-8">&#x00A0;as</span><span
2399class="cmtt-8">&#x00A0;an</span><span
2400class="cmtt-8">&#x00A0;unsigned</span><span
2401class="cmtt-8">&#x00A0;integer)</span>
2402 <br class="fancyvrb" /><a
2403 id="x1-51105r2"></a><span
2404class="cmr-6">2</span><span
2405class="cmtt-8">&#x00A0;</span><span
2406class="cmtt-8">&#x00A0;2)</span><span
2407class="cmtt-8">&#x00A0;[codebook</span><span
2408class="cmtt-8">_delta</span><span
2409class="cmtt-8">_value]</span><span
2410class="cmtt-8">&#x00A0;=</span><span
2411class="cmtt-8">&#x00A0;</span><a
2412href="#x1-1200009.2.2"><span
2413class="cmtt-8">float32</span><span
2414class="cmtt-8">_unpack</span></a><span
2415class="cmtt-8">(</span><span
2416class="cmtt-8">&#x00A0;read</span><span
2417class="cmtt-8">&#x00A0;32</span><span
2418class="cmtt-8">&#x00A0;bits</span><span
2419class="cmtt-8">&#x00A0;as</span><span
2420class="cmtt-8">&#x00A0;an</span><span
2421class="cmtt-8">&#x00A0;unsigned</span><span
2422class="cmtt-8">&#x00A0;integer)</span>
2423 <br class="fancyvrb" /><a
2424 id="x1-51107r3"></a><span
2425class="cmr-6">3</span><span
2426class="cmtt-8">&#x00A0;</span><span
2427class="cmtt-8">&#x00A0;3)</span><span
2428class="cmtt-8">&#x00A0;[codebook</span><span
2429class="cmtt-8">_value</span><span
2430class="cmtt-8">_bits]</span><span
2431class="cmtt-8">&#x00A0;=</span><span
2432class="cmtt-8">&#x00A0;read</span><span
2433class="cmtt-8">&#x00A0;4</span><span
2434class="cmtt-8">&#x00A0;bits</span><span
2435class="cmtt-8">&#x00A0;as</span><span
2436class="cmtt-8">&#x00A0;an</span><span
2437class="cmtt-8">&#x00A0;unsigned</span><span
2438class="cmtt-8">&#x00A0;integer</span><span
2439class="cmtt-8">&#x00A0;and</span><span
2440class="cmtt-8">&#x00A0;add</span><span
2441class="cmtt-8">&#x00A0;1</span><br class="fancyvrb" /><a
2442 id="x1-51109r4"></a><span
2443class="cmr-6">4</span><span
2444class="cmtt-8">&#x00A0;</span><span
2445class="cmtt-8">&#x00A0;4)</span><span
2446class="cmtt-8">&#x00A0;[codebook</span><span
2447class="cmtt-8">_sequence</span><span
2448class="cmtt-8">_p]</span><span
2449class="cmtt-8">&#x00A0;=</span><span
2450class="cmtt-8">&#x00A0;read</span><span
2451class="cmtt-8">&#x00A0;1</span><span
2452class="cmtt-8">&#x00A0;bit</span><span
2453class="cmtt-8">&#x00A0;as</span><span
2454class="cmtt-8">&#x00A0;a</span><span
2455class="cmtt-8">&#x00A0;boolean</span><span
2456class="cmtt-8">&#x00A0;flag</span><br class="fancyvrb" /><a
2457 id="x1-51111r5"></a><span
2458class="cmr-6">5</span>
2459
2460
2461
2462 <br class="fancyvrb" /><a
2463 id="x1-51113r6"></a><span
2464class="cmr-6">6</span><span
2465class="cmtt-8">&#x00A0;</span><span
2466class="cmtt-8">&#x00A0;if</span><span
2467class="cmtt-8">&#x00A0;(</span><span
2468class="cmtt-8">&#x00A0;[codebook</span><span
2469class="cmtt-8">_lookup</span><span
2470class="cmtt-8">_type]</span><span
2471class="cmtt-8">&#x00A0;is</span><span
2472class="cmtt-8">&#x00A0;1</span><span
2473class="cmtt-8">&#x00A0;)</span><span
2474class="cmtt-8">&#x00A0;</span><span
2475class="cmsy-8">{</span><br class="fancyvrb" /><a
2476 id="x1-51115r7"></a><span
2477class="cmr-6">7</span><br class="fancyvrb" /><a
2478 id="x1-51117r8"></a><span
2479class="cmr-6">8</span><span
2480class="cmtt-8">&#x00A0;</span><span
2481class="cmtt-8">&#x00A0;</span><span
2482class="cmtt-8">&#x00A0;</span><span
2483class="cmtt-8">&#x00A0;</span><span
2484class="cmtt-8">&#x00A0;5)</span><span
2485class="cmtt-8">&#x00A0;[codebook</span><span
2486class="cmtt-8">_lookup</span><span
2487class="cmtt-8">_values]</span><span
2488class="cmtt-8">&#x00A0;=</span><span
2489class="cmtt-8">&#x00A0;</span><a
2490href="#x1-1210009.2.3"><span
2491class="cmtt-8">lookup1</span><span
2492class="cmtt-8">_values</span></a><span
2493class="cmtt-8">([codebook</span><span
2494class="cmtt-8">_entries],</span><span
2495class="cmtt-8">&#x00A0;[codebook</span><span
2496class="cmtt-8">_dimensions]</span><span
2497class="cmtt-8">&#x00A0;)</span><br class="fancyvrb" /><a
2498 id="x1-51119r9"></a><span
2499class="cmr-6">9</span>
2500 <br class="fancyvrb" /><a
2501 id="x1-51121r10"></a><span
2502class="cmr-6">10</span><span
2503class="cmtt-8">&#x00A0;</span><span
2504class="cmtt-8">&#x00A0;</span><span
2505class="cmsy-8">}</span><span
2506class="cmtt-8">&#x00A0;else</span><span
2507class="cmtt-8">&#x00A0;</span><span
2508class="cmsy-8">{</span><br class="fancyvrb" /><a
2509 id="x1-51123r11"></a><span
2510class="cmr-6">11</span><br class="fancyvrb" /><a
2511 id="x1-51125r12"></a><span
2512class="cmr-6">12</span><span
2513class="cmtt-8">&#x00A0;</span><span
2514class="cmtt-8">&#x00A0;</span><span
2515class="cmtt-8">&#x00A0;</span><span
2516class="cmtt-8">&#x00A0;</span><span
2517class="cmtt-8">&#x00A0;6)</span><span
2518class="cmtt-8">&#x00A0;[codebook</span><span
2519class="cmtt-8">_lookup</span><span
2520class="cmtt-8">_values]</span><span
2521class="cmtt-8">&#x00A0;=</span><span
2522class="cmtt-8">&#x00A0;[codebook</span><span
2523class="cmtt-8">_entries]</span><span
2524class="cmtt-8">&#x00A0;*</span><span
2525class="cmtt-8">&#x00A0;[codebook</span><span
2526class="cmtt-8">_dimensions]</span><br class="fancyvrb" /><a
2527 id="x1-51127r13"></a><span
2528class="cmr-6">13</span><br class="fancyvrb" /><a
2529 id="x1-51129r14"></a><span
2530class="cmr-6">14</span><span
2531class="cmtt-8">&#x00A0;</span><span
2532class="cmtt-8">&#x00A0;</span><span
2533class="cmsy-8">}</span><br class="fancyvrb" /><a
2534 id="x1-51131r15"></a><span
2535class="cmr-6">15</span>
2536 <br class="fancyvrb" /><a
2537 id="x1-51133r16"></a><span
2538class="cmr-6">16</span><span
2539class="cmtt-8">&#x00A0;</span><span
2540class="cmtt-8">&#x00A0;7)</span><span
2541class="cmtt-8">&#x00A0;read</span><span
2542class="cmtt-8">&#x00A0;a</span><span
2543class="cmtt-8">&#x00A0;total</span><span
2544class="cmtt-8">&#x00A0;of</span><span
2545class="cmtt-8">&#x00A0;[codebook</span><span
2546class="cmtt-8">_lookup</span><span
2547class="cmtt-8">_values]</span><span
2548class="cmtt-8">&#x00A0;unsigned</span><span
2549class="cmtt-8">&#x00A0;integers</span><span
2550class="cmtt-8">&#x00A0;of</span><span
2551class="cmtt-8">&#x00A0;[codebook</span><span
2552class="cmtt-8">_value</span><span
2553class="cmtt-8">_bits]</span><span
2554class="cmtt-8">&#x00A0;each;</span>
2555 <br class="fancyvrb" /><a
2556 id="x1-51135r17"></a><span
2557class="cmr-6">17</span><span
2558class="cmtt-8">&#x00A0;</span><span
2559class="cmtt-8">&#x00A0;</span><span
2560class="cmtt-8">&#x00A0;</span><span
2561class="cmtt-8">&#x00A0;</span><span
2562class="cmtt-8">&#x00A0;store</span><span
2563class="cmtt-8">&#x00A0;these</span><span
2564class="cmtt-8">&#x00A0;in</span><span
2565class="cmtt-8">&#x00A0;order</span><span
2566class="cmtt-8">&#x00A0;in</span><span
2567class="cmtt-8">&#x00A0;the</span><span
2568class="cmtt-8">&#x00A0;array</span><span
2569class="cmtt-8">&#x00A0;[codebook</span><span
2570class="cmtt-8">_multiplicands]</span></div>
2571 </li>
2572 <li class="itemize">A <span
2573class="cmtt-12">[codebook</span><span
2574class="cmtt-12">_lookup</span><span
2575class="cmtt-12">_type] </span>of greater than two is reserved and indicates a stream that is
2576 not decodable by the specification in this document.
2577 </li></ul>
2578<!--l. 194--><p class="noindent" >An &#8217;end of packet&#8217; during any read operation in the above steps is considered an error condition
2579rendering the stream undecodable.
2580<!--l. 197--><p class="noindent" ><span class="paragraphHead"><a
2581 id="x1-520003.2.1"></a><span
2582class="cmbx-12">Huffman decision tree representation</span></span>
2583The <span
2584class="cmtt-12">[codebook</span><span
2585class="cmtt-12">_codeword</span><span
2586class="cmtt-12">_lengths] </span>array and <span
2587class="cmtt-12">[codebook</span><span
2588class="cmtt-12">_entries] </span>value uniquely define the
2589Huffman decision tree used for entropy decoding.
2590<!--l. 203--><p class="noindent" >Briefly, each used codebook entry (recall that length-unordered codebooks support unused
2591codeword entries) is assigned, in order, the lowest valued unused binary Huffman codeword
2592possible. Assume the following codeword length list:
2593<!--l. 208--><p class="noindent" >
2594<div class="fancyvrb" id="fancyvrb15"><a
2595 id="x1-52002r1"></a><span
2596class="cmr-6">1</span><span
2597class="cmtt-8">entry</span><span
2598class="cmtt-8">&#x00A0;0:</span><span
2599class="cmtt-8">&#x00A0;length</span><span
2600class="cmtt-8">&#x00A0;2</span><br class="fancyvrb" /><a
2601 id="x1-52004r2"></a><span
2602class="cmr-6">2</span><span
2603class="cmtt-8">entry</span><span
2604class="cmtt-8">&#x00A0;1:</span><span
2605class="cmtt-8">&#x00A0;length</span><span
2606class="cmtt-8">&#x00A0;4</span><br class="fancyvrb" /><a
2607 id="x1-52006r3"></a><span
2608class="cmr-6">3</span><span
2609class="cmtt-8">entry</span><span
2610class="cmtt-8">&#x00A0;2:</span><span
2611class="cmtt-8">&#x00A0;length</span><span
2612class="cmtt-8">&#x00A0;4</span><br class="fancyvrb" /><a
2613 id="x1-52008r4"></a><span
2614class="cmr-6">4</span><span
2615class="cmtt-8">entry</span><span
2616class="cmtt-8">&#x00A0;3:</span><span
2617class="cmtt-8">&#x00A0;length</span><span
2618class="cmtt-8">&#x00A0;4</span><br class="fancyvrb" /><a
2619 id="x1-52010r5"></a><span
2620class="cmr-6">5</span><span
2621class="cmtt-8">entry</span><span
2622class="cmtt-8">&#x00A0;4:</span><span
2623class="cmtt-8">&#x00A0;length</span><span
2624class="cmtt-8">&#x00A0;4</span><br class="fancyvrb" /><a
2625 id="x1-52012r6"></a><span
2626class="cmr-6">6</span><span
2627class="cmtt-8">entry</span><span
2628class="cmtt-8">&#x00A0;5:</span><span
2629class="cmtt-8">&#x00A0;length</span><span
2630class="cmtt-8">&#x00A0;2</span><br class="fancyvrb" /><a
2631 id="x1-52014r7"></a><span
2632class="cmr-6">7</span><span
2633class="cmtt-8">entry</span><span
2634class="cmtt-8">&#x00A0;6:</span><span
2635class="cmtt-8">&#x00A0;length</span><span
2636class="cmtt-8">&#x00A0;3</span><br class="fancyvrb" /><a
2637 id="x1-52016r8"></a><span
2638class="cmr-6">8</span><span
2639class="cmtt-8">entry</span><span
2640class="cmtt-8">&#x00A0;7:</span><span
2641class="cmtt-8">&#x00A0;length</span><span
2642class="cmtt-8">&#x00A0;3</span></div>
2643<!--l. 219--><p class="noindent" >Assigning codewords in order (lowest possible value of the appropriate length to highest) results
2644in the following codeword list:
2645<!--l. 222--><p class="noindent" >
2646<div class="fancyvrb" id="fancyvrb16"><a
2647 id="x1-52018r1"></a><span
2648class="cmr-6">1</span><span
2649class="cmtt-8">entry</span><span
2650class="cmtt-8">&#x00A0;0:</span><span
2651class="cmtt-8">&#x00A0;length</span><span
2652class="cmtt-8">&#x00A0;2</span><span
2653class="cmtt-8">&#x00A0;codeword</span><span
2654class="cmtt-8">&#x00A0;00</span><br class="fancyvrb" /><a
2655 id="x1-52020r2"></a><span
2656class="cmr-6">2</span><span
2657class="cmtt-8">entry</span><span
2658class="cmtt-8">&#x00A0;1:</span><span
2659class="cmtt-8">&#x00A0;length</span><span
2660class="cmtt-8">&#x00A0;4</span><span
2661class="cmtt-8">&#x00A0;codeword</span><span
2662class="cmtt-8">&#x00A0;0100</span><br class="fancyvrb" /><a
2663 id="x1-52022r3"></a><span
2664class="cmr-6">3</span><span
2665class="cmtt-8">entry</span><span
2666class="cmtt-8">&#x00A0;2:</span><span
2667class="cmtt-8">&#x00A0;length</span><span
2668class="cmtt-8">&#x00A0;4</span><span
2669class="cmtt-8">&#x00A0;codeword</span><span
2670class="cmtt-8">&#x00A0;0101</span><br class="fancyvrb" /><a
2671 id="x1-52024r4"></a><span
2672class="cmr-6">4</span><span
2673class="cmtt-8">entry</span><span
2674class="cmtt-8">&#x00A0;3:</span><span
2675class="cmtt-8">&#x00A0;length</span><span
2676class="cmtt-8">&#x00A0;4</span><span
2677class="cmtt-8">&#x00A0;codeword</span><span
2678class="cmtt-8">&#x00A0;0110</span>
2679<br class="fancyvrb" /><a
2680 id="x1-52026r5"></a><span
2681class="cmr-6">5</span><span
2682class="cmtt-8">entry</span><span
2683class="cmtt-8">&#x00A0;4:</span><span
2684class="cmtt-8">&#x00A0;length</span><span
2685class="cmtt-8">&#x00A0;4</span><span
2686class="cmtt-8">&#x00A0;codeword</span><span
2687class="cmtt-8">&#x00A0;0111</span><br class="fancyvrb" /><a
2688 id="x1-52028r6"></a><span
2689class="cmr-6">6</span><span
2690class="cmtt-8">entry</span><span
2691class="cmtt-8">&#x00A0;5:</span><span
2692class="cmtt-8">&#x00A0;length</span><span
2693class="cmtt-8">&#x00A0;2</span><span
2694class="cmtt-8">&#x00A0;codeword</span><span
2695class="cmtt-8">&#x00A0;10</span><br class="fancyvrb" /><a
2696 id="x1-52030r7"></a><span
2697class="cmr-6">7</span><span
2698class="cmtt-8">entry</span><span
2699class="cmtt-8">&#x00A0;6:</span><span
2700class="cmtt-8">&#x00A0;length</span><span
2701class="cmtt-8">&#x00A0;3</span><span
2702class="cmtt-8">&#x00A0;codeword</span><span
2703class="cmtt-8">&#x00A0;110</span><br class="fancyvrb" /><a
2704 id="x1-52032r8"></a><span
2705class="cmr-6">8</span><span
2706class="cmtt-8">entry</span><span
2707class="cmtt-8">&#x00A0;7:</span><span
2708class="cmtt-8">&#x00A0;length</span><span
2709class="cmtt-8">&#x00A0;3</span><span
2710class="cmtt-8">&#x00A0;codeword</span><span
2711class="cmtt-8">&#x00A0;111</span></div>
2712<!--l. 234--><p class="noindent" ><span class="likesubparagraphHead"><a
2713 id="x1-530003.2.1"></a><span
2714class="cmbx-12">Note:</span></span> Unlike most binary numerical values in this document, we intend the above codewords to
2715be read and used bit by bit from left to right, thus the codeword &#8217;001&#8217; is the bit string &#8217;zero, zero,
2716one&#8217;. When determining &#8217;lowest possible value&#8217; in the assignment definition above, the leftmost
2717bit is the MSb.
2718<!--l. 242--><p class="noindent" >It is clear that the codeword length list represents a Huffman decision tree with the entry
2719numbers equivalent to the leaves numbered left-to-right:
2720
2721
2722
2723<div class="center"
2724>
2725<!--l. 246--><p class="noindent" >
2726
2727<!--l. 247--><p class="noindent" ><img
2728src="hufftree.png" alt="PIC"
2729>
2730<br /> <div class="caption"
2731><span class="id">Figure&#x00A0;4: </span><span
2732class="content">huffman tree illustration</span></div><!--tex4ht:label?: x1-530014 -->
2733</div>
2734<!--l. 252--><p class="noindent" >As we assign codewords in order, we see that each choice constructs a new leaf in the leftmost
2735possible position.
2736<!--l. 255--><p class="noindent" >Note that it&#8217;s possible to underspecify or overspecify a Huffman tree via the length list.
2737In the above example, if codeword seven were eliminated, it&#8217;s clear that the tree is
2738unfinished:
2739<div class="center"
2740>
2741<!--l. 259--><p class="noindent" >
2742
2743<!--l. 260--><p class="noindent" ><img
2744src="hufftree-under.png" alt="PIC"
2745>
2746<br /> <div class="caption"
2747><span class="id">Figure&#x00A0;5: </span><span
2748class="content">underspecified huffman tree illustration</span></div><!--tex4ht:label?: x1-530025 -->
2749</div>
2750<!--l. 265--><p class="noindent" >Similarly, in the original codebook, it&#8217;s clear that the tree is fully populated and a ninth
2751codeword is impossible. Both underspecified and overspecified trees are an error condition
2752rendering the stream undecodable.
2753<!--l. 270--><p class="noindent" >Codebook entries marked &#8217;unused&#8217; are simply skipped in the assigning process. They have no
2754codeword and do not appear in the decision tree, thus it&#8217;s impossible for any bit pattern read
2755from the stream to decode to that entry number.
2756<!--l. 275--><p class="noindent" ><span class="paragraphHead"><a
2757 id="x1-540003.2.1"></a><span
2758class="cmbx-12">Errata 20150226: Single entry codebooks</span></span>
2759A &#8217;single-entry codebook&#8217; is a codebook with one active codeword entry. A single-entry codebook
2760may be either a fully populated codebook with only one declared entry, or a sparse codebook
2761with only one entry marked used. The Vorbis I spec provides no means to specify a codeword
2762length of zero, and as a result, a single-entry codebook is inherently malformed because it is
2763underpopulated. The original specification did not address directly the matter of single-entry
2764codebooks; they were implicitly illegal as it was not possible to write such a codebook with a
2765valid tree structure.
2766
2767
2768
2769<!--l. 287--><p class="noindent" >In r14811 of the libvorbis reference implementation, Xiph added an additional check to the
2770codebook implementation to reject underpopulated Huffman trees. This change led to the
2771discovery of single-entry books used &#8217;in the wild&#8217; when the new, stricter checks rejected a number
2772of apparently working streams.
2773<!--l. 293--><p class="noindent" >In order to minimize breakage of deployed (if technically erroneous) streams, r16073 of the
2774reference implementation explicitly special-cased single-entry codebooks to tolerate the
2775single-entry case. Commit r16073 also added the following to the specification:
2776<!--l. 302--><p class="noindent" >&#8220;<span class="sout">Take special care that a codebook with a single used entry is handled properly; it consists of a
2777single codework of zero bits and reading a value out of such a codebook always returns the single
2778used value and sinks zero bits. </span>&#8221;
2779<!--l. 304--><p class="noindent" >The intent was to clarify the spec and codify current practice. However, this addition is
2780erroneously at odds with the intent of preserving usability of existing streams using single-entry
2781codebooks, disagrees with the code changes that reinstated decoding, and does not address how
2782single-entry codebooks should be encoded.
2783<!--l. 310--><p class="noindent" >As such, the above addition made in r16037 is struck from the specification and replaced by the
2784following:
2785<!--l. 329--><p class="noindent" >
2786 <div class="quote">
2787 <!--l. 329--><p class="noindent" >It is possible to declare a Vorbis codebook containing a single codework
2788 entry. A single-entry codebook may be either a fully populated codebook with
2789 <span
2790class="cmtt-12">[codebook</span><span
2791class="cmtt-12">_entries] </span>set to 1, or a sparse codebook marking only one entry
2792 used. Note that it is not possible to also encode a <span
2793class="cmtt-12">[codeword</span><span
2794class="cmtt-12">_length] </span>of zero
2795 for the single used codeword, as the unsigned value written to the stream
2796 is <span
2797class="cmtt-12">[codeword</span><span
2798class="cmtt-12">_length]-1</span>. Instead, encoder implementations should indicate a
2799 <span
2800class="cmtt-12">[codeword</span><span
2801class="cmtt-12">_length] </span>of 1 and &#8217;write&#8217; the codeword to a stream during audio
2802 encoding by writing a single zero bit.
2803 <!--l. 329--><p class="noindent" >Decoder implementations shall reject a codebook if it contains only one used
2804 entry and the encoded <span
2805class="cmtt-12">[codeword</span><span
2806class="cmtt-12">_length] </span>of that entry is not 1. &#8217;Reading&#8217; a
2807 value from single-entry codebook always returns the single used codeword value
2808 and sinks one bit. Decoders should tolerate that the bit read from the stream
2809 be &#8217;1&#8217; instead of &#8217;0&#8217;; both values shall return the single used codeword.</div>
2810<!--l. 331--><p class="noindent" ><span class="paragraphHead"><a
2811 id="x1-550003.2.1"></a><span
2812class="cmbx-12">VQ lookup table vector representation</span></span>
2813Unpacking the VQ lookup table vectors relies on the following values:
2814
2815
2816
2817<div class="fancyvrb" id="fancyvrb17"><a
2818 id="x1-55002r1"></a><span
2819class="cmr-6">1</span><span
2820class="cmtt-8">the</span><span
2821class="cmtt-8">&#x00A0;[codebook\_multiplicands]</span><span
2822class="cmtt-8">&#x00A0;array</span><br class="fancyvrb" /><a
2823 id="x1-55004r2"></a><span
2824class="cmr-6">2</span><span
2825class="cmtt-8">[codebook\_minimum\_value]</span><br class="fancyvrb" /><a
2826 id="x1-55006r3"></a><span
2827class="cmr-6">3</span><span
2828class="cmtt-8">[codebook\_delta\_value]</span><br class="fancyvrb" /><a
2829 id="x1-55008r4"></a><span
2830class="cmr-6">4</span><span
2831class="cmtt-8">[codebook\_sequence\_p]</span>
2832<br class="fancyvrb" /><a
2833 id="x1-55010r5"></a><span
2834class="cmr-6">5</span><span
2835class="cmtt-8">[codebook\_lookup\_type]</span><br class="fancyvrb" /><a
2836 id="x1-55012r6"></a><span
2837class="cmr-6">6</span><span
2838class="cmtt-8">[codebook\_entries]</span><br class="fancyvrb" /><a
2839 id="x1-55014r7"></a><span
2840class="cmr-6">7</span><span
2841class="cmtt-8">[codebook\_dimensions]</span><br class="fancyvrb" /><a
2842 id="x1-55016r8"></a><span
2843class="cmr-6">8</span><span
2844class="cmtt-8">[codebook\_lookup\_values]</span></div>
2845<!--l. 347--><p class="noindent" >Decoding (unpacking) a specific vector in the vector lookup table proceeds according to
2846<span
2847class="cmtt-12">[codebook</span><span
2848class="cmtt-12">_lookup</span><span
2849class="cmtt-12">_type]</span>. The unpacked vector values are what a codebook would return
2850during audio packet decode in a VQ context.
2851<!--l. 352--><p class="noindent" ><span class="paragraphHead"><a
2852 id="x1-560003.2.1"></a><span
2853class="cmbx-12">Vector value decode: Lookup type 1</span></span>
2854Lookup type one specifies a lattice VQ lookup table built algorithmically from a list of
2855scalar values. Calculate (unpack) the final values of a codebook entry vector from
2856the entries in <span
2857class="cmtt-12">[codebook</span><span
2858class="cmtt-12">_multiplicands] </span>as follows (<span
2859class="cmtt-12">[value</span><span
2860class="cmtt-12">_vector] </span>is the output
2861vector representing the vector of values for entry number <span
2862class="cmtt-12">[lookup</span><span
2863class="cmtt-12">_offset] </span>in this
2864codebook):
2865<!--l. 361--><p class="noindent" >
2866<div class="fancyvrb" id="fancyvrb18"><a
2867 id="x1-56002r1"></a><span
2868class="cmr-6">1</span><span
2869class="cmtt-8">&#x00A0;</span><span
2870class="cmtt-8">&#x00A0;1)</span><span
2871class="cmtt-8">&#x00A0;[last]</span><span
2872class="cmtt-8">&#x00A0;=</span><span
2873class="cmtt-8">&#x00A0;0;</span><br class="fancyvrb" /><a
2874 id="x1-56004r2"></a><span
2875class="cmr-6">2</span><span
2876class="cmtt-8">&#x00A0;</span><span
2877class="cmtt-8">&#x00A0;2)</span><span
2878class="cmtt-8">&#x00A0;[index</span><span
2879class="cmtt-8">_divisor]</span><span
2880class="cmtt-8">&#x00A0;=</span><span
2881class="cmtt-8">&#x00A0;1;</span><br class="fancyvrb" /><a
2882 id="x1-56006r3"></a><span
2883class="cmr-6">3</span><span
2884class="cmtt-8">&#x00A0;</span><span
2885class="cmtt-8">&#x00A0;3)</span><span
2886class="cmtt-8">&#x00A0;iterate</span><span
2887class="cmtt-8">&#x00A0;[i]</span><span
2888class="cmtt-8">&#x00A0;over</span><span
2889class="cmtt-8">&#x00A0;the</span><span
2890class="cmtt-8">&#x00A0;range</span><span
2891class="cmtt-8">&#x00A0;0</span><span
2892class="cmtt-8">&#x00A0;...</span><span
2893class="cmtt-8">&#x00A0;[codebook</span><span
2894class="cmtt-8">_dimensions]-1</span><span
2895class="cmtt-8">&#x00A0;(once</span><span
2896class="cmtt-8">&#x00A0;for</span><span
2897class="cmtt-8">&#x00A0;each</span><span
2898class="cmtt-8">&#x00A0;scalar</span><span
2899class="cmtt-8">&#x00A0;value</span><span
2900class="cmtt-8">&#x00A0;in</span><span
2901class="cmtt-8">&#x00A0;the</span><span
2902class="cmtt-8">&#x00A0;value</span><span
2903class="cmtt-8">&#x00A0;vector)</span><span
2904class="cmtt-8">&#x00A0;</span><span
2905class="cmsy-8">{</span><br class="fancyvrb" /><a
2906 id="x1-56008r4"></a><span
2907class="cmr-6">4</span>
2908<br class="fancyvrb" /><a
2909 id="x1-56010r5"></a><span
2910class="cmr-6">5</span><span
2911class="cmtt-8">&#x00A0;</span><span
2912class="cmtt-8">&#x00A0;</span><span
2913class="cmtt-8">&#x00A0;</span><span
2914class="cmtt-8">&#x00A0;</span><span
2915class="cmtt-8">&#x00A0;</span><span
2916class="cmtt-8">&#x00A0;</span><span
2917class="cmtt-8">&#x00A0;4)</span><span
2918class="cmtt-8">&#x00A0;[multiplicand</span><span
2919class="cmtt-8">_offset]</span><span
2920class="cmtt-8">&#x00A0;=</span><span
2921class="cmtt-8">&#x00A0;(</span><span
2922class="cmtt-8">&#x00A0;[lookup</span><span
2923class="cmtt-8">_offset]</span><span
2924class="cmtt-8">&#x00A0;divided</span><span
2925class="cmtt-8">&#x00A0;by</span><span
2926class="cmtt-8">&#x00A0;[index</span><span
2927class="cmtt-8">_divisor]</span><span
2928class="cmtt-8">&#x00A0;using</span><span
2929class="cmtt-8">&#x00A0;integer</span>
2930<br class="fancyvrb" /><a
2931 id="x1-56012r6"></a><span
2932class="cmr-6">6</span><span
2933class="cmtt-8">&#x00A0;</span><span
2934class="cmtt-8">&#x00A0;</span><span
2935class="cmtt-8">&#x00A0;</span><span
2936class="cmtt-8">&#x00A0;</span><span
2937class="cmtt-8">&#x00A0;</span><span
2938class="cmtt-8">&#x00A0;</span><span
2939class="cmtt-8">&#x00A0;</span><span
2940class="cmtt-8">&#x00A0;</span><span
2941class="cmtt-8">&#x00A0;</span><span
2942class="cmtt-8">&#x00A0;division</span><span
2943class="cmtt-8">&#x00A0;)</span><span
2944class="cmtt-8">&#x00A0;integer</span><span
2945class="cmtt-8">&#x00A0;modulo</span><span
2946class="cmtt-8">&#x00A0;[codebook</span><span
2947class="cmtt-8">_lookup</span><span
2948class="cmtt-8">_values]</span><br class="fancyvrb" /><a
2949 id="x1-56014r7"></a><span
2950class="cmr-6">7</span><br class="fancyvrb" /><a
2951 id="x1-56016r8"></a><span
2952class="cmr-6">8</span><span
2953class="cmtt-8">&#x00A0;</span><span
2954class="cmtt-8">&#x00A0;</span><span
2955class="cmtt-8">&#x00A0;</span><span
2956class="cmtt-8">&#x00A0;</span><span
2957class="cmtt-8">&#x00A0;</span><span
2958class="cmtt-8">&#x00A0;</span><span
2959class="cmtt-8">&#x00A0;5)</span><span
2960class="cmtt-8">&#x00A0;vector</span><span
2961class="cmtt-8">&#x00A0;[value</span><span
2962class="cmtt-8">_vector]</span><span
2963class="cmtt-8">&#x00A0;element</span><span
2964class="cmtt-8">&#x00A0;[i]</span><span
2965class="cmtt-8">&#x00A0;=</span>
2966<br class="fancyvrb" /><a
2967 id="x1-56018r9"></a><span
2968class="cmr-6">9</span><span
2969class="cmtt-8">&#x00A0;</span><span
2970class="cmtt-8">&#x00A0;</span><span
2971class="cmtt-8">&#x00A0;</span><span
2972class="cmtt-8">&#x00A0;</span><span
2973class="cmtt-8">&#x00A0;</span><span
2974class="cmtt-8">&#x00A0;</span><span
2975class="cmtt-8">&#x00A0;</span><span
2976class="cmtt-8">&#x00A0;</span><span
2977class="cmtt-8">&#x00A0;</span><span
2978class="cmtt-8">&#x00A0;</span><span
2979class="cmtt-8">&#x00A0;</span><span
2980class="cmtt-8">&#x00A0;(</span><span
2981class="cmtt-8">&#x00A0;[codebook</span><span
2982class="cmtt-8">_multiplicands]</span><span
2983class="cmtt-8">&#x00A0;array</span><span
2984class="cmtt-8">&#x00A0;element</span><span
2985class="cmtt-8">&#x00A0;number</span><span
2986class="cmtt-8">&#x00A0;[multiplicand</span><span
2987class="cmtt-8">_offset]</span><span
2988class="cmtt-8">&#x00A0;)</span><span
2989class="cmtt-8">&#x00A0;*</span>
2990<br class="fancyvrb" /><a
2991 id="x1-56020r10"></a><span
2992class="cmr-6">10</span><span
2993class="cmtt-8">&#x00A0;</span><span
2994class="cmtt-8">&#x00A0;</span><span
2995class="cmtt-8">&#x00A0;</span><span
2996class="cmtt-8">&#x00A0;</span><span
2997class="cmtt-8">&#x00A0;</span><span
2998class="cmtt-8">&#x00A0;</span><span
2999class="cmtt-8">&#x00A0;</span><span
3000class="cmtt-8">&#x00A0;</span><span
3001class="cmtt-8">&#x00A0;</span><span
3002class="cmtt-8">&#x00A0;</span><span
3003class="cmtt-8">&#x00A0;</span><span
3004class="cmtt-8">&#x00A0;[codebook</span><span
3005class="cmtt-8">_delta</span><span
3006class="cmtt-8">_value]</span><span
3007class="cmtt-8">&#x00A0;+</span><span
3008class="cmtt-8">&#x00A0;[codebook</span><span
3009class="cmtt-8">_minimum</span><span
3010class="cmtt-8">_value]</span><span
3011class="cmtt-8">&#x00A0;+</span><span
3012class="cmtt-8">&#x00A0;[last];</span><br class="fancyvrb" /><a
3013 id="x1-56022r11"></a><span
3014class="cmr-6">11</span>
3015<br class="fancyvrb" /><a
3016 id="x1-56024r12"></a><span
3017class="cmr-6">12</span><span
3018class="cmtt-8">&#x00A0;</span><span
3019class="cmtt-8">&#x00A0;</span><span
3020class="cmtt-8">&#x00A0;</span><span
3021class="cmtt-8">&#x00A0;</span><span
3022class="cmtt-8">&#x00A0;</span><span
3023class="cmtt-8">&#x00A0;</span><span
3024class="cmtt-8">&#x00A0;6)</span><span
3025class="cmtt-8">&#x00A0;if</span><span
3026class="cmtt-8">&#x00A0;(</span><span
3027class="cmtt-8">&#x00A0;[codebook</span><span
3028class="cmtt-8">_sequence</span><span
3029class="cmtt-8">_p]</span><span
3030class="cmtt-8">&#x00A0;is</span><span
3031class="cmtt-8">&#x00A0;set</span><span
3032class="cmtt-8">&#x00A0;)</span><span
3033class="cmtt-8">&#x00A0;then</span><span
3034class="cmtt-8">&#x00A0;set</span><span
3035class="cmtt-8">&#x00A0;[last]</span><span
3036class="cmtt-8">&#x00A0;=</span><span
3037class="cmtt-8">&#x00A0;vector</span><span
3038class="cmtt-8">&#x00A0;[value</span><span
3039class="cmtt-8">_vector]</span><span
3040class="cmtt-8">&#x00A0;element</span><span
3041class="cmtt-8">&#x00A0;[i]</span><br class="fancyvrb" /><a
3042 id="x1-56026r13"></a><span
3043class="cmr-6">13</span>
3044<br class="fancyvrb" /><a
3045 id="x1-56028r14"></a><span
3046class="cmr-6">14</span><span
3047class="cmtt-8">&#x00A0;</span><span
3048class="cmtt-8">&#x00A0;</span><span
3049class="cmtt-8">&#x00A0;</span><span
3050class="cmtt-8">&#x00A0;</span><span
3051class="cmtt-8">&#x00A0;</span><span
3052class="cmtt-8">&#x00A0;</span><span
3053class="cmtt-8">&#x00A0;7)</span><span
3054class="cmtt-8">&#x00A0;[index</span><span
3055class="cmtt-8">_divisor]</span><span
3056class="cmtt-8">&#x00A0;=</span><span
3057class="cmtt-8">&#x00A0;[index</span><span
3058class="cmtt-8">_divisor]</span><span
3059class="cmtt-8">&#x00A0;*</span><span
3060class="cmtt-8">&#x00A0;[codebook</span><span
3061class="cmtt-8">_lookup</span><span
3062class="cmtt-8">_values]</span><br class="fancyvrb" /><a
3063 id="x1-56030r15"></a><span
3064class="cmr-6">15</span><br class="fancyvrb" /><a
3065 id="x1-56032r16"></a><span
3066class="cmr-6">16</span><span
3067class="cmtt-8">&#x00A0;</span><span
3068class="cmtt-8">&#x00A0;</span><span
3069class="cmtt-8">&#x00A0;</span><span
3070class="cmtt-8">&#x00A0;</span><span
3071class="cmtt-8">&#x00A0;</span><span
3072class="cmsy-8">}</span><br class="fancyvrb" /><a
3073 id="x1-56034r17"></a><span
3074class="cmr-6">17</span><br class="fancyvrb" /><a
3075 id="x1-56036r18"></a><span
3076class="cmr-6">18</span><span
3077class="cmtt-8">&#x00A0;</span><span
3078class="cmtt-8">&#x00A0;8)</span><span
3079class="cmtt-8">&#x00A0;vector</span><span
3080class="cmtt-8">&#x00A0;calculation</span><span
3081class="cmtt-8">&#x00A0;completed.</span></div>
3082<!--l. 384--><p class="noindent" ><span class="paragraphHead"><a
3083 id="x1-570003.2.1"></a><span
3084class="cmbx-12">Vector value decode: Lookup type 2</span></span>
3085Lookup type two specifies a VQ lookup table in which each scalar in each vector is explicitly set
3086by the <span
3087class="cmtt-12">[codebook</span><span
3088class="cmtt-12">_multiplicands] </span>array in a one-to-one mapping. Calculate [unpack] the final
3089values of a codebook entry vector from the entries in <span
3090class="cmtt-12">[codebook</span><span
3091class="cmtt-12">_multiplicands] </span>as follows
3092(<span
3093class="cmtt-12">[value</span><span
3094class="cmtt-12">_vector] </span>is the output vector representing the vector of values for entry number
3095<span
3096class="cmtt-12">[lookup</span><span
3097class="cmtt-12">_offset] </span>in this codebook):
3098<!--l. 394--><p class="noindent" >
3099<div class="fancyvrb" id="fancyvrb19"><a
3100 id="x1-57002r1"></a><span
3101class="cmr-6">1</span><span
3102class="cmtt-8">&#x00A0;</span><span
3103class="cmtt-8">&#x00A0;1)</span><span
3104class="cmtt-8">&#x00A0;[last]</span><span
3105class="cmtt-8">&#x00A0;=</span><span
3106class="cmtt-8">&#x00A0;0;</span><br class="fancyvrb" /><a
3107 id="x1-57004r2"></a><span
3108class="cmr-6">2</span><span
3109class="cmtt-8">&#x00A0;</span><span
3110class="cmtt-8">&#x00A0;2)</span><span
3111class="cmtt-8">&#x00A0;[multiplicand</span><span
3112class="cmtt-8">_offset]</span><span
3113class="cmtt-8">&#x00A0;=</span><span
3114class="cmtt-8">&#x00A0;[lookup</span><span
3115class="cmtt-8">_offset]</span><span
3116class="cmtt-8">&#x00A0;*</span><span
3117class="cmtt-8">&#x00A0;[codebook</span><span
3118class="cmtt-8">_dimensions]</span>
3119<br class="fancyvrb" /><a
3120 id="x1-57006r3"></a><span
3121class="cmr-6">3</span><span
3122class="cmtt-8">&#x00A0;</span><span
3123class="cmtt-8">&#x00A0;3)</span><span
3124class="cmtt-8">&#x00A0;iterate</span><span
3125class="cmtt-8">&#x00A0;[i]</span><span
3126class="cmtt-8">&#x00A0;over</span><span
3127class="cmtt-8">&#x00A0;the</span><span
3128class="cmtt-8">&#x00A0;range</span><span
3129class="cmtt-8">&#x00A0;0</span><span
3130class="cmtt-8">&#x00A0;...</span><span
3131class="cmtt-8">&#x00A0;[codebook</span><span
3132class="cmtt-8">_dimensions]-1</span><span
3133class="cmtt-8">&#x00A0;(once</span><span
3134class="cmtt-8">&#x00A0;for</span><span
3135class="cmtt-8">&#x00A0;each</span><span
3136class="cmtt-8">&#x00A0;scalar</span><span
3137class="cmtt-8">&#x00A0;value</span><span
3138class="cmtt-8">&#x00A0;in</span><span
3139class="cmtt-8">&#x00A0;the</span><span
3140class="cmtt-8">&#x00A0;value</span><span
3141class="cmtt-8">&#x00A0;vector)</span><span
3142class="cmtt-8">&#x00A0;</span><span
3143class="cmsy-8">{</span><br class="fancyvrb" /><a
3144 id="x1-57008r4"></a><span
3145class="cmr-6">4</span>
3146<br class="fancyvrb" /><a
3147 id="x1-57010r5"></a><span
3148class="cmr-6">5</span><span
3149class="cmtt-8">&#x00A0;</span><span
3150class="cmtt-8">&#x00A0;</span><span
3151class="cmtt-8">&#x00A0;</span><span
3152class="cmtt-8">&#x00A0;</span><span
3153class="cmtt-8">&#x00A0;</span><span
3154class="cmtt-8">&#x00A0;</span><span
3155class="cmtt-8">&#x00A0;4)</span><span
3156class="cmtt-8">&#x00A0;vector</span><span
3157class="cmtt-8">&#x00A0;[value</span><span
3158class="cmtt-8">_vector]</span><span
3159class="cmtt-8">&#x00A0;element</span><span
3160class="cmtt-8">&#x00A0;[i]</span><span
3161class="cmtt-8">&#x00A0;=</span><br class="fancyvrb" /><a
3162 id="x1-57012r6"></a><span
3163class="cmr-6">6</span><span
3164class="cmtt-8">&#x00A0;</span><span
3165class="cmtt-8">&#x00A0;</span><span
3166class="cmtt-8">&#x00A0;</span><span
3167class="cmtt-8">&#x00A0;</span><span
3168class="cmtt-8">&#x00A0;</span><span
3169class="cmtt-8">&#x00A0;</span><span
3170class="cmtt-8">&#x00A0;</span><span
3171class="cmtt-8">&#x00A0;</span><span
3172class="cmtt-8">&#x00A0;</span><span
3173class="cmtt-8">&#x00A0;</span><span
3174class="cmtt-8">&#x00A0;</span><span
3175class="cmtt-8">&#x00A0;(</span><span
3176class="cmtt-8">&#x00A0;[codebook</span><span
3177class="cmtt-8">_multiplicands]</span><span
3178class="cmtt-8">&#x00A0;array</span><span
3179class="cmtt-8">&#x00A0;element</span><span
3180class="cmtt-8">&#x00A0;number</span><span
3181class="cmtt-8">&#x00A0;[multiplicand</span><span
3182class="cmtt-8">_offset]</span><span
3183class="cmtt-8">&#x00A0;)</span><span
3184class="cmtt-8">&#x00A0;*</span>
3185<br class="fancyvrb" /><a
3186 id="x1-57014r7"></a><span
3187class="cmr-6">7</span><span
3188class="cmtt-8">&#x00A0;</span><span
3189class="cmtt-8">&#x00A0;</span><span
3190class="cmtt-8">&#x00A0;</span><span
3191class="cmtt-8">&#x00A0;</span><span
3192class="cmtt-8">&#x00A0;</span><span
3193class="cmtt-8">&#x00A0;</span><span
3194class="cmtt-8">&#x00A0;</span><span
3195class="cmtt-8">&#x00A0;</span><span
3196class="cmtt-8">&#x00A0;</span><span
3197class="cmtt-8">&#x00A0;</span><span
3198class="cmtt-8">&#x00A0;</span><span
3199class="cmtt-8">&#x00A0;[codebook</span><span
3200class="cmtt-8">_delta</span><span
3201class="cmtt-8">_value]</span><span
3202class="cmtt-8">&#x00A0;+</span><span
3203class="cmtt-8">&#x00A0;[codebook</span><span
3204class="cmtt-8">_minimum</span><span
3205class="cmtt-8">_value]</span><span
3206class="cmtt-8">&#x00A0;+</span><span
3207class="cmtt-8">&#x00A0;[last];</span><br class="fancyvrb" /><a
3208 id="x1-57016r8"></a><span
3209class="cmr-6">8</span>
3210<br class="fancyvrb" /><a
3211 id="x1-57018r9"></a><span
3212class="cmr-6">9</span><span
3213class="cmtt-8">&#x00A0;</span><span
3214class="cmtt-8">&#x00A0;</span><span
3215class="cmtt-8">&#x00A0;</span><span
3216class="cmtt-8">&#x00A0;</span><span
3217class="cmtt-8">&#x00A0;</span><span
3218class="cmtt-8">&#x00A0;</span><span
3219class="cmtt-8">&#x00A0;5)</span><span
3220class="cmtt-8">&#x00A0;if</span><span
3221class="cmtt-8">&#x00A0;(</span><span
3222class="cmtt-8">&#x00A0;[codebook</span><span
3223class="cmtt-8">_sequence</span><span
3224class="cmtt-8">_p]</span><span
3225class="cmtt-8">&#x00A0;is</span><span
3226class="cmtt-8">&#x00A0;set</span><span
3227class="cmtt-8">&#x00A0;)</span><span
3228class="cmtt-8">&#x00A0;then</span><span
3229class="cmtt-8">&#x00A0;set</span><span
3230class="cmtt-8">&#x00A0;[last]</span><span
3231class="cmtt-8">&#x00A0;=</span><span
3232class="cmtt-8">&#x00A0;vector</span><span
3233class="cmtt-8">&#x00A0;[value</span><span
3234class="cmtt-8">_vector]</span><span
3235class="cmtt-8">&#x00A0;element</span><span
3236class="cmtt-8">&#x00A0;[i]</span><br class="fancyvrb" /><a
3237 id="x1-57020r10"></a><span
3238class="cmr-6">10</span>
3239<br class="fancyvrb" /><a
3240 id="x1-57022r11"></a><span
3241class="cmr-6">11</span><span
3242class="cmtt-8">&#x00A0;</span><span
3243class="cmtt-8">&#x00A0;</span><span
3244class="cmtt-8">&#x00A0;</span><span
3245class="cmtt-8">&#x00A0;</span><span
3246class="cmtt-8">&#x00A0;</span><span
3247class="cmtt-8">&#x00A0;</span><span
3248class="cmtt-8">&#x00A0;6)</span><span
3249class="cmtt-8">&#x00A0;increment</span><span
3250class="cmtt-8">&#x00A0;[multiplicand</span><span
3251class="cmtt-8">_offset]</span><br class="fancyvrb" /><a
3252 id="x1-57024r12"></a><span
3253class="cmr-6">12</span><br class="fancyvrb" /><a
3254 id="x1-57026r13"></a><span
3255class="cmr-6">13</span><span
3256class="cmtt-8">&#x00A0;</span><span
3257class="cmtt-8">&#x00A0;</span><span
3258class="cmtt-8">&#x00A0;</span><span
3259class="cmtt-8">&#x00A0;</span><span
3260class="cmtt-8">&#x00A0;</span><span
3261class="cmsy-8">}</span><br class="fancyvrb" /><a
3262 id="x1-57028r14"></a><span
3263class="cmr-6">14</span><br class="fancyvrb" /><a
3264 id="x1-57030r15"></a><span
3265class="cmr-6">15</span><span
3266class="cmtt-8">&#x00A0;</span><span
3267class="cmtt-8">&#x00A0;7)</span><span
3268class="cmtt-8">&#x00A0;vector</span><span
3269class="cmtt-8">&#x00A0;calculation</span><span
3270class="cmtt-8">&#x00A0;completed.</span></div>
3271
3272
3273
3274<!--l. 420--><p class="noindent" >
3275<h4 class="subsectionHead"><span class="titlemark">3.3. </span> <a
3276 id="x1-580003.3"></a>Use of the codebook abstraction</h4>
3277<!--l. 422--><p class="noindent" >The decoder uses the codebook abstraction much as it does the bit-unpacking convention; a
3278specific codebook reads a codeword from the bitstream, decoding it into an entry number, and
3279then returns that entry number to the decoder (when used in a scalar entropy coding context), or
3280uses that entry number as an offset into the VQ lookup table, returning a vector of values (when
3281used in a context desiring a VQ value). Scalar or VQ context is always explicit; any
3282call to the codebook mechanism requests either a scalar entry number or a lookup
3283vector.
3284<!--l. 432--><p class="noindent" >Note that VQ lookup type zero indicates that there is no lookup table; requesting
3285decode using a codebook of lookup type 0 in any context expecting a vector return
3286value (even in a case where a vector of dimension one) is forbidden. If decoder setup
3287or decode requests such an action, that is an error condition rendering the packet
3288undecodable.
3289<!--l. 439--><p class="noindent" >Using a codebook to read from the packet bitstream consists first of reading and decoding the
3290next codeword in the bitstream. The decoder reads bits until the accumulated bits match a
3291codeword in the codebook. This process can be though of as logically walking the
3292Huffman decode tree by reading one bit at a time from the bitstream, and using the
3293bit as a decision boolean to take the 0 branch (left in the above examples) or the 1
3294branch (right in the above examples). Walking the tree finishes when the decode process
3295hits a leaf in the decision tree; the result is the entry number corresponding to that
3296leaf. Reading past the end of a packet propagates the &#8217;end-of-stream&#8217; condition to the
3297decoder.
3298<!--l. 451--><p class="noindent" >When used in a scalar context, the resulting codeword entry is the desired return
3299value.
3300<!--l. 454--><p class="noindent" >When used in a VQ context, the codeword entry number is used as an offset into the VQ lookup
3301table. The value returned to the decoder is the vector of scalars corresponding to this
3302offset.
3303
3304
3305
3306
3307
3308
3309<h3 class="sectionHead"><span class="titlemark">4. </span> <a
3310 id="x1-590004"></a>Codec Setup and Packet Decode</h3>
3311<!--l. 6--><p class="noindent" >
3312<h4 class="subsectionHead"><span class="titlemark">4.1. </span> <a
3313 id="x1-600004.1"></a>Overview</h4>
3314<!--l. 8--><p class="noindent" >This document serves as the top-level reference document for the bit-by-bit decode specification
3315of Vorbis I. This document assumes a high-level understanding of the Vorbis decode
3316process, which is provided in <a
3317href="#x1-20001">section&#x00A0;1</a>, &#8220;<a
3318href="#x1-20001">Introduction and Description<!--tex4ht:ref: vorbis:spec:intro --></a>&#8221;. <a
3319href="#x1-360002">section&#x00A0;2</a>,
3320&#8220;<a
3321href="#x1-360002">Bitpacking Convention<!--tex4ht:ref: vorbis:spec:bitpacking --></a>&#8221; covers reading and writing bit fields from and to bitstream
3322packets.
3323<!--l. 16--><p class="noindent" >
3324<h4 class="subsectionHead"><span class="titlemark">4.2. </span> <a
3325 id="x1-610004.2"></a>Header decode and decode setup</h4>
3326<!--l. 18--><p class="noindent" >A Vorbis bitstream begins with three header packets. The header packets are, in order, the
3327identification header, the comments header, and the setup header. All are required for decode
3328compliance. An end-of-packet condition during decoding the first or third header packet renders
3329the stream undecodable. End-of-packet decoding the comment header is a non-fatal error
3330condition.
3331<!--l. 25--><p class="noindent" >
3332<h5 class="subsubsectionHead"><span class="titlemark">4.2.1. </span> <a
3333 id="x1-620004.2.1"></a>Common header decode</h5>
3334<!--l. 27--><p class="noindent" >Each header packet begins with the same header fields.
3335<!--l. 30--><p class="noindent" >
3336<div class="fancyvrb" id="fancyvrb20"><a
3337 id="x1-62002r1"></a><span
3338class="cmr-6">1</span><span
3339class="cmtt-8">&#x00A0;</span><span
3340class="cmtt-8">&#x00A0;1)</span><span
3341class="cmtt-8">&#x00A0;[packet</span><span
3342class="cmtt-8">_type]</span><span
3343class="cmtt-8">&#x00A0;:</span><span
3344class="cmtt-8">&#x00A0;8</span><span
3345class="cmtt-8">&#x00A0;bit</span><span
3346class="cmtt-8">&#x00A0;value</span><br class="fancyvrb" /><a
3347 id="x1-62004r2"></a><span
3348class="cmr-6">2</span><span
3349class="cmtt-8">&#x00A0;</span><span
3350class="cmtt-8">&#x00A0;2)</span><span
3351class="cmtt-8">&#x00A0;0x76,</span><span
3352class="cmtt-8">&#x00A0;0x6f,</span><span
3353class="cmtt-8">&#x00A0;0x72,</span><span
3354class="cmtt-8">&#x00A0;0x62,</span><span
3355class="cmtt-8">&#x00A0;0x69,</span><span
3356class="cmtt-8">&#x00A0;0x73:</span><span
3357class="cmtt-8">&#x00A0;the</span><span
3358class="cmtt-8">&#x00A0;characters</span><span
3359class="cmtt-8">&#x00A0;&#8217;v&#8217;,&#8217;o&#8217;,&#8217;r&#8217;,&#8217;b&#8217;,&#8217;i&#8217;,&#8217;s&#8217;</span><span
3360class="cmtt-8">&#x00A0;as</span><span
3361class="cmtt-8">&#x00A0;six</span><span
3362class="cmtt-8">&#x00A0;octets</span></div>
3363<!--l. 35--><p class="noindent" >Decode continues according to packet type; the identification header is type 1, the comment
3364header type 3 and the setup header type 5 (these types are all odd as a packet with a leading
3365single bit of &#8217;0&#8217; is an audio packet). The packets must occur in the order of identification,
3366
3367
3368
3369comment, setup.
3370<!--l. 43--><p class="noindent" >
3371<h5 class="subsubsectionHead"><span class="titlemark">4.2.2. </span> <a
3372 id="x1-630004.2.2"></a>Identification header</h5>
3373<!--l. 45--><p class="noindent" >The identification header is a short header of only a few fields used to declare the stream
3374definitively as Vorbis, and provide a few externally relevant pieces of information about the audio
3375stream. The identification header is coded as follows:
3376<!--l. 50--><p class="noindent" >
3377<div class="fancyvrb" id="fancyvrb21"><a
3378 id="x1-63002r1"></a><span
3379class="cmr-6">1</span><span
3380class="cmtt-8">&#x00A0;1)</span><span
3381class="cmtt-8">&#x00A0;[vorbis</span><span
3382class="cmtt-8">_version]</span><span
3383class="cmtt-8">&#x00A0;=</span><span
3384class="cmtt-8">&#x00A0;read</span><span
3385class="cmtt-8">&#x00A0;32</span><span
3386class="cmtt-8">&#x00A0;bits</span><span
3387class="cmtt-8">&#x00A0;as</span><span
3388class="cmtt-8">&#x00A0;unsigned</span><span
3389class="cmtt-8">&#x00A0;integer</span><br class="fancyvrb" /><a
3390 id="x1-63004r2"></a><span
3391class="cmr-6">2</span><span
3392class="cmtt-8">&#x00A0;2)</span><span
3393class="cmtt-8">&#x00A0;[audio</span><span
3394class="cmtt-8">_channels]</span><span
3395class="cmtt-8">&#x00A0;=</span><span
3396class="cmtt-8">&#x00A0;read</span><span
3397class="cmtt-8">&#x00A0;8</span><span
3398class="cmtt-8">&#x00A0;bit</span><span
3399class="cmtt-8">&#x00A0;integer</span><span
3400class="cmtt-8">&#x00A0;as</span><span
3401class="cmtt-8">&#x00A0;unsigned</span>
3402<br class="fancyvrb" /><a
3403 id="x1-63006r3"></a><span
3404class="cmr-6">3</span><span
3405class="cmtt-8">&#x00A0;3)</span><span
3406class="cmtt-8">&#x00A0;[audio</span><span
3407class="cmtt-8">_sample</span><span
3408class="cmtt-8">_rate]</span><span
3409class="cmtt-8">&#x00A0;=</span><span
3410class="cmtt-8">&#x00A0;read</span><span
3411class="cmtt-8">&#x00A0;32</span><span
3412class="cmtt-8">&#x00A0;bits</span><span
3413class="cmtt-8">&#x00A0;as</span><span
3414class="cmtt-8">&#x00A0;unsigned</span><span
3415class="cmtt-8">&#x00A0;integer</span><br class="fancyvrb" /><a
3416 id="x1-63008r4"></a><span
3417class="cmr-6">4</span><span
3418class="cmtt-8">&#x00A0;4)</span><span
3419class="cmtt-8">&#x00A0;[bitrate</span><span
3420class="cmtt-8">_maximum]</span><span
3421class="cmtt-8">&#x00A0;=</span><span
3422class="cmtt-8">&#x00A0;read</span><span
3423class="cmtt-8">&#x00A0;32</span><span
3424class="cmtt-8">&#x00A0;bits</span><span
3425class="cmtt-8">&#x00A0;as</span><span
3426class="cmtt-8">&#x00A0;signed</span><span
3427class="cmtt-8">&#x00A0;integer</span>
3428<br class="fancyvrb" /><a
3429 id="x1-63010r5"></a><span
3430class="cmr-6">5</span><span
3431class="cmtt-8">&#x00A0;5)</span><span
3432class="cmtt-8">&#x00A0;[bitrate</span><span
3433class="cmtt-8">_nominal]</span><span
3434class="cmtt-8">&#x00A0;=</span><span
3435class="cmtt-8">&#x00A0;read</span><span
3436class="cmtt-8">&#x00A0;32</span><span
3437class="cmtt-8">&#x00A0;bits</span><span
3438class="cmtt-8">&#x00A0;as</span><span
3439class="cmtt-8">&#x00A0;signed</span><span
3440class="cmtt-8">&#x00A0;integer</span><br class="fancyvrb" /><a
3441 id="x1-63012r6"></a><span
3442class="cmr-6">6</span><span
3443class="cmtt-8">&#x00A0;6)</span><span
3444class="cmtt-8">&#x00A0;[bitrate</span><span
3445class="cmtt-8">_minimum]</span><span
3446class="cmtt-8">&#x00A0;=</span><span
3447class="cmtt-8">&#x00A0;read</span><span
3448class="cmtt-8">&#x00A0;32</span><span
3449class="cmtt-8">&#x00A0;bits</span><span
3450class="cmtt-8">&#x00A0;as</span><span
3451class="cmtt-8">&#x00A0;signed</span><span
3452class="cmtt-8">&#x00A0;integer</span>
3453<br class="fancyvrb" /><a
3454 id="x1-63014r7"></a><span
3455class="cmr-6">7</span><span
3456class="cmtt-8">&#x00A0;7)</span><span
3457class="cmtt-8">&#x00A0;[blocksize</span><span
3458class="cmtt-8">_0]</span><span
3459class="cmtt-8">&#x00A0;=</span><span
3460class="cmtt-8">&#x00A0;2</span><span
3461class="cmtt-8">&#x00A0;exponent</span><span
3462class="cmtt-8">&#x00A0;(read</span><span
3463class="cmtt-8">&#x00A0;4</span><span
3464class="cmtt-8">&#x00A0;bits</span><span
3465class="cmtt-8">&#x00A0;as</span><span
3466class="cmtt-8">&#x00A0;unsigned</span><span
3467class="cmtt-8">&#x00A0;integer)</span><br class="fancyvrb" /><a
3468 id="x1-63016r8"></a><span
3469class="cmr-6">8</span><span
3470class="cmtt-8">&#x00A0;8)</span><span
3471class="cmtt-8">&#x00A0;[blocksize</span><span
3472class="cmtt-8">_1]</span><span
3473class="cmtt-8">&#x00A0;=</span><span
3474class="cmtt-8">&#x00A0;2</span><span
3475class="cmtt-8">&#x00A0;exponent</span><span
3476class="cmtt-8">&#x00A0;(read</span><span
3477class="cmtt-8">&#x00A0;4</span><span
3478class="cmtt-8">&#x00A0;bits</span><span
3479class="cmtt-8">&#x00A0;as</span><span
3480class="cmtt-8">&#x00A0;unsigned</span><span
3481class="cmtt-8">&#x00A0;integer)</span>
3482<br class="fancyvrb" /><a
3483 id="x1-63018r9"></a><span
3484class="cmr-6">9</span><span
3485class="cmtt-8">&#x00A0;9)</span><span
3486class="cmtt-8">&#x00A0;[framing</span><span
3487class="cmtt-8">_flag]</span><span
3488class="cmtt-8">&#x00A0;=</span><span
3489class="cmtt-8">&#x00A0;read</span><span
3490class="cmtt-8">&#x00A0;one</span><span
3491class="cmtt-8">&#x00A0;bit</span></div>
3492<!--l. 62--><p class="noindent" ><span
3493class="cmtt-12">[vorbis</span><span
3494class="cmtt-12">_version] </span>is to read &#8217;0&#8217; in order to be compatible with this document. Both
3495<span
3496class="cmtt-12">[audio</span><span
3497class="cmtt-12">_channels] </span>and <span
3498class="cmtt-12">[audio</span><span
3499class="cmtt-12">_sample</span><span
3500class="cmtt-12">_rate] </span>must read greater than zero. Allowed final
3501blocksize values are 64, 128, 256, 512, 1024, 2048, 4096 and 8192 in Vorbis I. <span
3502class="cmtt-12">[blocksize</span><span
3503class="cmtt-12">_0]</span>
3504must be less than or equal to <span
3505class="cmtt-12">[blocksize</span><span
3506class="cmtt-12">_1]</span>. The framing bit must be nonzero. Failure to meet
3507any of these conditions renders a stream undecodable.
3508<!--l. 70--><p class="noindent" >The bitrate fields above are used only as hints. The nominal bitrate field especially may be
3509considerably off in purely VBR streams. The fields are meaningful only when greater than
3510zero.
3511 <ul class="itemize1">
3512 <li class="itemize">All three fields set to the same value implies a fixed rate, or tightly bounded, nearly
3513 fixed-rate bitstream
3514 </li>
3515 <li class="itemize">Only nominal set implies a VBR or ABR stream that averages the nominal bitrate
3516 </li>
3517 <li class="itemize">Maximum and or minimum set implies a VBR bitstream that obeys the bitrate limits
3518 </li>
3519 <li class="itemize">None set indicates the encoder does not care to speculate.</li></ul>
3520
3521
3522
3523<!--l. 84--><p class="noindent" >
3524<h5 class="subsubsectionHead"><span class="titlemark">4.2.3. </span> <a
3525 id="x1-640004.2.3"></a>Comment header</h5>
3526<!--l. 85--><p class="noindent" >Comment header decode and data specification is covered in <a
3527href="#x1-820005">section&#x00A0;5</a>, &#8220;<a
3528href="#x1-820005">comment field and
3529header specification<!--tex4ht:ref: vorbis:spec:comment --></a>&#8221;.
3530<!--l. 89--><p class="noindent" >
3531<h5 class="subsubsectionHead"><span class="titlemark">4.2.4. </span> <a
3532 id="x1-650004.2.4"></a>Setup header</h5>
3533<!--l. 91--><p class="noindent" >Vorbis codec setup is configurable to an extreme degree:
3534<div class="center"
3535>
3536<!--l. 93--><p class="noindent" >
3537
3538<!--l. 94--><p class="noindent" ><img
3539src="components.png" alt="PIC"
3540>
3541<br /> <div class="caption"
3542><span class="id">Figure&#x00A0;6: </span><span
3543class="content">decoder pipeline configuration</span></div><!--tex4ht:label?: x1-650016 -->
3544</div>
3545<!--l. 99--><p class="noindent" >The setup header contains the bulk of the codec setup information needed for decode. The setup
3546header contains, in order, the lists of codebook configurations, time-domain transform
3547configurations (placeholders in Vorbis I), floor configurations, residue configurations, channel
3548mapping configurations and mode configurations. It finishes with a framing bit of &#8217;1&#8217;. Header
3549decode proceeds in the following order:
3550<!--l. 107--><p class="noindent" ><span class="paragraphHead"><a
3551 id="x1-660004.2.4"></a><span
3552class="cmbx-12">Codebooks</span></span>
3553 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3554 1. </dt><dd
3555class="enumerate-enumitem"><span
3556class="cmtt-12">[vorbis</span><span
3557class="cmtt-12">_codebook</span><span
3558class="cmtt-12">_count] </span>= read eight bits as unsigned integer and add one
3559 </dd><dt class="enumerate-enumitem">
3560 2. </dt><dd
3561class="enumerate-enumitem">Decode <span
3562class="cmtt-12">[vorbis</span><span
3563class="cmtt-12">_codebook</span><span
3564class="cmtt-12">_count] </span>codebooks in order as defined in <a
3565href="#x1-470003">section&#x00A0;3</a>,
3566 &#8220;<a
3567href="#x1-470003">Probability Model and Codebooks<!--tex4ht:ref: vorbis:spec:codebook --></a>&#8221;. Save each configuration, in order, in an array
3568 of codebook configurations <span
3569class="cmtt-12">[vorbis</span><span
3570class="cmtt-12">_codebook</span><span
3571class="cmtt-12">_configurations]</span>.</dd></dl>
3572
3573
3574
3575<!--l. 119--><p class="noindent" ><span class="paragraphHead"><a
3576 id="x1-670004.2.4"></a><span
3577class="cmbx-12">Time domain transforms</span></span>
3578These hooks are placeholders in Vorbis I. Nevertheless, the configuration placeholder values must
3579be read to maintain bitstream sync.
3580<!--l. 126--><p class="noindent" >
3581 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3582 1. </dt><dd
3583class="enumerate-enumitem"><span
3584class="cmtt-12">[vorbis</span><span
3585class="cmtt-12">_time</span><span
3586class="cmtt-12">_count] </span>= read 6 bits as unsigned integer and add one
3587 </dd><dt class="enumerate-enumitem">
3588 2. </dt><dd
3589class="enumerate-enumitem">read <span
3590class="cmtt-12">[vorbis</span><span
3591class="cmtt-12">_time</span><span
3592class="cmtt-12">_count] </span>16 bit values; each value should be zero. If any value is
3593 nonzero, this is an error condition and the stream is undecodable.</dd></dl>
3594<!--l. 132--><p class="noindent" ><span class="paragraphHead"><a
3595 id="x1-680004.2.4"></a><span
3596class="cmbx-12">Floors</span></span>
3597Vorbis uses two floor types; header decode is handed to the decode abstraction of the appropriate
3598type.
3599<!--l. 138--><p class="noindent" >
3600 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3601 1. </dt><dd
3602class="enumerate-enumitem"><span
3603class="cmtt-12">[vorbis</span><span
3604class="cmtt-12">_floor</span><span
3605class="cmtt-12">_count] </span>= read 6 bits as unsigned integer and add one
3606 </dd><dt class="enumerate-enumitem">
3607 2. </dt><dd
3608class="enumerate-enumitem">For each <span
3609class="cmtt-12">[i] </span>of <span
3610class="cmtt-12">[vorbis</span><span
3611class="cmtt-12">_floor</span><span
3612class="cmtt-12">_count] </span>floor numbers:
3613 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3614 a) </dt><dd
3615class="enumerate-enumitem">read the floor type: vector <span
3616class="cmtt-12">[vorbis</span><span
3617class="cmtt-12">_floor</span><span
3618class="cmtt-12">_types] </span>element <span
3619class="cmtt-12">[i] </span>= read 16 bits
3620 as unsigned integer
3621 </dd><dt class="enumerate-enumitem">
3622 b) </dt><dd
3623class="enumerate-enumitem">If the floor type is zero, decode the floor configuration as defined in <a
3624href="#x1-900006">section&#x00A0;6</a>,
3625 &#8220;<a
3626href="#x1-900006">Floor type 0 setup and decode<!--tex4ht:ref: vorbis:spec:floor0 --></a>&#8221;; save this configuration in slot <span
3627class="cmtt-12">[i] </span>of the floor
3628 configuration array <span
3629class="cmtt-12">[vorbis</span><span
3630class="cmtt-12">_floor</span><span
3631class="cmtt-12">_configurations]</span>.
3632 </dd><dt class="enumerate-enumitem">
3633 c) </dt><dd
3634class="enumerate-enumitem">If the floor type is one, decode the floor configuration as defined in <a
3635href="#x1-970007">section&#x00A0;7</a>,
3636 &#8220;<a
3637href="#x1-970007">Floor type 1 setup and decode<!--tex4ht:ref: vorbis:spec:floor1 --></a>&#8221;; save this configuration in slot <span
3638class="cmtt-12">[i] </span>of the floor
3639 configuration array <span
3640class="cmtt-12">[vorbis</span><span
3641class="cmtt-12">_floor</span><span
3642class="cmtt-12">_configurations]</span>.
3643 </dd><dt class="enumerate-enumitem">
3644 d) </dt><dd
3645class="enumerate-enumitem">If the the floor type is greater than one, this stream is undecodable; ERROR
3646 CONDITION</dd></dl>
3647
3648
3649
3650 </dd></dl>
3651<!--l. 156--><p class="noindent" ><span class="paragraphHead"><a
3652 id="x1-690004.2.4"></a><span
3653class="cmbx-12">Residues</span></span>
3654Vorbis uses three residue types; header decode of each type is identical.
3655<!--l. 162--><p class="noindent" >
3656 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3657 1. </dt><dd
3658class="enumerate-enumitem"><span
3659class="cmtt-12">[vorbis</span><span
3660class="cmtt-12">_residue</span><span
3661class="cmtt-12">_count] </span>= read 6 bits as unsigned integer and add one
3662 </dd><dt class="enumerate-enumitem">
3663 2. </dt><dd
3664class="enumerate-enumitem">For each of <span
3665class="cmtt-12">[vorbis</span><span
3666class="cmtt-12">_residue</span><span
3667class="cmtt-12">_count] </span>residue numbers:
3668 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3669 a) </dt><dd
3670class="enumerate-enumitem">read the residue type; vector <span
3671class="cmtt-12">[vorbis</span><span
3672class="cmtt-12">_residue</span><span
3673class="cmtt-12">_types] </span>element <span
3674class="cmtt-12">[i] </span>= read 16
3675 bits as unsigned integer
3676 </dd><dt class="enumerate-enumitem">
3677 b) </dt><dd
3678class="enumerate-enumitem">If the residue type is zero, one or two, decode the residue configuration as defined
3679 in <a
3680href="#x1-1040008">section&#x00A0;8</a>, &#8220;<a
3681href="#x1-1040008">Residue setup and decode<!--tex4ht:ref: vorbis:spec:residue --></a>&#8221;; save this configuration in slot <span
3682class="cmtt-12">[i] </span>of
3683 the residue configuration array <span
3684class="cmtt-12">[vorbis</span><span
3685class="cmtt-12">_residue</span><span
3686class="cmtt-12">_configurations]</span>.
3687 </dd><dt class="enumerate-enumitem">
3688 c) </dt><dd
3689class="enumerate-enumitem">If the the residue type is greater than two, this stream is undecodable; ERROR
3690 CONDITION</dd></dl>
3691 </dd></dl>
3692<!--l. 176--><p class="noindent" ><span class="paragraphHead"><a
3693 id="x1-700004.2.4"></a><span
3694class="cmbx-12">Mappings</span></span>
3695Mappings are used to set up specific pipelines for encoding multichannel audio with varying
3696channel mapping applications. Vorbis I uses a single mapping type (0), with implicit PCM
3697channel mappings.
3698<!--l. 187--><p class="noindent" >
3699 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3700 1. </dt><dd
3701class="enumerate-enumitem"><span
3702class="cmtt-12">[vorbis</span><span
3703class="cmtt-12">_mapping</span><span
3704class="cmtt-12">_count] </span>= read 6 bits as unsigned integer and add one
3705 </dd><dt class="enumerate-enumitem">
3706 2. </dt><dd
3707class="enumerate-enumitem">For each <span
3708class="cmtt-12">[i] </span>of <span
3709class="cmtt-12">[vorbis</span><span
3710class="cmtt-12">_mapping</span><span
3711class="cmtt-12">_count] </span>mapping numbers:
3712
3713
3714
3715 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3716 a) </dt><dd
3717class="enumerate-enumitem">read the mapping type: 16 bits as unsigned integer. There&#8217;s no reason to save
3718 the mapping type in Vorbis I.
3719 </dd><dt class="enumerate-enumitem">
3720 b) </dt><dd
3721class="enumerate-enumitem">If the mapping type is nonzero, the stream is undecodable
3722 </dd><dt class="enumerate-enumitem">
3723 c) </dt><dd
3724class="enumerate-enumitem">If the mapping type is zero:
3725 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3726 i. </dt><dd
3727class="enumerate-enumitem">read 1 bit as a boolean flag
3728 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3729 A. </dt><dd
3730class="enumerate-enumitem">if set, <span
3731class="cmtt-12">[vorbis</span><span
3732class="cmtt-12">_mapping</span><span
3733class="cmtt-12">_submaps] </span>= read 4 bits as unsigned integer
3734 and add one
3735 </dd><dt class="enumerate-enumitem">
3736 B. </dt><dd
3737class="enumerate-enumitem">if unset, <span
3738class="cmtt-12">[vorbis</span><span
3739class="cmtt-12">_mapping</span><span
3740class="cmtt-12">_submaps] </span>= 1</dd></dl>
3741 </dd><dt class="enumerate-enumitem">
3742 ii. </dt><dd
3743class="enumerate-enumitem">read 1 bit as a boolean flag
3744 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3745 A. </dt><dd
3746class="enumerate-enumitem">if set, square polar channel mapping is in use:
3747 <ul class="itemize1">
3748 <li class="itemize"><span
3749class="cmtt-12">[vorbis</span><span
3750class="cmtt-12">_mapping</span><span
3751class="cmtt-12">_coupling</span><span
3752class="cmtt-12">_steps] </span>= read 8 bits as unsigned
3753 integer and add one
3754 </li>
3755 <li class="itemize">for <span
3756class="cmtt-12">[j] </span>each of <span
3757class="cmtt-12">[vorbis</span><span
3758class="cmtt-12">_mapping</span><span
3759class="cmtt-12">_coupling</span><span
3760class="cmtt-12">_steps] </span>steps:
3761 <ul class="itemize2">
3762 <li class="itemize">vector <span
3763class="cmtt-12">[vorbis</span><span
3764class="cmtt-12">_mapping</span><span
3765class="cmtt-12">_magnitude] </span>element <span
3766class="cmtt-12">[j]</span>= read
3767 <a
3768href="#x1-1190009.2.1">ilog</a>(<span
3769class="cmtt-12">[audio</span><span
3770class="cmtt-12">_channels] </span>- 1) bits as unsigned integer
3771 </li>
3772 <li class="itemize">vector <span
3773class="cmtt-12">[vorbis</span><span
3774class="cmtt-12">_mapping</span><span
3775class="cmtt-12">_angle] </span>element <span
3776class="cmtt-12">[j]</span>= read
3777 <a
3778href="#x1-1190009.2.1">ilog</a>(<span
3779class="cmtt-12">[audio</span><span
3780class="cmtt-12">_channels] </span>- 1) bits as unsigned integer
3781 </li>
3782 <li class="itemize">the numbers read in the above two steps are channel numbers
3783 representing the channel to treat as magnitude and the channel
3784 to treat as angle, respectively. If for any coupling step the
3785 angle channel number equals the magnitude channel number, the
3786 magnitude channel number is greater than <span
3787class="cmtt-12">[audio</span><span
3788class="cmtt-12">_channels]</span>-1, or
3789 the angle channel is greater than <span
3790class="cmtt-12">[audio</span><span
3791class="cmtt-12">_channels]</span>-1, the stream
3792 is undecodable.</li></ul>
3793
3794
3795
3796 </li></ul>
3797 </dd><dt class="enumerate-enumitem">
3798 B. </dt><dd
3799class="enumerate-enumitem">if unset, <span
3800class="cmtt-12">[vorbis</span><span
3801class="cmtt-12">_mapping</span><span
3802class="cmtt-12">_coupling</span><span
3803class="cmtt-12">_steps] </span>= 0</dd></dl>
3804 </dd><dt class="enumerate-enumitem">
3805 iii. </dt><dd
3806class="enumerate-enumitem">read 2 bits (reserved field); if the value is nonzero, the stream is undecodable
3807 </dd><dt class="enumerate-enumitem">
3808 iv. </dt><dd
3809class="enumerate-enumitem">if <span
3810class="cmtt-12">[vorbis</span><span
3811class="cmtt-12">_mapping</span><span
3812class="cmtt-12">_submaps] </span>is greater than one, we read channel multiplex
3813 settings. For each <span
3814class="cmtt-12">[j] </span>of <span
3815class="cmtt-12">[audio</span><span
3816class="cmtt-12">_channels] </span>channels:
3817 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3818 A. </dt><dd
3819class="enumerate-enumitem">vector <span
3820class="cmtt-12">[vorbis</span><span
3821class="cmtt-12">_mapping</span><span
3822class="cmtt-12">_mux] </span>element <span
3823class="cmtt-12">[j] </span>= read 4 bits as unsigned
3824 integer
3825 </dd><dt class="enumerate-enumitem">
3826 B. </dt><dd
3827class="enumerate-enumitem">if the value is greater than the highest numbered submap
3828 (<span
3829class="cmtt-12">[vorbis</span><span
3830class="cmtt-12">_mapping</span><span
3831class="cmtt-12">_submaps] </span>- 1), this in an error condition rendering
3832 the stream undecodable</dd></dl>
3833 </dd><dt class="enumerate-enumitem">
3834 v. </dt><dd
3835class="enumerate-enumitem">for each submap <span
3836class="cmtt-12">[j] </span>of <span
3837class="cmtt-12">[vorbis</span><span
3838class="cmtt-12">_mapping</span><span
3839class="cmtt-12">_submaps] </span>submaps, read the floor and
3840 residue numbers for use in decoding that submap:
3841 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3842 A. </dt><dd
3843class="enumerate-enumitem">read and discard 8 bits (the unused time configuration placeholder)
3844 </dd><dt class="enumerate-enumitem">
3845 B. </dt><dd
3846class="enumerate-enumitem">read 8 bits as unsigned integer for the floor number; save in vector
3847 <span
3848class="cmtt-12">[vorbis</span><span
3849class="cmtt-12">_mapping</span><span
3850class="cmtt-12">_submap</span><span
3851class="cmtt-12">_floor] </span>element <span
3852class="cmtt-12">[j]</span>
3853 </dd><dt class="enumerate-enumitem">
3854 C. </dt><dd
3855class="enumerate-enumitem">verify the floor number is not greater than the highest number floor
3856 configured for the bitstream. If it is, the bitstream is undecodable
3857 </dd><dt class="enumerate-enumitem">
3858 D. </dt><dd
3859class="enumerate-enumitem">read 8 bits as unsigned integer for the residue number; save in vector
3860 <span
3861class="cmtt-12">[vorbis</span><span
3862class="cmtt-12">_mapping</span><span
3863class="cmtt-12">_submap</span><span
3864class="cmtt-12">_residue] </span>element <span
3865class="cmtt-12">[j]</span>
3866 </dd><dt class="enumerate-enumitem">
3867 E. </dt><dd
3868class="enumerate-enumitem">verify the residue number is not greater than the highest number residue
3869 configured for the bitstream. If it is, the bitstream is undecodable</dd></dl>
3870 </dd><dt class="enumerate-enumitem">
3871 vi. </dt><dd
3872class="enumerate-enumitem">save this mapping configuration in slot <span
3873class="cmtt-12">[i] </span>of the mapping configuration array
3874 <span
3875class="cmtt-12">[vorbis</span><span
3876class="cmtt-12">_mapping</span><span
3877class="cmtt-12">_configurations]</span>.</dd></dl>
3878 </dd></dl>
3879
3880
3881
3882 </dd></dl>
3883<!--l. 246--><p class="noindent" ><span class="paragraphHead"><a
3884 id="x1-710004.2.4"></a><span
3885class="cmbx-12">Modes</span></span>
3886 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3887 1. </dt><dd
3888class="enumerate-enumitem"><span
3889class="cmtt-12">[vorbis</span><span
3890class="cmtt-12">_mode</span><span
3891class="cmtt-12">_count] </span>= read 6 bits as unsigned integer and add one
3892 </dd><dt class="enumerate-enumitem">
3893 2. </dt><dd
3894class="enumerate-enumitem">For each of <span
3895class="cmtt-12">[vorbis</span><span
3896class="cmtt-12">_mode</span><span
3897class="cmtt-12">_count] </span>mode numbers:
3898 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3899 a) </dt><dd
3900class="enumerate-enumitem"><span
3901class="cmtt-12">[vorbis</span><span
3902class="cmtt-12">_mode</span><span
3903class="cmtt-12">_blockflag] </span>= read 1 bit
3904 </dd><dt class="enumerate-enumitem">
3905 b) </dt><dd
3906class="enumerate-enumitem"><span
3907class="cmtt-12">[vorbis</span><span
3908class="cmtt-12">_mode</span><span
3909class="cmtt-12">_windowtype] </span>= read 16 bits as unsigned integer
3910 </dd><dt class="enumerate-enumitem">
3911 c) </dt><dd
3912class="enumerate-enumitem"><span
3913class="cmtt-12">[vorbis</span><span
3914class="cmtt-12">_mode</span><span
3915class="cmtt-12">_transformtype] </span>= read 16 bits as unsigned integer
3916 </dd><dt class="enumerate-enumitem">
3917 d) </dt><dd
3918class="enumerate-enumitem"><span
3919class="cmtt-12">[vorbis</span><span
3920class="cmtt-12">_mode</span><span
3921class="cmtt-12">_mapping] </span>= read 8 bits as unsigned integer
3922 </dd><dt class="enumerate-enumitem">
3923 e) </dt><dd
3924class="enumerate-enumitem">verify ranges; zero is the only legal value in
3925 Vorbis I for <span
3926class="cmtt-12">[vorbis</span><span
3927class="cmtt-12">_mode</span><span
3928class="cmtt-12">_windowtype] </span>and <span
3929class="cmtt-12">[vorbis</span><span
3930class="cmtt-12">_mode</span><span
3931class="cmtt-12">_transformtype]</span>.
3932 <span
3933class="cmtt-12">[vorbis</span><span
3934class="cmtt-12">_mode</span><span
3935class="cmtt-12">_mapping] </span>must not be greater than the highest number mapping
3936 in use. Any illegal values render the stream undecodable.
3937 </dd><dt class="enumerate-enumitem">
3938 f) </dt><dd
3939class="enumerate-enumitem">save this mode configuration in slot <span
3940class="cmtt-12">[i] </span>of the mode configuration array
3941 <span
3942class="cmtt-12">[vorbis</span><span
3943class="cmtt-12">_mode</span><span
3944class="cmtt-12">_configurations]</span>.</dd></dl>
3945 </dd><dt class="enumerate-enumitem">
3946 3. </dt><dd
3947class="enumerate-enumitem">read 1 bit as a framing flag. If unset, a framing error occurred and the stream is not
3948 decodable.</dd></dl>
3949<!--l. 267--><p class="noindent" >After reading mode descriptions, setup header decode is complete.
3950<!--l. 276--><p class="noindent" >
3951<h4 class="subsectionHead"><span class="titlemark">4.3. </span> <a
3952 id="x1-720004.3"></a>Audio packet decode and synthesis</h4>
3953
3954
3955
3956<!--l. 278--><p class="noindent" >Following the three header packets, all packets in a Vorbis I stream are audio. The first step of
3957audio packet decode is to read and verify the packet type. <span
3958class="cmti-12">A non-audio packet when audio is</span>
3959<span
3960class="cmti-12">expected indicates stream corruption or a non-compliant stream. The decoder must ignore the</span>
3961<span
3962class="cmti-12">packet and not attempt decoding it to audio</span>.
3963<!--l. 285--><p class="noindent" >
3964<h5 class="subsubsectionHead"><span class="titlemark">4.3.1. </span> <a
3965 id="x1-730004.3.1"></a>packet type, mode and window decode</h5>
3966<!--l. 288--><p class="noindent" >
3967 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3968 1. </dt><dd
3969class="enumerate-enumitem">read 1 bit <span
3970class="cmtt-12">[packet</span><span
3971class="cmtt-12">_type]</span>; check that packet type is 0 (audio)
3972 </dd><dt class="enumerate-enumitem">
3973 2. </dt><dd
3974class="enumerate-enumitem">read <a
3975href="#x1-1190009.2.1">ilog</a>([vorbis_mode_count]-1) bits <span
3976class="cmtt-12">[mode</span><span
3977class="cmtt-12">_number]</span>
3978 </dd><dt class="enumerate-enumitem">
3979 3. </dt><dd
3980class="enumerate-enumitem">decode blocksize <span
3981class="cmtt-12">[n] </span>is equal to <span
3982class="cmtt-12">[blocksize</span><span
3983class="cmtt-12">_0] </span>if <span
3984class="cmtt-12">[vorbis</span><span
3985class="cmtt-12">_mode</span><span
3986class="cmtt-12">_blockflag] </span>is 0,
3987 else <span
3988class="cmtt-12">[n] </span>is equal to <span
3989class="cmtt-12">[blocksize</span><span
3990class="cmtt-12">_1]</span>.
3991 </dd><dt class="enumerate-enumitem">
3992 4. </dt><dd
3993class="enumerate-enumitem">perform window selection and setup; this window is used later by the inverse
3994 MDCT:
3995 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
3996 a) </dt><dd
3997class="enumerate-enumitem">if this is a long window (the <span
3998class="cmtt-12">[vorbis</span><span
3999class="cmtt-12">_mode</span><span
4000class="cmtt-12">_blockflag] </span>flag of this mode is
4001 set):
4002 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4003 i. </dt><dd
4004class="enumerate-enumitem">read 1 bit for <span
4005class="cmtt-12">[previous</span><span
4006class="cmtt-12">_window</span><span
4007class="cmtt-12">_flag]</span>
4008 </dd><dt class="enumerate-enumitem">
4009 ii. </dt><dd
4010class="enumerate-enumitem">read 1 bit for <span
4011class="cmtt-12">[next</span><span
4012class="cmtt-12">_window</span><span
4013class="cmtt-12">_flag]</span>
4014 </dd><dt class="enumerate-enumitem">
4015 iii. </dt><dd
4016class="enumerate-enumitem">if <span
4017class="cmtt-12">[previous</span><span
4018class="cmtt-12">_window</span><span
4019class="cmtt-12">_flag] </span>is not set, the left half of the window will
4020 be a hybrid window for lapping with a short block. See <a
4021href="#paragraph.1" >paragraph&#x00A0;<a
4022href="#x1-260001.3.2">1.3.2</a></a>,
4023 &#8220;<a
4024href="#x1-260001.3.2">Window shape decode (long windows only)<!--tex4ht:ref: vorbis:spec:window --></a>&#8221; for an illustration of
4025 overlapping dissimilar windows. Else, the left half window will have normal
4026 long shape.
4027 </dd><dt class="enumerate-enumitem">
4028 iv. </dt><dd
4029class="enumerate-enumitem">if <span
4030class="cmtt-12">[next</span><span
4031class="cmtt-12">_window</span><span
4032class="cmtt-12">_flag] </span>is not set, the right half of the window will be
4033 a hybrid window for lapping with a short block. See <a
4034href="#x1-260001.3.2">paragraph&#x00A0;1.3.2</a>,
4035
4036
4037
4038 &#8220;<a
4039href="#x1-260001.3.2">Window shape decode (long windows only)<!--tex4ht:ref: vorbis:spec:window --></a>&#8221; for an illustration of
4040 overlapping dissimilar windows. Else, the left right window will have normal
4041 long shape.</dd></dl>
4042 </dd><dt class="enumerate-enumitem">
4043 b) </dt><dd
4044class="enumerate-enumitem">if this is a short window, the window is always the same short-window
4045 shape.</dd></dl>
4046 </dd></dl>
4047<!--l. 320--><p class="noindent" >Vorbis windows all use the slope function <span
4048class="cmmi-12">y </span>= sin(<img
4049src="Vorbis_I_spec1x.png" alt="&#x03C0;
40502" class="frac" align="middle"> <span
4051class="cmsy-10x-x-120">*</span> sin <sup><span
4052class="cmr-8">2</span></sup>((<span
4053class="cmmi-12">x </span>+ 0<span
4054class="cmmi-12">.</span>5)<span
4055class="cmmi-12">&#x2215;n </span><span
4056class="cmsy-10x-x-120">* </span><span
4057class="cmmi-12">&#x03C0;</span>)), where <span
4058class="cmmi-12">n </span>is window
4059size and <span
4060class="cmmi-12">x </span>ranges 0<span
4061class="cmmi-12">&#x2026;</span><span
4062class="cmmi-12">n</span><span
4063class="cmsy-10x-x-120">- </span>1, but dissimilar lapping requirements can affect overall shape. Window
4064generation proceeds as follows:
4065<!--l. 326--><p class="noindent" >
4066 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4067 1. </dt><dd
4068class="enumerate-enumitem"><span
4069class="cmtt-12">[window</span><span
4070class="cmtt-12">_center] </span>= <span
4071class="cmtt-12">[n] </span>/ 2
4072 </dd><dt class="enumerate-enumitem">
4073 2. </dt><dd
4074class="enumerate-enumitem">if (<span
4075class="cmtt-12">[vorbis</span><span
4076class="cmtt-12">_mode</span><span
4077class="cmtt-12">_blockflag] </span>is set and <span
4078class="cmtt-12">[previous</span><span
4079class="cmtt-12">_window</span><span
4080class="cmtt-12">_flag] </span>is not set)
4081 then
4082 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4083 a) </dt><dd
4084class="enumerate-enumitem"><span
4085class="cmtt-12">[left</span><span
4086class="cmtt-12">_window</span><span
4087class="cmtt-12">_start] </span>= <span
4088class="cmtt-12">[n]</span>/4 - <span
4089class="cmtt-12">[blocksize</span><span
4090class="cmtt-12">_0]</span>/4
4091 </dd><dt class="enumerate-enumitem">
4092 b) </dt><dd
4093class="enumerate-enumitem"><span
4094class="cmtt-12">[left</span><span
4095class="cmtt-12">_window</span><span
4096class="cmtt-12">_end] </span>= <span
4097class="cmtt-12">[n]</span>/4 + <span
4098class="cmtt-12">[blocksize</span><span
4099class="cmtt-12">_0]</span>/4
4100 </dd><dt class="enumerate-enumitem">
4101 c) </dt><dd
4102class="enumerate-enumitem"><span
4103class="cmtt-12">[left</span><span
4104class="cmtt-12">_n] </span>= <span
4105class="cmtt-12">[blocksize</span><span
4106class="cmtt-12">_0]</span>/2</dd></dl>
4107 <!--l. 335--><p class="noindent" >else
4108 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4109 a) </dt><dd
4110class="enumerate-enumitem"><span
4111class="cmtt-12">[left</span><span
4112class="cmtt-12">_window</span><span
4113class="cmtt-12">_start] </span>= 0
4114 </dd><dt class="enumerate-enumitem">
4115 b) </dt><dd
4116class="enumerate-enumitem"><span
4117class="cmtt-12">[left</span><span
4118class="cmtt-12">_window</span><span
4119class="cmtt-12">_end] </span>= <span
4120class="cmtt-12">[window</span><span
4121class="cmtt-12">_center]</span>
4122 </dd><dt class="enumerate-enumitem">
4123 c) </dt><dd
4124class="enumerate-enumitem"><span
4125class="cmtt-12">[left</span><span
4126class="cmtt-12">_n] </span>= <span
4127class="cmtt-12">[n]</span>/2</dd></dl>
4128 </dd><dt class="enumerate-enumitem">
4129 3. </dt><dd
4130class="enumerate-enumitem">if (<span
4131class="cmtt-12">[vorbis</span><span
4132class="cmtt-12">_mode</span><span
4133class="cmtt-12">_blockflag] </span>is set and <span
4134class="cmtt-12">[next</span><span
4135class="cmtt-12">_window</span><span
4136class="cmtt-12">_flag] </span>is not set) then
4137 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4138 a) </dt><dd
4139class="enumerate-enumitem"><span
4140class="cmtt-12">[right</span><span
4141class="cmtt-12">_window</span><span
4142class="cmtt-12">_start] </span>= <span
4143class="cmtt-12">[n]*3</span>/4 - <span
4144class="cmtt-12">[blocksize</span><span
4145class="cmtt-12">_0]</span>/4
4146 </dd><dt class="enumerate-enumitem">
4147 b) </dt><dd
4148class="enumerate-enumitem"><span
4149class="cmtt-12">[right</span><span
4150class="cmtt-12">_window</span><span
4151class="cmtt-12">_end] </span>= <span
4152class="cmtt-12">[n]*3</span>/4 + <span
4153class="cmtt-12">[blocksize</span><span
4154class="cmtt-12">_0]</span>/4
4155
4156
4157
4158 </dd><dt class="enumerate-enumitem">
4159 c) </dt><dd
4160class="enumerate-enumitem"><span
4161class="cmtt-12">[right</span><span
4162class="cmtt-12">_n] </span>= <span
4163class="cmtt-12">[blocksize</span><span
4164class="cmtt-12">_0]</span>/2</dd></dl>
4165 <!--l. 351--><p class="noindent" >else
4166 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4167 a) </dt><dd
4168class="enumerate-enumitem"><span
4169class="cmtt-12">[right</span><span
4170class="cmtt-12">_window</span><span
4171class="cmtt-12">_start] </span>= <span
4172class="cmtt-12">[window</span><span
4173class="cmtt-12">_center]</span>
4174 </dd><dt class="enumerate-enumitem">
4175 b) </dt><dd
4176class="enumerate-enumitem"><span
4177class="cmtt-12">[right</span><span
4178class="cmtt-12">_window</span><span
4179class="cmtt-12">_end] </span>= <span
4180class="cmtt-12">[n]</span>
4181 </dd><dt class="enumerate-enumitem">
4182 c) </dt><dd
4183class="enumerate-enumitem"><span
4184class="cmtt-12">[right</span><span
4185class="cmtt-12">_n] </span>= <span
4186class="cmtt-12">[n]</span>/2</dd></dl>
4187 </dd><dt class="enumerate-enumitem">
4188 4. </dt><dd
4189class="enumerate-enumitem">window from range 0 ... <span
4190class="cmtt-12">[left</span><span
4191class="cmtt-12">_window</span><span
4192class="cmtt-12">_start]</span>-1 inclusive is zero
4193 </dd><dt class="enumerate-enumitem">
4194 5. </dt><dd
4195class="enumerate-enumitem">for <span
4196class="cmtt-12">[i] </span>in range <span
4197class="cmtt-12">[left</span><span
4198class="cmtt-12">_window</span><span
4199class="cmtt-12">_start] </span>... <span
4200class="cmtt-12">[left</span><span
4201class="cmtt-12">_window</span><span
4202class="cmtt-12">_end]</span>-1, window(<span
4203class="cmtt-12">[i]</span>) =
4204 sin(<img
4205src="Vorbis_I_spec2x.png" alt="&#x03C0;
42062" class="frac" align="middle"> <span
4207class="cmsy-10x-x-120">*</span> sin <sup><span
4208class="cmr-8">2</span></sup>( (<span
4209class="cmtt-12">[i]</span>-<span
4210class="cmtt-12">[left</span><span
4211class="cmtt-12">_window</span><span
4212class="cmtt-12">_start]</span>+0.5) / <span
4213class="cmtt-12">[left</span><span
4214class="cmtt-12">_n] </span><span
4215class="cmsy-10x-x-120">*</span><img
4216src="Vorbis_I_spec3x.png" alt="&#x03C0;
42172" class="frac" align="middle">) )
4218 </dd><dt class="enumerate-enumitem">
4219 6. </dt><dd
4220class="enumerate-enumitem">window from range <span
4221class="cmtt-12">[left</span><span
4222class="cmtt-12">_window</span><span
4223class="cmtt-12">_end] </span>... <span
4224class="cmtt-12">[right</span><span
4225class="cmtt-12">_window</span><span
4226class="cmtt-12">_start]</span>-1 inclusive is
4227 one
4228 </dd><dt class="enumerate-enumitem">
4229 7. </dt><dd
4230class="enumerate-enumitem">for <span
4231class="cmtt-12">[i] </span>in range <span
4232class="cmtt-12">[right</span><span
4233class="cmtt-12">_window</span><span
4234class="cmtt-12">_start] </span>... <span
4235class="cmtt-12">[right</span><span
4236class="cmtt-12">_window</span><span
4237class="cmtt-12">_end]</span>-1, window(<span
4238class="cmtt-12">[i]</span>) =
4239 sin(<img
4240src="Vorbis_I_spec4x.png" alt="&#x03C0;2" class="frac" align="middle"> <span
4241class="cmsy-10x-x-120">*</span> sin <sup><span
4242class="cmr-8">2</span></sup>( (<span
4243class="cmtt-12">[i]</span>-<span
4244class="cmtt-12">[right</span><span
4245class="cmtt-12">_window</span><span
4246class="cmtt-12">_start]</span>+0.5) / <span
4247class="cmtt-12">[right</span><span
4248class="cmtt-12">_n] </span><span
4249class="cmsy-10x-x-120">*</span><img
4250src="Vorbis_I_spec5x.png" alt="&#x03C0;2" class="frac" align="middle"> + <img
4251src="Vorbis_I_spec6x.png" alt="&#x03C0;2" class="frac" align="middle">) )
4252 </dd><dt class="enumerate-enumitem">
4253 8. </dt><dd
4254class="enumerate-enumitem">window from range <span
4255class="cmtt-12">[right</span><span
4256class="cmtt-12">_window</span><span
4257class="cmtt-12">_start] </span>... <span
4258class="cmtt-12">[n]</span>-1 is zero</dd></dl>
4259<!--l. 367--><p class="noindent" >An end-of-packet condition up to this point should be considered an error that discards this
4260packet from the stream. An end of packet condition past this point is to be considered a possible
4261nominal occurrence.
4262<!--l. 374--><p class="noindent" >
4263<h5 class="subsubsectionHead"><span class="titlemark">4.3.2. </span> <a
4264 id="x1-740004.3.2"></a>floor curve decode</h5>
4265<!--l. 376--><p class="noindent" >From this point on, we assume out decode context is using mode number <span
4266class="cmtt-12">[mode</span><span
4267class="cmtt-12">_number]</span>
4268from configuration array <span
4269class="cmtt-12">[vorbis</span><span
4270class="cmtt-12">_mode</span><span
4271class="cmtt-12">_configurations] </span>and the map number
4272<span
4273class="cmtt-12">[vorbis</span><span
4274class="cmtt-12">_mode</span><span
4275class="cmtt-12">_mapping] </span>(specified by the current mode) taken from the mapping configuration
4276array <span
4277class="cmtt-12">[vorbis</span><span
4278class="cmtt-12">_mapping</span><span
4279class="cmtt-12">_configurations]</span>.
4280<!--l. 383--><p class="noindent" >Floor curves are decoded one-by-one in channel order.
4281
4282
4283
4284<!--l. 385--><p class="noindent" >For each floor <span
4285class="cmtt-12">[i] </span>of <span
4286class="cmtt-12">[audio</span><span
4287class="cmtt-12">_channels]</span>
4288 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4289 1. </dt><dd
4290class="enumerate-enumitem"><span
4291class="cmtt-12">[submap</span><span
4292class="cmtt-12">_number] </span>= element <span
4293class="cmtt-12">[i] </span>of vector [vorbis_mapping_mux]
4294 </dd><dt class="enumerate-enumitem">
4295 2. </dt><dd
4296class="enumerate-enumitem"><span
4297class="cmtt-12">[floor</span><span
4298class="cmtt-12">_number] </span>= element <span
4299class="cmtt-12">[submap</span><span
4300class="cmtt-12">_number] </span>of vector [vorbis_submap_floor]
4301 </dd><dt class="enumerate-enumitem">
4302 3. </dt><dd
4303class="enumerate-enumitem">if the floor type of this floor (vector
4304 <span
4305class="cmtt-12">[vorbis</span><span
4306class="cmtt-12">_floor</span><span
4307class="cmtt-12">_types] </span>element <span
4308class="cmtt-12">[floor</span><span
4309class="cmtt-12">_number]</span>) is zero then decode the floor for
4310 channel <span
4311class="cmtt-12">[i] </span>according to the <a
4312href="#x1-940006.2.2">subsubsection&#x00A0;6.2.2</a>, &#8220;<a
4313href="#x1-940006.2.2">packet decode<!--tex4ht:ref: vorbis:spec:floor0-decode --></a>&#8221;
4314 </dd><dt class="enumerate-enumitem">
4315 4. </dt><dd
4316class="enumerate-enumitem">if the type of this floor is one then decode the floor for channel <span
4317class="cmtt-12">[i] </span>according to the
4318 <a
4319href="#x1-1020007.2.3">subsubsection&#x00A0;7.2.3</a>, &#8220;<a
4320href="#x1-1020007.2.3">packet decode<!--tex4ht:ref: vorbis:spec:floor1-decode --></a>&#8221;
4321 </dd><dt class="enumerate-enumitem">
4322 5. </dt><dd
4323class="enumerate-enumitem">save the needed decoded floor information for channel for later synthesis
4324 </dd><dt class="enumerate-enumitem">
4325 6. </dt><dd
4326class="enumerate-enumitem">if the decoded floor returned &#8217;unused&#8217;, set vector <span
4327class="cmtt-12">[no</span><span
4328class="cmtt-12">_residue] </span>element <span
4329class="cmtt-12">[i] </span>to true,
4330 else set vector <span
4331class="cmtt-12">[no</span><span
4332class="cmtt-12">_residue] </span>element <span
4333class="cmtt-12">[i] </span>to false</dd></dl>
4334<!--l. 405--><p class="noindent" >An end-of-packet condition during floor decode shall result in packet decode zeroing all channel
4335output vectors and skipping to the add/overlap output stage.
4336<!--l. 411--><p class="noindent" >
4337<h5 class="subsubsectionHead"><span class="titlemark">4.3.3. </span> <a
4338 id="x1-750004.3.3"></a>nonzero vector propagate</h5>
4339<!--l. 413--><p class="noindent" >A possible result of floor decode is that a specific vector is marked &#8217;unused&#8217; which indicates that
4340that final output vector is all-zero values (and the floor is zero). The residue for that vector is not
4341coded in the stream, save for one complication. If some vectors are used and some are not,
4342channel coupling could result in mixing a zeroed and nonzeroed vector to produce two nonzeroed
4343vectors.
4344<!--l. 420--><p class="noindent" >for each <span
4345class="cmtt-12">[i] </span>from 0 ... <span
4346class="cmtt-12">[vorbis</span><span
4347class="cmtt-12">_mapping</span><span
4348class="cmtt-12">_coupling</span><span
4349class="cmtt-12">_steps]</span>-1
4350<!--l. 423--><p class="noindent" >
4351 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4352 1. </dt><dd
4353class="enumerate-enumitem">if either <span
4354class="cmtt-12">[no</span><span
4355class="cmtt-12">_residue] </span>entry for channel (<span
4356class="cmtt-12">[vorbis</span><span
4357class="cmtt-12">_mapping</span><span
4358class="cmtt-12">_magnitude] </span>element
4359 <span
4360class="cmtt-12">[i]</span>) or channel (<span
4361class="cmtt-12">[vorbis</span><span
4362class="cmtt-12">_mapping</span><span
4363class="cmtt-12">_angle] </span>element <span
4364class="cmtt-12">[i]</span>) are set to false, then both
4365 must be set to false. Note that an &#8217;unused&#8217; floor has no decoded floor information; it
4366
4367
4368
4369 is important that this is remembered at floor curve synthesis time.</dd></dl>
4370<!--l. 435--><p class="noindent" >
4371<h5 class="subsubsectionHead"><span class="titlemark">4.3.4. </span> <a
4372 id="x1-760004.3.4"></a>residue decode</h5>
4373<!--l. 437--><p class="noindent" >Unlike floors, which are decoded in channel order, the residue vectors are decoded in submap
4374order.
4375<!--l. 440--><p class="noindent" >for each submap <span
4376class="cmtt-12">[i] </span>in order from 0 ... <span
4377class="cmtt-12">[vorbis</span><span
4378class="cmtt-12">_mapping</span><span
4379class="cmtt-12">_submaps]</span>-1
4380<!--l. 443--><p class="noindent" >
4381 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4382 1. </dt><dd
4383class="enumerate-enumitem"><span
4384class="cmtt-12">[ch] </span>= 0
4385 </dd><dt class="enumerate-enumitem">
4386 2. </dt><dd
4387class="enumerate-enumitem">for each channel <span
4388class="cmtt-12">[j] </span>in order from 0 ... <span
4389class="cmtt-12">[audio</span><span
4390class="cmtt-12">_channels] </span>- 1
4391 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4392 a) </dt><dd
4393class="enumerate-enumitem">if channel <span
4394class="cmtt-12">[j] </span>in submap <span
4395class="cmtt-12">[i] </span>(vector <span
4396class="cmtt-12">[vorbis</span><span
4397class="cmtt-12">_mapping</span><span
4398class="cmtt-12">_mux] </span>element <span
4399class="cmtt-12">[j] </span>is equal to
4400 <span
4401class="cmtt-12">[i]</span>)
4402 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4403 i. </dt><dd
4404class="enumerate-enumitem">if vector <span
4405class="cmtt-12">[no</span><span
4406class="cmtt-12">_residue] </span>element <span
4407class="cmtt-12">[j] </span>is true
4408 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4409 A. </dt><dd
4410class="enumerate-enumitem">vector <span
4411class="cmtt-12">[do</span><span
4412class="cmtt-12">_not</span><span
4413class="cmtt-12">_decode</span><span
4414class="cmtt-12">_flag] </span>element <span
4415class="cmtt-12">[ch] </span>is set</dd></dl>
4416 <!--l. 452--><p class="noindent" >else
4417 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4418 A. </dt><dd
4419class="enumerate-enumitem">vector <span
4420class="cmtt-12">[do</span><span
4421class="cmtt-12">_not</span><span
4422class="cmtt-12">_decode</span><span
4423class="cmtt-12">_flag] </span>element <span
4424class="cmtt-12">[ch] </span>is unset</dd></dl>
4425 </dd><dt class="enumerate-enumitem">
4426 ii. </dt><dd
4427class="enumerate-enumitem">increment <span
4428class="cmtt-12">[ch]</span></dd></dl>
4429 </dd></dl>
4430 </dd><dt class="enumerate-enumitem">
4431 3. </dt><dd
4432class="enumerate-enumitem"><span
4433class="cmtt-12">[residue</span><span
4434class="cmtt-12">_number] </span>= vector <span
4435class="cmtt-12">[vorbis</span><span
4436class="cmtt-12">_mapping</span><span
4437class="cmtt-12">_submap</span><span
4438class="cmtt-12">_residue] </span>element <span
4439class="cmtt-12">[i]</span>
4440 </dd><dt class="enumerate-enumitem">
4441 4. </dt><dd
4442class="enumerate-enumitem"><span
4443class="cmtt-12">[residue</span><span
4444class="cmtt-12">_type] </span>= vector <span
4445class="cmtt-12">[vorbis</span><span
4446class="cmtt-12">_residue</span><span
4447class="cmtt-12">_types] </span>element <span
4448class="cmtt-12">[residue</span><span
4449class="cmtt-12">_number]</span>
4450 </dd><dt class="enumerate-enumitem">
4451 5. </dt><dd
4452class="enumerate-enumitem">decode <span
4453class="cmtt-12">[ch] </span>vectors using residue <span
4454class="cmtt-12">[residue</span><span
4455class="cmtt-12">_number]</span>, according to type <span
4456class="cmtt-12">[residue</span><span
4457class="cmtt-12">_type]</span>,
4458
4459
4460
4461 also passing vector <span
4462class="cmtt-12">[do</span><span
4463class="cmtt-12">_not</span><span
4464class="cmtt-12">_decode</span><span
4465class="cmtt-12">_flag] </span>to indicate which vectors in the bundle should
4466 not be decoded. Correct per-vector decode length is <span
4467class="cmtt-12">[n]</span>/2.
4468 </dd><dt class="enumerate-enumitem">
4469 6. </dt><dd
4470class="enumerate-enumitem"><span
4471class="cmtt-12">[ch] </span>= 0
4472 </dd><dt class="enumerate-enumitem">
4473 7. </dt><dd
4474class="enumerate-enumitem">for each channel <span
4475class="cmtt-12">[j] </span>in order from 0 ... <span
4476class="cmtt-12">[audio</span><span
4477class="cmtt-12">_channels]</span>
4478 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4479 a) </dt><dd
4480class="enumerate-enumitem">if channel <span
4481class="cmtt-12">[j] </span>is in submap <span
4482class="cmtt-12">[i] </span>(vector <span
4483class="cmtt-12">[vorbis</span><span
4484class="cmtt-12">_mapping</span><span
4485class="cmtt-12">_mux] </span>element <span
4486class="cmtt-12">[j] </span>is equal
4487 to <span
4488class="cmtt-12">[i]</span>)
4489 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4490 i. </dt><dd
4491class="enumerate-enumitem">residue vector for channel <span
4492class="cmtt-12">[j] </span>is set to decoded residue vector <span
4493class="cmtt-12">[ch]</span>
4494 </dd><dt class="enumerate-enumitem">
4495 ii. </dt><dd
4496class="enumerate-enumitem">increment <span
4497class="cmtt-12">[ch]</span></dd></dl>
4498 </dd></dl>
4499 </dd></dl>
4500<!--l. 479--><p class="noindent" >
4501<h5 class="subsubsectionHead"><span class="titlemark">4.3.5. </span> <a
4502 id="x1-770004.3.5"></a>inverse coupling</h5>
4503<!--l. 481--><p class="noindent" >for each <span
4504class="cmtt-12">[i] </span>from <span
4505class="cmtt-12">[vorbis</span><span
4506class="cmtt-12">_mapping</span><span
4507class="cmtt-12">_coupling</span><span
4508class="cmtt-12">_steps]</span>-1 descending to 0
4509<!--l. 484--><p class="noindent" >
4510 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4511 1. </dt><dd
4512class="enumerate-enumitem"><span
4513class="cmtt-12">[magnitude</span><span
4514class="cmtt-12">_vector] </span>= the residue vector for channel (vector
4515 <span
4516class="cmtt-12">[vorbis</span><span
4517class="cmtt-12">_mapping</span><span
4518class="cmtt-12">_magnitude] </span>element <span
4519class="cmtt-12">[i]</span>)
4520 </dd><dt class="enumerate-enumitem">
4521 2. </dt><dd
4522class="enumerate-enumitem"><span
4523class="cmtt-12">[angle</span><span
4524class="cmtt-12">_vector] </span>= the residue vector for channel (vector <span
4525class="cmtt-12">[vorbis</span><span
4526class="cmtt-12">_mapping</span><span
4527class="cmtt-12">_angle]</span>
4528 element <span
4529class="cmtt-12">[i]</span>)
4530 </dd><dt class="enumerate-enumitem">
4531 3. </dt><dd
4532class="enumerate-enumitem">for each scalar value <span
4533class="cmtt-12">[M] </span>in vector <span
4534class="cmtt-12">[magnitude</span><span
4535class="cmtt-12">_vector] </span>and the corresponding scalar value
4536 <span
4537class="cmtt-12">[A] </span>in vector <span
4538class="cmtt-12">[angle</span><span
4539class="cmtt-12">_vector]</span>:
4540 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4541 a) </dt><dd
4542class="enumerate-enumitem">if (<span
4543class="cmtt-12">[M] </span>is greater than zero)
4544
4545
4546
4547 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem">
4548 i. </dt><dd
4549class="enumerate-enumitem">if (<span
4550class="cmtt-12">[A] </span>is greater than zero)
4551 <dl class="enumerate-enumitem&