Mercurial > hg > sv-dependency-builds
comparison src/libvorbis-1.3.3/doc/Vorbis_I_spec.html @ 1:05aa0afa9217
Bring in flac, ogg, vorbis
author | Chris Cannam |
---|---|
date | Tue, 19 Mar 2013 17:37:49 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:c7265573341e | 1:05aa0afa9217 |
---|---|
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.cse.ohio-state.edu/~gurari/TeX4ht/)"> | |
7 <meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)"> | |
8 <!-- html --> | |
9 <meta name="src" content="Vorbis_I_spec.tex"> | |
10 <meta name="date" content="2012-02-03 17:22:00"> | |
11 <link rel="stylesheet" type="text/css" href="Vorbis_I_spec.css"> | |
12 </head><body | |
13 > | |
14 <div class="maketitle"> | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 <h2 class="titleHead">Vorbis I specification</h2> | |
23 <div class="author" ><span | |
24 class="cmr-17">Xiph.Org Foundation</span></div><br /> | |
25 <div class="date" ><span | |
26 class="cmr-17">February 3, 2012</span></div> | |
27 </div> | |
28 <h3 class="likesectionHead"><a | |
29 id="x1-1000"></a>Contents</h3> | |
30 <div class="tableofcontents"> | |
31  <span class="sectionToc" >1 <a | |
32 href="#x1-20001" id="QQ2-1-2">Introduction and Description</a></span> | |
33 <br />  <span class="subsectionToc" >1.1 <a | |
34 href="#x1-30001.1" id="QQ2-1-3">Overview</a></span> | |
35 <br />   <span class="subsubsectionToc" >1.1.1 <a | |
36 href="#x1-40001.1.1" id="QQ2-1-4">Application</a></span> | |
37 <br />   <span class="subsubsectionToc" >1.1.2 <a | |
38 href="#x1-50001.1.2" id="QQ2-1-5">Classification</a></span> | |
39 <br />   <span class="subsubsectionToc" >1.1.3 <a | |
40 href="#x1-60001.1.3" id="QQ2-1-6">Assumptions</a></span> | |
41 <br />   <span class="subsubsectionToc" >1.1.4 <a | |
42 href="#x1-70001.1.4" id="QQ2-1-7">Codec Setup and Probability Model</a></span> | |
43 <br />   <span class="subsubsectionToc" >1.1.5 <a | |
44 href="#x1-90001.1.5" id="QQ2-1-9">Format Specification</a></span> | |
45 <br />   <span class="subsubsectionToc" >1.1.6 <a | |
46 href="#x1-100001.1.6" id="QQ2-1-10">Hardware Profile</a></span> | |
47 <br />  <span class="subsectionToc" >1.2 <a | |
48 href="#x1-110001.2" id="QQ2-1-11">Decoder Configuration</a></span> | |
49 <br />   <span class="subsubsectionToc" >1.2.1 <a | |
50 href="#x1-120001.2.1" id="QQ2-1-13">Global Config</a></span> | |
51 <br />   <span class="subsubsectionToc" >1.2.2 <a | |
52 href="#x1-130001.2.2" id="QQ2-1-14">Mode</a></span> | |
53 <br />   <span class="subsubsectionToc" >1.2.3 <a | |
54 href="#x1-140001.2.3" id="QQ2-1-15">Mapping</a></span> | |
55 | |
56 | |
57 | |
58 <br />   <span class="subsubsectionToc" >1.2.4 <a | |
59 href="#x1-150001.2.4" id="QQ2-1-16">Floor</a></span> | |
60 <br />   <span class="subsubsectionToc" >1.2.5 <a | |
61 href="#x1-160001.2.5" id="QQ2-1-17">Residue</a></span> | |
62 <br />   <span class="subsubsectionToc" >1.2.6 <a | |
63 href="#x1-170001.2.6" id="QQ2-1-18">Codebooks</a></span> | |
64 <br />  <span class="subsectionToc" >1.3 <a | |
65 href="#x1-180001.3" id="QQ2-1-19">High-level Decode Process</a></span> | |
66 <br />   <span class="subsubsectionToc" >1.3.1 <a | |
67 href="#x1-190001.3.1" id="QQ2-1-20">Decode Setup</a></span> | |
68 <br />   <span class="subsubsectionToc" >1.3.2 <a | |
69 href="#x1-230001.3.2" id="QQ2-1-24">Decode Procedure</a></span> | |
70 <br /> <span class="sectionToc" >2 <a | |
71 href="#x1-360002" id="QQ2-1-39">Bitpacking Convention</a></span> | |
72 <br />  <span class="subsectionToc" >2.1 <a | |
73 href="#x1-370002.1" id="QQ2-1-40">Overview</a></span> | |
74 <br />   <span class="subsubsectionToc" >2.1.1 <a | |
75 href="#x1-380002.1.1" id="QQ2-1-41">octets, bytes and words</a></span> | |
76 <br />   <span class="subsubsectionToc" >2.1.2 <a | |
77 href="#x1-390002.1.2" id="QQ2-1-42">bit order</a></span> | |
78 <br />   <span class="subsubsectionToc" >2.1.3 <a | |
79 href="#x1-400002.1.3" id="QQ2-1-43">byte order</a></span> | |
80 <br />   <span class="subsubsectionToc" >2.1.4 <a | |
81 href="#x1-410002.1.4" id="QQ2-1-44">coding bits into byte sequences</a></span> | |
82 <br />   <span class="subsubsectionToc" >2.1.5 <a | |
83 href="#x1-420002.1.5" id="QQ2-1-45">signedness</a></span> | |
84 <br />   <span class="subsubsectionToc" >2.1.6 <a | |
85 href="#x1-430002.1.6" id="QQ2-1-46">coding example</a></span> | |
86 <br />   <span class="subsubsectionToc" >2.1.7 <a | |
87 href="#x1-440002.1.7" id="QQ2-1-47">decoding example</a></span> | |
88 <br />   <span class="subsubsectionToc" >2.1.8 <a | |
89 href="#x1-450002.1.8" id="QQ2-1-48">end-of-packet alignment</a></span> | |
90 <br />   <span class="subsubsectionToc" >2.1.9 <a | |
91 href="#x1-460002.1.9" id="QQ2-1-49">reading zero bits</a></span> | |
92 <br /> <span class="sectionToc" >3 <a | |
93 href="#x1-470003" id="QQ2-1-50">Probability Model and Codebooks</a></span> | |
94 <br />  <span class="subsectionToc" >3.1 <a | |
95 href="#x1-480003.1" id="QQ2-1-51">Overview</a></span> | |
96 <br />   <span class="subsubsectionToc" >3.1.1 <a | |
97 href="#x1-490003.1.1" id="QQ2-1-52">Bitwise operation</a></span> | |
98 <br />  <span class="subsectionToc" >3.2 <a | |
99 href="#x1-500003.2" id="QQ2-1-53">Packed codebook format</a></span> | |
100 <br />   <span class="subsubsectionToc" >3.2.1 <a | |
101 href="#x1-510003.2.1" id="QQ2-1-54">codebook decode</a></span> | |
102 <br />  <span class="subsectionToc" >3.3 <a | |
103 href="#x1-570003.3" id="QQ2-1-62">Use of the codebook abstraction</a></span> | |
104 <br /> <span class="sectionToc" >4 <a | |
105 href="#x1-580004" id="QQ2-1-63">Codec Setup and Packet Decode</a></span> | |
106 <br />  <span class="subsectionToc" >4.1 <a | |
107 href="#x1-590004.1" id="QQ2-1-64">Overview</a></span> | |
108 <br />  <span class="subsectionToc" >4.2 <a | |
109 href="#x1-600004.2" id="QQ2-1-65">Header decode and decode setup</a></span> | |
110 <br />   <span class="subsubsectionToc" >4.2.1 <a | |
111 href="#x1-610004.2.1" id="QQ2-1-66">Common header decode</a></span> | |
112 <br />   <span class="subsubsectionToc" >4.2.2 <a | |
113 href="#x1-620004.2.2" id="QQ2-1-67">Identification header</a></span> | |
114 <br />   <span class="subsubsectionToc" >4.2.3 <a | |
115 href="#x1-630004.2.3" id="QQ2-1-68">Comment header</a></span> | |
116 | |
117 | |
118 | |
119 <br />   <span class="subsubsectionToc" >4.2.4 <a | |
120 href="#x1-640004.2.4" id="QQ2-1-69">Setup header</a></span> | |
121 <br />  <span class="subsectionToc" >4.3 <a | |
122 href="#x1-710004.3" id="QQ2-1-77">Audio packet decode and synthesis</a></span> | |
123 <br />   <span class="subsubsectionToc" >4.3.1 <a | |
124 href="#x1-720004.3.1" id="QQ2-1-78">packet type, mode and window decode</a></span> | |
125 <br />   <span class="subsubsectionToc" >4.3.2 <a | |
126 href="#x1-730004.3.2" id="QQ2-1-79">floor curve decode</a></span> | |
127 <br />   <span class="subsubsectionToc" >4.3.3 <a | |
128 href="#x1-740004.3.3" id="QQ2-1-80">nonzero vector propagate</a></span> | |
129 <br />   <span class="subsubsectionToc" >4.3.4 <a | |
130 href="#x1-750004.3.4" id="QQ2-1-81">residue decode</a></span> | |
131 <br />   <span class="subsubsectionToc" >4.3.5 <a | |
132 href="#x1-760004.3.5" id="QQ2-1-82">inverse coupling</a></span> | |
133 <br />   <span class="subsubsectionToc" >4.3.6 <a | |
134 href="#x1-770004.3.6" id="QQ2-1-83">dot product</a></span> | |
135 <br />   <span class="subsubsectionToc" >4.3.7 <a | |
136 href="#x1-780004.3.7" id="QQ2-1-84">inverse MDCT</a></span> | |
137 <br />   <span class="subsubsectionToc" >4.3.8 <a | |
138 href="#x1-790004.3.8" id="QQ2-1-85">overlap_add</a></span> | |
139 <br />   <span class="subsubsectionToc" >4.3.9 <a | |
140 href="#x1-800004.3.9" id="QQ2-1-86">output channel order</a></span> | |
141 <br /> <span class="sectionToc" >5 <a | |
142 href="#x1-810005" id="QQ2-1-87">comment field and header specification</a></span> | |
143 <br />  <span class="subsectionToc" >5.1 <a | |
144 href="#x1-820005.1" id="QQ2-1-88">Overview</a></span> | |
145 <br />  <span class="subsectionToc" >5.2 <a | |
146 href="#x1-830005.2" id="QQ2-1-89">Comment encoding</a></span> | |
147 <br />   <span class="subsubsectionToc" >5.2.1 <a | |
148 href="#x1-840005.2.1" id="QQ2-1-90">Structure</a></span> | |
149 <br />   <span class="subsubsectionToc" >5.2.2 <a | |
150 href="#x1-850005.2.2" id="QQ2-1-91">Content vector format</a></span> | |
151 <br />   <span class="subsubsectionToc" >5.2.3 <a | |
152 href="#x1-880005.2.3" id="QQ2-1-94">Encoding</a></span> | |
153 <br /> <span class="sectionToc" >6 <a | |
154 href="#x1-890006" id="QQ2-1-95">Floor type 0 setup and decode</a></span> | |
155 <br />  <span class="subsectionToc" >6.1 <a | |
156 href="#x1-900006.1" id="QQ2-1-96">Overview</a></span> | |
157 <br />  <span class="subsectionToc" >6.2 <a | |
158 href="#x1-910006.2" id="QQ2-1-97">Floor 0 format</a></span> | |
159 <br />   <span class="subsubsectionToc" >6.2.1 <a | |
160 href="#x1-920006.2.1" id="QQ2-1-98">header decode</a></span> | |
161 <br />   <span class="subsubsectionToc" >6.2.2 <a | |
162 href="#x1-930006.2.2" id="QQ2-1-99">packet decode</a></span> | |
163 <br />   <span class="subsubsectionToc" >6.2.3 <a | |
164 href="#x1-940006.2.3" id="QQ2-1-100">curve computation</a></span> | |
165 <br /> <span class="sectionToc" >7 <a | |
166 href="#x1-950007" id="QQ2-1-101">Floor type 1 setup and decode</a></span> | |
167 <br />  <span class="subsectionToc" >7.1 <a | |
168 href="#x1-960007.1" id="QQ2-1-102">Overview</a></span> | |
169 <br />  <span class="subsectionToc" >7.2 <a | |
170 href="#x1-970007.2" id="QQ2-1-103">Floor 1 format</a></span> | |
171 <br />   <span class="subsubsectionToc" >7.2.1 <a | |
172 href="#x1-980007.2.1" id="QQ2-1-104">model</a></span> | |
173 <br />   <span class="subsubsectionToc" >7.2.2 <a | |
174 href="#x1-990007.2.2" id="QQ2-1-109">header decode</a></span> | |
175 <br />   <span class="subsubsectionToc" >7.2.3 <a | |
176 href="#x1-1000007.2.3" id="QQ2-1-110">packet decode</a></span> | |
177 | |
178 | |
179 | |
180 <br />   <span class="subsubsectionToc" >7.2.4 <a | |
181 href="#x1-1010007.2.4" id="QQ2-1-111">curve computation</a></span> | |
182 <br /> <span class="sectionToc" >8 <a | |
183 href="#x1-1020008" id="QQ2-1-112">Residue setup and decode</a></span> | |
184 <br />  <span class="subsectionToc" >8.1 <a | |
185 href="#x1-1030008.1" id="QQ2-1-113">Overview</a></span> | |
186 <br />  <span class="subsectionToc" >8.2 <a | |
187 href="#x1-1040008.2" id="QQ2-1-114">Residue format</a></span> | |
188 <br />  <span class="subsectionToc" >8.3 <a | |
189 href="#x1-1050008.3" id="QQ2-1-116">residue 0</a></span> | |
190 <br />  <span class="subsectionToc" >8.4 <a | |
191 href="#x1-1060008.4" id="QQ2-1-117">residue 1</a></span> | |
192 <br />  <span class="subsectionToc" >8.5 <a | |
193 href="#x1-1070008.5" id="QQ2-1-118">residue 2</a></span> | |
194 <br />  <span class="subsectionToc" >8.6 <a | |
195 href="#x1-1080008.6" id="QQ2-1-120">Residue decode</a></span> | |
196 <br />   <span class="subsubsectionToc" >8.6.1 <a | |
197 href="#x1-1090008.6.1" id="QQ2-1-121">header decode</a></span> | |
198 <br />   <span class="subsubsectionToc" >8.6.2 <a | |
199 href="#x1-1100008.6.2" id="QQ2-1-122">packet decode</a></span> | |
200 <br />   <span class="subsubsectionToc" >8.6.3 <a | |
201 href="#x1-1110008.6.3" id="QQ2-1-123">format 0 specifics</a></span> | |
202 <br />   <span class="subsubsectionToc" >8.6.4 <a | |
203 href="#x1-1120008.6.4" id="QQ2-1-124">format 1 specifics</a></span> | |
204 <br />   <span class="subsubsectionToc" >8.6.5 <a | |
205 href="#x1-1130008.6.5" id="QQ2-1-125">format 2 specifics</a></span> | |
206 <br /> <span class="sectionToc" >9 <a | |
207 href="#x1-1140009" id="QQ2-1-126">Helper equations</a></span> | |
208 <br />  <span class="subsectionToc" >9.1 <a | |
209 href="#x1-1150009.1" id="QQ2-1-127">Overview</a></span> | |
210 <br />  <span class="subsectionToc" >9.2 <a | |
211 href="#x1-1160009.2" id="QQ2-1-128">Functions</a></span> | |
212 <br />   <span class="subsubsectionToc" >9.2.1 <a | |
213 href="#x1-1170009.2.1" id="QQ2-1-129">ilog</a></span> | |
214 <br />   <span class="subsubsectionToc" >9.2.2 <a | |
215 href="#x1-1180009.2.2" id="QQ2-1-130">float32_unpack</a></span> | |
216 <br />   <span class="subsubsectionToc" >9.2.3 <a | |
217 href="#x1-1190009.2.3" id="QQ2-1-131">lookup1_values</a></span> | |
218 <br />   <span class="subsubsectionToc" >9.2.4 <a | |
219 href="#x1-1200009.2.4" id="QQ2-1-132">low_neighbor</a></span> | |
220 <br />   <span class="subsubsectionToc" >9.2.5 <a | |
221 href="#x1-1210009.2.5" id="QQ2-1-133">high_neighbor</a></span> | |
222 <br />   <span class="subsubsectionToc" >9.2.6 <a | |
223 href="#x1-1220009.2.6" id="QQ2-1-134">render_point</a></span> | |
224 <br />   <span class="subsubsectionToc" >9.2.7 <a | |
225 href="#x1-1230009.2.7" id="QQ2-1-135">render_line</a></span> | |
226 <br /> <span class="sectionToc" >10 <a | |
227 href="#x1-12400010" id="QQ2-1-136">Tables</a></span> | |
228 <br />  <span class="subsectionToc" >10.1 <a | |
229 href="#x1-12500010.1" id="QQ2-1-137">floor1_inverse_dB_table</a></span> | |
230 <br /> <span class="sectionToc" >A <a | |
231 href="#x1-126000A" id="QQ2-1-138">Embedding Vorbis into an Ogg stream</a></span> | |
232 <br />  <span class="subsectionToc" >A.1 <a | |
233 href="#x1-127000A.1" id="QQ2-1-139">Overview</a></span> | |
234 <br />   <span class="subsubsectionToc" >A.1.1 <a | |
235 href="#x1-128000A.1.1" id="QQ2-1-140">Restrictions</a></span> | |
236 <br />   <span class="subsubsectionToc" >A.1.2 <a | |
237 href="#x1-129000A.1.2" id="QQ2-1-141">MIME type</a></span> | |
238 | |
239 | |
240 | |
241 <br />  <span class="subsectionToc" >A.2 <a | |
242 href="#x1-130000A.2" id="QQ2-1-142">Encapsulation</a></span> | |
243 <br /> <span class="sectionToc" >B <a | |
244 href="#x1-132000B" id="QQ2-1-144">Vorbis encapsulation in RTP</a></span> | |
245 </div> | |
246 | |
247 | |
248 | |
249 <h3 class="sectionHead"><span class="titlemark">1. </span> <a | |
250 id="x1-20001"></a>Introduction and Description</h3> | |
251 <!--l. 6--><p class="noindent" > | |
252 <h4 class="subsectionHead"><span class="titlemark">1.1. </span> <a | |
253 id="x1-30001.1"></a>Overview</h4> | |
254 <!--l. 8--><p class="noindent" >This document provides a high level description of the Vorbis codec’s construction. A bit-by-bit | |
255 specification appears beginning in <a | |
256 href="#x1-580004">Section 4</a>, “<a | |
257 href="#x1-580004">Codec Setup and Packet Decode<!--tex4ht:ref: vorbis:spec:codec --></a>”. The later | |
258 sections assume a high-level understanding of the Vorbis decode process, which is provided | |
259 here. | |
260 <!--l. 15--><p class="noindent" > | |
261 <h5 class="subsubsectionHead"><span class="titlemark">1.1.1. </span> <a | |
262 id="x1-40001.1.1"></a>Application</h5> | |
263 <!--l. 16--><p class="noindent" >Vorbis is a general purpose perceptual audio CODEC intended to allow maximum encoder | |
264 flexibility, thus allowing it to scale competitively over an exceptionally wide range of bitrates. At | |
265 the high quality/bitrate end of the scale (CD or DAT rate stereo, 16/24 bits) it is in the same | |
266 league as MPEG-2 and MPC. Similarly, the 1.0 encoder can encode high-quality CD and DAT | |
267 rate stereo at below 48kbps without resampling to a lower rate. Vorbis is also intended for lower | |
268 and higher sample rates (from 8kHz telephony to 192kHz digital masters) and a range of channel | |
269 representations (monaural, polyphonic, stereo, quadraphonic, 5.1, ambisonic, or up to 255 | |
270 discrete channels). | |
271 <!--l. 29--><p class="noindent" > | |
272 <h5 class="subsubsectionHead"><span class="titlemark">1.1.2. </span> <a | |
273 id="x1-50001.1.2"></a>Classification</h5> | |
274 <!--l. 30--><p class="noindent" >Vorbis I is a forward-adaptive monolithic transform CODEC based on the Modified Discrete | |
275 Cosine Transform. The codec is structured to allow addition of a hybrid wavelet filterbank in | |
276 Vorbis II to offer better transient response and reproduction using a transform better suited to | |
277 localized time events. | |
278 | |
279 | |
280 | |
281 <!--l. 37--><p class="noindent" > | |
282 <h5 class="subsubsectionHead"><span class="titlemark">1.1.3. </span> <a | |
283 id="x1-60001.1.3"></a>Assumptions</h5> | |
284 <!--l. 39--><p class="noindent" >The Vorbis CODEC design assumes a complex, psychoacoustically-aware encoder and simple, | |
285 low-complexity decoder. Vorbis decode is computationally simpler than mp3, although it does | |
286 require more working memory as Vorbis has no static probability model; the vector codebooks | |
287 used in the first stage of decoding from the bitstream are packed in their entirety into the Vorbis | |
288 bitstream headers. In packed form, these codebooks occupy only a few kilobytes; the extent to | |
289 which they are pre-decoded into a cache is the dominant factor in decoder memory | |
290 usage. | |
291 <!--l. 50--><p class="noindent" >Vorbis provides none of its own framing, synchronization or protection against errors; it | |
292 is solely a method of accepting input audio, dividing it into individual frames and | |
293 compressing these frames into raw, unformatted ’packets’. The decoder then accepts | |
294 these raw packets in sequence, decodes them, synthesizes audio frames from them, and | |
295 reassembles the frames into a facsimile of the original audio stream. Vorbis is a free-form | |
296 variable bit rate (VBR) codec and packets have no minimum size, maximum size, or | |
297 fixed/expected size. Packets are designed that they may be truncated (or padded) | |
298 and remain decodable; this is not to be considered an error condition and is used | |
299 extensively in bitrate management in peeling. Both the transport mechanism and | |
300 decoder must allow that a packet may be any size, or end before or after packet decode | |
301 expects. | |
302 <!--l. 64--><p class="noindent" >Vorbis packets are thus intended to be used with a transport mechanism that provides free-form | |
303 framing, sync, positioning and error correction in accordance with these design assumptions, such | |
304 as Ogg (for file transport) or RTP (for network multicast). For purposes of a few examples in this | |
305 document, we will assume that Vorbis is to be embedded in an Ogg stream specifically, | |
306 although this is by no means a requirement or fundamental assumption in the Vorbis | |
307 design. | |
308 <!--l. 72--><p class="noindent" >The specification for embedding Vorbis into an Ogg transport stream is in <a | |
309 href="#x1-126000A">Section A</a>, | |
310 “<a | |
311 href="#x1-126000A">Embedding Vorbis into an Ogg stream<!--tex4ht:ref: vorbis:over:ogg --></a>”. | |
312 <!--l. 77--><p class="noindent" > | |
313 <h5 class="subsubsectionHead"><span class="titlemark">1.1.4. </span> <a | |
314 id="x1-70001.1.4"></a>Codec Setup and Probability Model</h5> | |
315 <!--l. 79--><p class="noindent" >Vorbis’ heritage is as a research CODEC and its current design reflects a desire to allow multiple | |
316 decades of continuous encoder improvement before running out of room within the codec | |
317 specification. For these reasons, configurable aspects of codec setup intentionally lean toward the | |
318 extreme of forward adaptive. | |
319 | |
320 | |
321 | |
322 <!--l. 85--><p class="noindent" >The single most controversial design decision in Vorbis (and the most unusual for a Vorbis | |
323 developer to keep in mind) is that the entire probability model of the codec, the Huffman and | |
324 VQ codebooks, is packed into the bitstream header along with extensive CODEC setup | |
325 parameters (often several hundred fields). This makes it impossible, as it would be with | |
326 MPEG audio layers, to embed a simple frame type flag in each audio packet, or begin | |
327 decode at any frame in the stream without having previously fetched the codec setup | |
328 header. | |
329 <!--l. 95--><p class="noindent" ><span class="likesubparagraphHead"><a | |
330 id="x1-80001.1.4"></a><span | |
331 class="cmbx-12">Note:</span></span> Vorbis <span | |
332 class="cmti-12">can </span>initiate decode at any arbitrary packet within a bitstream so long as the codec | |
333 has been initialized/setup with the setup headers. | |
334 <!--l. 101--><p class="noindent" >Thus, Vorbis headers are both required for decode to begin and relatively large as bitstream | |
335 headers go. The header size is unbounded, although for streaming a rule-of-thumb of 4kB or less | |
336 is recommended (and Xiph.Org’s Vorbis encoder follows this suggestion). | |
337 <!--l. 106--><p class="noindent" >Our own design work indicates the primary liability of the required header is in mindshare; it is | |
338 an unusual design and thus causes some amount of complaint among engineers as this runs | |
339 against current design trends (and also points out limitations in some existing software/interface | |
340 designs, such as Windows’ ACM codec framework). However, we find that it does not | |
341 fundamentally limit Vorbis’ suitable application space. | |
342 <!--l. 115--><p class="noindent" > | |
343 <h5 class="subsubsectionHead"><span class="titlemark">1.1.5. </span> <a | |
344 id="x1-90001.1.5"></a>Format Specification</h5> | |
345 <!--l. 116--><p class="noindent" >The Vorbis format is well-defined by its decode specification; any encoder that produces packets | |
346 that are correctly decoded by the reference Vorbis decoder described below may be considered | |
347 a proper Vorbis encoder. A decoder must faithfully and completely implement the | |
348 specification defined below (except where noted) to be considered a proper Vorbis | |
349 decoder. | |
350 <!--l. 123--><p class="noindent" > | |
351 <h5 class="subsubsectionHead"><span class="titlemark">1.1.6. </span> <a | |
352 id="x1-100001.1.6"></a>Hardware Profile</h5> | |
353 | |
354 | |
355 | |
356 <!--l. 124--><p class="noindent" >Although Vorbis decode is computationally simple, it may still run into specific limitations of an | |
357 embedded design. For this reason, embedded designs are allowed to deviate in limited ways from | |
358 the ‘full’ decode specification yet still be certified compliant. These optional omissions are | |
359 labelled in the spec where relevant. | |
360 <!--l. 131--><p class="noindent" > | |
361 <h4 class="subsectionHead"><span class="titlemark">1.2. </span> <a | |
362 id="x1-110001.2"></a>Decoder Configuration</h4> | |
363 <!--l. 133--><p class="noindent" >Decoder setup consists of configuration of multiple, self-contained component abstractions that | |
364 perform specific functions in the decode pipeline. Each different component instance of a specific | |
365 type is semantically interchangeable; decoder configuration consists both of internal component | |
366 configuration, as well as arrangement of specific instances into a decode pipeline. Componentry | |
367 arrangement is roughly as follows: | |
368 <div class="center" | |
369 > | |
370 <!--l. 141--><p class="noindent" > | |
371 | |
372 <!--l. 142--><p class="noindent" ><img | |
373 src="components.png" alt="PIC" | |
374 > | |
375 <br /> <div class="caption" | |
376 ><span class="id">Figure 1: </span><span | |
377 class="content">decoder pipeline configuration</span></div><!--tex4ht:label?: x1-110011 --> | |
378 </div> | |
379 <!--l. 146--><p class="noindent" > | |
380 <h5 class="subsubsectionHead"><span class="titlemark">1.2.1. </span> <a | |
381 id="x1-120001.2.1"></a>Global Config</h5> | |
382 <!--l. 147--><p class="noindent" >Global codec configuration consists of a few audio related fields (sample rate, channels), Vorbis | |
383 version (always ’0’ in Vorbis I), bitrate hints, and the lists of component instances. All other | |
384 configuration is in the context of specific components. | |
385 <!--l. 152--><p class="noindent" > | |
386 <h5 class="subsubsectionHead"><span class="titlemark">1.2.2. </span> <a | |
387 id="x1-130001.2.2"></a>Mode</h5> | |
388 | |
389 | |
390 | |
391 <!--l. 154--><p class="noindent" >Each Vorbis frame is coded according to a master ’mode’. A bitstream may use one or many | |
392 modes. | |
393 <!--l. 157--><p class="noindent" >The mode mechanism is used to encode a frame according to one of multiple possible | |
394 methods with the intention of choosing a method best suited to that frame. Different | |
395 modes are, e.g. how frame size is changed from frame to frame. The mode number of a | |
396 frame serves as a top level configuration switch for all other specific aspects of frame | |
397 decode. | |
398 <!--l. 164--><p class="noindent" >A ’mode’ configuration consists of a frame size setting, window type (always 0, the Vorbis | |
399 window, in Vorbis I), transform type (always type 0, the MDCT, in Vorbis I) and a mapping | |
400 number. The mapping number specifies which mapping configuration instance to use for low-level | |
401 packet decode and synthesis. | |
402 <!--l. 171--><p class="noindent" > | |
403 <h5 class="subsubsectionHead"><span class="titlemark">1.2.3. </span> <a | |
404 id="x1-140001.2.3"></a>Mapping</h5> | |
405 <!--l. 173--><p class="noindent" >A mapping contains a channel coupling description and a list of ’submaps’ that bundle sets | |
406 of channel vectors together for grouped encoding and decoding. These submaps are | |
407 not references to external components; the submap list is internal and specific to a | |
408 mapping. | |
409 <!--l. 178--><p class="noindent" >A ’submap’ is a configuration/grouping that applies to a subset of floor and residue vectors | |
410 within a mapping. The submap functions as a last layer of indirection such that specific special | |
411 floor or residue settings can be applied not only to all the vectors in a given mode, but also | |
412 specific vectors in a specific mode. Each submap specifies the proper floor and residue | |
413 instance number to use for decoding that submap’s spectral floor and spectral residue | |
414 vectors. | |
415 <!--l. 186--><p class="noindent" >As an example: | |
416 <!--l. 188--><p class="noindent" >Assume a Vorbis stream that contains six channels in the standard 5.1 format. The sixth | |
417 channel, as is normal in 5.1, is bass only. Therefore it would be wasteful to encode a | |
418 full-spectrum version of it as with the other channels. The submapping mechanism can be used | |
419 to apply a full range floor and residue encoding to channels 0 through 4, and a bass-only | |
420 representation to the bass channel, thus saving space. In this example, channels 0-4 belong to | |
421 submap 0 (which indicates use of a full-range floor) and channel 5 belongs to submap 1, which | |
422 uses a bass-only representation. | |
423 | |
424 | |
425 | |
426 <!--l. 199--><p class="noindent" > | |
427 <h5 class="subsubsectionHead"><span class="titlemark">1.2.4. </span> <a | |
428 id="x1-150001.2.4"></a>Floor</h5> | |
429 <!--l. 201--><p class="noindent" >Vorbis encodes a spectral ’floor’ vector for each PCM channel. This vector is a low-resolution | |
430 representation of the audio spectrum for the given channel in the current frame, generally used | |
431 akin to a whitening filter. It is named a ’floor’ because the Xiph.Org reference encoder has | |
432 historically used it as a unit-baseline for spectral resolution. | |
433 <!--l. 208--><p class="noindent" >A floor encoding may be of two types. Floor 0 uses a packed LSP representation on a dB | |
434 amplitude scale and Bark frequency scale. Floor 1 represents the curve as a piecewise linear | |
435 interpolated representation on a dB amplitude scale and linear frequency scale. The two floors | |
436 are semantically interchangeable in encoding/decoding. However, floor type 1 provides more | |
437 stable inter-frame behavior, and so is the preferred choice in all coupled-stereo and | |
438 high bitrate modes. Floor 1 is also considerably less expensive to decode than floor | |
439 0. | |
440 <!--l. 218--><p class="noindent" >Floor 0 is not to be considered deprecated, but it is of limited modern use. No known Vorbis | |
441 encoder past Xiph.Org’s own beta 4 makes use of floor 0. | |
442 <!--l. 222--><p class="noindent" >The values coded/decoded by a floor are both compactly formatted and make use of entropy | |
443 coding to save space. For this reason, a floor configuration generally refers to multiple | |
444 codebooks in the codebook component list. Entropy coding is thus provided as an | |
445 abstraction, and each floor instance may choose from any and all available codebooks when | |
446 coding/decoding. | |
447 <!--l. 230--><p class="noindent" > | |
448 <h5 class="subsubsectionHead"><span class="titlemark">1.2.5. </span> <a | |
449 id="x1-160001.2.5"></a>Residue</h5> | |
450 <!--l. 231--><p class="noindent" >The spectral residue is the fine structure of the audio spectrum once the floor curve has been | |
451 subtracted out. In simplest terms, it is coded in the bitstream using cascaded (multi-pass) vector | |
452 quantization according to one of three specific packing/coding algorithms numbered | |
453 0 through 2. The packing algorithm details are configured by residue instance. As | |
454 with the floor components, the final VQ/entropy encoding is provided by external | |
455 codebook instances and each residue instance may choose from any and all available | |
456 codebooks. | |
457 <!--l. 241--><p class="noindent" > | |
458 | |
459 | |
460 | |
461 <h5 class="subsubsectionHead"><span class="titlemark">1.2.6. </span> <a | |
462 id="x1-170001.2.6"></a>Codebooks</h5> | |
463 <!--l. 243--><p class="noindent" >Codebooks are a self-contained abstraction that perform entropy decoding and, optionally, use | |
464 the entropy-decoded integer value as an offset into an index of output value vectors, returning | |
465 the indicated vector of values. | |
466 <!--l. 248--><p class="noindent" >The entropy coding in a Vorbis I codebook is provided by a standard Huffman binary tree | |
467 representation. This tree is tightly packed using one of several methods, depending on whether | |
468 codeword lengths are ordered or unordered, or the tree is sparse. | |
469 <!--l. 253--><p class="noindent" >The codebook vector index is similarly packed according to index characteristic. Most commonly, | |
470 the vector index is encoded as a single list of values of possible values that are then permuted | |
471 into a list of n-dimensional rows (lattice VQ). | |
472 <!--l. 260--><p class="noindent" > | |
473 <h4 class="subsectionHead"><span class="titlemark">1.3. </span> <a | |
474 id="x1-180001.3"></a>High-level Decode Process</h4> | |
475 <!--l. 262--><p class="noindent" > | |
476 <h5 class="subsubsectionHead"><span class="titlemark">1.3.1. </span> <a | |
477 id="x1-190001.3.1"></a>Decode Setup</h5> | |
478 <!--l. 264--><p class="noindent" >Before decoding can begin, a decoder must initialize using the bitstream headers matching the | |
479 stream to be decoded. Vorbis uses three header packets; all are required, in-order, by | |
480 this specification. Once set up, decode may begin at any audio packet belonging to | |
481 the Vorbis stream. In Vorbis I, all packets after the three initial headers are audio | |
482 packets. | |
483 <!--l. 271--><p class="noindent" >The header packets are, in order, the identification header, the comments header, and the setup | |
484 header. | |
485 <!--l. 274--><p class="noindent" ><span class="paragraphHead"><a | |
486 id="x1-200001.3.1"></a><span | |
487 class="cmbx-12">Identification Header</span></span> | |
488 The identification header identifies the bitstream as Vorbis, Vorbis version, and the simple audio | |
489 characteristics of the stream such as sample rate and number of channels. | |
490 | |
491 | |
492 | |
493 <!--l. 279--><p class="noindent" ><span class="paragraphHead"><a | |
494 id="x1-210001.3.1"></a><span | |
495 class="cmbx-12">Comment Header</span></span> | |
496 The comment header includes user text comments (“tags”) and a vendor string for the | |
497 application/library that produced the bitstream. The encoding and proper use of the comment | |
498 header is described in <a | |
499 href="#x1-810005">Section 5</a>, “<a | |
500 href="#x1-810005">comment field and header specification<!--tex4ht:ref: vorbis:spec:comment --></a>”. | |
501 <!--l. 284--><p class="noindent" ><span class="paragraphHead"><a | |
502 id="x1-220001.3.1"></a><span | |
503 class="cmbx-12">Setup Header</span></span> | |
504 The setup header includes extensive CODEC setup information as well as the complete VQ and | |
505 Huffman codebooks needed for decode. | |
506 <!--l. 289--><p class="noindent" > | |
507 <h5 class="subsubsectionHead"><span class="titlemark">1.3.2. </span> <a | |
508 id="x1-230001.3.2"></a>Decode Procedure</h5> | |
509 <!--l. 291--><p class="noindent" >The decoding and synthesis procedure for all audio packets is fundamentally the same. | |
510 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
511 1. </dt><dd | |
512 class="enumerate-enumitem">decode packet type flag | |
513 </dd><dt class="enumerate-enumitem"> | |
514 2. </dt><dd | |
515 class="enumerate-enumitem">decode mode number | |
516 </dd><dt class="enumerate-enumitem"> | |
517 3. </dt><dd | |
518 class="enumerate-enumitem">decode window shape (long windows only) | |
519 </dd><dt class="enumerate-enumitem"> | |
520 4. </dt><dd | |
521 class="enumerate-enumitem">decode floor | |
522 </dd><dt class="enumerate-enumitem"> | |
523 5. </dt><dd | |
524 class="enumerate-enumitem">decode residue into residue vectors | |
525 </dd><dt class="enumerate-enumitem"> | |
526 6. </dt><dd | |
527 class="enumerate-enumitem">inverse channel coupling of residue vectors | |
528 </dd><dt class="enumerate-enumitem"> | |
529 7. </dt><dd | |
530 class="enumerate-enumitem">generate floor curve from decoded floor data | |
531 </dd><dt class="enumerate-enumitem"> | |
532 8. </dt><dd | |
533 class="enumerate-enumitem">compute dot product of floor and residue, producing audio spectrum vector | |
534 </dd><dt class="enumerate-enumitem"> | |
535 9. </dt><dd | |
536 class="enumerate-enumitem">inverse monolithic transform of audio spectrum vector, always an MDCT in Vorbis | |
537 I | |
538 | |
539 | |
540 | |
541 </dd><dt class="enumerate-enumitem"> | |
542 10. </dt><dd | |
543 class="enumerate-enumitem">overlap/add left-hand output of transform with right-hand output of previous frame | |
544 </dd><dt class="enumerate-enumitem"> | |
545 11. </dt><dd | |
546 class="enumerate-enumitem">store right hand-data from transform of current frame for future lapping | |
547 </dd><dt class="enumerate-enumitem"> | |
548 12. </dt><dd | |
549 class="enumerate-enumitem">if not first frame, return results of overlap/add as audio result of current frame</dd></dl> | |
550 <!--l. 308--><p class="noindent" >Note that clever rearrangement of the synthesis arithmetic is possible; as an example, one can | |
551 take advantage of symmetries in the MDCT to store the right-hand transform data of a partial | |
552 MDCT for a 50% inter-frame buffer space savings, and then complete the transform later before | |
553 overlap/add with the next frame. This optimization produces entirely equivalent output and is | |
554 naturally perfectly legal. The decoder must be <span | |
555 class="cmti-12">entirely mathematically equivalent </span>to the | |
556 specification, it need not be a literal semantic implementation. | |
557 <!--l. 317--><p class="noindent" ><span class="paragraphHead"><a | |
558 id="x1-240001.3.2"></a><span | |
559 class="cmbx-12">Packet type decode</span></span> | |
560 Vorbis I uses four packet types. The first three packet types mark each of the three Vorbis | |
561 headers described above. The fourth packet type marks an audio packet. All other packet types | |
562 are reserved; packets marked with a reserved type should be ignored. | |
563 <!--l. 324--><p class="noindent" >Following the three header packets, all packets in a Vorbis I stream are audio. The first step of | |
564 audio packet decode is to read and verify the packet type; <span | |
565 class="cmti-12">a non-audio packet when audio is</span> | |
566 <span | |
567 class="cmti-12">expected indicates stream corruption or a non-compliant stream. The decoder must ignore the</span> | |
568 <span | |
569 class="cmti-12">packet and not attempt decoding it to audio</span>. | |
570 <!--l. 334--><p class="noindent" ><span class="paragraphHead"><a | |
571 id="x1-250001.3.2"></a><span | |
572 class="cmbx-12">Mode decode</span></span> | |
573 Vorbis allows an encoder to set up multiple, numbered packet ’modes’, as described earlier, all of | |
574 which may be used in a given Vorbis stream. The mode is encoded as an integer used as a direct | |
575 offset into the mode instance index. | |
576 <!--l. 341--><p class="noindent" ><span class="paragraphHead"><a | |
577 id="x1-260001.3.2"></a><span | |
578 class="cmbx-12">Window shape decode (long windows only)</span></span> | |
579 Vorbis frames may be one of two PCM sample sizes specified during codec setup. In Vorbis I, | |
580 legal frame sizes are powers of two from 64 to 8192 samples. Aside from coupling, Vorbis | |
581 handles channels as independent vectors and these frame sizes are in samples per | |
582 channel. | |
583 | |
584 | |
585 | |
586 <!--l. 348--><p class="noindent" >Vorbis uses an overlapping transform, namely the MDCT, to blend one frame into the next, | |
587 avoiding most inter-frame block boundary artifacts. The MDCT output of one frame is windowed | |
588 according to MDCT requirements, overlapped 50% with the output of the previous frame and | |
589 added. The window shape assures seamless reconstruction. | |
590 <!--l. 354--><p class="noindent" >This is easy to visualize in the case of equal sized-windows: | |
591 <div class="center" | |
592 > | |
593 <!--l. 356--><p class="noindent" > | |
594 | |
595 <!--l. 357--><p class="noindent" ><img | |
596 src="window1.png" alt="PIC" | |
597 > | |
598 <br /> <div class="caption" | |
599 ><span class="id">Figure 2: </span><span | |
600 class="content">overlap of two equal-sized windows</span></div><!--tex4ht:label?: x1-260012 --> | |
601 </div> | |
602 <!--l. 361--><p class="noindent" >And slightly more complex in the case of overlapping unequal sized windows: | |
603 <div class="center" | |
604 > | |
605 <!--l. 364--><p class="noindent" > | |
606 | |
607 <!--l. 365--><p class="noindent" ><img | |
608 src="window2.png" alt="PIC" | |
609 > | |
610 <br /> <div class="caption" | |
611 ><span class="id">Figure 3: </span><span | |
612 class="content">overlap of a long and a short window</span></div><!--tex4ht:label?: x1-260023 --> | |
613 </div> | |
614 <!--l. 369--><p class="noindent" >In the unequal-sized window case, the window shape of the long window must be modified for | |
615 seamless lapping as above. It is possible to correctly infer window shape to be applied to the | |
616 current window from knowing the sizes of the current, previous and next window. It is legal for a | |
617 decoder to use this method. However, in the case of a long window (short windows require no | |
618 modification), Vorbis also codes two flag bits to specify pre- and post- window shape. Although | |
619 not strictly necessary for function, this minor redundancy allows a packet to be fully decoded to | |
620 the point of lapping entirely independently of any other packet, allowing easier abstraction of | |
621 decode layers as well as allowing a greater level of easy parallelism in encode and | |
622 decode. | |
623 <!--l. 382--><p class="noindent" >A description of valid window functions for use with an inverse MDCT can be found in <span class="cite">[<a | |
624 href="#XSporer/Brandenburg/Edler">1</a>]</span>. | |
625 Vorbis windows all use the slope function | |
626 <center class="math-display" > | |
627 <img | |
628 src="Vorbis_I_spec0x.png" alt="y = sin (.5 ∗ π sin2((x + .5)∕n ∗ π)). | |
629 | |
630 | |
631 | |
632 " class="math-display" ></center> | |
633 <!--l. 385--><p class="nopar" > | |
634 <!--l. 389--><p class="noindent" ><span class="paragraphHead"><a | |
635 id="x1-270001.3.2"></a><span | |
636 class="cmbx-12">floor decode</span></span> | |
637 Each floor is encoded/decoded in channel order, however each floor belongs to a ’submap’ that | |
638 specifies which floor configuration to use. All floors are decoded before residue decode | |
639 begins. | |
640 <!--l. 395--><p class="noindent" ><span class="paragraphHead"><a | |
641 id="x1-280001.3.2"></a><span | |
642 class="cmbx-12">residue decode</span></span> | |
643 Although the number of residue vectors equals the number of channels, channel coupling may | |
644 mean that the raw residue vectors extracted during decode do not map directly to specific | |
645 channels. When channel coupling is in use, some vectors will correspond to coupled magnitude or | |
646 angle. The coupling relationships are described in the codec setup and may differ from frame to | |
647 frame, due to different mode numbers. | |
648 <!--l. 404--><p class="noindent" >Vorbis codes residue vectors in groups by submap; the coding is done in submap order from | |
649 submap 0 through n-1. This differs from floors which are coded using a configuration provided by | |
650 submap number, but are coded individually in channel order. | |
651 <!--l. 411--><p class="noindent" ><span class="paragraphHead"><a | |
652 id="x1-290001.3.2"></a><span | |
653 class="cmbx-12">inverse channel coupling</span></span> | |
654 A detailed discussion of stereo in the Vorbis codec can be found in the document | |
655 <a | |
656 href="stereo.html" >Stereo Channel Coupling in the Vorbis CODEC</a>. Vorbis is not limited to only stereo | |
657 coupling, but the stereo document also gives a good overview of the generic coupling | |
658 mechanism. | |
659 <!--l. 419--><p class="noindent" >Vorbis coupling applies to pairs of residue vectors at a time; decoupling is done in-place a | |
660 pair at a time in the order and using the vectors specified in the current mapping | |
661 configuration. The decoupling operation is the same for all pairs, converting square polar | |
662 representation (where one vector is magnitude and the second angle) back to Cartesian | |
663 representation. | |
664 <!--l. 426--><p class="noindent" >After decoupling, in order, each pair of vectors on the coupling list, the resulting residue vectors | |
665 represent the fine spectral detail of each output channel. | |
666 | |
667 | |
668 | |
669 <!--l. 432--><p class="noindent" ><span class="paragraphHead"><a | |
670 id="x1-300001.3.2"></a><span | |
671 class="cmbx-12">generate floor curve</span></span> | |
672 The decoder may choose to generate the floor curve at any appropriate time. It is reasonable to | |
673 generate the output curve when the floor data is decoded from the raw packet, or it | |
674 can be generated after inverse coupling and applied to the spectral residue directly, | |
675 combining generation and the dot product into one step and eliminating some working | |
676 space. | |
677 <!--l. 441--><p class="noindent" >Both floor 0 and floor 1 generate a linear-range, linear-domain output vector to be multiplied | |
678 (dot product) by the linear-range, linear-domain spectral residue. | |
679 <!--l. 447--><p class="noindent" ><span class="paragraphHead"><a | |
680 id="x1-310001.3.2"></a><span | |
681 class="cmbx-12">compute floor/residue dot product</span></span> | |
682 This step is straightforward; for each output channel, the decoder multiplies the floor curve and | |
683 residue vectors element by element, producing the finished audio spectrum of each | |
684 channel. | |
685 <!--l. 455--><p class="noindent" >One point is worth mentioning about this dot product; a common mistake in a fixed point | |
686 implementation might be to assume that a 32 bit fixed-point representation for floor and | |
687 residue and direct multiplication of the vectors is sufficient for acceptable spectral depth | |
688 in all cases because it happens to mostly work with the current Xiph.Org reference | |
689 encoder. | |
690 <!--l. 462--><p class="noindent" >However, floor vector values can span <span | |
691 class="cmsy-10x-x-120">∼</span>140dB (<span | |
692 class="cmsy-10x-x-120">∼</span>24 bits unsigned), and the audio spectrum | |
693 vector should represent a minimum of 120dB (<span | |
694 class="cmsy-10x-x-120">∼</span>21 bits with sign), even when output is to a 16 | |
695 bit PCM device. For the residue vector to represent full scale if the floor is nailed | |
696 to <span | |
697 class="cmsy-10x-x-120">−</span>140dB, it must be able to span 0 to +140dB. For the residue vector to reach | |
698 full scale if the floor is nailed at 0dB, it must be able to represent <span | |
699 class="cmsy-10x-x-120">−</span>140dB to +0dB. | |
700 Thus, in order to handle full range dynamics, a residue vector may span <span | |
701 class="cmsy-10x-x-120">−</span>140dB to | |
702 +140dB entirely within spec. A 280dB range is approximately 48 bits with sign; thus the | |
703 residue vector must be able to represent a 48 bit range and the dot product must | |
704 be able to handle an effective 48 bit times 24 bit multiplication. This range may be | |
705 achieved using large (64 bit or larger) integers, or implementing a movable binary point | |
706 representation. | |
707 <!--l. 479--><p class="noindent" ><span class="paragraphHead"><a | |
708 id="x1-320001.3.2"></a><span | |
709 class="cmbx-12">inverse monolithic transform (MDCT)</span></span> | |
710 The audio spectrum is converted back into time domain PCM audio via an inverse Modified | |
711 Discrete Cosine Transform (MDCT). A detailed description of the MDCT is available in | |
712 <span class="cite">[<a | |
713 href="#XSporer/Brandenburg/Edler">1</a>]</span>. | |
714 <!--l. 485--><p class="noindent" >Note that the PCM produced directly from the MDCT is not yet finished audio; it must be | |
715 | |
716 | |
717 | |
718 lapped with surrounding frames using an appropriate window (such as the Vorbis window) before | |
719 the MDCT can be considered orthogonal. | |
720 <!--l. 492--><p class="noindent" ><span class="paragraphHead"><a | |
721 id="x1-330001.3.2"></a><span | |
722 class="cmbx-12">overlap/add data</span></span> | |
723 Windowed MDCT output is overlapped and added with the right hand data of the previous | |
724 window such that the 3/4 point of the previous window is aligned with the 1/4 point of the | |
725 current window (as illustrated in the window overlap diagram). At this point, the audio data | |
726 between the center of the previous frame and the center of the current frame is now finished and | |
727 ready to be returned. | |
728 <!--l. 501--><p class="noindent" ><span class="paragraphHead"><a | |
729 id="x1-340001.3.2"></a><span | |
730 class="cmbx-12">cache right hand data</span></span> | |
731 The decoder must cache the right hand portion of the current frame to be lapped with the left | |
732 hand portion of the next frame. | |
733 <!--l. 507--><p class="noindent" ><span class="paragraphHead"><a | |
734 id="x1-350001.3.2"></a><span | |
735 class="cmbx-12">return finished audio data</span></span> | |
736 The overlapped portion produced from overlapping the previous and current frame data | |
737 is finished data to be returned by the decoder. This data spans from the center of | |
738 the previous window to the center of the current window. In the case of same-sized | |
739 windows, the amount of data to return is one-half block consisting of and only of the | |
740 overlapped portions. When overlapping a short and long window, much of the returned | |
741 range is not actually overlap. This does not damage transform orthogonality. Pay | |
742 attention however to returning the correct data range; the amount of data to be returned | |
743 is: | |
744 <!--l. 519--><p class="noindent" > | |
745 <div class="fancyvrb" id="fancyvrb1"> | |
746 <a | |
747 id="x1-35002r1"></a><span | |
748 class="cmr-6">1</span><span | |
749 class="cmtt-8"> </span><span | |
750 class="cmtt-8"> window_blocksize(previous_window)/4+window_blocksize(current_window)/4</span> | |
751 </div> | |
752 <!--l. 523--><p class="noindent" >from the center of the previous window to the center of the current window. | |
753 <!--l. 526--><p class="noindent" >Data is not returned from the first frame; it must be used to ’prime’ the decode engine. The | |
754 encoder accounts for this priming when calculating PCM offsets; after the first frame, the proper | |
755 PCM output offset is ’0’ (as no data has been returned yet). | |
756 | |
757 | |
758 | |
759 | |
760 | |
761 | |
762 <h3 class="sectionHead"><span class="titlemark">2. </span> <a | |
763 id="x1-360002"></a>Bitpacking Convention</h3> | |
764 <!--l. 6--><p class="noindent" > | |
765 <h4 class="subsectionHead"><span class="titlemark">2.1. </span> <a | |
766 id="x1-370002.1"></a>Overview</h4> | |
767 <!--l. 8--><p class="noindent" >The Vorbis codec uses relatively unstructured raw packets containing arbitrary-width binary | |
768 integer fields. Logically, these packets are a bitstream in which bits are coded one-by-one by the | |
769 encoder and then read one-by-one in the same monotonically increasing order by the decoder. | |
770 Most current binary storage arrangements group bits into a native word size of eight bits | |
771 (octets), sixteen bits, thirty-two bits or, less commonly other fixed word sizes. The Vorbis | |
772 bitpacking convention specifies the correct mapping of the logical packet bitstream into an actual | |
773 representation in fixed-width words. | |
774 <!--l. 19--><p class="noindent" > | |
775 <h5 class="subsubsectionHead"><span class="titlemark">2.1.1. </span> <a | |
776 id="x1-380002.1.1"></a>octets, bytes and words</h5> | |
777 <!--l. 21--><p class="noindent" >In most contemporary architectures, a ’byte’ is synonymous with an ’octet’, that is, eight bits. | |
778 This has not always been the case; seven, ten, eleven and sixteen bit ’bytes’ have been used. | |
779 For purposes of the bitpacking convention, a byte implies the native, smallest integer | |
780 storage representation offered by a platform. On modern platforms, this is generally | |
781 assumed to be eight bits (not necessarily because of the processor but because of the | |
782 filesystem/memory architecture. Modern filesystems invariably offer bytes as the fundamental | |
783 atom of storage). A ’word’ is an integer size that is a grouped multiple of this smallest | |
784 size. | |
785 <!--l. 32--><p class="noindent" >The most ubiquitous architectures today consider a ’byte’ to be an octet (eight bits) and a word | |
786 to be a group of two, four or eight bytes (16, 32 or 64 bits). Note however that the Vorbis | |
787 bitpacking convention is still well defined for any native byte size; Vorbis uses the native | |
788 bit-width of a given storage system. This document assumes that a byte is one octet for purposes | |
789 of example. | |
790 <!--l. 39--><p class="noindent" > | |
791 | |
792 | |
793 | |
794 <h5 class="subsubsectionHead"><span class="titlemark">2.1.2. </span> <a | |
795 id="x1-390002.1.2"></a>bit order</h5> | |
796 <!--l. 41--><p class="noindent" >A byte has a well-defined ’least significant’ bit (LSb), which is the only bit set when the byte is | |
797 storing the two’s complement integer value +1. A byte’s ’most significant’ bit (MSb) is at the | |
798 opposite end of the byte. Bits in a byte are numbered from zero at the LSb to <span | |
799 class="cmmi-12">n </span>(<span | |
800 class="cmmi-12">n </span>= 7 in an | |
801 octet) for the MSb. | |
802 <!--l. 50--><p class="noindent" > | |
803 <h5 class="subsubsectionHead"><span class="titlemark">2.1.3. </span> <a | |
804 id="x1-400002.1.3"></a>byte order</h5> | |
805 <!--l. 52--><p class="noindent" >Words are native groupings of multiple bytes. Several byte orderings are possible in a word; the | |
806 common ones are 3-2-1-0 (’big endian’ or ’most significant byte first’ in which the | |
807 highest-valued byte comes first), 0-1-2-3 (’little endian’ or ’least significant byte first’ in | |
808 which the lowest value byte comes first) and less commonly 3-1-2-0 and 0-2-1-3 (’mixed | |
809 endian’). | |
810 <!--l. 59--><p class="noindent" >The Vorbis bitpacking convention specifies storage and bitstream manipulation at the byte, not | |
811 word, level, thus host word ordering is of a concern only during optimization when writing high | |
812 performance code that operates on a word of storage at a time rather than by byte. | |
813 Logically, bytes are always coded and decoded in order from byte zero through byte | |
814 <span | |
815 class="cmmi-12">n</span>. | |
816 <!--l. 68--><p class="noindent" > | |
817 <h5 class="subsubsectionHead"><span class="titlemark">2.1.4. </span> <a | |
818 id="x1-410002.1.4"></a>coding bits into byte sequences</h5> | |
819 <!--l. 70--><p class="noindent" >The Vorbis codec has need to code arbitrary bit-width integers, from zero to 32 bits | |
820 wide, into packets. These integer fields are not aligned to the boundaries of the byte | |
821 representation; the next field is written at the bit position at which the previous field | |
822 ends. | |
823 <!--l. 75--><p class="noindent" >The encoder logically packs integers by writing the LSb of a binary integer to the logical | |
824 bitstream first, followed by next least significant bit, etc, until the requested number of bits | |
825 have been coded. When packing the bits into bytes, the encoder begins by placing | |
826 the LSb of the integer to be written into the least significant unused bit position of | |
827 the destination byte, followed by the next-least significant bit of the source integer | |
828 and so on up to the requested number of bits. When all bits of the destination byte | |
829 have been filled, encoding continues by zeroing all bits of the next byte and writing | |
830 the next bit into the bit position 0 of that byte. Decoding follows the same process | |
831 | |
832 | |
833 | |
834 as encoding, but by reading bits from the byte stream and reassembling them into | |
835 integers. | |
836 <!--l. 90--><p class="noindent" > | |
837 <h5 class="subsubsectionHead"><span class="titlemark">2.1.5. </span> <a | |
838 id="x1-420002.1.5"></a>signedness</h5> | |
839 <!--l. 92--><p class="noindent" >The signedness of a specific number resulting from decode is to be interpreted by the decoder | |
840 given decode context. That is, the three bit binary pattern ’b111’ can be taken to represent | |
841 either ’seven’ as an unsigned integer, or ’-1’ as a signed, two’s complement integer. The | |
842 encoder and decoder are responsible for knowing if fields are to be treated as signed or | |
843 unsigned. | |
844 <!--l. 101--><p class="noindent" > | |
845 <h5 class="subsubsectionHead"><span class="titlemark">2.1.6. </span> <a | |
846 id="x1-430002.1.6"></a>coding example</h5> | |
847 <!--l. 103--><p class="noindent" >Code the 4 bit integer value ’12’ [b1100] into an empty bytestream. Bytestream result: | |
848 <!--l. 106--><p class="noindent" > | |
849 <div class="fancyvrb" id="fancyvrb2"> | |
850 <a | |
851 id="x1-43002r1"></a><span | |
852 class="cmr-6">1</span><span | |
853 class="cmtt-8"> </span><span | |
854 class="cmtt-8"> </span><span | |
855 class="cmtt-8"> </span><span | |
856 class="cmtt-8"> </span><span | |
857 class="cmtt-8"> </span><span | |
858 class="cmtt-8"> </span><span | |
859 class="cmtt-8"> </span><span | |
860 class="cmtt-8"> </span><span | |
861 class="cmtt-8"> </span><span | |
862 class="cmtt-8"> </span><span | |
863 class="cmtt-8"> </span><span | |
864 class="cmtt-8"> </span><span | |
865 class="cmtt-8"> </span><span | |
866 class="cmtt-8"> </span><span | |
867 class="cmtt-8"> </span><span | |
868 class="cmtt-8"> |</span> | |
869 <br class="fancyvrb" /><a | |
870 id="x1-43004r2"></a><span | |
871 class="cmr-6">2</span><span | |
872 class="cmtt-8"> </span><span | |
873 class="cmtt-8"> </span><span | |
874 class="cmtt-8"> </span><span | |
875 class="cmtt-8"> </span><span | |
876 class="cmtt-8"> </span><span | |
877 class="cmtt-8"> </span><span | |
878 class="cmtt-8"> </span><span | |
879 class="cmtt-8"> </span><span | |
880 class="cmtt-8"> </span><span | |
881 class="cmtt-8"> </span><span | |
882 class="cmtt-8"> </span><span | |
883 class="cmtt-8"> </span><span | |
884 class="cmtt-8"> </span><span | |
885 class="cmtt-8"> </span><span | |
886 class="cmtt-8"> </span><span | |
887 class="cmtt-8"> V</span> | |
888 <br class="fancyvrb" /><a | |
889 id="x1-43006r3"></a><span | |
890 class="cmr-6">3</span><span | |
891 class="cmtt-8"> </span><span | |
892 class="cmtt-8"> </span> | |
893 <br class="fancyvrb" /><a | |
894 id="x1-43008r4"></a><span | |
895 class="cmr-6">4</span><span | |
896 class="cmtt-8"> </span><span | |
897 class="cmtt-8"> </span><span | |
898 class="cmtt-8"> </span><span | |
899 class="cmtt-8"> </span><span | |
900 class="cmtt-8"> </span><span | |
901 class="cmtt-8"> </span><span | |
902 class="cmtt-8"> </span><span | |
903 class="cmtt-8"> </span><span | |
904 class="cmtt-8"> </span><span | |
905 class="cmtt-8"> 7</span><span | |
906 class="cmtt-8"> 6</span><span | |
907 class="cmtt-8"> 5</span><span | |
908 class="cmtt-8"> 4</span><span | |
909 class="cmtt-8"> 3</span><span | |
910 class="cmtt-8"> 2</span><span | |
911 class="cmtt-8"> 1</span><span | |
912 class="cmtt-8"> 0</span> | |
913 <br class="fancyvrb" /><a | |
914 id="x1-43010r5"></a><span | |
915 class="cmr-6">5</span><span | |
916 class="cmtt-8"> </span><span | |
917 class="cmtt-8"> byte</span><span | |
918 class="cmtt-8"> 0</span><span | |
919 class="cmtt-8"> [0</span><span | |
920 class="cmtt-8"> 0</span><span | |
921 class="cmtt-8"> 0</span><span | |
922 class="cmtt-8"> 0</span><span | |
923 class="cmtt-8"> 1</span><span | |
924 class="cmtt-8"> 1</span><span | |
925 class="cmtt-8"> 0</span><span | |
926 class="cmtt-8"> 0]</span><span | |
927 class="cmtt-8"> </span><span | |
928 class="cmtt-8"> <-</span> | |
929 <br class="fancyvrb" /><a | |
930 id="x1-43012r6"></a><span | |
931 class="cmr-6">6</span><span | |
932 class="cmtt-8"> </span><span | |
933 class="cmtt-8"> byte</span><span | |
934 class="cmtt-8"> 1</span><span | |
935 class="cmtt-8"> [</span><span | |
936 class="cmtt-8"> </span><span | |
937 class="cmtt-8"> </span><span | |
938 class="cmtt-8"> </span><span | |
939 class="cmtt-8"> </span><span | |
940 class="cmtt-8"> </span><span | |
941 class="cmtt-8"> </span><span | |
942 class="cmtt-8"> </span><span | |
943 class="cmtt-8"> </span><span | |
944 class="cmtt-8"> </span><span | |
945 class="cmtt-8"> </span><span | |
946 class="cmtt-8"> </span><span | |
947 class="cmtt-8"> </span><span | |
948 class="cmtt-8"> </span><span | |
949 class="cmtt-8"> </span><span | |
950 class="cmtt-8"> ]</span> | |
951 <br class="fancyvrb" /><a | |
952 id="x1-43014r7"></a><span | |
953 class="cmr-6">7</span><span | |
954 class="cmtt-8"> </span><span | |
955 class="cmtt-8"> byte</span><span | |
956 class="cmtt-8"> 2</span><span | |
957 class="cmtt-8"> [</span><span | |
958 class="cmtt-8"> </span><span | |
959 class="cmtt-8"> </span><span | |
960 class="cmtt-8"> </span><span | |
961 class="cmtt-8"> </span><span | |
962 class="cmtt-8"> </span><span | |
963 class="cmtt-8"> </span><span | |
964 class="cmtt-8"> </span><span | |
965 class="cmtt-8"> </span><span | |
966 class="cmtt-8"> </span><span | |
967 class="cmtt-8"> </span><span | |
968 class="cmtt-8"> </span><span | |
969 class="cmtt-8"> </span><span | |
970 class="cmtt-8"> </span><span | |
971 class="cmtt-8"> </span><span | |
972 class="cmtt-8"> ]</span> | |
973 <br class="fancyvrb" /><a | |
974 id="x1-43016r8"></a><span | |
975 class="cmr-6">8</span><span | |
976 class="cmtt-8"> </span><span | |
977 class="cmtt-8"> byte</span><span | |
978 class="cmtt-8"> 3</span><span | |
979 class="cmtt-8"> [</span><span | |
980 class="cmtt-8"> </span><span | |
981 class="cmtt-8"> </span><span | |
982 class="cmtt-8"> </span><span | |
983 class="cmtt-8"> </span><span | |
984 class="cmtt-8"> </span><span | |
985 class="cmtt-8"> </span><span | |
986 class="cmtt-8"> </span><span | |
987 class="cmtt-8"> </span><span | |
988 class="cmtt-8"> </span><span | |
989 class="cmtt-8"> </span><span | |
990 class="cmtt-8"> </span><span | |
991 class="cmtt-8"> </span><span | |
992 class="cmtt-8"> </span><span | |
993 class="cmtt-8"> </span><span | |
994 class="cmtt-8"> ]</span> | |
995 <br class="fancyvrb" /><a | |
996 id="x1-43018r9"></a><span | |
997 class="cmr-6">9</span><span | |
998 class="cmtt-8"> </span><span | |
999 class="cmtt-8"> </span><span | |
1000 class="cmtt-8"> </span><span | |
1001 class="cmtt-8"> </span><span | |
1002 class="cmtt-8"> </span><span | |
1003 class="cmtt-8"> </span><span | |
1004 class="cmtt-8"> </span><span | |
1005 class="cmtt-8"> </span><span | |
1006 class="cmtt-8"> </span><span | |
1007 class="cmtt-8"> </span><span | |
1008 class="cmtt-8"> </span><span | |
1009 class="cmtt-8"> </span><span | |
1010 class="cmtt-8"> </span><span | |
1011 class="cmtt-8"> </span><span | |
1012 class="cmtt-8"> ...</span> | |
1013 <br class="fancyvrb" /><a | |
1014 id="x1-43020r10"></a><span | |
1015 class="cmr-6">10</span><span | |
1016 class="cmtt-8"> </span><span | |
1017 class="cmtt-8"> byte</span><span | |
1018 class="cmtt-8"> n</span><span | |
1019 class="cmtt-8"> [</span><span | |
1020 class="cmtt-8"> </span><span | |
1021 class="cmtt-8"> </span><span | |
1022 class="cmtt-8"> </span><span | |
1023 class="cmtt-8"> </span><span | |
1024 class="cmtt-8"> </span><span | |
1025 class="cmtt-8"> </span><span | |
1026 class="cmtt-8"> </span><span | |
1027 class="cmtt-8"> </span><span | |
1028 class="cmtt-8"> </span><span | |
1029 class="cmtt-8"> </span><span | |
1030 class="cmtt-8"> </span><span | |
1031 class="cmtt-8"> </span><span | |
1032 class="cmtt-8"> </span><span | |
1033 class="cmtt-8"> </span><span | |
1034 class="cmtt-8"> ]</span><span | |
1035 class="cmtt-8"> </span><span | |
1036 class="cmtt-8"> bytestream</span><span | |
1037 class="cmtt-8"> length</span><span | |
1038 class="cmtt-8"> ==</span><span | |
1039 class="cmtt-8"> 1</span><span | |
1040 class="cmtt-8"> byte</span> | |
1041 <br class="fancyvrb" /><a | |
1042 id="x1-43022r11"></a><span | |
1043 class="cmr-6">11</span><span | |
1044 class="cmtt-8"> </span><span | |
1045 class="cmtt-8"> </span> | |
1046 </div> | |
1047 <!--l. 121--><p class="noindent" >Continue by coding the 3 bit integer value ’-1’ [b111]: | |
1048 <!--l. 123--><p class="noindent" > | |
1049 <div class="fancyvrb" id="fancyvrb3"> | |
1050 <a | |
1051 id="x1-43024r1"></a><span | |
1052 class="cmr-6">1</span><span | |
1053 class="cmtt-8"> </span><span | |
1054 class="cmtt-8"> </span><span | |
1055 class="cmtt-8"> </span><span | |
1056 class="cmtt-8"> </span><span | |
1057 class="cmtt-8"> </span><span | |
1058 class="cmtt-8"> </span><span | |
1059 class="cmtt-8"> </span><span | |
1060 class="cmtt-8"> </span><span | |
1061 class="cmtt-8"> </span><span | |
1062 class="cmtt-8"> |</span> | |
1063 <br class="fancyvrb" /><a | |
1064 id="x1-43026r2"></a><span | |
1065 class="cmr-6">2</span><span | |
1066 class="cmtt-8"> </span><span | |
1067 class="cmtt-8"> </span><span | |
1068 class="cmtt-8"> </span><span | |
1069 class="cmtt-8"> </span><span | |
1070 class="cmtt-8"> </span><span | |
1071 class="cmtt-8"> </span><span | |
1072 class="cmtt-8"> </span><span | |
1073 class="cmtt-8"> </span><span | |
1074 class="cmtt-8"> </span><span | |
1075 class="cmtt-8"> V</span> | |
1076 <br class="fancyvrb" /><a | |
1077 id="x1-43028r3"></a><span | |
1078 class="cmr-6">3</span><span | |
1079 class="cmtt-8"> </span><span | |
1080 class="cmtt-8"> </span> | |
1081 <br class="fancyvrb" /><a | |
1082 id="x1-43030r4"></a><span | |
1083 class="cmr-6">4</span><span | |
1084 class="cmtt-8"> </span><span | |
1085 class="cmtt-8"> </span><span | |
1086 class="cmtt-8"> </span><span | |
1087 class="cmtt-8"> </span><span | |
1088 class="cmtt-8"> </span><span | |
1089 class="cmtt-8"> </span><span | |
1090 class="cmtt-8"> </span><span | |
1091 class="cmtt-8"> </span><span | |
1092 class="cmtt-8"> </span><span | |
1093 class="cmtt-8"> 7</span><span | |
1094 class="cmtt-8"> 6</span><span | |
1095 class="cmtt-8"> 5</span><span | |
1096 class="cmtt-8"> 4</span><span | |
1097 class="cmtt-8"> 3</span><span | |
1098 class="cmtt-8"> 2</span><span | |
1099 class="cmtt-8"> 1</span><span | |
1100 class="cmtt-8"> 0</span> | |
1101 <br class="fancyvrb" /><a | |
1102 id="x1-43032r5"></a><span | |
1103 class="cmr-6">5</span><span | |
1104 class="cmtt-8"> </span><span | |
1105 class="cmtt-8"> byte</span><span | |
1106 class="cmtt-8"> 0</span><span | |
1107 class="cmtt-8"> [0</span><span | |
1108 class="cmtt-8"> 1</span><span | |
1109 class="cmtt-8"> 1</span><span | |
1110 class="cmtt-8"> 1</span><span | |
1111 class="cmtt-8"> 1</span><span | |
1112 class="cmtt-8"> 1</span><span | |
1113 class="cmtt-8"> 0</span><span | |
1114 class="cmtt-8"> 0]</span><span | |
1115 class="cmtt-8"> </span><span | |
1116 class="cmtt-8"> <-</span> | |
1117 <br class="fancyvrb" /><a | |
1118 id="x1-43034r6"></a><span | |
1119 class="cmr-6">6</span><span | |
1120 class="cmtt-8"> </span><span | |
1121 class="cmtt-8"> byte</span><span | |
1122 class="cmtt-8"> 1</span><span | |
1123 class="cmtt-8"> [</span><span | |
1124 class="cmtt-8"> </span><span | |
1125 class="cmtt-8"> </span><span | |
1126 class="cmtt-8"> </span><span | |
1127 class="cmtt-8"> </span><span | |
1128 class="cmtt-8"> </span><span | |
1129 class="cmtt-8"> </span><span | |
1130 class="cmtt-8"> </span><span | |
1131 class="cmtt-8"> </span><span | |
1132 class="cmtt-8"> </span><span | |
1133 class="cmtt-8"> </span><span | |
1134 class="cmtt-8"> </span><span | |
1135 class="cmtt-8"> </span><span | |
1136 class="cmtt-8"> </span><span | |
1137 class="cmtt-8"> </span><span | |
1138 class="cmtt-8"> ]</span> | |
1139 | |
1140 | |
1141 | |
1142 <br class="fancyvrb" /><a | |
1143 id="x1-43036r7"></a><span | |
1144 class="cmr-6">7</span><span | |
1145 class="cmtt-8"> </span><span | |
1146 class="cmtt-8"> byte</span><span | |
1147 class="cmtt-8"> 2</span><span | |
1148 class="cmtt-8"> [</span><span | |
1149 class="cmtt-8"> </span><span | |
1150 class="cmtt-8"> </span><span | |
1151 class="cmtt-8"> </span><span | |
1152 class="cmtt-8"> </span><span | |
1153 class="cmtt-8"> </span><span | |
1154 class="cmtt-8"> </span><span | |
1155 class="cmtt-8"> </span><span | |
1156 class="cmtt-8"> </span><span | |
1157 class="cmtt-8"> </span><span | |
1158 class="cmtt-8"> </span><span | |
1159 class="cmtt-8"> </span><span | |
1160 class="cmtt-8"> </span><span | |
1161 class="cmtt-8"> </span><span | |
1162 class="cmtt-8"> </span><span | |
1163 class="cmtt-8"> ]</span> | |
1164 <br class="fancyvrb" /><a | |
1165 id="x1-43038r8"></a><span | |
1166 class="cmr-6">8</span><span | |
1167 class="cmtt-8"> </span><span | |
1168 class="cmtt-8"> byte</span><span | |
1169 class="cmtt-8"> 3</span><span | |
1170 class="cmtt-8"> [</span><span | |
1171 class="cmtt-8"> </span><span | |
1172 class="cmtt-8"> </span><span | |
1173 class="cmtt-8"> </span><span | |
1174 class="cmtt-8"> </span><span | |
1175 class="cmtt-8"> </span><span | |
1176 class="cmtt-8"> </span><span | |
1177 class="cmtt-8"> </span><span | |
1178 class="cmtt-8"> </span><span | |
1179 class="cmtt-8"> </span><span | |
1180 class="cmtt-8"> </span><span | |
1181 class="cmtt-8"> </span><span | |
1182 class="cmtt-8"> </span><span | |
1183 class="cmtt-8"> </span><span | |
1184 class="cmtt-8"> </span><span | |
1185 class="cmtt-8"> ]</span> | |
1186 <br class="fancyvrb" /><a | |
1187 id="x1-43040r9"></a><span | |
1188 class="cmr-6">9</span><span | |
1189 class="cmtt-8"> </span><span | |
1190 class="cmtt-8"> </span><span | |
1191 class="cmtt-8"> </span><span | |
1192 class="cmtt-8"> </span><span | |
1193 class="cmtt-8"> </span><span | |
1194 class="cmtt-8"> </span><span | |
1195 class="cmtt-8"> </span><span | |
1196 class="cmtt-8"> </span><span | |
1197 class="cmtt-8"> </span><span | |
1198 class="cmtt-8"> </span><span | |
1199 class="cmtt-8"> </span><span | |
1200 class="cmtt-8"> </span><span | |
1201 class="cmtt-8"> </span><span | |
1202 class="cmtt-8"> </span><span | |
1203 class="cmtt-8"> ...</span> | |
1204 <br class="fancyvrb" /><a | |
1205 id="x1-43042r10"></a><span | |
1206 class="cmr-6">10</span><span | |
1207 class="cmtt-8"> </span><span | |
1208 class="cmtt-8"> byte</span><span | |
1209 class="cmtt-8"> n</span><span | |
1210 class="cmtt-8"> [</span><span | |
1211 class="cmtt-8"> </span><span | |
1212 class="cmtt-8"> </span><span | |
1213 class="cmtt-8"> </span><span | |
1214 class="cmtt-8"> </span><span | |
1215 class="cmtt-8"> </span><span | |
1216 class="cmtt-8"> </span><span | |
1217 class="cmtt-8"> </span><span | |
1218 class="cmtt-8"> </span><span | |
1219 class="cmtt-8"> </span><span | |
1220 class="cmtt-8"> </span><span | |
1221 class="cmtt-8"> </span><span | |
1222 class="cmtt-8"> </span><span | |
1223 class="cmtt-8"> </span><span | |
1224 class="cmtt-8"> </span><span | |
1225 class="cmtt-8"> ]</span><span | |
1226 class="cmtt-8"> </span><span | |
1227 class="cmtt-8"> bytestream</span><span | |
1228 class="cmtt-8"> length</span><span | |
1229 class="cmtt-8"> ==</span><span | |
1230 class="cmtt-8"> 1</span><span | |
1231 class="cmtt-8"> byte</span> | |
1232 </div> | |
1233 <!--l. 137--><p class="noindent" >Continue by coding the 7 bit integer value ’17’ [b0010001]: | |
1234 <!--l. 139--><p class="noindent" > | |
1235 <div class="fancyvrb" id="fancyvrb4"> | |
1236 <a | |
1237 id="x1-43044r1"></a><span | |
1238 class="cmr-6">1</span><span | |
1239 class="cmtt-8"> </span><span | |
1240 class="cmtt-8"> </span><span | |
1241 class="cmtt-8"> </span><span | |
1242 class="cmtt-8"> </span><span | |
1243 class="cmtt-8"> </span><span | |
1244 class="cmtt-8"> </span><span | |
1245 class="cmtt-8"> </span><span | |
1246 class="cmtt-8"> </span><span | |
1247 class="cmtt-8"> </span><span | |
1248 class="cmtt-8"> </span><span | |
1249 class="cmtt-8"> </span><span | |
1250 class="cmtt-8"> |</span> | |
1251 <br class="fancyvrb" /><a | |
1252 id="x1-43046r2"></a><span | |
1253 class="cmr-6">2</span><span | |
1254 class="cmtt-8"> </span><span | |
1255 class="cmtt-8"> </span><span | |
1256 class="cmtt-8"> </span><span | |
1257 class="cmtt-8"> </span><span | |
1258 class="cmtt-8"> </span><span | |
1259 class="cmtt-8"> </span><span | |
1260 class="cmtt-8"> </span><span | |
1261 class="cmtt-8"> </span><span | |
1262 class="cmtt-8"> </span><span | |
1263 class="cmtt-8"> </span><span | |
1264 class="cmtt-8"> </span><span | |
1265 class="cmtt-8"> V</span> | |
1266 <br class="fancyvrb" /><a | |
1267 id="x1-43048r3"></a><span | |
1268 class="cmr-6">3</span><span | |
1269 class="cmtt-8"> </span><span | |
1270 class="cmtt-8"> </span> | |
1271 <br class="fancyvrb" /><a | |
1272 id="x1-43050r4"></a><span | |
1273 class="cmr-6">4</span><span | |
1274 class="cmtt-8"> </span><span | |
1275 class="cmtt-8"> </span><span | |
1276 class="cmtt-8"> </span><span | |
1277 class="cmtt-8"> </span><span | |
1278 class="cmtt-8"> </span><span | |
1279 class="cmtt-8"> </span><span | |
1280 class="cmtt-8"> </span><span | |
1281 class="cmtt-8"> </span><span | |
1282 class="cmtt-8"> </span><span | |
1283 class="cmtt-8"> 7</span><span | |
1284 class="cmtt-8"> 6</span><span | |
1285 class="cmtt-8"> 5</span><span | |
1286 class="cmtt-8"> 4</span><span | |
1287 class="cmtt-8"> 3</span><span | |
1288 class="cmtt-8"> 2</span><span | |
1289 class="cmtt-8"> 1</span><span | |
1290 class="cmtt-8"> 0</span> | |
1291 <br class="fancyvrb" /><a | |
1292 id="x1-43052r5"></a><span | |
1293 class="cmr-6">5</span><span | |
1294 class="cmtt-8"> </span><span | |
1295 class="cmtt-8"> byte</span><span | |
1296 class="cmtt-8"> 0</span><span | |
1297 class="cmtt-8"> [1</span><span | |
1298 class="cmtt-8"> 1</span><span | |
1299 class="cmtt-8"> 1</span><span | |
1300 class="cmtt-8"> 1</span><span | |
1301 class="cmtt-8"> 1</span><span | |
1302 class="cmtt-8"> 1</span><span | |
1303 class="cmtt-8"> 0</span><span | |
1304 class="cmtt-8"> 0]</span> | |
1305 <br class="fancyvrb" /><a | |
1306 id="x1-43054r6"></a><span | |
1307 class="cmr-6">6</span><span | |
1308 class="cmtt-8"> </span><span | |
1309 class="cmtt-8"> byte</span><span | |
1310 class="cmtt-8"> 1</span><span | |
1311 class="cmtt-8"> [0</span><span | |
1312 class="cmtt-8"> 0</span><span | |
1313 class="cmtt-8"> 0</span><span | |
1314 class="cmtt-8"> 0</span><span | |
1315 class="cmtt-8"> 1</span><span | |
1316 class="cmtt-8"> 0</span><span | |
1317 class="cmtt-8"> 0</span><span | |
1318 class="cmtt-8"> 0]</span><span | |
1319 class="cmtt-8"> </span><span | |
1320 class="cmtt-8"> <-</span> | |
1321 <br class="fancyvrb" /><a | |
1322 id="x1-43056r7"></a><span | |
1323 class="cmr-6">7</span><span | |
1324 class="cmtt-8"> </span><span | |
1325 class="cmtt-8"> byte</span><span | |
1326 class="cmtt-8"> 2</span><span | |
1327 class="cmtt-8"> [</span><span | |
1328 class="cmtt-8"> </span><span | |
1329 class="cmtt-8"> </span><span | |
1330 class="cmtt-8"> </span><span | |
1331 class="cmtt-8"> </span><span | |
1332 class="cmtt-8"> </span><span | |
1333 class="cmtt-8"> </span><span | |
1334 class="cmtt-8"> </span><span | |
1335 class="cmtt-8"> </span><span | |
1336 class="cmtt-8"> </span><span | |
1337 class="cmtt-8"> </span><span | |
1338 class="cmtt-8"> </span><span | |
1339 class="cmtt-8"> </span><span | |
1340 class="cmtt-8"> </span><span | |
1341 class="cmtt-8"> </span><span | |
1342 class="cmtt-8"> ]</span> | |
1343 <br class="fancyvrb" /><a | |
1344 id="x1-43058r8"></a><span | |
1345 class="cmr-6">8</span><span | |
1346 class="cmtt-8"> </span><span | |
1347 class="cmtt-8"> byte</span><span | |
1348 class="cmtt-8"> 3</span><span | |
1349 class="cmtt-8"> [</span><span | |
1350 class="cmtt-8"> </span><span | |
1351 class="cmtt-8"> </span><span | |
1352 class="cmtt-8"> </span><span | |
1353 class="cmtt-8"> </span><span | |
1354 class="cmtt-8"> </span><span | |
1355 class="cmtt-8"> </span><span | |
1356 class="cmtt-8"> </span><span | |
1357 class="cmtt-8"> </span><span | |
1358 class="cmtt-8"> </span><span | |
1359 class="cmtt-8"> </span><span | |
1360 class="cmtt-8"> </span><span | |
1361 class="cmtt-8"> </span><span | |
1362 class="cmtt-8"> </span><span | |
1363 class="cmtt-8"> </span><span | |
1364 class="cmtt-8"> ]</span> | |
1365 <br class="fancyvrb" /><a | |
1366 id="x1-43060r9"></a><span | |
1367 class="cmr-6">9</span><span | |
1368 class="cmtt-8"> </span><span | |
1369 class="cmtt-8"> </span><span | |
1370 class="cmtt-8"> </span><span | |
1371 class="cmtt-8"> </span><span | |
1372 class="cmtt-8"> </span><span | |
1373 class="cmtt-8"> </span><span | |
1374 class="cmtt-8"> </span><span | |
1375 class="cmtt-8"> </span><span | |
1376 class="cmtt-8"> </span><span | |
1377 class="cmtt-8"> </span><span | |
1378 class="cmtt-8"> </span><span | |
1379 class="cmtt-8"> </span><span | |
1380 class="cmtt-8"> </span><span | |
1381 class="cmtt-8"> </span><span | |
1382 class="cmtt-8"> ...</span> | |
1383 <br class="fancyvrb" /><a | |
1384 id="x1-43062r10"></a><span | |
1385 class="cmr-6">10</span><span | |
1386 class="cmtt-8"> </span><span | |
1387 class="cmtt-8"> byte</span><span | |
1388 class="cmtt-8"> n</span><span | |
1389 class="cmtt-8"> [</span><span | |
1390 class="cmtt-8"> </span><span | |
1391 class="cmtt-8"> </span><span | |
1392 class="cmtt-8"> </span><span | |
1393 class="cmtt-8"> </span><span | |
1394 class="cmtt-8"> </span><span | |
1395 class="cmtt-8"> </span><span | |
1396 class="cmtt-8"> </span><span | |
1397 class="cmtt-8"> </span><span | |
1398 class="cmtt-8"> </span><span | |
1399 class="cmtt-8"> </span><span | |
1400 class="cmtt-8"> </span><span | |
1401 class="cmtt-8"> </span><span | |
1402 class="cmtt-8"> </span><span | |
1403 class="cmtt-8"> </span><span | |
1404 class="cmtt-8"> ]</span><span | |
1405 class="cmtt-8"> </span><span | |
1406 class="cmtt-8"> bytestream</span><span | |
1407 class="cmtt-8"> length</span><span | |
1408 class="cmtt-8"> ==</span><span | |
1409 class="cmtt-8"> 2</span><span | |
1410 class="cmtt-8"> bytes</span> | |
1411 <br class="fancyvrb" /><a | |
1412 id="x1-43064r11"></a><span | |
1413 class="cmr-6">11</span><span | |
1414 class="cmtt-8"> </span><span | |
1415 class="cmtt-8"> </span><span | |
1416 class="cmtt-8"> </span><span | |
1417 class="cmtt-8"> </span><span | |
1418 class="cmtt-8"> </span><span | |
1419 class="cmtt-8"> </span><span | |
1420 class="cmtt-8"> </span><span | |
1421 class="cmtt-8"> </span><span | |
1422 class="cmtt-8"> </span><span | |
1423 class="cmtt-8"> </span><span | |
1424 class="cmtt-8"> </span><span | |
1425 class="cmtt-8"> </span><span | |
1426 class="cmtt-8"> </span><span | |
1427 class="cmtt-8"> </span><span | |
1428 class="cmtt-8"> </span><span | |
1429 class="cmtt-8"> </span><span | |
1430 class="cmtt-8"> </span><span | |
1431 class="cmtt-8"> </span><span | |
1432 class="cmtt-8"> </span><span | |
1433 class="cmtt-8"> </span><span | |
1434 class="cmtt-8"> </span><span | |
1435 class="cmtt-8"> </span><span | |
1436 class="cmtt-8"> </span><span | |
1437 class="cmtt-8"> </span><span | |
1438 class="cmtt-8"> </span><span | |
1439 class="cmtt-8"> </span><span | |
1440 class="cmtt-8"> </span><span | |
1441 class="cmtt-8"> bit</span><span | |
1442 class="cmtt-8"> cursor</span><span | |
1443 class="cmtt-8"> ==</span><span | |
1444 class="cmtt-8"> 6</span> | |
1445 </div> | |
1446 <!--l. 154--><p class="noindent" >Continue by coding the 13 bit integer value ’6969’ [b110 11001110 01]: | |
1447 <!--l. 156--><p class="noindent" > | |
1448 <div class="fancyvrb" id="fancyvrb5"> | |
1449 <a | |
1450 id="x1-43066r1"></a><span | |
1451 class="cmr-6">1</span><span | |
1452 class="cmtt-8"> </span><span | |
1453 class="cmtt-8"> </span><span | |
1454 class="cmtt-8"> </span><span | |
1455 class="cmtt-8"> </span><span | |
1456 class="cmtt-8"> </span><span | |
1457 class="cmtt-8"> </span><span | |
1458 class="cmtt-8"> </span><span | |
1459 class="cmtt-8"> </span><span | |
1460 class="cmtt-8"> </span><span | |
1461 class="cmtt-8"> </span><span | |
1462 class="cmtt-8"> </span><span | |
1463 class="cmtt-8"> </span><span | |
1464 class="cmtt-8"> </span><span | |
1465 class="cmtt-8"> </span><span | |
1466 class="cmtt-8"> </span><span | |
1467 class="cmtt-8"> </span><span | |
1468 class="cmtt-8"> </span><span | |
1469 class="cmtt-8"> |</span> | |
1470 <br class="fancyvrb" /><a | |
1471 id="x1-43068r2"></a><span | |
1472 class="cmr-6">2</span><span | |
1473 class="cmtt-8"> </span><span | |
1474 class="cmtt-8"> </span><span | |
1475 class="cmtt-8"> </span><span | |
1476 class="cmtt-8"> </span><span | |
1477 class="cmtt-8"> </span><span | |
1478 class="cmtt-8"> </span><span | |
1479 class="cmtt-8"> </span><span | |
1480 class="cmtt-8"> </span><span | |
1481 class="cmtt-8"> </span><span | |
1482 class="cmtt-8"> </span><span | |
1483 class="cmtt-8"> </span><span | |
1484 class="cmtt-8"> </span><span | |
1485 class="cmtt-8"> </span><span | |
1486 class="cmtt-8"> </span><span | |
1487 class="cmtt-8"> </span><span | |
1488 class="cmtt-8"> </span><span | |
1489 class="cmtt-8"> </span><span | |
1490 class="cmtt-8"> V</span> | |
1491 <br class="fancyvrb" /><a | |
1492 id="x1-43070r3"></a><span | |
1493 class="cmr-6">3</span><span | |
1494 class="cmtt-8"> </span><span | |
1495 class="cmtt-8"> </span> | |
1496 <br class="fancyvrb" /><a | |
1497 id="x1-43072r4"></a><span | |
1498 class="cmr-6">4</span><span | |
1499 class="cmtt-8"> </span><span | |
1500 class="cmtt-8"> </span><span | |
1501 class="cmtt-8"> </span><span | |
1502 class="cmtt-8"> </span><span | |
1503 class="cmtt-8"> </span><span | |
1504 class="cmtt-8"> </span><span | |
1505 class="cmtt-8"> </span><span | |
1506 class="cmtt-8"> </span><span | |
1507 class="cmtt-8"> </span><span | |
1508 class="cmtt-8"> 7</span><span | |
1509 class="cmtt-8"> 6</span><span | |
1510 class="cmtt-8"> 5</span><span | |
1511 class="cmtt-8"> 4</span><span | |
1512 class="cmtt-8"> 3</span><span | |
1513 class="cmtt-8"> 2</span><span | |
1514 class="cmtt-8"> 1</span><span | |
1515 class="cmtt-8"> 0</span> | |
1516 <br class="fancyvrb" /><a | |
1517 id="x1-43074r5"></a><span | |
1518 class="cmr-6">5</span><span | |
1519 class="cmtt-8"> </span><span | |
1520 class="cmtt-8"> byte</span><span | |
1521 class="cmtt-8"> 0</span><span | |
1522 class="cmtt-8"> [1</span><span | |
1523 class="cmtt-8"> 1</span><span | |
1524 class="cmtt-8"> 1</span><span | |
1525 class="cmtt-8"> 1</span><span | |
1526 class="cmtt-8"> 1</span><span | |
1527 class="cmtt-8"> 1</span><span | |
1528 class="cmtt-8"> 0</span><span | |
1529 class="cmtt-8"> 0]</span> | |
1530 <br class="fancyvrb" /><a | |
1531 id="x1-43076r6"></a><span | |
1532 class="cmr-6">6</span><span | |
1533 class="cmtt-8"> </span><span | |
1534 class="cmtt-8"> byte</span><span | |
1535 class="cmtt-8"> 1</span><span | |
1536 class="cmtt-8"> [0</span><span | |
1537 class="cmtt-8"> 1</span><span | |
1538 class="cmtt-8"> 0</span><span | |
1539 class="cmtt-8"> 0</span><span | |
1540 class="cmtt-8"> 1</span><span | |
1541 class="cmtt-8"> 0</span><span | |
1542 class="cmtt-8"> 0</span><span | |
1543 class="cmtt-8"> 0]</span> | |
1544 <br class="fancyvrb" /><a | |
1545 id="x1-43078r7"></a><span | |
1546 class="cmr-6">7</span><span | |
1547 class="cmtt-8"> </span><span | |
1548 class="cmtt-8"> byte</span><span | |
1549 class="cmtt-8"> 2</span><span | |
1550 class="cmtt-8"> [1</span><span | |
1551 class="cmtt-8"> 1</span><span | |
1552 class="cmtt-8"> 0</span><span | |
1553 class="cmtt-8"> 0</span><span | |
1554 class="cmtt-8"> 1</span><span | |
1555 class="cmtt-8"> 1</span><span | |
1556 class="cmtt-8"> 1</span><span | |
1557 class="cmtt-8"> 0]</span> | |
1558 <br class="fancyvrb" /><a | |
1559 id="x1-43080r8"></a><span | |
1560 class="cmr-6">8</span><span | |
1561 class="cmtt-8"> </span><span | |
1562 class="cmtt-8"> byte</span><span | |
1563 class="cmtt-8"> 3</span><span | |
1564 class="cmtt-8"> [0</span><span | |
1565 class="cmtt-8"> 0</span><span | |
1566 class="cmtt-8"> 0</span><span | |
1567 class="cmtt-8"> 0</span><span | |
1568 class="cmtt-8"> 0</span><span | |
1569 class="cmtt-8"> 1</span><span | |
1570 class="cmtt-8"> 1</span><span | |
1571 class="cmtt-8"> 0]</span><span | |
1572 class="cmtt-8"> </span><span | |
1573 class="cmtt-8"> <-</span> | |
1574 <br class="fancyvrb" /><a | |
1575 id="x1-43082r9"></a><span | |
1576 class="cmr-6">9</span><span | |
1577 class="cmtt-8"> </span><span | |
1578 class="cmtt-8"> </span><span | |
1579 class="cmtt-8"> </span><span | |
1580 class="cmtt-8"> </span><span | |
1581 class="cmtt-8"> </span><span | |
1582 class="cmtt-8"> </span><span | |
1583 class="cmtt-8"> </span><span | |
1584 class="cmtt-8"> </span><span | |
1585 class="cmtt-8"> </span><span | |
1586 class="cmtt-8"> </span><span | |
1587 class="cmtt-8"> </span><span | |
1588 class="cmtt-8"> </span><span | |
1589 class="cmtt-8"> </span><span | |
1590 class="cmtt-8"> </span><span | |
1591 class="cmtt-8"> ...</span> | |
1592 <br class="fancyvrb" /><a | |
1593 id="x1-43084r10"></a><span | |
1594 class="cmr-6">10</span><span | |
1595 class="cmtt-8"> </span><span | |
1596 class="cmtt-8"> byte</span><span | |
1597 class="cmtt-8"> n</span><span | |
1598 class="cmtt-8"> [</span><span | |
1599 class="cmtt-8"> </span><span | |
1600 class="cmtt-8"> </span><span | |
1601 class="cmtt-8"> </span><span | |
1602 class="cmtt-8"> </span><span | |
1603 class="cmtt-8"> </span><span | |
1604 class="cmtt-8"> </span><span | |
1605 class="cmtt-8"> </span><span | |
1606 class="cmtt-8"> </span><span | |
1607 class="cmtt-8"> </span><span | |
1608 class="cmtt-8"> </span><span | |
1609 class="cmtt-8"> </span><span | |
1610 class="cmtt-8"> </span><span | |
1611 class="cmtt-8"> </span><span | |
1612 class="cmtt-8"> </span><span | |
1613 class="cmtt-8"> ]</span><span | |
1614 class="cmtt-8"> </span><span | |
1615 class="cmtt-8"> bytestream</span><span | |
1616 class="cmtt-8"> length</span><span | |
1617 class="cmtt-8"> ==</span><span | |
1618 class="cmtt-8"> 4</span><span | |
1619 class="cmtt-8"> bytes</span> | |
1620 <br class="fancyvrb" /><a | |
1621 id="x1-43086r11"></a><span | |
1622 class="cmr-6">11</span><span | |
1623 class="cmtt-8"> </span><span | |
1624 class="cmtt-8"> </span> | |
1625 </div> | |
1626 <!--l. 173--><p class="noindent" > | |
1627 <h5 class="subsubsectionHead"><span class="titlemark">2.1.7. </span> <a | |
1628 id="x1-440002.1.7"></a>decoding example</h5> | |
1629 <!--l. 175--><p class="noindent" >Reading from the beginning of the bytestream encoded in the above example: | |
1630 <!--l. 177--><p class="noindent" > | |
1631 <div class="fancyvrb" id="fancyvrb6"> | |
1632 | |
1633 | |
1634 | |
1635 <a | |
1636 id="x1-44002r1"></a><span | |
1637 class="cmr-6">1</span><span | |
1638 class="cmtt-8"> </span><span | |
1639 class="cmtt-8"> </span><span | |
1640 class="cmtt-8"> </span><span | |
1641 class="cmtt-8"> </span><span | |
1642 class="cmtt-8"> </span><span | |
1643 class="cmtt-8"> </span><span | |
1644 class="cmtt-8"> </span><span | |
1645 class="cmtt-8"> </span><span | |
1646 class="cmtt-8"> </span><span | |
1647 class="cmtt-8"> </span><span | |
1648 class="cmtt-8"> </span><span | |
1649 class="cmtt-8"> </span><span | |
1650 class="cmtt-8"> </span><span | |
1651 class="cmtt-8"> </span><span | |
1652 class="cmtt-8"> </span><span | |
1653 class="cmtt-8"> </span><span | |
1654 class="cmtt-8"> </span><span | |
1655 class="cmtt-8"> </span><span | |
1656 class="cmtt-8"> </span><span | |
1657 class="cmtt-8"> </span><span | |
1658 class="cmtt-8"> </span><span | |
1659 class="cmtt-8"> </span><span | |
1660 class="cmtt-8"> </span><span | |
1661 class="cmtt-8"> |</span> | |
1662 <br class="fancyvrb" /><a | |
1663 id="x1-44004r2"></a><span | |
1664 class="cmr-6">2</span><span | |
1665 class="cmtt-8"> </span><span | |
1666 class="cmtt-8"> </span><span | |
1667 class="cmtt-8"> </span><span | |
1668 class="cmtt-8"> </span><span | |
1669 class="cmtt-8"> </span><span | |
1670 class="cmtt-8"> </span><span | |
1671 class="cmtt-8"> </span><span | |
1672 class="cmtt-8"> </span><span | |
1673 class="cmtt-8"> </span><span | |
1674 class="cmtt-8"> </span><span | |
1675 class="cmtt-8"> </span><span | |
1676 class="cmtt-8"> </span><span | |
1677 class="cmtt-8"> </span><span | |
1678 class="cmtt-8"> </span><span | |
1679 class="cmtt-8"> </span><span | |
1680 class="cmtt-8"> </span><span | |
1681 class="cmtt-8"> </span><span | |
1682 class="cmtt-8"> </span><span | |
1683 class="cmtt-8"> </span><span | |
1684 class="cmtt-8"> </span><span | |
1685 class="cmtt-8"> </span><span | |
1686 class="cmtt-8"> </span><span | |
1687 class="cmtt-8"> </span><span | |
1688 class="cmtt-8"> V</span> | |
1689 <br class="fancyvrb" /><a | |
1690 id="x1-44006r3"></a><span | |
1691 class="cmr-6">3</span><span | |
1692 class="cmtt-8"> </span><span | |
1693 class="cmtt-8"> </span> | |
1694 <br class="fancyvrb" /><a | |
1695 id="x1-44008r4"></a><span | |
1696 class="cmr-6">4</span><span | |
1697 class="cmtt-8"> </span><span | |
1698 class="cmtt-8"> </span><span | |
1699 class="cmtt-8"> </span><span | |
1700 class="cmtt-8"> </span><span | |
1701 class="cmtt-8"> </span><span | |
1702 class="cmtt-8"> </span><span | |
1703 class="cmtt-8"> </span><span | |
1704 class="cmtt-8"> </span><span | |
1705 class="cmtt-8"> </span><span | |
1706 class="cmtt-8"> 7</span><span | |
1707 class="cmtt-8"> 6</span><span | |
1708 class="cmtt-8"> 5</span><span | |
1709 class="cmtt-8"> 4</span><span | |
1710 class="cmtt-8"> 3</span><span | |
1711 class="cmtt-8"> 2</span><span | |
1712 class="cmtt-8"> 1</span><span | |
1713 class="cmtt-8"> 0</span> | |
1714 <br class="fancyvrb" /><a | |
1715 id="x1-44010r5"></a><span | |
1716 class="cmr-6">5</span><span | |
1717 class="cmtt-8"> </span><span | |
1718 class="cmtt-8"> byte</span><span | |
1719 class="cmtt-8"> 0</span><span | |
1720 class="cmtt-8"> [1</span><span | |
1721 class="cmtt-8"> 1</span><span | |
1722 class="cmtt-8"> 1</span><span | |
1723 class="cmtt-8"> 1</span><span | |
1724 class="cmtt-8"> 1</span><span | |
1725 class="cmtt-8"> 1</span><span | |
1726 class="cmtt-8"> 0</span><span | |
1727 class="cmtt-8"> 0]</span><span | |
1728 class="cmtt-8"> </span><span | |
1729 class="cmtt-8"> <-</span> | |
1730 <br class="fancyvrb" /><a | |
1731 id="x1-44012r6"></a><span | |
1732 class="cmr-6">6</span><span | |
1733 class="cmtt-8"> </span><span | |
1734 class="cmtt-8"> byte</span><span | |
1735 class="cmtt-8"> 1</span><span | |
1736 class="cmtt-8"> [0</span><span | |
1737 class="cmtt-8"> 1</span><span | |
1738 class="cmtt-8"> 0</span><span | |
1739 class="cmtt-8"> 0</span><span | |
1740 class="cmtt-8"> 1</span><span | |
1741 class="cmtt-8"> 0</span><span | |
1742 class="cmtt-8"> 0</span><span | |
1743 class="cmtt-8"> 0]</span> | |
1744 <br class="fancyvrb" /><a | |
1745 id="x1-44014r7"></a><span | |
1746 class="cmr-6">7</span><span | |
1747 class="cmtt-8"> </span><span | |
1748 class="cmtt-8"> byte</span><span | |
1749 class="cmtt-8"> 2</span><span | |
1750 class="cmtt-8"> [1</span><span | |
1751 class="cmtt-8"> 1</span><span | |
1752 class="cmtt-8"> 0</span><span | |
1753 class="cmtt-8"> 0</span><span | |
1754 class="cmtt-8"> 1</span><span | |
1755 class="cmtt-8"> 1</span><span | |
1756 class="cmtt-8"> 1</span><span | |
1757 class="cmtt-8"> 0]</span> | |
1758 <br class="fancyvrb" /><a | |
1759 id="x1-44016r8"></a><span | |
1760 class="cmr-6">8</span><span | |
1761 class="cmtt-8"> </span><span | |
1762 class="cmtt-8"> byte</span><span | |
1763 class="cmtt-8"> 3</span><span | |
1764 class="cmtt-8"> [0</span><span | |
1765 class="cmtt-8"> 0</span><span | |
1766 class="cmtt-8"> 0</span><span | |
1767 class="cmtt-8"> 0</span><span | |
1768 class="cmtt-8"> 0</span><span | |
1769 class="cmtt-8"> 1</span><span | |
1770 class="cmtt-8"> 1</span><span | |
1771 class="cmtt-8"> 0]</span><span | |
1772 class="cmtt-8"> </span><span | |
1773 class="cmtt-8"> bytestream</span><span | |
1774 class="cmtt-8"> length</span><span | |
1775 class="cmtt-8"> ==</span><span | |
1776 class="cmtt-8"> 4</span><span | |
1777 class="cmtt-8"> bytes</span> | |
1778 <br class="fancyvrb" /><a | |
1779 id="x1-44018r9"></a><span | |
1780 class="cmr-6">9</span><span | |
1781 class="cmtt-8"> </span><span | |
1782 class="cmtt-8"> </span> | |
1783 </div> | |
1784 <!--l. 190--><p class="noindent" >We read two, two-bit integer fields, resulting in the returned numbers ’b00’ and ’b11’. Two things | |
1785 are worth noting here: | |
1786 <ul class="itemize1"> | |
1787 <li class="itemize">Although these four bits were originally written as a single four-bit integer, reading | |
1788 some other combination of bit-widths from the bitstream is well defined. There are | |
1789 no artificial alignment boundaries maintained in the bitstream. | |
1790 </li> | |
1791 <li class="itemize">The second value is the two-bit-wide integer ’b11’. This value may be interpreted | |
1792 either as the unsigned value ’3’, or the signed value ’-1’. Signedness is dependent on | |
1793 decode context.</li></ul> | |
1794 <!--l. 208--><p class="noindent" > | |
1795 <h5 class="subsubsectionHead"><span class="titlemark">2.1.8. </span> <a | |
1796 id="x1-450002.1.8"></a>end-of-packet alignment</h5> | |
1797 <!--l. 210--><p class="noindent" >The typical use of bitpacking is to produce many independent byte-aligned packets which are | |
1798 embedded into a larger byte-aligned container structure, such as an Ogg transport bitstream. | |
1799 Externally, each bytestream (encoded bitstream) must begin and end on a byte boundary. Often, | |
1800 the encoded bitstream is not an integer number of bytes, and so there is unused (uncoded) space | |
1801 in the last byte of a packet. | |
1802 <!--l. 218--><p class="noindent" >Unused space in the last byte of a bytestream is always zeroed during the coding process. Thus, | |
1803 should this unused space be read, it will return binary zeroes. | |
1804 <!--l. 222--><p class="noindent" >Attempting to read past the end of an encoded packet results in an ’end-of-packet’ condition. | |
1805 End-of-packet is not to be considered an error; it is merely a state indicating that there is | |
1806 insufficient remaining data to fulfill the desired read size. Vorbis uses truncated packets as a | |
1807 normal mode of operation, and as such, decoders must handle reading past the end of a packet as | |
1808 a typical mode of operation. Any further read operations after an ’end-of-packet’ condition shall | |
1809 also return ’end-of-packet’. | |
1810 | |
1811 | |
1812 | |
1813 <!--l. 233--><p class="noindent" > | |
1814 <h5 class="subsubsectionHead"><span class="titlemark">2.1.9. </span> <a | |
1815 id="x1-460002.1.9"></a>reading zero bits</h5> | |
1816 <!--l. 235--><p class="noindent" >Reading a zero-bit-wide integer returns the value ’0’ and does not increment the stream cursor. | |
1817 Reading to the end of the packet (but not past, such that an ’end-of-packet’ condition has not | |
1818 triggered) and then reading a zero bit integer shall succeed, returning 0, and not trigger an | |
1819 end-of-packet condition. Reading a zero-bit-wide integer after a previous read sets ’end-of-packet’ | |
1820 shall also fail with ’end-of-packet’. | |
1821 | |
1822 | |
1823 | |
1824 | |
1825 | |
1826 | |
1827 <h3 class="sectionHead"><span class="titlemark">3. </span> <a | |
1828 id="x1-470003"></a>Probability Model and Codebooks</h3> | |
1829 <!--l. 6--><p class="noindent" > | |
1830 <h4 class="subsectionHead"><span class="titlemark">3.1. </span> <a | |
1831 id="x1-480003.1"></a>Overview</h4> | |
1832 <!--l. 8--><p class="noindent" >Unlike practically every other mainstream audio codec, Vorbis has no statically configured | |
1833 probability model, instead packing all entropy decoding configuration, VQ and Huffman, into the | |
1834 bitstream itself in the third header, the codec setup header. This packed configuration consists of | |
1835 multiple ’codebooks’, each containing a specific Huffman-equivalent representation for decoding | |
1836 compressed codewords as well as an optional lookup table of output vector values to which a | |
1837 decoded Huffman value is applied as an offset, generating the final decoded output corresponding | |
1838 to a given compressed codeword. | |
1839 <!--l. 18--><p class="noindent" > | |
1840 <h5 class="subsubsectionHead"><span class="titlemark">3.1.1. </span> <a | |
1841 id="x1-490003.1.1"></a>Bitwise operation</h5> | |
1842 <!--l. 19--><p class="noindent" >The codebook mechanism is built on top of the vorbis bitpacker. Both the codebooks themselves | |
1843 and the codewords they decode are unrolled from a packet as a series of arbitrary-width values | |
1844 read from the stream according to <a | |
1845 href="#x1-360002">Section 2</a>, “<a | |
1846 href="#x1-360002">Bitpacking Convention<!--tex4ht:ref: vorbis:spec:bitpacking --></a>”. | |
1847 <!--l. 27--><p class="noindent" > | |
1848 <h4 class="subsectionHead"><span class="titlemark">3.2. </span> <a | |
1849 id="x1-500003.2"></a>Packed codebook format</h4> | |
1850 <!--l. 29--><p class="noindent" >For purposes of the examples below, we assume that the storage system’s native byte width is | |
1851 eight bits. This is not universally true; see <a | |
1852 href="#x1-360002">Section 2</a>, “<a | |
1853 href="#x1-360002">Bitpacking Convention<!--tex4ht:ref: vorbis:spec:bitpacking --></a>” for discussion | |
1854 relating to non-eight-bit bytes. | |
1855 | |
1856 | |
1857 | |
1858 <!--l. 34--><p class="noindent" > | |
1859 <h5 class="subsubsectionHead"><span class="titlemark">3.2.1. </span> <a | |
1860 id="x1-510003.2.1"></a>codebook decode</h5> | |
1861 <!--l. 36--><p class="noindent" >A codebook begins with a 24 bit sync pattern, 0x564342: | |
1862 <!--l. 38--><p class="noindent" > | |
1863 <div class="fancyvrb" id="fancyvrb7"> | |
1864 <a | |
1865 id="x1-51002r1"></a><span | |
1866 class="cmr-6">1</span><span | |
1867 class="cmtt-8"> </span><span | |
1868 class="cmtt-8"> byte</span><span | |
1869 class="cmtt-8"> 0:</span><span | |
1870 class="cmtt-8"> [</span><span | |
1871 class="cmtt-8"> 0</span><span | |
1872 class="cmtt-8"> 1</span><span | |
1873 class="cmtt-8"> 0</span><span | |
1874 class="cmtt-8"> 0</span><span | |
1875 class="cmtt-8"> 0</span><span | |
1876 class="cmtt-8"> 0</span><span | |
1877 class="cmtt-8"> 1</span><span | |
1878 class="cmtt-8"> 0</span><span | |
1879 class="cmtt-8"> ]</span><span | |
1880 class="cmtt-8"> (0x42)</span> | |
1881 <br class="fancyvrb" /><a | |
1882 id="x1-51004r2"></a><span | |
1883 class="cmr-6">2</span><span | |
1884 class="cmtt-8"> </span><span | |
1885 class="cmtt-8"> byte</span><span | |
1886 class="cmtt-8"> 1:</span><span | |
1887 class="cmtt-8"> [</span><span | |
1888 class="cmtt-8"> 0</span><span | |
1889 class="cmtt-8"> 1</span><span | |
1890 class="cmtt-8"> 0</span><span | |
1891 class="cmtt-8"> 0</span><span | |
1892 class="cmtt-8"> 0</span><span | |
1893 class="cmtt-8"> 0</span><span | |
1894 class="cmtt-8"> 1</span><span | |
1895 class="cmtt-8"> 1</span><span | |
1896 class="cmtt-8"> ]</span><span | |
1897 class="cmtt-8"> (0x43)</span> | |
1898 <br class="fancyvrb" /><a | |
1899 id="x1-51006r3"></a><span | |
1900 class="cmr-6">3</span><span | |
1901 class="cmtt-8"> </span><span | |
1902 class="cmtt-8"> byte</span><span | |
1903 class="cmtt-8"> 2:</span><span | |
1904 class="cmtt-8"> [</span><span | |
1905 class="cmtt-8"> 0</span><span | |
1906 class="cmtt-8"> 1</span><span | |
1907 class="cmtt-8"> 0</span><span | |
1908 class="cmtt-8"> 1</span><span | |
1909 class="cmtt-8"> 0</span><span | |
1910 class="cmtt-8"> 1</span><span | |
1911 class="cmtt-8"> 1</span><span | |
1912 class="cmtt-8"> 0</span><span | |
1913 class="cmtt-8"> ]</span><span | |
1914 class="cmtt-8"> (0x56)</span> | |
1915 </div> | |
1916 <!--l. 44--><p class="noindent" >16 bit <span | |
1917 class="cmtt-12">[codebook_dimensions] </span>and 24 bit <span | |
1918 class="cmtt-12">[codebook_entries] </span>fields: | |
1919 <!--l. 46--><p class="noindent" > | |
1920 <div class="fancyvrb" id="fancyvrb8"> | |
1921 <a | |
1922 id="x1-51008r1"></a><span | |
1923 class="cmr-6">1</span><span | |
1924 class="cmtt-8"> </span><span | |
1925 class="cmtt-8"> </span> | |
1926 <br class="fancyvrb" /><a | |
1927 id="x1-51010r2"></a><span | |
1928 class="cmr-6">2</span><span | |
1929 class="cmtt-8"> </span><span | |
1930 class="cmtt-8"> byte</span><span | |
1931 class="cmtt-8"> 3:</span><span | |
1932 class="cmtt-8"> [</span><span | |
1933 class="cmtt-8"> X</span><span | |
1934 class="cmtt-8"> X</span><span | |
1935 class="cmtt-8"> X</span><span | |
1936 class="cmtt-8"> X</span><span | |
1937 class="cmtt-8"> X</span><span | |
1938 class="cmtt-8"> X</span><span | |
1939 class="cmtt-8"> X</span><span | |
1940 class="cmtt-8"> X</span><span | |
1941 class="cmtt-8"> ]</span> | |
1942 <br class="fancyvrb" /><a | |
1943 id="x1-51012r3"></a><span | |
1944 class="cmr-6">3</span><span | |
1945 class="cmtt-8"> </span><span | |
1946 class="cmtt-8"> byte</span><span | |
1947 class="cmtt-8"> 4:</span><span | |
1948 class="cmtt-8"> [</span><span | |
1949 class="cmtt-8"> X</span><span | |
1950 class="cmtt-8"> X</span><span | |
1951 class="cmtt-8"> X</span><span | |
1952 class="cmtt-8"> X</span><span | |
1953 class="cmtt-8"> X</span><span | |
1954 class="cmtt-8"> X</span><span | |
1955 class="cmtt-8"> X</span><span | |
1956 class="cmtt-8"> X</span><span | |
1957 class="cmtt-8"> ]</span><span | |
1958 class="cmtt-8"> [codebook_dimensions]</span><span | |
1959 class="cmtt-8"> (16</span><span | |
1960 class="cmtt-8"> bit</span><span | |
1961 class="cmtt-8"> unsigned)</span> | |
1962 <br class="fancyvrb" /><a | |
1963 id="x1-51014r4"></a><span | |
1964 class="cmr-6">4</span><span | |
1965 class="cmtt-8"> </span><span | |
1966 class="cmtt-8"> </span> | |
1967 <br class="fancyvrb" /><a | |
1968 id="x1-51016r5"></a><span | |
1969 class="cmr-6">5</span><span | |
1970 class="cmtt-8"> </span><span | |
1971 class="cmtt-8"> byte</span><span | |
1972 class="cmtt-8"> 5:</span><span | |
1973 class="cmtt-8"> [</span><span | |
1974 class="cmtt-8"> X</span><span | |
1975 class="cmtt-8"> X</span><span | |
1976 class="cmtt-8"> X</span><span | |
1977 class="cmtt-8"> X</span><span | |
1978 class="cmtt-8"> X</span><span | |
1979 class="cmtt-8"> X</span><span | |
1980 class="cmtt-8"> X</span><span | |
1981 class="cmtt-8"> X</span><span | |
1982 class="cmtt-8"> ]</span> | |
1983 <br class="fancyvrb" /><a | |
1984 id="x1-51018r6"></a><span | |
1985 class="cmr-6">6</span><span | |
1986 class="cmtt-8"> </span><span | |
1987 class="cmtt-8"> byte</span><span | |
1988 class="cmtt-8"> 6:</span><span | |
1989 class="cmtt-8"> [</span><span | |
1990 class="cmtt-8"> X</span><span | |
1991 class="cmtt-8"> X</span><span | |
1992 class="cmtt-8"> X</span><span | |
1993 class="cmtt-8"> X</span><span | |
1994 class="cmtt-8"> X</span><span | |
1995 class="cmtt-8"> X</span><span | |
1996 class="cmtt-8"> X</span><span | |
1997 class="cmtt-8"> X</span><span | |
1998 class="cmtt-8"> ]</span> | |
1999 <br class="fancyvrb" /><a | |
2000 id="x1-51020r7"></a><span | |
2001 class="cmr-6">7</span><span | |
2002 class="cmtt-8"> </span><span | |
2003 class="cmtt-8"> byte</span><span | |
2004 class="cmtt-8"> 7:</span><span | |
2005 class="cmtt-8"> [</span><span | |
2006 class="cmtt-8"> X</span><span | |
2007 class="cmtt-8"> X</span><span | |
2008 class="cmtt-8"> X</span><span | |
2009 class="cmtt-8"> X</span><span | |
2010 class="cmtt-8"> X</span><span | |
2011 class="cmtt-8"> X</span><span | |
2012 class="cmtt-8"> X</span><span | |
2013 class="cmtt-8"> X</span><span | |
2014 class="cmtt-8"> ]</span><span | |
2015 class="cmtt-8"> [codebook_entries]</span><span | |
2016 class="cmtt-8"> (24</span><span | |
2017 class="cmtt-8"> bit</span><span | |
2018 class="cmtt-8"> unsigned)</span> | |
2019 <br class="fancyvrb" /><a | |
2020 id="x1-51022r8"></a><span | |
2021 class="cmr-6">8</span><span | |
2022 class="cmtt-8"> </span><span | |
2023 class="cmtt-8"> </span> | |
2024 </div> | |
2025 <!--l. 57--><p class="noindent" >Next is the <span | |
2026 class="cmtt-12">[ordered] </span>bit flag: | |
2027 <!--l. 59--><p class="noindent" > | |
2028 <div class="fancyvrb" id="fancyvrb9"> | |
2029 <a | |
2030 id="x1-51024r1"></a><span | |
2031 class="cmr-6">1</span><span | |
2032 class="cmtt-8"> </span><span | |
2033 class="cmtt-8"> </span> | |
2034 <br class="fancyvrb" /><a | |
2035 id="x1-51026r2"></a><span | |
2036 class="cmr-6">2</span><span | |
2037 class="cmtt-8"> </span><span | |
2038 class="cmtt-8"> byte</span><span | |
2039 class="cmtt-8"> 8:</span><span | |
2040 class="cmtt-8"> [</span><span | |
2041 class="cmtt-8"> </span><span | |
2042 class="cmtt-8"> </span><span | |
2043 class="cmtt-8"> </span><span | |
2044 class="cmtt-8"> </span><span | |
2045 class="cmtt-8"> </span><span | |
2046 class="cmtt-8"> </span><span | |
2047 class="cmtt-8"> </span><span | |
2048 class="cmtt-8"> </span><span | |
2049 class="cmtt-8"> </span><span | |
2050 class="cmtt-8"> </span><span | |
2051 class="cmtt-8"> </span><span | |
2052 class="cmtt-8"> </span><span | |
2053 class="cmtt-8"> </span><span | |
2054 class="cmtt-8"> </span><span | |
2055 class="cmtt-8"> X</span><span | |
2056 class="cmtt-8"> ]</span><span | |
2057 class="cmtt-8"> [ordered]</span><span | |
2058 class="cmtt-8"> (1</span><span | |
2059 class="cmtt-8"> bit)</span> | |
2060 <br class="fancyvrb" /><a | |
2061 id="x1-51028r3"></a><span | |
2062 class="cmr-6">3</span><span | |
2063 class="cmtt-8"> </span><span | |
2064 class="cmtt-8"> </span> | |
2065 </div> | |
2066 <!--l. 65--><p class="noindent" >Each entry, numbering a total of <span | |
2067 class="cmtt-12">[codebook_entries]</span>, is assigned a codeword length. | |
2068 We now read the list of codeword lengths and store these lengths in the array | |
2069 <span | |
2070 class="cmtt-12">[codebook_codeword_lengths]</span>. Decode of lengths is according to whether the <span | |
2071 class="cmtt-12">[ordered] </span>flag | |
2072 is set or unset. | |
2073 <ul class="itemize1"> | |
2074 <li class="itemize">If the <span | |
2075 class="cmtt-12">[ordered] </span>flag is unset, the codeword list is not length ordered and the decoder | |
2076 needs to read each codeword length one-by-one. | |
2077 <!--l. 77--><p class="noindent" >The decoder first reads one additional bit flag, the <span | |
2078 class="cmtt-12">[sparse] </span>flag. This flag determines | |
2079 whether or not the codebook contains unused entries that are not to be included in | |
2080 | |
2081 | |
2082 | |
2083 the codeword decode tree: | |
2084 <!--l. 82--><p class="noindent" > | |
2085 <div class="fancyvrb" id="fancyvrb10"> | |
2086 <a | |
2087 id="x1-51030r1"></a><span | |
2088 class="cmr-6">1</span><span | |
2089 class="cmtt-8"> </span><span | |
2090 class="cmtt-8"> byte</span><span | |
2091 class="cmtt-8"> 8:</span><span | |
2092 class="cmtt-8"> [</span><span | |
2093 class="cmtt-8"> </span><span | |
2094 class="cmtt-8"> </span><span | |
2095 class="cmtt-8"> </span><span | |
2096 class="cmtt-8"> </span><span | |
2097 class="cmtt-8"> </span><span | |
2098 class="cmtt-8"> </span><span | |
2099 class="cmtt-8"> </span><span | |
2100 class="cmtt-8"> </span><span | |
2101 class="cmtt-8"> </span><span | |
2102 class="cmtt-8"> </span><span | |
2103 class="cmtt-8"> </span><span | |
2104 class="cmtt-8"> </span><span | |
2105 class="cmtt-8"> X</span><span | |
2106 class="cmtt-8"> 1</span><span | |
2107 class="cmtt-8"> ]</span><span | |
2108 class="cmtt-8"> [sparse]</span><span | |
2109 class="cmtt-8"> flag</span><span | |
2110 class="cmtt-8"> (1</span><span | |
2111 class="cmtt-8"> bit)</span> | |
2112 </div> | |
2113 <!--l. 86--><p class="noindent" >The decoder now performs for each of the <span | |
2114 class="cmtt-12">[codebook_entries] </span>codebook entries: | |
2115 <!--l. 89--><p class="noindent" > | |
2116 <div class="fancyvrb" id="fancyvrb11"> | |
2117 <a | |
2118 id="x1-51032r1"></a><span | |
2119 class="cmr-6">1</span><span | |
2120 class="cmtt-8"> </span><span | |
2121 class="cmtt-8"> </span> | |
2122 <br class="fancyvrb" /><a | |
2123 id="x1-51034r2"></a><span | |
2124 class="cmr-6">2</span><span | |
2125 class="cmtt-8"> </span><span | |
2126 class="cmtt-8"> </span><span | |
2127 class="cmtt-8"> </span><span | |
2128 class="cmtt-8"> 1)</span><span | |
2129 class="cmtt-8"> if([sparse]</span><span | |
2130 class="cmtt-8"> is</span><span | |
2131 class="cmtt-8"> set)</span><span | |
2132 class="cmtt-8"> </span><span | |
2133 class="cmsy-8">{</span> | |
2134 <br class="fancyvrb" /><a | |
2135 id="x1-51036r3"></a><span | |
2136 class="cmr-6">3</span><span | |
2137 class="cmtt-8"> </span><span | |
2138 class="cmtt-8"> </span> | |
2139 <br class="fancyvrb" /><a | |
2140 id="x1-51038r4"></a><span | |
2141 class="cmr-6">4</span><span | |
2142 class="cmtt-8"> </span><span | |
2143 class="cmtt-8"> </span><span | |
2144 class="cmtt-8"> </span><span | |
2145 class="cmtt-8"> </span><span | |
2146 class="cmtt-8"> </span><span | |
2147 class="cmtt-8"> </span><span | |
2148 class="cmtt-8"> </span><span | |
2149 class="cmtt-8"> </span><span | |
2150 class="cmtt-8"> </span><span | |
2151 class="cmtt-8"> </span><span | |
2152 class="cmtt-8"> 2)</span><span | |
2153 class="cmtt-8"> [flag]</span><span | |
2154 class="cmtt-8"> =</span><span | |
2155 class="cmtt-8"> read</span><span | |
2156 class="cmtt-8"> one</span><span | |
2157 class="cmtt-8"> bit;</span> | |
2158 <br class="fancyvrb" /><a | |
2159 id="x1-51040r5"></a><span | |
2160 class="cmr-6">5</span><span | |
2161 class="cmtt-8"> </span><span | |
2162 class="cmtt-8"> </span><span | |
2163 class="cmtt-8"> </span><span | |
2164 class="cmtt-8"> </span><span | |
2165 class="cmtt-8"> </span><span | |
2166 class="cmtt-8"> </span><span | |
2167 class="cmtt-8"> </span><span | |
2168 class="cmtt-8"> </span><span | |
2169 class="cmtt-8"> </span><span | |
2170 class="cmtt-8"> </span><span | |
2171 class="cmtt-8"> 3)</span><span | |
2172 class="cmtt-8"> if([flag]</span><span | |
2173 class="cmtt-8"> is</span><span | |
2174 class="cmtt-8"> set)</span><span | |
2175 class="cmtt-8"> </span><span | |
2176 class="cmsy-8">{</span> | |
2177 <br class="fancyvrb" /><a | |
2178 id="x1-51042r6"></a><span | |
2179 class="cmr-6">6</span><span | |
2180 class="cmtt-8"> </span><span | |
2181 class="cmtt-8"> </span> | |
2182 <br class="fancyvrb" /><a | |
2183 id="x1-51044r7"></a><span | |
2184 class="cmr-6">7</span><span | |
2185 class="cmtt-8"> </span><span | |
2186 class="cmtt-8"> </span><span | |
2187 class="cmtt-8"> </span><span | |
2188 class="cmtt-8"> </span><span | |
2189 class="cmtt-8"> </span><span | |
2190 class="cmtt-8"> </span><span | |
2191 class="cmtt-8"> </span><span | |
2192 class="cmtt-8"> </span><span | |
2193 class="cmtt-8"> </span><span | |
2194 class="cmtt-8"> </span><span | |
2195 class="cmtt-8"> </span><span | |
2196 class="cmtt-8"> </span><span | |
2197 class="cmtt-8"> </span><span | |
2198 class="cmtt-8"> </span><span | |
2199 class="cmtt-8"> </span><span | |
2200 class="cmtt-8"> 4)</span><span | |
2201 class="cmtt-8"> [length]</span><span | |
2202 class="cmtt-8"> =</span><span | |
2203 class="cmtt-8"> read</span><span | |
2204 class="cmtt-8"> a</span><span | |
2205 class="cmtt-8"> five</span><span | |
2206 class="cmtt-8"> bit</span><span | |
2207 class="cmtt-8"> unsigned</span><span | |
2208 class="cmtt-8"> integer;</span> | |
2209 <br class="fancyvrb" /><a | |
2210 id="x1-51046r8"></a><span | |
2211 class="cmr-6">8</span><span | |
2212 class="cmtt-8"> </span><span | |
2213 class="cmtt-8"> </span><span | |
2214 class="cmtt-8"> </span><span | |
2215 class="cmtt-8"> </span><span | |
2216 class="cmtt-8"> </span><span | |
2217 class="cmtt-8"> </span><span | |
2218 class="cmtt-8"> </span><span | |
2219 class="cmtt-8"> </span><span | |
2220 class="cmtt-8"> </span><span | |
2221 class="cmtt-8"> </span><span | |
2222 class="cmtt-8"> </span><span | |
2223 class="cmtt-8"> </span><span | |
2224 class="cmtt-8"> </span><span | |
2225 class="cmtt-8"> </span><span | |
2226 class="cmtt-8"> </span><span | |
2227 class="cmtt-8"> 5)</span><span | |
2228 class="cmtt-8"> codeword</span><span | |
2229 class="cmtt-8"> length</span><span | |
2230 class="cmtt-8"> for</span><span | |
2231 class="cmtt-8"> this</span><span | |
2232 class="cmtt-8"> entry</span><span | |
2233 class="cmtt-8"> is</span><span | |
2234 class="cmtt-8"> [length]+1;</span> | |
2235 <br class="fancyvrb" /><a | |
2236 id="x1-51048r9"></a><span | |
2237 class="cmr-6">9</span><span | |
2238 class="cmtt-8"> </span><span | |
2239 class="cmtt-8"> </span> | |
2240 <br class="fancyvrb" /><a | |
2241 id="x1-51050r10"></a><span | |
2242 class="cmr-6">10</span><span | |
2243 class="cmtt-8"> </span><span | |
2244 class="cmtt-8"> </span><span | |
2245 class="cmtt-8"> </span><span | |
2246 class="cmtt-8"> </span><span | |
2247 class="cmtt-8"> </span><span | |
2248 class="cmtt-8"> </span><span | |
2249 class="cmtt-8"> </span><span | |
2250 class="cmtt-8"> </span><span | |
2251 class="cmtt-8"> </span><span | |
2252 class="cmtt-8"> </span><span | |
2253 class="cmtt-8"> </span><span | |
2254 class="cmtt-8"> </span><span | |
2255 class="cmtt-8"> </span><span | |
2256 class="cmtt-8"> </span><span | |
2257 class="cmsy-8">}</span><span | |
2258 class="cmtt-8"> else</span><span | |
2259 class="cmtt-8"> </span><span | |
2260 class="cmsy-8">{</span> | |
2261 <br class="fancyvrb" /><a | |
2262 id="x1-51052r11"></a><span | |
2263 class="cmr-6">11</span><span | |
2264 class="cmtt-8"> </span><span | |
2265 class="cmtt-8"> </span> | |
2266 <br class="fancyvrb" /><a | |
2267 id="x1-51054r12"></a><span | |
2268 class="cmr-6">12</span><span | |
2269 class="cmtt-8"> </span><span | |
2270 class="cmtt-8"> </span><span | |
2271 class="cmtt-8"> </span><span | |
2272 class="cmtt-8"> </span><span | |
2273 class="cmtt-8"> </span><span | |
2274 class="cmtt-8"> </span><span | |
2275 class="cmtt-8"> </span><span | |
2276 class="cmtt-8"> </span><span | |
2277 class="cmtt-8"> </span><span | |
2278 class="cmtt-8"> </span><span | |
2279 class="cmtt-8"> </span><span | |
2280 class="cmtt-8"> </span><span | |
2281 class="cmtt-8"> </span><span | |
2282 class="cmtt-8"> </span><span | |
2283 class="cmtt-8"> </span><span | |
2284 class="cmtt-8"> 6)</span><span | |
2285 class="cmtt-8"> this</span><span | |
2286 class="cmtt-8"> entry</span><span | |
2287 class="cmtt-8"> is</span><span | |
2288 class="cmtt-8"> unused.</span><span | |
2289 class="cmtt-8"> </span><span | |
2290 class="cmtt-8"> mark</span><span | |
2291 class="cmtt-8"> it</span><span | |
2292 class="cmtt-8"> as</span><span | |
2293 class="cmtt-8"> such.</span> | |
2294 <br class="fancyvrb" /><a | |
2295 id="x1-51056r13"></a><span | |
2296 class="cmr-6">13</span><span | |
2297 class="cmtt-8"> </span><span | |
2298 class="cmtt-8"> </span> | |
2299 <br class="fancyvrb" /><a | |
2300 id="x1-51058r14"></a><span | |
2301 class="cmr-6">14</span><span | |
2302 class="cmtt-8"> </span><span | |
2303 class="cmtt-8"> </span><span | |
2304 class="cmtt-8"> </span><span | |
2305 class="cmtt-8"> </span><span | |
2306 class="cmtt-8"> </span><span | |
2307 class="cmtt-8"> </span><span | |
2308 class="cmtt-8"> </span><span | |
2309 class="cmtt-8"> </span><span | |
2310 class="cmtt-8"> </span><span | |
2311 class="cmtt-8"> </span><span | |
2312 class="cmtt-8"> </span><span | |
2313 class="cmtt-8"> </span><span | |
2314 class="cmtt-8"> </span><span | |
2315 class="cmtt-8"> </span><span | |
2316 class="cmsy-8">}</span> | |
2317 <br class="fancyvrb" /><a | |
2318 id="x1-51060r15"></a><span | |
2319 class="cmr-6">15</span><span | |
2320 class="cmtt-8"> </span><span | |
2321 class="cmtt-8"> </span> | |
2322 <br class="fancyvrb" /><a | |
2323 id="x1-51062r16"></a><span | |
2324 class="cmr-6">16</span><span | |
2325 class="cmtt-8"> </span><span | |
2326 class="cmtt-8"> </span><span | |
2327 class="cmtt-8"> </span><span | |
2328 class="cmtt-8"> </span><span | |
2329 class="cmtt-8"> </span><span | |
2330 class="cmtt-8"> </span><span | |
2331 class="cmtt-8"> </span><span | |
2332 class="cmsy-8">}</span><span | |
2333 class="cmtt-8"> else</span><span | |
2334 class="cmtt-8"> the</span><span | |
2335 class="cmtt-8"> sparse</span><span | |
2336 class="cmtt-8"> flag</span><span | |
2337 class="cmtt-8"> is</span><span | |
2338 class="cmtt-8"> not</span><span | |
2339 class="cmtt-8"> set</span><span | |
2340 class="cmtt-8"> </span><span | |
2341 class="cmsy-8">{</span> | |
2342 <br class="fancyvrb" /><a | |
2343 id="x1-51064r17"></a><span | |
2344 class="cmr-6">17</span><span | |
2345 class="cmtt-8"> </span><span | |
2346 class="cmtt-8"> </span> | |
2347 <br class="fancyvrb" /><a | |
2348 id="x1-51066r18"></a><span | |
2349 class="cmr-6">18</span><span | |
2350 class="cmtt-8"> </span><span | |
2351 class="cmtt-8"> </span><span | |
2352 class="cmtt-8"> </span><span | |
2353 class="cmtt-8"> </span><span | |
2354 class="cmtt-8"> </span><span | |
2355 class="cmtt-8"> </span><span | |
2356 class="cmtt-8"> </span><span | |
2357 class="cmtt-8"> </span><span | |
2358 class="cmtt-8"> </span><span | |
2359 class="cmtt-8"> 7)</span><span | |
2360 class="cmtt-8"> [length]</span><span | |
2361 class="cmtt-8"> =</span><span | |
2362 class="cmtt-8"> read</span><span | |
2363 class="cmtt-8"> a</span><span | |
2364 class="cmtt-8"> five</span><span | |
2365 class="cmtt-8"> bit</span><span | |
2366 class="cmtt-8"> unsigned</span><span | |
2367 class="cmtt-8"> integer;</span> | |
2368 <br class="fancyvrb" /><a | |
2369 id="x1-51068r19"></a><span | |
2370 class="cmr-6">19</span><span | |
2371 class="cmtt-8"> </span><span | |
2372 class="cmtt-8"> </span><span | |
2373 class="cmtt-8"> </span><span | |
2374 class="cmtt-8"> </span><span | |
2375 class="cmtt-8"> </span><span | |
2376 class="cmtt-8"> </span><span | |
2377 class="cmtt-8"> </span><span | |
2378 class="cmtt-8"> </span><span | |
2379 class="cmtt-8"> </span><span | |
2380 class="cmtt-8"> 8)</span><span | |
2381 class="cmtt-8"> the</span><span | |
2382 class="cmtt-8"> codeword</span><span | |
2383 class="cmtt-8"> length</span><span | |
2384 class="cmtt-8"> for</span><span | |
2385 class="cmtt-8"> this</span><span | |
2386 class="cmtt-8"> entry</span><span | |
2387 class="cmtt-8"> is</span><span | |
2388 class="cmtt-8"> [length]+1;</span> | |
2389 <br class="fancyvrb" /><a | |
2390 id="x1-51070r20"></a><span | |
2391 class="cmr-6">20</span><span | |
2392 class="cmtt-8"> </span><span | |
2393 class="cmtt-8"> </span> | |
2394 <br class="fancyvrb" /><a | |
2395 id="x1-51072r21"></a><span | |
2396 class="cmr-6">21</span><span | |
2397 class="cmtt-8"> </span><span | |
2398 class="cmtt-8"> </span><span | |
2399 class="cmtt-8"> </span><span | |
2400 class="cmtt-8"> </span><span | |
2401 class="cmtt-8"> </span><span | |
2402 class="cmtt-8"> </span><span | |
2403 class="cmtt-8"> </span><span | |
2404 class="cmsy-8">}</span> | |
2405 <br class="fancyvrb" /><a | |
2406 id="x1-51074r22"></a><span | |
2407 class="cmr-6">22</span><span | |
2408 class="cmtt-8"> </span><span | |
2409 class="cmtt-8"> </span> | |
2410 </div> | |
2411 </li> | |
2412 <li class="itemize">If the <span | |
2413 class="cmtt-12">[ordered] </span>flag is set, the codeword list for this codebook is encoded in | |
2414 ascending length order. Rather than reading a length for every codeword, the | |
2415 encoder reads the number of codewords per length. That is, beginning at entry | |
2416 zero: | |
2417 <!--l. 120--><p class="noindent" > | |
2418 <div class="fancyvrb" id="fancyvrb12"> | |
2419 <a | |
2420 id="x1-51076r1"></a><span | |
2421 class="cmr-6">1</span><span | |
2422 class="cmtt-8"> </span><span | |
2423 class="cmtt-8"> </span><span | |
2424 class="cmtt-8"> </span><span | |
2425 class="cmtt-8"> 1)</span><span | |
2426 class="cmtt-8"> [current_entry]</span><span | |
2427 class="cmtt-8"> =</span><span | |
2428 class="cmtt-8"> 0;</span> | |
2429 <br class="fancyvrb" /><a | |
2430 id="x1-51078r2"></a><span | |
2431 class="cmr-6">2</span><span | |
2432 class="cmtt-8"> </span><span | |
2433 class="cmtt-8"> </span><span | |
2434 class="cmtt-8"> </span><span | |
2435 class="cmtt-8"> 2)</span><span | |
2436 class="cmtt-8"> [current_length]</span><span | |
2437 class="cmtt-8"> =</span><span | |
2438 class="cmtt-8"> read</span><span | |
2439 class="cmtt-8"> a</span><span | |
2440 class="cmtt-8"> five</span><span | |
2441 class="cmtt-8"> bit</span><span | |
2442 class="cmtt-8"> unsigned</span><span | |
2443 class="cmtt-8"> integer</span><span | |
2444 class="cmtt-8"> and</span><span | |
2445 class="cmtt-8"> add</span><span | |
2446 class="cmtt-8"> 1;</span> | |
2447 <br class="fancyvrb" /><a | |
2448 id="x1-51080r3"></a><span | |
2449 class="cmr-6">3</span><span | |
2450 class="cmtt-8"> </span><span | |
2451 class="cmtt-8"> </span><span | |
2452 class="cmtt-8"> </span><span | |
2453 class="cmtt-8"> 3)</span><span | |
2454 class="cmtt-8"> [number]</span><span | |
2455 class="cmtt-8"> =</span><span | |
2456 class="cmtt-8"> read</span><span | |
2457 class="cmtt-8"> </span><a | |
2458 href="#x1-1170009.2.1"><span | |
2459 class="cmtt-8">ilog</span></a><span | |
2460 class="cmtt-8">([codebook_entries]</span><span | |
2461 class="cmtt-8"> -</span><span | |
2462 class="cmtt-8"> [current_entry])</span><span | |
2463 class="cmtt-8"> bits</span><span | |
2464 class="cmtt-8"> as</span><span | |
2465 class="cmtt-8"> an</span><span | |
2466 class="cmtt-8"> unsigned</span><span | |
2467 class="cmtt-8"> integer</span> | |
2468 <br class="fancyvrb" /><a | |
2469 id="x1-51082r4"></a><span | |
2470 class="cmr-6">4</span><span | |
2471 class="cmtt-8"> </span><span | |
2472 class="cmtt-8"> </span><span | |
2473 class="cmtt-8"> </span><span | |
2474 class="cmtt-8"> 4)</span><span | |
2475 class="cmtt-8"> set</span><span | |
2476 class="cmtt-8"> the</span><span | |
2477 class="cmtt-8"> entries</span><span | |
2478 class="cmtt-8"> [current_entry]</span><span | |
2479 class="cmtt-8"> through</span><span | |
2480 class="cmtt-8"> [current_entry]+[number]-1,</span><span | |
2481 class="cmtt-8"> inclusive,</span> | |
2482 <br class="fancyvrb" /><a | |
2483 id="x1-51084r5"></a><span | |
2484 class="cmr-6">5</span><span | |
2485 class="cmtt-8"> </span><span | |
2486 class="cmtt-8"> </span><span | |
2487 class="cmtt-8"> </span><span | |
2488 class="cmtt-8"> </span><span | |
2489 class="cmtt-8"> </span><span | |
2490 class="cmtt-8"> of</span><span | |
2491 class="cmtt-8"> the</span><span | |
2492 class="cmtt-8"> [codebook_codeword_lengths]</span><span | |
2493 class="cmtt-8"> array</span><span | |
2494 class="cmtt-8"> to</span><span | |
2495 class="cmtt-8"> [current_length]</span> | |
2496 <br class="fancyvrb" /><a | |
2497 id="x1-51086r6"></a><span | |
2498 class="cmr-6">6</span><span | |
2499 class="cmtt-8"> </span><span | |
2500 class="cmtt-8"> </span><span | |
2501 class="cmtt-8"> </span><span | |
2502 class="cmtt-8"> 5)</span><span | |
2503 class="cmtt-8"> set</span><span | |
2504 class="cmtt-8"> [current_entry]</span><span | |
2505 class="cmtt-8"> to</span><span | |
2506 class="cmtt-8"> [number]</span><span | |
2507 class="cmtt-8"> +</span><span | |
2508 class="cmtt-8"> [current_entry]</span> | |
2509 <br class="fancyvrb" /><a | |
2510 id="x1-51088r7"></a><span | |
2511 class="cmr-6">7</span><span | |
2512 class="cmtt-8"> </span><span | |
2513 class="cmtt-8"> </span><span | |
2514 class="cmtt-8"> </span><span | |
2515 class="cmtt-8"> 6)</span><span | |
2516 class="cmtt-8"> increment</span><span | |
2517 class="cmtt-8"> [current_length]</span><span | |
2518 class="cmtt-8"> by</span><span | |
2519 class="cmtt-8"> 1</span> | |
2520 <br class="fancyvrb" /><a | |
2521 id="x1-51090r8"></a><span | |
2522 class="cmr-6">8</span><span | |
2523 class="cmtt-8"> </span><span | |
2524 class="cmtt-8"> </span><span | |
2525 class="cmtt-8"> </span><span | |
2526 class="cmtt-8"> 7)</span><span | |
2527 class="cmtt-8"> if</span><span | |
2528 class="cmtt-8"> [current_entry]</span><span | |
2529 class="cmtt-8"> is</span><span | |
2530 class="cmtt-8"> greater</span><span | |
2531 class="cmtt-8"> than</span><span | |
2532 class="cmtt-8"> [codebook_entries]</span><span | |
2533 class="cmtt-8"> ERROR</span><span | |
2534 class="cmtt-8"> CONDITION;</span> | |
2535 <br class="fancyvrb" /><a | |
2536 id="x1-51092r9"></a><span | |
2537 class="cmr-6">9</span><span | |
2538 class="cmtt-8"> </span><span | |
2539 class="cmtt-8"> </span><span | |
2540 class="cmtt-8"> </span><span | |
2541 class="cmtt-8"> </span><span | |
2542 class="cmtt-8"> </span><span | |
2543 class="cmtt-8"> the</span><span | |
2544 class="cmtt-8"> decoder</span><span | |
2545 class="cmtt-8"> will</span><span | |
2546 class="cmtt-8"> not</span><span | |
2547 class="cmtt-8"> be</span><span | |
2548 class="cmtt-8"> able</span><span | |
2549 class="cmtt-8"> to</span><span | |
2550 class="cmtt-8"> read</span><span | |
2551 class="cmtt-8"> this</span><span | |
2552 class="cmtt-8"> stream.</span> | |
2553 <br class="fancyvrb" /><a | |
2554 id="x1-51094r10"></a><span | |
2555 class="cmr-6">10</span><span | |
2556 class="cmtt-8"> </span><span | |
2557 class="cmtt-8"> </span><span | |
2558 class="cmtt-8"> </span><span | |
2559 class="cmtt-8"> 8)</span><span | |
2560 class="cmtt-8"> if</span><span | |
2561 class="cmtt-8"> [current_entry]</span><span | |
2562 class="cmtt-8"> is</span><span | |
2563 class="cmtt-8"> less</span><span | |
2564 class="cmtt-8"> than</span><span | |
2565 class="cmtt-8"> [codebook_entries],</span><span | |
2566 class="cmtt-8"> repeat</span><span | |
2567 class="cmtt-8"> process</span><span | |
2568 class="cmtt-8"> starting</span><span | |
2569 class="cmtt-8"> at</span><span | |
2570 class="cmtt-8"> 3)</span> | |
2571 <br class="fancyvrb" /><a | |
2572 id="x1-51096r11"></a><span | |
2573 class="cmr-6">11</span><span | |
2574 class="cmtt-8"> </span><span | |
2575 class="cmtt-8"> </span><span | |
2576 class="cmtt-8"> </span><span | |
2577 class="cmtt-8"> 9)</span><span | |
2578 class="cmtt-8"> done.</span> | |
2579 | |
2580 | |
2581 | |
2582 </div> | |
2583 </li></ul> | |
2584 <!--l. 136--><p class="noindent" >After all codeword lengths have been decoded, the decoder reads the vector lookup table. Vorbis | |
2585 I supports three lookup types: | |
2586 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
2587 1. </dt><dd | |
2588 class="enumerate-enumitem">No lookup | |
2589 </dd><dt class="enumerate-enumitem"> | |
2590 2. </dt><dd | |
2591 class="enumerate-enumitem">Implicitly populated value mapping (lattice VQ) | |
2592 </dd><dt class="enumerate-enumitem"> | |
2593 3. </dt><dd | |
2594 class="enumerate-enumitem">Explicitly populated value mapping (tessellated or ’foam’ VQ)</dd></dl> | |
2595 <!--l. 149--><p class="noindent" >The lookup table type is read as a four bit unsigned integer: | |
2596 <div class="fancyvrb" id="fancyvrb13"> | |
2597 <a | |
2598 id="x1-51101r1"></a><span | |
2599 class="cmr-6">1</span><span | |
2600 class="cmtt-8"> </span><span | |
2601 class="cmtt-8"> </span><span | |
2602 class="cmtt-8"> </span><span | |
2603 class="cmtt-8"> 1)</span><span | |
2604 class="cmtt-8"> [codebook_lookup_type]</span><span | |
2605 class="cmtt-8"> =</span><span | |
2606 class="cmtt-8"> read</span><span | |
2607 class="cmtt-8"> four</span><span | |
2608 class="cmtt-8"> bits</span><span | |
2609 class="cmtt-8"> as</span><span | |
2610 class="cmtt-8"> an</span><span | |
2611 class="cmtt-8"> unsigned</span><span | |
2612 class="cmtt-8"> integer</span> | |
2613 </div> | |
2614 <!--l. 154--><p class="noindent" >Codebook decode precedes according to <span | |
2615 class="cmtt-12">[codebook_lookup_type]</span>: | |
2616 <ul class="itemize1"> | |
2617 <li class="itemize">Lookup type zero indicates no lookup to be read. Proceed past lookup decode. | |
2618 </li> | |
2619 <li class="itemize">Lookup types one and two are similar, differing only in the number of lookup values to | |
2620 be read. Lookup type one reads a list of values that are permuted in a set pattern to | |
2621 build a list of vectors, each vector of order <span | |
2622 class="cmtt-12">[codebook_dimensions] </span>scalars. Lookup | |
2623 type two builds the same vector list, but reads each scalar for each vector explicitly, | |
2624 rather than building vectors from a smaller list of possible scalar values. Lookup | |
2625 decode proceeds as follows: | |
2626 <!--l. 168--><p class="noindent" > | |
2627 <div class="fancyvrb" id="fancyvrb14"> | |
2628 <a | |
2629 id="x1-51103r1"></a><span | |
2630 class="cmr-6">1</span><span | |
2631 class="cmtt-8"> </span><span | |
2632 class="cmtt-8"> </span><span | |
2633 class="cmtt-8"> </span><span | |
2634 class="cmtt-8"> 1)</span><span | |
2635 class="cmtt-8"> [codebook_minimum_value]</span><span | |
2636 class="cmtt-8"> =</span><span | |
2637 class="cmtt-8"> </span><a | |
2638 href="#x1-1180009.2.2"><span | |
2639 class="cmtt-8">float32_unpack</span></a><span | |
2640 class="cmtt-8">(</span><span | |
2641 class="cmtt-8"> read</span><span | |
2642 class="cmtt-8"> 32</span><span | |
2643 class="cmtt-8"> bits</span><span | |
2644 class="cmtt-8"> as</span><span | |
2645 class="cmtt-8"> an</span><span | |
2646 class="cmtt-8"> unsigned</span><span | |
2647 class="cmtt-8"> integer)</span> | |
2648 <br class="fancyvrb" /><a | |
2649 id="x1-51105r2"></a><span | |
2650 class="cmr-6">2</span><span | |
2651 class="cmtt-8"> </span><span | |
2652 class="cmtt-8"> </span><span | |
2653 class="cmtt-8"> </span><span | |
2654 class="cmtt-8"> 2)</span><span | |
2655 class="cmtt-8"> [codebook_delta_value]</span><span | |
2656 class="cmtt-8"> =</span><span | |
2657 class="cmtt-8"> </span><a | |
2658 href="#x1-1180009.2.2"><span | |
2659 class="cmtt-8">float32_unpack</span></a><span | |
2660 class="cmtt-8">(</span><span | |
2661 class="cmtt-8"> read</span><span | |
2662 class="cmtt-8"> 32</span><span | |
2663 class="cmtt-8"> bits</span><span | |
2664 class="cmtt-8"> as</span><span | |
2665 class="cmtt-8"> an</span><span | |
2666 class="cmtt-8"> unsigned</span><span | |
2667 class="cmtt-8"> integer)</span> | |
2668 <br class="fancyvrb" /><a | |
2669 id="x1-51107r3"></a><span | |
2670 class="cmr-6">3</span><span | |
2671 class="cmtt-8"> </span><span | |
2672 class="cmtt-8"> </span><span | |
2673 class="cmtt-8"> </span><span | |
2674 class="cmtt-8"> 3)</span><span | |
2675 class="cmtt-8"> [codebook_value_bits]</span><span | |
2676 class="cmtt-8"> =</span><span | |
2677 class="cmtt-8"> read</span><span | |
2678 class="cmtt-8"> 4</span><span | |
2679 class="cmtt-8"> bits</span><span | |
2680 class="cmtt-8"> as</span><span | |
2681 class="cmtt-8"> an</span><span | |
2682 class="cmtt-8"> unsigned</span><span | |
2683 class="cmtt-8"> integer</span><span | |
2684 class="cmtt-8"> and</span><span | |
2685 class="cmtt-8"> add</span><span | |
2686 class="cmtt-8"> 1</span> | |
2687 <br class="fancyvrb" /><a | |
2688 id="x1-51109r4"></a><span | |
2689 class="cmr-6">4</span><span | |
2690 class="cmtt-8"> </span><span | |
2691 class="cmtt-8"> </span><span | |
2692 class="cmtt-8"> </span><span | |
2693 class="cmtt-8"> 4)</span><span | |
2694 class="cmtt-8"> [codebook_sequence_p]</span><span | |
2695 class="cmtt-8"> =</span><span | |
2696 class="cmtt-8"> read</span><span | |
2697 class="cmtt-8"> 1</span><span | |
2698 class="cmtt-8"> bit</span><span | |
2699 class="cmtt-8"> as</span><span | |
2700 class="cmtt-8"> a</span><span | |
2701 class="cmtt-8"> boolean</span><span | |
2702 class="cmtt-8"> flag</span> | |
2703 <br class="fancyvrb" /><a | |
2704 id="x1-51111r5"></a><span | |
2705 class="cmr-6">5</span><span | |
2706 class="cmtt-8"> </span><span | |
2707 class="cmtt-8"> </span> | |
2708 <br class="fancyvrb" /><a | |
2709 id="x1-51113r6"></a><span | |
2710 class="cmr-6">6</span><span | |
2711 class="cmtt-8"> </span><span | |
2712 class="cmtt-8"> </span><span | |
2713 class="cmtt-8"> </span><span | |
2714 class="cmtt-8"> if</span><span | |
2715 class="cmtt-8"> (</span><span | |
2716 class="cmtt-8"> [codebook_lookup_type]</span><span | |
2717 class="cmtt-8"> is</span><span | |
2718 class="cmtt-8"> 1</span><span | |
2719 class="cmtt-8"> )</span><span | |
2720 class="cmtt-8"> </span><span | |
2721 class="cmsy-8">{</span> | |
2722 <br class="fancyvrb" /><a | |
2723 id="x1-51115r7"></a><span | |
2724 class="cmr-6">7</span><span | |
2725 class="cmtt-8"> </span><span | |
2726 class="cmtt-8"> </span> | |
2727 <br class="fancyvrb" /><a | |
2728 id="x1-51117r8"></a><span | |
2729 class="cmr-6">8</span><span | |
2730 class="cmtt-8"> </span><span | |
2731 class="cmtt-8"> </span><span | |
2732 class="cmtt-8"> </span><span | |
2733 class="cmtt-8"> </span><span | |
2734 class="cmtt-8"> </span><span | |
2735 class="cmtt-8"> </span><span | |
2736 class="cmtt-8"> 5)</span><span | |
2737 class="cmtt-8"> [codebook_lookup_values]</span><span | |
2738 class="cmtt-8"> =</span><span | |
2739 class="cmtt-8"> </span><a | |
2740 href="#x1-1190009.2.3"><span | |
2741 class="cmtt-8">lookup1_values</span></a><span | |
2742 class="cmtt-8">([codebook_entries],</span><span | |
2743 class="cmtt-8"> [codebook_dimensions]</span><span | |
2744 class="cmtt-8"> )</span> | |
2745 <br class="fancyvrb" /><a | |
2746 id="x1-51119r9"></a><span | |
2747 class="cmr-6">9</span><span | |
2748 class="cmtt-8"> </span><span | |
2749 class="cmtt-8"> </span> | |
2750 <br class="fancyvrb" /><a | |
2751 id="x1-51121r10"></a><span | |
2752 class="cmr-6">10</span><span | |
2753 class="cmtt-8"> </span><span | |
2754 class="cmtt-8"> </span><span | |
2755 class="cmtt-8"> </span><span | |
2756 class="cmtt-8"> </span><span | |
2757 class="cmsy-8">}</span><span | |
2758 class="cmtt-8"> else</span><span | |
2759 class="cmtt-8"> </span><span | |
2760 class="cmsy-8">{</span> | |
2761 <br class="fancyvrb" /><a | |
2762 id="x1-51123r11"></a><span | |
2763 class="cmr-6">11</span><span | |
2764 class="cmtt-8"> </span><span | |
2765 class="cmtt-8"> </span> | |
2766 <br class="fancyvrb" /><a | |
2767 id="x1-51125r12"></a><span | |
2768 class="cmr-6">12</span><span | |
2769 class="cmtt-8"> </span><span | |
2770 class="cmtt-8"> </span><span | |
2771 class="cmtt-8"> </span><span | |
2772 class="cmtt-8"> </span><span | |
2773 class="cmtt-8"> </span><span | |
2774 class="cmtt-8"> </span><span | |
2775 class="cmtt-8"> 6)</span><span | |
2776 class="cmtt-8"> [codebook_lookup_values]</span><span | |
2777 class="cmtt-8"> =</span><span | |
2778 class="cmtt-8"> [codebook_entries]</span><span | |
2779 class="cmtt-8"> *</span><span | |
2780 class="cmtt-8"> [codebook_dimensions]</span> | |
2781 <br class="fancyvrb" /><a | |
2782 id="x1-51127r13"></a><span | |
2783 class="cmr-6">13</span><span | |
2784 class="cmtt-8"> </span><span | |
2785 class="cmtt-8"> </span> | |
2786 <br class="fancyvrb" /><a | |
2787 id="x1-51129r14"></a><span | |
2788 class="cmr-6">14</span><span | |
2789 class="cmtt-8"> </span><span | |
2790 class="cmtt-8"> </span><span | |
2791 class="cmtt-8"> </span><span | |
2792 class="cmtt-8"> </span><span | |
2793 class="cmsy-8">}</span> | |
2794 <br class="fancyvrb" /><a | |
2795 id="x1-51131r15"></a><span | |
2796 class="cmr-6">15</span><span | |
2797 class="cmtt-8"> </span><span | |
2798 class="cmtt-8"> </span> | |
2799 <br class="fancyvrb" /><a | |
2800 id="x1-51133r16"></a><span | |
2801 class="cmr-6">16</span><span | |
2802 class="cmtt-8"> </span><span | |
2803 class="cmtt-8"> </span><span | |
2804 class="cmtt-8"> </span><span | |
2805 class="cmtt-8"> 7)</span><span | |
2806 class="cmtt-8"> read</span><span | |
2807 class="cmtt-8"> a</span><span | |
2808 class="cmtt-8"> total</span><span | |
2809 class="cmtt-8"> of</span><span | |
2810 class="cmtt-8"> [codebook_lookup_values]</span><span | |
2811 class="cmtt-8"> unsigned</span><span | |
2812 class="cmtt-8"> integers</span><span | |
2813 class="cmtt-8"> of</span><span | |
2814 class="cmtt-8"> [codebook_value_bits]</span><span | |
2815 class="cmtt-8"> each;</span> | |
2816 | |
2817 | |
2818 | |
2819 <br class="fancyvrb" /><a | |
2820 id="x1-51135r17"></a><span | |
2821 class="cmr-6">17</span><span | |
2822 class="cmtt-8"> </span><span | |
2823 class="cmtt-8"> </span><span | |
2824 class="cmtt-8"> </span><span | |
2825 class="cmtt-8"> </span><span | |
2826 class="cmtt-8"> </span><span | |
2827 class="cmtt-8"> </span><span | |
2828 class="cmtt-8"> store</span><span | |
2829 class="cmtt-8"> these</span><span | |
2830 class="cmtt-8"> in</span><span | |
2831 class="cmtt-8"> order</span><span | |
2832 class="cmtt-8"> in</span><span | |
2833 class="cmtt-8"> the</span><span | |
2834 class="cmtt-8"> array</span><span | |
2835 class="cmtt-8"> [codebook_multiplicands]</span> | |
2836 </div> | |
2837 </li> | |
2838 <li class="itemize">A <span | |
2839 class="cmtt-12">[codebook_lookup_type] </span>of greater than two is reserved and indicates a stream that is | |
2840 not decodable by the specification in this document. | |
2841 </li></ul> | |
2842 <!--l. 195--><p class="noindent" >An ’end of packet’ during any read operation in the above steps is considered an error condition | |
2843 rendering the stream undecodable. | |
2844 <!--l. 198--><p class="noindent" ><span class="paragraphHead"><a | |
2845 id="x1-520003.2.1"></a><span | |
2846 class="cmbx-12">Huffman decision tree representation</span></span> | |
2847 The <span | |
2848 class="cmtt-12">[codebook_codeword_lengths] </span>array and <span | |
2849 class="cmtt-12">[codebook_entries] </span>value uniquely define the | |
2850 Huffman decision tree used for entropy decoding. | |
2851 <!--l. 204--><p class="noindent" >Briefly, each used codebook entry (recall that length-unordered codebooks support unused | |
2852 codeword entries) is assigned, in order, the lowest valued unused binary Huffman codeword | |
2853 possible. Assume the following codeword length list: | |
2854 <!--l. 209--><p class="noindent" > | |
2855 <div class="fancyvrb" id="fancyvrb15"> | |
2856 <a | |
2857 id="x1-52002r1"></a><span | |
2858 class="cmr-6">1</span><span | |
2859 class="cmtt-8"> </span><span | |
2860 class="cmtt-8"> entry</span><span | |
2861 class="cmtt-8"> 0:</span><span | |
2862 class="cmtt-8"> length</span><span | |
2863 class="cmtt-8"> 2</span> | |
2864 <br class="fancyvrb" /><a | |
2865 id="x1-52004r2"></a><span | |
2866 class="cmr-6">2</span><span | |
2867 class="cmtt-8"> </span><span | |
2868 class="cmtt-8"> entry</span><span | |
2869 class="cmtt-8"> 1:</span><span | |
2870 class="cmtt-8"> length</span><span | |
2871 class="cmtt-8"> 4</span> | |
2872 <br class="fancyvrb" /><a | |
2873 id="x1-52006r3"></a><span | |
2874 class="cmr-6">3</span><span | |
2875 class="cmtt-8"> </span><span | |
2876 class="cmtt-8"> entry</span><span | |
2877 class="cmtt-8"> 2:</span><span | |
2878 class="cmtt-8"> length</span><span | |
2879 class="cmtt-8"> 4</span> | |
2880 <br class="fancyvrb" /><a | |
2881 id="x1-52008r4"></a><span | |
2882 class="cmr-6">4</span><span | |
2883 class="cmtt-8"> </span><span | |
2884 class="cmtt-8"> entry</span><span | |
2885 class="cmtt-8"> 3:</span><span | |
2886 class="cmtt-8"> length</span><span | |
2887 class="cmtt-8"> 4</span> | |
2888 <br class="fancyvrb" /><a | |
2889 id="x1-52010r5"></a><span | |
2890 class="cmr-6">5</span><span | |
2891 class="cmtt-8"> </span><span | |
2892 class="cmtt-8"> entry</span><span | |
2893 class="cmtt-8"> 4:</span><span | |
2894 class="cmtt-8"> length</span><span | |
2895 class="cmtt-8"> 4</span> | |
2896 <br class="fancyvrb" /><a | |
2897 id="x1-52012r6"></a><span | |
2898 class="cmr-6">6</span><span | |
2899 class="cmtt-8"> </span><span | |
2900 class="cmtt-8"> entry</span><span | |
2901 class="cmtt-8"> 5:</span><span | |
2902 class="cmtt-8"> length</span><span | |
2903 class="cmtt-8"> 2</span> | |
2904 <br class="fancyvrb" /><a | |
2905 id="x1-52014r7"></a><span | |
2906 class="cmr-6">7</span><span | |
2907 class="cmtt-8"> </span><span | |
2908 class="cmtt-8"> entry</span><span | |
2909 class="cmtt-8"> 6:</span><span | |
2910 class="cmtt-8"> length</span><span | |
2911 class="cmtt-8"> 3</span> | |
2912 <br class="fancyvrb" /><a | |
2913 id="x1-52016r8"></a><span | |
2914 class="cmr-6">8</span><span | |
2915 class="cmtt-8"> </span><span | |
2916 class="cmtt-8"> entry</span><span | |
2917 class="cmtt-8"> 7:</span><span | |
2918 class="cmtt-8"> length</span><span | |
2919 class="cmtt-8"> 3</span> | |
2920 </div> | |
2921 <!--l. 220--><p class="noindent" >Assigning codewords in order (lowest possible value of the appropriate length to highest) results | |
2922 in the following codeword list: | |
2923 <!--l. 223--><p class="noindent" > | |
2924 <div class="fancyvrb" id="fancyvrb16"> | |
2925 <a | |
2926 id="x1-52018r1"></a><span | |
2927 class="cmr-6">1</span><span | |
2928 class="cmtt-8"> </span><span | |
2929 class="cmtt-8"> entry</span><span | |
2930 class="cmtt-8"> 0:</span><span | |
2931 class="cmtt-8"> length</span><span | |
2932 class="cmtt-8"> 2</span><span | |
2933 class="cmtt-8"> codeword</span><span | |
2934 class="cmtt-8"> 00</span> | |
2935 <br class="fancyvrb" /><a | |
2936 id="x1-52020r2"></a><span | |
2937 class="cmr-6">2</span><span | |
2938 class="cmtt-8"> </span><span | |
2939 class="cmtt-8"> entry</span><span | |
2940 class="cmtt-8"> 1:</span><span | |
2941 class="cmtt-8"> length</span><span | |
2942 class="cmtt-8"> 4</span><span | |
2943 class="cmtt-8"> codeword</span><span | |
2944 class="cmtt-8"> 0100</span> | |
2945 <br class="fancyvrb" /><a | |
2946 id="x1-52022r3"></a><span | |
2947 class="cmr-6">3</span><span | |
2948 class="cmtt-8"> </span><span | |
2949 class="cmtt-8"> entry</span><span | |
2950 class="cmtt-8"> 2:</span><span | |
2951 class="cmtt-8"> length</span><span | |
2952 class="cmtt-8"> 4</span><span | |
2953 class="cmtt-8"> codeword</span><span | |
2954 class="cmtt-8"> 0101</span> | |
2955 <br class="fancyvrb" /><a | |
2956 id="x1-52024r4"></a><span | |
2957 class="cmr-6">4</span><span | |
2958 class="cmtt-8"> </span><span | |
2959 class="cmtt-8"> entry</span><span | |
2960 class="cmtt-8"> 3:</span><span | |
2961 class="cmtt-8"> length</span><span | |
2962 class="cmtt-8"> 4</span><span | |
2963 class="cmtt-8"> codeword</span><span | |
2964 class="cmtt-8"> 0110</span> | |
2965 <br class="fancyvrb" /><a | |
2966 id="x1-52026r5"></a><span | |
2967 class="cmr-6">5</span><span | |
2968 class="cmtt-8"> </span><span | |
2969 class="cmtt-8"> entry</span><span | |
2970 class="cmtt-8"> 4:</span><span | |
2971 class="cmtt-8"> length</span><span | |
2972 class="cmtt-8"> 4</span><span | |
2973 class="cmtt-8"> codeword</span><span | |
2974 class="cmtt-8"> 0111</span> | |
2975 <br class="fancyvrb" /><a | |
2976 id="x1-52028r6"></a><span | |
2977 class="cmr-6">6</span><span | |
2978 class="cmtt-8"> </span><span | |
2979 class="cmtt-8"> entry</span><span | |
2980 class="cmtt-8"> 5:</span><span | |
2981 class="cmtt-8"> length</span><span | |
2982 class="cmtt-8"> 2</span><span | |
2983 class="cmtt-8"> codeword</span><span | |
2984 class="cmtt-8"> 10</span> | |
2985 <br class="fancyvrb" /><a | |
2986 id="x1-52030r7"></a><span | |
2987 class="cmr-6">7</span><span | |
2988 class="cmtt-8"> </span><span | |
2989 class="cmtt-8"> entry</span><span | |
2990 class="cmtt-8"> 6:</span><span | |
2991 class="cmtt-8"> length</span><span | |
2992 class="cmtt-8"> 3</span><span | |
2993 class="cmtt-8"> codeword</span><span | |
2994 class="cmtt-8"> 110</span> | |
2995 <br class="fancyvrb" /><a | |
2996 id="x1-52032r8"></a><span | |
2997 class="cmr-6">8</span><span | |
2998 class="cmtt-8"> </span><span | |
2999 class="cmtt-8"> entry</span><span | |
3000 class="cmtt-8"> 7:</span><span | |
3001 class="cmtt-8"> length</span><span | |
3002 class="cmtt-8"> 3</span><span | |
3003 class="cmtt-8"> codeword</span><span | |
3004 class="cmtt-8"> 111</span> | |
3005 </div> | |
3006 | |
3007 | |
3008 | |
3009 <!--l. 235--><p class="noindent" ><span class="likesubparagraphHead"><a | |
3010 id="x1-530003.2.1"></a><span | |
3011 class="cmbx-12">Note:</span></span> Unlike most binary numerical values in this document, we intend the above codewords to | |
3012 be read and used bit by bit from left to right, thus the codeword ’001’ is the bit string ’zero, zero, | |
3013 one’. When determining ’lowest possible value’ in the assignment definition above, the leftmost | |
3014 bit is the MSb. | |
3015 <!--l. 243--><p class="noindent" >It is clear that the codeword length list represents a Huffman decision tree with the entry | |
3016 numbers equivalent to the leaves numbered left-to-right: | |
3017 <div class="center" | |
3018 > | |
3019 <!--l. 247--><p class="noindent" > | |
3020 | |
3021 <!--l. 248--><p class="noindent" ><img | |
3022 src="hufftree.png" alt="PIC" | |
3023 > | |
3024 <br /> <div class="caption" | |
3025 ><span class="id">Figure 4: </span><span | |
3026 class="content">huffman tree illustration</span></div><!--tex4ht:label?: x1-530014 --> | |
3027 </div> | |
3028 <!--l. 253--><p class="noindent" >As we assign codewords in order, we see that each choice constructs a new leaf in the leftmost | |
3029 possible position. | |
3030 <!--l. 256--><p class="noindent" >Note that it’s possible to underspecify or overspecify a Huffman tree via the length list. | |
3031 In the above example, if codeword seven were eliminated, it’s clear that the tree is | |
3032 unfinished: | |
3033 <div class="center" | |
3034 > | |
3035 <!--l. 260--><p class="noindent" > | |
3036 | |
3037 <!--l. 261--><p class="noindent" ><img | |
3038 src="hufftree-under.png" alt="PIC" | |
3039 > | |
3040 <br /> <div class="caption" | |
3041 ><span class="id">Figure 5: </span><span | |
3042 class="content">underspecified huffman tree illustration</span></div><!--tex4ht:label?: x1-530025 --> | |
3043 </div> | |
3044 <!--l. 266--><p class="noindent" >Similarly, in the original codebook, it’s clear that the tree is fully populated and a ninth | |
3045 codeword is impossible. Both underspecified and overspecified trees are an error condition | |
3046 rendering the stream undecodable. Take special care that a codebook with a single used | |
3047 entry is handled properly; it consists of a single codework of zero bits and ’reading’ | |
3048 a value out of such a codebook always returns the single used value and sinks zero | |
3049 bits. | |
3050 <!--l. 274--><p class="noindent" >Codebook entries marked ’unused’ are simply skipped in the assigning process. They have no | |
3051 codeword and do not appear in the decision tree, thus it’s impossible for any bit pattern read | |
3052 from the stream to decode to that entry number. | |
3053 | |
3054 | |
3055 | |
3056 <!--l. 281--><p class="noindent" ><span class="paragraphHead"><a | |
3057 id="x1-540003.2.1"></a><span | |
3058 class="cmbx-12">VQ lookup table vector representation</span></span> | |
3059 Unpacking the VQ lookup table vectors relies on the following values: | |
3060 <div class="fancyvrb" id="fancyvrb17"> | |
3061 <a | |
3062 id="x1-54002r1"></a><span | |
3063 class="cmr-6">1</span><span | |
3064 class="cmtt-8"> </span><span | |
3065 class="cmtt-8"> the</span><span | |
3066 class="cmtt-8"> [codebook\_multiplicands]</span><span | |
3067 class="cmtt-8"> array</span> | |
3068 <br class="fancyvrb" /><a | |
3069 id="x1-54004r2"></a><span | |
3070 class="cmr-6">2</span><span | |
3071 class="cmtt-8"> </span><span | |
3072 class="cmtt-8"> [codebook\_minimum\_value]</span> | |
3073 <br class="fancyvrb" /><a | |
3074 id="x1-54006r3"></a><span | |
3075 class="cmr-6">3</span><span | |
3076 class="cmtt-8"> </span><span | |
3077 class="cmtt-8"> [codebook\_delta\_value]</span> | |
3078 <br class="fancyvrb" /><a | |
3079 id="x1-54008r4"></a><span | |
3080 class="cmr-6">4</span><span | |
3081 class="cmtt-8"> </span><span | |
3082 class="cmtt-8"> [codebook\_sequence\_p]</span> | |
3083 <br class="fancyvrb" /><a | |
3084 id="x1-54010r5"></a><span | |
3085 class="cmr-6">5</span><span | |
3086 class="cmtt-8"> </span><span | |
3087 class="cmtt-8"> [codebook\_lookup\_type]</span> | |
3088 <br class="fancyvrb" /><a | |
3089 id="x1-54012r6"></a><span | |
3090 class="cmr-6">6</span><span | |
3091 class="cmtt-8"> </span><span | |
3092 class="cmtt-8"> [codebook\_entries]</span> | |
3093 <br class="fancyvrb" /><a | |
3094 id="x1-54014r7"></a><span | |
3095 class="cmr-6">7</span><span | |
3096 class="cmtt-8"> </span><span | |
3097 class="cmtt-8"> [codebook\_dimensions]</span> | |
3098 <br class="fancyvrb" /><a | |
3099 id="x1-54016r8"></a><span | |
3100 class="cmr-6">8</span><span | |
3101 class="cmtt-8"> </span><span | |
3102 class="cmtt-8"> [codebook\_lookup\_values]</span> | |
3103 </div> | |
3104 <!--l. 297--><p class="noindent" >Decoding (unpacking) a specific vector in the vector lookup table proceeds according to | |
3105 <span | |
3106 class="cmtt-12">[codebook_lookup_type]</span>. The unpacked vector values are what a codebook would return | |
3107 during audio packet decode in a VQ context. | |
3108 <!--l. 302--><p class="noindent" ><span class="paragraphHead"><a | |
3109 id="x1-550003.2.1"></a><span | |
3110 class="cmbx-12">Vector value decode: Lookup type 1</span></span> | |
3111 Lookup type one specifies a lattice VQ lookup table built algorithmically from a list of | |
3112 scalar values. Calculate (unpack) the final values of a codebook entry vector from | |
3113 the entries in <span | |
3114 class="cmtt-12">[codebook_multiplicands] </span>as follows (<span | |
3115 class="cmtt-12">[value_vector] </span>is the output | |
3116 vector representing the vector of values for entry number <span | |
3117 class="cmtt-12">[lookup_offset] </span>in this | |
3118 codebook): | |
3119 <!--l. 311--><p class="noindent" > | |
3120 <div class="fancyvrb" id="fancyvrb18"> | |
3121 <a | |
3122 id="x1-55002r1"></a><span | |
3123 class="cmr-6">1</span><span | |
3124 class="cmtt-8"> </span><span | |
3125 class="cmtt-8"> </span><span | |
3126 class="cmtt-8"> </span><span | |
3127 class="cmtt-8"> 1)</span><span | |
3128 class="cmtt-8"> [last]</span><span | |
3129 class="cmtt-8"> =</span><span | |
3130 class="cmtt-8"> 0;</span> | |
3131 <br class="fancyvrb" /><a | |
3132 id="x1-55004r2"></a><span | |
3133 class="cmr-6">2</span><span | |
3134 class="cmtt-8"> </span><span | |
3135 class="cmtt-8"> </span><span | |
3136 class="cmtt-8"> </span><span | |
3137 class="cmtt-8"> 2)</span><span | |
3138 class="cmtt-8"> [index_divisor]</span><span | |
3139 class="cmtt-8"> =</span><span | |
3140 class="cmtt-8"> 1;</span> | |
3141 <br class="fancyvrb" /><a | |
3142 id="x1-55006r3"></a><span | |
3143 class="cmr-6">3</span><span | |
3144 class="cmtt-8"> </span><span | |
3145 class="cmtt-8"> </span><span | |
3146 class="cmtt-8"> </span><span | |
3147 class="cmtt-8"> 3)</span><span | |
3148 class="cmtt-8"> iterate</span><span | |
3149 class="cmtt-8"> [i]</span><span | |
3150 class="cmtt-8"> over</span><span | |
3151 class="cmtt-8"> the</span><span | |
3152 class="cmtt-8"> range</span><span | |
3153 class="cmtt-8"> 0</span><span | |
3154 class="cmtt-8"> ...</span><span | |
3155 class="cmtt-8"> [codebook_dimensions]-1</span><span | |
3156 class="cmtt-8"> (once</span><span | |
3157 class="cmtt-8"> for</span><span | |
3158 class="cmtt-8"> each</span><span | |
3159 class="cmtt-8"> scalar</span><span | |
3160 class="cmtt-8"> value</span><span | |
3161 class="cmtt-8"> in</span><span | |
3162 class="cmtt-8"> the</span><span | |
3163 class="cmtt-8"> value</span><span | |
3164 class="cmtt-8"> vector)</span><span | |
3165 class="cmtt-8"> </span><span | |
3166 class="cmsy-8">{</span> | |
3167 <br class="fancyvrb" /><a | |
3168 id="x1-55008r4"></a><span | |
3169 class="cmr-6">4</span><span | |
3170 class="cmtt-8"> </span><span | |
3171 class="cmtt-8"> </span> | |
3172 <br class="fancyvrb" /><a | |
3173 id="x1-55010r5"></a><span | |
3174 class="cmr-6">5</span><span | |
3175 class="cmtt-8"> </span><span | |
3176 class="cmtt-8"> </span><span | |
3177 class="cmtt-8"> </span><span | |
3178 class="cmtt-8"> </span><span | |
3179 class="cmtt-8"> </span><span | |
3180 class="cmtt-8"> </span><span | |
3181 class="cmtt-8"> </span><span | |
3182 class="cmtt-8"> </span><span | |
3183 class="cmtt-8"> 4)</span><span | |
3184 class="cmtt-8"> [multiplicand_offset]</span><span | |
3185 class="cmtt-8"> =</span><span | |
3186 class="cmtt-8"> (</span><span | |
3187 class="cmtt-8"> [lookup_offset]</span><span | |
3188 class="cmtt-8"> divided</span><span | |
3189 class="cmtt-8"> by</span><span | |
3190 class="cmtt-8"> [index_divisor]</span><span | |
3191 class="cmtt-8"> using</span><span | |
3192 class="cmtt-8"> integer</span> | |
3193 <br class="fancyvrb" /><a | |
3194 id="x1-55012r6"></a><span | |
3195 class="cmr-6">6</span><span | |
3196 class="cmtt-8"> </span><span | |
3197 class="cmtt-8"> </span><span | |
3198 class="cmtt-8"> </span><span | |
3199 class="cmtt-8"> </span><span | |
3200 class="cmtt-8"> </span><span | |
3201 class="cmtt-8"> </span><span | |
3202 class="cmtt-8"> </span><span | |
3203 class="cmtt-8"> </span><span | |
3204 class="cmtt-8"> </span><span | |
3205 class="cmtt-8"> </span><span | |
3206 class="cmtt-8"> </span><span | |
3207 class="cmtt-8"> division</span><span | |
3208 class="cmtt-8"> )</span><span | |
3209 class="cmtt-8"> integer</span><span | |
3210 class="cmtt-8"> modulo</span><span | |
3211 class="cmtt-8"> [codebook_lookup_values]</span> | |
3212 <br class="fancyvrb" /><a | |
3213 id="x1-55014r7"></a><span | |
3214 class="cmr-6">7</span><span | |
3215 class="cmtt-8"> </span><span | |
3216 class="cmtt-8"> </span> | |
3217 <br class="fancyvrb" /><a | |
3218 id="x1-55016r8"></a><span | |
3219 class="cmr-6">8</span><span | |
3220 class="cmtt-8"> </span><span | |
3221 class="cmtt-8"> </span><span | |
3222 class="cmtt-8"> </span><span | |
3223 class="cmtt-8"> </span><span | |
3224 class="cmtt-8"> </span><span | |
3225 class="cmtt-8"> </span><span | |
3226 class="cmtt-8"> </span><span | |
3227 class="cmtt-8"> </span><span | |
3228 class="cmtt-8"> 5)</span><span | |
3229 class="cmtt-8"> vector</span><span | |
3230 class="cmtt-8"> [value_vector]</span><span | |
3231 class="cmtt-8"> element</span><span | |
3232 class="cmtt-8"> [i]</span><span | |
3233 class="cmtt-8"> =</span> | |
3234 <br class="fancyvrb" /><a | |
3235 id="x1-55018r9"></a><span | |
3236 class="cmr-6">9</span><span | |
3237 class="cmtt-8"> </span><span | |
3238 class="cmtt-8"> </span><span | |
3239 class="cmtt-8"> </span><span | |
3240 class="cmtt-8"> </span><span | |
3241 class="cmtt-8"> </span><span | |
3242 class="cmtt-8"> </span><span | |
3243 class="cmtt-8"> </span><span | |
3244 class="cmtt-8"> </span><span | |
3245 class="cmtt-8"> </span><span | |
3246 class="cmtt-8"> </span><span | |
3247 class="cmtt-8"> </span><span | |
3248 class="cmtt-8"> </span><span | |
3249 class="cmtt-8"> </span><span | |
3250 class="cmtt-8"> (</span><span | |
3251 class="cmtt-8"> [codebook_multiplicands]</span><span | |
3252 class="cmtt-8"> array</span><span | |
3253 class="cmtt-8"> element</span><span | |
3254 class="cmtt-8"> number</span><span | |
3255 class="cmtt-8"> [multiplicand_offset]</span><span | |
3256 class="cmtt-8"> )</span><span | |
3257 class="cmtt-8"> *</span> | |
3258 <br class="fancyvrb" /><a | |
3259 id="x1-55020r10"></a><span | |
3260 class="cmr-6">10</span><span | |
3261 class="cmtt-8"> </span><span | |
3262 class="cmtt-8"> </span><span | |
3263 class="cmtt-8"> </span><span | |
3264 class="cmtt-8"> </span><span | |
3265 class="cmtt-8"> </span><span | |
3266 class="cmtt-8"> </span><span | |
3267 class="cmtt-8"> </span><span | |
3268 class="cmtt-8"> </span><span | |
3269 class="cmtt-8"> </span><span | |
3270 class="cmtt-8"> </span><span | |
3271 class="cmtt-8"> </span><span | |
3272 class="cmtt-8"> </span><span | |
3273 class="cmtt-8"> </span><span | |
3274 class="cmtt-8"> [codebook_delta_value]</span><span | |
3275 class="cmtt-8"> +</span><span | |
3276 class="cmtt-8"> [codebook_minimum_value]</span><span | |
3277 class="cmtt-8"> +</span><span | |
3278 class="cmtt-8"> [last];</span> | |
3279 <br class="fancyvrb" /><a | |
3280 id="x1-55022r11"></a><span | |
3281 class="cmr-6">11</span><span | |
3282 class="cmtt-8"> </span><span | |
3283 class="cmtt-8"> </span> | |
3284 <br class="fancyvrb" /><a | |
3285 id="x1-55024r12"></a><span | |
3286 class="cmr-6">12</span><span | |
3287 class="cmtt-8"> </span><span | |
3288 class="cmtt-8"> </span><span | |
3289 class="cmtt-8"> </span><span | |
3290 class="cmtt-8"> </span><span | |
3291 class="cmtt-8"> </span><span | |
3292 class="cmtt-8"> </span><span | |
3293 class="cmtt-8"> </span><span | |
3294 class="cmtt-8"> </span><span | |
3295 class="cmtt-8"> 6)</span><span | |
3296 class="cmtt-8"> if</span><span | |
3297 class="cmtt-8"> (</span><span | |
3298 class="cmtt-8"> [codebook_sequence_p]</span><span | |
3299 class="cmtt-8"> is</span><span | |
3300 class="cmtt-8"> set</span><span | |
3301 class="cmtt-8"> )</span><span | |
3302 class="cmtt-8"> then</span><span | |
3303 class="cmtt-8"> set</span><span | |
3304 class="cmtt-8"> [last]</span><span | |
3305 class="cmtt-8"> =</span><span | |
3306 class="cmtt-8"> vector</span><span | |
3307 class="cmtt-8"> [value_vector]</span><span | |
3308 class="cmtt-8"> element</span><span | |
3309 class="cmtt-8"> [i]</span> | |
3310 <br class="fancyvrb" /><a | |
3311 id="x1-55026r13"></a><span | |
3312 class="cmr-6">13</span><span | |
3313 class="cmtt-8"> </span><span | |
3314 class="cmtt-8"> </span> | |
3315 <br class="fancyvrb" /><a | |
3316 id="x1-55028r14"></a><span | |
3317 class="cmr-6">14</span><span | |
3318 class="cmtt-8"> </span><span | |
3319 class="cmtt-8"> </span><span | |
3320 class="cmtt-8"> </span><span | |
3321 class="cmtt-8"> </span><span | |
3322 class="cmtt-8"> </span><span | |
3323 class="cmtt-8"> </span><span | |
3324 class="cmtt-8"> </span><span | |
3325 class="cmtt-8"> </span><span | |
3326 class="cmtt-8"> 7)</span><span | |
3327 class="cmtt-8"> [index_divisor]</span><span | |
3328 class="cmtt-8"> =</span><span | |
3329 class="cmtt-8"> [index_divisor]</span><span | |
3330 class="cmtt-8"> *</span><span | |
3331 class="cmtt-8"> [codebook_lookup_values]</span> | |
3332 <br class="fancyvrb" /><a | |
3333 id="x1-55030r15"></a><span | |
3334 class="cmr-6">15</span><span | |
3335 class="cmtt-8"> </span><span | |
3336 class="cmtt-8"> </span> | |
3337 <br class="fancyvrb" /><a | |
3338 id="x1-55032r16"></a><span | |
3339 class="cmr-6">16</span><span | |
3340 class="cmtt-8"> </span><span | |
3341 class="cmtt-8"> </span><span | |
3342 class="cmtt-8"> </span><span | |
3343 class="cmtt-8"> </span><span | |
3344 class="cmtt-8"> </span><span | |
3345 class="cmtt-8"> </span><span | |
3346 class="cmtt-8"> </span><span | |
3347 class="cmsy-8">}</span> | |
3348 <br class="fancyvrb" /><a | |
3349 id="x1-55034r17"></a><span | |
3350 class="cmr-6">17</span><span | |
3351 class="cmtt-8"> </span><span | |
3352 class="cmtt-8"> </span> | |
3353 <br class="fancyvrb" /><a | |
3354 id="x1-55036r18"></a><span | |
3355 class="cmr-6">18</span><span | |
3356 class="cmtt-8"> </span><span | |
3357 class="cmtt-8"> </span><span | |
3358 class="cmtt-8"> </span><span | |
3359 class="cmtt-8"> 8)</span><span | |
3360 class="cmtt-8"> vector</span><span | |
3361 class="cmtt-8"> calculation</span><span | |
3362 class="cmtt-8"> completed.</span> | |
3363 </div> | |
3364 | |
3365 | |
3366 | |
3367 <!--l. 334--><p class="noindent" ><span class="paragraphHead"><a | |
3368 id="x1-560003.2.1"></a><span | |
3369 class="cmbx-12">Vector value decode: Lookup type 2</span></span> | |
3370 Lookup type two specifies a VQ lookup table in which each scalar in each vector is explicitly set | |
3371 by the <span | |
3372 class="cmtt-12">[codebook_multiplicands] </span>array in a one-to-one mapping. Calculate [unpack] the final | |
3373 values of a codebook entry vector from the entries in <span | |
3374 class="cmtt-12">[codebook_multiplicands] </span>as follows | |
3375 (<span | |
3376 class="cmtt-12">[value_vector] </span>is the output vector representing the vector of values for entry number | |
3377 <span | |
3378 class="cmtt-12">[lookup_offset] </span>in this codebook): | |
3379 <!--l. 344--><p class="noindent" > | |
3380 <div class="fancyvrb" id="fancyvrb19"> | |
3381 <a | |
3382 id="x1-56002r1"></a><span | |
3383 class="cmr-6">1</span><span | |
3384 class="cmtt-8"> </span><span | |
3385 class="cmtt-8"> </span><span | |
3386 class="cmtt-8"> </span><span | |
3387 class="cmtt-8"> 1)</span><span | |
3388 class="cmtt-8"> [last]</span><span | |
3389 class="cmtt-8"> =</span><span | |
3390 class="cmtt-8"> 0;</span> | |
3391 <br class="fancyvrb" /><a | |
3392 id="x1-56004r2"></a><span | |
3393 class="cmr-6">2</span><span | |
3394 class="cmtt-8"> </span><span | |
3395 class="cmtt-8"> </span><span | |
3396 class="cmtt-8"> </span><span | |
3397 class="cmtt-8"> 2)</span><span | |
3398 class="cmtt-8"> [multiplicand_offset]</span><span | |
3399 class="cmtt-8"> =</span><span | |
3400 class="cmtt-8"> [lookup_offset]</span><span | |
3401 class="cmtt-8"> *</span><span | |
3402 class="cmtt-8"> [codebook_dimensions]</span> | |
3403 <br class="fancyvrb" /><a | |
3404 id="x1-56006r3"></a><span | |
3405 class="cmr-6">3</span><span | |
3406 class="cmtt-8"> </span><span | |
3407 class="cmtt-8"> </span><span | |
3408 class="cmtt-8"> </span><span | |
3409 class="cmtt-8"> 3)</span><span | |
3410 class="cmtt-8"> iterate</span><span | |
3411 class="cmtt-8"> [i]</span><span | |
3412 class="cmtt-8"> over</span><span | |
3413 class="cmtt-8"> the</span><span | |
3414 class="cmtt-8"> range</span><span | |
3415 class="cmtt-8"> 0</span><span | |
3416 class="cmtt-8"> ...</span><span | |
3417 class="cmtt-8"> [codebook_dimensions]-1</span><span | |
3418 class="cmtt-8"> (once</span><span | |
3419 class="cmtt-8"> for</span><span | |
3420 class="cmtt-8"> each</span><span | |
3421 class="cmtt-8"> scalar</span><span | |
3422 class="cmtt-8"> value</span><span | |
3423 class="cmtt-8"> in</span><span | |
3424 class="cmtt-8"> the</span><span | |
3425 class="cmtt-8"> value</span><span | |
3426 class="cmtt-8"> vector)</span><span | |
3427 class="cmtt-8"> </span><span | |
3428 class="cmsy-8">{</span> | |
3429 <br class="fancyvrb" /><a | |
3430 id="x1-56008r4"></a><span | |
3431 class="cmr-6">4</span><span | |
3432 class="cmtt-8"> </span><span | |
3433 class="cmtt-8"> </span> | |
3434 <br class="fancyvrb" /><a | |
3435 id="x1-56010r5"></a><span | |
3436 class="cmr-6">5</span><span | |
3437 class="cmtt-8"> </span><span | |
3438 class="cmtt-8"> </span><span | |
3439 class="cmtt-8"> </span><span | |
3440 class="cmtt-8"> </span><span | |
3441 class="cmtt-8"> </span><span | |
3442 class="cmtt-8"> </span><span | |
3443 class="cmtt-8"> </span><span | |
3444 class="cmtt-8"> </span><span | |
3445 class="cmtt-8"> 4)</span><span | |
3446 class="cmtt-8"> vector</span><span | |
3447 class="cmtt-8"> [value_vector]</span><span | |
3448 class="cmtt-8"> element</span><span | |
3449 class="cmtt-8"> [i]</span><span | |
3450 class="cmtt-8"> =</span> | |
3451 <br class="fancyvrb" /><a | |
3452 id="x1-56012r6"></a><span | |
3453 class="cmr-6">6</span><span | |
3454 class="cmtt-8"> </span><span | |
3455 class="cmtt-8"> </span><span | |
3456 class="cmtt-8"> </span><span | |
3457 class="cmtt-8"> </span><span | |
3458 class="cmtt-8"> </span><span | |
3459 class="cmtt-8"> </span><span | |
3460 class="cmtt-8"> </span><span | |
3461 class="cmtt-8"> </span><span | |
3462 class="cmtt-8"> </span><span | |
3463 class="cmtt-8"> </span><span | |
3464 class="cmtt-8"> </span><span | |
3465 class="cmtt-8"> </span><span | |
3466 class="cmtt-8"> </span><span | |
3467 class="cmtt-8"> (</span><span | |
3468 class="cmtt-8"> [codebook_multiplicands]</span><span | |
3469 class="cmtt-8"> array</span><span | |
3470 class="cmtt-8"> element</span><span | |
3471 class="cmtt-8"> number</span><span | |
3472 class="cmtt-8"> [multiplicand_offset]</span><span | |
3473 class="cmtt-8"> )</span><span | |
3474 class="cmtt-8"> *</span> | |
3475 <br class="fancyvrb" /><a | |
3476 id="x1-56014r7"></a><span | |
3477 class="cmr-6">7</span><span | |
3478 class="cmtt-8"> </span><span | |
3479 class="cmtt-8"> </span><span | |
3480 class="cmtt-8"> </span><span | |
3481 class="cmtt-8"> </span><span | |
3482 class="cmtt-8"> </span><span | |
3483 class="cmtt-8"> </span><span | |
3484 class="cmtt-8"> </span><span | |
3485 class="cmtt-8"> </span><span | |
3486 class="cmtt-8"> </span><span | |
3487 class="cmtt-8"> </span><span | |
3488 class="cmtt-8"> </span><span | |
3489 class="cmtt-8"> </span><span | |
3490 class="cmtt-8"> </span><span | |
3491 class="cmtt-8"> [codebook_delta_value]</span><span | |
3492 class="cmtt-8"> +</span><span | |
3493 class="cmtt-8"> [codebook_minimum_value]</span><span | |
3494 class="cmtt-8"> +</span><span | |
3495 class="cmtt-8"> [last];</span> | |
3496 <br class="fancyvrb" /><a | |
3497 id="x1-56016r8"></a><span | |
3498 class="cmr-6">8</span><span | |
3499 class="cmtt-8"> </span><span | |
3500 class="cmtt-8"> </span> | |
3501 <br class="fancyvrb" /><a | |
3502 id="x1-56018r9"></a><span | |
3503 class="cmr-6">9</span><span | |
3504 class="cmtt-8"> </span><span | |
3505 class="cmtt-8"> </span><span | |
3506 class="cmtt-8"> </span><span | |
3507 class="cmtt-8"> </span><span | |
3508 class="cmtt-8"> </span><span | |
3509 class="cmtt-8"> </span><span | |
3510 class="cmtt-8"> </span><span | |
3511 class="cmtt-8"> </span><span | |
3512 class="cmtt-8"> 5)</span><span | |
3513 class="cmtt-8"> if</span><span | |
3514 class="cmtt-8"> (</span><span | |
3515 class="cmtt-8"> [codebook_sequence_p]</span><span | |
3516 class="cmtt-8"> is</span><span | |
3517 class="cmtt-8"> set</span><span | |
3518 class="cmtt-8"> )</span><span | |
3519 class="cmtt-8"> then</span><span | |
3520 class="cmtt-8"> set</span><span | |
3521 class="cmtt-8"> [last]</span><span | |
3522 class="cmtt-8"> =</span><span | |
3523 class="cmtt-8"> vector</span><span | |
3524 class="cmtt-8"> [value_vector]</span><span | |
3525 class="cmtt-8"> element</span><span | |
3526 class="cmtt-8"> [i]</span> | |
3527 <br class="fancyvrb" /><a | |
3528 id="x1-56020r10"></a><span | |
3529 class="cmr-6">10</span><span | |
3530 class="cmtt-8"> </span><span | |
3531 class="cmtt-8"> </span> | |
3532 <br class="fancyvrb" /><a | |
3533 id="x1-56022r11"></a><span | |
3534 class="cmr-6">11</span><span | |
3535 class="cmtt-8"> </span><span | |
3536 class="cmtt-8"> </span><span | |
3537 class="cmtt-8"> </span><span | |
3538 class="cmtt-8"> </span><span | |
3539 class="cmtt-8"> </span><span | |
3540 class="cmtt-8"> </span><span | |
3541 class="cmtt-8"> </span><span | |
3542 class="cmtt-8"> </span><span | |
3543 class="cmtt-8"> 6)</span><span | |
3544 class="cmtt-8"> increment</span><span | |
3545 class="cmtt-8"> [multiplicand_offset]</span> | |
3546 <br class="fancyvrb" /><a | |
3547 id="x1-56024r12"></a><span | |
3548 class="cmr-6">12</span><span | |
3549 class="cmtt-8"> </span><span | |
3550 class="cmtt-8"> </span> | |
3551 <br class="fancyvrb" /><a | |
3552 id="x1-56026r13"></a><span | |
3553 class="cmr-6">13</span><span | |
3554 class="cmtt-8"> </span><span | |
3555 class="cmtt-8"> </span><span | |
3556 class="cmtt-8"> </span><span | |
3557 class="cmtt-8"> </span><span | |
3558 class="cmtt-8"> </span><span | |
3559 class="cmtt-8"> </span><span | |
3560 class="cmtt-8"> </span><span | |
3561 class="cmsy-8">}</span> | |
3562 <br class="fancyvrb" /><a | |
3563 id="x1-56028r14"></a><span | |
3564 class="cmr-6">14</span><span | |
3565 class="cmtt-8"> </span><span | |
3566 class="cmtt-8"> </span> | |
3567 <br class="fancyvrb" /><a | |
3568 id="x1-56030r15"></a><span | |
3569 class="cmr-6">15</span><span | |
3570 class="cmtt-8"> </span><span | |
3571 class="cmtt-8"> </span><span | |
3572 class="cmtt-8"> </span><span | |
3573 class="cmtt-8"> 7)</span><span | |
3574 class="cmtt-8"> vector</span><span | |
3575 class="cmtt-8"> calculation</span><span | |
3576 class="cmtt-8"> completed.</span> | |
3577 </div> | |
3578 <!--l. 370--><p class="noindent" > | |
3579 <h4 class="subsectionHead"><span class="titlemark">3.3. </span> <a | |
3580 id="x1-570003.3"></a>Use of the codebook abstraction</h4> | |
3581 <!--l. 372--><p class="noindent" >The decoder uses the codebook abstraction much as it does the bit-unpacking convention; a | |
3582 specific codebook reads a codeword from the bitstream, decoding it into an entry number, and | |
3583 then returns that entry number to the decoder (when used in a scalar entropy coding context), or | |
3584 uses that entry number as an offset into the VQ lookup table, returning a vector of values (when | |
3585 used in a context desiring a VQ value). Scalar or VQ context is always explicit; any | |
3586 call to the codebook mechanism requests either a scalar entry number or a lookup | |
3587 vector. | |
3588 <!--l. 382--><p class="noindent" >Note that VQ lookup type zero indicates that there is no lookup table; requesting | |
3589 decode using a codebook of lookup type 0 in any context expecting a vector return | |
3590 value (even in a case where a vector of dimension one) is forbidden. If decoder setup | |
3591 or decode requests such an action, that is an error condition rendering the packet | |
3592 | |
3593 | |
3594 | |
3595 undecodable. | |
3596 <!--l. 389--><p class="noindent" >Using a codebook to read from the packet bitstream consists first of reading and decoding the | |
3597 next codeword in the bitstream. The decoder reads bits until the accumulated bits match a | |
3598 codeword in the codebook. This process can be though of as logically walking the | |
3599 Huffman decode tree by reading one bit at a time from the bitstream, and using the | |
3600 bit as a decision boolean to take the 0 branch (left in the above examples) or the 1 | |
3601 branch (right in the above examples). Walking the tree finishes when the decode process | |
3602 hits a leaf in the decision tree; the result is the entry number corresponding to that | |
3603 leaf. Reading past the end of a packet propagates the ’end-of-stream’ condition to the | |
3604 decoder. | |
3605 <!--l. 401--><p class="noindent" >When used in a scalar context, the resulting codeword entry is the desired return | |
3606 value. | |
3607 <!--l. 404--><p class="noindent" >When used in a VQ context, the codeword entry number is used as an offset into the VQ lookup | |
3608 table. The value returned to the decoder is the vector of scalars corresponding to this | |
3609 offset. | |
3610 | |
3611 | |
3612 | |
3613 | |
3614 | |
3615 | |
3616 <h3 class="sectionHead"><span class="titlemark">4. </span> <a | |
3617 id="x1-580004"></a>Codec Setup and Packet Decode</h3> | |
3618 <!--l. 7--><p class="noindent" > | |
3619 <h4 class="subsectionHead"><span class="titlemark">4.1. </span> <a | |
3620 id="x1-590004.1"></a>Overview</h4> | |
3621 <!--l. 9--><p class="noindent" >This document serves as the top-level reference document for the bit-by-bit decode specification | |
3622 of Vorbis I. This document assumes a high-level understanding of the Vorbis decode | |
3623 process, which is provided in <a | |
3624 href="#x1-20001">Section 1</a>, “<a | |
3625 href="#x1-20001">Introduction and Description<!--tex4ht:ref: vorbis:spec:intro --></a>”. <a | |
3626 href="#x1-360002">Section 2</a>, | |
3627 “<a | |
3628 href="#x1-360002">Bitpacking Convention<!--tex4ht:ref: vorbis:spec:bitpacking --></a>” covers reading and writing bit fields from and to bitstream | |
3629 packets. | |
3630 <!--l. 17--><p class="noindent" > | |
3631 <h4 class="subsectionHead"><span class="titlemark">4.2. </span> <a | |
3632 id="x1-600004.2"></a>Header decode and decode setup</h4> | |
3633 <!--l. 19--><p class="noindent" >A Vorbis bitstream begins with three header packets. The header packets are, in order, the | |
3634 identification header, the comments header, and the setup header. All are required for decode | |
3635 compliance. An end-of-packet condition during decoding the first or third header packet renders | |
3636 the stream undecodable. End-of-packet decoding the comment header is a non-fatal error | |
3637 condition. | |
3638 <!--l. 26--><p class="noindent" > | |
3639 <h5 class="subsubsectionHead"><span class="titlemark">4.2.1. </span> <a | |
3640 id="x1-610004.2.1"></a>Common header decode</h5> | |
3641 <!--l. 28--><p class="noindent" >Each header packet begins with the same header fields. | |
3642 <!--l. 31--><p class="noindent" > | |
3643 <div class="fancyvrb" id="fancyvrb20"> | |
3644 <a | |
3645 id="x1-61002r1"></a><span | |
3646 class="cmr-6">1</span><span | |
3647 class="cmtt-8"> </span><span | |
3648 class="cmtt-8"> </span><span | |
3649 class="cmtt-8"> </span><span | |
3650 class="cmtt-8"> 1)</span><span | |
3651 class="cmtt-8"> [packet_type]</span><span | |
3652 class="cmtt-8"> :</span><span | |
3653 class="cmtt-8"> 8</span><span | |
3654 class="cmtt-8"> bit</span><span | |
3655 class="cmtt-8"> value</span> | |
3656 <br class="fancyvrb" /><a | |
3657 id="x1-61004r2"></a><span | |
3658 class="cmr-6">2</span><span | |
3659 class="cmtt-8"> </span><span | |
3660 class="cmtt-8"> </span><span | |
3661 class="cmtt-8"> </span><span | |
3662 class="cmtt-8"> 2)</span><span | |
3663 class="cmtt-8"> 0x76,</span><span | |
3664 class="cmtt-8"> 0x6f,</span><span | |
3665 class="cmtt-8"> 0x72,</span><span | |
3666 class="cmtt-8"> 0x62,</span><span | |
3667 class="cmtt-8"> 0x69,</span><span | |
3668 class="cmtt-8"> 0x73:</span><span | |
3669 class="cmtt-8"> the</span><span | |
3670 class="cmtt-8"> characters</span><span | |
3671 class="cmtt-8"> ’v’,’o’,’r’,’b’,’i’,’s’</span><span | |
3672 class="cmtt-8"> as</span><span | |
3673 class="cmtt-8"> six</span><span | |
3674 class="cmtt-8"> octets</span> | |
3675 </div> | |
3676 | |
3677 | |
3678 | |
3679 <!--l. 36--><p class="noindent" >Decode continues according to packet type; the identification header is type 1, the comment | |
3680 header type 3 and the setup header type 5 (these types are all odd as a packet with a leading | |
3681 single bit of ’0’ is an audio packet). The packets must occur in the order of identification, | |
3682 comment, setup. | |
3683 <!--l. 44--><p class="noindent" > | |
3684 <h5 class="subsubsectionHead"><span class="titlemark">4.2.2. </span> <a | |
3685 id="x1-620004.2.2"></a>Identification header</h5> | |
3686 <!--l. 46--><p class="noindent" >The identification header is a short header of only a few fields used to declare the stream | |
3687 definitively as Vorbis, and provide a few externally relevant pieces of information about the audio | |
3688 stream. The identification header is coded as follows: | |
3689 <!--l. 51--><p class="noindent" > | |
3690 <div class="fancyvrb" id="fancyvrb21"> | |
3691 <a | |
3692 id="x1-62002r1"></a><span | |
3693 class="cmr-6">1</span><span | |
3694 class="cmtt-8"> </span><span | |
3695 class="cmtt-8"> </span><span | |
3696 class="cmtt-8"> 1)</span><span | |
3697 class="cmtt-8"> [vorbis_version]</span><span | |
3698 class="cmtt-8"> =</span><span | |
3699 class="cmtt-8"> read</span><span | |
3700 class="cmtt-8"> 32</span><span | |
3701 class="cmtt-8"> bits</span><span | |
3702 class="cmtt-8"> as</span><span | |
3703 class="cmtt-8"> unsigned</span><span | |
3704 class="cmtt-8"> integer</span> | |
3705 <br class="fancyvrb" /><a | |
3706 id="x1-62004r2"></a><span | |
3707 class="cmr-6">2</span><span | |
3708 class="cmtt-8"> </span><span | |
3709 class="cmtt-8"> </span><span | |
3710 class="cmtt-8"> 2)</span><span | |
3711 class="cmtt-8"> [audio_channels]</span><span | |
3712 class="cmtt-8"> =</span><span | |
3713 class="cmtt-8"> read</span><span | |
3714 class="cmtt-8"> 8</span><span | |
3715 class="cmtt-8"> bit</span><span | |
3716 class="cmtt-8"> integer</span><span | |
3717 class="cmtt-8"> as</span><span | |
3718 class="cmtt-8"> unsigned</span> | |
3719 <br class="fancyvrb" /><a | |
3720 id="x1-62006r3"></a><span | |
3721 class="cmr-6">3</span><span | |
3722 class="cmtt-8"> </span><span | |
3723 class="cmtt-8"> </span><span | |
3724 class="cmtt-8"> 3)</span><span | |
3725 class="cmtt-8"> [audio_sample_rate]</span><span | |
3726 class="cmtt-8"> =</span><span | |
3727 class="cmtt-8"> read</span><span | |
3728 class="cmtt-8"> 32</span><span | |
3729 class="cmtt-8"> bits</span><span | |
3730 class="cmtt-8"> as</span><span | |
3731 class="cmtt-8"> unsigned</span><span | |
3732 class="cmtt-8"> integer</span> | |
3733 <br class="fancyvrb" /><a | |
3734 id="x1-62008r4"></a><span | |
3735 class="cmr-6">4</span><span | |
3736 class="cmtt-8"> </span><span | |
3737 class="cmtt-8"> </span><span | |
3738 class="cmtt-8"> 4)</span><span | |
3739 class="cmtt-8"> [bitrate_maximum]</span><span | |
3740 class="cmtt-8"> =</span><span | |
3741 class="cmtt-8"> read</span><span | |
3742 class="cmtt-8"> 32</span><span | |
3743 class="cmtt-8"> bits</span><span | |
3744 class="cmtt-8"> as</span><span | |
3745 class="cmtt-8"> signed</span><span | |
3746 class="cmtt-8"> integer</span> | |
3747 <br class="fancyvrb" /><a | |
3748 id="x1-62010r5"></a><span | |
3749 class="cmr-6">5</span><span | |
3750 class="cmtt-8"> </span><span | |
3751 class="cmtt-8"> </span><span | |
3752 class="cmtt-8"> 5)</span><span | |
3753 class="cmtt-8"> [bitrate_nominal]</span><span | |
3754 class="cmtt-8"> =</span><span | |
3755 class="cmtt-8"> read</span><span | |
3756 class="cmtt-8"> 32</span><span | |
3757 class="cmtt-8"> bits</span><span | |
3758 class="cmtt-8"> as</span><span | |
3759 class="cmtt-8"> signed</span><span | |
3760 class="cmtt-8"> integer</span> | |
3761 <br class="fancyvrb" /><a | |
3762 id="x1-62012r6"></a><span | |
3763 class="cmr-6">6</span><span | |
3764 class="cmtt-8"> </span><span | |
3765 class="cmtt-8"> </span><span | |
3766 class="cmtt-8"> 6)</span><span | |
3767 class="cmtt-8"> [bitrate_minimum]</span><span | |
3768 class="cmtt-8"> =</span><span | |
3769 class="cmtt-8"> read</span><span | |
3770 class="cmtt-8"> 32</span><span | |
3771 class="cmtt-8"> bits</span><span | |
3772 class="cmtt-8"> as</span><span | |
3773 class="cmtt-8"> signed</span><span | |
3774 class="cmtt-8"> integer</span> | |
3775 <br class="fancyvrb" /><a | |
3776 id="x1-62014r7"></a><span | |
3777 class="cmr-6">7</span><span | |
3778 class="cmtt-8"> </span><span | |
3779 class="cmtt-8"> </span><span | |
3780 class="cmtt-8"> 7)</span><span | |
3781 class="cmtt-8"> [blocksize_0]</span><span | |
3782 class="cmtt-8"> =</span><span | |
3783 class="cmtt-8"> 2</span><span | |
3784 class="cmtt-8"> exponent</span><span | |
3785 class="cmtt-8"> (read</span><span | |
3786 class="cmtt-8"> 4</span><span | |
3787 class="cmtt-8"> bits</span><span | |
3788 class="cmtt-8"> as</span><span | |
3789 class="cmtt-8"> unsigned</span><span | |
3790 class="cmtt-8"> integer)</span> | |
3791 <br class="fancyvrb" /><a | |
3792 id="x1-62016r8"></a><span | |
3793 class="cmr-6">8</span><span | |
3794 class="cmtt-8"> </span><span | |
3795 class="cmtt-8"> </span><span | |
3796 class="cmtt-8"> 8)</span><span | |
3797 class="cmtt-8"> [blocksize_1]</span><span | |
3798 class="cmtt-8"> =</span><span | |
3799 class="cmtt-8"> 2</span><span | |
3800 class="cmtt-8"> exponent</span><span | |
3801 class="cmtt-8"> (read</span><span | |
3802 class="cmtt-8"> 4</span><span | |
3803 class="cmtt-8"> bits</span><span | |
3804 class="cmtt-8"> as</span><span | |
3805 class="cmtt-8"> unsigned</span><span | |
3806 class="cmtt-8"> integer)</span> | |
3807 <br class="fancyvrb" /><a | |
3808 id="x1-62018r9"></a><span | |
3809 class="cmr-6">9</span><span | |
3810 class="cmtt-8"> </span><span | |
3811 class="cmtt-8"> </span><span | |
3812 class="cmtt-8"> 9)</span><span | |
3813 class="cmtt-8"> [framing_flag]</span><span | |
3814 class="cmtt-8"> =</span><span | |
3815 class="cmtt-8"> read</span><span | |
3816 class="cmtt-8"> one</span><span | |
3817 class="cmtt-8"> bit</span> | |
3818 </div> | |
3819 <!--l. 63--><p class="noindent" ><span | |
3820 class="cmtt-12">[vorbis_version] </span>is to read ’0’ in order to be compatible with this document. Both | |
3821 <span | |
3822 class="cmtt-12">[audio_channels] </span>and <span | |
3823 class="cmtt-12">[audio_sample_rate] </span>must read greater than zero. Allowed final | |
3824 blocksize values are 64, 128, 256, 512, 1024, 2048, 4096 and 8192 in Vorbis I. <span | |
3825 class="cmtt-12">[blocksize_0]</span> | |
3826 must be less than or equal to <span | |
3827 class="cmtt-12">[blocksize_1]</span>. The framing bit must be nonzero. Failure to meet | |
3828 any of these conditions renders a stream undecodable. | |
3829 <!--l. 71--><p class="noindent" >The bitrate fields above are used only as hints. The nominal bitrate field especially may be | |
3830 considerably off in purely VBR streams. The fields are meaningful only when greater than | |
3831 zero. | |
3832 <ul class="itemize1"> | |
3833 <li class="itemize">All three fields set to the same value implies a fixed rate, or tightly bounded, nearly | |
3834 fixed-rate bitstream | |
3835 </li> | |
3836 <li class="itemize">Only nominal set implies a VBR or ABR stream that averages the nominal bitrate | |
3837 | |
3838 | |
3839 | |
3840 </li> | |
3841 <li class="itemize">Maximum and or minimum set implies a VBR bitstream that obeys the bitrate limits | |
3842 </li> | |
3843 <li class="itemize">None set indicates the encoder does not care to speculate.</li></ul> | |
3844 <!--l. 85--><p class="noindent" > | |
3845 <h5 class="subsubsectionHead"><span class="titlemark">4.2.3. </span> <a | |
3846 id="x1-630004.2.3"></a>Comment header</h5> | |
3847 <!--l. 86--><p class="noindent" >Comment header decode and data specification is covered in <a | |
3848 href="#x1-810005">Section 5</a>, “<a | |
3849 href="#x1-810005">comment field and | |
3850 header specification<!--tex4ht:ref: vorbis:spec:comment --></a>”. | |
3851 <!--l. 90--><p class="noindent" > | |
3852 <h5 class="subsubsectionHead"><span class="titlemark">4.2.4. </span> <a | |
3853 id="x1-640004.2.4"></a>Setup header</h5> | |
3854 <!--l. 92--><p class="noindent" >Vorbis codec setup is configurable to an extreme degree: | |
3855 <div class="center" | |
3856 > | |
3857 <!--l. 94--><p class="noindent" > | |
3858 | |
3859 <!--l. 95--><p class="noindent" ><img | |
3860 src="components.png" alt="PIC" | |
3861 > | |
3862 <br /> <div class="caption" | |
3863 ><span class="id">Figure 6: </span><span | |
3864 class="content">decoder pipeline configuration</span></div><!--tex4ht:label?: x1-640016 --> | |
3865 </div> | |
3866 <!--l. 100--><p class="noindent" >The setup header contains the bulk of the codec setup information needed for decode. The setup | |
3867 header contains, in order, the lists of codebook configurations, time-domain transform | |
3868 configurations (placeholders in Vorbis I), floor configurations, residue configurations, channel | |
3869 mapping configurations and mode configurations. It finishes with a framing bit of ’1’. Header | |
3870 decode proceeds in the following order: | |
3871 <!--l. 108--><p class="noindent" ><span class="paragraphHead"><a | |
3872 id="x1-650004.2.4"></a><span | |
3873 class="cmbx-12">Codebooks</span></span> | |
3874 | |
3875 | |
3876 | |
3877 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3878 1. </dt><dd | |
3879 class="enumerate-enumitem"><span | |
3880 class="cmtt-12">[vorbis_codebook_count] </span>= read eight bits as unsigned integer and add one | |
3881 </dd><dt class="enumerate-enumitem"> | |
3882 2. </dt><dd | |
3883 class="enumerate-enumitem">Decode <span | |
3884 class="cmtt-12">[vorbis_codebook_count] </span>codebooks in order as defined in <a | |
3885 href="#x1-470003">Section 3</a>, | |
3886 “<a | |
3887 href="#x1-470003">Probability Model and Codebooks<!--tex4ht:ref: vorbis:spec:codebook --></a>”. Save each configuration, in order, in an array | |
3888 of codebook configurations <span | |
3889 class="cmtt-12">[vorbis_codebook_configurations]</span>.</dd></dl> | |
3890 <!--l. 120--><p class="noindent" ><span class="paragraphHead"><a | |
3891 id="x1-660004.2.4"></a><span | |
3892 class="cmbx-12">Time domain transforms</span></span> | |
3893 These hooks are placeholders in Vorbis I. Nevertheless, the configuration placeholder values must | |
3894 be read to maintain bitstream sync. | |
3895 <!--l. 127--><p class="noindent" > | |
3896 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3897 1. </dt><dd | |
3898 class="enumerate-enumitem"><span | |
3899 class="cmtt-12">[vorbis_time_count] </span>= read 6 bits as unsigned integer and add one | |
3900 </dd><dt class="enumerate-enumitem"> | |
3901 2. </dt><dd | |
3902 class="enumerate-enumitem">read <span | |
3903 class="cmtt-12">[vorbis_time_count] </span>16 bit values; each value should be zero. If any value is | |
3904 nonzero, this is an error condition and the stream is undecodable.</dd></dl> | |
3905 <!--l. 133--><p class="noindent" ><span class="paragraphHead"><a | |
3906 id="x1-670004.2.4"></a><span | |
3907 class="cmbx-12">Floors</span></span> | |
3908 Vorbis uses two floor types; header decode is handed to the decode abstraction of the appropriate | |
3909 type. | |
3910 <!--l. 139--><p class="noindent" > | |
3911 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3912 1. </dt><dd | |
3913 class="enumerate-enumitem"><span | |
3914 class="cmtt-12">[vorbis_floor_count] </span>= read 6 bits as unsigned integer and add one | |
3915 </dd><dt class="enumerate-enumitem"> | |
3916 2. </dt><dd | |
3917 class="enumerate-enumitem">For each <span | |
3918 class="cmtt-12">[i] </span>of <span | |
3919 class="cmtt-12">[vorbis_floor_count] </span>floor numbers: | |
3920 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3921 a) </dt><dd | |
3922 class="enumerate-enumitem">read the floor type: vector <span | |
3923 class="cmtt-12">[vorbis_floor_types] </span>element <span | |
3924 class="cmtt-12">[i] </span>= read 16 bits | |
3925 as unsigned integer | |
3926 </dd><dt class="enumerate-enumitem"> | |
3927 b) </dt><dd | |
3928 class="enumerate-enumitem">If the floor type is zero, decode the floor configuration as defined in <a | |
3929 href="#x1-890006">Section 6</a>, | |
3930 “<a | |
3931 href="#x1-890006">Floor type 0 setup and decode<!--tex4ht:ref: vorbis:spec:floor0 --></a>”; save this configuration in slot <span | |
3932 class="cmtt-12">[i] </span>of the floor | |
3933 configuration array <span | |
3934 class="cmtt-12">[vorbis_floor_configurations]</span>. | |
3935 | |
3936 | |
3937 | |
3938 </dd><dt class="enumerate-enumitem"> | |
3939 c) </dt><dd | |
3940 class="enumerate-enumitem">If the floor type is one, decode the floor configuration as defined in <a | |
3941 href="#x1-950007">Section 7</a>, | |
3942 “<a | |
3943 href="#x1-950007">Floor type 1 setup and decode<!--tex4ht:ref: vorbis:spec:floor1 --></a>”; save this configuration in slot <span | |
3944 class="cmtt-12">[i] </span>of the floor | |
3945 configuration array <span | |
3946 class="cmtt-12">[vorbis_floor_configurations]</span>. | |
3947 </dd><dt class="enumerate-enumitem"> | |
3948 d) </dt><dd | |
3949 class="enumerate-enumitem">If the the floor type is greater than one, this stream is undecodable; ERROR | |
3950 CONDITION</dd></dl> | |
3951 </dd></dl> | |
3952 <!--l. 157--><p class="noindent" ><span class="paragraphHead"><a | |
3953 id="x1-680004.2.4"></a><span | |
3954 class="cmbx-12">Residues</span></span> | |
3955 Vorbis uses three residue types; header decode of each type is identical. | |
3956 <!--l. 163--><p class="noindent" > | |
3957 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3958 1. </dt><dd | |
3959 class="enumerate-enumitem"><span | |
3960 class="cmtt-12">[vorbis_residue_count] </span>= read 6 bits as unsigned integer and add one | |
3961 </dd><dt class="enumerate-enumitem"> | |
3962 2. </dt><dd | |
3963 class="enumerate-enumitem">For each of <span | |
3964 class="cmtt-12">[vorbis_residue_count] </span>residue numbers: | |
3965 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3966 a) </dt><dd | |
3967 class="enumerate-enumitem">read the residue type; vector <span | |
3968 class="cmtt-12">[vorbis_residue_types] </span>element <span | |
3969 class="cmtt-12">[i] </span>= read 16 | |
3970 bits as unsigned integer | |
3971 </dd><dt class="enumerate-enumitem"> | |
3972 b) </dt><dd | |
3973 class="enumerate-enumitem">If the residue type is zero, one or two, decode the residue configuration as defined | |
3974 in <a | |
3975 href="#x1-1020008">Section 8</a>, “<a | |
3976 href="#x1-1020008">Residue setup and decode<!--tex4ht:ref: vorbis:spec:residue --></a>”; save this configuration in slot <span | |
3977 class="cmtt-12">[i] </span>of | |
3978 the residue configuration array <span | |
3979 class="cmtt-12">[vorbis_residue_configurations]</span>. | |
3980 </dd><dt class="enumerate-enumitem"> | |
3981 c) </dt><dd | |
3982 class="enumerate-enumitem">If the the residue type is greater than two, this stream is undecodable; ERROR | |
3983 CONDITION</dd></dl> | |
3984 </dd></dl> | |
3985 <!--l. 177--><p class="noindent" ><span class="paragraphHead"><a | |
3986 id="x1-690004.2.4"></a><span | |
3987 class="cmbx-12">Mappings</span></span> | |
3988 Mappings are used to set up specific pipelines for encoding multichannel audio with varying | |
3989 channel mapping applications. Vorbis I uses a single mapping type (0), with implicit PCM | |
3990 channel mappings. | |
3991 | |
3992 | |
3993 | |
3994 <!--l. 188--><p class="noindent" > | |
3995 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
3996 1. </dt><dd | |
3997 class="enumerate-enumitem"><span | |
3998 class="cmtt-12">[vorbis_mapping_count] </span>= read 6 bits as unsigned integer and add one | |
3999 </dd><dt class="enumerate-enumitem"> | |
4000 2. </dt><dd | |
4001 class="enumerate-enumitem">For each <span | |
4002 class="cmtt-12">[i] </span>of <span | |
4003 class="cmtt-12">[vorbis_mapping_count] </span>mapping numbers: | |
4004 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4005 a) </dt><dd | |
4006 class="enumerate-enumitem">read the mapping type: 16 bits as unsigned integer. There’s no reason to save | |
4007 the mapping type in Vorbis I. | |
4008 </dd><dt class="enumerate-enumitem"> | |
4009 b) </dt><dd | |
4010 class="enumerate-enumitem">If the mapping type is nonzero, the stream is undecodable | |
4011 </dd><dt class="enumerate-enumitem"> | |
4012 c) </dt><dd | |
4013 class="enumerate-enumitem">If the mapping type is zero: | |
4014 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4015 i. </dt><dd | |
4016 class="enumerate-enumitem">read 1 bit as a boolean flag | |
4017 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4018 A. </dt><dd | |
4019 class="enumerate-enumitem">if set, <span | |
4020 class="cmtt-12">[vorbis_mapping_submaps] </span>= read 4 bits as unsigned integer | |
4021 and add one | |
4022 </dd><dt class="enumerate-enumitem"> | |
4023 B. </dt><dd | |
4024 class="enumerate-enumitem">if unset, <span | |
4025 class="cmtt-12">[vorbis_mapping_submaps] </span>= 1</dd></dl> | |
4026 </dd><dt class="enumerate-enumitem"> | |
4027 ii. </dt><dd | |
4028 class="enumerate-enumitem">read 1 bit as a boolean flag | |
4029 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4030 A. </dt><dd | |
4031 class="enumerate-enumitem">if set, square polar channel mapping is in use: | |
4032 <ul class="itemize1"> | |
4033 <li class="itemize"><span | |
4034 class="cmtt-12">[vorbis_mapping_coupling_steps] </span>= read 8 bits as unsigned | |
4035 integer and add one | |
4036 </li> | |
4037 <li class="itemize">for <span | |
4038 class="cmtt-12">[j] </span>each of <span | |
4039 class="cmtt-12">[vorbis_mapping_coupling_steps] </span>steps: | |
4040 <ul class="itemize2"> | |
4041 <li class="itemize">vector <span | |
4042 class="cmtt-12">[vorbis_mapping_magnitude] </span>element <span | |
4043 class="cmtt-12">[j]</span>= read | |
4044 <a | |
4045 href="#x1-1170009.2.1">ilog</a>(<span | |
4046 class="cmtt-12">[audio_channels] </span>- 1) bits as unsigned integer | |
4047 </li> | |
4048 <li class="itemize">vector <span | |
4049 class="cmtt-12">[vorbis_mapping_angle] </span>element <span | |
4050 class="cmtt-12">[j]</span>= read | |
4051 <a | |
4052 href="#x1-1170009.2.1">ilog</a>(<span | |
4053 class="cmtt-12">[audio_channels] </span>- 1) bits as unsigned integer | |
4054 </li> | |
4055 | |
4056 | |
4057 | |
4058 <li class="itemize">the numbers read in the above two steps are channel numbers | |
4059 representing the channel to treat as magnitude and the channel | |
4060 to treat as angle, respectively. If for any coupling step the | |
4061 angle channel number equals the magnitude channel number, the | |
4062 magnitude channel number is greater than <span | |
4063 class="cmtt-12">[audio_channels]</span>-1, or | |
4064 the angle channel is greater than <span | |
4065 class="cmtt-12">[audio_channels]</span>-1, the stream | |
4066 is undecodable.</li></ul> | |
4067 </li></ul> | |
4068 </dd><dt class="enumerate-enumitem"> | |
4069 B. </dt><dd | |
4070 class="enumerate-enumitem">if unset, <span | |
4071 class="cmtt-12">[vorbis_mapping_coupling_steps] </span>= 0</dd></dl> | |
4072 </dd><dt class="enumerate-enumitem"> | |
4073 iii. </dt><dd | |
4074 class="enumerate-enumitem">read 2 bits (reserved field); if the value is nonzero, the stream is undecodable | |
4075 </dd><dt class="enumerate-enumitem"> | |
4076 iv. </dt><dd | |
4077 class="enumerate-enumitem">if <span | |
4078 class="cmtt-12">[vorbis_mapping_submaps] </span>is greater than one, we read channel multiplex | |
4079 settings. For each <span | |
4080 class="cmtt-12">[j] </span>of <span | |
4081 class="cmtt-12">[audio_channels] </span>channels: | |
4082 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4083 A. </dt><dd | |
4084 class="enumerate-enumitem">vector <span | |
4085 class="cmtt-12">[vorbis_mapping_mux] </span>element <span | |
4086 class="cmtt-12">[j] </span>= read 4 bits as unsigned | |
4087 integer | |
4088 </dd><dt class="enumerate-enumitem"> | |
4089 B. </dt><dd | |
4090 class="enumerate-enumitem">if the value is greater than the highest numbered submap | |
4091 (<span | |
4092 class="cmtt-12">[vorbis_mapping_submaps] </span>- 1), this in an error condition rendering | |
4093 the stream undecodable</dd></dl> | |
4094 </dd><dt class="enumerate-enumitem"> | |
4095 v. </dt><dd | |
4096 class="enumerate-enumitem">for each submap <span | |
4097 class="cmtt-12">[j] </span>of <span | |
4098 class="cmtt-12">[vorbis_mapping_submaps] </span>submaps, read the floor and | |
4099 residue numbers for use in decoding that submap: | |
4100 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4101 A. </dt><dd | |
4102 class="enumerate-enumitem">read and discard 8 bits (the unused time configuration placeholder) | |
4103 </dd><dt class="enumerate-enumitem"> | |
4104 B. </dt><dd | |
4105 class="enumerate-enumitem">read 8 bits as unsigned integer for the floor number; save in vector | |
4106 <span | |
4107 class="cmtt-12">[vorbis_mapping_submap_floor] </span>element <span | |
4108 class="cmtt-12">[j]</span> | |
4109 </dd><dt class="enumerate-enumitem"> | |
4110 C. </dt><dd | |
4111 class="enumerate-enumitem">verify the floor number is not greater than the highest number floor | |
4112 configured for the bitstream. If it is, the bitstream is undecodable | |
4113 </dd><dt class="enumerate-enumitem"> | |
4114 D. </dt><dd | |
4115 class="enumerate-enumitem">read 8 bits as unsigned integer for the residue number; save in vector | |
4116 <span | |
4117 class="cmtt-12">[vorbis_mapping_submap_residue] </span>element <span | |
4118 class="cmtt-12">[j]</span> | |
4119 | |
4120 | |
4121 | |
4122 </dd><dt class="enumerate-enumitem"> | |
4123 E. </dt><dd | |
4124 class="enumerate-enumitem">verify the residue number is not greater than the highest number residue | |
4125 configured for the bitstream. If it is, the bitstream is undecodable</dd></dl> | |
4126 </dd><dt class="enumerate-enumitem"> | |
4127 vi. </dt><dd | |
4128 class="enumerate-enumitem">save this mapping configuration in slot <span | |
4129 class="cmtt-12">[i] </span>of the mapping configuration array | |
4130 <span | |
4131 class="cmtt-12">[vorbis_mapping_configurations]</span>.</dd></dl> | |
4132 </dd></dl> | |
4133 </dd></dl> | |
4134 <!--l. 247--><p class="noindent" ><span class="paragraphHead"><a | |
4135 id="x1-700004.2.4"></a><span | |
4136 class="cmbx-12">Modes</span></span> | |
4137 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4138 1. </dt><dd | |
4139 class="enumerate-enumitem"><span | |
4140 class="cmtt-12">[vorbis_mode_count] </span>= read 6 bits as unsigned integer and add one | |
4141 </dd><dt class="enumerate-enumitem"> | |
4142 2. </dt><dd | |
4143 class="enumerate-enumitem">For each of <span | |
4144 class="cmtt-12">[vorbis_mode_count] </span>mode numbers: | |
4145 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4146 a) </dt><dd | |
4147 class="enumerate-enumitem"><span | |
4148 class="cmtt-12">[vorbis_mode_blockflag] </span>= read 1 bit | |
4149 </dd><dt class="enumerate-enumitem"> | |
4150 b) </dt><dd | |
4151 class="enumerate-enumitem"><span | |
4152 class="cmtt-12">[vorbis_mode_windowtype] </span>= read 16 bits as unsigned integer | |
4153 </dd><dt class="enumerate-enumitem"> | |
4154 c) </dt><dd | |
4155 class="enumerate-enumitem"><span | |
4156 class="cmtt-12">[vorbis_mode_transformtype] </span>= read 16 bits as unsigned integer | |
4157 </dd><dt class="enumerate-enumitem"> | |
4158 d) </dt><dd | |
4159 class="enumerate-enumitem"><span | |
4160 class="cmtt-12">[vorbis_mode_mapping] </span>= read 8 bits as unsigned integer | |
4161 </dd><dt class="enumerate-enumitem"> | |
4162 e) </dt><dd | |
4163 class="enumerate-enumitem">verify ranges; zero is the only legal value in | |
4164 Vorbis I for <span | |
4165 class="cmtt-12">[vorbis_mode_windowtype] </span>and <span | |
4166 class="cmtt-12">[vorbis_mode_transformtype]</span>. | |
4167 <span | |
4168 class="cmtt-12">[vorbis_mode_mapping] </span>must not be greater than the highest number mapping | |
4169 in use. Any illegal values render the stream undecodable. | |
4170 </dd><dt class="enumerate-enumitem"> | |
4171 f) </dt><dd | |
4172 class="enumerate-enumitem">save this mode configuration in slot <span | |
4173 class="cmtt-12">[i] </span>of the mode configuration array | |
4174 <span | |
4175 class="cmtt-12">[vorbis_mode_configurations]</span>.</dd></dl> | |
4176 </dd><dt class="enumerate-enumitem"> | |
4177 3. </dt><dd | |
4178 class="enumerate-enumitem">read 1 bit as a framing flag. If unset, a framing error occurred and the stream is not | |
4179 decodable.</dd></dl> | |
4180 | |
4181 | |
4182 | |
4183 <!--l. 268--><p class="noindent" >After reading mode descriptions, setup header decode is complete. | |
4184 <!--l. 277--><p class="noindent" > | |
4185 <h4 class="subsectionHead"><span class="titlemark">4.3. </span> <a | |
4186 id="x1-710004.3"></a>Audio packet decode and synthesis</h4> | |
4187 <!--l. 279--><p class="noindent" >Following the three header packets, all packets in a Vorbis I stream are audio. The first step of | |
4188 audio packet decode is to read and verify the packet type. <span | |
4189 class="cmti-12">A non-audio packet when audio is</span> | |
4190 <span | |
4191 class="cmti-12">expected indicates stream corruption or a non-compliant stream. The decoder must ignore the</span> | |
4192 <span | |
4193 class="cmti-12">packet and not attempt decoding it to audio</span>. | |
4194 <!--l. 286--><p class="noindent" > | |
4195 <h5 class="subsubsectionHead"><span class="titlemark">4.3.1. </span> <a | |
4196 id="x1-720004.3.1"></a>packet type, mode and window decode</h5> | |
4197 <!--l. 289--><p class="noindent" > | |
4198 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4199 1. </dt><dd | |
4200 class="enumerate-enumitem">read 1 bit <span | |
4201 class="cmtt-12">[packet_type]</span>; check that packet type is 0 (audio) | |
4202 </dd><dt class="enumerate-enumitem"> | |
4203 2. </dt><dd | |
4204 class="enumerate-enumitem">read <a | |
4205 href="#x1-1170009.2.1">ilog</a>([vorbis_mode_count]-1) bits <span | |
4206 class="cmtt-12">[mode_number]</span> | |
4207 </dd><dt class="enumerate-enumitem"> | |
4208 3. </dt><dd | |
4209 class="enumerate-enumitem">decode blocksize <span | |
4210 class="cmtt-12">[n] </span>is equal to <span | |
4211 class="cmtt-12">[blocksize_0] </span>if <span | |
4212 class="cmtt-12">[vorbis_mode_blockflag] </span>is 0, | |
4213 else <span | |
4214 class="cmtt-12">[n] </span>is equal to <span | |
4215 class="cmtt-12">[blocksize_1]</span>. | |
4216 </dd><dt class="enumerate-enumitem"> | |
4217 4. </dt><dd | |
4218 class="enumerate-enumitem">perform window selection and setup; this window is used later by the inverse | |
4219 MDCT: | |
4220 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4221 a) </dt><dd | |
4222 class="enumerate-enumitem">if this is a long window (the <span | |
4223 class="cmtt-12">[vorbis_mode_blockflag] </span>flag of this mode is | |
4224 set): | |
4225 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4226 i. </dt><dd | |
4227 class="enumerate-enumitem">read 1 bit for <span | |
4228 class="cmtt-12">[previous_window_flag]</span> | |
4229 </dd><dt class="enumerate-enumitem"> | |
4230 ii. </dt><dd | |
4231 class="enumerate-enumitem">read 1 bit for <span | |
4232 class="cmtt-12">[next_window_flag]</span> | |
4233 | |
4234 | |
4235 | |
4236 </dd><dt class="enumerate-enumitem"> | |
4237 iii. </dt><dd | |
4238 class="enumerate-enumitem">if <span | |
4239 class="cmtt-12">[previous_window_flag] </span>is not set, the left half of the window will | |
4240 be a hybrid window for lapping with a short block. See <a | |
4241 href="#paragraph.1" >paragraph <a | |
4242 href="#x1-260001.3.2">1.3.2</a></a>, | |
4243 “<a | |
4244 href="#x1-260001.3.2">Window shape decode (long windows only)<!--tex4ht:ref: vorbis:spec:window --></a>” for an illustration of | |
4245 overlapping dissimilar windows. Else, the left half window will have normal | |
4246 long shape. | |
4247 </dd><dt class="enumerate-enumitem"> | |
4248 iv. </dt><dd | |
4249 class="enumerate-enumitem">if <span | |
4250 class="cmtt-12">[next_window_flag] </span>is not set, the right half of the window will be | |
4251 a hybrid window for lapping with a short block. See <a | |
4252 href="#x1-260001.3.2">paragraph 1.3.2</a>, | |
4253 “<a | |
4254 href="#x1-260001.3.2">Window shape decode (long windows only)<!--tex4ht:ref: vorbis:spec:window --></a>” for an illustration of | |
4255 overlapping dissimilar windows. Else, the left right window will have normal | |
4256 long shape.</dd></dl> | |
4257 </dd><dt class="enumerate-enumitem"> | |
4258 b) </dt><dd | |
4259 class="enumerate-enumitem">if this is a short window, the window is always the same short-window | |
4260 shape.</dd></dl> | |
4261 </dd></dl> | |
4262 <!--l. 321--><p class="noindent" >Vorbis windows all use the slope function <span | |
4263 class="cmmi-12">y </span>= sin(<img | |
4264 src="Vorbis_I_spec1x.png" alt="π2" class="frac" align="middle"> <span | |
4265 class="cmsy-10x-x-120">∗</span> sin <sup><span | |
4266 class="cmr-8">2</span></sup>((<span | |
4267 class="cmmi-12">x </span>+ 0<span | |
4268 class="cmmi-12">.</span>5)<span | |
4269 class="cmmi-12">∕n </span><span | |
4270 class="cmsy-10x-x-120">∗ </span><span | |
4271 class="cmmi-12">π</span>)), where <span | |
4272 class="cmmi-12">n </span>is window | |
4273 size and <span | |
4274 class="cmmi-12">x </span>ranges 0<span | |
4275 class="cmmi-12">…</span><span | |
4276 class="cmmi-12">n</span><span | |
4277 class="cmsy-10x-x-120">− </span>1, but dissimilar lapping requirements can affect overall shape. Window | |
4278 generation proceeds as follows: | |
4279 <!--l. 327--><p class="noindent" > | |
4280 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4281 1. </dt><dd | |
4282 class="enumerate-enumitem"><span | |
4283 class="cmtt-12">[window_center] </span>= <span | |
4284 class="cmtt-12">[n] </span>/ 2 | |
4285 </dd><dt class="enumerate-enumitem"> | |
4286 2. </dt><dd | |
4287 class="enumerate-enumitem">if (<span | |
4288 class="cmtt-12">[vorbis_mode_blockflag] </span>is set and <span | |
4289 class="cmtt-12">[previous_window_flag] </span>is not set) | |
4290 then | |
4291 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4292 a) </dt><dd | |
4293 class="enumerate-enumitem"><span | |
4294 class="cmtt-12">[left_window_start] </span>= <span | |
4295 class="cmtt-12">[n]</span>/4 - <span | |
4296 class="cmtt-12">[blocksize_0]</span>/4 | |
4297 </dd><dt class="enumerate-enumitem"> | |
4298 b) </dt><dd | |
4299 class="enumerate-enumitem"><span | |
4300 class="cmtt-12">[left_window_end] </span>= <span | |
4301 class="cmtt-12">[n]</span>/4 + <span | |
4302 class="cmtt-12">[blocksize_0]</span>/4 | |
4303 </dd><dt class="enumerate-enumitem"> | |
4304 c) </dt><dd | |
4305 class="enumerate-enumitem"><span | |
4306 class="cmtt-12">[left_n] </span>= <span | |
4307 class="cmtt-12">[blocksize_0]</span>/2</dd></dl> | |
4308 <!--l. 336--><p class="noindent" >else | |
4309 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4310 a) </dt><dd | |
4311 class="enumerate-enumitem"><span | |
4312 class="cmtt-12">[left_window_start] </span>= 0 | |
4313 </dd><dt class="enumerate-enumitem"> | |
4314 b) </dt><dd | |
4315 class="enumerate-enumitem"><span | |
4316 class="cmtt-12">[left_window_end] </span>= <span | |
4317 class="cmtt-12">[window_center]</span> | |
4318 | |
4319 | |
4320 | |
4321 </dd><dt class="enumerate-enumitem"> | |
4322 c) </dt><dd | |
4323 class="enumerate-enumitem"><span | |
4324 class="cmtt-12">[left_n] </span>= <span | |
4325 class="cmtt-12">[n]</span>/2</dd></dl> | |
4326 </dd><dt class="enumerate-enumitem"> | |
4327 3. </dt><dd | |
4328 class="enumerate-enumitem">if (<span | |
4329 class="cmtt-12">[vorbis_mode_blockflag] </span>is set and <span | |
4330 class="cmtt-12">[next_window_flag] </span>is not set) then | |
4331 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4332 a) </dt><dd | |
4333 class="enumerate-enumitem"><span | |
4334 class="cmtt-12">[right_window_start] </span>= <span | |
4335 class="cmtt-12">[n]*3</span>/4 - <span | |
4336 class="cmtt-12">[blocksize_0]</span>/4 | |
4337 </dd><dt class="enumerate-enumitem"> | |
4338 b) </dt><dd | |
4339 class="enumerate-enumitem"><span | |
4340 class="cmtt-12">[right_window_end] </span>= <span | |
4341 class="cmtt-12">[n]*3</span>/4 + <span | |
4342 class="cmtt-12">[blocksize_0]</span>/4 | |
4343 </dd><dt class="enumerate-enumitem"> | |
4344 c) </dt><dd | |
4345 class="enumerate-enumitem"><span | |
4346 class="cmtt-12">[right_n] </span>= <span | |
4347 class="cmtt-12">[blocksize_0]</span>/2</dd></dl> | |
4348 <!--l. 352--><p class="noindent" >else | |
4349 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4350 a) </dt><dd | |
4351 class="enumerate-enumitem"><span | |
4352 class="cmtt-12">[right_window_start] </span>= <span | |
4353 class="cmtt-12">[window_center]</span> | |
4354 </dd><dt class="enumerate-enumitem"> | |
4355 b) </dt><dd | |
4356 class="enumerate-enumitem"><span | |
4357 class="cmtt-12">[right_window_end] </span>= <span | |
4358 class="cmtt-12">[n]</span> | |
4359 </dd><dt class="enumerate-enumitem"> | |
4360 c) </dt><dd | |
4361 class="enumerate-enumitem"><span | |
4362 class="cmtt-12">[right_n] </span>= <span | |
4363 class="cmtt-12">[n]</span>/2</dd></dl> | |
4364 </dd><dt class="enumerate-enumitem"> | |
4365 4. </dt><dd | |
4366 class="enumerate-enumitem">window from range 0 ... <span | |
4367 class="cmtt-12">[left_window_start]</span>-1 inclusive is zero | |
4368 </dd><dt class="enumerate-enumitem"> | |
4369 5. </dt><dd | |
4370 class="enumerate-enumitem">for <span | |
4371 class="cmtt-12">[i] </span>in range <span | |
4372 class="cmtt-12">[left_window_start] </span>... <span | |
4373 class="cmtt-12">[left_window_end]</span>-1, window(<span | |
4374 class="cmtt-12">[i]</span>) = | |
4375 sin(<img | |
4376 src="Vorbis_I_spec2x.png" alt="π | |
4377 2" class="frac" align="middle"> <span | |
4378 class="cmsy-10x-x-120">∗</span> sin <sup><span | |
4379 class="cmr-8">2</span></sup>( (<span | |
4380 class="cmtt-12">[i]</span>-<span | |
4381 class="cmtt-12">[left_window_start]</span>+0.5) / <span | |
4382 class="cmtt-12">[left_n] </span><span | |
4383 class="cmsy-10x-x-120">∗</span><img | |
4384 src="Vorbis_I_spec3x.png" alt="π | |
4385 2" class="frac" align="middle">) ) | |
4386 </dd><dt class="enumerate-enumitem"> | |
4387 6. </dt><dd | |
4388 class="enumerate-enumitem">window from range <span | |
4389 class="cmtt-12">[left_window_end] </span>... <span | |
4390 class="cmtt-12">[right_window_start]</span>-1 inclusive is | |
4391 one | |
4392 </dd><dt class="enumerate-enumitem"> | |
4393 7. </dt><dd | |
4394 class="enumerate-enumitem">for <span | |
4395 class="cmtt-12">[i] </span>in range <span | |
4396 class="cmtt-12">[right_window_start] </span>... <span | |
4397 class="cmtt-12">[right_window_end]</span>-1, window(<span | |
4398 class="cmtt-12">[i]</span>) = | |
4399 sin(<img | |
4400 src="Vorbis_I_spec4x.png" alt="π | |
4401 2" class="frac" align="middle"> <span | |
4402 class="cmsy-10x-x-120">∗</span> sin <sup><span | |
4403 class="cmr-8">2</span></sup>( (<span | |
4404 class="cmtt-12">[i]</span>-<span | |
4405 class="cmtt-12">[right_window_start]</span>+0.5) / <span | |
4406 class="cmtt-12">[right_n] </span><span | |
4407 class="cmsy-10x-x-120">∗</span><img | |
4408 src="Vorbis_I_spec5x.png" alt="π | |
4409 2" class="frac" align="middle"> + <img | |
4410 src="Vorbis_I_spec6x.png" alt="π | |
4411 2" class="frac" align="middle">) ) | |
4412 </dd><dt class="enumerate-enumitem"> | |
4413 8. </dt><dd | |
4414 class="enumerate-enumitem">window from range <span | |
4415 class="cmtt-12">[right_window_start] </span>... <span | |
4416 class="cmtt-12">[n]</span>-1 is zero</dd></dl> | |
4417 <!--l. 368--><p class="noindent" >An end-of-packet condition up to this point should be considered an error that discards this | |
4418 packet from the stream. An end of packet condition past this point is to be considered a possible | |
4419 nominal occurrence. | |
4420 | |
4421 | |
4422 | |
4423 <!--l. 375--><p class="noindent" > | |
4424 <h5 class="subsubsectionHead"><span class="titlemark">4.3.2. </span> <a | |
4425 id="x1-730004.3.2"></a>floor curve decode</h5> | |
4426 <!--l. 377--><p class="noindent" >From this point on, we assume out decode context is using mode number <span | |
4427 class="cmtt-12">[mode_number]</span> | |
4428 from configuration array <span | |
4429 class="cmtt-12">[vorbis_mode_configurations] </span>and the map number | |
4430 <span | |
4431 class="cmtt-12">[vorbis_mode_mapping] </span>(specified by the current mode) taken from the mapping configuration | |
4432 array <span | |
4433 class="cmtt-12">[vorbis_mapping_configurations]</span>. | |
4434 <!--l. 384--><p class="noindent" >Floor curves are decoded one-by-one in channel order. | |
4435 <!--l. 386--><p class="noindent" >For each floor <span | |
4436 class="cmtt-12">[i] </span>of <span | |
4437 class="cmtt-12">[audio_channels]</span> | |
4438 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4439 1. </dt><dd | |
4440 class="enumerate-enumitem"><span | |
4441 class="cmtt-12">[submap_number] </span>= element <span | |
4442 class="cmtt-12">[i] </span>of vector [vorbis_mapping_mux] | |
4443 </dd><dt class="enumerate-enumitem"> | |
4444 2. </dt><dd | |
4445 class="enumerate-enumitem"><span | |
4446 class="cmtt-12">[floor_number] </span>= element <span | |
4447 class="cmtt-12">[submap_number] </span>of vector [vorbis_submap_floor] | |
4448 </dd><dt class="enumerate-enumitem"> | |
4449 3. </dt><dd | |
4450 class="enumerate-enumitem">if the floor type of this floor (vector | |
4451 <span | |
4452 class="cmtt-12">[vorbis_floor_types] </span>element <span | |
4453 class="cmtt-12">[floor_number]</span>) is zero then decode the floor for | |
4454 channel <span | |
4455 class="cmtt-12">[i] </span>according to the <a | |
4456 href="#x1-930006.2.2">subsubsection 6.2.2</a>, “<a | |
4457 href="#x1-930006.2.2">packet decode<!--tex4ht:ref: vorbis:spec:floor0-decode --></a>” | |
4458 </dd><dt class="enumerate-enumitem"> | |
4459 4. </dt><dd | |
4460 class="enumerate-enumitem">if the type of this floor is one then decode the floor for channel <span | |
4461 class="cmtt-12">[i] </span>according to the | |
4462 <a | |
4463 href="#x1-1000007.2.3">subsubsection 7.2.3</a>, “<a | |
4464 href="#x1-1000007.2.3">packet decode<!--tex4ht:ref: vorbis:spec:floor1-decode --></a>” | |
4465 </dd><dt class="enumerate-enumitem"> | |
4466 5. </dt><dd | |
4467 class="enumerate-enumitem">save the needed decoded floor information for channel for later synthesis | |
4468 </dd><dt class="enumerate-enumitem"> | |
4469 6. </dt><dd | |
4470 class="enumerate-enumitem">if the decoded floor returned ’unused’, set vector <span | |
4471 class="cmtt-12">[no_residue] </span>element <span | |
4472 class="cmtt-12">[i] </span>to true, | |
4473 else set vector <span | |
4474 class="cmtt-12">[no_residue] </span>element <span | |
4475 class="cmtt-12">[i] </span>to false</dd></dl> | |
4476 <!--l. 406--><p class="noindent" >An end-of-packet condition during floor decode shall result in packet decode zeroing all channel | |
4477 output vectors and skipping to the add/overlap output stage. | |
4478 <!--l. 412--><p class="noindent" > | |
4479 <h5 class="subsubsectionHead"><span class="titlemark">4.3.3. </span> <a | |
4480 id="x1-740004.3.3"></a>nonzero vector propagate</h5> | |
4481 <!--l. 414--><p class="noindent" >A possible result of floor decode is that a specific vector is marked ’unused’ which indicates that | |
4482 that final output vector is all-zero values (and the floor is zero). The residue for that vector is not | |
4483 coded in the stream, save for one complication. If some vectors are used and some are not, | |
4484 | |
4485 | |
4486 | |
4487 channel coupling could result in mixing a zeroed and nonzeroed vector to produce two nonzeroed | |
4488 vectors. | |
4489 <!--l. 421--><p class="noindent" >for each <span | |
4490 class="cmtt-12">[i] </span>from 0 ... <span | |
4491 class="cmtt-12">[vorbis_mapping_coupling_steps]</span>-1 | |
4492 <!--l. 424--><p class="noindent" > | |
4493 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4494 1. </dt><dd | |
4495 class="enumerate-enumitem">if either <span | |
4496 class="cmtt-12">[no_residue] </span>entry for channel (<span | |
4497 class="cmtt-12">[vorbis_mapping_magnitude] </span>element | |
4498 <span | |
4499 class="cmtt-12">[i]</span>) or channel (<span | |
4500 class="cmtt-12">[vorbis_mapping_angle] </span>element <span | |
4501 class="cmtt-12">[i]</span>) are set to false, then both | |
4502 must be set to false. Note that an ’unused’ floor has no decoded floor information; it | |
4503 is important that this is remembered at floor curve synthesis time.</dd></dl> | |
4504 <!--l. 436--><p class="noindent" > | |
4505 <h5 class="subsubsectionHead"><span class="titlemark">4.3.4. </span> <a | |
4506 id="x1-750004.3.4"></a>residue decode</h5> | |
4507 <!--l. 438--><p class="noindent" >Unlike floors, which are decoded in channel order, the residue vectors are decoded in submap | |
4508 order. | |
4509 <!--l. 441--><p class="noindent" >for each submap <span | |
4510 class="cmtt-12">[i] </span>in order from 0 ... <span | |
4511 class="cmtt-12">[vorbis_mapping_submaps]</span>-1 | |
4512 <!--l. 444--><p class="noindent" > | |
4513 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4514 1. </dt><dd | |
4515 class="enumerate-enumitem"><span | |
4516 class="cmtt-12">[ch] </span>= 0 | |
4517 </dd><dt class="enumerate-enumitem"> | |
4518 2. </dt><dd | |
4519 class="enumerate-enumitem">for each channel <span | |
4520 class="cmtt-12">[j] </span>in order from 0 ... <span | |
4521 class="cmtt-12">[audio_channels] </span>- 1 | |
4522 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4523 a) </dt><dd | |
4524 class="enumerate-enumitem">if channel <span | |
4525 class="cmtt-12">[j] </span>in submap <span | |
4526 class="cmtt-12">[i] </span>(vector <span | |
4527 class="cmtt-12">[vorbis_mapping_mux] </span>element <span | |
4528 class="cmtt-12">[j] </span>is equal to | |
4529 <span | |
4530 class="cmtt-12">[i]</span>) | |
4531 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4532 i. </dt><dd | |
4533 class="enumerate-enumitem">if vector <span | |
4534 class="cmtt-12">[no_residue] </span>element <span | |
4535 class="cmtt-12">[j] </span>is true | |
4536 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4537 A. </dt><dd | |
4538 class="enumerate-enumitem">vector <span | |
4539 class="cmtt-12">[do_not_decode_flag] </span>element <span | |
4540 class="cmtt-12">[ch] </span>is set</dd></dl> | |
4541 <!--l. 453--><p class="noindent" >else | |
4542 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4543 A. </dt><dd | |
4544 class="enumerate-enumitem">vector <span | |
4545 class="cmtt-12">[do_not_decode_flag] </span>element <span | |
4546 class="cmtt-12">[ch] </span>is unset</dd></dl> | |
4547 </dd><dt class="enumerate-enumitem"> | |
4548 ii. </dt><dd | |
4549 class="enumerate-enumitem">increment <span | |
4550 class="cmtt-12">[ch]</span></dd></dl> | |
4551 | |
4552 | |
4553 | |
4554 </dd></dl> | |
4555 </dd><dt class="enumerate-enumitem"> | |
4556 3. </dt><dd | |
4557 class="enumerate-enumitem"><span | |
4558 class="cmtt-12">[residue_number] </span>= vector <span | |
4559 class="cmtt-12">[vorbis_mapping_submap_residue] </span>element <span | |
4560 class="cmtt-12">[i]</span> | |
4561 </dd><dt class="enumerate-enumitem"> | |
4562 4. </dt><dd | |
4563 class="enumerate-enumitem"><span | |
4564 class="cmtt-12">[residue_type] </span>= vector <span | |
4565 class="cmtt-12">[vorbis_residue_types] </span>element <span | |
4566 class="cmtt-12">[residue_number]</span> | |
4567 </dd><dt class="enumerate-enumitem"> | |
4568 5. </dt><dd | |
4569 class="enumerate-enumitem">decode <span | |
4570 class="cmtt-12">[ch] </span>vectors using residue <span | |
4571 class="cmtt-12">[residue_number]</span>, according to type <span | |
4572 class="cmtt-12">[residue_type]</span>, | |
4573 also passing vector <span | |
4574 class="cmtt-12">[do_not_decode_flag] </span>to indicate which vectors in the bundle should | |
4575 not be decoded. Correct per-vector decode length is <span | |
4576 class="cmtt-12">[n]</span>/2. | |
4577 </dd><dt class="enumerate-enumitem"> | |
4578 6. </dt><dd | |
4579 class="enumerate-enumitem"><span | |
4580 class="cmtt-12">[ch] </span>= 0 | |
4581 </dd><dt class="enumerate-enumitem"> | |
4582 7. </dt><dd | |
4583 class="enumerate-enumitem">for each channel <span | |
4584 class="cmtt-12">[j] </span>in order from 0 ... <span | |
4585 class="cmtt-12">[audio_channels]</span> | |
4586 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4587 a) </dt><dd | |
4588 class="enumerate-enumitem">if channel <span | |
4589 class="cmtt-12">[j] </span>is in submap <span | |
4590 class="cmtt-12">[i] </span>(vector <span | |
4591 class="cmtt-12">[vorbis_mapping_mux] </span>element <span | |
4592 class="cmtt-12">[j] </span>is equal | |
4593 to <span | |
4594 class="cmtt-12">[i]</span>) | |
4595 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4596 i. </dt><dd | |
4597 class="enumerate-enumitem">residue vector for channel <span | |
4598 class="cmtt-12">[j] </span>is set to decoded residue vector <span | |
4599 class="cmtt-12">[ch]</span> | |
4600 </dd><dt class="enumerate-enumitem"> | |
4601 ii. </dt><dd | |
4602 class="enumerate-enumitem">increment <span | |
4603 class="cmtt-12">[ch]</span></dd></dl> | |
4604 </dd></dl> | |
4605 </dd></dl> | |
4606 <!--l. 480--><p class="noindent" > | |
4607 <h5 class="subsubsectionHead"><span class="titlemark">4.3.5. </span> <a | |
4608 id="x1-760004.3.5"></a>inverse coupling</h5> | |
4609 <!--l. 482--><p class="noindent" >for each <span | |
4610 class="cmtt-12">[i] </span>from <span | |
4611 class="cmtt-12">[vorbis_mapping_coupling_steps]</span>-1 descending to 0 | |
4612 <!--l. 485--><p class="noindent" > | |
4613 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4614 1. </dt><dd | |
4615 class="enumerate-enumitem"><span | |
4616 class="cmtt-12">[magnitude_vector] </span>= the residue vector for channel (vector | |
4617 <span | |
4618 class="cmtt-12">[vorbis_mapping_magnitude] </span>element <span | |
4619 class="cmtt-12">[i]</span>) | |
4620 </dd><dt class="enumerate-enumitem"> | |
4621 2. </dt><dd | |
4622 class="enumerate-enumitem"><span | |
4623 class="cmtt-12">[angle_vector] </span>= the residue vector for channel (vector <span | |
4624 class="cmtt-12">[vorbis_mapping_angle]</span> | |
4625 | |
4626 | |
4627 | |
4628 element <span | |
4629 class="cmtt-12">[i]</span>) | |
4630 </dd><dt class="enumerate-enumitem"> | |
4631 3. </dt><dd | |
4632 class="enumerate-enumitem">for each scalar value <span | |
4633 class="cmtt-12">[M] </span>in vector <span | |
4634 class="cmtt-12">[magnitude_vector] </span>and the corresponding scalar value | |
4635 <span | |
4636 class="cmtt-12">[A] </span>in vector <span | |
4637 class="cmtt-12">[angle_vector]</span>: | |
4638 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4639 a) </dt><dd | |
4640 class="enumerate-enumitem">if (<span | |
4641 class="cmtt-12">[M] </span>is greater than zero) | |
4642 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4643 i. </dt><dd | |
4644 class="enumerate-enumitem">if (<span | |
4645 class="cmtt-12">[A] </span>is greater than zero) | |
4646 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4647 A. </dt><dd | |
4648 class="enumerate-enumitem"><span | |
4649 class="cmtt-12">[new_M] </span>= <span | |
4650 class="cmtt-12">[M]</span> | |
4651 </dd><dt class="enumerate-enumitem"> | |
4652 B. </dt><dd | |
4653 class="enumerate-enumitem"><span | |
4654 class="cmtt-12">[new_A] </span>= <span | |
4655 class="cmtt-12">[M]</span>-<span | |
4656 class="cmtt-12">[A]</span></dd></dl> | |
4657 <!--l. 498--><p class="noindent" >else | |
4658 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4659 A. </dt><dd | |
4660 class="enumerate-enumitem"><span | |
4661 class="cmtt-12">[new_A] </span>= <span | |
4662 class="cmtt-12">[M]</span> | |
4663 </dd><dt class="enumerate-enumitem"> | |
4664 B. </dt><dd | |
4665 class="enumerate-enumitem"><span | |
4666 class="cmtt-12">[new_M] </span>= <span | |
4667 class="cmtt-12">[M]</span>+<span | |
4668 class="cmtt-12">[A]</span></dd></dl> | |
4669 </dd></dl> | |
4670 <!--l. 505--><p class="noindent" >else | |
4671 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4672 i. </dt><dd | |
4673 class="enumerate-enumitem">if (<span | |
4674 class="cmtt-12">[A] </span>is greater than zero) | |
4675 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4676 A. </dt><dd | |
4677 class="enumerate-enumitem"><span | |
4678 class="cmtt-12">[new_M] </span>= <span | |
4679 class="cmtt-12">[M]</span> | |
4680 </dd><dt class="enumerate-enumitem"> | |
4681 B. </dt><dd | |
4682 class="enumerate-enumitem"><span | |
4683 class="cmtt-12">[new_A] </span>= <span | |
4684 class="cmtt-12">[M]</span>+<span | |
4685 class="cmtt-12">[A]</span></dd></dl> | |
4686 <!--l. 512--><p class="noindent" >else | |
4687 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
4688 A. </dt><dd | |
4689 class="enumerate-enumitem"><span | |
4690 class="cmtt-12">[new_A] </span>= <span | |
4691 class="cmtt-12">[M]</span> | |
4692 </dd><dt class="enumerate-enumitem"> | |
4693 B. </dt><dd | |
4694 class="enumerate-enumitem"><span | |
4695 class="cmtt-12">[new_M] </span>= <span | |
4696 class="cmtt-12">[M]</span>-<span | |
4697 class="cmtt-12">[A]</span></dd></dl> | |
4698 </dd></dl> | |
4699 </dd><dt class="enumerate-enumitem"> | |
4700 b) </dt><dd | |
4701 class="enumerate-enumitem">set scalar value <span | |
4702 class="cmtt-12">[M] </span>in vector <span | |
4703 class="cmtt-12">[magnitude_vector] </span>to <span | |
4704 class="cmtt-12">[new_M]</span> | |
4705 | |
4706 | |
4707 | |
4708 </dd><dt class="enumerate-enumitem"> | |
4709 c) </dt><dd | |
4710 class="enumerate-enumitem">set scalar value <span | |
4711 class="cmtt-12">[A] </span>in vector <span | |
4712 class="cmtt-12">[angle_vector] </span>to <span | |
4713 class="cmtt-12">[new_A]</span></dd></dl> | |
4714 </dd></dl> | |
4715 <!--l. 529--><p class="noindent" > | |
4716 <h5 class="subsubsectionHead"><span class="titlemark">4.3.6. </span> <a | |
4717 id="x1-770004.3.6"></a>dot product</h5> | |
4718 <!--l. 531--><p class="noindent" >For each channel, synthesize the floor curve from the decoded floor information, according to | |
4719 packet type. Note that the vector synthesis length for floor computation is <span | |
4720 class="cmtt-12">[n]</span>/2. | |
4721 <!--l. 535--><p class="noindent" >For each channel, multiply each element of the floor curve by each element of that | |
4722 channel’s residue vector. The result is the dot product of the floor and residue vectors for | |
4723 each channel; the produced vectors are the length <span | |
4724 class="cmtt-12">[n]</span>/2 audio spectrum for each | |
4725 channel. | |
4726 <!--l. 543--><p class="noindent" >One point is worth mentioning about this dot product; a common mistake in a fixed point | |
4727 implementation might be to assume that a 32 bit fixed-point representation for floor and | |
4728 residue and direct multiplication of the vectors is sufficient for acceptable spectral depth | |
4729 in all cases because it happens to mostly work with the current Xiph.Org reference | |
4730 encoder. | |
4731 <!--l. 550--><p class="noindent" >However, floor vector values can span <span | |
4732 class="cmsy-10x-x-120">∼</span>140dB (<span | |
4733 class="cmsy-10x-x-120">∼</span>24 bits unsigned), and the audio spectrum | |
4734 vector should represent a minimum of 120dB (<span | |
4735 class="cmsy-10x-x-120">∼</span>21 bits with sign), even when output is to a 16 | |
4736 bit PCM device. For the residue vector to represent full scale if the floor is nailed | |
4737 to <span | |
4738 class="cmsy-10x-x-120">−</span>140dB, it must be able to span 0 to +140dB. For the residue vector to reach | |
4739 full scale if the floor is nailed at 0dB, it must be able to represent <span | |
4740 class="cmsy-10x-x-120">−</span>140dB to +0dB. | |
4741 Thus, in order to handle full range dynamics, a residue vector may span <span | |
4742 class="cmsy-10x-x-120">−</span>140dB to | |
4743 +140dB entirely within spec. A 280dB range is approximately 48 bits with sign; thus the | |
4744 residue vector must be able to represent a 48 bit range and the dot product must | |
4745 be able to handle an effective 48 bit times 24 bit multiplication. This range may be | |
4746 achieved using large (64 bit or larger) integers, or implementing a movable binary point | |
4747 representation. | |
4748 <!--l. 567--><p class="noindent" > | |
4749 <h5 class="subsubsectionHead"><span class="titlemark">4.3.7. </span> <a | |
4750 id="x1-780004.3.7"></a>inverse MDCT</h5> | |
4751 <!--l. 569--><p class="noindent" >Convert the audio spectrum vector of each channel back into time domain PCM audio via an | |
4752 | |
4753 | |
4754 | |
4755 inverse Modified Discrete Cosine Transform (MDCT). A detailed description of the MDCT is | |
4756 available in <span class="cite">[<a | |
4757 href="#XSporer/Brandenburg/Edler">1</a>]</span>. The window function used for the MDCT is the function described | |
4758 earlier. | |
4759 <!--l. 576--><p class="noindent" > | |
4760 <h5 class="subsubsectionHead"><span class="titlemark">4.3.8. </span> <a | |
4761 id="x1-790004.3.8"></a>overlap_add</h5> | |
4762 <!--l. 578--><p class="noindent" >Windowed MDCT output is overlapped and added with the right hand data of the previous | |
4763 window such that the 3/4 point of the previous window is aligned with the 1/4 point of the | |
4764 current window (as illustrated in <a | |
4765 href="#x1-260001.3.2">paragraph 1.3.2</a>, “<a | |
4766 href="#x1-260001.3.2">Window shape decode (long windows | |
4767 only)<!--tex4ht:ref: vorbis:spec:window --></a>”). The overlapped portion produced from overlapping the previous and current frame data | |
4768 is finished data to be returned by the decoder. This data spans from the center of | |
4769 the previous window to the center of the current window. In the case of same-sized | |
4770 windows, the amount of data to return is one-half block consisting of and only of the | |
4771 overlapped portions. When overlapping a short and long window, much of the returned | |
4772 range does not actually overlap. This does not damage transform orthogonality. Pay | |
4773 attention however to returning the correct data range; the amount of data to be returned | |
4774 is: | |
4775 <!--l. 592--><p class="noindent" > | |
4776 <div class="fancyvrb" id="fancyvrb22"> | |
4777 <a | |
4778 id="x1-79002r1"></a><span | |
4779 class="cmr-6">1</span><span | |
4780 class="cmtt-8"> </span><span | |
4781 class="cmtt-8"> window\_blocksize(previous\_window)/4+window\_blocksize(current\_window)/4</span> | |
4782 </div> | |
4783 <!--l. 596--><p class="noindent" >from the center (element windowsize/2) of the previous window to the center (element | |
4784 windowsize/2-1, inclusive) of the current window. | |
4785 <!--l. 599--><p class="noindent" >Data is not returned from the first frame; it must be used to ’prime’ the decode engine. The | |
4786 encoder accounts for this priming when calculating PCM offsets; after the first frame, the proper | |
4787 PCM output offset is ’0’ (as no data has been returned yet). | |
4788 <!--l. 606--><p class="noindent" > | |
4789 <h5 class="subsubsectionHead"><span class="titlemark">4.3.9. </span> <a | |
4790 id="x1-800004.3.9"></a>output channel order</h5> | |
4791 <!--l. 608--><p class="noindent" >Vorbis I specifies only a channel mapping type 0. In mapping type 0, channel mapping is | |
4792 implicitly defined as follows for standard audio applications. As of revision 16781 (20100113), the | |
4793 specification adds defined channel locations for 6.1 and 7.1 surround. Ordering/location for | |
4794 | |
4795 | |
4796 | |
4797 greater-than-eight channels remains ’left to the implementation’. | |
4798 <!--l. 614--><p class="noindent" >These channel orderings refer to order within the encoded stream. It is naturally possible for a | |
4799 decoder to produce output with channels in any order. Any such decoder should explicitly | |
4800 document channel reordering behavior. | |
4801 <!--l. 620--><p class="noindent" > | |
4802 <dl class="description"><dt class="description"> | |
4803 <span | |
4804 class="cmssbx-10x-x-120">one channel</span> </dt><dd | |
4805 class="description">the stream is monophonic | |
4806 </dd><dt class="description"> | |
4807 <span | |
4808 class="cmssbx-10x-x-120">two channels</span> </dt><dd | |
4809 class="description">the stream is stereo. channel order: left, right | |
4810 </dd><dt class="description"> | |
4811 <span | |
4812 class="cmssbx-10x-x-120">three channels</span> </dt><dd | |
4813 class="description">the stream is a 1d-surround encoding. channel order: left, center, right | |
4814 </dd><dt class="description"> | |
4815 <span | |
4816 class="cmssbx-10x-x-120">four channels</span> </dt><dd | |
4817 class="description">the stream is quadraphonic surround. channel order: front left, front right, | |
4818 rear left, rear right | |
4819 </dd><dt class="description"> | |
4820 <span | |
4821 class="cmssbx-10x-x-120">five channels</span> </dt><dd | |
4822 class="description">the stream is five-channel surround. channel order: front left, center, front | |
4823 right, rear left, rear right | |
4824 </dd><dt class="description"> | |
4825 <span | |
4826 class="cmssbx-10x-x-120">six channels</span> </dt><dd | |
4827 class="description">the stream is 5.1 surround. channel order: front left, center, front right, rear | |
4828 left, rear right, LFE | |
4829 </dd><dt class="description"> | |
4830 <span | |
4831 class="cmssbx-10x-x-120">seven channels</span> </dt><dd | |
4832 class="description">the stream is 6.1 surround. channel order: front left, center, front right, | |
4833 side left, side right, rear center, LFE | |
4834 </dd><dt class="description"> | |
4835 <span | |
4836 class="cmssbx-10x-x-120">eight channels</span> </dt><dd | |
4837 class="description">the stream is 7.1 surround. channel order: front left, center, front right, | |
4838 side left, side right, rear left, rear right, LFE | |
4839 </dd><dt class="description"> | |
4840 <span | |
4841 class="cmssbx-10x-x-120">greater than eight channels</span> </dt><dd | |
4842 class="description">channel use and order is defined by the application | |
4843 </dd></dl> | |
4844 <!--l. 656--><p class="noindent" >Applications using Vorbis for dedicated purposes may define channel mapping as seen fit. Future | |
4845 channel mappings (such as three and four channel <a | |
4846 href="http://www.ambisonic.net/" >Ambisonics</a>) will make use of channel | |
4847 mappings other than mapping 0. | |
4848 | |
4849 | |
4850 | |
4851 | |
4852 | |
4853 | |
4854 <h3 class="sectionHead"><span class="titlemark">5. </span> <a | |
4855 id="x1-810005"></a>comment field and header specification</h3> | |
4856 <!--l. 6--><p class="noindent" > | |
4857 <h4 class="subsectionHead"><span class="titlemark">5.1. </span> <a | |
4858 id="x1-820005.1"></a>Overview</h4> | |
4859 <!--l. 8--><p class="noindent" >The Vorbis text comment header is the second (of three) header packets that begin a Vorbis | |
4860 bitstream. It is meant for short text comments, not arbitrary metadata; arbitrary metadata | |
4861 belongs in a separate logical bitstream (usually an XML stream type) that provides greater | |
4862 structure and machine parseability. | |
4863 <!--l. 14--><p class="noindent" >The comment field is meant to be used much like someone jotting a quick note on the bottom of | |
4864 a CDR. It should be a little information to remember the disc by and explain it to others; a | |
4865 short, to-the-point text note that need not only be a couple words, but isn’t going to be more | |
4866 than a short paragraph. The essentials, in other words, whatever they turn out to be, | |
4867 eg: | |
4868 <!--l. 21--><p class="noindent" > | |
4869 <div class="quote"> | |
4870 <!--l. 22--><p class="noindent" >Honest Bob and the Factory-to-Dealer-Incentives, <span | |
4871 class="cmti-12">“I’m Still Around”</span>, opening | |
4872 for Moxy Früvous, 1997.</div> | |
4873 <!--l. 29--><p class="noindent" > | |
4874 <h4 class="subsectionHead"><span class="titlemark">5.2. </span> <a | |
4875 id="x1-830005.2"></a>Comment encoding</h4> | |
4876 <!--l. 31--><p class="noindent" > | |
4877 <h5 class="subsubsectionHead"><span class="titlemark">5.2.1. </span> <a | |
4878 id="x1-840005.2.1"></a>Structure</h5> | |
4879 <!--l. 33--><p class="noindent" >The comment header is logically a list of eight-bit-clean vectors; the number of vectors is | |
4880 bounded to 2<sup><span | |
4881 class="cmr-8">32</span></sup> <span | |
4882 class="cmsy-10x-x-120">− </span>1 and the length of each vector is limited to 2<sup><span | |
4883 class="cmr-8">32</span></sup> <span | |
4884 class="cmsy-10x-x-120">− </span>1 bytes. The vector length is | |
4885 | |
4886 | |
4887 | |
4888 encoded; the vector contents themselves are not null terminated. In addition to the vector list, | |
4889 there is a single vector for vendor name (also 8 bit clean, length encoded in 32 bits). For | |
4890 example, the 1.0 release of libvorbis set the vendor string to “Xiph.Org libVorbis I | |
4891 20020717”. | |
4892 <!--l. 41--><p class="noindent" >The vector lengths and number of vectors are stored lsb first, according to the bit | |
4893 packing conventions of the vorbis codec. However, since data in the comment header | |
4894 is octet-aligned, they can simply be read as unaligned 32 bit little endian unsigned | |
4895 integers. | |
4896 <!--l. 46--><p class="noindent" >The comment header is decoded as follows: | |
4897 <!--l. 48--><p class="noindent" > | |
4898 <div class="fancyvrb" id="fancyvrb23"> | |
4899 <a | |
4900 id="x1-84002r1"></a><span | |
4901 class="cmr-6">1</span><span | |
4902 class="cmtt-8"> </span><span | |
4903 class="cmtt-8"> </span><span | |
4904 class="cmtt-8"> </span><span | |
4905 class="cmtt-8"> 1)</span><span | |
4906 class="cmtt-8"> [vendor\_length]</span><span | |
4907 class="cmtt-8"> =</span><span | |
4908 class="cmtt-8"> read</span><span | |
4909 class="cmtt-8"> an</span><span | |
4910 class="cmtt-8"> unsigned</span><span | |
4911 class="cmtt-8"> integer</span><span | |
4912 class="cmtt-8"> of</span><span | |
4913 class="cmtt-8"> 32</span><span | |
4914 class="cmtt-8"> bits</span> | |
4915 <br class="fancyvrb" /><a | |
4916 id="x1-84004r2"></a><span | |
4917 class="cmr-6">2</span><span | |
4918 class="cmtt-8"> </span><span | |
4919 class="cmtt-8"> </span><span | |
4920 class="cmtt-8"> </span><span | |
4921 class="cmtt-8"> 2)</span><span | |
4922 class="cmtt-8"> [vendor\_string]</span><span | |
4923 class="cmtt-8"> =</span><span | |
4924 class="cmtt-8"> read</span><span | |
4925 class="cmtt-8"> a</span><span | |
4926 class="cmtt-8"> UTF-8</span><span | |
4927 class="cmtt-8"> vector</span><span | |
4928 class="cmtt-8"> as</span><span | |
4929 class="cmtt-8"> [vendor\_length]</span><span | |
4930 class="cmtt-8"> octets</span> | |
4931 <br class="fancyvrb" /><a | |
4932 id="x1-84006r3"></a><span | |
4933 class="cmr-6">3</span><span | |
4934 class="cmtt-8"> </span><span | |
4935 class="cmtt-8"> </span><span | |
4936 class="cmtt-8"> </span><span | |
4937 class="cmtt-8"> 3)</span><span | |
4938 class="cmtt-8"> [user\_comment\_list\_length]</span><span | |
4939 class="cmtt-8"> =</span><span | |
4940 class="cmtt-8"> read</span><span | |
4941 class="cmtt-8"> an</span><span | |
4942 class="cmtt-8"> unsigned</span><span | |
4943 class="cmtt-8"> integer</span><span | |
4944 class="cmtt-8"> of</span><span | |
4945 class="cmtt-8"> 32</span><span | |
4946 class="cmtt-8"> bits</span> | |
4947 <br class="fancyvrb" /><a | |
4948 id="x1-84008r4"></a><span | |
4949 class="cmr-6">4</span><span | |
4950 class="cmtt-8"> </span><span | |
4951 class="cmtt-8"> </span><span | |
4952 class="cmtt-8"> </span><span | |
4953 class="cmtt-8"> 4)</span><span | |
4954 class="cmtt-8"> iterate</span><span | |
4955 class="cmtt-8"> [user\_comment\_list\_length]</span><span | |
4956 class="cmtt-8"> times</span><span | |
4957 class="cmtt-8"> {</span> | |
4958 <br class="fancyvrb" /><a | |
4959 id="x1-84010r5"></a><span | |
4960 class="cmr-6">5</span><span | |
4961 class="cmtt-8"> </span><span | |
4962 class="cmtt-8"> </span><span | |
4963 class="cmtt-8"> </span><span | |
4964 class="cmtt-8"> </span><span | |
4965 class="cmtt-8"> </span><span | |
4966 class="cmtt-8"> </span><span | |
4967 class="cmtt-8"> </span><span | |
4968 class="cmtt-8"> </span><span | |
4969 class="cmtt-8"> 5)</span><span | |
4970 class="cmtt-8"> [length]</span><span | |
4971 class="cmtt-8"> =</span><span | |
4972 class="cmtt-8"> read</span><span | |
4973 class="cmtt-8"> an</span><span | |
4974 class="cmtt-8"> unsigned</span><span | |
4975 class="cmtt-8"> integer</span><span | |
4976 class="cmtt-8"> of</span><span | |
4977 class="cmtt-8"> 32</span><span | |
4978 class="cmtt-8"> bits</span> | |
4979 <br class="fancyvrb" /><a | |
4980 id="x1-84012r6"></a><span | |
4981 class="cmr-6">6</span><span | |
4982 class="cmtt-8"> </span><span | |
4983 class="cmtt-8"> </span><span | |
4984 class="cmtt-8"> </span><span | |
4985 class="cmtt-8"> </span><span | |
4986 class="cmtt-8"> </span><span | |
4987 class="cmtt-8"> </span><span | |
4988 class="cmtt-8"> </span><span | |
4989 class="cmtt-8"> </span><span | |
4990 class="cmtt-8"> 6)</span><span | |
4991 class="cmtt-8"> this</span><span | |
4992 class="cmtt-8"> iteration’s</span><span | |
4993 class="cmtt-8"> user</span><span | |
4994 class="cmtt-8"> comment</span><span | |
4995 class="cmtt-8"> =</span><span | |
4996 class="cmtt-8"> read</span><span | |
4997 class="cmtt-8"> a</span><span | |
4998 class="cmtt-8"> UTF-8</span><span | |
4999 class="cmtt-8"> vector</span><span | |
5000 class="cmtt-8"> as</span><span | |
5001 class="cmtt-8"> [length]</span><span | |
5002 class="cmtt-8"> octets</span> | |
5003 <br class="fancyvrb" /><a | |
5004 id="x1-84014r7"></a><span | |
5005 class="cmr-6">7</span><span | |
5006 class="cmtt-8"> </span><span | |
5007 class="cmtt-8"> </span><span | |
5008 class="cmtt-8"> </span><span | |
5009 class="cmtt-8"> </span><span | |
5010 class="cmtt-8"> </span><span | |
5011 class="cmtt-8"> </span><span | |
5012 class="cmtt-8"> }</span> | |
5013 <br class="fancyvrb" /><a | |
5014 id="x1-84016r8"></a><span | |
5015 class="cmr-6">8</span><span | |
5016 class="cmtt-8"> </span><span | |
5017 class="cmtt-8"> </span><span | |
5018 class="cmtt-8"> </span><span | |
5019 class="cmtt-8"> 7)</span><span | |
5020 class="cmtt-8"> [framing\_bit]</span><span | |
5021 class="cmtt-8"> =</span><span | |
5022 class="cmtt-8"> read</span><span | |
5023 class="cmtt-8"> a</span><span | |
5024 class="cmtt-8"> single</span><span | |
5025 class="cmtt-8"> bit</span><span | |
5026 class="cmtt-8"> as</span><span | |
5027 class="cmtt-8"> boolean</span> | |
5028 <br class="fancyvrb" /><a | |
5029 id="x1-84018r9"></a><span | |
5030 class="cmr-6">9</span><span | |
5031 class="cmtt-8"> </span><span | |
5032 class="cmtt-8"> </span><span | |
5033 class="cmtt-8"> </span><span | |
5034 class="cmtt-8"> 8)</span><span | |
5035 class="cmtt-8"> if</span><span | |
5036 class="cmtt-8"> (</span><span | |
5037 class="cmtt-8"> [framing\_bit]</span><span | |
5038 class="cmtt-8"> unset</span><span | |
5039 class="cmtt-8"> or</span><span | |
5040 class="cmtt-8"> end-of-packet</span><span | |
5041 class="cmtt-8"> )</span><span | |
5042 class="cmtt-8"> then</span><span | |
5043 class="cmtt-8"> ERROR</span> | |
5044 <br class="fancyvrb" /><a | |
5045 id="x1-84020r10"></a><span | |
5046 class="cmr-6">10</span><span | |
5047 class="cmtt-8"> </span><span | |
5048 class="cmtt-8"> </span><span | |
5049 class="cmtt-8"> </span><span | |
5050 class="cmtt-8"> 9)</span><span | |
5051 class="cmtt-8"> done.</span> | |
5052 </div> | |
5053 <!--l. 64--><p class="noindent" > | |
5054 <h5 class="subsubsectionHead"><span class="titlemark">5.2.2. </span> <a | |
5055 id="x1-850005.2.2"></a>Content vector format</h5> | |
5056 <!--l. 66--><p class="noindent" >The comment vectors are structured similarly to a UNIX environment variable. That is, | |
5057 comment fields consist of a field name and a corresponding value and look like: | |
5058 <!--l. 70--><p class="noindent" > | |
5059 <div class="quote"> | |
5060 <!--l. 71--><p class="noindent" > | |
5061 <div class="fancyvrb" id="fancyvrb24"> | |
5062 <a | |
5063 id="x1-85002r1"></a><span | |
5064 class="cmr-6">1</span><span | |
5065 class="cmtt-8"> </span><span | |
5066 class="cmtt-8"> comment[0]="ARTIST=me";</span> | |
5067 <br class="fancyvrb" /><a | |
5068 id="x1-85004r2"></a><span | |
5069 class="cmr-6">2</span><span | |
5070 class="cmtt-8"> </span><span | |
5071 class="cmtt-8"> comment[1]="TITLE=the</span><span | |
5072 class="cmtt-8"> sound</span><span | |
5073 class="cmtt-8"> of</span><span | |
5074 class="cmtt-8"> Vorbis";</span> | |
5075 </div> | |
5076 </div> | |
5077 | |
5078 | |
5079 | |
5080 <!--l. 77--><p class="noindent" >The field name is case-insensitive and may consist of ASCII 0x20 through 0x7D, 0x3D (’=’) | |
5081 excluded. ASCII 0x41 through 0x5A inclusive (characters A-Z) is to be considered equivalent to | |
5082 ASCII 0x61 through 0x7A inclusive (characters a-z). | |
5083 <!--l. 83--><p class="noindent" >The field name is immediately followed by ASCII 0x3D (’=’); this equals sign is used to | |
5084 terminate the field name. | |
5085 <!--l. 87--><p class="noindent" >0x3D is followed by 8 bit clean UTF-8 encoded value of the field contents to the end of the | |
5086 field. | |
5087 <!--l. 91--><p class="noindent" ><span class="paragraphHead"><a | |
5088 id="x1-860005.2.2"></a><span | |
5089 class="cmbx-12">Field names</span></span> | |
5090 Below is a proposed, minimal list of standard field names with a description of intended use. No | |
5091 single or group of field names is mandatory; a comment header may contain one, all or none of | |
5092 the names in this list. | |
5093 <!--l. 99--><p class="noindent" > | |
5094 <dl class="description"><dt class="description"> | |
5095 <span | |
5096 class="cmssbx-10x-x-120">TITLE</span> </dt><dd | |
5097 class="description">Track/Work name | |
5098 </dd><dt class="description"> | |
5099 <span | |
5100 class="cmssbx-10x-x-120">VERSION</span> </dt><dd | |
5101 class="description">The version field may be used to differentiate multiple versions of the same | |
5102 track title in a single collection. (e.g. remix info) | |
5103 </dd><dt class="description"> | |
5104 <span | |
5105 class="cmssbx-10x-x-120">ALBUM</span> </dt><dd | |
5106 class="description">The collection name to which this track belongs | |
5107 </dd><dt class="description"> | |
5108 <span | |
5109 class="cmssbx-10x-x-120">TRACKNUMBER</span> </dt><dd | |
5110 class="description">The track number of this piece if part of a specific larger collection or | |
5111 album | |
5112 </dd><dt class="description"> | |
5113 <span | |
5114 class="cmssbx-10x-x-120">ARTIST</span> </dt><dd | |
5115 class="description">The artist generally considered responsible for the work. In popular music this is | |
5116 usually the performing band or singer. For classical music it would be the composer. | |
5117 For an audio book it would be the author of the original text. | |
5118 </dd><dt class="description"> | |
5119 <span | |
5120 class="cmssbx-10x-x-120">PERFORMER</span> </dt><dd | |
5121 class="description">The artist(s) who performed the work. In classical music this would be the | |
5122 conductor, orchestra, soloists. In an audio book it would be the actor who did the | |
5123 reading. In popular music this is typically the same as the ARTIST and is omitted. | |
5124 </dd><dt class="description"> | |
5125 <span | |
5126 class="cmssbx-10x-x-120">COPYRIGHT</span> </dt><dd | |
5127 class="description">Copyright attribution, e.g., ’2001 Nobody’s Band’ or ’1999 Jack Moffitt’ | |
5128 </dd><dt class="description"> | |
5129 | |
5130 | |
5131 | |
5132 <span | |
5133 class="cmssbx-10x-x-120">LICENSE</span> </dt><dd | |
5134 class="description">License information, eg, ’All Rights Reserved’, ’Any Use Permitted’, a URL to | |
5135 a license such as a Creative | |
5136 Commons license (”www.creativecommons.org/blahblah/license.html”) or the EFF | |
5137 Open Audio License (’distributed under the terms of the Open Audio License. see | |
5138 http://www.eff.org/IP/Open_licenses/eff_oal.html for details’), etc. | |
5139 </dd><dt class="description"> | |
5140 <span | |
5141 class="cmssbx-10x-x-120">ORGANIZATION</span> </dt><dd | |
5142 class="description">Name of the organization producing the track (i.e. the ’record label’) | |
5143 </dd><dt class="description"> | |
5144 <span | |
5145 class="cmssbx-10x-x-120">DESCRIPTION</span> </dt><dd | |
5146 class="description">A short text description of the contents | |
5147 </dd><dt class="description"> | |
5148 <span | |
5149 class="cmssbx-10x-x-120">GENRE</span> </dt><dd | |
5150 class="description">A short text indication of music genre | |
5151 </dd><dt class="description"> | |
5152 <span | |
5153 class="cmssbx-10x-x-120">DATE</span> </dt><dd | |
5154 class="description">Date the track was recorded | |
5155 </dd><dt class="description"> | |
5156 <span | |
5157 class="cmssbx-10x-x-120">LOCATION</span> </dt><dd | |
5158 class="description">Location where track was recorded | |
5159 </dd><dt class="description"> | |
5160 <span | |
5161 class="cmssbx-10x-x-120">CONTACT</span> </dt><dd | |
5162 class="description">Contact information for the creators or distributors of the track. This could | |
5163 be a URL, an email address, the physical address of the producing label. | |
5164 </dd><dt class="description"> | |
5165 <span | |
5166 class="cmssbx-10x-x-120">ISRC</span> </dt><dd | |
5167 class="description">International Standard Recording Code for the track; see <a | |
5168 href="http://www.ifpi.org/isrc/" >the ISRC intro page</a> for | |
5169 more information on ISRC numbers. | |
5170 </dd></dl> | |
5171 <!--l. 158--><p class="noindent" ><span class="paragraphHead"><a | |
5172 id="x1-870005.2.2"></a><span | |
5173 class="cmbx-12">Implications</span></span> | |
5174 Field names should not be ’internationalized’; this is a concession to simplicity not | |
5175 an attempt to exclude the majority of the world that doesn’t speak English. Field | |
5176 <span | |
5177 class="cmti-12">contents</span>, however, use the UTF-8 character encoding to allow easy representation of any | |
5178 language. | |
5179 <!--l. 166--><p class="noindent" >We have the length of the entirety of the field and restrictions on the field name so that | |
5180 the field name is bounded in a known way. Thus we also have the length of the field | |
5181 contents. | |
5182 <!--l. 170--><p class="noindent" >Individual ’vendors’ may use non-standard field names within reason. The proper | |
5183 use of comment fields should be clear through context at this point. Abuse will be | |
5184 discouraged. | |
5185 | |
5186 | |
5187 | |
5188 <!--l. 174--><p class="noindent" >There is no vendor-specific prefix to ’nonstandard’ field names. Vendors should make some effort | |
5189 to avoid arbitrarily polluting the common namespace. We will generally collect the more useful | |
5190 tags here to help with standardization. | |
5191 <!--l. 179--><p class="noindent" >Field names are not required to be unique (occur once) within a comment header. As an | |
5192 example, assume a track was recorded by three well know artists; the following is permissible, | |
5193 and encouraged: | |
5194 <!--l. 183--><p class="noindent" > | |
5195 <div class="quote"> | |
5196 <!--l. 184--><p class="noindent" > | |
5197 <div class="fancyvrb" id="fancyvrb25"> | |
5198 <a | |
5199 id="x1-87002r1"></a><span | |
5200 class="cmr-6">1</span><span | |
5201 class="cmtt-8"> </span><span | |
5202 class="cmtt-8"> ARTIST=Dizzy</span><span | |
5203 class="cmtt-8"> Gillespie</span> | |
5204 <br class="fancyvrb" /><a | |
5205 id="x1-87004r2"></a><span | |
5206 class="cmr-6">2</span><span | |
5207 class="cmtt-8"> </span><span | |
5208 class="cmtt-8"> ARTIST=Sonny</span><span | |
5209 class="cmtt-8"> Rollins</span> | |
5210 <br class="fancyvrb" /><a | |
5211 id="x1-87006r3"></a><span | |
5212 class="cmr-6">3</span><span | |
5213 class="cmtt-8"> </span><span | |
5214 class="cmtt-8"> ARTIST=Sonny</span><span | |
5215 class="cmtt-8"> Stitt</span> | |
5216 </div> | |
5217 </div> | |
5218 <!--l. 197--><p class="noindent" > | |
5219 <h5 class="subsubsectionHead"><span class="titlemark">5.2.3. </span> <a | |
5220 id="x1-880005.2.3"></a>Encoding</h5> | |
5221 <!--l. 199--><p class="noindent" >The comment header comprises the entirety of the second bitstream header packet. Unlike the | |
5222 first bitstream header packet, it is not generally the only packet on the second page and may not | |
5223 be restricted to within the second bitstream page. The length of the comment header packet is | |
5224 (practically) unbounded. The comment header packet is not optional; it must be present in the | |
5225 bitstream even if it is effectively empty. | |
5226 <!--l. 207--><p class="noindent" >The comment header is encoded as follows (as per Ogg’s standard bitstream mapping which | |
5227 renders least-significant-bit of the word to be coded into the least significant available bit of the | |
5228 current bitstream octet first): | |
5229 <!--l. 213--><p class="noindent" > | |
5230 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
5231 1. </dt><dd | |
5232 class="enumerate-enumitem">Vendor string length (32 bit unsigned quantity specifying number of octets) | |
5233 </dd><dt class="enumerate-enumitem"> | |
5234 2. </dt><dd | |
5235 class="enumerate-enumitem">Vendor string ([vendor string length] octets coded from beginning of string to end of | |
5236 string, not null terminated) | |
5237 | |
5238 | |
5239 | |
5240 </dd><dt class="enumerate-enumitem"> | |
5241 3. </dt><dd | |
5242 class="enumerate-enumitem">Number of comment fields (32 bit unsigned quantity specifying number of fields) | |
5243 </dd><dt class="enumerate-enumitem"> | |
5244 4. </dt><dd | |
5245 class="enumerate-enumitem">Comment field 0 length (if [Number of comment fields] <span | |
5246 class="cmmi-12">> </span>0; 32 bit unsigned quantity | |
5247 specifying number of octets) | |
5248 </dd><dt class="enumerate-enumitem"> | |
5249 5. </dt><dd | |
5250 class="enumerate-enumitem">Comment field 0 ([Comment field 0 length] octets coded from beginning of string to | |
5251 end of string, not null terminated) | |
5252 </dd><dt class="enumerate-enumitem"> | |
5253 6. </dt><dd | |
5254 class="enumerate-enumitem">Comment field 1 length (if [Number of comment fields] <span | |
5255 class="cmmi-12">> </span>1...)... | |
5256 </dd></dl> | |
5257 <!--l. 234--><p class="noindent" >This is actually somewhat easier to describe in code; implementation of the above can be found | |
5258 in <span | |
5259 class="cmtt-12">vorbis/lib/info.c</span>, <span | |
5260 class="cmtt-12">_vorbis_pack_comment() </span>and <span | |
5261 class="cmtt-12">_vorbis_unpack_comment()</span>. | |
5262 | |
5263 | |
5264 | |
5265 | |
5266 | |
5267 | |
5268 <h3 class="sectionHead"><span class="titlemark">6. </span> <a | |
5269 id="x1-890006"></a>Floor type 0 setup and decode</h3> | |
5270 <!--l. 6--><p class="noindent" > | |
5271 <h4 class="subsectionHead"><span class="titlemark">6.1. </span> <a | |
5272 id="x1-900006.1"></a>Overview</h4> | |
5273 <!--l. 8--><p class="noindent" >Vorbis floor type zero uses Line Spectral Pair (LSP, also alternately known as Line Spectral | |
5274 Frequency or LSF) representation to encode a smooth spectral envelope curve as the frequency | |
5275 response of the LSP filter. This representation is equivalent to a traditional all-pole infinite | |
5276 impulse response filter as would be used in linear predictive coding; LSP representation may be | |
5277 converted to LPC representation and vice-versa. | |
5278 <!--l. 18--><p class="noindent" > | |
5279 <h4 class="subsectionHead"><span class="titlemark">6.2. </span> <a | |
5280 id="x1-910006.2"></a>Floor 0 format</h4> | |
5281 <!--l. 20--><p class="noindent" >Floor zero configuration consists of six integer fields and a list of VQ codebooks for use in | |
5282 coding/decoding the LSP filter coefficient values used by each frame. | |
5283 <!--l. 24--><p class="noindent" > | |
5284 <h5 class="subsubsectionHead"><span class="titlemark">6.2.1. </span> <a | |
5285 id="x1-920006.2.1"></a>header decode</h5> | |
5286 <!--l. 26--><p class="noindent" >Configuration information for instances of floor zero decodes from the codec setup header (third | |
5287 packet). configuration decode proceeds as follows: | |
5288 <!--l. 30--><p class="noindent" > | |
5289 <div class="fancyvrb" id="fancyvrb26"> | |
5290 <a | |
5291 id="x1-92002r1"></a><span | |
5292 class="cmr-6">1</span><span | |
5293 class="cmtt-8"> </span><span | |
5294 class="cmtt-8"> </span><span | |
5295 class="cmtt-8"> </span><span | |
5296 class="cmtt-8"> 1)</span><span | |
5297 class="cmtt-8"> [floor0_order]</span><span | |
5298 class="cmtt-8"> =</span><span | |
5299 class="cmtt-8"> read</span><span | |
5300 class="cmtt-8"> an</span><span | |
5301 class="cmtt-8"> unsigned</span><span | |
5302 class="cmtt-8"> integer</span><span | |
5303 class="cmtt-8"> of</span><span | |
5304 class="cmtt-8"> 8</span><span | |
5305 class="cmtt-8"> bits</span> | |
5306 <br class="fancyvrb" /><a | |
5307 id="x1-92004r2"></a><span | |
5308 class="cmr-6">2</span><span | |
5309 class="cmtt-8"> </span><span | |
5310 class="cmtt-8"> </span><span | |
5311 class="cmtt-8"> </span><span | |
5312 class="cmtt-8"> 2)</span><span | |
5313 class="cmtt-8"> [floor0_rate]</span><span | |
5314 class="cmtt-8"> =</span><span | |
5315 class="cmtt-8"> read</span><span | |
5316 class="cmtt-8"> an</span><span | |
5317 class="cmtt-8"> unsigned</span><span | |
5318 class="cmtt-8"> integer</span><span | |
5319 class="cmtt-8"> of</span><span | |
5320 class="cmtt-8"> 16</span><span | |
5321 class="cmtt-8"> bits</span> | |
5322 <br class="fancyvrb" /><a | |
5323 id="x1-92006r3"></a><span | |
5324 class="cmr-6">3</span><span | |
5325 class="cmtt-8"> </span><span | |
5326 class="cmtt-8"> </span><span | |
5327 class="cmtt-8"> </span><span | |
5328 class="cmtt-8"> 3)</span><span | |
5329 class="cmtt-8"> [floor0_bark_map_size]</span><span | |
5330 class="cmtt-8"> =</span><span | |
5331 class="cmtt-8"> read</span><span | |
5332 class="cmtt-8"> an</span><span | |
5333 class="cmtt-8"> unsigned</span><span | |
5334 class="cmtt-8"> integer</span><span | |
5335 class="cmtt-8"> of</span><span | |
5336 class="cmtt-8"> 16</span><span | |
5337 class="cmtt-8"> bits</span> | |
5338 <br class="fancyvrb" /><a | |
5339 id="x1-92008r4"></a><span | |
5340 class="cmr-6">4</span><span | |
5341 class="cmtt-8"> </span><span | |
5342 class="cmtt-8"> </span><span | |
5343 class="cmtt-8"> </span><span | |
5344 class="cmtt-8"> 4)</span><span | |
5345 class="cmtt-8"> [floor0_amplitude_bits]</span><span | |
5346 class="cmtt-8"> =</span><span | |
5347 class="cmtt-8"> read</span><span | |
5348 class="cmtt-8"> an</span><span | |
5349 class="cmtt-8"> unsigned</span><span | |
5350 class="cmtt-8"> integer</span><span | |
5351 class="cmtt-8"> of</span><span | |
5352 class="cmtt-8"> six</span><span | |
5353 class="cmtt-8"> bits</span> | |
5354 <br class="fancyvrb" /><a | |
5355 id="x1-92010r5"></a><span | |
5356 class="cmr-6">5</span><span | |
5357 class="cmtt-8"> </span><span | |
5358 class="cmtt-8"> </span><span | |
5359 class="cmtt-8"> </span><span | |
5360 class="cmtt-8"> 5)</span><span | |
5361 class="cmtt-8"> [floor0_amplitude_offset]</span><span | |
5362 class="cmtt-8"> =</span><span | |
5363 class="cmtt-8"> read</span><span | |
5364 class="cmtt-8"> an</span><span | |
5365 class="cmtt-8"> unsigned</span><span | |
5366 class="cmtt-8"> integer</span><span | |
5367 class="cmtt-8"> of</span><span | |
5368 class="cmtt-8"> eight</span><span | |
5369 class="cmtt-8"> bits</span> | |
5370 <br class="fancyvrb" /><a | |
5371 id="x1-92012r6"></a><span | |
5372 class="cmr-6">6</span><span | |
5373 class="cmtt-8"> </span><span | |
5374 class="cmtt-8"> </span><span | |
5375 class="cmtt-8"> </span><span | |
5376 class="cmtt-8"> 6)</span><span | |
5377 class="cmtt-8"> [floor0_number_of_books]</span><span | |
5378 class="cmtt-8"> =</span><span | |
5379 class="cmtt-8"> read</span><span | |
5380 class="cmtt-8"> an</span><span | |
5381 class="cmtt-8"> unsigned</span><span | |
5382 class="cmtt-8"> integer</span><span | |
5383 class="cmtt-8"> of</span><span | |
5384 class="cmtt-8"> four</span><span | |
5385 class="cmtt-8"> bits</span><span | |
5386 class="cmtt-8"> and</span><span | |
5387 class="cmtt-8"> add</span><span | |
5388 class="cmtt-8"> 1</span> | |
5389 <br class="fancyvrb" /><a | |
5390 id="x1-92014r7"></a><span | |
5391 class="cmr-6">7</span><span | |
5392 class="cmtt-8"> </span><span | |
5393 class="cmtt-8"> </span><span | |
5394 class="cmtt-8"> </span><span | |
5395 class="cmtt-8"> 7)</span><span | |
5396 class="cmtt-8"> array</span><span | |
5397 class="cmtt-8"> [floor0_book_list]</span><span | |
5398 class="cmtt-8"> =</span><span | |
5399 class="cmtt-8"> read</span><span | |
5400 class="cmtt-8"> a</span><span | |
5401 class="cmtt-8"> list</span><span | |
5402 class="cmtt-8"> of</span><span | |
5403 class="cmtt-8"> [floor0_number_of_books]</span><span | |
5404 class="cmtt-8"> unsigned</span><span | |
5405 class="cmtt-8"> integers</span><span | |
5406 class="cmtt-8"> of</span><span | |
5407 class="cmtt-8"> eight</span><span | |
5408 class="cmtt-8"> bits</span><span | |
5409 class="cmtt-8"> each;</span> | |
5410 </div> | |
5411 | |
5412 | |
5413 | |
5414 <!--l. 40--><p class="noindent" >An end-of-packet condition during any of these bitstream reads renders this stream undecodable. | |
5415 In addition, any element of the array <span | |
5416 class="cmtt-12">[floor0_book_list] </span>that is greater than the maximum | |
5417 codebook number for this bitstream is an error condition that also renders the stream | |
5418 undecodable. | |
5419 <!--l. 48--><p class="noindent" > | |
5420 <h5 class="subsubsectionHead"><span class="titlemark">6.2.2. </span> <a | |
5421 id="x1-930006.2.2"></a>packet decode</h5> | |
5422 <!--l. 50--><p class="noindent" >Extracting a floor0 curve from an audio packet consists of first decoding the curve | |
5423 amplitude and <span | |
5424 class="cmtt-12">[floor0_order] </span>LSP coefficient values from the bitstream, and then | |
5425 computing the floor curve, which is defined as the frequency response of the decoded LSP | |
5426 filter. | |
5427 <!--l. 56--><p class="noindent" >Packet decode proceeds as follows: | |
5428 <div class="fancyvrb" id="fancyvrb27"> | |
5429 <a | |
5430 id="x1-93002r1"></a><span | |
5431 class="cmr-6">1</span><span | |
5432 class="cmtt-8"> </span><span | |
5433 class="cmtt-8"> </span><span | |
5434 class="cmtt-8"> </span><span | |
5435 class="cmtt-8"> 1)</span><span | |
5436 class="cmtt-8"> [amplitude]</span><span | |
5437 class="cmtt-8"> =</span><span | |
5438 class="cmtt-8"> read</span><span | |
5439 class="cmtt-8"> an</span><span | |
5440 class="cmtt-8"> unsigned</span><span | |
5441 class="cmtt-8"> integer</span><span | |
5442 class="cmtt-8"> of</span><span | |
5443 class="cmtt-8"> [floor0_amplitude_bits]</span><span | |
5444 class="cmtt-8"> bits</span> | |
5445 <br class="fancyvrb" /><a | |
5446 id="x1-93004r2"></a><span | |
5447 class="cmr-6">2</span><span | |
5448 class="cmtt-8"> </span><span | |
5449 class="cmtt-8"> </span><span | |
5450 class="cmtt-8"> </span><span | |
5451 class="cmtt-8"> 2)</span><span | |
5452 class="cmtt-8"> if</span><span | |
5453 class="cmtt-8"> (</span><span | |
5454 class="cmtt-8"> [amplitude]</span><span | |
5455 class="cmtt-8"> is</span><span | |
5456 class="cmtt-8"> greater</span><span | |
5457 class="cmtt-8"> than</span><span | |
5458 class="cmtt-8"> zero</span><span | |
5459 class="cmtt-8"> )</span><span | |
5460 class="cmtt-8"> </span><span | |
5461 class="cmsy-8">{</span> | |
5462 <br class="fancyvrb" /><a | |
5463 id="x1-93006r3"></a><span | |
5464 class="cmr-6">3</span><span | |
5465 class="cmtt-8"> </span><span | |
5466 class="cmtt-8"> </span><span | |
5467 class="cmtt-8"> </span><span | |
5468 class="cmtt-8"> </span><span | |
5469 class="cmtt-8"> </span><span | |
5470 class="cmtt-8"> </span><span | |
5471 class="cmtt-8"> </span><span | |
5472 class="cmtt-8"> </span><span | |
5473 class="cmtt-8"> 3)</span><span | |
5474 class="cmtt-8"> [coefficients]</span><span | |
5475 class="cmtt-8"> is</span><span | |
5476 class="cmtt-8"> an</span><span | |
5477 class="cmtt-8"> empty,</span><span | |
5478 class="cmtt-8"> zero</span><span | |
5479 class="cmtt-8"> length</span><span | |
5480 class="cmtt-8"> vector</span> | |
5481 <br class="fancyvrb" /><a | |
5482 id="x1-93008r4"></a><span | |
5483 class="cmr-6">4</span><span | |
5484 class="cmtt-8"> </span><span | |
5485 class="cmtt-8"> </span><span | |
5486 class="cmtt-8"> </span><span | |
5487 class="cmtt-8"> </span><span | |
5488 class="cmtt-8"> </span><span | |
5489 class="cmtt-8"> </span><span | |
5490 class="cmtt-8"> </span><span | |
5491 class="cmtt-8"> </span><span | |
5492 class="cmtt-8"> 4)</span><span | |
5493 class="cmtt-8"> [booknumber]</span><span | |
5494 class="cmtt-8"> =</span><span | |
5495 class="cmtt-8"> read</span><span | |
5496 class="cmtt-8"> an</span><span | |
5497 class="cmtt-8"> unsigned</span><span | |
5498 class="cmtt-8"> integer</span><span | |
5499 class="cmtt-8"> of</span><span | |
5500 class="cmtt-8"> </span><a | |
5501 href="#x1-1170009.2.1"><span | |
5502 class="cmtt-8">ilog</span></a><span | |
5503 class="cmtt-8">(</span><span | |
5504 class="cmtt-8"> [floor0_number_of_books]</span><span | |
5505 class="cmtt-8"> )</span><span | |
5506 class="cmtt-8"> bits</span> | |
5507 <br class="fancyvrb" /><a | |
5508 id="x1-93010r5"></a><span | |
5509 class="cmr-6">5</span><span | |
5510 class="cmtt-8"> </span><span | |
5511 class="cmtt-8"> </span><span | |
5512 class="cmtt-8"> </span><span | |
5513 class="cmtt-8"> </span><span | |
5514 class="cmtt-8"> </span><span | |
5515 class="cmtt-8"> </span><span | |
5516 class="cmtt-8"> </span><span | |
5517 class="cmtt-8"> </span><span | |
5518 class="cmtt-8"> 5)</span><span | |
5519 class="cmtt-8"> if</span><span | |
5520 class="cmtt-8"> (</span><span | |
5521 class="cmtt-8"> [booknumber]</span><span | |
5522 class="cmtt-8"> is</span><span | |
5523 class="cmtt-8"> greater</span><span | |
5524 class="cmtt-8"> than</span><span | |
5525 class="cmtt-8"> the</span><span | |
5526 class="cmtt-8"> highest</span><span | |
5527 class="cmtt-8"> number</span><span | |
5528 class="cmtt-8"> decode</span><span | |
5529 class="cmtt-8"> codebook</span><span | |
5530 class="cmtt-8"> )</span><span | |
5531 class="cmtt-8"> then</span><span | |
5532 class="cmtt-8"> packet</span><span | |
5533 class="cmtt-8"> is</span><span | |
5534 class="cmtt-8"> undecodable</span> | |
5535 <br class="fancyvrb" /><a | |
5536 id="x1-93012r6"></a><span | |
5537 class="cmr-6">6</span><span | |
5538 class="cmtt-8"> </span><span | |
5539 class="cmtt-8"> </span><span | |
5540 class="cmtt-8"> </span><span | |
5541 class="cmtt-8"> </span><span | |
5542 class="cmtt-8"> </span><span | |
5543 class="cmtt-8"> </span><span | |
5544 class="cmtt-8"> </span><span | |
5545 class="cmtt-8"> </span><span | |
5546 class="cmtt-8"> 6)</span><span | |
5547 class="cmtt-8"> [last]</span><span | |
5548 class="cmtt-8"> =</span><span | |
5549 class="cmtt-8"> zero;</span> | |
5550 <br class="fancyvrb" /><a | |
5551 id="x1-93014r7"></a><span | |
5552 class="cmr-6">7</span><span | |
5553 class="cmtt-8"> </span><span | |
5554 class="cmtt-8"> </span><span | |
5555 class="cmtt-8"> </span><span | |
5556 class="cmtt-8"> </span><span | |
5557 class="cmtt-8"> </span><span | |
5558 class="cmtt-8"> </span><span | |
5559 class="cmtt-8"> </span><span | |
5560 class="cmtt-8"> </span><span | |
5561 class="cmtt-8"> 7)</span><span | |
5562 class="cmtt-8"> vector</span><span | |
5563 class="cmtt-8"> [temp_vector]</span><span | |
5564 class="cmtt-8"> =</span><span | |
5565 class="cmtt-8"> read</span><span | |
5566 class="cmtt-8"> vector</span><span | |
5567 class="cmtt-8"> from</span><span | |
5568 class="cmtt-8"> bitstream</span><span | |
5569 class="cmtt-8"> using</span><span | |
5570 class="cmtt-8"> codebook</span><span | |
5571 class="cmtt-8"> number</span><span | |
5572 class="cmtt-8"> [floor0_book_list]</span><span | |
5573 class="cmtt-8"> element</span><span | |
5574 class="cmtt-8"> [booknumber]</span><span | |
5575 class="cmtt-8"> in</span><span | |
5576 class="cmtt-8"> VQ</span><span | |
5577 class="cmtt-8"> context.</span> | |
5578 <br class="fancyvrb" /><a | |
5579 id="x1-93016r8"></a><span | |
5580 class="cmr-6">8</span><span | |
5581 class="cmtt-8"> </span><span | |
5582 class="cmtt-8"> </span><span | |
5583 class="cmtt-8"> </span><span | |
5584 class="cmtt-8"> </span><span | |
5585 class="cmtt-8"> </span><span | |
5586 class="cmtt-8"> </span><span | |
5587 class="cmtt-8"> </span><span | |
5588 class="cmtt-8"> </span><span | |
5589 class="cmtt-8"> 8)</span><span | |
5590 class="cmtt-8"> add</span><span | |
5591 class="cmtt-8"> the</span><span | |
5592 class="cmtt-8"> scalar</span><span | |
5593 class="cmtt-8"> value</span><span | |
5594 class="cmtt-8"> [last]</span><span | |
5595 class="cmtt-8"> to</span><span | |
5596 class="cmtt-8"> each</span><span | |
5597 class="cmtt-8"> scalar</span><span | |
5598 class="cmtt-8"> in</span><span | |
5599 class="cmtt-8"> vector</span><span | |
5600 class="cmtt-8"> [temp_vector]</span> | |
5601 <br class="fancyvrb" /><a | |
5602 id="x1-93018r9"></a><span | |
5603 class="cmr-6">9</span><span | |
5604 class="cmtt-8"> </span><span | |
5605 class="cmtt-8"> </span><span | |
5606 class="cmtt-8"> </span><span | |
5607 class="cmtt-8"> </span><span | |
5608 class="cmtt-8"> </span><span | |
5609 class="cmtt-8"> </span><span | |
5610 class="cmtt-8"> </span><span | |
5611 class="cmtt-8"> </span><span | |
5612 class="cmtt-8"> 9)</span><span | |
5613 class="cmtt-8"> [last]</span><span | |
5614 class="cmtt-8"> =</span><span | |
5615 class="cmtt-8"> the</span><span | |
5616 class="cmtt-8"> value</span><span | |
5617 class="cmtt-8"> of</span><span | |
5618 class="cmtt-8"> the</span><span | |
5619 class="cmtt-8"> last</span><span | |
5620 class="cmtt-8"> scalar</span><span | |
5621 class="cmtt-8"> in</span><span | |
5622 class="cmtt-8"> vector</span><span | |
5623 class="cmtt-8"> [temp_vector]</span> | |
5624 <br class="fancyvrb" /><a | |
5625 id="x1-93020r10"></a><span | |
5626 class="cmr-6">10</span><span | |
5627 class="cmtt-8"> </span><span | |
5628 class="cmtt-8"> </span><span | |
5629 class="cmtt-8"> </span><span | |
5630 class="cmtt-8"> </span><span | |
5631 class="cmtt-8"> </span><span | |
5632 class="cmtt-8"> </span><span | |
5633 class="cmtt-8"> </span><span | |
5634 class="cmtt-8"> 10)</span><span | |
5635 class="cmtt-8"> concatenate</span><span | |
5636 class="cmtt-8"> [temp_vector]</span><span | |
5637 class="cmtt-8"> onto</span><span | |
5638 class="cmtt-8"> the</span><span | |
5639 class="cmtt-8"> end</span><span | |
5640 class="cmtt-8"> of</span><span | |
5641 class="cmtt-8"> the</span><span | |
5642 class="cmtt-8"> [coefficients]</span><span | |
5643 class="cmtt-8"> vector</span> | |
5644 <br class="fancyvrb" /><a | |
5645 id="x1-93022r11"></a><span | |
5646 class="cmr-6">11</span><span | |
5647 class="cmtt-8"> </span><span | |
5648 class="cmtt-8"> </span><span | |
5649 class="cmtt-8"> </span><span | |
5650 class="cmtt-8"> </span><span | |
5651 class="cmtt-8"> </span><span | |
5652 class="cmtt-8"> </span><span | |
5653 class="cmtt-8"> </span><span | |
5654 class="cmtt-8"> 11)</span><span | |
5655 class="cmtt-8"> if</span><span | |
5656 class="cmtt-8"> (length</span><span | |
5657 class="cmtt-8"> of</span><span | |
5658 class="cmtt-8"> vector</span><span | |
5659 class="cmtt-8"> [coefficients]</span><span | |
5660 class="cmtt-8"> is</span><span | |
5661 class="cmtt-8"> less</span><span | |
5662 class="cmtt-8"> than</span><span | |
5663 class="cmtt-8"> [floor0_order],</span><span | |
5664 class="cmtt-8"> continue</span><span | |
5665 class="cmtt-8"> at</span><span | |
5666 class="cmtt-8"> step</span><span | |
5667 class="cmtt-8"> 6</span> | |
5668 <br class="fancyvrb" /><a | |
5669 id="x1-93024r12"></a><span | |
5670 class="cmr-6">12</span><span | |
5671 class="cmtt-8"> </span><span | |
5672 class="cmtt-8"> </span> | |
5673 <br class="fancyvrb" /><a | |
5674 id="x1-93026r13"></a><span | |
5675 class="cmr-6">13</span><span | |
5676 class="cmtt-8"> </span><span | |
5677 class="cmtt-8"> </span><span | |
5678 class="cmtt-8"> </span><span | |
5679 class="cmtt-8"> </span><span | |
5680 class="cmtt-8"> </span><span | |
5681 class="cmtt-8"> </span><span | |
5682 class="cmtt-8"> </span><span | |
5683 class="cmsy-8">}</span> | |
5684 <br class="fancyvrb" /><a | |
5685 id="x1-93028r14"></a><span | |
5686 class="cmr-6">14</span><span | |
5687 class="cmtt-8"> </span><span | |
5688 class="cmtt-8"> </span> | |
5689 <br class="fancyvrb" /><a | |
5690 id="x1-93030r15"></a><span | |
5691 class="cmr-6">15</span><span | |
5692 class="cmtt-8"> </span><span | |
5693 class="cmtt-8"> </span><span | |
5694 class="cmtt-8"> 12)</span><span | |
5695 class="cmtt-8"> done.</span> | |
5696 <br class="fancyvrb" /><a | |
5697 id="x1-93032r16"></a><span | |
5698 class="cmr-6">16</span><span | |
5699 class="cmtt-8"> </span><span | |
5700 class="cmtt-8"> </span> | |
5701 </div> | |
5702 <!--l. 76--><p class="noindent" >Take note of the following properties of decode: | |
5703 <ul class="itemize1"> | |
5704 <li class="itemize">An <span | |
5705 class="cmtt-12">[amplitude] </span>value of zero must result in a return code that indicates this channel | |
5706 is unused in this frame (the output of the channel will be all-zeroes in synthesis). | |
5707 Several later stages of decode don’t occur for an unused channel. | |
5708 </li> | |
5709 <li class="itemize">An end-of-packet condition during decode should be considered a nominal occruence; | |
5710 if end-of-packet is reached during any read operation above, floor decode is to return | |
5711 ’unused’ status as if the <span | |
5712 class="cmtt-12">[amplitude] </span>value had read zero at the beginning of decode. | |
5713 </li> | |
5714 <li class="itemize">The book number used for decode can, in fact, be stored in the bitstream in <a | |
5715 href="#x1-1170009.2.1">ilog</a>( | |
5716 | |
5717 | |
5718 | |
5719 <span | |
5720 class="cmtt-12">[floor0_number_of_books] </span>- 1 ) bits. Nevertheless, the above specification is correct | |
5721 and values greater than the maximum possible book value are reserved. | |
5722 </li> | |
5723 <li class="itemize">The number of scalars read into the vector <span | |
5724 class="cmtt-12">[coefficients] </span>may be greater | |
5725 than <span | |
5726 class="cmtt-12">[floor0_order]</span>, the number actually required for curve computation. For | |
5727 example, if the VQ codebook used for the floor currently being decoded has a | |
5728 <span | |
5729 class="cmtt-12">[codebook_dimensions] </span>value of three and <span | |
5730 class="cmtt-12">[floor0_order] </span>is ten, the only way to | |
5731 fill all the needed scalars in <span | |
5732 class="cmtt-12">[coefficients] </span>is to to read a total of twelve scalars | |
5733 as four vectors of three scalars each. This is not an error condition, and care must | |
5734 be taken not to allow a buffer overflow in decode. The extra values are not used and | |
5735 may be ignored or discarded.</li></ul> | |
5736 <!--l. 104--><p class="noindent" > | |
5737 <h5 class="subsubsectionHead"><span class="titlemark">6.2.3. </span> <a | |
5738 id="x1-940006.2.3"></a>curve computation</h5> | |
5739 <!--l. 106--><p class="noindent" >Given an <span | |
5740 class="cmtt-12">[amplitude] </span>integer and <span | |
5741 class="cmtt-12">[coefficients] </span>vector from packet decode as well as | |
5742 the [floor0_order], [floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits] and | |
5743 [floor0_amplitude_offset] values from floor setup, and an output vector size <span | |
5744 class="cmtt-12">[n] </span>specified by the | |
5745 decode process, we compute a floor output vector. | |
5746 <!--l. 113--><p class="noindent" >If the value <span | |
5747 class="cmtt-12">[amplitude] </span>is zero, the return value is a length <span | |
5748 class="cmtt-12">[n] </span>vector with all-zero | |
5749 scalars. Otherwise, begin by assuming the following definitions for the given vector to be | |
5750 synthesized: | |
5751 <center class="par-math-display" > | |
5752 <img | |
5753 src="Vorbis_I_spec7x.png" alt=" { | |
5754 min (floor0_bark_map_size − 1,foobar ) for i ∈ [0,n − 1 ] | |
5755 mapi = − 1 for i = n | |
5756 " class="par-math-display" ></center> | |
5757 <!--l. 128--><p class="nopar" > | |
5758 <!--l. 130--><p class="noindent" >where | |
5759 <center class="par-math-display" > | |
5760 <img | |
5761 src="Vorbis_I_spec8x.png" alt=" ⌊ ⌋ | |
5762 (floor0_rate ⋅ i) floor0_bark_map_size | |
5763 foobar = bark -------2n------- ⋅-bark(.5 ⋅ floor0_rate-) | |
5764 " class="par-math-display" ></center> | |
5765 | |
5766 | |
5767 | |
5768 <!--l. 137--><p class="nopar" > | |
5769 <!--l. 139--><p class="noindent" >and | |
5770 <center class="par-math-display" > | |
5771 <img | |
5772 src="Vorbis_I_spec9x.png" alt=" 2 | |
5773 bark(x) = 13.1arctan (.00074x ) + 2.24 arctan(.0000000185x + .0001x ) | |
5774 " class="par-math-display" ></center> | |
5775 <!--l. 143--><p class="nopar" > | |
5776 <!--l. 145--><p class="noindent" >The above is used to synthesize the LSP curve on a Bark-scale frequency axis, then map the | |
5777 result to a linear-scale frequency axis. Similarly, the below calculation synthesizes the output | |
5778 LSP curve <span | |
5779 class="cmtt-12">[output] </span>on a log (dB) amplitude scale, mapping it to linear amplitude in the last | |
5780 step: | |
5781 <!--l. 151--><p class="noindent" > | |
5782 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
5783 1. </dt><dd | |
5784 class="enumerate-enumitem"><span | |
5785 class="cmtt-12">[i] </span>= 0 | |
5786 </dd><dt class="enumerate-enumitem"> | |
5787 2. </dt><dd | |
5788 class="enumerate-enumitem"><span | |
5789 class="cmtt-12">[</span><span | |
5790 class="cmmi-12">ω</span><span | |
5791 class="cmtt-12">] </span>= <span | |
5792 class="cmmi-12">π </span>* map element <span | |
5793 class="cmtt-12">[i] </span>/ <span | |
5794 class="cmtt-12">[floor0_bark_map_size]</span> | |
5795 </dd><dt class="enumerate-enumitem"> | |
5796 3. </dt><dd | |
5797 class="enumerate-enumitem">if ( <span | |
5798 class="cmtt-12">[floor0_order] </span>is odd ) | |
5799 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
5800 a) </dt><dd | |
5801 class="enumerate-enumitem">calculate <span | |
5802 class="cmtt-12">[p] </span>and <span | |
5803 class="cmtt-12">[q] </span>according to: <div class="eqnarray"> | |
5804 <center class="math-display" > | |
5805 <img | |
5806 src="Vorbis_I_spec10x.png" alt=" floor0_order−3 | |
5807 2 ∏2 2 | |
5808 p = (1 − cos ω) 4(cos([coefficients ]2j+1) − cosω ) | |
5809 floor0_order−1 j=0 | |
5810 1 ----∏2---- | |
5811 q = -- 4(cos([coefficients ]2j) − cosω )2 | |
5812 4 j=0 | |
5813 | |
5814 | |
5815 | |
5816 " class="math-display" ></center> | |
5817 </div> | |
5818 </dd></dl> | |
5819 <!--l. 162--><p class="noindent" >else <span | |
5820 class="cmtt-12">[floor0_order] </span>is even | |
5821 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
5822 b) </dt><dd | |
5823 class="enumerate-enumitem">calculate <span | |
5824 class="cmtt-12">[p] </span>and <span | |
5825 class="cmtt-12">[q] </span>according to: <div class="eqnarray"> | |
5826 <center class="math-display" > | |
5827 <img | |
5828 src="Vorbis_I_spec11x.png" alt=" floor0_order−2 | |
5829 (1-−-cosω-) ∏2 2 | |
5830 p = 2 4(cos([coefficients ]2j+1) − cosω) | |
5831 j=0 | |
5832 floor0_∏o2rder−-2 | |
5833 q = (1-+-cosω-) 4(cos([coefficients ]2j) − cos ω)2 | |
5834 2 j=0 | |
5835 " class="math-display" ></center> | |
5836 </div> | |
5837 </dd></dl> | |
5838 </dd><dt class="enumerate-enumitem"> | |
5839 4. </dt><dd | |
5840 class="enumerate-enumitem">calculate <span | |
5841 class="cmtt-12">[linear_floor_value] </span>according to: | |
5842 <center class="math-display" > | |
5843 <img | |
5844 src="Vorbis_I_spec12x.png" alt=" ( ( )) | |
5845 exp .11512925 amplitude---⋅ floor0_amplitute_√offset---− floor0_amplitude_offset | |
5846 (2floor0_amplitude_bits − 1) p + q | |
5847 " class="math-display" ></center> | |
5848 <!--l. 177--><p class="nopar" > | |
5849 </dd><dt class="enumerate-enumitem"> | |
5850 5. </dt><dd | |
5851 class="enumerate-enumitem"><span | |
5852 class="cmtt-12">[iteration_condition] </span>= map element <span | |
5853 class="cmtt-12">[i]</span> | |
5854 | |
5855 | |
5856 | |
5857 </dd><dt class="enumerate-enumitem"> | |
5858 6. </dt><dd | |
5859 class="enumerate-enumitem"><span | |
5860 class="cmtt-12">[output] </span>element <span | |
5861 class="cmtt-12">[i] </span>= <span | |
5862 class="cmtt-12">[linear_floor_value]</span> | |
5863 </dd><dt class="enumerate-enumitem"> | |
5864 7. </dt><dd | |
5865 class="enumerate-enumitem">increment <span | |
5866 class="cmtt-12">[i]</span> | |
5867 </dd><dt class="enumerate-enumitem"> | |
5868 8. </dt><dd | |
5869 class="enumerate-enumitem">if ( map element <span | |
5870 class="cmtt-12">[i] </span>is equal to <span | |
5871 class="cmtt-12">[iteration_condition] </span>) continue at step | |
5872 5 | |
5873 </dd><dt class="enumerate-enumitem"> | |
5874 9. </dt><dd | |
5875 class="enumerate-enumitem">if ( <span | |
5876 class="cmtt-12">[i] </span>is less than <span | |
5877 class="cmtt-12">[n] </span>) continue at step 2 | |
5878 </dd><dt class="enumerate-enumitem"> | |
5879 10. </dt><dd | |
5880 class="enumerate-enumitem">done</dd></dl> | |
5881 | |
5882 | |
5883 | |
5884 | |
5885 | |
5886 | |
5887 <h3 class="sectionHead"><span class="titlemark">7. </span> <a | |
5888 id="x1-950007"></a>Floor type 1 setup and decode</h3> | |
5889 <!--l. 6--><p class="noindent" > | |
5890 <h4 class="subsectionHead"><span class="titlemark">7.1. </span> <a | |
5891 id="x1-960007.1"></a>Overview</h4> | |
5892 <!--l. 8--><p class="noindent" >Vorbis floor type one uses a piecewise straight-line representation to encode a spectral envelope | |
5893 curve. The representation plots this curve mechanically on a linear frequency axis and a | |
5894 logarithmic (dB) amplitude axis. The integer plotting algorithm used is similar to Bresenham’s | |
5895 algorithm. | |
5896 <!--l. 16--><p class="noindent" > | |
5897 <h4 class="subsectionHead"><span class="titlemark">7.2. </span> <a | |
5898 id="x1-970007.2"></a>Floor 1 format</h4> | |
5899 <!--l. 18--><p class="noindent" > | |
5900 <h5 class="subsubsectionHead"><span class="titlemark">7.2.1. </span> <a | |
5901 id="x1-980007.2.1"></a>model</h5> | |
5902 <!--l. 20--><p class="noindent" >Floor type one represents a spectral curve as a series of line segments. Synthesis constructs a | |
5903 floor curve using iterative prediction in a process roughly equivalent to the following simplified | |
5904 description: | |
5905 <ul class="itemize1"> | |
5906 <li class="itemize">the first line segment (base case) is a logical line spanning from x˙0,y˙0 to x˙1,y˙1 | |
5907 where in the base case x˙0=0 and x˙1=[n], the full range of the spectral floor to be | |
5908 computed. | |
5909 </li> | |
5910 <li class="itemize">the induction step chooses a point x˙new within an existing logical line segment and | |
5911 produces a y˙new value at that point computed from the existing line’s y value at | |
5912 x˙new (as plotted by the line) and a difference value decoded from the bitstream | |
5913 packet. | |
5914 | |
5915 | |
5916 | |
5917 </li> | |
5918 <li class="itemize">floor computation produces two new line segments, one running from x˙0,y˙0 to | |
5919 x˙new,y˙new and from x˙new,y˙new to x˙1,y˙1. This step is performed logically even if | |
5920 y˙new represents no change to the amplitude value at x˙new so that later refinement | |
5921 is additionally bounded at x˙new. | |
5922 </li> | |
5923 <li class="itemize">the induction step repeats, using a list of x values specified in the codec setup header | |
5924 at floor 1 initialization time. Computation is completed at the end of the x value list. | |
5925 </li></ul> | |
5926 <!--l. 48--><p class="noindent" >Consider the following example, with values chosen for ease of understanding rather than | |
5927 representing typical configuration: | |
5928 <!--l. 51--><p class="noindent" >For the below example, we assume a floor setup with an [n] of 128. The list of selected X values | |
5929 in increasing order is 0,16,32,48,64,80,96,112 and 128. In list order, the values interleave as 0, | |
5930 128, 64, 32, 96, 16, 48, 80 and 112. The corresponding list-order Y values as decoded from an | |
5931 example packet are 110, 20, -5, -45, 0, -25, -10, 30 and -10. We compute the floor in the following | |
5932 way, beginning with the first line: | |
5933 <div class="center" | |
5934 > | |
5935 <!--l. 59--><p class="noindent" > | |
5936 | |
5937 <!--l. 60--><p class="noindent" ><img | |
5938 src="floor1-1.png" alt="PIC" | |
5939 > | |
5940 <br /> <div class="caption" | |
5941 ><span class="id">Figure 7: </span><span | |
5942 class="content">graph of example floor</span></div><!--tex4ht:label?: x1-980017 --> | |
5943 </div> | |
5944 <!--l. 64--><p class="noindent" >We now draw new logical lines to reflect the correction to new˙Y, and iterate for X positions 32 | |
5945 and 96: | |
5946 <div class="center" | |
5947 > | |
5948 <!--l. 67--><p class="noindent" > | |
5949 | |
5950 <!--l. 68--><p class="noindent" ><img | |
5951 src="floor1-2.png" alt="PIC" | |
5952 > | |
5953 <br /> <div class="caption" | |
5954 ><span class="id">Figure 8: </span><span | |
5955 class="content">graph of example floor</span></div><!--tex4ht:label?: x1-980028 --> | |
5956 </div> | |
5957 <!--l. 72--><p class="noindent" >Although the new Y value at X position 96 is unchanged, it is still used later as an endpoint for | |
5958 further refinement. From here on, the pattern should be clear; we complete the floor computation | |
5959 as follows: | |
5960 | |
5961 | |
5962 | |
5963 <div class="center" | |
5964 > | |
5965 <!--l. 76--><p class="noindent" > | |
5966 | |
5967 <!--l. 77--><p class="noindent" ><img | |
5968 src="floor1-3.png" alt="PIC" | |
5969 > | |
5970 <br /> <div class="caption" | |
5971 ><span class="id">Figure 9: </span><span | |
5972 class="content">graph of example floor</span></div><!--tex4ht:label?: x1-980039 --> | |
5973 </div> | |
5974 <div class="center" | |
5975 > | |
5976 <!--l. 81--><p class="noindent" > | |
5977 | |
5978 <!--l. 82--><p class="noindent" ><img | |
5979 src="floor1-4.png" alt="PIC" | |
5980 > | |
5981 <br /> <div class="caption" | |
5982 ><span class="id">Figure 10: </span><span | |
5983 class="content">graph of example floor</span></div><!--tex4ht:label?: x1-9800410 --> | |
5984 </div> | |
5985 <!--l. 86--><p class="noindent" >A more efficient algorithm with carefully defined integer rounding behavior is used for actual | |
5986 decode, as described later. The actual algorithm splits Y value computation and line plotting | |
5987 into two steps with modifications to the above algorithm to eliminate noise accumulation | |
5988 through integer roundoff/truncation. | |
5989 <!--l. 94--><p class="noindent" > | |
5990 <h5 class="subsubsectionHead"><span class="titlemark">7.2.2. </span> <a | |
5991 id="x1-990007.2.2"></a>header decode</h5> | |
5992 <!--l. 96--><p class="noindent" >A list of floor X values is stored in the packet header in interleaved format (used in list order | |
5993 during packet decode and synthesis). This list is split into partitions, and each partition is | |
5994 assigned to a partition class. X positions 0 and [n] are implicit and do not belong to an explicit | |
5995 partition or partition class. | |
5996 <!--l. 102--><p class="noindent" >A partition class consists of a representation vector width (the number of Y values which | |
5997 the partition class encodes at once), a ’subclass’ value representing the number of | |
5998 alternate entropy books the partition class may use in representing Y values, the list of | |
5999 [subclass] books and a master book used to encode which alternate books were chosen | |
6000 for representation in a given packet. The master/subclass mechanism is meant to be | |
6001 used as a flexible representation cascade while still using codebooks only in a scalar | |
6002 context. | |
6003 | |
6004 | |
6005 | |
6006 <!--l. 112--><p class="noindent" > | |
6007 <div class="fancyvrb" id="fancyvrb28"> | |
6008 <a | |
6009 id="x1-99002r1"></a><span | |
6010 class="cmr-6">1</span><span | |
6011 class="cmtt-8"> </span><span | |
6012 class="cmtt-8"> </span> | |
6013 <br class="fancyvrb" /><a | |
6014 id="x1-99004r2"></a><span | |
6015 class="cmr-6">2</span><span | |
6016 class="cmtt-8"> </span><span | |
6017 class="cmtt-8"> </span><span | |
6018 class="cmtt-8"> </span><span | |
6019 class="cmtt-8"> 1)</span><span | |
6020 class="cmtt-8"> [floor1_partitions]</span><span | |
6021 class="cmtt-8"> =</span><span | |
6022 class="cmtt-8"> read</span><span | |
6023 class="cmtt-8"> 5</span><span | |
6024 class="cmtt-8"> bits</span><span | |
6025 class="cmtt-8"> as</span><span | |
6026 class="cmtt-8"> unsigned</span><span | |
6027 class="cmtt-8"> integer</span> | |
6028 <br class="fancyvrb" /><a | |
6029 id="x1-99006r3"></a><span | |
6030 class="cmr-6">3</span><span | |
6031 class="cmtt-8"> </span><span | |
6032 class="cmtt-8"> </span><span | |
6033 class="cmtt-8"> </span><span | |
6034 class="cmtt-8"> 2)</span><span | |
6035 class="cmtt-8"> [maximum_class]</span><span | |
6036 class="cmtt-8"> =</span><span | |
6037 class="cmtt-8"> -1</span> | |
6038 <br class="fancyvrb" /><a | |
6039 id="x1-99008r4"></a><span | |
6040 class="cmr-6">4</span><span | |
6041 class="cmtt-8"> </span><span | |
6042 class="cmtt-8"> </span><span | |
6043 class="cmtt-8"> </span><span | |
6044 class="cmtt-8"> 3)</span><span | |
6045 class="cmtt-8"> iterate</span><span | |
6046 class="cmtt-8"> [i]</span><span | |
6047 class="cmtt-8"> over</span><span | |
6048 class="cmtt-8"> the</span><span | |
6049 class="cmtt-8"> range</span><span | |
6050 class="cmtt-8"> 0</span><span | |
6051 class="cmtt-8"> ...</span><span | |
6052 class="cmtt-8"> [floor1_partitions]-1</span><span | |
6053 class="cmtt-8"> </span><span | |
6054 class="cmsy-8">{</span> | |
6055 <br class="fancyvrb" /><a | |
6056 id="x1-99010r5"></a><span | |
6057 class="cmr-6">5</span><span | |
6058 class="cmtt-8"> </span><span | |
6059 class="cmtt-8"> </span> | |
6060 <br class="fancyvrb" /><a | |
6061 id="x1-99012r6"></a><span | |
6062 class="cmr-6">6</span><span | |
6063 class="cmtt-8"> </span><span | |
6064 class="cmtt-8"> </span><span | |
6065 class="cmtt-8"> </span><span | |
6066 class="cmtt-8"> </span><span | |
6067 class="cmtt-8"> </span><span | |
6068 class="cmtt-8"> </span><span | |
6069 class="cmtt-8"> </span><span | |
6070 class="cmtt-8"> </span><span | |
6071 class="cmtt-8"> </span><span | |
6072 class="cmtt-8"> 4)</span><span | |
6073 class="cmtt-8"> vector</span><span | |
6074 class="cmtt-8"> [floor1_partition_class_list]</span><span | |
6075 class="cmtt-8"> element</span><span | |
6076 class="cmtt-8"> [i]</span><span | |
6077 class="cmtt-8"> =</span><span | |
6078 class="cmtt-8"> read</span><span | |
6079 class="cmtt-8"> 4</span><span | |
6080 class="cmtt-8"> bits</span><span | |
6081 class="cmtt-8"> as</span><span | |
6082 class="cmtt-8"> unsigned</span><span | |
6083 class="cmtt-8"> integer</span> | |
6084 <br class="fancyvrb" /><a | |
6085 id="x1-99014r7"></a><span | |
6086 class="cmr-6">7</span><span | |
6087 class="cmtt-8"> </span><span | |
6088 class="cmtt-8"> </span> | |
6089 <br class="fancyvrb" /><a | |
6090 id="x1-99016r8"></a><span | |
6091 class="cmr-6">8</span><span | |
6092 class="cmtt-8"> </span><span | |
6093 class="cmtt-8"> </span><span | |
6094 class="cmtt-8"> </span><span | |
6095 class="cmtt-8"> </span><span | |
6096 class="cmtt-8"> </span><span | |
6097 class="cmtt-8"> </span><span | |
6098 class="cmtt-8"> </span><span | |
6099 class="cmsy-8">}</span> | |
6100 <br class="fancyvrb" /><a | |
6101 id="x1-99018r9"></a><span | |
6102 class="cmr-6">9</span><span | |
6103 class="cmtt-8"> </span><span | |
6104 class="cmtt-8"> </span> | |
6105 <br class="fancyvrb" /><a | |
6106 id="x1-99020r10"></a><span | |
6107 class="cmr-6">10</span><span | |
6108 class="cmtt-8"> </span><span | |
6109 class="cmtt-8"> </span><span | |
6110 class="cmtt-8"> </span><span | |
6111 class="cmtt-8"> 5)</span><span | |
6112 class="cmtt-8"> [maximum_class]</span><span | |
6113 class="cmtt-8"> =</span><span | |
6114 class="cmtt-8"> largest</span><span | |
6115 class="cmtt-8"> integer</span><span | |
6116 class="cmtt-8"> scalar</span><span | |
6117 class="cmtt-8"> value</span><span | |
6118 class="cmtt-8"> in</span><span | |
6119 class="cmtt-8"> vector</span><span | |
6120 class="cmtt-8"> [floor1_partition_class_list]</span> | |
6121 <br class="fancyvrb" /><a | |
6122 id="x1-99022r11"></a><span | |
6123 class="cmr-6">11</span><span | |
6124 class="cmtt-8"> </span><span | |
6125 class="cmtt-8"> </span><span | |
6126 class="cmtt-8"> </span><span | |
6127 class="cmtt-8"> 6)</span><span | |
6128 class="cmtt-8"> iterate</span><span | |
6129 class="cmtt-8"> [i]</span><span | |
6130 class="cmtt-8"> over</span><span | |
6131 class="cmtt-8"> the</span><span | |
6132 class="cmtt-8"> range</span><span | |
6133 class="cmtt-8"> 0</span><span | |
6134 class="cmtt-8"> ...</span><span | |
6135 class="cmtt-8"> [maximum_class]</span><span | |
6136 class="cmtt-8"> </span><span | |
6137 class="cmsy-8">{</span> | |
6138 <br class="fancyvrb" /><a | |
6139 id="x1-99024r12"></a><span | |
6140 class="cmr-6">12</span><span | |
6141 class="cmtt-8"> </span><span | |
6142 class="cmtt-8"> </span> | |
6143 <br class="fancyvrb" /><a | |
6144 id="x1-99026r13"></a><span | |
6145 class="cmr-6">13</span><span | |
6146 class="cmtt-8"> </span><span | |
6147 class="cmtt-8"> </span><span | |
6148 class="cmtt-8"> </span><span | |
6149 class="cmtt-8"> </span><span | |
6150 class="cmtt-8"> </span><span | |
6151 class="cmtt-8"> </span><span | |
6152 class="cmtt-8"> </span><span | |
6153 class="cmtt-8"> </span><span | |
6154 class="cmtt-8"> </span><span | |
6155 class="cmtt-8"> 7)</span><span | |
6156 class="cmtt-8"> vector</span><span | |
6157 class="cmtt-8"> [floor1_class_dimensions]</span><span | |
6158 class="cmtt-8"> element</span><span | |
6159 class="cmtt-8"> [i]</span><span | |
6160 class="cmtt-8"> =</span><span | |
6161 class="cmtt-8"> read</span><span | |
6162 class="cmtt-8"> 3</span><span | |
6163 class="cmtt-8"> bits</span><span | |
6164 class="cmtt-8"> as</span><span | |
6165 class="cmtt-8"> unsigned</span><span | |
6166 class="cmtt-8"> integer</span><span | |
6167 class="cmtt-8"> and</span><span | |
6168 class="cmtt-8"> add</span><span | |
6169 class="cmtt-8"> 1</span> | |
6170 <br class="fancyvrb" /><a | |
6171 id="x1-99028r14"></a><span | |
6172 class="cmr-6">14</span><span | |
6173 class="cmtt-8"> </span><span | |
6174 class="cmtt-8">  8)</span><span | |
6175 class="cmtt-8"> vector</span><span | |
6176 class="cmtt-8"> [floor1_class_subclasses]</span><span | |
6177 class="cmtt-8"> element</span><span | |
6178 class="cmtt-8"> [i]</span><span | |
6179 class="cmtt-8"> =</span><span | |
6180 class="cmtt-8"> read</span><span | |
6181 class="cmtt-8"> 2</span><span | |
6182 class="cmtt-8"> bits</span><span | |
6183 class="cmtt-8"> as</span><span | |
6184 class="cmtt-8"> unsigned</span><span | |
6185 class="cmtt-8"> integer</span> | |
6186 <br class="fancyvrb" /><a | |
6187 id="x1-99030r15"></a><span | |
6188 class="cmr-6">15</span><span | |
6189 class="cmtt-8"> </span><span | |
6190 class="cmtt-8"> </span><span | |
6191 class="cmtt-8"> </span><span | |
6192 class="cmtt-8"> </span><span | |
6193 class="cmtt-8"> </span><span | |
6194 class="cmtt-8"> </span><span | |
6195 class="cmtt-8"> </span><span | |
6196 class="cmtt-8"> </span><span | |
6197 class="cmtt-8"> </span><span | |
6198 class="cmtt-8"> 9)</span><span | |
6199 class="cmtt-8"> if</span><span | |
6200 class="cmtt-8"> (</span><span | |
6201 class="cmtt-8"> vector</span><span | |
6202 class="cmtt-8"> [floor1_class_subclasses]</span><span | |
6203 class="cmtt-8"> element</span><span | |
6204 class="cmtt-8"> [i]</span><span | |
6205 class="cmtt-8"> is</span><span | |
6206 class="cmtt-8"> nonzero</span><span | |
6207 class="cmtt-8"> )</span><span | |
6208 class="cmtt-8"> </span><span | |
6209 class="cmsy-8">{</span> | |
6210 <br class="fancyvrb" /><a | |
6211 id="x1-99032r16"></a><span | |
6212 class="cmr-6">16</span><span | |
6213 class="cmtt-8"> </span><span | |
6214 class="cmtt-8"> </span> | |
6215 <br class="fancyvrb" /><a | |
6216 id="x1-99034r17"></a><span | |
6217 class="cmr-6">17</span><span | |
6218 class="cmtt-8"> </span><span | |
6219 class="cmtt-8"> </span><span | |
6220 class="cmtt-8"> </span><span | |
6221 class="cmtt-8"> </span><span | |
6222 class="cmtt-8"> </span><span | |
6223 class="cmtt-8"> </span><span | |
6224 class="cmtt-8"> </span><span | |
6225 class="cmtt-8"> </span><span | |
6226 class="cmtt-8"> </span><span | |
6227 class="cmtt-8"> </span><span | |
6228 class="cmtt-8"> </span><span | |
6229 class="cmtt-8"> </span><span | |
6230 class="cmtt-8"> </span><span | |
6231 class="cmtt-8"> </span><span | |
6232 class="cmtt-8"> 10)</span><span | |
6233 class="cmtt-8"> vector</span><span | |
6234 class="cmtt-8"> [floor1_class_masterbooks]</span><span | |
6235 class="cmtt-8"> element</span><span | |
6236 class="cmtt-8"> [i]</span><span | |
6237 class="cmtt-8"> =</span><span | |
6238 class="cmtt-8"> read</span><span | |
6239 class="cmtt-8"> 8</span><span | |
6240 class="cmtt-8"> bits</span><span | |
6241 class="cmtt-8"> as</span><span | |
6242 class="cmtt-8"> unsigned</span><span | |
6243 class="cmtt-8"> integer</span> | |
6244 <br class="fancyvrb" /><a | |
6245 id="x1-99036r18"></a><span | |
6246 class="cmr-6">18</span><span | |
6247 class="cmtt-8"> </span><span | |
6248 class="cmtt-8"> </span> | |
6249 <br class="fancyvrb" /><a | |
6250 id="x1-99038r19"></a><span | |
6251 class="cmr-6">19</span><span | |
6252 class="cmtt-8"> </span><span | |
6253 class="cmtt-8"> </span><span | |
6254 class="cmtt-8"> </span><span | |
6255 class="cmtt-8"> </span><span | |
6256 class="cmtt-8"> </span><span | |
6257 class="cmtt-8"> </span><span | |
6258 class="cmtt-8"> </span><span | |
6259 class="cmtt-8"> </span><span | |
6260 class="cmtt-8"> </span><span | |
6261 class="cmtt-8"> </span><span | |
6262 class="cmtt-8"> </span><span | |
6263 class="cmtt-8"> </span><span | |
6264 class="cmtt-8"> </span><span | |
6265 class="cmsy-8">}</span> | |
6266 <br class="fancyvrb" /><a | |
6267 id="x1-99040r20"></a><span | |
6268 class="cmr-6">20</span><span | |
6269 class="cmtt-8"> </span><span | |
6270 class="cmtt-8"> </span> | |
6271 <br class="fancyvrb" /><a | |
6272 id="x1-99042r21"></a><span | |
6273 class="cmr-6">21</span><span | |
6274 class="cmtt-8"> </span><span | |
6275 class="cmtt-8"> </span><span | |
6276 class="cmtt-8"> </span><span | |
6277 class="cmtt-8"> </span><span | |
6278 class="cmtt-8"> </span><span | |
6279 class="cmtt-8"> </span><span | |
6280 class="cmtt-8"> </span><span | |
6281 class="cmtt-8"> </span><span | |
6282 class="cmtt-8"> 11)</span><span | |
6283 class="cmtt-8"> iterate</span><span | |
6284 class="cmtt-8"> [j]</span><span | |
6285 class="cmtt-8"> over</span><span | |
6286 class="cmtt-8"> the</span><span | |
6287 class="cmtt-8"> range</span><span | |
6288 class="cmtt-8"> 0</span><span | |
6289 class="cmtt-8"> ...</span><span | |
6290 class="cmtt-8"> (2</span><span | |
6291 class="cmtt-8"> exponent</span><span | |
6292 class="cmtt-8"> [floor1_class_subclasses]</span><span | |
6293 class="cmtt-8"> element</span><span | |
6294 class="cmtt-8"> [i])</span><span | |
6295 class="cmtt-8"> -</span><span | |
6296 class="cmtt-8"> 1</span><span | |
6297 class="cmtt-8"> </span><span | |
6298 class="cmsy-8">{</span> | |
6299 <br class="fancyvrb" /><a | |
6300 id="x1-99044r22"></a><span | |
6301 class="cmr-6">22</span><span | |
6302 class="cmtt-8"> </span><span | |
6303 class="cmtt-8"> </span> | |
6304 <br class="fancyvrb" /><a | |
6305 id="x1-99046r23"></a><span | |
6306 class="cmr-6">23</span><span | |
6307 class="cmtt-8"> </span><span | |
6308 class="cmtt-8"> </span><span | |
6309 class="cmtt-8"> </span><span | |
6310 class="cmtt-8"> </span><span | |
6311 class="cmtt-8"> </span><span | |
6312 class="cmtt-8"> </span><span | |
6313 class="cmtt-8"> </span><span | |
6314 class="cmtt-8"> </span><span | |
6315 class="cmtt-8"> </span><span | |
6316 class="cmtt-8"> </span><span | |
6317 class="cmtt-8"> </span><span | |
6318 class="cmtt-8"> </span><span | |
6319 class="cmtt-8"> </span><span | |
6320 class="cmtt-8"> </span><span | |
6321 class="cmtt-8"> 12)</span><span | |
6322 class="cmtt-8"> array</span><span | |
6323 class="cmtt-8"> [floor1_subclass_books]</span><span | |
6324 class="cmtt-8"> element</span><span | |
6325 class="cmtt-8"> [i],[j]</span><span | |
6326 class="cmtt-8"> =</span> | |
6327 <br class="fancyvrb" /><a | |
6328 id="x1-99048r24"></a><span | |
6329 class="cmr-6">24</span><span | |
6330 class="cmtt-8"> </span><span | |
6331 class="cmtt-8"> </span><span | |
6332 class="cmtt-8"> </span><span | |
6333 class="cmtt-8"> </span><span | |
6334 class="cmtt-8"> </span><span | |
6335 class="cmtt-8"> </span><span | |
6336 class="cmtt-8"> </span><span | |
6337 class="cmtt-8"> </span><span | |
6338 class="cmtt-8"> </span><span | |
6339 class="cmtt-8"> </span><span | |
6340 class="cmtt-8"> </span><span | |
6341 class="cmtt-8"> </span><span | |
6342 class="cmtt-8"> </span><span | |
6343 class="cmtt-8"> </span><span | |
6344 class="cmtt-8"> </span><span | |
6345 class="cmtt-8"> </span><span | |
6346 class="cmtt-8"> </span><span | |
6347 class="cmtt-8"> </span><span | |
6348 class="cmtt-8"> read</span><span | |
6349 class="cmtt-8"> 8</span><span | |
6350 class="cmtt-8"> bits</span><span | |
6351 class="cmtt-8"> as</span><span | |
6352 class="cmtt-8"> unsigned</span><span | |
6353 class="cmtt-8"> integer</span><span | |
6354 class="cmtt-8"> and</span><span | |
6355 class="cmtt-8"> subtract</span><span | |
6356 class="cmtt-8"> one</span> | |
6357 <br class="fancyvrb" /><a | |
6358 id="x1-99050r25"></a><span | |
6359 class="cmr-6">25</span><span | |
6360 class="cmtt-8"> </span><span | |
6361 class="cmtt-8"> </span><span | |
6362 class="cmtt-8"> </span><span | |
6363 class="cmtt-8"> </span><span | |
6364 class="cmtt-8"> </span><span | |
6365 class="cmtt-8"> </span><span | |
6366 class="cmtt-8"> </span><span | |
6367 class="cmtt-8"> </span><span | |
6368 class="cmtt-8"> </span><span | |
6369 class="cmtt-8"> </span><span | |
6370 class="cmtt-8"> </span><span | |
6371 class="cmtt-8"> </span><span | |
6372 class="cmtt-8"> </span><span | |
6373 class="cmsy-8">}</span> | |
6374 <br class="fancyvrb" /><a | |
6375 id="x1-99052r26"></a><span | |
6376 class="cmr-6">26</span><span | |
6377 class="cmtt-8"> </span><span | |
6378 class="cmtt-8"> </span><span | |
6379 class="cmtt-8"> </span><span | |
6380 class="cmtt-8"> </span><span | |
6381 class="cmtt-8"> </span><span | |
6382 class="cmtt-8"> </span><span | |
6383 class="cmtt-8"> </span><span | |
6384 class="cmtt-8"> </span><span | |
6385 class="cmsy-8">}</span> | |
6386 <br class="fancyvrb" /><a | |
6387 id="x1-99054r27"></a><span | |
6388 class="cmr-6">27</span><span | |
6389 class="cmtt-8"> </span><span | |
6390 class="cmtt-8"> </span> | |
6391 <br class="fancyvrb" /><a | |
6392 id="x1-99056r28"></a><span | |
6393 class="cmr-6">28</span><span | |
6394 class="cmtt-8"> </span><span | |
6395 class="cmtt-8"> </span><span | |
6396 class="cmtt-8"> 13)</span><span | |
6397 class="cmtt-8"> [floor1_multiplier]</span><span | |
6398 class="cmtt-8"> =</span><span | |
6399 class="cmtt-8"> read</span><span | |
6400 class="cmtt-8"> 2</span><span | |
6401 class="cmtt-8"> bits</span><span | |
6402 class="cmtt-8"> as</span><span | |
6403 class="cmtt-8"> unsigned</span><span | |
6404 class="cmtt-8"> integer</span><span | |
6405 class="cmtt-8"> and</span><span | |
6406 class="cmtt-8"> add</span><span | |
6407 class="cmtt-8"> one</span> | |
6408 <br class="fancyvrb" /><a | |
6409 id="x1-99058r29"></a><span | |
6410 class="cmr-6">29</span><span | |
6411 class="cmtt-8"> </span><span | |
6412 class="cmtt-8"> </span><span | |
6413 class="cmtt-8"> 14)</span><span | |
6414 class="cmtt-8"> [rangebits]</span><span | |
6415 class="cmtt-8"> =</span><span | |
6416 class="cmtt-8"> read</span><span | |
6417 class="cmtt-8"> 4</span><span | |
6418 class="cmtt-8"> bits</span><span | |
6419 class="cmtt-8"> as</span><span | |
6420 class="cmtt-8"> unsigned</span><span | |
6421 class="cmtt-8"> integer</span> | |
6422 <br class="fancyvrb" /><a | |
6423 id="x1-99060r30"></a><span | |
6424 class="cmr-6">30</span><span | |
6425 class="cmtt-8"> </span><span | |
6426 class="cmtt-8"> </span><span | |
6427 class="cmtt-8"> 15)</span><span | |
6428 class="cmtt-8"> vector</span><span | |
6429 class="cmtt-8"> [floor1_X_list]</span><span | |
6430 class="cmtt-8"> element</span><span | |
6431 class="cmtt-8"> [0]</span><span | |
6432 class="cmtt-8"> =</span><span | |
6433 class="cmtt-8"> 0</span> | |
6434 <br class="fancyvrb" /><a | |
6435 id="x1-99062r31"></a><span | |
6436 class="cmr-6">31</span><span | |
6437 class="cmtt-8"> </span><span | |
6438 class="cmtt-8"> </span><span | |
6439 class="cmtt-8"> 16)</span><span | |
6440 class="cmtt-8"> vector</span><span | |
6441 class="cmtt-8"> [floor1_X_list]</span><span | |
6442 class="cmtt-8"> element</span><span | |
6443 class="cmtt-8"> [1]</span><span | |
6444 class="cmtt-8"> =</span><span | |
6445 class="cmtt-8"> 2</span><span | |
6446 class="cmtt-8"> exponent</span><span | |
6447 class="cmtt-8"> [rangebits];</span> | |
6448 <br class="fancyvrb" /><a | |
6449 id="x1-99064r32"></a><span | |
6450 class="cmr-6">32</span><span | |
6451 class="cmtt-8"> </span><span | |
6452 class="cmtt-8"> </span><span | |
6453 class="cmtt-8"> 17)</span><span | |
6454 class="cmtt-8"> [floor1_values]</span><span | |
6455 class="cmtt-8"> =</span><span | |
6456 class="cmtt-8"> 2</span> | |
6457 <br class="fancyvrb" /><a | |
6458 id="x1-99066r33"></a><span | |
6459 class="cmr-6">33</span><span | |
6460 class="cmtt-8"> </span><span | |
6461 class="cmtt-8"> </span><span | |
6462 class="cmtt-8"> 18)</span><span | |
6463 class="cmtt-8"> iterate</span><span | |
6464 class="cmtt-8"> [i]</span><span | |
6465 class="cmtt-8"> over</span><span | |
6466 class="cmtt-8"> the</span><span | |
6467 class="cmtt-8"> range</span><span | |
6468 class="cmtt-8"> 0</span><span | |
6469 class="cmtt-8"> ...</span><span | |
6470 class="cmtt-8"> [floor1_partitions]-1</span><span | |
6471 class="cmtt-8"> </span><span | |
6472 class="cmsy-8">{</span> | |
6473 <br class="fancyvrb" /><a | |
6474 id="x1-99068r34"></a><span | |
6475 class="cmr-6">34</span><span | |
6476 class="cmtt-8"> </span><span | |
6477 class="cmtt-8"> </span> | |
6478 <br class="fancyvrb" /><a | |
6479 id="x1-99070r35"></a><span | |
6480 class="cmr-6">35</span><span | |
6481 class="cmtt-8"> </span><span | |
6482 class="cmtt-8"> </span><span | |
6483 class="cmtt-8"> </span><span | |
6484 class="cmtt-8"> </span><span | |
6485 class="cmtt-8"> </span><span | |
6486 class="cmtt-8"> </span><span | |
6487 class="cmtt-8"> </span><span | |
6488 class="cmtt-8"> </span><span | |
6489 class="cmtt-8"> 19)</span><span | |
6490 class="cmtt-8"> [current_class_number]</span><span | |
6491 class="cmtt-8"> =</span><span | |
6492 class="cmtt-8"> vector</span><span | |
6493 class="cmtt-8"> [floor1_partition_class_list]</span><span | |
6494 class="cmtt-8"> element</span><span | |
6495 class="cmtt-8"> [i]</span> | |
6496 <br class="fancyvrb" /><a | |
6497 id="x1-99072r36"></a><span | |
6498 class="cmr-6">36</span><span | |
6499 class="cmtt-8"> </span><span | |
6500 class="cmtt-8"> </span><span | |
6501 class="cmtt-8"> </span><span | |
6502 class="cmtt-8"> </span><span | |
6503 class="cmtt-8"> </span><span | |
6504 class="cmtt-8"> </span><span | |
6505 class="cmtt-8"> </span><span | |
6506 class="cmtt-8"> </span><span | |
6507 class="cmtt-8"> 20)</span><span | |
6508 class="cmtt-8"> iterate</span><span | |
6509 class="cmtt-8"> [j]</span><span | |
6510 class="cmtt-8"> over</span><span | |
6511 class="cmtt-8"> the</span><span | |
6512 class="cmtt-8"> range</span><span | |
6513 class="cmtt-8"> 0</span><span | |
6514 class="cmtt-8"> ...</span><span | |
6515 class="cmtt-8"> ([floor1_class_dimensions]</span><span | |
6516 class="cmtt-8"> element</span><span | |
6517 class="cmtt-8"> [current_class_number])-1</span><span | |
6518 class="cmtt-8"> </span><span | |
6519 class="cmsy-8">{</span> | |
6520 <br class="fancyvrb" /><a | |
6521 id="x1-99074r37"></a><span | |
6522 class="cmr-6">37</span><span | |
6523 class="cmtt-8"> </span><span | |
6524 class="cmtt-8"> </span><span | |
6525 class="cmtt-8"> </span><span | |
6526 class="cmtt-8"> </span><span | |
6527 class="cmtt-8"> </span><span | |
6528 class="cmtt-8"> </span><span | |
6529 class="cmtt-8"> </span><span | |
6530 class="cmtt-8"> </span><span | |
6531 class="cmtt-8"> </span><span | |
6532 class="cmtt-8"> </span><span | |
6533 class="cmtt-8"> </span><span | |
6534 class="cmtt-8"> </span><span | |
6535 class="cmtt-8"> </span><span | |
6536 class="cmtt-8"> </span><span | |
6537 class="cmtt-8"> 21)</span><span | |
6538 class="cmtt-8"> vector</span><span | |
6539 class="cmtt-8"> [floor1_X_list]</span><span | |
6540 class="cmtt-8"> element</span><span | |
6541 class="cmtt-8"> ([floor1_values])</span><span | |
6542 class="cmtt-8"> =</span> | |
6543 <br class="fancyvrb" /><a | |
6544 id="x1-99076r38"></a><span | |
6545 class="cmr-6">38</span><span | |
6546 class="cmtt-8"> </span><span | |
6547 class="cmtt-8"> </span><span | |
6548 class="cmtt-8"> </span><span | |
6549 class="cmtt-8"> </span><span | |
6550 class="cmtt-8"> </span><span | |
6551 class="cmtt-8"> </span><span | |
6552 class="cmtt-8"> </span><span | |
6553 class="cmtt-8"> </span><span | |
6554 class="cmtt-8"> </span><span | |
6555 class="cmtt-8"> </span><span | |
6556 class="cmtt-8"> </span><span | |
6557 class="cmtt-8"> </span><span | |
6558 class="cmtt-8"> </span><span | |
6559 class="cmtt-8"> </span><span | |
6560 class="cmtt-8"> </span><span | |
6561 class="cmtt-8"> </span><span | |
6562 class="cmtt-8"> </span><span | |
6563 class="cmtt-8"> </span><span | |
6564 class="cmtt-8"> read</span><span | |
6565 class="cmtt-8"> [rangebits]</span><span | |
6566 class="cmtt-8"> bits</span><span | |
6567 class="cmtt-8"> as</span><span | |
6568 class="cmtt-8"> unsigned</span><span | |
6569 class="cmtt-8"> integer</span> | |
6570 <br class="fancyvrb" /><a | |
6571 id="x1-99078r39"></a><span | |
6572 class="cmr-6">39</span><span | |
6573 class="cmtt-8"> </span><span | |
6574 class="cmtt-8"> </span><span | |
6575 class="cmtt-8"> </span><span | |
6576 class="cmtt-8"> </span><span | |
6577 class="cmtt-8"> </span><span | |
6578 class="cmtt-8"> </span><span | |
6579 class="cmtt-8"> </span><span | |
6580 class="cmtt-8"> </span><span | |
6581 class="cmtt-8"> </span><span | |
6582 class="cmtt-8"> </span><span | |
6583 class="cmtt-8"> </span><span | |
6584 class="cmtt-8"> </span><span | |
6585 class="cmtt-8"> </span><span | |
6586 class="cmtt-8"> </span><span | |
6587 class="cmtt-8"> 22)</span><span | |
6588 class="cmtt-8"> increment</span><span | |
6589 class="cmtt-8"> [floor1_values]</span><span | |
6590 class="cmtt-8"> by</span><span | |
6591 class="cmtt-8"> one</span> | |
6592 <br class="fancyvrb" /><a | |
6593 id="x1-99080r40"></a><span | |
6594 class="cmr-6">40</span><span | |
6595 class="cmtt-8"> </span><span | |
6596 class="cmtt-8"> </span><span | |
6597 class="cmtt-8"> </span><span | |
6598 class="cmtt-8"> </span><span | |
6599 class="cmtt-8"> </span><span | |
6600 class="cmtt-8"> </span><span | |
6601 class="cmtt-8"> </span><span | |
6602 class="cmtt-8"> </span><span | |
6603 class="cmtt-8"> </span><span | |
6604 class="cmtt-8"> </span><span | |
6605 class="cmtt-8"> </span><span | |
6606 class="cmtt-8"> </span><span | |
6607 class="cmtt-8"> </span><span | |
6608 class="cmsy-8">}</span> | |
6609 <br class="fancyvrb" /><a | |
6610 id="x1-99082r41"></a><span | |
6611 class="cmr-6">41</span><span | |
6612 class="cmtt-8"> </span><span | |
6613 class="cmtt-8"> </span><span | |
6614 class="cmtt-8"> </span><span | |
6615 class="cmtt-8"> </span><span | |
6616 class="cmtt-8"> </span><span | |
6617 class="cmtt-8"> </span><span | |
6618 class="cmtt-8"> </span><span | |
6619 class="cmsy-8">}</span> | |
6620 <br class="fancyvrb" /><a | |
6621 id="x1-99084r42"></a><span | |
6622 class="cmr-6">42</span><span | |
6623 class="cmtt-8"> </span><span | |
6624 class="cmtt-8"> </span> | |
6625 <br class="fancyvrb" /><a | |
6626 id="x1-99086r43"></a><span | |
6627 class="cmr-6">43</span><span | |
6628 class="cmtt-8"> </span><span | |
6629 class="cmtt-8"> </span><span | |
6630 class="cmtt-8"> 23)</span><span | |
6631 class="cmtt-8"> done</span> | |
6632 </div> | |
6633 <!--l. 158--><p class="noindent" >An end-of-packet condition while reading any aspect of a floor 1 configuration during | |
6634 setup renders a stream undecodable. In addition, a <span | |
6635 class="cmtt-12">[floor1_class_masterbooks] </span>or | |
6636 <span | |
6637 class="cmtt-12">[floor1_subclass_books] </span>scalar element greater than the highest numbered codebook | |
6638 configured in this stream is an error condition that renders the stream undecodable. Vector | |
6639 [floor1_x_list] is limited to a maximum length of 65 elements; a setup indicating more than 65 | |
6640 total elements (including elements 0 and 1 set prior to the read loop) renders the stream | |
6641 undecodable. All vector [floor1_x_list] element values must be unique within the vector; a | |
6642 non-unique value renders the stream undecodable. | |
6643 | |
6644 | |
6645 | |
6646 <!--l. 170--><p class="noindent" > | |
6647 <h5 class="subsubsectionHead"><span class="titlemark">7.2.3. </span> <a | |
6648 id="x1-1000007.2.3"></a>packet decode</h5> | |
6649 <!--l. 172--><p class="noindent" >Packet decode begins by checking the <span | |
6650 class="cmtt-12">[nonzero] </span>flag: | |
6651 <!--l. 174--><p class="noindent" > | |
6652 <div class="fancyvrb" id="fancyvrb29"> | |
6653 <a | |
6654 id="x1-100002r1"></a><span | |
6655 class="cmr-6">1</span><span | |
6656 class="cmtt-8"> </span><span | |
6657 class="cmtt-8"> </span><span | |
6658 class="cmtt-8"> </span><span | |
6659 class="cmtt-8"> 1)</span><span | |
6660 class="cmtt-8"> [nonzero]</span><span | |
6661 class="cmtt-8"> =</span><span | |
6662 class="cmtt-8"> read</span><span | |
6663 class="cmtt-8"> 1</span><span | |
6664 class="cmtt-8"> bit</span><span | |
6665 class="cmtt-8"> as</span><span | |
6666 class="cmtt-8"> boolean</span> | |
6667 </div> | |
6668 <!--l. 178--><p class="noindent" >If <span | |
6669 class="cmtt-12">[nonzero] </span>is unset, that indicates this channel contained no audio energy in this frame. | |
6670 Decode immediately returns a status indicating this floor curve (and thus this channel) is unused | |
6671 this frame. (A return status of ’unused’ is different from decoding a floor that has all | |
6672 points set to minimum representation amplitude, which happens to be approximately | |
6673 -140dB). | |
6674 <!--l. 186--><p class="noindent" >Assuming <span | |
6675 class="cmtt-12">[nonzero] </span>is set, decode proceeds as follows: | |
6676 <!--l. 188--><p class="noindent" > | |
6677 <div class="fancyvrb" id="fancyvrb30"> | |
6678 <a | |
6679 id="x1-100004r1"></a><span | |
6680 class="cmr-6">1</span><span | |
6681 class="cmtt-8"> </span><span | |
6682 class="cmtt-8"> </span><span | |
6683 class="cmtt-8"> </span><span | |
6684 class="cmtt-8"> 1)</span><span | |
6685 class="cmtt-8"> [range]</span><span | |
6686 class="cmtt-8"> =</span><span | |
6687 class="cmtt-8"> vector</span><span | |
6688 class="cmtt-8"> </span><span | |
6689 class="cmsy-8">{</span><span | |
6690 class="cmtt-8"> 256,</span><span | |
6691 class="cmtt-8"> 128,</span><span | |
6692 class="cmtt-8"> 86,</span><span | |
6693 class="cmtt-8"> 64</span><span | |
6694 class="cmtt-8"> </span><span | |
6695 class="cmsy-8">}</span><span | |
6696 class="cmtt-8"> element</span><span | |
6697 class="cmtt-8"> ([floor1_multiplier]-1)</span> | |
6698 <br class="fancyvrb" /><a | |
6699 id="x1-100006r2"></a><span | |
6700 class="cmr-6">2</span><span | |
6701 class="cmtt-8"> </span><span | |
6702 class="cmtt-8"> </span><span | |
6703 class="cmtt-8"> </span><span | |
6704 class="cmtt-8"> 2)</span><span | |
6705 class="cmtt-8"> vector</span><span | |
6706 class="cmtt-8"> [floor1_Y]</span><span | |
6707 class="cmtt-8"> element</span><span | |
6708 class="cmtt-8"> [0]</span><span | |
6709 class="cmtt-8"> =</span><span | |
6710 class="cmtt-8"> read</span><span | |
6711 class="cmtt-8"> </span><a | |
6712 href="#x1-1170009.2.1"><span | |
6713 class="cmtt-8">ilog</span></a><span | |
6714 class="cmtt-8">([range]-1)</span><span | |
6715 class="cmtt-8"> bits</span><span | |
6716 class="cmtt-8"> as</span><span | |
6717 class="cmtt-8"> unsigned</span><span | |
6718 class="cmtt-8"> integer</span> | |
6719 <br class="fancyvrb" /><a | |
6720 id="x1-100008r3"></a><span | |
6721 class="cmr-6">3</span><span | |
6722 class="cmtt-8"> </span><span | |
6723 class="cmtt-8"> </span><span | |
6724 class="cmtt-8"> </span><span | |
6725 class="cmtt-8"> 3)</span><span | |
6726 class="cmtt-8"> vector</span><span | |
6727 class="cmtt-8"> [floor1_Y]</span><span | |
6728 class="cmtt-8"> element</span><span | |
6729 class="cmtt-8"> [1]</span><span | |
6730 class="cmtt-8"> =</span><span | |
6731 class="cmtt-8"> read</span><span | |
6732 class="cmtt-8"> </span><a | |
6733 href="#x1-1170009.2.1"><span | |
6734 class="cmtt-8">ilog</span></a><span | |
6735 class="cmtt-8">([range]-1)</span><span | |
6736 class="cmtt-8"> bits</span><span | |
6737 class="cmtt-8"> as</span><span | |
6738 class="cmtt-8"> unsigned</span><span | |
6739 class="cmtt-8"> integer</span> | |
6740 <br class="fancyvrb" /><a | |
6741 id="x1-100010r4"></a><span | |
6742 class="cmr-6">4</span><span | |
6743 class="cmtt-8"> </span><span | |
6744 class="cmtt-8"> </span><span | |
6745 class="cmtt-8"> </span><span | |
6746 class="cmtt-8"> 4)</span><span | |
6747 class="cmtt-8"> [offset]</span><span | |
6748 class="cmtt-8"> =</span><span | |
6749 class="cmtt-8"> 2;</span> | |
6750 <br class="fancyvrb" /><a | |
6751 id="x1-100012r5"></a><span | |
6752 class="cmr-6">5</span><span | |
6753 class="cmtt-8"> </span><span | |
6754 class="cmtt-8"> </span><span | |
6755 class="cmtt-8"> </span><span | |
6756 class="cmtt-8"> 5)</span><span | |
6757 class="cmtt-8"> iterate</span><span | |
6758 class="cmtt-8"> [i]</span><span | |
6759 class="cmtt-8"> over</span><span | |
6760 class="cmtt-8"> the</span><span | |
6761 class="cmtt-8"> range</span><span | |
6762 class="cmtt-8"> 0</span><span | |
6763 class="cmtt-8"> ...</span><span | |
6764 class="cmtt-8"> [floor1_partitions]-1</span><span | |
6765 class="cmtt-8"> </span><span | |
6766 class="cmsy-8">{</span> | |
6767 <br class="fancyvrb" /><a | |
6768 id="x1-100014r6"></a><span | |
6769 class="cmr-6">6</span><span | |
6770 class="cmtt-8"> </span><span | |
6771 class="cmtt-8"> </span> | |
6772 <br class="fancyvrb" /><a | |
6773 id="x1-100016r7"></a><span | |
6774 class="cmr-6">7</span><span | |
6775 class="cmtt-8"> </span><span | |
6776 class="cmtt-8"> </span><span | |
6777 class="cmtt-8"> </span><span | |
6778 class="cmtt-8"> </span><span | |
6779 class="cmtt-8"> </span><span | |
6780 class="cmtt-8"> </span><span | |
6781 class="cmtt-8"> </span><span | |
6782 class="cmtt-8"> </span><span | |
6783 class="cmtt-8"> 6)</span><span | |
6784 class="cmtt-8"> [class]</span><span | |
6785 class="cmtt-8"> =</span><span | |
6786 class="cmtt-8"> vector</span><span | |
6787 class="cmtt-8"> [floor1_partition_class]</span><span | |
6788 class="cmtt-8"> </span><span | |
6789 class="cmtt-8"> element</span><span | |
6790 class="cmtt-8"> [i]</span> | |
6791 <br class="fancyvrb" /><a | |
6792 id="x1-100018r8"></a><span | |
6793 class="cmr-6">8</span><span | |
6794 class="cmtt-8"> </span><span | |
6795 class="cmtt-8"> </span><span | |
6796 class="cmtt-8"> </span><span | |
6797 class="cmtt-8"> </span><span | |
6798 class="cmtt-8"> </span><span | |
6799 class="cmtt-8"> </span><span | |
6800 class="cmtt-8"> </span><span | |
6801 class="cmtt-8"> </span><span | |
6802 class="cmtt-8"> 7)</span><span | |
6803 class="cmtt-8"> [cdim]</span><span | |
6804 class="cmtt-8"> </span><span | |
6805 class="cmtt-8"> =</span><span | |
6806 class="cmtt-8"> vector</span><span | |
6807 class="cmtt-8"> [floor1_class_dimensions]</span><span | |
6808 class="cmtt-8"> element</span><span | |
6809 class="cmtt-8"> [class]</span> | |
6810 <br class="fancyvrb" /><a | |
6811 id="x1-100020r9"></a><span | |
6812 class="cmr-6">9</span><span | |
6813 class="cmtt-8"> </span><span | |
6814 class="cmtt-8"> </span><span | |
6815 class="cmtt-8"> </span><span | |
6816 class="cmtt-8"> </span><span | |
6817 class="cmtt-8"> </span><span | |
6818 class="cmtt-8"> </span><span | |
6819 class="cmtt-8"> </span><span | |
6820 class="cmtt-8"> </span><span | |
6821 class="cmtt-8"> 8)</span><span | |
6822 class="cmtt-8"> [cbits]</span><span | |
6823 class="cmtt-8"> =</span><span | |
6824 class="cmtt-8"> vector</span><span | |
6825 class="cmtt-8"> [floor1_class_subclasses]</span><span | |
6826 class="cmtt-8"> element</span><span | |
6827 class="cmtt-8"> [class]</span> | |
6828 <br class="fancyvrb" /><a | |
6829 id="x1-100022r10"></a><span | |
6830 class="cmr-6">10</span><span | |
6831 class="cmtt-8"> </span><span | |
6832 class="cmtt-8"> </span><span | |
6833 class="cmtt-8"> </span><span | |
6834 class="cmtt-8"> </span><span | |
6835 class="cmtt-8"> </span><span | |
6836 class="cmtt-8"> </span><span | |
6837 class="cmtt-8"> </span><span | |
6838 class="cmtt-8"> </span><span | |
6839 class="cmtt-8"> 9)</span><span | |
6840 class="cmtt-8"> [csub]</span><span | |
6841 class="cmtt-8"> </span><span | |
6842 class="cmtt-8"> =</span><span | |
6843 class="cmtt-8"> (2</span><span | |
6844 class="cmtt-8"> exponent</span><span | |
6845 class="cmtt-8"> [cbits])-1</span> | |
6846 <br class="fancyvrb" /><a | |
6847 id="x1-100024r11"></a><span | |
6848 class="cmr-6">11</span><span | |
6849 class="cmtt-8"> </span><span | |
6850 class="cmtt-8"> </span><span | |
6851 class="cmtt-8"> </span><span | |
6852 class="cmtt-8"> </span><span | |
6853 class="cmtt-8"> </span><span | |
6854 class="cmtt-8"> </span><span | |
6855 class="cmtt-8"> </span><span | |
6856 class="cmtt-8"> 10)</span><span | |
6857 class="cmtt-8"> [cval]</span><span | |
6858 class="cmtt-8"> </span><span | |
6859 class="cmtt-8"> =</span><span | |
6860 class="cmtt-8"> 0</span> | |
6861 <br class="fancyvrb" /><a | |
6862 id="x1-100026r12"></a><span | |
6863 class="cmr-6">12</span><span | |
6864 class="cmtt-8"> </span><span | |
6865 class="cmtt-8"> </span><span | |
6866 class="cmtt-8"> </span><span | |
6867 class="cmtt-8"> </span><span | |
6868 class="cmtt-8"> </span><span | |
6869 class="cmtt-8"> </span><span | |
6870 class="cmtt-8"> </span><span | |
6871 class="cmtt-8"> 11)</span><span | |
6872 class="cmtt-8"> if</span><span | |
6873 class="cmtt-8"> (</span><span | |
6874 class="cmtt-8"> [cbits]</span><span | |
6875 class="cmtt-8"> is</span><span | |
6876 class="cmtt-8"> greater</span><span | |
6877 class="cmtt-8"> than</span><span | |
6878 class="cmtt-8"> zero</span><span | |
6879 class="cmtt-8"> )</span><span | |
6880 class="cmtt-8"> </span><span | |
6881 class="cmsy-8">{</span> | |
6882 <br class="fancyvrb" /><a | |
6883 id="x1-100028r13"></a><span | |
6884 class="cmr-6">13</span><span | |
6885 class="cmtt-8"> </span><span | |
6886 class="cmtt-8"> </span> | |
6887 <br class="fancyvrb" /><a | |
6888 id="x1-100030r14"></a><span | |
6889 class="cmr-6">14</span><span | |
6890 class="cmtt-8"> </span><span | |
6891 class="cmtt-8"> </span><span | |
6892 class="cmtt-8"> </span><span | |
6893 class="cmtt-8"> </span><span | |
6894 class="cmtt-8"> </span><span | |
6895 class="cmtt-8"> </span><span | |
6896 class="cmtt-8"> </span><span | |
6897 class="cmtt-8"> </span><span | |
6898 class="cmtt-8"> </span><span | |
6899 class="cmtt-8"> </span><span | |
6900 class="cmtt-8"> </span><span | |
6901 class="cmtt-8"> </span><span | |
6902 class="cmtt-8"> </span><span | |
6903 class="cmtt-8"> </span><span | |
6904 class="cmtt-8"> 12)</span><span | |
6905 class="cmtt-8"> [cval]</span><span | |
6906 class="cmtt-8"> =</span><span | |
6907 class="cmtt-8"> read</span><span | |
6908 class="cmtt-8"> from</span><span | |
6909 class="cmtt-8"> packet</span><span | |
6910 class="cmtt-8"> using</span><span | |
6911 class="cmtt-8"> codebook</span><span | |
6912 class="cmtt-8"> number</span> | |
6913 <br class="fancyvrb" /><a | |
6914 id="x1-100032r15"></a><span | |
6915 class="cmr-6">15</span><span | |
6916 class="cmtt-8"> </span><span | |
6917 class="cmtt-8"> </span><span | |
6918 class="cmtt-8"> </span><span | |
6919 class="cmtt-8"> </span><span | |
6920 class="cmtt-8"> </span><span | |
6921 class="cmtt-8"> </span><span | |
6922 class="cmtt-8"> </span><span | |
6923 class="cmtt-8"> </span><span | |
6924 class="cmtt-8"> </span><span | |
6925 class="cmtt-8"> </span><span | |
6926 class="cmtt-8"> </span><span | |
6927 class="cmtt-8"> </span><span | |
6928 class="cmtt-8"> </span><span | |
6929 class="cmtt-8"> </span><span | |
6930 class="cmtt-8"> </span><span | |
6931 class="cmtt-8"> </span><span | |
6932 class="cmtt-8"> </span><span | |
6933 class="cmtt-8"> </span><span | |
6934 class="cmtt-8"> (vector</span><span | |
6935 class="cmtt-8"> [floor1_class_masterbooks]</span><span | |
6936 class="cmtt-8"> element</span><span | |
6937 class="cmtt-8"> [class])</span><span | |
6938 class="cmtt-8"> in</span><span | |
6939 class="cmtt-8"> scalar</span><span | |
6940 class="cmtt-8"> context</span> | |
6941 <br class="fancyvrb" /><a | |
6942 id="x1-100034r16"></a><span | |
6943 class="cmr-6">16</span><span | |
6944 class="cmtt-8"> </span><span | |
6945 class="cmtt-8"> </span><span | |
6946 class="cmtt-8"> </span><span | |
6947 class="cmtt-8"> </span><span | |
6948 class="cmtt-8"> </span><span | |
6949 class="cmtt-8"> </span><span | |
6950 class="cmtt-8"> </span><span | |
6951 class="cmtt-8"> </span><span | |
6952 class="cmtt-8"> </span><span | |
6953 class="cmtt-8"> </span><span | |
6954 class="cmtt-8"> </span><span | |
6955 class="cmtt-8"> </span><span | |
6956 class="cmsy-8">}</span> | |
6957 <br class="fancyvrb" /><a | |
6958 id="x1-100036r17"></a><span | |
6959 class="cmr-6">17</span><span | |
6960 class="cmtt-8"> </span><span | |
6961 class="cmtt-8"> </span> | |
6962 <br class="fancyvrb" /><a | |
6963 id="x1-100038r18"></a><span | |
6964 class="cmr-6">18</span><span | |
6965 class="cmtt-8"> </span><span | |
6966 class="cmtt-8"> </span><span | |
6967 class="cmtt-8"> </span><span | |
6968 class="cmtt-8"> </span><span | |
6969 class="cmtt-8"> </span><span | |
6970 class="cmtt-8"> </span><span | |
6971 class="cmtt-8"> </span><span | |
6972 class="cmtt-8"> 13)</span><span | |
6973 class="cmtt-8"> iterate</span><span | |
6974 class="cmtt-8"> [j]</span><span | |
6975 class="cmtt-8"> over</span><span | |
6976 class="cmtt-8"> the</span><span | |
6977 class="cmtt-8"> range</span><span | |
6978 class="cmtt-8"> 0</span><span | |
6979 class="cmtt-8"> ...</span><span | |
6980 class="cmtt-8"> [cdim]-1</span><span | |
6981 class="cmtt-8"> </span><span | |
6982 class="cmsy-8">{</span> | |
6983 <br class="fancyvrb" /><a | |
6984 id="x1-100040r19"></a><span | |
6985 class="cmr-6">19</span><span | |
6986 class="cmtt-8"> </span><span | |
6987 class="cmtt-8"> </span> | |
6988 <br class="fancyvrb" /><a | |
6989 id="x1-100042r20"></a><span | |
6990 class="cmr-6">20</span><span | |
6991 class="cmtt-8"> </span><span | |
6992 class="cmtt-8"> </span><span | |
6993 class="cmtt-8"> </span><span | |
6994 class="cmtt-8"> </span><span | |
6995 class="cmtt-8"> </span><span | |
6996 class="cmtt-8"> </span><span | |
6997 class="cmtt-8"> </span><span | |
6998 class="cmtt-8"> </span><span | |
6999 class="cmtt-8"> </span><span | |
7000 class="cmtt-8"> </span><span | |
7001 class="cmtt-8"> </span><span | |
7002 class="cmtt-8"> </span><span | |
7003 class="cmtt-8"> </span><span | |
7004 class="cmtt-8"> </span><span | |
7005 class="cmtt-8"> 14)</span><span | |
7006 class="cmtt-8"> [book]</span><span | |
7007 class="cmtt-8"> =</span><span | |
7008 class="cmtt-8"> array</span><span | |
7009 class="cmtt-8"> [floor1_subclass_books]</span><span | |
7010 class="cmtt-8"> element</span><span | |
7011 class="cmtt-8"> [class],([cval]</span><span | |
7012 class="cmtt-8"> bitwise</span><span | |
7013 class="cmtt-8"> AND</span><span | |
7014 class="cmtt-8"> [csub])</span> | |
7015 <br class="fancyvrb" /><a | |
7016 id="x1-100044r21"></a><span | |
7017 class="cmr-6">21</span><span | |
7018 class="cmtt-8"> </span><span | |
7019 class="cmtt-8"> </span><span | |
7020 class="cmtt-8"> </span><span | |
7021 class="cmtt-8"> </span><span | |
7022 class="cmtt-8"> </span><span | |
7023 class="cmtt-8"> </span><span | |
7024 class="cmtt-8"> </span><span | |
7025 class="cmtt-8"> </span><span | |
7026 class="cmtt-8"> </span><span | |
7027 class="cmtt-8"> </span><span | |
7028 class="cmtt-8"> </span><span | |
7029 class="cmtt-8"> </span><span | |
7030 class="cmtt-8"> </span><span | |
7031 class="cmtt-8"> </span><span | |
7032 class="cmtt-8"> 15)</span><span | |
7033 class="cmtt-8"> [cval]</span><span | |
7034 class="cmtt-8"> =</span><span | |
7035 class="cmtt-8"> [cval]</span><span | |
7036 class="cmtt-8"> right</span><span | |
7037 class="cmtt-8"> shifted</span><span | |
7038 class="cmtt-8"> [cbits]</span><span | |
7039 class="cmtt-8"> bits</span> | |
7040 <br class="fancyvrb" /><a | |
7041 id="x1-100046r22"></a><span | |
7042 class="cmr-6">22</span><span | |
7043 class="cmtt-8"> </span><span | |
7044 class="cmtt-8">  </span><span | |
7045 class="cmtt-8"> </span><span | |
7046 class="cmtt-8"> </span><span | |
7047 class="cmtt-8"> </span><span | |
7048 class="cmtt-8"> </span><span | |
7049 class="cmtt-8"> 16)</span><span | |
7050 class="cmtt-8"> if</span><span | |
7051 class="cmtt-8"> (</span><span | |
7052 class="cmtt-8"> [book]</span><span | |
7053 class="cmtt-8"> is</span><span | |
7054 class="cmtt-8"> not</span><span | |
7055 class="cmtt-8"> less</span><span | |
7056 class="cmtt-8"> than</span><span | |
7057 class="cmtt-8"> zero</span><span | |
7058 class="cmtt-8"> )</span><span | |
7059 class="cmtt-8"> </span><span | |
7060 class="cmsy-8">{</span> | |
7061 <br class="fancyvrb" /><a | |
7062 id="x1-100048r23"></a><span | |
7063 class="cmr-6">23</span><span | |
7064 class="cmtt-8"> </span><span | |
7065 class="cmtt-8"> </span> | |
7066 <br class="fancyvrb" /><a | |
7067 id="x1-100050r24"></a><span | |
7068 class="cmr-6">24</span><span | |
7069 class="cmtt-8"> </span><span | |
7070 class="cmtt-8">  </span><span | |
7071 class="cmtt-8"> </span><span | |
7072 class="cmtt-8"> </span><span | |
7073 class="cmtt-8"> </span><span | |
7074 class="cmtt-8"> </span><span | |
7075 class="cmtt-8"> </span><span | |
7076 class="cmtt-8"> </span><span | |
7077 class="cmtt-8"> </span><span | |
7078 class="cmtt-8"> </span><span | |
7079 class="cmtt-8"> </span><span | |
7080 class="cmtt-8"> </span><span | |
7081 class="cmtt-8"> 17)</span><span | |
7082 class="cmtt-8"> vector</span><span | |
7083 class="cmtt-8"> [floor1_Y]</span><span | |
7084 class="cmtt-8"> element</span><span | |
7085 class="cmtt-8"> ([j]+[offset])</span><span | |
7086 class="cmtt-8"> =</span><span | |
7087 class="cmtt-8"> read</span><span | |
7088 class="cmtt-8"> from</span><span | |
7089 class="cmtt-8"> packet</span><span | |
7090 class="cmtt-8"> using</span><span | |
7091 class="cmtt-8"> codebook</span> | |
7092 <br class="fancyvrb" /><a | |
7093 id="x1-100052r25"></a><span | |
7094 class="cmr-6">25</span><span | |
7095 class="cmtt-8"> </span><span | |
7096 class="cmtt-8"> </span><span | |
7097 class="cmtt-8"> </span><span | |
7098 class="cmtt-8"> </span><span | |
7099 class="cmtt-8"> </span><span | |
7100 class="cmtt-8"> </span><span | |
7101 class="cmtt-8"> </span><span | |
7102 class="cmtt-8"> </span><span | |
7103 class="cmtt-8"> </span><span | |
7104 class="cmtt-8"> </span><span | |
7105 class="cmtt-8"> </span><span | |
7106 class="cmtt-8"> </span><span | |
7107 class="cmtt-8"> </span><span | |
7108 class="cmtt-8"> </span><span | |
7109 class="cmtt-8"> </span><span | |
7110 class="cmtt-8"> </span><span | |
7111 class="cmtt-8"> </span><span | |
7112 class="cmtt-8"> </span><span | |
7113 class="cmtt-8"> </span><span | |
7114 class="cmtt-8"> </span><span | |
7115 class="cmtt-8"> </span><span | |
7116 class="cmtt-8"> </span><span | |
7117 class="cmtt-8"> </span><span | |
7118 class="cmtt-8"> </span><span | |
7119 class="cmtt-8"> [book]</span><span | |
7120 class="cmtt-8"> in</span><span | |
7121 class="cmtt-8"> scalar</span><span | |
7122 class="cmtt-8"> context</span> | |
7123 <br class="fancyvrb" /><a | |
7124 id="x1-100054r26"></a><span | |
7125 class="cmr-6">26</span><span | |
7126 class="cmtt-8"> </span><span | |
7127 class="cmtt-8"> </span> | |
7128 <br class="fancyvrb" /><a | |
7129 id="x1-100056r27"></a><span | |
7130 class="cmr-6">27</span><span | |
7131 class="cmtt-8"> </span><span | |
7132 class="cmtt-8"> </span><span | |
7133 class="cmtt-8"> </span><span | |
7134 class="cmtt-8"> </span><span | |
7135 class="cmtt-8"> </span><span | |
7136 class="cmtt-8"> </span><span | |
7137 class="cmtt-8"> </span><span | |
7138 class="cmtt-8"> </span><span | |
7139 class="cmtt-8"> </span><span | |
7140 class="cmtt-8"> </span><span | |
7141 class="cmtt-8"> </span><span | |
7142 class="cmtt-8"> </span><span | |
7143 class="cmtt-8"> </span><span | |
7144 class="cmtt-8"> </span><span | |
7145 class="cmtt-8"> </span><span | |
7146 class="cmtt-8"> </span><span | |
7147 class="cmtt-8"> </span><span | |
7148 class="cmtt-8"> </span><span | |
7149 class="cmtt-8"> </span><span | |
7150 class="cmsy-8">}</span><span | |
7151 class="cmtt-8"> else</span><span | |
7152 class="cmtt-8"> [book]</span><span | |
7153 class="cmtt-8"> is</span><span | |
7154 class="cmtt-8"> less</span><span | |
7155 class="cmtt-8"> than</span><span | |
7156 class="cmtt-8"> zero</span><span | |
7157 class="cmtt-8"> </span><span | |
7158 class="cmsy-8">{</span> | |
7159 <br class="fancyvrb" /><a | |
7160 id="x1-100058r28"></a><span | |
7161 class="cmr-6">28</span><span | |
7162 class="cmtt-8"> </span><span | |
7163 class="cmtt-8"> </span> | |
7164 <br class="fancyvrb" /><a | |
7165 id="x1-100060r29"></a><span | |
7166 class="cmr-6">29</span><span | |
7167 class="cmtt-8"> </span><span | |
7168 class="cmtt-8">  </span><span | |
7169 class="cmtt-8"> </span><span | |
7170 class="cmtt-8"> </span><span | |
7171 class="cmtt-8"> </span><span | |
7172 class="cmtt-8"> </span><span | |
7173 class="cmtt-8"> </span><span | |
7174 class="cmtt-8"> </span><span | |
7175 class="cmtt-8"> </span><span | |
7176 class="cmtt-8"> </span><span | |
7177 class="cmtt-8"> </span><span | |
7178 class="cmtt-8"> </span><span | |
7179 class="cmtt-8"> 18)</span><span | |
7180 class="cmtt-8"> vector</span><span | |
7181 class="cmtt-8"> [floor1_Y]</span><span | |
7182 class="cmtt-8"> element</span><span | |
7183 class="cmtt-8"> ([j]+[offset])</span><span | |
7184 class="cmtt-8"> =</span><span | |
7185 class="cmtt-8"> 0</span> | |
7186 <br class="fancyvrb" /><a | |
7187 id="x1-100062r30"></a><span | |
7188 class="cmr-6">30</span><span | |
7189 class="cmtt-8"> </span><span | |
7190 class="cmtt-8"> </span> | |
7191 <br class="fancyvrb" /><a | |
7192 id="x1-100064r31"></a><span | |
7193 class="cmr-6">31</span><span | |
7194 class="cmtt-8"> </span><span | |
7195 class="cmtt-8"> </span><span | |
7196 class="cmtt-8"> </span><span | |
7197 class="cmtt-8"> </span><span | |
7198 class="cmtt-8"> </span><span | |
7199 class="cmtt-8"> </span><span | |
7200 class="cmtt-8"> </span><span | |
7201 class="cmtt-8"> </span><span | |
7202 class="cmtt-8"> </span><span | |
7203 class="cmtt-8"> </span><span | |
7204 class="cmtt-8"> </span><span | |
7205 class="cmtt-8"> </span><span | |
7206 class="cmtt-8"> </span><span | |
7207 class="cmtt-8"> </span><span | |
7208 class="cmtt-8"> </span><span | |
7209 class="cmtt-8"> </span><span | |
7210 class="cmtt-8"> </span><span | |
7211 class="cmtt-8"> </span><span | |
7212 class="cmtt-8"> </span><span | |
7213 class="cmsy-8">}</span> | |
7214 <br class="fancyvrb" /><a | |
7215 id="x1-100066r32"></a><span | |
7216 class="cmr-6">32</span><span | |
7217 class="cmtt-8"> </span><span | |
7218 class="cmtt-8"> </span><span | |
7219 class="cmtt-8"> </span><span | |
7220 class="cmtt-8"> </span><span | |
7221 class="cmtt-8"> </span><span | |
7222 class="cmtt-8"> </span><span | |
7223 class="cmtt-8"> </span><span | |
7224 class="cmtt-8"> </span><span | |
7225 class="cmtt-8"> </span><span | |
7226 class="cmtt-8"> </span><span | |
7227 class="cmtt-8"> </span><span | |
7228 class="cmtt-8"> </span><span | |
7229 class="cmsy-8">}</span> | |
7230 <br class="fancyvrb" /><a | |
7231 id="x1-100068r33"></a><span | |
7232 class="cmr-6">33</span><span | |
7233 class="cmtt-8"> </span><span | |
7234 class="cmtt-8"> </span> | |
7235 <br class="fancyvrb" /><a | |
7236 id="x1-100070r34"></a><span | |
7237 class="cmr-6">34</span><span | |
7238 class="cmtt-8"> </span><span | |
7239 class="cmtt-8"> </span><span | |
7240 class="cmtt-8"> </span><span | |
7241 class="cmtt-8"> </span><span | |
7242 class="cmtt-8"> </span><span | |
7243 class="cmtt-8"> </span><span | |
7244 class="cmtt-8"> </span><span | |
7245 class="cmtt-8"> 19)</span><span | |
7246 class="cmtt-8"> [offset]</span><span | |
7247 class="cmtt-8"> =</span><span | |
7248 class="cmtt-8"> [offset]</span><span | |
7249 class="cmtt-8"> +</span><span | |
7250 class="cmtt-8"> [cdim]</span> | |
7251 | |
7252 | |
7253 | |
7254 <br class="fancyvrb" /><a | |
7255 id="x1-100072r35"></a><span | |
7256 class="cmr-6">35</span><span | |
7257 class="cmtt-8"> </span><span | |
7258 class="cmtt-8"> </span> | |
7259 <br class="fancyvrb" /><a | |
7260 id="x1-100074r36"></a><span | |
7261 class="cmr-6">36</span><span | |
7262 class="cmtt-8"> </span><span | |
7263 class="cmtt-8"> </span><span | |
7264 class="cmtt-8"> </span><span | |
7265 class="cmtt-8"> </span><span | |
7266 class="cmtt-8"> </span><span | |
7267 class="cmtt-8"> </span><span | |
7268 class="cmtt-8"> </span><span | |
7269 class="cmsy-8">}</span> | |
7270 <br class="fancyvrb" /><a | |
7271 id="x1-100076r37"></a><span | |
7272 class="cmr-6">37</span><span | |
7273 class="cmtt-8"> </span><span | |
7274 class="cmtt-8"> </span> | |
7275 <br class="fancyvrb" /><a | |
7276 id="x1-100078r38"></a><span | |
7277 class="cmr-6">38</span><span | |
7278 class="cmtt-8"> </span><span | |
7279 class="cmtt-8"> </span><span | |
7280 class="cmtt-8"> 20)</span><span | |
7281 class="cmtt-8"> done</span> | |
7282 </div> | |
7283 <!--l. 229--><p class="noindent" >An end-of-packet condition during curve decode should be considered a nominal occurrence; if | |
7284 end-of-packet is reached during any read operation above, floor decode is to return ’unused’ | |
7285 status as if the <span | |
7286 class="cmtt-12">[nonzero] </span>flag had been unset at the beginning of decode. | |
7287 <!--l. 235--><p class="noindent" >Vector <span | |
7288 class="cmtt-12">[floor1_Y] </span>contains the values from packet decode needed for floor 1 synthesis. | |
7289 <!--l. 240--><p class="noindent" > | |
7290 <h5 class="subsubsectionHead"><span class="titlemark">7.2.4. </span> <a | |
7291 id="x1-1010007.2.4"></a>curve computation</h5> | |
7292 <!--l. 242--><p class="noindent" >Curve computation is split into two logical steps; the first step derives final Y amplitude values | |
7293 from the encoded, wrapped difference values taken from the bitstream. The second step | |
7294 plots the curve lines. Also, although zero-difference values are used in the iterative | |
7295 prediction to find final Y values, these points are conditionally skipped during final | |
7296 line computation in step two. Skipping zero-difference values allows a smoother line | |
7297 fit. | |
7298 <!--l. 250--><p class="noindent" >Although some aspects of the below algorithm look like inconsequential optimizations, | |
7299 implementors are warned to follow the details closely. Deviation from implementing a strictly | |
7300 equivalent algorithm can result in serious decoding errors. | |
7301 <!--l. 255--><p class="noindent" ><span | |
7302 class="cmti-12">Additional note: </span>Although <span | |
7303 class="cmtt-12">[floor1_final_Y] </span>values in the prediction loop and at the end of | |
7304 step 1 are inherently limited by the prediction algorithm to [0, <span | |
7305 class="cmtt-12">[range]</span>), it is possible to abuse | |
7306 the setup and codebook machinery to produce negative or over-range results. We suggest that | |
7307 decoder implementations guard the values in vector <span | |
7308 class="cmtt-12">[floor1_final_Y] </span>by clamping each | |
7309 element to [0, <span | |
7310 class="cmtt-12">[range]</span>) after step 1. Variants of this suggestion are acceptable as valid floor1 | |
7311 setups cannot produce out of range values. | |
7312 <!--l. 266--><p class="noindent" > | |
7313 <dl class="description"><dt class="description"> | |
7314 <span | |
7315 class="cmssbx-10x-x-120">step 1: amplitude value synthesis</span> </dt><dd | |
7316 class="description"> | |
7317 <!--l. 268--><p class="noindent" >Unwrap the always-positive-or-zero values read from the packet into +/- difference | |
7318 values, then apply to line prediction. | |
7319 <!--l. 271--><p class="noindent" > | |
7320 <div class="fancyvrb" id="fancyvrb31"> | |
7321 | |
7322 | |
7323 | |
7324 <a | |
7325 id="x1-101002r1"></a><span | |
7326 class="cmr-6">1</span><span | |
7327 class="cmtt-8"> </span><span | |
7328 class="cmtt-8"> </span><span | |
7329 class="cmtt-8"> </span><span | |
7330 class="cmtt-8"> 1)</span><span | |
7331 class="cmtt-8"> [range]</span><span | |
7332 class="cmtt-8"> =</span><span | |
7333 class="cmtt-8"> vector</span><span | |
7334 class="cmtt-8"> </span><span | |
7335 class="cmsy-8">{</span><span | |
7336 class="cmtt-8"> 256,</span><span | |
7337 class="cmtt-8"> 128,</span><span | |
7338 class="cmtt-8"> 86,</span><span | |
7339 class="cmtt-8"> 64</span><span | |
7340 class="cmtt-8"> </span><span | |
7341 class="cmsy-8">}</span><span | |
7342 class="cmtt-8"> element</span><span | |
7343 class="cmtt-8"> ([floor1_multiplier]-1)</span> | |
7344 <br class="fancyvrb" /><a | |
7345 id="x1-101004r2"></a><span | |
7346 class="cmr-6">2</span><span | |
7347 class="cmtt-8"> </span><span | |
7348 class="cmtt-8"> </span><span | |
7349 class="cmtt-8"> </span><span | |
7350 class="cmtt-8"> 2)</span><span | |
7351 class="cmtt-8"> vector</span><span | |
7352 class="cmtt-8"> [floor1_step2_flag]</span><span | |
7353 class="cmtt-8"> element</span><span | |
7354 class="cmtt-8"> [0]</span><span | |
7355 class="cmtt-8"> =</span><span | |
7356 class="cmtt-8"> set</span> | |
7357 <br class="fancyvrb" /><a | |
7358 id="x1-101006r3"></a><span | |
7359 class="cmr-6">3</span><span | |
7360 class="cmtt-8"> </span><span | |
7361 class="cmtt-8"> </span><span | |
7362 class="cmtt-8"> </span><span | |
7363 class="cmtt-8"> 3)</span><span | |
7364 class="cmtt-8"> vector</span><span | |
7365 class="cmtt-8"> [floor1_step2_flag]</span><span | |
7366 class="cmtt-8"> element</span><span | |
7367 class="cmtt-8"> [1]</span><span | |
7368 class="cmtt-8"> =</span><span | |
7369 class="cmtt-8"> set</span> | |
7370 <br class="fancyvrb" /><a | |
7371 id="x1-101008r4"></a><span | |
7372 class="cmr-6">4</span><span | |
7373 class="cmtt-8"> </span><span | |
7374 class="cmtt-8"> </span><span | |
7375 class="cmtt-8"> </span><span | |
7376 class="cmtt-8"> 4)</span><span | |
7377 class="cmtt-8"> vector</span><span | |
7378 class="cmtt-8"> [floor1_final_Y]</span><span | |
7379 class="cmtt-8"> element</span><span | |
7380 class="cmtt-8"> [0]</span><span | |
7381 class="cmtt-8"> =</span><span | |
7382 class="cmtt-8"> vector</span><span | |
7383 class="cmtt-8"> [floor1_Y]</span><span | |
7384 class="cmtt-8"> element</span><span | |
7385 class="cmtt-8"> [0]</span> | |
7386 <br class="fancyvrb" /><a | |
7387 id="x1-101010r5"></a><span | |
7388 class="cmr-6">5</span><span | |
7389 class="cmtt-8"> </span><span | |
7390 class="cmtt-8"> </span><span | |
7391 class="cmtt-8"> </span><span | |
7392 class="cmtt-8"> 5)</span><span | |
7393 class="cmtt-8"> vector</span><span | |
7394 class="cmtt-8"> [floor1_final_Y]</span><span | |
7395 class="cmtt-8"> element</span><span | |
7396 class="cmtt-8"> [1]</span><span | |
7397 class="cmtt-8"> =</span><span | |
7398 class="cmtt-8"> vector</span><span | |
7399 class="cmtt-8"> [floor1_Y]</span><span | |
7400 class="cmtt-8"> element</span><span | |
7401 class="cmtt-8"> [1]</span> | |
7402 <br class="fancyvrb" /><a | |
7403 id="x1-101012r6"></a><span | |
7404 class="cmr-6">6</span><span | |
7405 class="cmtt-8"> </span><span | |
7406 class="cmtt-8"> </span><span | |
7407 class="cmtt-8"> </span><span | |
7408 class="cmtt-8"> 6)</span><span | |
7409 class="cmtt-8"> iterate</span><span | |
7410 class="cmtt-8"> [i]</span><span | |
7411 class="cmtt-8"> over</span><span | |
7412 class="cmtt-8"> the</span><span | |
7413 class="cmtt-8"> range</span><span | |
7414 class="cmtt-8"> 2</span><span | |
7415 class="cmtt-8"> ...</span><span | |
7416 class="cmtt-8"> [floor1_values]-1</span><span | |
7417 class="cmtt-8"> </span><span | |
7418 class="cmsy-8">{</span> | |
7419 <br class="fancyvrb" /><a | |
7420 id="x1-101014r7"></a><span | |
7421 class="cmr-6">7</span><span | |
7422 class="cmtt-8"> </span><span | |
7423 class="cmtt-8"> </span> | |
7424 <br class="fancyvrb" /><a | |
7425 id="x1-101016r8"></a><span | |
7426 class="cmr-6">8</span><span | |
7427 class="cmtt-8"> </span><span | |
7428 class="cmtt-8"> </span><span | |
7429 class="cmtt-8"> </span><span | |
7430 class="cmtt-8"> </span><span | |
7431 class="cmtt-8"> </span><span | |
7432 class="cmtt-8"> </span><span | |
7433 class="cmtt-8"> </span><span | |
7434 class="cmtt-8"> </span><span | |
7435 class="cmtt-8"> 7)</span><span | |
7436 class="cmtt-8"> [low_neighbor_offset]</span><span | |
7437 class="cmtt-8"> =</span><span | |
7438 class="cmtt-8"> </span><a | |
7439 href="#x1-1200009.2.4"><span | |
7440 class="cmtt-8">low_neighbor</span></a><span | |
7441 class="cmtt-8">([floor1_X_list],[i])</span> | |
7442 <br class="fancyvrb" /><a | |
7443 id="x1-101018r9"></a><span | |
7444 class="cmr-6">9</span><span | |
7445 class="cmtt-8"> </span><span | |
7446 class="cmtt-8"> </span><span | |
7447 class="cmtt-8"> </span><span | |
7448 class="cmtt-8"> </span><span | |
7449 class="cmtt-8"> </span><span | |
7450 class="cmtt-8"> </span><span | |
7451 class="cmtt-8"> </span><span | |
7452 class="cmtt-8"> </span><span | |
7453 class="cmtt-8"> 8)</span><span | |
7454 class="cmtt-8"> [high_neighbor_offset]</span><span | |
7455 class="cmtt-8"> =</span><span | |
7456 class="cmtt-8"> </span><a | |
7457 href="#x1-1210009.2.5"><span | |
7458 class="cmtt-8">high_neighbor</span></a><span | |
7459 class="cmtt-8">([floor1_X_list],[i])</span> | |
7460 <br class="fancyvrb" /><a | |
7461 id="x1-101020r10"></a><span | |
7462 class="cmr-6">10</span><span | |
7463 class="cmtt-8"> </span><span | |
7464 class="cmtt-8"> </span> | |
7465 <br class="fancyvrb" /><a | |
7466 id="x1-101022r11"></a><span | |
7467 class="cmr-6">11</span><span | |
7468 class="cmtt-8"> </span><span | |
7469 class="cmtt-8"> </span><span | |
7470 class="cmtt-8"> </span><span | |
7471 class="cmtt-8"> </span><span | |
7472 class="cmtt-8"> </span><span | |
7473 class="cmtt-8"> </span><span | |
7474 class="cmtt-8"> </span><span | |
7475 class="cmtt-8"> </span><span | |
7476 class="cmtt-8"> 9)</span><span | |
7477 class="cmtt-8"> [predicted]</span><span | |
7478 class="cmtt-8"> =</span><span | |
7479 class="cmtt-8"> </span><a | |
7480 href="#x1-1220009.2.6"><span | |
7481 class="cmtt-8">render_point</span></a><span | |
7482 class="cmtt-8">(</span><span | |
7483 class="cmtt-8"> vector</span><span | |
7484 class="cmtt-8"> [floor1_X_list]</span><span | |
7485 class="cmtt-8"> element</span><span | |
7486 class="cmtt-8"> [low_neighbor_offset],</span> | |
7487 <br class="fancyvrb" /><a | |
7488 id="x1-101024r12"></a><span | |
7489 class="cmr-6">12</span><span | |
7490 class="cmtt-8"> </span><span | |
7491 class="cmtt-8">  </span><span | |
7492 class="cmtt-8"> </span><span | |
7493 class="cmtt-8"> </span><span | |
7494 class="cmtt-8"> </span><span | |
7495 class="cmtt-8"> </span><span | |
7496 class="cmtt-8"> </span><span | |
7497 class="cmtt-8"> vector</span><span | |
7498 class="cmtt-8"> [floor1_final_Y]</span><span | |
7499 class="cmtt-8"> element</span><span | |
7500 class="cmtt-8"> [low_neighbor_offset],</span> | |
7501 <br class="fancyvrb" /><a | |
7502 id="x1-101026r13"></a><span | |
7503 class="cmr-6">13</span><span | |
7504 class="cmtt-8"> </span><span | |
7505 class="cmtt-8"> </span><span | |
7506 class="cmtt-8"> </span><span | |
7507 class="cmtt-8"> </span><span | |
7508 class="cmtt-8"> </span><span | |
7509 class="cmtt-8"> </span><span | |
7510 class="cmtt-8"> </span><span | |
7511 class="cmtt-8"> </span><span | |
7512 class="cmtt-8"> </span><span | |
7513 class="cmtt-8"> </span><span | |
7514 class="cmtt-8"> </span><span | |
7515 class="cmtt-8"> </span><span | |
7516 class="cmtt-8"> </span><span | |
7517 class="cmtt-8"> </span><span | |
7518 class="cmtt-8"> </span><span | |
7519 class="cmtt-8"> </span><span | |
7520 class="cmtt-8"> </span><span | |
7521 class="cmtt-8"> </span><span | |
7522 class="cmtt-8"> </span><span | |
7523 class="cmtt-8"> </span><span | |
7524 class="cmtt-8"> </span><span | |
7525 class="cmtt-8"> </span><span | |
7526 class="cmtt-8"> </span><span | |
7527 class="cmtt-8"> </span><span | |
7528 class="cmtt-8"> </span><span | |
7529 class="cmtt-8"> </span><span | |
7530 class="cmtt-8"> </span><span | |
7531 class="cmtt-8"> </span><span | |
7532 class="cmtt-8"> </span><span | |
7533 class="cmtt-8"> </span><span | |
7534 class="cmtt-8"> </span><span | |
7535 class="cmtt-8"> </span><span | |
7536 class="cmtt-8"> </span><span | |
7537 class="cmtt-8"> </span><span | |
7538 class="cmtt-8"> </span><span | |
7539 class="cmtt-8"> </span><span | |
7540 class="cmtt-8"> </span><span | |
7541 class="cmtt-8"> </span><span | |
7542 class="cmtt-8"> </span><span | |
7543 class="cmtt-8"> vector</span><span | |
7544 class="cmtt-8"> [floor1_X_list]</span><span | |
7545 class="cmtt-8"> element</span><span | |
7546 class="cmtt-8"> [high_neighbor_offset],</span> | |
7547 <br class="fancyvrb" /><a | |
7548 id="x1-101028r14"></a><span | |
7549 class="cmr-6">14</span><span | |
7550 class="cmtt-8"> </span><span | |
7551 class="cmtt-8">  </span><span | |
7552 class="cmtt-8"> </span><span | |
7553 class="cmtt-8"> </span><span | |
7554 class="cmtt-8"> </span><span | |
7555 class="cmtt-8"> </span><span | |
7556 class="cmtt-8"> </span><span | |
7557 class="cmtt-8"> vector</span><span | |
7558 class="cmtt-8"> [floor1_final_Y]</span><span | |
7559 class="cmtt-8"> element</span><span | |
7560 class="cmtt-8"> [high_neighbor_offset],</span> | |
7561 <br class="fancyvrb" /><a | |
7562 id="x1-101030r15"></a><span | |
7563 class="cmr-6">15</span><span | |
7564 class="cmtt-8"> </span><span | |
7565 class="cmtt-8"> </span><span | |
7566 class="cmtt-8"> </span><span | |
7567 class="cmtt-8"> </span><span | |
7568 class="cmtt-8"> </span><span | |
7569 class="cmtt-8"> </span><span | |
7570 class="cmtt-8"> </span><span | |
7571 class="cmtt-8"> </span><span | |
7572 class="cmtt-8"> </span><span | |
7573 class="cmtt-8"> </span><span | |
7574 class="cmtt-8"> </span><span | |
7575 class="cmtt-8"> </span><span | |
7576 class="cmtt-8"> </span><span | |
7577 class="cmtt-8"> </span><span | |
7578 class="cmtt-8"> </span><span | |
7579 class="cmtt-8"> </span><span | |
7580 class="cmtt-8"> </span><span | |
7581 class="cmtt-8"> </span><span | |
7582 class="cmtt-8"> </span><span | |
7583 class="cmtt-8"> </span><span | |
7584 class="cmtt-8"> </span><span | |
7585 class="cmtt-8"> </span><span | |
7586 class="cmtt-8"> </span><span | |
7587 class="cmtt-8"> </span><span | |
7588 class="cmtt-8"> </span><span | |
7589 class="cmtt-8"> </span><span | |
7590 class="cmtt-8"> </span><span | |
7591 class="cmtt-8"> </span><span | |
7592 class="cmtt-8"> </span><span | |
7593 class="cmtt-8"> </span><span | |
7594 class="cmtt-8"> </span><span | |
7595 class="cmtt-8"> </span><span | |
7596 class="cmtt-8"> </span><span | |
7597 class="cmtt-8"> </span><span | |
7598 class="cmtt-8"> </span><span | |
7599 class="cmtt-8"> </span><span | |
7600 class="cmtt-8"> </span><span | |
7601 class="cmtt-8"> </span><span | |
7602 class="cmtt-8"> </span><span | |
7603 class="cmtt-8"> vector</span><span | |
7604 class="cmtt-8"> [floor1_X_list]</span><span | |
7605 class="cmtt-8"> element</span><span | |
7606 class="cmtt-8"> [i]</span><span | |
7607 class="cmtt-8"> )</span> | |
7608 <br class="fancyvrb" /><a | |
7609 id="x1-101032r16"></a><span | |
7610 class="cmr-6">16</span><span | |
7611 class="cmtt-8"> </span><span | |
7612 class="cmtt-8"> </span> | |
7613 <br class="fancyvrb" /><a | |
7614 id="x1-101034r17"></a><span | |
7615 class="cmr-6">17</span><span | |
7616 class="cmtt-8"> </span><span | |
7617 class="cmtt-8"> </span><span | |
7618 class="cmtt-8"> </span><span | |
7619 class="cmtt-8"> </span><span | |
7620 class="cmtt-8"> </span><span | |
7621 class="cmtt-8"> </span><span | |
7622 class="cmtt-8"> </span><span | |
7623 class="cmtt-8"> 10)</span><span | |
7624 class="cmtt-8"> [val]</span><span | |
7625 class="cmtt-8"> =</span><span | |
7626 class="cmtt-8"> vector</span><span | |
7627 class="cmtt-8"> [floor1_Y]</span><span | |
7628 class="cmtt-8"> element</span><span | |
7629 class="cmtt-8"> [i]</span> | |
7630 <br class="fancyvrb" /><a | |
7631 id="x1-101036r18"></a><span | |
7632 class="cmr-6">18</span><span | |
7633 class="cmtt-8"> </span><span | |
7634 class="cmtt-8"> </span><span | |
7635 class="cmtt-8"> </span><span | |
7636 class="cmtt-8"> </span><span | |
7637 class="cmtt-8"> </span><span | |
7638 class="cmtt-8"> </span><span | |
7639 class="cmtt-8"> </span><span | |
7640 class="cmtt-8"> 11)</span><span | |
7641 class="cmtt-8"> [highroom]</span><span | |
7642 class="cmtt-8"> =</span><span | |
7643 class="cmtt-8"> [range]</span><span | |
7644 class="cmtt-8"> -</span><span | |
7645 class="cmtt-8"> [predicted]</span> | |
7646 <br class="fancyvrb" /><a | |
7647 id="x1-101038r19"></a><span | |
7648 class="cmr-6">19</span><span | |
7649 class="cmtt-8"> </span><span | |
7650 class="cmtt-8"> </span><span | |
7651 class="cmtt-8"> </span><span | |
7652 class="cmtt-8"> </span><span | |
7653 class="cmtt-8"> </span><span | |
7654 class="cmtt-8"> </span><span | |
7655 class="cmtt-8"> </span><span | |
7656 class="cmtt-8"> 12)</span><span | |
7657 class="cmtt-8"> [lowroom]</span><span | |
7658 class="cmtt-8"> </span><span | |
7659 class="cmtt-8"> =</span><span | |
7660 class="cmtt-8"> [predicted]</span> | |
7661 <br class="fancyvrb" /><a | |
7662 id="x1-101040r20"></a><span | |
7663 class="cmr-6">20</span><span | |
7664 class="cmtt-8"> </span><span | |
7665 class="cmtt-8"> </span><span | |
7666 class="cmtt-8"> </span><span | |
7667 class="cmtt-8"> </span><span | |
7668 class="cmtt-8"> </span><span | |
7669 class="cmtt-8"> </span><span | |
7670 class="cmtt-8"> </span><span | |
7671 class="cmtt-8"> 13)</span><span | |
7672 class="cmtt-8"> if</span><span | |
7673 class="cmtt-8"> (</span><span | |
7674 class="cmtt-8"> [highroom]</span><span | |
7675 class="cmtt-8"> is</span><span | |
7676 class="cmtt-8"> less</span><span | |
7677 class="cmtt-8"> than</span><span | |
7678 class="cmtt-8"> [lowroom]</span><span | |
7679 class="cmtt-8"> )</span><span | |
7680 class="cmtt-8"> </span><span | |
7681 class="cmsy-8">{</span> | |
7682 <br class="fancyvrb" /><a | |
7683 id="x1-101042r21"></a><span | |
7684 class="cmr-6">21</span><span | |
7685 class="cmtt-8"> </span><span | |
7686 class="cmtt-8"> </span> | |
7687 <br class="fancyvrb" /><a | |
7688 id="x1-101044r22"></a><span | |
7689 class="cmr-6">22</span><span | |
7690 class="cmtt-8"> </span><span | |
7691 class="cmtt-8"> </span><span | |
7692 class="cmtt-8"> </span><span | |
7693 class="cmtt-8"> </span><span | |
7694 class="cmtt-8"> </span><span | |
7695 class="cmtt-8"> </span><span | |
7696 class="cmtt-8"> </span><span | |
7697 class="cmtt-8"> </span><span | |
7698 class="cmtt-8"> </span><span | |
7699 class="cmtt-8"> </span><span | |
7700 class="cmtt-8"> </span><span | |
7701 class="cmtt-8"> </span><span | |
7702 class="cmtt-8"> </span><span | |
7703 class="cmtt-8"> 14)</span><span | |
7704 class="cmtt-8"> [room]</span><span | |
7705 class="cmtt-8"> =</span><span | |
7706 class="cmtt-8"> [highroom]</span><span | |
7707 class="cmtt-8"> *</span><span | |
7708 class="cmtt-8"> 2</span> | |
7709 <br class="fancyvrb" /><a | |
7710 id="x1-101046r23"></a><span | |
7711 class="cmr-6">23</span><span | |
7712 class="cmtt-8"> </span><span | |
7713 class="cmtt-8"> </span> | |
7714 <br class="fancyvrb" /><a | |
7715 id="x1-101048r24"></a><span | |
7716 class="cmr-6">24</span><span | |
7717 class="cmtt-8"> </span><span | |
7718 class="cmtt-8"> </span><span | |
7719 class="cmtt-8"> </span><span | |
7720 class="cmtt-8"> </span><span | |
7721 class="cmtt-8"> </span><span | |
7722 class="cmtt-8"> </span><span | |
7723 class="cmtt-8"> </span><span | |
7724 class="cmtt-8"> </span><span | |
7725 class="cmtt-8"> </span><span | |
7726 class="cmtt-8"> </span><span | |
7727 class="cmtt-8"> </span><span | |
7728 class="cmtt-8"> </span><span | |
7729 class="cmsy-8">}</span><span | |
7730 class="cmtt-8"> else</span><span | |
7731 class="cmtt-8"> [highroom]</span><span | |
7732 class="cmtt-8"> is</span><span | |
7733 class="cmtt-8"> not</span><span | |
7734 class="cmtt-8"> less</span><span | |
7735 class="cmtt-8"> than</span><span | |
7736 class="cmtt-8"> [lowroom]</span><span | |
7737 class="cmtt-8"> </span><span | |
7738 class="cmsy-8">{</span> | |
7739 <br class="fancyvrb" /><a | |
7740 id="x1-101050r25"></a><span | |
7741 class="cmr-6">25</span><span | |
7742 class="cmtt-8"> </span><span | |
7743 class="cmtt-8"> </span> | |
7744 <br class="fancyvrb" /><a | |
7745 id="x1-101052r26"></a><span | |
7746 class="cmr-6">26</span><span | |
7747 class="cmtt-8"> </span><span | |
7748 class="cmtt-8"> </span><span | |
7749 class="cmtt-8"> </span><span | |
7750 class="cmtt-8"> </span><span | |
7751 class="cmtt-8"> </span><span | |
7752 class="cmtt-8"> </span><span | |
7753 class="cmtt-8"> </span><span | |
7754 class="cmtt-8"> </span><span | |
7755 class="cmtt-8"> </span><span | |
7756 class="cmtt-8"> </span><span | |
7757 class="cmtt-8"> </span><span | |
7758 class="cmtt-8"> </span><span | |
7759 class="cmtt-8"> </span><span | |
7760 class="cmtt-8"> 15)</span><span | |
7761 class="cmtt-8"> [room]</span><span | |
7762 class="cmtt-8"> =</span><span | |
7763 class="cmtt-8"> [lowroom]</span><span | |
7764 class="cmtt-8"> *</span><span | |
7765 class="cmtt-8"> 2</span> | |
7766 <br class="fancyvrb" /><a | |
7767 id="x1-101054r27"></a><span | |
7768 class="cmr-6">27</span><span | |
7769 class="cmtt-8"> </span><span | |
7770 class="cmtt-8"> </span> | |
7771 <br class="fancyvrb" /><a | |
7772 id="x1-101056r28"></a><span | |
7773 class="cmr-6">28</span><span | |
7774 class="cmtt-8"> </span><span | |
7775 class="cmtt-8"> </span><span | |
7776 class="cmtt-8"> </span><span | |
7777 class="cmtt-8"> </span><span | |
7778 class="cmtt-8"> </span><span | |
7779 class="cmtt-8"> </span><span | |
7780 class="cmtt-8"> </span><span | |
7781 class="cmtt-8"> </span><span | |
7782 class="cmtt-8"> </span><span | |
7783 class="cmtt-8"> </span><span | |
7784 class="cmtt-8"> </span><span | |
7785 class="cmtt-8"> </span><span | |
7786 class="cmsy-8">}</span> | |
7787 <br class="fancyvrb" /><a | |
7788 id="x1-101058r29"></a><span | |
7789 class="cmr-6">29</span><span | |
7790 class="cmtt-8"> </span><span | |
7791 class="cmtt-8"> </span> | |
7792 <br class="fancyvrb" /><a | |
7793 id="x1-101060r30"></a><span | |
7794 class="cmr-6">30</span><span | |
7795 class="cmtt-8"> </span><span | |
7796 class="cmtt-8"> </span><span | |
7797 class="cmtt-8"> </span><span | |
7798 class="cmtt-8"> </span><span | |
7799 class="cmtt-8"> </span><span | |
7800 class="cmtt-8"> </span><span | |
7801 class="cmtt-8"> </span><span | |
7802 class="cmtt-8"> 16)</span><span | |
7803 class="cmtt-8"> if</span><span | |
7804 class="cmtt-8"> (</span><span | |
7805 class="cmtt-8"> [val]</span><span | |
7806 class="cmtt-8"> is</span><span | |
7807 class="cmtt-8"> nonzero</span><span | |
7808 class="cmtt-8"> )</span><span | |
7809 class="cmtt-8"> </span><span | |
7810 class="cmsy-8">{</span> | |
7811 <br class="fancyvrb" /><a | |
7812 id="x1-101062r31"></a><span | |
7813 class="cmr-6">31</span><span | |
7814 class="cmtt-8"> </span><span | |
7815 class="cmtt-8"> </span> | |
7816 <br class="fancyvrb" /><a | |
7817 id="x1-101064r32"></a><span | |
7818 class="cmr-6">32</span><span | |
7819 class="cmtt-8"> </span><span | |
7820 class="cmtt-8"> </span><span | |
7821 class="cmtt-8"> </span><span | |
7822 class="cmtt-8"> </span><span | |
7823 class="cmtt-8"> </span><span | |
7824 class="cmtt-8"> </span><span | |
7825 class="cmtt-8"> </span><span | |
7826 class="cmtt-8"> </span><span | |
7827 class="cmtt-8"> </span><span | |
7828 class="cmtt-8"> </span><span | |
7829 class="cmtt-8"> </span><span | |
7830 class="cmtt-8"> </span><span | |
7831 class="cmtt-8"> </span><span | |
7832 class="cmtt-8"> 17)</span><span | |
7833 class="cmtt-8"> vector</span><span | |
7834 class="cmtt-8"> [floor1_step2_flag]</span><span | |
7835 class="cmtt-8"> element</span><span | |
7836 class="cmtt-8"> [low_neighbor_offset]</span><span | |
7837 class="cmtt-8"> =</span><span | |
7838 class="cmtt-8"> set</span> | |
7839 <br class="fancyvrb" /><a | |
7840 id="x1-101066r33"></a><span | |
7841 class="cmr-6">33</span><span | |
7842 class="cmtt-8"> </span><span | |
7843 class="cmtt-8"> </span><span | |
7844 class="cmtt-8"> </span><span | |
7845 class="cmtt-8"> </span><span | |
7846 class="cmtt-8"> </span><span | |
7847 class="cmtt-8"> </span><span | |
7848 class="cmtt-8"> </span><span | |
7849 class="cmtt-8"> </span><span | |
7850 class="cmtt-8"> </span><span | |
7851 class="cmtt-8"> </span><span | |
7852 class="cmtt-8"> </span><span | |
7853 class="cmtt-8"> </span><span | |
7854 class="cmtt-8"> </span><span | |
7855 class="cmtt-8"> 18)</span><span | |
7856 class="cmtt-8"> vector</span><span | |
7857 class="cmtt-8"> [floor1_step2_flag]</span><span | |
7858 class="cmtt-8"> element</span><span | |
7859 class="cmtt-8"> [high_neighbor_offset]</span><span | |
7860 class="cmtt-8"> =</span><span | |
7861 class="cmtt-8"> set</span> | |
7862 <br class="fancyvrb" /><a | |
7863 id="x1-101068r34"></a><span | |
7864 class="cmr-6">34</span><span | |
7865 class="cmtt-8"> </span><span | |
7866 class="cmtt-8"> </span><span | |
7867 class="cmtt-8"> </span><span | |
7868 class="cmtt-8"> </span><span | |
7869 class="cmtt-8"> </span><span | |
7870 class="cmtt-8"> </span><span | |
7871 class="cmtt-8"> </span><span | |
7872 class="cmtt-8"> </span><span | |
7873 class="cmtt-8"> </span><span | |
7874 class="cmtt-8"> </span><span | |
7875 class="cmtt-8"> </span><span | |
7876 class="cmtt-8"> </span><span | |
7877 class="cmtt-8"> </span><span | |
7878 class="cmtt-8"> 19)</span><span | |
7879 class="cmtt-8"> vector</span><span | |
7880 class="cmtt-8"> [floor1_step2_flag]</span><span | |
7881 class="cmtt-8"> element</span><span | |
7882 class="cmtt-8"> [i]</span><span | |
7883 class="cmtt-8"> =</span><span | |
7884 class="cmtt-8"> set</span> | |
7885 <br class="fancyvrb" /><a | |
7886 id="x1-101070r35"></a><span | |
7887 class="cmr-6">35</span><span | |
7888 class="cmtt-8"> </span><span | |
7889 class="cmtt-8"> </span><span | |
7890 class="cmtt-8"> </span><span | |
7891 class="cmtt-8"> </span><span | |
7892 class="cmtt-8"> </span><span | |
7893 class="cmtt-8"> </span><span | |
7894 class="cmtt-8"> </span><span | |
7895 class="cmtt-8"> </span><span | |
7896 class="cmtt-8"> </span><span | |
7897 class="cmtt-8"> </span><span | |
7898 class="cmtt-8"> </span><span | |
7899 class="cmtt-8"> </span><span | |
7900 class="cmtt-8"> </span><span | |
7901 class="cmtt-8"> 20)</span><span | |
7902 class="cmtt-8"> if</span><span | |
7903 class="cmtt-8"> (</span><span | |
7904 class="cmtt-8"> [val]</span><span | |
7905 class="cmtt-8"> is</span><span | |
7906 class="cmtt-8"> greater</span><span | |
7907 class="cmtt-8"> than</span><span | |
7908 class="cmtt-8"> or</span><span | |
7909 class="cmtt-8"> equal</span><span | |
7910 class="cmtt-8"> to</span><span | |
7911 class="cmtt-8"> [room]</span><span | |
7912 class="cmtt-8"> )</span><span | |
7913 class="cmtt-8"> </span><span | |
7914 class="cmsy-8">{</span> | |
7915 <br class="fancyvrb" /><a | |
7916 id="x1-101072r36"></a><span | |
7917 class="cmr-6">36</span><span | |
7918 class="cmtt-8"> </span><span | |
7919 class="cmtt-8"> </span> | |
7920 <br class="fancyvrb" /><a | |
7921 id="x1-101074r37"></a><span | |
7922 class="cmr-6">37</span><span | |
7923 class="cmtt-8"> </span><span | |
7924 class="cmtt-8"> </span><span | |
7925 class="cmtt-8"> </span><span | |
7926 class="cmtt-8"> </span><span | |
7927 class="cmtt-8"> </span><span | |
7928 class="cmtt-8"> </span><span | |
7929 class="cmtt-8"> </span><span | |
7930 class="cmtt-8"> </span><span | |
7931 class="cmtt-8"> </span><span | |
7932 class="cmtt-8"> </span><span | |
7933 class="cmtt-8"> </span><span | |
7934 class="cmtt-8"> </span><span | |
7935 class="cmtt-8"> </span><span | |
7936 class="cmtt-8"> </span><span | |
7937 class="cmtt-8"> </span><span | |
7938 class="cmtt-8"> </span><span | |
7939 class="cmtt-8"> </span><span | |
7940 class="cmtt-8"> </span><span | |
7941 class="cmtt-8"> </span><span | |
7942 class="cmtt-8"> 21)</span><span | |
7943 class="cmtt-8"> if</span><span | |
7944 class="cmtt-8"> (</span><span | |
7945 class="cmtt-8"> [highroom]</span><span | |
7946 class="cmtt-8"> is</span><span | |
7947 class="cmtt-8"> greater</span><span | |
7948 class="cmtt-8"> than</span><span | |
7949 class="cmtt-8"> [lowroom]</span><span | |
7950 class="cmtt-8"> )</span><span | |
7951 class="cmtt-8"> </span><span | |
7952 class="cmsy-8">{</span> | |
7953 <br class="fancyvrb" /><a | |
7954 id="x1-101076r38"></a><span | |
7955 class="cmr-6">38</span><span | |
7956 class="cmtt-8"> </span><span | |
7957 class="cmtt-8"> </span> | |
7958 <br class="fancyvrb" /><a | |
7959 id="x1-101078r39"></a><span | |
7960 class="cmr-6">39</span><span | |
7961 class="cmtt-8"> </span><span | |
7962 class="cmtt-8"> </span><span | |
7963 class="cmtt-8"> </span><span | |
7964 class="cmtt-8"> </span><span | |
7965 class="cmtt-8"> </span><span | |
7966 class="cmtt-8"> </span><span | |
7967 class="cmtt-8"> </span><span | |
7968 class="cmtt-8"> </span><span | |
7969 class="cmtt-8"> </span><span | |
7970 class="cmtt-8"> </span><span | |
7971 class="cmtt-8"> </span><span | |
7972 class="cmtt-8"> </span><span | |
7973 class="cmtt-8"> </span><span | |
7974 class="cmtt-8"> </span><span | |
7975 class="cmtt-8"> </span><span | |
7976 class="cmtt-8"> </span><span | |
7977 class="cmtt-8"> </span><span | |
7978 class="cmtt-8"> </span><span | |
7979 class="cmtt-8"> </span><span | |
7980 class="cmtt-8"> </span><span | |
7981 class="cmtt-8"> </span><span | |
7982 class="cmtt-8"> </span><span | |
7983 class="cmtt-8"> </span><span | |
7984 class="cmtt-8"> </span><span | |
7985 class="cmtt-8"> </span><span | |
7986 class="cmtt-8"> 22)</span><span | |
7987 class="cmtt-8"> vector</span><span | |
7988 class="cmtt-8"> [floor1_final_Y]</span><span | |
7989 class="cmtt-8"> element</span><span | |
7990 class="cmtt-8"> [i]</span><span | |
7991 class="cmtt-8"> =</span><span | |
7992 class="cmtt-8"> [val]</span><span | |
7993 class="cmtt-8"> -</span><span | |
7994 class="cmtt-8"> [lowroom]</span><span | |
7995 class="cmtt-8"> +</span><span | |
7996 class="cmtt-8"> [predicted]</span> | |
7997 <br class="fancyvrb" /><a | |
7998 id="x1-101080r40"></a><span | |
7999 class="cmr-6">40</span><span | |
8000 class="cmtt-8"> </span><span | |
8001 class="cmtt-8"> </span> | |
8002 <br class="fancyvrb" /><a | |
8003 id="x1-101082r41"></a><span | |
8004 class="cmr-6">41</span><span | |
8005 class="cmtt-8"> </span><span | |
8006 class="cmtt-8">  </span><span | |
8007 class="cmtt-8"> </span><span | |
8008 class="cmtt-8"> </span><span | |
8009 class="cmtt-8"> </span><span | |
8010 class="cmtt-8"> </span><span | |
8011 class="cmtt-8"> </span><span | |
8012 class="cmtt-8"> </span><span | |
8013 class="cmsy-8">}</span><span | |
8014 class="cmtt-8"> else</span><span | |
8015 class="cmtt-8"> [highroom]</span><span | |
8016 class="cmtt-8"> is</span><span | |
8017 class="cmtt-8"> not</span><span | |
8018 class="cmtt-8"> greater</span><span | |
8019 class="cmtt-8"> than</span><span | |
8020 class="cmtt-8"> [lowroom]</span><span | |
8021 class="cmtt-8"> </span><span | |
8022 class="cmsy-8">{</span> | |
8023 <br class="fancyvrb" /><a | |
8024 id="x1-101084r42"></a><span | |
8025 class="cmr-6">42</span><span | |
8026 class="cmtt-8"> </span><span | |
8027 class="cmtt-8"> </span> | |
8028 <br class="fancyvrb" /><a | |
8029 id="x1-101086r43"></a><span | |
8030 class="cmr-6">43</span><span | |
8031 class="cmtt-8"> </span><span | |
8032 class="cmtt-8"> </span><span | |
8033 class="cmtt-8"> </span><span | |
8034 class="cmtt-8"> </span><span | |
8035 class="cmtt-8"> </span><span | |
8036 class="cmtt-8"> </span><span | |
8037 class="cmtt-8"> </span><span | |
8038 class="cmtt-8"> </span><span | |
8039 class="cmtt-8"> </span><span | |
8040 class="cmtt-8"> </span><span | |
8041 class="cmtt-8"> </span><span | |
8042 class="cmtt-8"> </span><span | |
8043 class="cmtt-8"> </span><span | |
8044 class="cmtt-8"> </span><span | |
8045 class="cmtt-8"> </span><span | |
8046 class="cmtt-8"> </span><span | |
8047 class="cmtt-8"> </span><span | |
8048 class="cmtt-8"> </span><span | |
8049 class="cmtt-8"> </span><span | |
8050 class="cmtt-8"> </span><span | |
8051 class="cmtt-8"> </span><span | |
8052 class="cmtt-8"> </span><span | |
8053 class="cmtt-8"> </span><span | |
8054 class="cmtt-8"> </span><span | |
8055 class="cmtt-8"> </span><span | |
8056 class="cmtt-8"> 23)</span><span | |
8057 class="cmtt-8"> vector</span><span | |
8058 class="cmtt-8"> [floor1_final_Y]</span><span | |
8059 class="cmtt-8"> element</span><span | |
8060 class="cmtt-8"> [i]</span><span | |
8061 class="cmtt-8"> =</span><span | |
8062 class="cmtt-8"> [predicted]</span><span | |
8063 class="cmtt-8"> -</span><span | |
8064 class="cmtt-8"> [val]</span><span | |
8065 class="cmtt-8"> +</span><span | |
8066 class="cmtt-8"> [highroom]</span><span | |
8067 class="cmtt-8"> -</span><span | |
8068 class="cmtt-8"> 1</span> | |
8069 <br class="fancyvrb" /><a | |
8070 id="x1-101088r44"></a><span | |
8071 class="cmr-6">44</span><span | |
8072 class="cmtt-8"> </span><span | |
8073 class="cmtt-8"> </span> | |
8074 <br class="fancyvrb" /><a | |
8075 id="x1-101090r45"></a><span | |
8076 class="cmr-6">45</span><span | |
8077 class="cmtt-8"> </span><span | |
8078 class="cmtt-8"> </span><span | |
8079 class="cmtt-8"> </span><span | |
8080 class="cmtt-8"> </span><span | |
8081 class="cmtt-8"> </span><span | |
8082 class="cmtt-8"> </span><span | |
8083 class="cmtt-8"> </span><span | |
8084 class="cmtt-8"> </span><span | |
8085 class="cmtt-8"> </span><span | |
8086 class="cmtt-8"> </span><span | |
8087 class="cmtt-8"> </span><span | |
8088 class="cmtt-8"> </span><span | |
8089 class="cmtt-8"> </span><span | |
8090 class="cmtt-8"> </span><span | |
8091 class="cmtt-8"> </span><span | |
8092 class="cmtt-8"> </span><span | |
8093 class="cmtt-8"> </span><span | |
8094 class="cmtt-8"> </span><span | |
8095 class="cmtt-8"> </span><span | |
8096 class="cmtt-8"> </span><span | |
8097 class="cmtt-8"> </span><span | |
8098 class="cmtt-8"> </span><span | |
8099 class="cmtt-8"> </span><span | |
8100 class="cmtt-8"> </span><span | |
8101 class="cmsy-8">}</span> | |
8102 <br class="fancyvrb" /><a | |
8103 id="x1-101092r46"></a><span | |
8104 class="cmr-6">46</span><span | |
8105 class="cmtt-8"> </span><span | |
8106 class="cmtt-8"> </span> | |
8107 <br class="fancyvrb" /><a | |
8108 id="x1-101094r47"></a><span | |
8109 class="cmr-6">47</span><span | |
8110 class="cmtt-8"> </span><span | |
8111 class="cmtt-8"> </span><span | |
8112 class="cmtt-8"> </span><span | |
8113 class="cmtt-8"> </span><span | |
8114 class="cmtt-8"> </span><span | |
8115 class="cmtt-8"> </span><span | |
8116 class="cmtt-8"> </span><span | |
8117 class="cmtt-8"> </span><span | |
8118 class="cmtt-8"> </span><span | |
8119 class="cmtt-8"> </span><span | |
8120 class="cmtt-8"> </span><span | |
8121 class="cmtt-8"> </span><span | |
8122 class="cmtt-8"> </span><span | |
8123 class="cmtt-8"> </span><span | |
8124 class="cmtt-8"> </span><span | |
8125 class="cmtt-8"> </span><span | |
8126 class="cmtt-8"> </span><span | |
8127 class="cmtt-8"> </span><span | |
8128 class="cmsy-8">}</span><span | |
8129 class="cmtt-8"> else</span><span | |
8130 class="cmtt-8"> [val]</span><span | |
8131 class="cmtt-8"> is</span><span | |
8132 class="cmtt-8"> less</span><span | |
8133 class="cmtt-8"> than</span><span | |
8134 class="cmtt-8"> [room]</span><span | |
8135 class="cmtt-8"> </span><span | |
8136 class="cmsy-8">{</span> | |
8137 <br class="fancyvrb" /><a | |
8138 id="x1-101096r48"></a><span | |
8139 class="cmr-6">48</span><span | |
8140 class="cmtt-8"> </span><span | |
8141 class="cmtt-8"> </span> | |
8142 <br class="fancyvrb" /><a | |
8143 id="x1-101098r49"></a><span | |
8144 class="cmr-6">49</span><span | |
8145 class="cmtt-8"> </span><span | |
8146 class="cmtt-8"> </span><span | |
8147 class="cmtt-8"> </span><span | |
8148 class="cmtt-8"> </span><span | |
8149 class="cmtt-8"> </span><span | |
8150 class="cmtt-8"> </span><span | |
8151 class="cmtt-8"> </span><span | |
8152 class="cmtt-8"> </span><span | |
8153 class="cmtt-8"> </span><span | |
8154 class="cmtt-8"> </span><span | |
8155 class="cmtt-8"> </span><span | |
8156 class="cmtt-8"> </span><span | |
8157 class="cmtt-8"> </span><span | |
8158 class="cmtt-8"> </span><span | |
8159 class="cmtt-8"> </span><span | |
8160 class="cmtt-8"> </span><span | |
8161 class="cmtt-8"> </span><span | |
8162 class="cmtt-8"> </span><span | |
8163 class="cmtt-8"> </span><span | |
8164 class="cmtt-8"> </span><span | |
8165 class="cmtt-8"> </span><span | |
8166 class="cmtt-8"> 24)</span><span | |
8167 class="cmtt-8"> if</span><span | |
8168 class="cmtt-8"> ([val]</span><span | |
8169 class="cmtt-8"> is</span><span | |
8170 class="cmtt-8"> odd)</span><span | |
8171 class="cmtt-8"> </span><span | |
8172 class="cmsy-8">{</span> | |
8173 <br class="fancyvrb" /><a | |
8174 id="x1-101100r50"></a><span | |
8175 class="cmr-6">50</span><span | |
8176 class="cmtt-8"> </span><span | |
8177 class="cmtt-8"> </span> | |
8178 <br class="fancyvrb" /><a | |
8179 id="x1-101102r51"></a><span | |
8180 class="cmr-6">51</span><span | |
8181 class="cmtt-8"> </span><span | |
8182 class="cmtt-8"> </span><span | |
8183 class="cmtt-8"> </span><span | |
8184 class="cmtt-8"> </span><span | |
8185 class="cmtt-8"> </span><span | |
8186 class="cmtt-8"> </span><span | |
8187 class="cmtt-8"> </span><span | |
8188 class="cmtt-8"> </span><span | |
8189 class="cmtt-8"> </span><span | |
8190 class="cmtt-8"> </span><span | |
8191 class="cmtt-8"> </span><span | |
8192 class="cmtt-8"> </span><span | |
8193 class="cmtt-8"> </span><span | |
8194 class="cmtt-8"> </span><span | |
8195 class="cmtt-8"> </span><span | |
8196 class="cmtt-8"> </span><span | |
8197 class="cmtt-8"> </span><span | |
8198 class="cmtt-8"> </span><span | |
8199 class="cmtt-8"> </span><span | |
8200 class="cmtt-8"> </span><span | |
8201 class="cmtt-8"> </span><span | |
8202 class="cmtt-8"> </span><span | |
8203 class="cmtt-8"> </span><span | |
8204 class="cmtt-8"> </span><span | |
8205 class="cmtt-8"> </span><span | |
8206 class="cmtt-8"> 25)</span><span | |
8207 class="cmtt-8"> vector</span><span | |
8208 class="cmtt-8"> [floor1_final_Y]</span><span | |
8209 class="cmtt-8"> element</span><span | |
8210 class="cmtt-8"> [i]</span><span | |
8211 class="cmtt-8"> =</span> | |
8212 <br class="fancyvrb" /><a | |
8213 id="x1-101104r52"></a><span | |
8214 class="cmr-6">52</span><span | |
8215 class="cmtt-8"> </span><span | |
8216 class="cmtt-8"> </span><span | |
8217 class="cmtt-8"> </span><span | |
8218 class="cmtt-8"> </span><span | |
8219 class="cmtt-8"> </span><span | |
8220 class="cmtt-8"> </span><span | |
8221 class="cmtt-8"> </span><span | |
8222 class="cmtt-8"> </span><span | |
8223 class="cmtt-8"> </span><span | |
8224 class="cmtt-8"> </span><span | |
8225 class="cmtt-8"> </span><span | |
8226 class="cmtt-8"> </span><span | |
8227 class="cmtt-8"> </span><span | |
8228 class="cmtt-8"> </span><span | |
8229 class="cmtt-8"> </span><span | |
8230 class="cmtt-8"> </span><span | |
8231 class="cmtt-8"> </span><span | |
8232 class="cmtt-8"> </span><span | |
8233 class="cmtt-8"> </span><span | |
8234 class="cmtt-8"> </span><span | |
8235 class="cmtt-8"> </span><span | |
8236 class="cmtt-8"> </span><span | |
8237 class="cmtt-8"> </span><span | |
8238 class="cmtt-8"> </span><span | |
8239 class="cmtt-8"> </span><span | |
8240 class="cmtt-8"> </span><span | |
8241 class="cmtt-8"> </span><span | |
8242 class="cmtt-8"> </span><span | |
8243 class="cmtt-8"> </span><span | |
8244 class="cmtt-8"> [predicted]</span><span | |
8245 class="cmtt-8"> -</span><span | |
8246 class="cmtt-8"> (([val]</span><span | |
8247 class="cmtt-8"> +</span><span | |
8248 class="cmtt-8"> 1)</span><span | |
8249 class="cmtt-8"> divided</span><span | |
8250 class="cmtt-8"> by</span><span | |
8251 class="cmtt-8"> </span><span | |
8252 class="cmtt-8"> 2</span><span | |
8253 class="cmtt-8"> using</span><span | |
8254 class="cmtt-8"> integer</span><span | |
8255 class="cmtt-8"> division)</span> | |
8256 <br class="fancyvrb" /><a | |
8257 id="x1-101106r53"></a><span | |
8258 class="cmr-6">53</span><span | |
8259 class="cmtt-8"> </span><span | |
8260 class="cmtt-8"> </span> | |
8261 <br class="fancyvrb" /><a | |
8262 id="x1-101108r54"></a><span | |
8263 class="cmr-6">54</span><span | |
8264 class="cmtt-8"> </span><span | |
8265 class="cmtt-8"> </span><span | |
8266 class="cmtt-8"> </span><span | |
8267 class="cmtt-8"> </span><span | |
8268 class="cmtt-8"> </span><span | |
8269 class="cmtt-8"> </span><span | |
8270 class="cmtt-8"> </span><span | |
8271 class="cmtt-8"> </span><span | |
8272 class="cmtt-8"> </span><span | |
8273 class="cmtt-8"> </span><span | |
8274 class="cmtt-8"> </span><span | |
8275 class="cmtt-8"> </span><span | |
8276 class="cmtt-8"> </span><span | |
8277 class="cmtt-8"> </span><span | |
8278 class="cmtt-8"> </span><span | |
8279 class="cmtt-8"> </span><span | |
8280 class="cmtt-8"> </span><span | |
8281 class="cmtt-8"> </span><span | |
8282 class="cmtt-8"> </span><span | |
8283 class="cmtt-8"> </span><span | |
8284 class="cmtt-8"> </span><span | |
8285 class="cmtt-8"> </span><span | |
8286 class="cmtt-8"> </span><span | |
8287 class="cmtt-8"> </span><span | |
8288 class="cmsy-8">}</span><span | |
8289 class="cmtt-8"> else</span><span | |
8290 class="cmtt-8"> [val]</span><span | |
8291 class="cmtt-8"> is</span><span | |
8292 class="cmtt-8"> even</span><span | |
8293 class="cmtt-8"> </span><span | |
8294 class="cmsy-8">{</span> | |
8295 <br class="fancyvrb" /><a | |
8296 id="x1-101110r55"></a><span | |
8297 class="cmr-6">55</span><span | |
8298 class="cmtt-8"> </span><span | |
8299 class="cmtt-8"> </span> | |
8300 <br class="fancyvrb" /><a | |
8301 id="x1-101112r56"></a><span | |
8302 class="cmr-6">56</span><span | |
8303 class="cmtt-8"> </span><span | |
8304 class="cmtt-8"> </span><span | |
8305 class="cmtt-8"> </span><span | |
8306 class="cmtt-8"> </span><span | |
8307 class="cmtt-8"> </span><span | |
8308 class="cmtt-8"> </span><span | |
8309 class="cmtt-8"> </span><span | |
8310 class="cmtt-8"> </span><span | |
8311 class="cmtt-8"> </span><span | |
8312 class="cmtt-8"> </span><span | |
8313 class="cmtt-8"> </span><span | |
8314 class="cmtt-8"> </span><span | |
8315 class="cmtt-8"> </span><span | |
8316 class="cmtt-8"> </span><span | |
8317 class="cmtt-8"> </span><span | |
8318 class="cmtt-8"> </span><span | |
8319 class="cmtt-8"> </span><span | |
8320 class="cmtt-8"> </span><span | |
8321 class="cmtt-8"> </span><span | |
8322 class="cmtt-8"> </span><span | |
8323 class="cmtt-8"> </span><span | |
8324 class="cmtt-8"> </span><span | |
8325 class="cmtt-8"> </span><span | |
8326 class="cmtt-8"> </span><span | |
8327 class="cmtt-8"> </span><span | |
8328 class="cmtt-8"> 26)</span><span | |
8329 class="cmtt-8"> vector</span><span | |
8330 class="cmtt-8"> [floor1_final_Y]</span><span | |
8331 class="cmtt-8"> element</span><span | |
8332 class="cmtt-8"> [i]</span><span | |
8333 class="cmtt-8"> =</span> | |
8334 <br class="fancyvrb" /><a | |
8335 id="x1-101114r57"></a><span | |
8336 class="cmr-6">57</span><span | |
8337 class="cmtt-8"> </span><span | |
8338 class="cmtt-8"> </span><span | |
8339 class="cmtt-8"> </span><span | |
8340 class="cmtt-8"> </span><span | |
8341 class="cmtt-8"> </span><span | |
8342 class="cmtt-8"> </span><span | |
8343 class="cmtt-8"> </span><span | |
8344 class="cmtt-8"> </span><span | |
8345 class="cmtt-8"> </span><span | |
8346 class="cmtt-8"> </span><span | |
8347 class="cmtt-8"> </span><span | |
8348 class="cmtt-8"> </span><span | |
8349 class="cmtt-8"> </span><span | |
8350 class="cmtt-8"> </span><span | |
8351 class="cmtt-8"> </span><span | |
8352 class="cmtt-8"> </span><span | |
8353 class="cmtt-8"> </span><span | |
8354 class="cmtt-8"> </span><span | |
8355 class="cmtt-8"> </span><span | |
8356 class="cmtt-8"> </span><span | |
8357 class="cmtt-8"> </span><span | |
8358 class="cmtt-8"> </span><span | |
8359 class="cmtt-8"> </span><span | |
8360 class="cmtt-8"> </span><span | |
8361 class="cmtt-8"> </span><span | |
8362 class="cmtt-8"> </span><span | |
8363 class="cmtt-8"> </span><span | |
8364 class="cmtt-8"> </span><span | |
8365 class="cmtt-8"> </span><span | |
8366 class="cmtt-8"> [predicted]</span><span | |
8367 class="cmtt-8"> +</span><span | |
8368 class="cmtt-8"> ([val]</span><span | |
8369 class="cmtt-8"> /</span><span | |
8370 class="cmtt-8"> 2</span><span | |
8371 class="cmtt-8"> using</span><span | |
8372 class="cmtt-8"> integer</span><span | |
8373 class="cmtt-8"> division)</span> | |
8374 <br class="fancyvrb" /><a | |
8375 id="x1-101116r58"></a><span | |
8376 class="cmr-6">58</span><span | |
8377 class="cmtt-8"> </span><span | |
8378 class="cmtt-8"> </span> | |
8379 <br class="fancyvrb" /><a | |
8380 id="x1-101118r59"></a><span | |
8381 class="cmr-6">59</span><span | |
8382 class="cmtt-8"> </span><span | |
8383 class="cmtt-8"> </span><span | |
8384 class="cmtt-8"> </span><span | |
8385 class="cmtt-8"> </span><span | |
8386 class="cmtt-8"> </span><span | |
8387 class="cmtt-8"> </span><span | |
8388 class="cmtt-8"> </span><span | |
8389 class="cmtt-8"> </span><span | |
8390 class="cmtt-8"> </span><span | |
8391 class="cmtt-8"> </span><span | |
8392 class="cmtt-8"> </span><span | |
8393 class="cmtt-8"> </span><span | |
8394 class="cmtt-8"> </span><span | |
8395 class="cmtt-8"> </span><span | |
8396 class="cmtt-8"> </span><span | |
8397 class="cmtt-8"> </span><span | |
8398 class="cmtt-8"> </span><span | |
8399 class="cmtt-8"> </span><span | |
8400 class="cmtt-8"> </span><span | |
8401 class="cmtt-8"> </span><span | |
8402 class="cmtt-8"> </span><span | |
8403 class="cmtt-8"> </span><span | |
8404 class="cmtt-8"> </span><span | |
8405 class="cmtt-8"> </span><span | |
8406 class="cmsy-8">}</span> | |
8407 <br class="fancyvrb" /><a | |
8408 id="x1-101120r60"></a><span | |
8409 class="cmr-6">60</span><span | |
8410 class="cmtt-8"> </span><span | |
8411 class="cmtt-8"> </span> | |
8412 <br class="fancyvrb" /><a | |
8413 id="x1-101122r61"></a><span | |
8414 class="cmr-6">61</span><span | |
8415 class="cmtt-8"> </span><span | |
8416 class="cmtt-8"> </span><span | |
8417 class="cmtt-8"> </span><span | |
8418 class="cmtt-8"> </span><span | |
8419 class="cmtt-8"> </span><span | |
8420 class="cmtt-8"> </span><span | |
8421 class="cmtt-8"> </span><span | |
8422 class="cmtt-8"> </span><span | |
8423 class="cmtt-8"> </span><span | |
8424 class="cmtt-8"> </span><span | |
8425 class="cmtt-8"> </span><span | |
8426 class="cmtt-8"> </span><span | |
8427 class="cmtt-8"> </span><span | |
8428 class="cmtt-8"> </span><span | |
8429 class="cmtt-8"> </span><span | |
8430 class="cmtt-8"> </span><span | |
8431 class="cmtt-8"> </span><span | |
8432 class="cmtt-8"> </span><span | |
8433 class="cmsy-8">}</span> | |
8434 <br class="fancyvrb" /><a | |
8435 id="x1-101124r62"></a><span | |
8436 class="cmr-6">62</span><span | |
8437 class="cmtt-8"> </span><span | |
8438 class="cmtt-8"> </span> | |
8439 <br class="fancyvrb" /><a | |
8440 id="x1-101126r63"></a><span | |
8441 class="cmr-6">63</span><span | |
8442 class="cmtt-8"> </span><span | |
8443 class="cmtt-8"> </span><span | |
8444 class="cmtt-8"> </span><span | |
8445 class="cmtt-8"> </span><span | |
8446 class="cmtt-8"> </span><span | |
8447 class="cmtt-8"> </span><span | |
8448 class="cmtt-8"> </span><span | |
8449 class="cmtt-8"> </span><span | |
8450 class="cmtt-8"> </span><span | |
8451 class="cmtt-8"> </span><span | |
8452 class="cmtt-8"> </span><span | |
8453 class="cmtt-8"> </span><span | |
8454 class="cmsy-8">}</span><span | |
8455 class="cmtt-8"> else</span><span | |
8456 class="cmtt-8"> [val]</span><span | |
8457 class="cmtt-8"> is</span><span | |
8458 class="cmtt-8"> zero</span><span | |
8459 class="cmtt-8"> </span><span | |
8460 class="cmsy-8">{</span> | |
8461 <br class="fancyvrb" /><a | |
8462 id="x1-101128r64"></a><span | |
8463 class="cmr-6">64</span><span | |
8464 class="cmtt-8"> </span><span | |
8465 class="cmtt-8"> </span> | |
8466 <br class="fancyvrb" /><a | |
8467 id="x1-101130r65"></a><span | |
8468 class="cmr-6">65</span><span | |
8469 class="cmtt-8"> </span><span | |
8470 class="cmtt-8"> </span><span | |
8471 class="cmtt-8"> </span><span | |
8472 class="cmtt-8"> </span><span | |
8473 class="cmtt-8"> </span><span | |
8474 class="cmtt-8"> </span><span | |
8475 class="cmtt-8"> </span><span | |
8476 class="cmtt-8"> </span><span | |
8477 class="cmtt-8"> </span><span | |
8478 class="cmtt-8"> </span><span | |
8479 class="cmtt-8"> </span><span | |
8480 class="cmtt-8"> </span><span | |
8481 class="cmtt-8"> </span><span | |
8482 class="cmtt-8"> 27)</span><span | |
8483 class="cmtt-8"> vector</span><span | |
8484 class="cmtt-8"> [floor1_step2_flag]</span><span | |
8485 class="cmtt-8"> element</span><span | |
8486 class="cmtt-8"> [i]</span><span | |
8487 class="cmtt-8"> =</span><span | |
8488 class="cmtt-8"> unset</span> | |
8489 | |
8490 | |
8491 | |
8492 <br class="fancyvrb" /><a | |
8493 id="x1-101132r66"></a><span | |
8494 class="cmr-6">66</span><span | |
8495 class="cmtt-8"> </span><span | |
8496 class="cmtt-8"> </span><span | |
8497 class="cmtt-8"> </span><span | |
8498 class="cmtt-8"> </span><span | |
8499 class="cmtt-8"> </span><span | |
8500 class="cmtt-8"> </span><span | |
8501 class="cmtt-8"> </span><span | |
8502 class="cmtt-8"> </span><span | |
8503 class="cmtt-8"> </span><span | |
8504 class="cmtt-8"> </span><span | |
8505 class="cmtt-8"> </span><span | |
8506 class="cmtt-8"> </span><span | |
8507 class="cmtt-8"> </span><span | |
8508 class="cmtt-8"> 28)</span><span | |
8509 class="cmtt-8"> vector</span><span | |
8510 class="cmtt-8"> [floor1_final_Y]</span><span | |
8511 class="cmtt-8"> element</span><span | |
8512 class="cmtt-8"> [i]</span><span | |
8513 class="cmtt-8"> =</span><span | |
8514 class="cmtt-8"> [predicted]</span> | |
8515 <br class="fancyvrb" /><a | |
8516 id="x1-101134r67"></a><span | |
8517 class="cmr-6">67</span><span | |
8518 class="cmtt-8"> </span><span | |
8519 class="cmtt-8"> </span> | |
8520 <br class="fancyvrb" /><a | |
8521 id="x1-101136r68"></a><span | |
8522 class="cmr-6">68</span><span | |
8523 class="cmtt-8"> </span><span | |
8524 class="cmtt-8"> </span><span | |
8525 class="cmtt-8"> </span><span | |
8526 class="cmtt-8"> </span><span | |
8527 class="cmtt-8"> </span><span | |
8528 class="cmtt-8"> </span><span | |
8529 class="cmtt-8"> </span><span | |
8530 class="cmtt-8"> </span><span | |
8531 class="cmtt-8"> </span><span | |
8532 class="cmtt-8"> </span><span | |
8533 class="cmtt-8"> </span><span | |
8534 class="cmtt-8"> </span><span | |
8535 class="cmsy-8">}</span> | |
8536 <br class="fancyvrb" /><a | |
8537 id="x1-101138r69"></a><span | |
8538 class="cmr-6">69</span><span | |
8539 class="cmtt-8"> </span><span | |
8540 class="cmtt-8"> </span> | |
8541 <br class="fancyvrb" /><a | |
8542 id="x1-101140r70"></a><span | |
8543 class="cmr-6">70</span><span | |
8544 class="cmtt-8"> </span><span | |
8545 class="cmtt-8"> </span><span | |
8546 class="cmtt-8"> </span><span | |
8547 class="cmtt-8"> </span><span | |
8548 class="cmtt-8"> </span><span | |
8549 class="cmtt-8"> </span><span | |
8550 class="cmtt-8"> </span><span | |
8551 class="cmsy-8">}</span> | |
8552 <br class="fancyvrb" /><a | |
8553 id="x1-101142r71"></a><span | |
8554 class="cmr-6">71</span><span | |
8555 class="cmtt-8"> </span><span | |
8556 class="cmtt-8"> </span> | |
8557 <br class="fancyvrb" /><a | |
8558 id="x1-101144r72"></a><span | |
8559 class="cmr-6">72</span><span | |
8560 class="cmtt-8"> </span><span | |
8561 class="cmtt-8"> </span><span | |
8562 class="cmtt-8"> 29)</span><span | |
8563 class="cmtt-8"> done</span> | |
8564 <br class="fancyvrb" /><a | |
8565 id="x1-101146r73"></a><span | |
8566 class="cmr-6">73</span><span | |
8567 class="cmtt-8"> </span><span | |
8568 class="cmtt-8"> </span> | |
8569 </div> | |
8570 </dd><dt class="description"> | |
8571 <span | |
8572 class="cmssbx-10x-x-120">step 2: curve synthesis</span> </dt><dd | |
8573 class="description"> | |
8574 <!--l. 351--><p class="noindent" >Curve synthesis generates a return vector <span | |
8575 class="cmtt-12">[floor] </span>of length <span | |
8576 class="cmtt-12">[n] </span>(where <span | |
8577 class="cmtt-12">[n] </span>is provided by | |
8578 the decode process calling to floor decode). Floor 1 curve synthesis makes use of the | |
8579 <span | |
8580 class="cmtt-12">[floor1_X_list]</span>, <span | |
8581 class="cmtt-12">[floor1_final_Y] </span>and <span | |
8582 class="cmtt-12">[floor1_step2_flag] </span>vectors, as well as | |
8583 [floor1_multiplier] and [floor1_values] values. | |
8584 <!--l. 358--><p class="noindent" >Decode begins by sorting the scalars from vectors <span | |
8585 class="cmtt-12">[floor1_X_list]</span>, <span | |
8586 class="cmtt-12">[floor1_final_Y] </span>and | |
8587 <span | |
8588 class="cmtt-12">[floor1_step2_flag] </span>together into new vectors <span | |
8589 class="cmtt-12">[floor1_X_list]’</span>, <span | |
8590 class="cmtt-12">[floor1_final_Y]’</span> | |
8591 and <span | |
8592 class="cmtt-12">[floor1_step2_flag]’ </span>according to ascending sort order of the values in | |
8593 <span | |
8594 class="cmtt-12">[floor1_X_list]</span>. That is, sort the values of <span | |
8595 class="cmtt-12">[floor1_X_list] </span>and then apply the same | |
8596 permutation to elements of the other two vectors so that the X, Y and step2_flag values | |
8597 still match. | |
8598 <!--l. 368--><p class="noindent" >Then compute the final curve in one pass: | |
8599 <!--l. 370--><p class="noindent" > | |
8600 <div class="fancyvrb" id="fancyvrb32"> | |
8601 <a | |
8602 id="x1-101148r1"></a><span | |
8603 class="cmr-6">1</span><span | |
8604 class="cmtt-8"> </span><span | |
8605 class="cmtt-8"> </span><span | |
8606 class="cmtt-8"> </span><span | |
8607 class="cmtt-8"> 1)</span><span | |
8608 class="cmtt-8"> [hx]</span><span | |
8609 class="cmtt-8"> =</span><span | |
8610 class="cmtt-8"> 0</span> | |
8611 <br class="fancyvrb" /><a | |
8612 id="x1-101150r2"></a><span | |
8613 class="cmr-6">2</span><span | |
8614 class="cmtt-8"> </span><span | |
8615 class="cmtt-8"> </span><span | |
8616 class="cmtt-8"> </span><span | |
8617 class="cmtt-8"> 2)</span><span | |
8618 class="cmtt-8"> [lx]</span><span | |
8619 class="cmtt-8"> =</span><span | |
8620 class="cmtt-8"> 0</span> | |
8621 <br class="fancyvrb" /><a | |
8622 id="x1-101152r3"></a><span | |
8623 class="cmr-6">3</span><span | |
8624 class="cmtt-8"> </span><span | |
8625 class="cmtt-8"> </span><span | |
8626 class="cmtt-8"> </span><span | |
8627 class="cmtt-8"> 3)</span><span | |
8628 class="cmtt-8"> [ly]</span><span | |
8629 class="cmtt-8"> =</span><span | |
8630 class="cmtt-8"> vector</span><span | |
8631 class="cmtt-8"> [floor1_final_Y]’</span><span | |
8632 class="cmtt-8"> element</span><span | |
8633 class="cmtt-8"> [0]</span><span | |
8634 class="cmtt-8"> *</span><span | |
8635 class="cmtt-8"> [floor1_multiplier]</span> | |
8636 <br class="fancyvrb" /><a | |
8637 id="x1-101154r4"></a><span | |
8638 class="cmr-6">4</span><span | |
8639 class="cmtt-8"> </span><span | |
8640 class="cmtt-8"> </span><span | |
8641 class="cmtt-8"> </span><span | |
8642 class="cmtt-8"> 4)</span><span | |
8643 class="cmtt-8"> iterate</span><span | |
8644 class="cmtt-8"> [i]</span><span | |
8645 class="cmtt-8"> over</span><span | |
8646 class="cmtt-8"> the</span><span | |
8647 class="cmtt-8"> range</span><span | |
8648 class="cmtt-8"> 1</span><span | |
8649 class="cmtt-8"> ...</span><span | |
8650 class="cmtt-8"> [floor1_values]-1</span><span | |
8651 class="cmtt-8"> </span><span | |
8652 class="cmsy-8">{</span> | |
8653 <br class="fancyvrb" /><a | |
8654 id="x1-101156r5"></a><span | |
8655 class="cmr-6">5</span><span | |
8656 class="cmtt-8"> </span><span | |
8657 class="cmtt-8"> </span> | |
8658 <br class="fancyvrb" /><a | |
8659 id="x1-101158r6"></a><span | |
8660 class="cmr-6">6</span><span | |
8661 class="cmtt-8"> </span><span | |
8662 class="cmtt-8"> </span><span | |
8663 class="cmtt-8"> </span><span | |
8664 class="cmtt-8"> </span><span | |
8665 class="cmtt-8"> </span><span | |
8666 class="cmtt-8"> </span><span | |
8667 class="cmtt-8"> </span><span | |
8668 class="cmtt-8"> </span><span | |
8669 class="cmtt-8"> 5)</span><span | |
8670 class="cmtt-8"> if</span><span | |
8671 class="cmtt-8"> (</span><span | |
8672 class="cmtt-8"> [floor1_step2_flag]’</span><span | |
8673 class="cmtt-8"> element</span><span | |
8674 class="cmtt-8"> [i]</span><span | |
8675 class="cmtt-8"> is</span><span | |
8676 class="cmtt-8"> set</span><span | |
8677 class="cmtt-8"> )</span><span | |
8678 class="cmtt-8"> </span><span | |
8679 class="cmsy-8">{</span> | |
8680 <br class="fancyvrb" /><a | |
8681 id="x1-101160r7"></a><span | |
8682 class="cmr-6">7</span><span | |
8683 class="cmtt-8"> </span><span | |
8684 class="cmtt-8"> </span> | |
8685 <br class="fancyvrb" /><a | |
8686 id="x1-101162r8"></a><span | |
8687 class="cmr-6">8</span><span | |
8688 class="cmtt-8"> </span><span | |
8689 class="cmtt-8"> </span><span | |
8690 class="cmtt-8"> </span><span | |
8691 class="cmtt-8"> </span><span | |
8692 class="cmtt-8"> </span><span | |
8693 class="cmtt-8"> </span><span | |
8694 class="cmtt-8"> </span><span | |
8695 class="cmtt-8"> </span><span | |
8696 class="cmtt-8"> </span><span | |
8697 class="cmtt-8"> </span><span | |
8698 class="cmtt-8"> </span><span | |
8699 class="cmtt-8"> </span><span | |
8700 class="cmtt-8"> </span><span | |
8701 class="cmtt-8"> </span><span | |
8702 class="cmtt-8"> 6)</span><span | |
8703 class="cmtt-8"> [hy]</span><span | |
8704 class="cmtt-8"> =</span><span | |
8705 class="cmtt-8"> [floor1_final_Y]’</span><span | |
8706 class="cmtt-8"> element</span><span | |
8707 class="cmtt-8"> [i]</span><span | |
8708 class="cmtt-8"> *</span><span | |
8709 class="cmtt-8"> [floor1_multiplier]</span> | |
8710 <br class="fancyvrb" /><a | |
8711 id="x1-101164r9"></a><span | |
8712 class="cmr-6">9</span><span | |
8713 class="cmtt-8"> </span><span | |
8714 class="cmtt-8"> </span><span | |
8715 class="cmtt-8">  </span><span | |
8716 class="cmtt-8"> </span><span | |
8717 class="cmtt-8"> </span><span | |
8718 class="cmtt-8"> </span><span | |
8719 class="cmtt-8"> </span><span | |
8720 class="cmtt-8"> 7)</span><span | |
8721 class="cmtt-8"> [hx]</span><span | |
8722 class="cmtt-8"> =</span><span | |
8723 class="cmtt-8"> [floor1_X_list]’</span><span | |
8724 class="cmtt-8"> element</span><span | |
8725 class="cmtt-8"> [i]</span> | |
8726 <br class="fancyvrb" /><a | |
8727 id="x1-101166r10"></a><span | |
8728 class="cmr-6">10</span><span | |
8729 class="cmtt-8"> </span><span | |
8730 class="cmtt-8"> </span><span | |
8731 class="cmtt-8"> </span><span | |
8732 class="cmtt-8"> </span><span | |
8733 class="cmtt-8"> </span><span | |
8734 class="cmtt-8"> </span><span | |
8735 class="cmtt-8"> </span><span | |
8736 class="cmtt-8"> </span><span | |
8737 class="cmtt-8"> </span><span | |
8738 class="cmtt-8"> </span><span | |
8739 class="cmtt-8"> </span><span | |
8740 class="cmtt-8"> </span><span | |
8741 class="cmtt-8"> </span><span | |
8742 class="cmtt-8"> </span><span | |
8743 class="cmtt-8"> 8)</span><span | |
8744 class="cmtt-8"> </span><a | |
8745 href="#x1-1230009.2.7"><span | |
8746 class="cmtt-8">render_line</span></a><span | |
8747 class="cmtt-8">(</span><span | |
8748 class="cmtt-8"> [lx],</span><span | |
8749 class="cmtt-8"> [ly],</span><span | |
8750 class="cmtt-8"> [hx],</span><span | |
8751 class="cmtt-8"> [hy],</span><span | |
8752 class="cmtt-8"> [floor]</span><span | |
8753 class="cmtt-8"> )</span> | |
8754 <br class="fancyvrb" /><a | |
8755 id="x1-101168r11"></a><span | |
8756 class="cmr-6">11</span><span | |
8757 class="cmtt-8"> </span><span | |
8758 class="cmtt-8"> </span><span | |
8759 class="cmtt-8"> </span><span | |
8760 class="cmtt-8"> </span><span | |
8761 class="cmtt-8"> </span><span | |
8762 class="cmtt-8"> </span><span | |
8763 class="cmtt-8"> </span><span | |
8764 class="cmtt-8"> </span><span | |
8765 class="cmtt-8"> </span><span | |
8766 class="cmtt-8"> </span><span | |
8767 class="cmtt-8"> </span><span | |
8768 class="cmtt-8"> </span><span | |
8769 class="cmtt-8"> </span><span | |
8770 class="cmtt-8"> </span><span | |
8771 class="cmtt-8"> 9)</span><span | |
8772 class="cmtt-8"> [lx]</span><span | |
8773 class="cmtt-8"> =</span><span | |
8774 class="cmtt-8"> [hx]</span> | |
8775 <br class="fancyvrb" /><a | |
8776 id="x1-101170r12"></a><span | |
8777 class="cmr-6">12</span><span | |
8778 class="cmtt-8"> </span><span | |
8779 class="cmtt-8">  </span><span | |
8780 class="cmtt-8"> </span><span | |
8781 class="cmtt-8"> </span><span | |
8782 class="cmtt-8"> </span><span | |
8783 class="cmtt-8"> 10)</span><span | |
8784 class="cmtt-8"> [ly]</span><span | |
8785 class="cmtt-8"> =</span><span | |
8786 class="cmtt-8"> [hy]</span> | |
8787 <br class="fancyvrb" /><a | |
8788 id="x1-101172r13"></a><span | |
8789 class="cmr-6">13</span><span | |
8790 class="cmtt-8"> </span><span | |
8791 class="cmtt-8"> </span><span | |
8792 class="cmtt-8"> </span><span | |
8793 class="cmtt-8"> </span><span | |
8794 class="cmtt-8"> </span><span | |
8795 class="cmtt-8"> </span><span | |
8796 class="cmtt-8"> </span><span | |
8797 class="cmtt-8"> </span><span | |
8798 class="cmtt-8"> </span><span | |
8799 class="cmtt-8"> </span><span | |
8800 class="cmtt-8"> </span><span | |
8801 class="cmtt-8"> </span><span | |
8802 class="cmsy-8">}</span> | |
8803 <br class="fancyvrb" /><a | |
8804 id="x1-101174r14"></a><span | |
8805 class="cmr-6">14</span><span | |
8806 class="cmtt-8"> </span><span | |
8807 class="cmtt-8"> </span><span | |
8808 class="cmtt-8"> </span><span | |
8809 class="cmtt-8"> </span><span | |
8810 class="cmtt-8"> </span><span | |
8811 class="cmtt-8"> </span><span | |
8812 class="cmtt-8"> </span><span | |
8813 class="cmsy-8">}</span> | |
8814 <br class="fancyvrb" /><a | |
8815 id="x1-101176r15"></a><span | |
8816 class="cmr-6">15</span><span | |
8817 class="cmtt-8"> </span><span | |
8818 class="cmtt-8"> </span> | |
8819 <br class="fancyvrb" /><a | |
8820 id="x1-101178r16"></a><span | |
8821 class="cmr-6">16</span><span | |
8822 class="cmtt-8"> </span><span | |
8823 class="cmtt-8"> </span><span | |
8824 class="cmtt-8"> 11)</span><span | |
8825 class="cmtt-8"> if</span><span | |
8826 class="cmtt-8"> (</span><span | |
8827 class="cmtt-8"> [hx]</span><span | |
8828 class="cmtt-8"> is</span><span | |
8829 class="cmtt-8"> less</span><span | |
8830 class="cmtt-8"> than</span><span | |
8831 class="cmtt-8"> [n]</span><span | |
8832 class="cmtt-8"> )</span><span | |
8833 class="cmtt-8"> </span><span | |
8834 class="cmsy-8">{</span> | |
8835 <br class="fancyvrb" /><a | |
8836 id="x1-101180r17"></a><span | |
8837 class="cmr-6">17</span><span | |
8838 class="cmtt-8"> </span><span | |
8839 class="cmtt-8"> </span> | |
8840 <br class="fancyvrb" /><a | |
8841 id="x1-101182r18"></a><span | |
8842 class="cmr-6">18</span><span | |
8843 class="cmtt-8"> </span><span | |
8844 class="cmtt-8"> </span><span | |
8845 class="cmtt-8"> </span><span | |
8846 class="cmtt-8"> </span><span | |
8847 class="cmtt-8"> </span><span | |
8848 class="cmtt-8"> </span><span | |
8849 class="cmtt-8"> </span><span | |
8850 class="cmtt-8"> </span><span | |
8851 class="cmtt-8"> </span><span | |
8852 class="cmtt-8"> 12)</span><span | |
8853 class="cmtt-8"> </span><a | |
8854 href="#x1-1230009.2.7"><span | |
8855 class="cmtt-8">render_line</span></a><span | |
8856 class="cmtt-8">(</span><span | |
8857 class="cmtt-8"> [hx],</span><span | |
8858 class="cmtt-8"> [hy],</span><span | |
8859 class="cmtt-8"> [n],</span><span | |
8860 class="cmtt-8"> [hy],</span><span | |
8861 class="cmtt-8"> [floor]</span><span | |
8862 class="cmtt-8"> )</span> | |
8863 <br class="fancyvrb" /><a | |
8864 id="x1-101184r19"></a><span | |
8865 class="cmr-6">19</span><span | |
8866 class="cmtt-8"> </span><span | |
8867 class="cmtt-8"> </span> | |
8868 <br class="fancyvrb" /><a | |
8869 id="x1-101186r20"></a><span | |
8870 class="cmr-6">20</span><span | |
8871 class="cmtt-8"> </span><span | |
8872 class="cmtt-8"> </span><span | |
8873 class="cmtt-8"> </span><span | |
8874 class="cmtt-8"> </span><span | |
8875 class="cmtt-8"> </span><span | |
8876 class="cmtt-8"> </span><span | |
8877 class="cmtt-8"> </span><span | |
8878 class="cmsy-8">}</span> | |
8879 <br class="fancyvrb" /><a | |
8880 id="x1-101188r21"></a><span | |
8881 class="cmr-6">21</span><span | |
8882 class="cmtt-8"> </span><span | |
8883 class="cmtt-8"> </span> | |
8884 <br class="fancyvrb" /><a | |
8885 id="x1-101190r22"></a><span | |
8886 class="cmr-6">22</span><span | |
8887 class="cmtt-8"> </span><span | |
8888 class="cmtt-8"> </span><span | |
8889 class="cmtt-8"> 13)</span><span | |
8890 class="cmtt-8"> if</span><span | |
8891 class="cmtt-8"> (</span><span | |
8892 class="cmtt-8"> [hx]</span><span | |
8893 class="cmtt-8"> is</span><span | |
8894 class="cmtt-8"> greater</span><span | |
8895 class="cmtt-8"> than</span><span | |
8896 class="cmtt-8"> [n]</span><span | |
8897 class="cmtt-8"> )</span><span | |
8898 class="cmtt-8"> </span><span | |
8899 class="cmsy-8">{</span> | |
8900 <br class="fancyvrb" /><a | |
8901 id="x1-101192r23"></a><span | |
8902 class="cmr-6">23</span><span | |
8903 class="cmtt-8"> </span><span | |
8904 class="cmtt-8"> </span> | |
8905 <br class="fancyvrb" /><a | |
8906 id="x1-101194r24"></a><span | |
8907 class="cmr-6">24</span><span | |
8908 class="cmtt-8"> </span><span | |
8909 class="cmtt-8"> </span><span | |
8910 class="cmtt-8"> </span><span | |
8911 class="cmtt-8"> </span><span | |
8912 class="cmtt-8"> </span><span | |
8913 class="cmtt-8"> </span><span | |
8914 class="cmtt-8"> </span><span | |
8915 class="cmtt-8"> </span><span | |
8916 class="cmtt-8"> </span><span | |
8917 class="cmtt-8"> </span><span | |
8918 class="cmtt-8"> </span><span | |
8919 class="cmtt-8"> </span><span | |
8920 class="cmtt-8"> </span><span | |
8921 class="cmtt-8"> 14)</span><span | |
8922 class="cmtt-8"> truncate</span><span | |
8923 class="cmtt-8"> vector</span><span | |
8924 class="cmtt-8"> [floor]</span><span | |
8925 class="cmtt-8"> to</span><span | |
8926 class="cmtt-8"> [n]</span><span | |
8927 class="cmtt-8"> elements</span> | |
8928 <br class="fancyvrb" /><a | |
8929 id="x1-101196r25"></a><span | |
8930 class="cmr-6">25</span><span | |
8931 class="cmtt-8"> </span><span | |
8932 class="cmtt-8"> </span> | |
8933 <br class="fancyvrb" /><a | |
8934 id="x1-101198r26"></a><span | |
8935 class="cmr-6">26</span><span | |
8936 class="cmtt-8"> </span><span | |
8937 class="cmtt-8"> </span><span | |
8938 class="cmtt-8"> </span><span | |
8939 class="cmtt-8"> </span><span | |
8940 class="cmtt-8"> </span><span | |
8941 class="cmtt-8"> </span><span | |
8942 class="cmtt-8"> </span><span | |
8943 class="cmsy-8">}</span> | |
8944 <br class="fancyvrb" /><a | |
8945 id="x1-101200r27"></a><span | |
8946 class="cmr-6">27</span><span | |
8947 class="cmtt-8"> </span><span | |
8948 class="cmtt-8"> </span> | |
8949 | |
8950 | |
8951 | |
8952 <br class="fancyvrb" /><a | |
8953 id="x1-101202r28"></a><span | |
8954 class="cmr-6">28</span><span | |
8955 class="cmtt-8"> </span><span | |
8956 class="cmtt-8"> </span><span | |
8957 class="cmtt-8"> 15)</span><span | |
8958 class="cmtt-8"> for</span><span | |
8959 class="cmtt-8"> each</span><span | |
8960 class="cmtt-8"> scalar</span><span | |
8961 class="cmtt-8"> in</span><span | |
8962 class="cmtt-8"> vector</span><span | |
8963 class="cmtt-8"> [floor],</span><span | |
8964 class="cmtt-8"> perform</span><span | |
8965 class="cmtt-8"> a</span><span | |
8966 class="cmtt-8"> lookup</span><span | |
8967 class="cmtt-8"> substitution</span><span | |
8968 class="cmtt-8"> using</span> | |
8969 <br class="fancyvrb" /><a | |
8970 id="x1-101204r29"></a><span | |
8971 class="cmr-6">29</span><span | |
8972 class="cmtt-8"> </span><span | |
8973 class="cmtt-8"> </span><span | |
8974 class="cmtt-8"> </span><span | |
8975 class="cmtt-8"> </span><span | |
8976 class="cmtt-8"> </span><span | |
8977 class="cmtt-8"> </span><span | |
8978 class="cmtt-8"> the</span><span | |
8979 class="cmtt-8"> scalar</span><span | |
8980 class="cmtt-8"> value</span><span | |
8981 class="cmtt-8"> from</span><span | |
8982 class="cmtt-8"> [floor]</span><span | |
8983 class="cmtt-8"> as</span><span | |
8984 class="cmtt-8"> an</span><span | |
8985 class="cmtt-8"> offset</span><span | |
8986 class="cmtt-8"> into</span><span | |
8987 class="cmtt-8"> the</span><span | |
8988 class="cmtt-8"> vector</span><span | |
8989 class="cmtt-8"> </span><a | |
8990 href="#x1-12500010.1"><span | |
8991 class="cmtt-8">[floor1_inverse_dB_static_table]</span></a> | |
8992 <br class="fancyvrb" /><a | |
8993 id="x1-101206r30"></a><span | |
8994 class="cmr-6">30</span><span | |
8995 class="cmtt-8"> </span><span | |
8996 class="cmtt-8"> </span> | |
8997 <br class="fancyvrb" /><a | |
8998 id="x1-101208r31"></a><span | |
8999 class="cmr-6">31</span><span | |
9000 class="cmtt-8"> </span><span | |
9001 class="cmtt-8"> </span><span | |
9002 class="cmtt-8"> 16)</span><span | |
9003 class="cmtt-8"> done</span> | |
9004 <br class="fancyvrb" /><a | |
9005 id="x1-101210r32"></a><span | |
9006 class="cmr-6">32</span><span | |
9007 class="cmtt-8"> </span><span | |
9008 class="cmtt-8"> </span> | |
9009 </div> | |
9010 </dd></dl> | |
9011 | |
9012 | |
9013 | |
9014 <h3 class="sectionHead"><span class="titlemark">8. </span> <a | |
9015 id="x1-1020008"></a>Residue setup and decode</h3> | |
9016 <!--l. 6--><p class="noindent" > | |
9017 <h4 class="subsectionHead"><span class="titlemark">8.1. </span> <a | |
9018 id="x1-1030008.1"></a>Overview</h4> | |
9019 <!--l. 8--><p class="noindent" >A residue vector represents the fine detail of the audio spectrum of one channel in an audio frame | |
9020 after the encoder subtracts the floor curve and performs any channel coupling. A residue vector | |
9021 may represent spectral lines, spectral magnitude, spectral phase or hybrids as mixed by channel | |
9022 coupling. The exact semantic content of the vector does not matter to the residue | |
9023 abstraction. | |
9024 <!--l. 15--><p class="noindent" >Whatever the exact qualities, the Vorbis residue abstraction codes the residue vectors into the | |
9025 bitstream packet, and then reconstructs the vectors during decode. Vorbis makes use of three | |
9026 different encoding variants (numbered 0, 1 and 2) of the same basic vector encoding | |
9027 abstraction. | |
9028 <!--l. 23--><p class="noindent" > | |
9029 <h4 class="subsectionHead"><span class="titlemark">8.2. </span> <a | |
9030 id="x1-1040008.2"></a>Residue format</h4> | |
9031 <!--l. 25--><p class="noindent" >Residue format partitions each vector in the vector bundle into chunks, classifies each | |
9032 chunk, encodes the chunk classifications and finally encodes the chunks themselves | |
9033 using the the specific VQ arrangement defined for each selected classification. The | |
9034 exact interleaving and partitioning vary by residue encoding number, however the | |
9035 high-level process used to classify and encode the residue vector is the same in all three | |
9036 variants. | |
9037 <!--l. 33--><p class="noindent" >A set of coded residue vectors are all of the same length. High level coding structure, ignoring for | |
9038 the moment exactly how a partition is encoded and simply trusting that it is, is as | |
9039 follows: | |
9040 <ul class="itemize1"> | |
9041 <li class="itemize">Each vector is partitioned into multiple equal sized chunks according to configuration | |
9042 specified. If we have a vector size of <span | |
9043 class="cmti-12">n</span>, a partition size <span | |
9044 class="cmti-12">residue</span><span | |
9045 class="cmti-12">_partition</span><span | |
9046 class="cmti-12">_size</span>, | |
9047 and a total of <span | |
9048 class="cmti-12">ch </span>residue vectors, the total number of partitioned chunks coded | |
9049 | |
9050 | |
9051 | |
9052 is <span | |
9053 class="cmti-12">n</span>/<span | |
9054 class="cmti-12">residue</span><span | |
9055 class="cmti-12">_partition</span><span | |
9056 class="cmti-12">_size</span>*<span | |
9057 class="cmti-12">ch</span>. It is important to note that the integer division | |
9058 truncates. In the below example, we assume an example <span | |
9059 class="cmti-12">residue</span><span | |
9060 class="cmti-12">_partition</span><span | |
9061 class="cmti-12">_size </span>of 8. | |
9062 </li> | |
9063 <li class="itemize">Each partition in each vector has a classification number that specifies which of | |
9064 multiple configured VQ codebook setups are used to decode that partition. The | |
9065 classification numbers of each partition can be thought of as forming a vector in | |
9066 their own right, as in the illustration below. Just as the residue vectors are coded | |
9067 in grouped partitions to increase encoding efficiency, the classification vector is also | |
9068 partitioned into chunks. The integer elements of each scalar in a classification chunk | |
9069 are built into a single scalar that represents the classification numbers in that chunk. | |
9070 In the below example, the classification codeword encodes two classification numbers. | |
9071 </li> | |
9072 <li class="itemize">The values in a residue vector may be encoded monolithically in a single pass through | |
9073 the residue vector, but more often efficient codebook design dictates that each vector | |
9074 is encoded as the additive sum of several passes through the residue vector using | |
9075 more than one VQ codebook. Thus, each residue value potentially accumulates values | |
9076 from multiple decode passes. The classification value associated with a partition is | |
9077 the same in each pass, thus the classification codeword is coded only in the first pass. | |
9078 </li></ul> | |
9079 <div class="center" | |
9080 > | |
9081 <!--l. 70--><p class="noindent" > | |
9082 | |
9083 <!--l. 71--><p class="noindent" ><img | |
9084 src="residue-pack.png" alt="PIC" | |
9085 > | |
9086 <br /> <div class="caption" | |
9087 ><span class="id">Figure 11: </span><span | |
9088 class="content">illustration of residue vector format</span></div><!--tex4ht:label?: x1-10400111 --> | |
9089 </div> | |
9090 <!--l. 77--><p class="noindent" > | |
9091 <h4 class="subsectionHead"><span class="titlemark">8.3. </span> <a | |
9092 id="x1-1050008.3"></a>residue 0</h4> | |
9093 <!--l. 79--><p class="noindent" >Residue 0 and 1 differ only in the way the values within a residue partition are interleaved during | |
9094 partition encoding (visually treated as a black box–or cyan box or brown box–in the above | |
9095 figure). | |
9096 <!--l. 83--><p class="noindent" >Residue encoding 0 interleaves VQ encoding according to the dimension of the codebook used to | |
9097 | |
9098 | |
9099 | |
9100 encode a partition in a specific pass. The dimension of the codebook need not be the same in | |
9101 multiple passes, however the partition size must be an even multiple of the codebook | |
9102 dimension. | |
9103 <!--l. 89--><p class="noindent" >As an example, assume a partition vector of size eight, to be encoded by residue 0 using | |
9104 codebook sizes of 8, 4, 2 and 1: | |
9105 <!--l. 92--><p class="noindent" > | |
9106 <div class="fancyvrb" id="fancyvrb33"> | |
9107 <a | |
9108 id="x1-105002r1"></a><span | |
9109 class="cmr-6">1</span><span | |
9110 class="cmtt-8"> </span><span | |
9111 class="cmtt-8"> </span> | |
9112 <br class="fancyvrb" /><a | |
9113 id="x1-105004r2"></a><span | |
9114 class="cmr-6">2</span><span | |
9115 class="cmtt-8"> </span><span | |
9116 class="cmtt-8"> </span><span | |
9117 class="cmtt-8"> </span><span | |
9118 class="cmtt-8"> </span><span | |
9119 class="cmtt-8"> </span><span | |
9120 class="cmtt-8"> </span><span | |
9121 class="cmtt-8"> </span><span | |
9122 class="cmtt-8"> </span><span | |
9123 class="cmtt-8"> </span><span | |
9124 class="cmtt-8"> </span><span | |
9125 class="cmtt-8"> </span><span | |
9126 class="cmtt-8"> </span><span | |
9127 class="cmtt-8"> </span><span | |
9128 class="cmtt-8"> original</span><span | |
9129 class="cmtt-8"> residue</span><span | |
9130 class="cmtt-8"> vector:</span><span | |
9131 class="cmtt-8"> [</span><span | |
9132 class="cmtt-8"> 0</span><span | |
9133 class="cmtt-8"> 1</span><span | |
9134 class="cmtt-8"> 2</span><span | |
9135 class="cmtt-8"> 3</span><span | |
9136 class="cmtt-8"> 4</span><span | |
9137 class="cmtt-8"> 5</span><span | |
9138 class="cmtt-8"> 6</span><span | |
9139 class="cmtt-8"> 7</span><span | |
9140 class="cmtt-8"> ]</span> | |
9141 <br class="fancyvrb" /><a | |
9142 id="x1-105006r3"></a><span | |
9143 class="cmr-6">3</span><span | |
9144 class="cmtt-8"> </span><span | |
9145 class="cmtt-8"> </span> | |
9146 <br class="fancyvrb" /><a | |
9147 id="x1-105008r4"></a><span | |
9148 class="cmr-6">4</span><span | |
9149 class="cmtt-8"> </span><span | |
9150 class="cmtt-8"> codebook</span><span | |
9151 class="cmtt-8"> dimensions</span><span | |
9152 class="cmtt-8"> =</span><span | |
9153 class="cmtt-8"> 8</span><span | |
9154 class="cmtt-8"> </span><span | |
9155 class="cmtt-8"> encoded</span><span | |
9156 class="cmtt-8"> as:</span><span | |
9157 class="cmtt-8"> [</span><span | |
9158 class="cmtt-8"> 0</span><span | |
9159 class="cmtt-8"> 1</span><span | |
9160 class="cmtt-8"> 2</span><span | |
9161 class="cmtt-8"> 3</span><span | |
9162 class="cmtt-8"> 4</span><span | |
9163 class="cmtt-8"> 5</span><span | |
9164 class="cmtt-8"> 6</span><span | |
9165 class="cmtt-8"> 7</span><span | |
9166 class="cmtt-8"> ]</span> | |
9167 <br class="fancyvrb" /><a | |
9168 id="x1-105010r5"></a><span | |
9169 class="cmr-6">5</span><span | |
9170 class="cmtt-8"> </span><span | |
9171 class="cmtt-8"> </span> | |
9172 <br class="fancyvrb" /><a | |
9173 id="x1-105012r6"></a><span | |
9174 class="cmr-6">6</span><span | |
9175 class="cmtt-8"> </span><span | |
9176 class="cmtt-8"> codebook</span><span | |
9177 class="cmtt-8"> dimensions</span><span | |
9178 class="cmtt-8"> =</span><span | |
9179 class="cmtt-8"> 4</span><span | |
9180 class="cmtt-8"> </span><span | |
9181 class="cmtt-8"> encoded</span><span | |
9182 class="cmtt-8"> as:</span><span | |
9183 class="cmtt-8"> [</span><span | |
9184 class="cmtt-8"> 0</span><span | |
9185 class="cmtt-8"> 2</span><span | |
9186 class="cmtt-8"> 4</span><span | |
9187 class="cmtt-8"> 6</span><span | |
9188 class="cmtt-8"> ],</span><span | |
9189 class="cmtt-8"> [</span><span | |
9190 class="cmtt-8"> 1</span><span | |
9191 class="cmtt-8"> 3</span><span | |
9192 class="cmtt-8"> 5</span><span | |
9193 class="cmtt-8"> 7</span><span | |
9194 class="cmtt-8"> ]</span> | |
9195 <br class="fancyvrb" /><a | |
9196 id="x1-105014r7"></a><span | |
9197 class="cmr-6">7</span><span | |
9198 class="cmtt-8"> </span><span | |
9199 class="cmtt-8"> </span> | |
9200 <br class="fancyvrb" /><a | |
9201 id="x1-105016r8"></a><span | |
9202 class="cmr-6">8</span><span | |
9203 class="cmtt-8"> </span><span | |
9204 class="cmtt-8"> codebook</span><span | |
9205 class="cmtt-8"> dimensions</span><span | |
9206 class="cmtt-8"> =</span><span | |
9207 class="cmtt-8"> 2</span><span | |
9208 class="cmtt-8"> </span><span | |
9209 class="cmtt-8"> encoded</span><span | |
9210 class="cmtt-8"> as:</span><span | |
9211 class="cmtt-8"> [</span><span | |
9212 class="cmtt-8"> 0</span><span | |
9213 class="cmtt-8"> 4</span><span | |
9214 class="cmtt-8"> ],</span><span | |
9215 class="cmtt-8"> [</span><span | |
9216 class="cmtt-8"> 1</span><span | |
9217 class="cmtt-8"> 5</span><span | |
9218 class="cmtt-8"> ],</span><span | |
9219 class="cmtt-8"> [</span><span | |
9220 class="cmtt-8"> 2</span><span | |
9221 class="cmtt-8"> 6</span><span | |
9222 class="cmtt-8"> ],</span><span | |
9223 class="cmtt-8"> [</span><span | |
9224 class="cmtt-8"> 3</span><span | |
9225 class="cmtt-8"> 7</span><span | |
9226 class="cmtt-8"> ]</span> | |
9227 <br class="fancyvrb" /><a | |
9228 id="x1-105018r9"></a><span | |
9229 class="cmr-6">9</span><span | |
9230 class="cmtt-8"> </span><span | |
9231 class="cmtt-8"> </span> | |
9232 <br class="fancyvrb" /><a | |
9233 id="x1-105020r10"></a><span | |
9234 class="cmr-6">10</span><span | |
9235 class="cmtt-8"> </span><span | |
9236 class="cmtt-8"> codebook</span><span | |
9237 class="cmtt-8"> dimensions</span><span | |
9238 class="cmtt-8"> =</span><span | |
9239 class="cmtt-8"> 1</span><span | |
9240 class="cmtt-8"> </span><span | |
9241 class="cmtt-8"> encoded</span><span | |
9242 class="cmtt-8"> as:</span><span | |
9243 class="cmtt-8"> [</span><span | |
9244 class="cmtt-8"> 0</span><span | |
9245 class="cmtt-8"> ],</span><span | |
9246 class="cmtt-8"> [</span><span | |
9247 class="cmtt-8"> 1</span><span | |
9248 class="cmtt-8"> ],</span><span | |
9249 class="cmtt-8"> [</span><span | |
9250 class="cmtt-8"> 2</span><span | |
9251 class="cmtt-8"> ],</span><span | |
9252 class="cmtt-8"> [</span><span | |
9253 class="cmtt-8"> 3</span><span | |
9254 class="cmtt-8"> ],</span><span | |
9255 class="cmtt-8"> [</span><span | |
9256 class="cmtt-8"> 4</span><span | |
9257 class="cmtt-8"> ],</span><span | |
9258 class="cmtt-8"> [</span><span | |
9259 class="cmtt-8"> 5</span><span | |
9260 class="cmtt-8"> ],</span><span | |
9261 class="cmtt-8"> [</span><span | |
9262 class="cmtt-8"> 6</span><span | |
9263 class="cmtt-8"> ],</span><span | |
9264 class="cmtt-8"> [</span><span | |
9265 class="cmtt-8"> 7</span><span | |
9266 class="cmtt-8"> ]</span> | |
9267 <br class="fancyvrb" /><a | |
9268 id="x1-105022r11"></a><span | |
9269 class="cmr-6">11</span><span | |
9270 class="cmtt-8"> </span><span | |
9271 class="cmtt-8"> </span> | |
9272 </div> | |
9273 <!--l. 106--><p class="noindent" >It is worth mentioning at this point that no configurable value in the residue coding setup is | |
9274 restricted to a power of two. | |
9275 <!--l. 111--><p class="noindent" > | |
9276 <h4 class="subsectionHead"><span class="titlemark">8.4. </span> <a | |
9277 id="x1-1060008.4"></a>residue 1</h4> | |
9278 <!--l. 113--><p class="noindent" >Residue 1 does not interleave VQ encoding. It represents partition vector scalars in order. As | |
9279 with residue 0, however, partition length must be an integer multiple of the codebook dimension, | |
9280 although dimension may vary from pass to pass. | |
9281 <!--l. 118--><p class="noindent" >As an example, assume a partition vector of size eight, to be encoded by residue 0 using | |
9282 codebook sizes of 8, 4, 2 and 1: | |
9283 <!--l. 121--><p class="noindent" > | |
9284 <div class="fancyvrb" id="fancyvrb34"> | |
9285 <a | |
9286 id="x1-106002r1"></a><span | |
9287 class="cmr-6">1</span><span | |
9288 class="cmtt-8"> </span><span | |
9289 class="cmtt-8"> </span> | |
9290 <br class="fancyvrb" /><a | |
9291 id="x1-106004r2"></a><span | |
9292 class="cmr-6">2</span><span | |
9293 class="cmtt-8"> </span><span | |
9294 class="cmtt-8"> </span><span | |
9295 class="cmtt-8"> </span><span | |
9296 class="cmtt-8"> </span><span | |
9297 class="cmtt-8"> </span><span | |
9298 class="cmtt-8"> </span><span | |
9299 class="cmtt-8"> </span><span | |
9300 class="cmtt-8"> </span><span | |
9301 class="cmtt-8"> </span><span | |
9302 class="cmtt-8"> </span><span | |
9303 class="cmtt-8"> </span><span | |
9304 class="cmtt-8"> </span><span | |
9305 class="cmtt-8"> </span><span | |
9306 class="cmtt-8"> original</span><span | |
9307 class="cmtt-8"> residue</span><span | |
9308 class="cmtt-8"> vector:</span><span | |
9309 class="cmtt-8"> [</span><span | |
9310 class="cmtt-8"> 0</span><span | |
9311 class="cmtt-8"> 1</span><span | |
9312 class="cmtt-8"> 2</span><span | |
9313 class="cmtt-8"> 3</span><span | |
9314 class="cmtt-8"> 4</span><span | |
9315 class="cmtt-8"> 5</span><span | |
9316 class="cmtt-8"> 6</span><span | |
9317 class="cmtt-8"> 7</span><span | |
9318 class="cmtt-8"> ]</span> | |
9319 <br class="fancyvrb" /><a | |
9320 id="x1-106006r3"></a><span | |
9321 class="cmr-6">3</span><span | |
9322 class="cmtt-8"> </span><span | |
9323 class="cmtt-8"> </span> | |
9324 <br class="fancyvrb" /><a | |
9325 id="x1-106008r4"></a><span | |
9326 class="cmr-6">4</span><span | |
9327 class="cmtt-8"> </span><span | |
9328 class="cmtt-8"> codebook</span><span | |
9329 class="cmtt-8"> dimensions</span><span | |
9330 class="cmtt-8"> =</span><span | |
9331 class="cmtt-8"> 8</span><span | |
9332 class="cmtt-8"> </span><span | |
9333 class="cmtt-8"> encoded</span><span | |
9334 class="cmtt-8"> as:</span><span | |
9335 class="cmtt-8"> [</span><span | |
9336 class="cmtt-8"> 0</span><span | |
9337 class="cmtt-8"> 1</span><span | |
9338 class="cmtt-8"> 2</span><span | |
9339 class="cmtt-8"> 3</span><span | |
9340 class="cmtt-8"> 4</span><span | |
9341 class="cmtt-8"> 5</span><span | |
9342 class="cmtt-8"> 6</span><span | |
9343 class="cmtt-8"> 7</span><span | |
9344 class="cmtt-8"> ]</span> | |
9345 <br class="fancyvrb" /><a | |
9346 id="x1-106010r5"></a><span | |
9347 class="cmr-6">5</span><span | |
9348 class="cmtt-8"> </span><span | |
9349 class="cmtt-8"> </span> | |
9350 <br class="fancyvrb" /><a | |
9351 id="x1-106012r6"></a><span | |
9352 class="cmr-6">6</span><span | |
9353 class="cmtt-8"> </span><span | |
9354 class="cmtt-8"> codebook</span><span | |
9355 class="cmtt-8"> dimensions</span><span | |
9356 class="cmtt-8"> =</span><span | |
9357 class="cmtt-8"> 4</span><span | |
9358 class="cmtt-8"> </span><span | |
9359 class="cmtt-8"> encoded</span><span | |
9360 class="cmtt-8"> as:</span><span | |
9361 class="cmtt-8"> [</span><span | |
9362 class="cmtt-8"> 0</span><span | |
9363 class="cmtt-8"> 1</span><span | |
9364 class="cmtt-8"> 2</span><span | |
9365 class="cmtt-8"> 3</span><span | |
9366 class="cmtt-8"> ],</span><span | |
9367 class="cmtt-8"> [</span><span | |
9368 class="cmtt-8"> 4</span><span | |
9369 class="cmtt-8"> 5</span><span | |
9370 class="cmtt-8"> 6</span><span | |
9371 class="cmtt-8"> 7</span><span | |
9372 class="cmtt-8"> ]</span> | |
9373 <br class="fancyvrb" /><a | |
9374 id="x1-106014r7"></a><span | |
9375 class="cmr-6">7</span><span | |
9376 class="cmtt-8"> </span><span | |
9377 class="cmtt-8"> </span> | |
9378 <br class="fancyvrb" /><a | |
9379 id="x1-106016r8"></a><span | |
9380 class="cmr-6">8</span><span | |
9381 class="cmtt-8"> </span><span | |
9382 class="cmtt-8"> codebook</span><span | |
9383 class="cmtt-8"> dimensions</span><span | |
9384 class="cmtt-8"> =</span><span | |
9385 class="cmtt-8"> 2</span><span | |
9386 class="cmtt-8"> </span><span | |
9387 class="cmtt-8"> encoded</span><span | |
9388 class="cmtt-8"> as:</span><span | |
9389 class="cmtt-8"> [</span><span | |
9390 class="cmtt-8"> 0</span><span | |
9391 class="cmtt-8"> 1</span><span | |
9392 class="cmtt-8"> ],</span><span | |
9393 class="cmtt-8"> [</span><span | |
9394 class="cmtt-8"> 2</span><span | |
9395 class="cmtt-8"> 3</span><span | |
9396 class="cmtt-8"> ],</span><span | |
9397 class="cmtt-8"> [</span><span | |
9398 class="cmtt-8"> 4</span><span | |
9399 class="cmtt-8"> 5</span><span | |
9400 class="cmtt-8"> ],</span><span | |
9401 class="cmtt-8"> [</span><span | |
9402 class="cmtt-8"> 6</span><span | |
9403 class="cmtt-8"> 7</span><span | |
9404 class="cmtt-8"> ]</span> | |
9405 <br class="fancyvrb" /><a | |
9406 id="x1-106018r9"></a><span | |
9407 class="cmr-6">9</span><span | |
9408 class="cmtt-8"> </span><span | |
9409 class="cmtt-8"> </span> | |
9410 <br class="fancyvrb" /><a | |
9411 id="x1-106020r10"></a><span | |
9412 class="cmr-6">10</span><span | |
9413 class="cmtt-8"> </span><span | |
9414 class="cmtt-8"> codebook</span><span | |
9415 class="cmtt-8"> dimensions</span><span | |
9416 class="cmtt-8"> =</span><span | |
9417 class="cmtt-8"> 1</span><span | |
9418 class="cmtt-8"> </span><span | |
9419 class="cmtt-8"> encoded</span><span | |
9420 class="cmtt-8"> as:</span><span | |
9421 class="cmtt-8"> [</span><span | |
9422 class="cmtt-8"> 0</span><span | |
9423 class="cmtt-8"> ],</span><span | |
9424 class="cmtt-8"> [</span><span | |
9425 class="cmtt-8"> 1</span><span | |
9426 class="cmtt-8"> ],</span><span | |
9427 class="cmtt-8"> [</span><span | |
9428 class="cmtt-8"> 2</span><span | |
9429 class="cmtt-8"> ],</span><span | |
9430 class="cmtt-8"> [</span><span | |
9431 class="cmtt-8"> 3</span><span | |
9432 class="cmtt-8"> ],</span><span | |
9433 class="cmtt-8"> [</span><span | |
9434 class="cmtt-8"> 4</span><span | |
9435 class="cmtt-8"> ],</span><span | |
9436 class="cmtt-8"> [</span><span | |
9437 class="cmtt-8"> 5</span><span | |
9438 class="cmtt-8"> ],</span><span | |
9439 class="cmtt-8"> [</span><span | |
9440 class="cmtt-8"> 6</span><span | |
9441 class="cmtt-8"> ],</span><span | |
9442 class="cmtt-8"> [</span><span | |
9443 class="cmtt-8"> 7</span><span | |
9444 class="cmtt-8"> ]</span> | |
9445 <br class="fancyvrb" /><a | |
9446 id="x1-106022r11"></a><span | |
9447 class="cmr-6">11</span><span | |
9448 class="cmtt-8"> </span><span | |
9449 class="cmtt-8"> </span> | |
9450 | |
9451 | |
9452 | |
9453 </div> | |
9454 <!--l. 137--><p class="noindent" > | |
9455 <h4 class="subsectionHead"><span class="titlemark">8.5. </span> <a | |
9456 id="x1-1070008.5"></a>residue 2</h4> | |
9457 <!--l. 139--><p class="noindent" >Residue type two can be thought of as a variant of residue type 1. Rather than encoding multiple | |
9458 passed-in vectors as in residue type 1, the <span | |
9459 class="cmti-12">ch </span>passed in vectors of length <span | |
9460 class="cmti-12">n </span>are first interleaved | |
9461 and flattened into a single vector of length <span | |
9462 class="cmti-12">ch</span>*<span | |
9463 class="cmti-12">n</span>. Encoding then proceeds as in type 1. Decoding | |
9464 is as in type 1 with decode interleave reversed. If operating on a single vector to begin with, | |
9465 residue type 1 and type 2 are equivalent. | |
9466 <div class="center" | |
9467 > | |
9468 <!--l. 147--><p class="noindent" > | |
9469 | |
9470 <!--l. 148--><p class="noindent" ><img | |
9471 src="residue2.png" alt="PIC" | |
9472 > | |
9473 <br /> <div class="caption" | |
9474 ><span class="id">Figure 12: </span><span | |
9475 class="content">illustration of residue type 2</span></div><!--tex4ht:label?: x1-10700112 --> | |
9476 </div> | |
9477 <!--l. 153--><p class="noindent" > | |
9478 <h4 class="subsectionHead"><span class="titlemark">8.6. </span> <a | |
9479 id="x1-1080008.6"></a>Residue decode</h4> | |
9480 <!--l. 155--><p class="noindent" > | |
9481 <h5 class="subsubsectionHead"><span class="titlemark">8.6.1. </span> <a | |
9482 id="x1-1090008.6.1"></a>header decode</h5> | |
9483 <!--l. 157--><p class="noindent" >Header decode for all three residue types is identical. | |
9484 <div class="fancyvrb" id="fancyvrb35"> | |
9485 <a | |
9486 id="x1-109002r1"></a><span | |
9487 class="cmr-6">1</span><span | |
9488 class="cmtt-8"> </span><span | |
9489 class="cmtt-8"> </span><span | |
9490 class="cmtt-8"> </span><span | |
9491 class="cmtt-8"> 1)</span><span | |
9492 class="cmtt-8"> [residue\_begin]</span><span | |
9493 class="cmtt-8"> =</span><span | |
9494 class="cmtt-8"> read</span><span | |
9495 class="cmtt-8"> 24</span><span | |
9496 class="cmtt-8"> bits</span><span | |
9497 class="cmtt-8"> as</span><span | |
9498 class="cmtt-8"> unsigned</span><span | |
9499 class="cmtt-8"> integer</span> | |
9500 <br class="fancyvrb" /><a | |
9501 id="x1-109004r2"></a><span | |
9502 class="cmr-6">2</span><span | |
9503 class="cmtt-8"> </span><span | |
9504 class="cmtt-8"> </span><span | |
9505 class="cmtt-8"> </span><span | |
9506 class="cmtt-8"> 2)</span><span | |
9507 class="cmtt-8"> [residue\_end]</span><span | |
9508 class="cmtt-8"> =</span><span | |
9509 class="cmtt-8"> read</span><span | |
9510 class="cmtt-8"> 24</span><span | |
9511 class="cmtt-8"> bits</span><span | |
9512 class="cmtt-8"> as</span><span | |
9513 class="cmtt-8"> unsigned</span><span | |
9514 class="cmtt-8"> integer</span> | |
9515 <br class="fancyvrb" /><a | |
9516 id="x1-109006r3"></a><span | |
9517 class="cmr-6">3</span><span | |
9518 class="cmtt-8"> </span><span | |
9519 class="cmtt-8"> </span><span | |
9520 class="cmtt-8"> </span><span | |
9521 class="cmtt-8"> 3)</span><span | |
9522 class="cmtt-8"> [residue\_partition\_size]</span><span | |
9523 class="cmtt-8"> =</span><span | |
9524 class="cmtt-8"> read</span><span | |
9525 class="cmtt-8"> 24</span><span | |
9526 class="cmtt-8"> bits</span><span | |
9527 class="cmtt-8"> as</span><span | |
9528 class="cmtt-8"> unsigned</span><span | |
9529 class="cmtt-8"> integer</span><span | |
9530 class="cmtt-8"> and</span><span | |
9531 class="cmtt-8"> add</span><span | |
9532 class="cmtt-8"> one</span> | |
9533 <br class="fancyvrb" /><a | |
9534 id="x1-109008r4"></a><span | |
9535 class="cmr-6">4</span><span | |
9536 class="cmtt-8"> </span><span | |
9537 class="cmtt-8"> </span><span | |
9538 class="cmtt-8"> </span><span | |
9539 class="cmtt-8"> 4)</span><span | |
9540 class="cmtt-8"> [residue\_classifications]</span><span | |
9541 class="cmtt-8"> =</span><span | |
9542 class="cmtt-8"> read</span><span | |
9543 class="cmtt-8"> 6</span><span | |
9544 class="cmtt-8"> bits</span><span | |
9545 class="cmtt-8"> as</span><span | |
9546 class="cmtt-8"> unsigned</span><span | |
9547 class="cmtt-8"> integer</span><span | |
9548 class="cmtt-8"> and</span><span | |
9549 class="cmtt-8"> add</span><span | |
9550 class="cmtt-8"> one</span> | |
9551 | |
9552 | |
9553 | |
9554 <br class="fancyvrb" /><a | |
9555 id="x1-109010r5"></a><span | |
9556 class="cmr-6">5</span><span | |
9557 class="cmtt-8"> </span><span | |
9558 class="cmtt-8"> </span><span | |
9559 class="cmtt-8"> </span><span | |
9560 class="cmtt-8"> 5)</span><span | |
9561 class="cmtt-8"> [residue\_classbook]</span><span | |
9562 class="cmtt-8"> =</span><span | |
9563 class="cmtt-8"> read</span><span | |
9564 class="cmtt-8"> 8</span><span | |
9565 class="cmtt-8"> bits</span><span | |
9566 class="cmtt-8"> as</span><span | |
9567 class="cmtt-8"> unsigned</span><span | |
9568 class="cmtt-8"> integer</span> | |
9569 </div> | |
9570 <!--l. 166--><p class="noindent" ><span | |
9571 class="cmtt-12">[residue_begin] </span>and <span | |
9572 class="cmtt-12">[residue_end] </span>select the specific sub-portion of each vector that is | |
9573 actually coded; it implements akin to a bandpass where, for coding purposes, the vector | |
9574 effectively begins at element <span | |
9575 class="cmtt-12">[residue_begin] </span>and ends at <span | |
9576 class="cmtt-12">[residue_end]</span>. Preceding and | |
9577 following values in the unpacked vectors are zeroed. Note that for residue type 2, these | |
9578 values as well as <span | |
9579 class="cmtt-12">[residue_partition_size]</span>apply to the interleaved vector, not the | |
9580 individual vectors before interleave. <span | |
9581 class="cmtt-12">[residue_partition_size] </span>is as explained above, | |
9582 <span | |
9583 class="cmtt-12">[residue_classifications] </span>is the number of possible classification to which a partition can | |
9584 belong and <span | |
9585 class="cmtt-12">[residue_classbook] </span>is the codebook number used to code classification | |
9586 codewords. The number of dimensions in book <span | |
9587 class="cmtt-12">[residue_classbook] </span>determines how | |
9588 many classification values are grouped into a single classification codeword. Note that | |
9589 the number of entries and dimensions in book <span | |
9590 class="cmtt-12">[residue_classbook]</span>, along with | |
9591 <span | |
9592 class="cmtt-12">[residue_classifications]</span>, overdetermines to possible number of classification | |
9593 codewords. If <span | |
9594 class="cmtt-12">[residue_classifications]</span>ˆ<span | |
9595 class="cmtt-12">[residue_classbook]</span>.dimensions exceeds | |
9596 <span | |
9597 class="cmtt-12">[residue_classbook]</span>.entries, the bitstream should be regarded to be undecodable. | |
9598 <!--l. 190--><p class="noindent" >Next we read a bitmap pattern that specifies which partition classes code values in which | |
9599 passes. | |
9600 <!--l. 193--><p class="noindent" > | |
9601 <div class="fancyvrb" id="fancyvrb36"> | |
9602 <a | |
9603 id="x1-109012r1"></a><span | |
9604 class="cmr-6">1</span><span | |
9605 class="cmtt-8"> </span><span | |
9606 class="cmtt-8"> </span><span | |
9607 class="cmtt-8"> </span><span | |
9608 class="cmtt-8"> 1)</span><span | |
9609 class="cmtt-8"> iterate</span><span | |
9610 class="cmtt-8"> [i]</span><span | |
9611 class="cmtt-8"> over</span><span | |
9612 class="cmtt-8"> the</span><span | |
9613 class="cmtt-8"> range</span><span | |
9614 class="cmtt-8"> 0</span><span | |
9615 class="cmtt-8"> ...</span><span | |
9616 class="cmtt-8"> [residue\_classifications]-1</span><span | |
9617 class="cmtt-8"> {</span> | |
9618 <br class="fancyvrb" /><a | |
9619 id="x1-109014r2"></a><span | |
9620 class="cmr-6">2</span><span | |
9621 class="cmtt-8"> </span><span | |
9622 class="cmtt-8"> </span> | |
9623 <br class="fancyvrb" /><a | |
9624 id="x1-109016r3"></a><span | |
9625 class="cmr-6">3</span><span | |
9626 class="cmtt-8"> </span><span | |
9627 class="cmtt-8"> </span><span | |
9628 class="cmtt-8"> </span><span | |
9629 class="cmtt-8"> </span><span | |
9630 class="cmtt-8"> </span><span | |
9631 class="cmtt-8"> </span><span | |
9632 class="cmtt-8"> </span><span | |
9633 class="cmtt-8"> </span><span | |
9634 class="cmtt-8"> 2)</span><span | |
9635 class="cmtt-8"> [high\_bits]</span><span | |
9636 class="cmtt-8"> =</span><span | |
9637 class="cmtt-8"> 0</span> | |
9638 <br class="fancyvrb" /><a | |
9639 id="x1-109018r4"></a><span | |
9640 class="cmr-6">4</span><span | |
9641 class="cmtt-8"> </span><span | |
9642 class="cmtt-8"> </span><span | |
9643 class="cmtt-8"> </span><span | |
9644 class="cmtt-8"> </span><span | |
9645 class="cmtt-8"> </span><span | |
9646 class="cmtt-8"> </span><span | |
9647 class="cmtt-8"> </span><span | |
9648 class="cmtt-8"> </span><span | |
9649 class="cmtt-8"> 3)</span><span | |
9650 class="cmtt-8"> [low\_bits]</span><span | |
9651 class="cmtt-8"> =</span><span | |
9652 class="cmtt-8"> read</span><span | |
9653 class="cmtt-8"> 3</span><span | |
9654 class="cmtt-8"> bits</span><span | |
9655 class="cmtt-8"> as</span><span | |
9656 class="cmtt-8"> unsigned</span><span | |
9657 class="cmtt-8"> integer</span> | |
9658 <br class="fancyvrb" /><a | |
9659 id="x1-109020r5"></a><span | |
9660 class="cmr-6">5</span><span | |
9661 class="cmtt-8"> </span><span | |
9662 class="cmtt-8"> </span><span | |
9663 class="cmtt-8"> </span><span | |
9664 class="cmtt-8"> </span><span | |
9665 class="cmtt-8"> </span><span | |
9666 class="cmtt-8"> </span><span | |
9667 class="cmtt-8"> </span><span | |
9668 class="cmtt-8"> </span><span | |
9669 class="cmtt-8"> 4)</span><span | |
9670 class="cmtt-8"> [bitflag]</span><span | |
9671 class="cmtt-8"> =</span><span | |
9672 class="cmtt-8"> read</span><span | |
9673 class="cmtt-8"> one</span><span | |
9674 class="cmtt-8"> bit</span><span | |
9675 class="cmtt-8"> as</span><span | |
9676 class="cmtt-8"> boolean</span> | |
9677 <br class="fancyvrb" /><a | |
9678 id="x1-109022r6"></a><span | |
9679 class="cmr-6">6</span><span | |
9680 class="cmtt-8"> </span><span | |
9681 class="cmtt-8"> </span><span | |
9682 class="cmtt-8"> </span><span | |
9683 class="cmtt-8"> </span><span | |
9684 class="cmtt-8"> </span><span | |
9685 class="cmtt-8"> </span><span | |
9686 class="cmtt-8"> </span><span | |
9687 class="cmtt-8"> </span><span | |
9688 class="cmtt-8"> 5)</span><span | |
9689 class="cmtt-8"> if</span><span | |
9690 class="cmtt-8"> (</span><span | |
9691 class="cmtt-8"> [bitflag]</span><span | |
9692 class="cmtt-8"> is</span><span | |
9693 class="cmtt-8"> set</span><span | |
9694 class="cmtt-8"> )</span><span | |
9695 class="cmtt-8"> then</span><span | |
9696 class="cmtt-8"> [high\_bits]</span><span | |
9697 class="cmtt-8"> =</span><span | |
9698 class="cmtt-8"> read</span><span | |
9699 class="cmtt-8"> five</span><span | |
9700 class="cmtt-8"> bits</span><span | |
9701 class="cmtt-8"> as</span><span | |
9702 class="cmtt-8"> unsigned</span><span | |
9703 class="cmtt-8"> integer</span> | |
9704 <br class="fancyvrb" /><a | |
9705 id="x1-109024r7"></a><span | |
9706 class="cmr-6">7</span><span | |
9707 class="cmtt-8"> </span><span | |
9708 class="cmtt-8"> </span><span | |
9709 class="cmtt-8"> </span><span | |
9710 class="cmtt-8"> </span><span | |
9711 class="cmtt-8"> </span><span | |
9712 class="cmtt-8"> </span><span | |
9713 class="cmtt-8"> </span><span | |
9714 class="cmtt-8"> </span><span | |
9715 class="cmtt-8"> 6)</span><span | |
9716 class="cmtt-8"> vector</span><span | |
9717 class="cmtt-8"> [residue\_cascade]</span><span | |
9718 class="cmtt-8"> element</span><span | |
9719 class="cmtt-8"> [i]</span><span | |
9720 class="cmtt-8"> =</span><span | |
9721 class="cmtt-8"> [high\_bits]</span><span | |
9722 class="cmtt-8"> *</span><span | |
9723 class="cmtt-8"> 8</span><span | |
9724 class="cmtt-8"> +</span><span | |
9725 class="cmtt-8"> [low\_bits]</span> | |
9726 <br class="fancyvrb" /><a | |
9727 id="x1-109026r8"></a><span | |
9728 class="cmr-6">8</span><span | |
9729 class="cmtt-8"> </span><span | |
9730 class="cmtt-8"> </span><span | |
9731 class="cmtt-8"> </span><span | |
9732 class="cmtt-8"> </span><span | |
9733 class="cmtt-8"> </span><span | |
9734 class="cmtt-8"> </span><span | |
9735 class="cmtt-8"> }</span> | |
9736 <br class="fancyvrb" /><a | |
9737 id="x1-109028r9"></a><span | |
9738 class="cmr-6">9</span><span | |
9739 class="cmtt-8"> </span><span | |
9740 class="cmtt-8"> </span><span | |
9741 class="cmtt-8"> </span><span | |
9742 class="cmtt-8"> 7)</span><span | |
9743 class="cmtt-8"> done</span> | |
9744 </div> | |
9745 <!--l. 205--><p class="noindent" >Finally, we read in a list of book numbers, each corresponding to specific bit set in the cascade | |
9746 bitmap. We loop over the possible codebook classifications and the maximum possible number of | |
9747 encoding stages (8 in Vorbis I, as constrained by the elements of the cascade bitmap being eight | |
9748 bits): | |
9749 <!--l. 211--><p class="noindent" > | |
9750 <div class="fancyvrb" id="fancyvrb37"> | |
9751 <a | |
9752 id="x1-109030r1"></a><span | |
9753 class="cmr-6">1</span><span | |
9754 class="cmtt-8"> </span><span | |
9755 class="cmtt-8"> </span><span | |
9756 class="cmtt-8"> </span><span | |
9757 class="cmtt-8"> 1)</span><span | |
9758 class="cmtt-8"> iterate</span><span | |
9759 class="cmtt-8"> [i]</span><span | |
9760 class="cmtt-8"> over</span><span | |
9761 class="cmtt-8"> the</span><span | |
9762 class="cmtt-8"> range</span><span | |
9763 class="cmtt-8"> 0</span><span | |
9764 class="cmtt-8"> ...</span><span | |
9765 class="cmtt-8"> [residue\_classifications]-1</span><span | |
9766 class="cmtt-8"> {</span> | |
9767 <br class="fancyvrb" /><a | |
9768 id="x1-109032r2"></a><span | |
9769 class="cmr-6">2</span><span | |
9770 class="cmtt-8"> </span><span | |
9771 class="cmtt-8"> </span> | |
9772 <br class="fancyvrb" /><a | |
9773 id="x1-109034r3"></a><span | |
9774 class="cmr-6">3</span><span | |
9775 class="cmtt-8"> </span><span | |
9776 class="cmtt-8"> </span><span | |
9777 class="cmtt-8"> </span><span | |
9778 class="cmtt-8"> </span><span | |
9779 class="cmtt-8"> </span><span | |
9780 class="cmtt-8"> </span><span | |
9781 class="cmtt-8"> </span><span | |
9782 class="cmtt-8"> </span><span | |
9783 class="cmtt-8"> 2)</span><span | |
9784 class="cmtt-8"> iterate</span><span | |
9785 class="cmtt-8"> [j]</span><span | |
9786 class="cmtt-8"> over</span><span | |
9787 class="cmtt-8"> the</span><span | |
9788 class="cmtt-8"> range</span><span | |
9789 class="cmtt-8"> 0</span><span | |
9790 class="cmtt-8"> ...</span><span | |
9791 class="cmtt-8"> 7</span><span | |
9792 class="cmtt-8"> {</span> | |
9793 <br class="fancyvrb" /><a | |
9794 id="x1-109036r4"></a><span | |
9795 class="cmr-6">4</span><span | |
9796 class="cmtt-8"> </span><span | |
9797 class="cmtt-8"> </span> | |
9798 <br class="fancyvrb" /><a | |
9799 id="x1-109038r5"></a><span | |
9800 class="cmr-6">5</span><span | |
9801 class="cmtt-8"> </span><span | |
9802 class="cmtt-8"> </span><span | |
9803 class="cmtt-8"> </span><span | |
9804 class="cmtt-8"> </span><span | |
9805 class="cmtt-8"> </span><span | |
9806 class="cmtt-8"> </span><span | |
9807 class="cmtt-8"> </span><span | |
9808 class="cmtt-8"> </span><span | |
9809 class="cmtt-8"> </span><span | |
9810 class="cmtt-8"> </span><span | |
9811 class="cmtt-8"> </span><span | |
9812 class="cmtt-8"> </span><span | |
9813 class="cmtt-8"> </span><span | |
9814 class="cmtt-8"> 3)</span><span | |
9815 class="cmtt-8"> if</span><span | |
9816 class="cmtt-8"> (</span><span | |
9817 class="cmtt-8"> vector</span><span | |
9818 class="cmtt-8"> [residue\_cascade]</span><span | |
9819 class="cmtt-8"> element</span><span | |
9820 class="cmtt-8"> [i]</span><span | |
9821 class="cmtt-8"> bit</span><span | |
9822 class="cmtt-8"> [j]</span><span | |
9823 class="cmtt-8"> is</span><span | |
9824 class="cmtt-8"> set</span><span | |
9825 class="cmtt-8"> )</span><span | |
9826 class="cmtt-8"> {</span> | |
9827 <br class="fancyvrb" /><a | |
9828 id="x1-109040r6"></a><span | |
9829 class="cmr-6">6</span><span | |
9830 class="cmtt-8"> </span><span | |
9831 class="cmtt-8"> </span> | |
9832 <br class="fancyvrb" /><a | |
9833 id="x1-109042r7"></a><span | |
9834 class="cmr-6">7</span><span | |
9835 class="cmtt-8"> </span><span | |
9836 class="cmtt-8"> </span><span | |
9837 class="cmtt-8"> </span><span | |
9838 class="cmtt-8"> </span><span | |
9839 class="cmtt-8"> </span><span | |
9840 class="cmtt-8"> </span><span | |
9841 class="cmtt-8"> </span><span | |
9842 class="cmtt-8"> </span><span | |
9843 class="cmtt-8"> </span><span | |
9844 class="cmtt-8"> </span><span | |
9845 class="cmtt-8"> </span><span | |
9846 class="cmtt-8"> </span><span | |
9847 class="cmtt-8"> </span><span | |
9848 class="cmtt-8"> </span><span | |
9849 class="cmtt-8"> </span><span | |
9850 class="cmtt-8"> </span><span | |
9851 class="cmtt-8"> </span><span | |
9852 class="cmtt-8"> </span><span | |
9853 class="cmtt-8"> 4)</span><span | |
9854 class="cmtt-8"> array</span><span | |
9855 class="cmtt-8"> [residue\_books]</span><span | |
9856 class="cmtt-8"> element</span><span | |
9857 class="cmtt-8"> [i][j]</span><span | |
9858 class="cmtt-8"> =</span><span | |
9859 class="cmtt-8"> read</span><span | |
9860 class="cmtt-8"> 8</span><span | |
9861 class="cmtt-8"> bits</span><span | |
9862 class="cmtt-8"> as</span><span | |
9863 class="cmtt-8"> unsigned</span><span | |
9864 class="cmtt-8"> integer</span> | |
9865 <br class="fancyvrb" /><a | |
9866 id="x1-109044r8"></a><span | |
9867 class="cmr-6">8</span><span | |
9868 class="cmtt-8"> </span><span | |
9869 class="cmtt-8"> </span> | |
9870 <br class="fancyvrb" /><a | |
9871 id="x1-109046r9"></a><span | |
9872 class="cmr-6">9</span><span | |
9873 class="cmtt-8"> </span><span | |
9874 class="cmtt-8"> </span><span | |
9875 class="cmtt-8"> </span><span | |
9876 class="cmtt-8"> </span><span | |
9877 class="cmtt-8"> </span><span | |
9878 class="cmtt-8"> </span><span | |
9879 class="cmtt-8"> </span><span | |
9880 class="cmtt-8"> </span><span | |
9881 class="cmtt-8"> </span><span | |
9882 class="cmtt-8"> </span><span | |
9883 class="cmtt-8"> </span><span | |
9884 class="cmtt-8"> </span><span | |
9885 class="cmtt-8"> </span><span | |
9886 class="cmtt-8"> </span><span | |
9887 class="cmtt-8"> </span><span | |
9888 class="cmtt-8"> </span><span | |
9889 class="cmtt-8"> }</span><span | |
9890 class="cmtt-8"> else</span><span | |
9891 class="cmtt-8"> {</span> | |
9892 | |
9893 | |
9894 | |
9895 <br class="fancyvrb" /><a | |
9896 id="x1-109048r10"></a><span | |
9897 class="cmr-6">10</span><span | |
9898 class="cmtt-8"> </span><span | |
9899 class="cmtt-8"> </span> | |
9900 <br class="fancyvrb" /><a | |
9901 id="x1-109050r11"></a><span | |
9902 class="cmr-6">11</span><span | |
9903 class="cmtt-8"> </span><span | |
9904 class="cmtt-8"> </span><span | |
9905 class="cmtt-8"> </span><span | |
9906 class="cmtt-8"> </span><span | |
9907 class="cmtt-8"> </span><span | |
9908 class="cmtt-8"> </span><span | |
9909 class="cmtt-8"> </span><span | |
9910 class="cmtt-8"> </span><span | |
9911 class="cmtt-8"> </span><span | |
9912 class="cmtt-8"> </span><span | |
9913 class="cmtt-8"> </span><span | |
9914 class="cmtt-8"> </span><span | |
9915 class="cmtt-8"> </span><span | |
9916 class="cmtt-8"> </span><span | |
9917 class="cmtt-8"> </span><span | |
9918 class="cmtt-8"> </span><span | |
9919 class="cmtt-8"> </span><span | |
9920 class="cmtt-8"> </span><span | |
9921 class="cmtt-8"> 5)</span><span | |
9922 class="cmtt-8"> array</span><span | |
9923 class="cmtt-8"> [residue\_books]</span><span | |
9924 class="cmtt-8"> element</span><span | |
9925 class="cmtt-8"> [i][j]</span><span | |
9926 class="cmtt-8"> =</span><span | |
9927 class="cmtt-8"> unused</span> | |
9928 <br class="fancyvrb" /><a | |
9929 id="x1-109052r12"></a><span | |
9930 class="cmr-6">12</span><span | |
9931 class="cmtt-8"> </span><span | |
9932 class="cmtt-8"> </span> | |
9933 <br class="fancyvrb" /><a | |
9934 id="x1-109054r13"></a><span | |
9935 class="cmr-6">13</span><span | |
9936 class="cmtt-8"> </span><span | |
9937 class="cmtt-8"> </span><span | |
9938 class="cmtt-8"> </span><span | |
9939 class="cmtt-8"> </span><span | |
9940 class="cmtt-8"> </span><span | |
9941 class="cmtt-8"> </span><span | |
9942 class="cmtt-8"> </span><span | |
9943 class="cmtt-8"> </span><span | |
9944 class="cmtt-8"> </span><span | |
9945 class="cmtt-8"> </span><span | |
9946 class="cmtt-8"> </span><span | |
9947 class="cmtt-8"> </span><span | |
9948 class="cmtt-8"> </span><span | |
9949 class="cmtt-8"> </span><span | |
9950 class="cmtt-8"> </span><span | |
9951 class="cmtt-8"> </span><span | |
9952 class="cmtt-8"> }</span> | |
9953 <br class="fancyvrb" /><a | |
9954 id="x1-109056r14"></a><span | |
9955 class="cmr-6">14</span><span | |
9956 class="cmtt-8"> </span><span | |
9957 class="cmtt-8"> </span><span | |
9958 class="cmtt-8"> </span><span | |
9959 class="cmtt-8"> </span><span | |
9960 class="cmtt-8"> </span><span | |
9961 class="cmtt-8"> </span><span | |
9962 class="cmtt-8"> </span><span | |
9963 class="cmtt-8"> </span><span | |
9964 class="cmtt-8"> </span><span | |
9965 class="cmtt-8"> </span><span | |
9966 class="cmtt-8"> </span><span | |
9967 class="cmtt-8"> }</span> | |
9968 <br class="fancyvrb" /><a | |
9969 id="x1-109058r15"></a><span | |
9970 class="cmr-6">15</span><span | |
9971 class="cmtt-8"> </span><span | |
9972 class="cmtt-8"> </span><span | |
9973 class="cmtt-8"> </span><span | |
9974 class="cmtt-8"> </span><span | |
9975 class="cmtt-8"> </span><span | |
9976 class="cmtt-8"> </span><span | |
9977 class="cmtt-8"> </span><span | |
9978 class="cmtt-8"> }</span> | |
9979 <br class="fancyvrb" /><a | |
9980 id="x1-109060r16"></a><span | |
9981 class="cmr-6">16</span><span | |
9982 class="cmtt-8"> </span><span | |
9983 class="cmtt-8"> </span> | |
9984 <br class="fancyvrb" /><a | |
9985 id="x1-109062r17"></a><span | |
9986 class="cmr-6">17</span><span | |
9987 class="cmtt-8"> </span><span | |
9988 class="cmtt-8"> </span><span | |
9989 class="cmtt-8"> </span><span | |
9990 class="cmtt-8"> 6)</span><span | |
9991 class="cmtt-8"> done</span> | |
9992 </div> | |
9993 <!--l. 231--><p class="noindent" >An end-of-packet condition at any point in header decode renders the stream undecodable. | |
9994 In addition, any codebook number greater than the maximum numbered codebook | |
9995 set up in this stream also renders the stream undecodable. All codebooks in array | |
9996 [residue_books] are required to have a value mapping. The presence of codebook in array | |
9997 [residue_books] without a value mapping (maptype equals zero) renders the stream | |
9998 undecodable. | |
9999 <!--l. 241--><p class="noindent" > | |
10000 <h5 class="subsubsectionHead"><span class="titlemark">8.6.2. </span> <a | |
10001 id="x1-1100008.6.2"></a>packet decode</h5> | |
10002 <!--l. 243--><p class="noindent" >Format 0 and 1 packet decode is identical except for specific partition interleave. Format 2 packet | |
10003 decode can be built out of the format 1 decode process. Thus we describe first the decode | |
10004 infrastructure identical to all three formats. | |
10005 <!--l. 248--><p class="noindent" >In addition to configuration information, the residue decode process is passed the number of | |
10006 vectors in the submap bundle and a vector of flags indicating if any of the vectors are not to be | |
10007 decoded. If the passed in number of vectors is 3 and vector number 1 is marked ’do not decode’, | |
10008 decode skips vector 1 during the decode loop. However, even ’do not decode’ vectors are | |
10009 allocated and zeroed. | |
10010 <!--l. 255--><p class="noindent" >Depending on the values of <span | |
10011 class="cmtt-12">[residue_begin] </span>and <span | |
10012 class="cmtt-12">[residue_end]</span>, it is obvious that the | |
10013 encoded portion of a residue vector may be the entire possible residue vector or some other strict | |
10014 subset of the actual residue vector size with zero padding at either uncoded end. However, it is | |
10015 also possible to set <span | |
10016 class="cmtt-12">[residue_begin] </span>and <span | |
10017 class="cmtt-12">[residue_end] </span>to specify a range partially or wholly | |
10018 beyond the maximum vector size. Before beginning residue decode, limit <span | |
10019 class="cmtt-12">[residue_begin]</span> | |
10020 and <span | |
10021 class="cmtt-12">[residue_end] </span>to the maximum possible vector size as follows. We assume that | |
10022 the number of vectors being encoded, <span | |
10023 class="cmtt-12">[ch] </span>is provided by the higher level decoding | |
10024 process. | |
10025 <!--l. 269--><p class="noindent" > | |
10026 <div class="fancyvrb" id="fancyvrb38"> | |
10027 <a | |
10028 id="x1-110002r1"></a><span | |
10029 class="cmr-6">1</span><span | |
10030 class="cmtt-8"> </span><span | |
10031 class="cmtt-8"> </span><span | |
10032 class="cmtt-8"> </span><span | |
10033 class="cmtt-8"> 1)</span><span | |
10034 class="cmtt-8"> [actual\_size]</span><span | |
10035 class="cmtt-8"> =</span><span | |
10036 class="cmtt-8"> current</span><span | |
10037 class="cmtt-8"> blocksize/2;</span> | |
10038 <br class="fancyvrb" /><a | |
10039 id="x1-110004r2"></a><span | |
10040 class="cmr-6">2</span><span | |
10041 class="cmtt-8"> </span><span | |
10042 class="cmtt-8"> </span><span | |
10043 class="cmtt-8"> </span><span | |
10044 class="cmtt-8"> 2)</span><span | |
10045 class="cmtt-8"> if</span><span | |
10046 class="cmtt-8"> residue</span><span | |
10047 class="cmtt-8"> encoding</span><span | |
10048 class="cmtt-8"> is</span><span | |
10049 class="cmtt-8"> format</span><span | |
10050 class="cmtt-8"> 2</span> | |
10051 <br class="fancyvrb" /><a | |
10052 id="x1-110006r3"></a><span | |
10053 class="cmr-6">3</span><span | |
10054 class="cmtt-8"> </span><span | |
10055 class="cmtt-8"> </span><span | |
10056 class="cmtt-8"> </span><span | |
10057 class="cmtt-8"> </span><span | |
10058 class="cmtt-8"> </span><span | |
10059 class="cmtt-8"> </span><span | |
10060 class="cmtt-8"> </span><span | |
10061 class="cmtt-8"> </span><span | |
10062 class="cmtt-8"> 3)</span><span | |
10063 class="cmtt-8"> [actual\_size]</span><span | |
10064 class="cmtt-8"> =</span><span | |
10065 class="cmtt-8"> [actual\_size]</span><span | |
10066 class="cmtt-8"> *</span><span | |
10067 class="cmtt-8"> [ch];</span> | |
10068 | |
10069 | |
10070 | |
10071 <br class="fancyvrb" /><a | |
10072 id="x1-110008r4"></a><span | |
10073 class="cmr-6">4</span><span | |
10074 class="cmtt-8"> </span><span | |
10075 class="cmtt-8"> </span><span | |
10076 class="cmtt-8"> </span><span | |
10077 class="cmtt-8"> 4)</span><span | |
10078 class="cmtt-8"> [limit\_residue\_begin]</span><span | |
10079 class="cmtt-8"> =</span><span | |
10080 class="cmtt-8"> maximum</span><span | |
10081 class="cmtt-8"> of</span><span | |
10082 class="cmtt-8"> ([residue\_begin],[actual\_size]);</span> | |
10083 <br class="fancyvrb" /><a | |
10084 id="x1-110010r5"></a><span | |
10085 class="cmr-6">5</span><span | |
10086 class="cmtt-8"> </span><span | |
10087 class="cmtt-8"> </span><span | |
10088 class="cmtt-8"> </span><span | |
10089 class="cmtt-8"> 5)</span><span | |
10090 class="cmtt-8"> [limit\_residue\_end]</span><span | |
10091 class="cmtt-8"> =</span><span | |
10092 class="cmtt-8"> maximum</span><span | |
10093 class="cmtt-8"> of</span><span | |
10094 class="cmtt-8"> ([residue\_end],[actual\_size]);</span> | |
10095 </div> | |
10096 <!--l. 277--><p class="noindent" >The following convenience values are conceptually useful to clarifying the decode process: | |
10097 <!--l. 280--><p class="noindent" > | |
10098 <div class="fancyvrb" id="fancyvrb39"> | |
10099 <a | |
10100 id="x1-110012r1"></a><span | |
10101 class="cmr-6">1</span><span | |
10102 class="cmtt-8"> </span><span | |
10103 class="cmtt-8"> </span><span | |
10104 class="cmtt-8"> </span><span | |
10105 class="cmtt-8"> 1)</span><span | |
10106 class="cmtt-8"> [classwords\_per\_codeword]</span><span | |
10107 class="cmtt-8"> =</span><span | |
10108 class="cmtt-8"> [codebook\_dimensions]</span><span | |
10109 class="cmtt-8"> value</span><span | |
10110 class="cmtt-8"> of</span><span | |
10111 class="cmtt-8"> codebook</span><span | |
10112 class="cmtt-8"> [residue\_classbook]</span> | |
10113 <br class="fancyvrb" /><a | |
10114 id="x1-110014r2"></a><span | |
10115 class="cmr-6">2</span><span | |
10116 class="cmtt-8"> </span><span | |
10117 class="cmtt-8"> </span><span | |
10118 class="cmtt-8"> </span><span | |
10119 class="cmtt-8"> 2)</span><span | |
10120 class="cmtt-8"> [n\_to\_read]</span><span | |
10121 class="cmtt-8"> =</span><span | |
10122 class="cmtt-8"> [limit\_residue\_end]</span><span | |
10123 class="cmtt-8"> -</span><span | |
10124 class="cmtt-8"> [limit\_residue\_begin]</span> | |
10125 <br class="fancyvrb" /><a | |
10126 id="x1-110016r3"></a><span | |
10127 class="cmr-6">3</span><span | |
10128 class="cmtt-8"> </span><span | |
10129 class="cmtt-8"> </span><span | |
10130 class="cmtt-8"> </span><span | |
10131 class="cmtt-8"> 3)</span><span | |
10132 class="cmtt-8"> [partitions\_to\_read]</span><span | |
10133 class="cmtt-8"> =</span><span | |
10134 class="cmtt-8"> [n\_to\_read]</span><span | |
10135 class="cmtt-8"> /</span><span | |
10136 class="cmtt-8"> [residue\_partition\_size]</span> | |
10137 </div> | |
10138 <!--l. 286--><p class="noindent" >Packet decode proceeds as follows, matching the description offered earlier in the document. | |
10139 <div class="fancyvrb" id="fancyvrb40"> | |
10140 <a | |
10141 id="x1-110018r1"></a><span | |
10142 class="cmr-6">1</span><span | |
10143 class="cmtt-8"> </span><span | |
10144 class="cmtt-8"> </span><span | |
10145 class="cmtt-8"> </span><span | |
10146 class="cmtt-8"> 1)</span><span | |
10147 class="cmtt-8"> allocate</span><span | |
10148 class="cmtt-8"> and</span><span | |
10149 class="cmtt-8"> zero</span><span | |
10150 class="cmtt-8"> all</span><span | |
10151 class="cmtt-8"> vectors</span><span | |
10152 class="cmtt-8"> that</span><span | |
10153 class="cmtt-8"> will</span><span | |
10154 class="cmtt-8"> be</span><span | |
10155 class="cmtt-8"> returned.</span> | |
10156 <br class="fancyvrb" /><a | |
10157 id="x1-110020r2"></a><span | |
10158 class="cmr-6">2</span><span | |
10159 class="cmtt-8"> </span><span | |
10160 class="cmtt-8"> </span><span | |
10161 class="cmtt-8"> </span><span | |
10162 class="cmtt-8"> 2)</span><span | |
10163 class="cmtt-8"> if</span><span | |
10164 class="cmtt-8"> ([n\_to\_read]</span><span | |
10165 class="cmtt-8"> is</span><span | |
10166 class="cmtt-8"> zero),</span><span | |
10167 class="cmtt-8"> stop;</span><span | |
10168 class="cmtt-8"> there</span><span | |
10169 class="cmtt-8"> is</span><span | |
10170 class="cmtt-8"> no</span><span | |
10171 class="cmtt-8"> residue</span><span | |
10172 class="cmtt-8"> to</span><span | |
10173 class="cmtt-8"> decode.</span> | |
10174 <br class="fancyvrb" /><a | |
10175 id="x1-110022r3"></a><span | |
10176 class="cmr-6">3</span><span | |
10177 class="cmtt-8"> </span><span | |
10178 class="cmtt-8"> </span><span | |
10179 class="cmtt-8"> </span><span | |
10180 class="cmtt-8"> 3)</span><span | |
10181 class="cmtt-8"> iterate</span><span | |
10182 class="cmtt-8"> [pass]</span><span | |
10183 class="cmtt-8"> over</span><span | |
10184 class="cmtt-8"> the</span><span | |
10185 class="cmtt-8"> range</span><span | |
10186 class="cmtt-8"> 0</span><span | |
10187 class="cmtt-8"> ...</span><span | |
10188 class="cmtt-8"> 7</span><span | |
10189 class="cmtt-8"> {</span> | |
10190 <br class="fancyvrb" /><a | |
10191 id="x1-110024r4"></a><span | |
10192 class="cmr-6">4</span><span | |
10193 class="cmtt-8"> </span><span | |
10194 class="cmtt-8"> </span> | |
10195 <br class="fancyvrb" /><a | |
10196 id="x1-110026r5"></a><span | |
10197 class="cmr-6">5</span><span | |
10198 class="cmtt-8"> </span><span | |
10199 class="cmtt-8"> </span><span | |
10200 class="cmtt-8"> </span><span | |
10201 class="cmtt-8"> </span><span | |
10202 class="cmtt-8"> </span><span | |
10203 class="cmtt-8"> </span><span | |
10204 class="cmtt-8"> </span><span | |
10205 class="cmtt-8"> </span><span | |
10206 class="cmtt-8"> 4)</span><span | |
10207 class="cmtt-8"> [partition\_count]</span><span | |
10208 class="cmtt-8"> =</span><span | |
10209 class="cmtt-8"> 0</span> | |
10210 <br class="fancyvrb" /><a | |
10211 id="x1-110028r6"></a><span | |
10212 class="cmr-6">6</span><span | |
10213 class="cmtt-8"> </span><span | |
10214 class="cmtt-8"> </span> | |
10215 <br class="fancyvrb" /><a | |
10216 id="x1-110030r7"></a><span | |
10217 class="cmr-6">7</span><span | |
10218 class="cmtt-8"> </span><span | |
10219 class="cmtt-8"> </span><span | |
10220 class="cmtt-8"> </span><span | |
10221 class="cmtt-8"> </span><span | |
10222 class="cmtt-8"> </span><span | |
10223 class="cmtt-8"> </span><span | |
10224 class="cmtt-8"> </span><span | |
10225 class="cmtt-8"> </span><span | |
10226 class="cmtt-8"> 5)</span><span | |
10227 class="cmtt-8"> while</span><span | |
10228 class="cmtt-8"> [partition\_count]</span><span | |
10229 class="cmtt-8"> is</span><span | |
10230 class="cmtt-8"> less</span><span | |
10231 class="cmtt-8"> than</span><span | |
10232 class="cmtt-8"> [partitions\_to\_read]</span> | |
10233 <br class="fancyvrb" /><a | |
10234 id="x1-110032r8"></a><span | |
10235 class="cmr-6">8</span><span | |
10236 class="cmtt-8"> </span><span | |
10237 class="cmtt-8"> </span> | |
10238 <br class="fancyvrb" /><a | |
10239 id="x1-110034r9"></a><span | |
10240 class="cmr-6">9</span><span | |
10241 class="cmtt-8"> </span><span | |
10242 class="cmtt-8"> </span><span | |
10243 class="cmtt-8"> </span><span | |
10244 class="cmtt-8"> </span><span | |
10245 class="cmtt-8"> </span><span | |
10246 class="cmtt-8"> </span><span | |
10247 class="cmtt-8"> </span><span | |
10248 class="cmtt-8"> </span><span | |
10249 class="cmtt-8"> </span><span | |
10250 class="cmtt-8"> </span><span | |
10251 class="cmtt-8"> </span><span | |
10252 class="cmtt-8"> </span><span | |
10253 class="cmtt-8"> </span><span | |
10254 class="cmtt-8"> 6)</span><span | |
10255 class="cmtt-8"> if</span><span | |
10256 class="cmtt-8"> ([pass]</span><span | |
10257 class="cmtt-8"> is</span><span | |
10258 class="cmtt-8"> zero)</span><span | |
10259 class="cmtt-8"> {</span> | |
10260 <br class="fancyvrb" /><a | |
10261 id="x1-110036r10"></a><span | |
10262 class="cmr-6">10</span><span | |
10263 class="cmtt-8"> </span><span | |
10264 class="cmtt-8"> </span> | |
10265 <br class="fancyvrb" /><a | |
10266 id="x1-110038r11"></a><span | |
10267 class="cmr-6">11</span><span | |
10268 class="cmtt-8"> </span><span | |
10269 class="cmtt-8"> </span><span | |
10270 class="cmtt-8"> </span><span | |
10271 class="cmtt-8"> </span><span | |
10272 class="cmtt-8"> </span><span | |
10273 class="cmtt-8"> </span><span | |
10274 class="cmtt-8"> </span><span | |
10275 class="cmtt-8"> </span><span | |
10276 class="cmtt-8"> </span><span | |
10277 class="cmtt-8"> </span><span | |
10278 class="cmtt-8"> </span><span | |
10279 class="cmtt-8"> </span><span | |
10280 class="cmtt-8"> </span><span | |
10281 class="cmtt-8"> </span><span | |
10282 class="cmtt-8"> </span><span | |
10283 class="cmtt-8"> </span><span | |
10284 class="cmtt-8"> </span><span | |
10285 class="cmtt-8"> </span><span | |
10286 class="cmtt-8"> 7)</span><span | |
10287 class="cmtt-8"> iterate</span><span | |
10288 class="cmtt-8"> [j]</span><span | |
10289 class="cmtt-8"> over</span><span | |
10290 class="cmtt-8"> the</span><span | |
10291 class="cmtt-8"> range</span><span | |
10292 class="cmtt-8"> 0</span><span | |
10293 class="cmtt-8"> ..</span><span | |
10294 class="cmtt-8"> [ch]-1</span><span | |
10295 class="cmtt-8"> {</span> | |
10296 <br class="fancyvrb" /><a | |
10297 id="x1-110040r12"></a><span | |
10298 class="cmr-6">12</span><span | |
10299 class="cmtt-8"> </span><span | |
10300 class="cmtt-8"> </span> | |
10301 <br class="fancyvrb" /><a | |
10302 id="x1-110042r13"></a><span | |
10303 class="cmr-6">13</span><span | |
10304 class="cmtt-8"> </span><span | |
10305 class="cmtt-8"> </span><span | |
10306 class="cmtt-8"> </span><span | |
10307 class="cmtt-8"> </span><span | |
10308 class="cmtt-8"> </span><span | |
10309 class="cmtt-8"> </span><span | |
10310 class="cmtt-8"> </span><span | |
10311 class="cmtt-8"> </span><span | |
10312 class="cmtt-8"> </span><span | |
10313 class="cmtt-8"> </span><span | |
10314 class="cmtt-8"> </span><span | |
10315 class="cmtt-8"> </span><span | |
10316 class="cmtt-8"> </span><span | |
10317 class="cmtt-8"> </span><span | |
10318 class="cmtt-8"> </span><span | |
10319 class="cmtt-8"> </span><span | |
10320 class="cmtt-8"> </span><span | |
10321 class="cmtt-8"> </span><span | |
10322 class="cmtt-8"> </span><span | |
10323 class="cmtt-8"> </span><span | |
10324 class="cmtt-8"> </span><span | |
10325 class="cmtt-8"> </span><span | |
10326 class="cmtt-8"> </span><span | |
10327 class="cmtt-8"> 8)</span><span | |
10328 class="cmtt-8"> if</span><span | |
10329 class="cmtt-8"> vector</span><span | |
10330 class="cmtt-8"> [j]</span><span | |
10331 class="cmtt-8"> is</span><span | |
10332 class="cmtt-8"> not</span><span | |
10333 class="cmtt-8"> marked</span><span | |
10334 class="cmtt-8"> ’do</span><span | |
10335 class="cmtt-8"> not</span><span | |
10336 class="cmtt-8"> decode’</span><span | |
10337 class="cmtt-8"> {</span> | |
10338 <br class="fancyvrb" /><a | |
10339 id="x1-110044r14"></a><span | |
10340 class="cmr-6">14</span><span | |
10341 class="cmtt-8"> </span><span | |
10342 class="cmtt-8"> </span> | |
10343 <br class="fancyvrb" /><a | |
10344 id="x1-110046r15"></a><span | |
10345 class="cmr-6">15</span><span | |
10346 class="cmtt-8"> </span><span | |
10347 class="cmtt-8"> </span><span | |
10348 class="cmtt-8"> </span><span | |
10349 class="cmtt-8"> </span><span | |
10350 class="cmtt-8"> </span><span | |
10351 class="cmtt-8"> </span><span | |
10352 class="cmtt-8"> </span><span | |
10353 class="cmtt-8"> </span><span | |
10354 class="cmtt-8"> </span><span | |
10355 class="cmtt-8"> </span><span | |
10356 class="cmtt-8"> </span><span | |
10357 class="cmtt-8"> </span><span | |
10358 class="cmtt-8"> </span><span | |
10359 class="cmtt-8"> </span><span | |
10360 class="cmtt-8"> </span><span | |
10361 class="cmtt-8"> </span><span | |
10362 class="cmtt-8"> </span><span | |
10363 class="cmtt-8"> </span><span | |
10364 class="cmtt-8"> </span><span | |
10365 class="cmtt-8"> </span><span | |
10366 class="cmtt-8"> </span><span | |
10367 class="cmtt-8"> </span><span | |
10368 class="cmtt-8"> </span><span | |
10369 class="cmtt-8"> </span><span | |
10370 class="cmtt-8"> </span><span | |
10371 class="cmtt-8"> </span><span | |
10372 class="cmtt-8"> </span><span | |
10373 class="cmtt-8"> </span><span | |
10374 class="cmtt-8"> 9)</span><span | |
10375 class="cmtt-8"> [temp]</span><span | |
10376 class="cmtt-8"> =</span><span | |
10377 class="cmtt-8"> read</span><span | |
10378 class="cmtt-8"> from</span><span | |
10379 class="cmtt-8"> packet</span><span | |
10380 class="cmtt-8"> using</span><span | |
10381 class="cmtt-8"> codebook</span><span | |
10382 class="cmtt-8"> [residue\_classbook]</span><span | |
10383 class="cmtt-8"> in</span><span | |
10384 class="cmtt-8"> scalar</span><span | |
10385 class="cmtt-8"> context</span> | |
10386 <br class="fancyvrb" /><a | |
10387 id="x1-110048r16"></a><span | |
10388 class="cmr-6">16</span><span | |
10389 class="cmtt-8"> </span><span | |
10390 class="cmtt-8"> </span><span | |
10391 class="cmtt-8"> </span><span | |
10392 class="cmtt-8"> </span><span | |
10393 class="cmtt-8"> </span><span | |
10394 class="cmtt-8"> </span><span | |
10395 class="cmtt-8"> </span><span | |
10396 class="cmtt-8"> </span><span | |
10397 class="cmtt-8"> </span><span | |
10398 class="cmtt-8"> </span><span | |
10399 class="cmtt-8"> </span><span | |
10400 class="cmtt-8"> </span><span | |
10401 class="cmtt-8"> </span><span | |
10402 class="cmtt-8"> </span><span | |
10403 class="cmtt-8"> </span><span | |
10404 class="cmtt-8"> </span><span | |
10405 class="cmtt-8"> </span><span | |
10406 class="cmtt-8"> </span><span | |
10407 class="cmtt-8"> </span><span | |
10408 class="cmtt-8"> </span><span | |
10409 class="cmtt-8"> </span><span | |
10410 class="cmtt-8"> </span><span | |
10411 class="cmtt-8"> </span><span | |
10412 class="cmtt-8"> </span><span | |
10413 class="cmtt-8"> </span><span | |
10414 class="cmtt-8"> </span><span | |
10415 class="cmtt-8"> </span><span | |
10416 class="cmtt-8"> 10)</span><span | |
10417 class="cmtt-8"> iterate</span><span | |
10418 class="cmtt-8"> [i]</span><span | |
10419 class="cmtt-8"> descending</span><span | |
10420 class="cmtt-8"> over</span><span | |
10421 class="cmtt-8"> the</span><span | |
10422 class="cmtt-8"> range</span><span | |
10423 class="cmtt-8"> [classwords\_per\_codeword]-1</span><span | |
10424 class="cmtt-8"> ...</span><span | |
10425 class="cmtt-8"> 0</span><span | |
10426 class="cmtt-8"> {</span> | |
10427 <br class="fancyvrb" /><a | |
10428 id="x1-110050r17"></a><span | |
10429 class="cmr-6">17</span><span | |
10430 class="cmtt-8"> </span><span | |
10431 class="cmtt-8"> </span> | |
10432 <br class="fancyvrb" /><a | |
10433 id="x1-110052r18"></a><span | |
10434 class="cmr-6">18</span><span | |
10435 class="cmtt-8"> </span><span | |
10436 class="cmtt-8"> </span><span | |
10437 class="cmtt-8"> </span><span | |
10438 class="cmtt-8"> </span><span | |
10439 class="cmtt-8"> </span><span | |
10440 class="cmtt-8"> </span><span | |
10441 class="cmtt-8"> </span><span | |
10442 class="cmtt-8"> </span><span | |
10443 class="cmtt-8"> </span><span | |
10444 class="cmtt-8"> </span><span | |
10445 class="cmtt-8"> </span><span | |
10446 class="cmtt-8"> </span><span | |
10447 class="cmtt-8"> </span><span | |
10448 class="cmtt-8"> </span><span | |
10449 class="cmtt-8"> </span><span | |
10450 class="cmtt-8"> </span><span | |
10451 class="cmtt-8"> </span><span | |
10452 class="cmtt-8"> </span><span | |
10453 class="cmtt-8"> </span><span | |
10454 class="cmtt-8"> </span><span | |
10455 class="cmtt-8"> </span><span | |
10456 class="cmtt-8"> </span><span | |
10457 class="cmtt-8"> </span><span | |
10458 class="cmtt-8"> </span><span | |
10459 class="cmtt-8"> </span><span | |
10460 class="cmtt-8"> </span><span | |
10461 class="cmtt-8"> </span><span | |
10462 class="cmtt-8"> </span><span | |
10463 class="cmtt-8"> </span><span | |
10464 class="cmtt-8"> </span><span | |
10465 class="cmtt-8"> </span><span | |
10466 class="cmtt-8"> </span><span | |
10467 class="cmtt-8"> 11)</span><span | |
10468 class="cmtt-8"> array</span><span | |
10469 class="cmtt-8"> [classifications]</span><span | |
10470 class="cmtt-8"> element</span><span | |
10471 class="cmtt-8"> [j],([i]+[partition\_count])</span><span | |
10472 class="cmtt-8"> =</span> | |
10473 <br class="fancyvrb" /><a | |
10474 id="x1-110054r19"></a><span | |
10475 class="cmr-6">19</span><span | |
10476 class="cmtt-8"> </span><span | |
10477 class="cmtt-8"> </span><span | |
10478 class="cmtt-8"> </span><span | |
10479 class="cmtt-8"> </span><span | |
10480 class="cmtt-8"> </span><span | |
10481 class="cmtt-8"> </span><span | |
10482 class="cmtt-8"> </span><span | |
10483 class="cmtt-8"> </span><span | |
10484 class="cmtt-8"> </span><span | |
10485 class="cmtt-8"> </span><span | |
10486 class="cmtt-8"> </span><span | |
10487 class="cmtt-8"> </span><span | |
10488 class="cmtt-8"> </span><span | |
10489 class="cmtt-8"> </span><span | |
10490 class="cmtt-8"> </span><span | |
10491 class="cmtt-8"> </span><span | |
10492 class="cmtt-8"> </span><span | |
10493 class="cmtt-8"> </span><span | |
10494 class="cmtt-8"> </span><span | |
10495 class="cmtt-8"> </span><span | |
10496 class="cmtt-8"> </span><span | |
10497 class="cmtt-8"> </span><span | |
10498 class="cmtt-8"> </span><span | |
10499 class="cmtt-8"> </span><span | |
10500 class="cmtt-8"> </span><span | |
10501 class="cmtt-8"> </span><span | |
10502 class="cmtt-8"> </span><span | |
10503 class="cmtt-8"> </span><span | |
10504 class="cmtt-8"> </span><span | |
10505 class="cmtt-8"> </span><span | |
10506 class="cmtt-8"> </span><span | |
10507 class="cmtt-8"> </span><span | |
10508 class="cmtt-8"> </span><span | |
10509 class="cmtt-8"> </span><span | |
10510 class="cmtt-8"> </span><span | |
10511 class="cmtt-8"> </span><span | |
10512 class="cmtt-8"> [temp]</span><span | |
10513 class="cmtt-8"> integer</span><span | |
10514 class="cmtt-8"> modulo</span><span | |
10515 class="cmtt-8"> [residue\_classifications]</span> | |
10516 <br class="fancyvrb" /><a | |
10517 id="x1-110056r20"></a><span | |
10518 class="cmr-6">20</span><span | |
10519 class="cmtt-8"> </span><span | |
10520 class="cmtt-8"> </span><span | |
10521 class="cmtt-8"> </span><span | |
10522 class="cmtt-8"> </span><span | |
10523 class="cmtt-8"> </span><span | |
10524 class="cmtt-8"> </span><span | |
10525 class="cmtt-8"> </span><span | |
10526 class="cmtt-8"> </span><span | |
10527 class="cmtt-8"> </span><span | |
10528 class="cmtt-8"> </span><span | |
10529 class="cmtt-8"> </span><span | |
10530 class="cmtt-8"> </span><span | |
10531 class="cmtt-8"> </span><span | |
10532 class="cmtt-8"> </span><span | |
10533 class="cmtt-8"> </span><span | |
10534 class="cmtt-8"> </span><span | |
10535 class="cmtt-8"> </span><span | |
10536 class="cmtt-8"> </span><span | |
10537 class="cmtt-8"> </span><span | |
10538 class="cmtt-8"> </span><span | |
10539 class="cmtt-8"> </span><span | |
10540 class="cmtt-8"> </span><span | |
10541 class="cmtt-8"> </span><span | |
10542 class="cmtt-8"> </span><span | |
10543 class="cmtt-8"> </span><span | |
10544 class="cmtt-8"> </span><span | |
10545 class="cmtt-8"> </span><span | |
10546 class="cmtt-8"> </span><span | |
10547 class="cmtt-8"> </span><span | |
10548 class="cmtt-8"> </span><span | |
10549 class="cmtt-8"> </span><span | |
10550 class="cmtt-8"> </span><span | |
10551 class="cmtt-8"> 12)</span><span | |
10552 class="cmtt-8"> [temp]</span><span | |
10553 class="cmtt-8"> =</span><span | |
10554 class="cmtt-8"> [temp]</span><span | |
10555 class="cmtt-8"> /</span><span | |
10556 class="cmtt-8"> [residue\_classifications]</span><span | |
10557 class="cmtt-8"> using</span><span | |
10558 class="cmtt-8"> integer</span><span | |
10559 class="cmtt-8"> division</span> | |
10560 <br class="fancyvrb" /><a | |
10561 id="x1-110058r21"></a><span | |
10562 class="cmr-6">21</span><span | |
10563 class="cmtt-8"> </span><span | |
10564 class="cmtt-8"> </span> | |
10565 <br class="fancyvrb" /><a | |
10566 id="x1-110060r22"></a><span | |
10567 class="cmr-6">22</span><span | |
10568 class="cmtt-8"> </span><span | |
10569 class="cmtt-8"> </span><span | |
10570 class="cmtt-8"> </span><span | |
10571 class="cmtt-8"> </span><span | |
10572 class="cmtt-8"> </span><span | |
10573 class="cmtt-8"> </span><span | |
10574 class="cmtt-8"> </span><span | |
10575 class="cmtt-8"> </span><span | |
10576 class="cmtt-8"> </span><span | |
10577 class="cmtt-8"> </span><span | |
10578 class="cmtt-8"> </span><span | |
10579 class="cmtt-8"> </span><span | |
10580 class="cmtt-8"> </span><span | |
10581 class="cmtt-8"> </span><span | |
10582 class="cmtt-8"> </span><span | |
10583 class="cmtt-8"> </span><span | |
10584 class="cmtt-8"> </span><span | |
10585 class="cmtt-8"> </span><span | |
10586 class="cmtt-8"> </span><span | |
10587 class="cmtt-8"> </span><span | |
10588 class="cmtt-8"> </span><span | |
10589 class="cmtt-8"> </span><span | |
10590 class="cmtt-8"> </span><span | |
10591 class="cmtt-8"> </span><span | |
10592 class="cmtt-8"> </span><span | |
10593 class="cmtt-8"> </span><span | |
10594 class="cmtt-8"> </span><span | |
10595 class="cmtt-8"> </span><span | |
10596 class="cmtt-8"> </span><span | |
10597 class="cmtt-8"> </span><span | |
10598 class="cmtt-8"> </span><span | |
10599 class="cmtt-8"> }</span> | |
10600 <br class="fancyvrb" /><a | |
10601 id="x1-110062r23"></a><span | |
10602 class="cmr-6">23</span><span | |
10603 class="cmtt-8"> </span><span | |
10604 class="cmtt-8"> </span> | |
10605 <br class="fancyvrb" /><a | |
10606 id="x1-110064r24"></a><span | |
10607 class="cmr-6">24</span><span | |
10608 class="cmtt-8"> </span><span | |
10609 class="cmtt-8"> </span><span | |
10610 class="cmtt-8"> </span><span | |
10611 class="cmtt-8"> </span><span | |
10612 class="cmtt-8"> </span><span | |
10613 class="cmtt-8"> </span><span | |
10614 class="cmtt-8"> </span><span | |
10615 class="cmtt-8"> </span><span | |
10616 class="cmtt-8"> </span><span | |
10617 class="cmtt-8"> </span><span | |
10618 class="cmtt-8"> </span><span | |
10619 class="cmtt-8"> </span><span | |
10620 class="cmtt-8"> </span><span | |
10621 class="cmtt-8"> </span><span | |
10622 class="cmtt-8"> </span><span | |
10623 class="cmtt-8"> </span><span | |
10624 class="cmtt-8"> </span><span | |
10625 class="cmtt-8"> </span><span | |
10626 class="cmtt-8"> </span><span | |
10627 class="cmtt-8"> </span><span | |
10628 class="cmtt-8"> </span><span | |
10629 class="cmtt-8"> </span><span | |
10630 class="cmtt-8"> </span><span | |
10631 class="cmtt-8"> </span><span | |
10632 class="cmtt-8"> </span><span | |
10633 class="cmtt-8"> </span><span | |
10634 class="cmtt-8"> }</span> | |
10635 <br class="fancyvrb" /><a | |
10636 id="x1-110066r25"></a><span | |
10637 class="cmr-6">25</span><span | |
10638 class="cmtt-8"> </span><span | |
10639 class="cmtt-8"> </span> | |
10640 <br class="fancyvrb" /><a | |
10641 id="x1-110068r26"></a><span | |
10642 class="cmr-6">26</span><span | |
10643 class="cmtt-8"> </span><span | |
10644 class="cmtt-8"> </span><span | |
10645 class="cmtt-8"> </span><span | |
10646 class="cmtt-8"> </span><span | |
10647 class="cmtt-8"> </span><span | |
10648 class="cmtt-8"> </span><span | |
10649 class="cmtt-8"> </span><span | |
10650 class="cmtt-8"> </span><span | |
10651 class="cmtt-8"> </span><span | |
10652 class="cmtt-8"> </span><span | |
10653 class="cmtt-8"> </span><span | |
10654 class="cmtt-8"> </span><span | |
10655 class="cmtt-8"> </span><span | |
10656 class="cmtt-8"> </span><span | |
10657 class="cmtt-8"> </span><span | |
10658 class="cmtt-8"> </span><span | |
10659 class="cmtt-8"> </span><span | |
10660 class="cmtt-8"> </span><span | |
10661 class="cmtt-8"> </span><span | |
10662 class="cmtt-8"> </span><span | |
10663 class="cmtt-8"> </span><span | |
10664 class="cmtt-8"> }</span> | |
10665 <br class="fancyvrb" /><a | |
10666 id="x1-110070r27"></a><span | |
10667 class="cmr-6">27</span><span | |
10668 class="cmtt-8"> </span><span | |
10669 class="cmtt-8"> </span> | |
10670 <br class="fancyvrb" /><a | |
10671 id="x1-110072r28"></a><span | |
10672 class="cmr-6">28</span><span | |
10673 class="cmtt-8"> </span><span | |
10674 class="cmtt-8"> </span><span | |
10675 class="cmtt-8"> </span><span | |
10676 class="cmtt-8"> </span><span | |
10677 class="cmtt-8"> </span><span | |
10678 class="cmtt-8"> </span><span | |
10679 class="cmtt-8"> </span><span | |
10680 class="cmtt-8"> </span><span | |
10681 class="cmtt-8"> </span><span | |
10682 class="cmtt-8"> </span><span | |
10683 class="cmtt-8"> </span><span | |
10684 class="cmtt-8"> </span><span | |
10685 class="cmtt-8"> </span><span | |
10686 class="cmtt-8"> </span><span | |
10687 class="cmtt-8"> </span><span | |
10688 class="cmtt-8"> </span><span | |
10689 class="cmtt-8"> }</span> | |
10690 <br class="fancyvrb" /><a | |
10691 id="x1-110074r29"></a><span | |
10692 class="cmr-6">29</span><span | |
10693 class="cmtt-8"> </span><span | |
10694 class="cmtt-8"> </span> | |
10695 <br class="fancyvrb" /><a | |
10696 id="x1-110076r30"></a><span | |
10697 class="cmr-6">30</span><span | |
10698 class="cmtt-8"> </span><span | |
10699 class="cmtt-8"> </span><span | |
10700 class="cmtt-8"> </span><span | |
10701 class="cmtt-8"> </span><span | |
10702 class="cmtt-8"> </span><span | |
10703 class="cmtt-8"> </span><span | |
10704 class="cmtt-8"> </span><span | |
10705 class="cmtt-8"> </span><span | |
10706 class="cmtt-8"> </span><span | |
10707 class="cmtt-8"> </span><span | |
10708 class="cmtt-8"> </span><span | |
10709 class="cmtt-8"> </span><span | |
10710 class="cmtt-8"> 13)</span><span | |
10711 class="cmtt-8"> iterate</span><span | |
10712 class="cmtt-8"> [i]</span><span | |
10713 class="cmtt-8"> over</span><span | |
10714 class="cmtt-8"> the</span><span | |
10715 class="cmtt-8"> range</span><span | |
10716 class="cmtt-8"> 0</span><span | |
10717 class="cmtt-8"> ..</span><span | |
10718 class="cmtt-8"> ([classwords\_per\_codeword]</span><span | |
10719 class="cmtt-8"> -</span><span | |
10720 class="cmtt-8"> 1)</span><span | |
10721 class="cmtt-8"> while</span><span | |
10722 class="cmtt-8"> [partition\_count]</span> | |
10723 <br class="fancyvrb" /><a | |
10724 id="x1-110078r31"></a><span | |
10725 class="cmr-6">31</span><span | |
10726 class="cmtt-8"> </span><span | |
10727 class="cmtt-8"> </span><span | |
10728 class="cmtt-8"> </span><span | |
10729 class="cmtt-8"> </span><span | |
10730 class="cmtt-8"> </span><span | |
10731 class="cmtt-8"> </span><span | |
10732 class="cmtt-8"> </span><span | |
10733 class="cmtt-8"> </span><span | |
10734 class="cmtt-8"> </span><span | |
10735 class="cmtt-8"> </span><span | |
10736 class="cmtt-8"> </span><span | |
10737 class="cmtt-8"> </span><span | |
10738 class="cmtt-8"> </span><span | |
10739 class="cmtt-8"> </span><span | |
10740 class="cmtt-8"> </span><span | |
10741 class="cmtt-8"> </span><span | |
10742 class="cmtt-8"> is</span><span | |
10743 class="cmtt-8"> also</span><span | |
10744 class="cmtt-8"> less</span><span | |
10745 class="cmtt-8"> than</span><span | |
10746 class="cmtt-8"> [partitions\_to\_read]</span><span | |
10747 class="cmtt-8"> {</span> | |
10748 <br class="fancyvrb" /><a | |
10749 id="x1-110080r32"></a><span | |
10750 class="cmr-6">32</span><span | |
10751 class="cmtt-8"> </span><span | |
10752 class="cmtt-8"> </span> | |
10753 <br class="fancyvrb" /><a | |
10754 id="x1-110082r33"></a><span | |
10755 class="cmr-6">33</span><span | |
10756 class="cmtt-8"> </span><span | |
10757 class="cmtt-8"> </span><span | |
10758 class="cmtt-8"> </span><span | |
10759 class="cmtt-8"> </span><span | |
10760 class="cmtt-8"> </span><span | |
10761 class="cmtt-8"> </span><span | |
10762 class="cmtt-8"> </span><span | |
10763 class="cmtt-8"> </span><span | |
10764 class="cmtt-8"> </span><span | |
10765 class="cmtt-8"> </span><span | |
10766 class="cmtt-8"> </span><span | |
10767 class="cmtt-8"> </span><span | |
10768 class="cmtt-8"> </span><span | |
10769 class="cmtt-8"> </span><span | |
10770 class="cmtt-8"> </span><span | |
10771 class="cmtt-8"> </span><span | |
10772 class="cmtt-8"> </span><span | |
10773 class="cmtt-8"> </span><span | |
10774 class="cmtt-8"> 14)</span><span | |
10775 class="cmtt-8"> iterate</span><span | |
10776 class="cmtt-8"> [j]</span><span | |
10777 class="cmtt-8"> over</span><span | |
10778 class="cmtt-8"> the</span><span | |
10779 class="cmtt-8"> range</span><span | |
10780 class="cmtt-8"> 0</span><span | |
10781 class="cmtt-8"> ..</span><span | |
10782 class="cmtt-8"> [ch]-1</span><span | |
10783 class="cmtt-8"> {</span> | |
10784 <br class="fancyvrb" /><a | |
10785 id="x1-110084r34"></a><span | |
10786 class="cmr-6">34</span><span | |
10787 class="cmtt-8"> </span><span | |
10788 class="cmtt-8"> </span> | |
10789 <br class="fancyvrb" /><a | |
10790 id="x1-110086r35"></a><span | |
10791 class="cmr-6">35</span><span | |
10792 class="cmtt-8"> </span><span | |
10793 class="cmtt-8"> </span><span | |
10794 class="cmtt-8"> </span><span | |
10795 class="cmtt-8"> </span><span | |
10796 class="cmtt-8"> </span><span | |
10797 class="cmtt-8"> </span><span | |
10798 class="cmtt-8"> </span><span | |
10799 class="cmtt-8"> </span><span | |
10800 class="cmtt-8"> </span><span | |
10801 class="cmtt-8"> </span><span | |
10802 class="cmtt-8"> </span><span | |
10803 class="cmtt-8"> </span><span | |
10804 class="cmtt-8"> </span><span | |
10805 class="cmtt-8"> </span><span | |
10806 class="cmtt-8"> </span><span | |
10807 class="cmtt-8"> </span><span | |
10808 class="cmtt-8"> </span><span | |
10809 class="cmtt-8"> </span><span | |
10810 class="cmtt-8"> </span><span | |
10811 class="cmtt-8"> </span><span | |
10812 class="cmtt-8"> </span><span | |
10813 class="cmtt-8"> </span><span | |
10814 class="cmtt-8"> </span><span | |
10815 class="cmtt-8"> 15)</span><span | |
10816 class="cmtt-8"> if</span><span | |
10817 class="cmtt-8"> vector</span><span | |
10818 class="cmtt-8"> [j]</span><span | |
10819 class="cmtt-8"> is</span><span | |
10820 class="cmtt-8"> not</span><span | |
10821 class="cmtt-8"> marked</span><span | |
10822 class="cmtt-8"> ’do</span><span | |
10823 class="cmtt-8"> not</span><span | |
10824 class="cmtt-8"> decode’</span><span | |
10825 class="cmtt-8"> {</span> | |
10826 <br class="fancyvrb" /><a | |
10827 id="x1-110088r36"></a><span | |
10828 class="cmr-6">36</span><span | |
10829 class="cmtt-8"> </span><span | |
10830 class="cmtt-8"> </span> | |
10831 <br class="fancyvrb" /><a | |
10832 id="x1-110090r37"></a><span | |
10833 class="cmr-6">37</span><span | |
10834 class="cmtt-8"> </span><span | |
10835 class="cmtt-8"> </span><span | |
10836 class="cmtt-8"> </span><span | |
10837 class="cmtt-8"> </span><span | |
10838 class="cmtt-8"> </span><span | |
10839 class="cmtt-8"> </span><span | |
10840 class="cmtt-8"> </span><span | |
10841 class="cmtt-8"> </span><span | |
10842 class="cmtt-8"> </span><span | |
10843 class="cmtt-8"> </span><span | |
10844 class="cmtt-8"> </span><span | |
10845 class="cmtt-8"> </span><span | |
10846 class="cmtt-8"> </span><span | |
10847 class="cmtt-8"> </span><span | |
10848 class="cmtt-8"> </span><span | |
10849 class="cmtt-8"> </span><span | |
10850 class="cmtt-8"> </span><span | |
10851 class="cmtt-8"> </span><span | |
10852 class="cmtt-8"> </span><span | |
10853 class="cmtt-8"> </span><span | |
10854 class="cmtt-8"> </span><span | |
10855 class="cmtt-8"> </span><span | |
10856 class="cmtt-8"> </span><span | |
10857 class="cmtt-8"> </span><span | |
10858 class="cmtt-8"> </span><span | |
10859 class="cmtt-8"> </span><span | |
10860 class="cmtt-8"> </span><span | |
10861 class="cmtt-8"> </span><span | |
10862 class="cmtt-8"> 16)</span><span | |
10863 class="cmtt-8"> [vqclass]</span><span | |
10864 class="cmtt-8"> =</span><span | |
10865 class="cmtt-8"> array</span><span | |
10866 class="cmtt-8"> [classifications]</span><span | |
10867 class="cmtt-8"> element</span><span | |
10868 class="cmtt-8"> [j],[partition\_count]</span> | |
10869 <br class="fancyvrb" /><a | |
10870 id="x1-110092r38"></a><span | |
10871 class="cmr-6">38</span><span | |
10872 class="cmtt-8"> </span><span | |
10873 class="cmtt-8"> </span><span | |
10874 class="cmtt-8"> </span><span | |
10875 class="cmtt-8"> </span><span | |
10876 class="cmtt-8"> </span><span | |
10877 class="cmtt-8"> </span><span | |
10878 class="cmtt-8"> </span><span | |
10879 class="cmtt-8"> </span><span | |
10880 class="cmtt-8"> </span><span | |
10881 class="cmtt-8"> </span><span | |
10882 class="cmtt-8"> </span><span | |
10883 class="cmtt-8"> </span><span | |
10884 class="cmtt-8"> </span><span | |
10885 class="cmtt-8"> </span><span | |
10886 class="cmtt-8"> </span><span | |
10887 class="cmtt-8"> </span><span | |
10888 class="cmtt-8"> </span><span | |
10889 class="cmtt-8"> </span><span | |
10890 class="cmtt-8"> </span><span | |
10891 class="cmtt-8"> </span><span | |
10892 class="cmtt-8"> </span><span | |
10893 class="cmtt-8"> </span><span | |
10894 class="cmtt-8"> </span><span | |
10895 class="cmtt-8"> </span><span | |
10896 class="cmtt-8"> </span><span | |
10897 class="cmtt-8"> </span><span | |
10898 class="cmtt-8"> </span><span | |
10899 class="cmtt-8"> </span><span | |
10900 class="cmtt-8"> 17)</span><span | |
10901 class="cmtt-8"> [vqbook]</span><span | |
10902 class="cmtt-8"> =</span><span | |
10903 class="cmtt-8"> array</span><span | |
10904 class="cmtt-8"> [residue\_books]</span><span | |
10905 class="cmtt-8"> element</span><span | |
10906 class="cmtt-8"> [vqclass],[pass]</span> | |
10907 <br class="fancyvrb" /><a | |
10908 id="x1-110094r39"></a><span | |
10909 class="cmr-6">39</span><span | |
10910 class="cmtt-8"> </span><span | |
10911 class="cmtt-8"> </span><span | |
10912 class="cmtt-8"> </span><span | |
10913 class="cmtt-8"> </span><span | |
10914 class="cmtt-8"> </span><span | |
10915 class="cmtt-8"> </span><span | |
10916 class="cmtt-8"> </span><span | |
10917 class="cmtt-8"> </span><span | |
10918 class="cmtt-8"> </span><span | |
10919 class="cmtt-8"> </span><span | |
10920 class="cmtt-8"> </span><span | |
10921 class="cmtt-8"> </span><span | |
10922 class="cmtt-8"> </span><span | |
10923 class="cmtt-8"> </span><span | |
10924 class="cmtt-8"> </span><span | |
10925 class="cmtt-8"> </span><span | |
10926 class="cmtt-8"> </span><span | |
10927 class="cmtt-8"> </span><span | |
10928 class="cmtt-8"> </span><span | |
10929 class="cmtt-8"> </span><span | |
10930 class="cmtt-8"> </span><span | |
10931 class="cmtt-8"> </span><span | |
10932 class="cmtt-8"> </span><span | |
10933 class="cmtt-8"> </span><span | |
10934 class="cmtt-8"> </span><span | |
10935 class="cmtt-8"> </span><span | |
10936 class="cmtt-8"> </span><span | |
10937 class="cmtt-8"> </span><span | |
10938 class="cmtt-8"> 18)</span><span | |
10939 class="cmtt-8"> if</span><span | |
10940 class="cmtt-8"> ([vqbook]</span><span | |
10941 class="cmtt-8"> is</span><span | |
10942 class="cmtt-8"> not</span><span | |
10943 class="cmtt-8"> ’unused’)</span><span | |
10944 class="cmtt-8"> {</span> | |
10945 <br class="fancyvrb" /><a | |
10946 id="x1-110096r40"></a><span | |
10947 class="cmr-6">40</span><span | |
10948 class="cmtt-8"> </span><span | |
10949 class="cmtt-8"> </span> | |
10950 <br class="fancyvrb" /><a | |
10951 id="x1-110098r41"></a><span | |
10952 class="cmr-6">41</span><span | |
10953 class="cmtt-8"> </span><span | |
10954 class="cmtt-8"> </span><span | |
10955 class="cmtt-8"> </span><span | |
10956 class="cmtt-8"> </span><span | |
10957 class="cmtt-8"> </span><span | |
10958 class="cmtt-8"> </span><span | |
10959 class="cmtt-8"> </span><span | |
10960 class="cmtt-8"> </span><span | |
10961 class="cmtt-8"> </span><span | |
10962 class="cmtt-8"> </span><span | |
10963 class="cmtt-8"> </span><span | |
10964 class="cmtt-8"> </span><span | |
10965 class="cmtt-8"> </span><span | |
10966 class="cmtt-8"> </span><span | |
10967 class="cmtt-8"> </span><span | |
10968 class="cmtt-8"> </span><span | |
10969 class="cmtt-8"> </span><span | |
10970 class="cmtt-8"> </span><span | |
10971 class="cmtt-8"> </span><span | |
10972 class="cmtt-8"> </span><span | |
10973 class="cmtt-8"> </span><span | |
10974 class="cmtt-8"> </span><span | |
10975 class="cmtt-8"> </span><span | |
10976 class="cmtt-8"> </span><span | |
10977 class="cmtt-8"> </span><span | |
10978 class="cmtt-8"> </span><span | |
10979 class="cmtt-8"> </span><span | |
10980 class="cmtt-8"> </span><span | |
10981 class="cmtt-8"> </span><span | |
10982 class="cmtt-8"> </span><span | |
10983 class="cmtt-8"> </span><span | |
10984 class="cmtt-8"> </span><span | |
10985 class="cmtt-8"> </span><span | |
10986 class="cmtt-8"> 19)</span><span | |
10987 class="cmtt-8"> decode</span><span | |
10988 class="cmtt-8"> partition</span><span | |
10989 class="cmtt-8"> into</span><span | |
10990 class="cmtt-8"> output</span><span | |
10991 class="cmtt-8"> vector</span><span | |
10992 class="cmtt-8"> number</span><span | |
10993 class="cmtt-8"> [j],</span><span | |
10994 class="cmtt-8"> starting</span><span | |
10995 class="cmtt-8"> at</span><span | |
10996 class="cmtt-8"> scalar</span> | |
10997 <br class="fancyvrb" /><a | |
10998 id="x1-110100r42"></a><span | |
10999 class="cmr-6">42</span><span | |
11000 class="cmtt-8"> </span><span | |
11001 class="cmtt-8"> </span><span | |
11002 class="cmtt-8"> </span><span | |
11003 class="cmtt-8"> </span><span | |
11004 class="cmtt-8"> </span><span | |
11005 class="cmtt-8"> </span><span | |
11006 class="cmtt-8"> </span><span | |
11007 class="cmtt-8"> </span><span | |
11008 class="cmtt-8"> </span><span | |
11009 class="cmtt-8"> </span><span | |
11010 class="cmtt-8"> </span><span | |
11011 class="cmtt-8"> </span><span | |
11012 class="cmtt-8"> </span><span | |
11013 class="cmtt-8"> </span><span | |
11014 class="cmtt-8"> </span><span | |
11015 class="cmtt-8"> </span><span | |
11016 class="cmtt-8"> </span><span | |
11017 class="cmtt-8"> </span><span | |
11018 class="cmtt-8"> </span><span | |
11019 class="cmtt-8"> </span><span | |
11020 class="cmtt-8"> </span><span | |
11021 class="cmtt-8"> </span><span | |
11022 class="cmtt-8"> </span><span | |
11023 class="cmtt-8"> </span><span | |
11024 class="cmtt-8"> </span><span | |
11025 class="cmtt-8"> </span><span | |
11026 class="cmtt-8"> </span><span | |
11027 class="cmtt-8"> </span><span | |
11028 class="cmtt-8"> </span><span | |
11029 class="cmtt-8"> </span><span | |
11030 class="cmtt-8"> </span><span | |
11031 class="cmtt-8"> </span><span | |
11032 class="cmtt-8"> </span><span | |
11033 class="cmtt-8"> </span><span | |
11034 class="cmtt-8"> </span><span | |
11035 class="cmtt-8"> </span><span | |
11036 class="cmtt-8"> </span><span | |
11037 class="cmtt-8"> offset</span><span | |
11038 class="cmtt-8"> [limit\_residue\_begin]+[partition\_count]*[residue\_partition\_size]</span><span | |
11039 class="cmtt-8"> using</span> | |
11040 <br class="fancyvrb" /><a | |
11041 id="x1-110102r43"></a><span | |
11042 class="cmr-6">43</span><span | |
11043 class="cmtt-8"> </span><span | |
11044 class="cmtt-8"> </span><span | |
11045 class="cmtt-8"> </span><span | |
11046 class="cmtt-8"> </span><span | |
11047 class="cmtt-8"> </span><span | |
11048 class="cmtt-8"> </span><span | |
11049 class="cmtt-8"> </span><span | |
11050 class="cmtt-8"> </span><span | |
11051 class="cmtt-8"> </span><span | |
11052 class="cmtt-8"> </span><span | |
11053 class="cmtt-8"> </span><span | |
11054 class="cmtt-8"> </span><span | |
11055 class="cmtt-8"> </span><span | |
11056 class="cmtt-8"> </span><span | |
11057 class="cmtt-8"> </span><span | |
11058 class="cmtt-8"> </span><span | |
11059 class="cmtt-8"> </span><span | |
11060 class="cmtt-8"> </span><span | |
11061 class="cmtt-8"> </span><span | |
11062 class="cmtt-8"> </span><span | |
11063 class="cmtt-8"> </span><span | |
11064 class="cmtt-8"> </span><span | |
11065 class="cmtt-8"> </span><span | |
11066 class="cmtt-8"> </span><span | |
11067 class="cmtt-8"> </span><span | |
11068 class="cmtt-8"> </span><span | |
11069 class="cmtt-8"> </span><span | |
11070 class="cmtt-8"> </span><span | |
11071 class="cmtt-8"> </span><span | |
11072 class="cmtt-8"> </span><span | |
11073 class="cmtt-8"> </span><span | |
11074 class="cmtt-8"> </span><span | |
11075 class="cmtt-8"> </span><span | |
11076 class="cmtt-8"> </span><span | |
11077 class="cmtt-8"> </span><span | |
11078 class="cmtt-8"> </span><span | |
11079 class="cmtt-8"> </span><span | |
11080 class="cmtt-8"> codebook</span><span | |
11081 class="cmtt-8"> number</span><span | |
11082 class="cmtt-8"> [vqbook]</span><span | |
11083 class="cmtt-8"> in</span><span | |
11084 class="cmtt-8"> VQ</span><span | |
11085 class="cmtt-8"> context</span> | |
11086 <br class="fancyvrb" /><a | |
11087 id="x1-110104r44"></a><span | |
11088 class="cmr-6">44</span><span | |
11089 class="cmtt-8"> </span><span | |
11090 class="cmtt-8"> </span><span | |
11091 class="cmtt-8"> </span><span | |
11092 class="cmtt-8"> </span><span | |
11093 class="cmtt-8"> </span><span | |
11094 class="cmtt-8"> </span><span | |
11095 class="cmtt-8"> </span><span | |
11096 class="cmtt-8"> </span><span | |
11097 class="cmtt-8"> </span><span | |
11098 class="cmtt-8"> </span><span | |
11099 class="cmtt-8"> </span><span | |
11100 class="cmtt-8"> </span><span | |
11101 class="cmtt-8"> </span><span | |
11102 class="cmtt-8"> </span><span | |
11103 class="cmtt-8"> </span><span | |
11104 class="cmtt-8"> </span><span | |
11105 class="cmtt-8"> </span><span | |
11106 class="cmtt-8"> </span><span | |
11107 class="cmtt-8"> </span><span | |
11108 class="cmtt-8"> </span><span | |
11109 class="cmtt-8"> </span><span | |
11110 class="cmtt-8"> </span><span | |
11111 class="cmtt-8"> </span><span | |
11112 class="cmtt-8"> </span><span | |
11113 class="cmtt-8"> </span><span | |
11114 class="cmtt-8"> </span><span | |
11115 class="cmtt-8"> </span><span | |
11116 class="cmtt-8"> }</span> | |
11117 | |
11118 | |
11119 | |
11120 <br class="fancyvrb" /><a | |
11121 id="x1-110106r45"></a><span | |
11122 class="cmr-6">45</span><span | |
11123 class="cmtt-8"> </span><span | |
11124 class="cmtt-8"> </span><span | |
11125 class="cmtt-8"> </span><span | |
11126 class="cmtt-8"> </span><span | |
11127 class="cmtt-8"> </span><span | |
11128 class="cmtt-8"> </span><span | |
11129 class="cmtt-8"> </span><span | |
11130 class="cmtt-8"> </span><span | |
11131 class="cmtt-8"> </span><span | |
11132 class="cmtt-8"> </span><span | |
11133 class="cmtt-8"> </span><span | |
11134 class="cmtt-8"> </span><span | |
11135 class="cmtt-8"> </span><span | |
11136 class="cmtt-8"> </span><span | |
11137 class="cmtt-8"> </span><span | |
11138 class="cmtt-8"> </span><span | |
11139 class="cmtt-8"> </span><span | |
11140 class="cmtt-8"> </span><span | |
11141 class="cmtt-8"> </span><span | |
11142 class="cmtt-8"> </span><span | |
11143 class="cmtt-8"> </span><span | |
11144 class="cmtt-8"> </span><span | |
11145 class="cmtt-8"> }</span> | |
11146 <br class="fancyvrb" /><a | |
11147 id="x1-110108r46"></a><span | |
11148 class="cmr-6">46</span><span | |
11149 class="cmtt-8"> </span><span | |
11150 class="cmtt-8"> </span> | |
11151 <br class="fancyvrb" /><a | |
11152 id="x1-110110r47"></a><span | |
11153 class="cmr-6">47</span><span | |
11154 class="cmtt-8"> </span><span | |
11155 class="cmtt-8"> </span><span | |
11156 class="cmtt-8"> </span><span | |
11157 class="cmtt-8"> </span><span | |
11158 class="cmtt-8"> </span><span | |
11159 class="cmtt-8"> </span><span | |
11160 class="cmtt-8"> </span><span | |
11161 class="cmtt-8"> </span><span | |
11162 class="cmtt-8"> </span><span | |
11163 class="cmtt-8"> </span><span | |
11164 class="cmtt-8"> </span><span | |
11165 class="cmtt-8"> </span><span | |
11166 class="cmtt-8"> </span><span | |
11167 class="cmtt-8"> </span><span | |
11168 class="cmtt-8"> </span><span | |
11169 class="cmtt-8"> </span><span | |
11170 class="cmtt-8"> </span><span | |
11171 class="cmtt-8"> </span><span | |
11172 class="cmtt-8"> 20)</span><span | |
11173 class="cmtt-8"> increment</span><span | |
11174 class="cmtt-8"> [partition\_count]</span><span | |
11175 class="cmtt-8"> by</span><span | |
11176 class="cmtt-8"> one</span> | |
11177 <br class="fancyvrb" /><a | |
11178 id="x1-110112r48"></a><span | |
11179 class="cmr-6">48</span><span | |
11180 class="cmtt-8"> </span><span | |
11181 class="cmtt-8"> </span> | |
11182 <br class="fancyvrb" /><a | |
11183 id="x1-110114r49"></a><span | |
11184 class="cmr-6">49</span><span | |
11185 class="cmtt-8"> </span><span | |
11186 class="cmtt-8"> </span><span | |
11187 class="cmtt-8"> </span><span | |
11188 class="cmtt-8"> </span><span | |
11189 class="cmtt-8"> </span><span | |
11190 class="cmtt-8"> </span><span | |
11191 class="cmtt-8"> </span><span | |
11192 class="cmtt-8"> </span><span | |
11193 class="cmtt-8"> </span><span | |
11194 class="cmtt-8"> </span><span | |
11195 class="cmtt-8"> </span><span | |
11196 class="cmtt-8"> </span><span | |
11197 class="cmtt-8"> </span><span | |
11198 class="cmtt-8"> </span><span | |
11199 class="cmtt-8"> </span><span | |
11200 class="cmtt-8"> </span><span | |
11201 class="cmtt-8"> }</span> | |
11202 <br class="fancyvrb" /><a | |
11203 id="x1-110116r50"></a><span | |
11204 class="cmr-6">50</span><span | |
11205 class="cmtt-8"> </span><span | |
11206 class="cmtt-8"> </span><span | |
11207 class="cmtt-8"> </span><span | |
11208 class="cmtt-8"> </span><span | |
11209 class="cmtt-8"> </span><span | |
11210 class="cmtt-8"> </span><span | |
11211 class="cmtt-8"> </span><span | |
11212 class="cmtt-8"> </span><span | |
11213 class="cmtt-8"> </span><span | |
11214 class="cmtt-8"> </span><span | |
11215 class="cmtt-8"> </span><span | |
11216 class="cmtt-8"> }</span> | |
11217 <br class="fancyvrb" /><a | |
11218 id="x1-110118r51"></a><span | |
11219 class="cmr-6">51</span><span | |
11220 class="cmtt-8"> </span><span | |
11221 class="cmtt-8"> </span><span | |
11222 class="cmtt-8"> </span><span | |
11223 class="cmtt-8"> </span><span | |
11224 class="cmtt-8"> </span><span | |
11225 class="cmtt-8"> </span><span | |
11226 class="cmtt-8"> }</span> | |
11227 <br class="fancyvrb" /><a | |
11228 id="x1-110120r52"></a><span | |
11229 class="cmr-6">52</span><span | |
11230 class="cmtt-8"> </span><span | |
11231 class="cmtt-8"> </span> | |
11232 <br class="fancyvrb" /><a | |
11233 id="x1-110122r53"></a><span | |
11234 class="cmr-6">53</span><span | |
11235 class="cmtt-8"> </span><span | |
11236 class="cmtt-8"> </span><span | |
11237 class="cmtt-8"> 21)</span><span | |
11238 class="cmtt-8"> done</span> | |
11239 <br class="fancyvrb" /><a | |
11240 id="x1-110124r54"></a><span | |
11241 class="cmr-6">54</span><span | |
11242 class="cmtt-8"> </span><span | |
11243 class="cmtt-8"> </span> | |
11244 </div> | |
11245 <!--l. 344--><p class="noindent" >An end-of-packet condition during packet decode is to be considered a nominal occurrence. | |
11246 Decode returns the result of vector decode up to that point. | |
11247 <!--l. 350--><p class="noindent" > | |
11248 <h5 class="subsubsectionHead"><span class="titlemark">8.6.3. </span> <a | |
11249 id="x1-1110008.6.3"></a>format 0 specifics</h5> | |
11250 <!--l. 352--><p class="noindent" >Format zero decodes partitions exactly as described earlier in the ’Residue Format: residue 0’ | |
11251 section. The following pseudocode presents the same algorithm. Assume: | |
11252 <ul class="itemize1"> | |
11253 <li class="itemize"><span | |
11254 class="cmtt-12">[n] </span>is the value in <span | |
11255 class="cmtt-12">[residue_partition_size]</span> | |
11256 </li> | |
11257 <li class="itemize"><span | |
11258 class="cmtt-12">[v] </span>is the residue vector | |
11259 </li> | |
11260 <li class="itemize"><span | |
11261 class="cmtt-12">[offset] </span>is the beginning read offset in [v]</li></ul> | |
11262 <!--l. 363--><p class="noindent" > | |
11263 <div class="fancyvrb" id="fancyvrb41"> | |
11264 <a | |
11265 id="x1-111002r1"></a><span | |
11266 class="cmr-6">1</span><span | |
11267 class="cmtt-8"> </span><span | |
11268 class="cmtt-8"> </span><span | |
11269 class="cmtt-8"> 1)</span><span | |
11270 class="cmtt-8"> [step]</span><span | |
11271 class="cmtt-8"> =</span><span | |
11272 class="cmtt-8"> [n]</span><span | |
11273 class="cmtt-8"> /</span><span | |
11274 class="cmtt-8"> [codebook\_dimensions]</span> | |
11275 <br class="fancyvrb" /><a | |
11276 id="x1-111004r2"></a><span | |
11277 class="cmr-6">2</span><span | |
11278 class="cmtt-8"> </span><span | |
11279 class="cmtt-8"> </span><span | |
11280 class="cmtt-8"> 2)</span><span | |
11281 class="cmtt-8"> iterate</span><span | |
11282 class="cmtt-8"> [i]</span><span | |
11283 class="cmtt-8"> over</span><span | |
11284 class="cmtt-8"> the</span><span | |
11285 class="cmtt-8"> range</span><span | |
11286 class="cmtt-8"> 0</span><span | |
11287 class="cmtt-8"> ...</span><span | |
11288 class="cmtt-8"> [step]-1</span><span | |
11289 class="cmtt-8"> {</span> | |
11290 <br class="fancyvrb" /><a | |
11291 id="x1-111006r3"></a><span | |
11292 class="cmr-6">3</span><span | |
11293 class="cmtt-8"> </span><span | |
11294 class="cmtt-8"> </span> | |
11295 <br class="fancyvrb" /><a | |
11296 id="x1-111008r4"></a><span | |
11297 class="cmr-6">4</span><span | |
11298 class="cmtt-8"> </span><span | |
11299 class="cmtt-8"> </span><span | |
11300 class="cmtt-8"> </span><span | |
11301 class="cmtt-8"> </span><span | |
11302 class="cmtt-8"> </span><span | |
11303 class="cmtt-8"> </span><span | |
11304 class="cmtt-8"> </span><span | |
11305 class="cmtt-8"> 3)</span><span | |
11306 class="cmtt-8"> vector</span><span | |
11307 class="cmtt-8"> [entry\_temp]</span><span | |
11308 class="cmtt-8"> =</span><span | |
11309 class="cmtt-8"> read</span><span | |
11310 class="cmtt-8"> vector</span><span | |
11311 class="cmtt-8"> from</span><span | |
11312 class="cmtt-8"> packet</span><span | |
11313 class="cmtt-8"> using</span><span | |
11314 class="cmtt-8"> current</span><span | |
11315 class="cmtt-8"> codebook</span><span | |
11316 class="cmtt-8"> in</span><span | |
11317 class="cmtt-8"> VQ</span><span | |
11318 class="cmtt-8"> context</span> | |
11319 <br class="fancyvrb" /><a | |
11320 id="x1-111010r5"></a><span | |
11321 class="cmr-6">5</span><span | |
11322 class="cmtt-8"> </span><span | |
11323 class="cmtt-8"> </span><span | |
11324 class="cmtt-8"> </span><span | |
11325 class="cmtt-8"> </span><span | |
11326 class="cmtt-8"> </span><span | |
11327 class="cmtt-8"> </span><span | |
11328 class="cmtt-8"> </span><span | |
11329 class="cmtt-8"> 4)</span><span | |
11330 class="cmtt-8"> iterate</span><span | |
11331 class="cmtt-8"> [j]</span><span | |
11332 class="cmtt-8"> over</span><span | |
11333 class="cmtt-8"> the</span><span | |
11334 class="cmtt-8"> range</span><span | |
11335 class="cmtt-8"> 0</span><span | |
11336 class="cmtt-8"> ...</span><span | |
11337 class="cmtt-8"> [codebook\_dimensions]-1</span><span | |
11338 class="cmtt-8"> {</span> | |
11339 <br class="fancyvrb" /><a | |
11340 id="x1-111012r6"></a><span | |
11341 class="cmr-6">6</span><span | |
11342 class="cmtt-8"> </span><span | |
11343 class="cmtt-8"> </span> | |
11344 <br class="fancyvrb" /><a | |
11345 id="x1-111014r7"></a><span | |
11346 class="cmr-6">7</span><span | |
11347 class="cmtt-8"> </span><span | |
11348 class="cmtt-8"> </span><span | |
11349 class="cmtt-8"> </span><span | |
11350 class="cmtt-8"> </span><span | |
11351 class="cmtt-8"> </span><span | |
11352 class="cmtt-8"> </span><span | |
11353 class="cmtt-8"> </span><span | |
11354 class="cmtt-8"> </span><span | |
11355 class="cmtt-8"> </span><span | |
11356 class="cmtt-8"> </span><span | |
11357 class="cmtt-8"> </span><span | |
11358 class="cmtt-8"> </span><span | |
11359 class="cmtt-8"> 5)</span><span | |
11360 class="cmtt-8"> vector</span><span | |
11361 class="cmtt-8"> [v]</span><span | |
11362 class="cmtt-8"> element</span><span | |
11363 class="cmtt-8"> ([offset]+[i]+[j]*[step])</span><span | |
11364 class="cmtt-8"> =</span> | |
11365 <br class="fancyvrb" /><a | |
11366 id="x1-111016r8"></a><span | |
11367 class="cmr-6">8</span><span | |
11368 class="cmtt-8"> </span><span | |
11369 class="cmtt-8">  </span><span | |
11370 class="cmtt-8"> </span><span | |
11371 class="cmtt-8"> </span><span | |
11372 class="cmtt-8"> </span><span | |
11373 class="cmtt-8"> </span><span | |
11374 class="cmtt-8"> </span><span | |
11375 class="cmtt-8"> </span><span | |
11376 class="cmtt-8"> </span><span | |
11377 class="cmtt-8"> vector</span><span | |
11378 class="cmtt-8"> [v]</span><span | |
11379 class="cmtt-8"> element</span><span | |
11380 class="cmtt-8"> ([offset]+[i]+[j]*[step])</span><span | |
11381 class="cmtt-8"> +</span> | |
11382 <br class="fancyvrb" /><a | |
11383 id="x1-111018r9"></a><span | |
11384 class="cmr-6">9</span><span | |
11385 class="cmtt-8"> </span><span | |
11386 class="cmtt-8"> </span><span | |
11387 class="cmtt-8"> </span><span | |
11388 class="cmtt-8"> </span><span | |
11389 class="cmtt-8"> </span><span | |
11390 class="cmtt-8"> </span><span | |
11391 class="cmtt-8"> </span><span | |
11392 class="cmtt-8"> </span><span | |
11393 class="cmtt-8"> </span><span | |
11394 class="cmtt-8"> </span><span | |
11395 class="cmtt-8"> </span><span | |
11396 class="cmtt-8"> </span><span | |
11397 class="cmtt-8"> </span><span | |
11398 class="cmtt-8"> </span><span | |
11399 class="cmtt-8"> </span><span | |
11400 class="cmtt-8"> </span><span | |
11401 class="cmtt-8"> </span><span | |
11402 class="cmtt-8"> vector</span><span | |
11403 class="cmtt-8"> [entry\_temp]</span><span | |
11404 class="cmtt-8"> element</span><span | |
11405 class="cmtt-8"> [j]</span> | |
11406 <br class="fancyvrb" /><a | |
11407 id="x1-111020r10"></a><span | |
11408 class="cmr-6">10</span><span | |
11409 class="cmtt-8"> </span><span | |
11410 class="cmtt-8"> </span> | |
11411 <br class="fancyvrb" /><a | |
11412 id="x1-111022r11"></a><span | |
11413 class="cmr-6">11</span><span | |
11414 class="cmtt-8"> </span><span | |
11415 class="cmtt-8"> </span><span | |
11416 class="cmtt-8"> </span><span | |
11417 class="cmtt-8"> </span><span | |
11418 class="cmtt-8"> </span><span | |
11419 class="cmtt-8"> </span><span | |
11420 class="cmtt-8"> </span><span | |
11421 class="cmtt-8"> </span><span | |
11422 class="cmtt-8"> </span><span | |
11423 class="cmtt-8"> </span><span | |
11424 class="cmtt-8"> }</span> | |
11425 <br class="fancyvrb" /><a | |
11426 id="x1-111024r12"></a><span | |
11427 class="cmr-6">12</span><span | |
11428 class="cmtt-8"> </span><span | |
11429 class="cmtt-8"> </span> | |
11430 <br class="fancyvrb" /><a | |
11431 id="x1-111026r13"></a><span | |
11432 class="cmr-6">13</span><span | |
11433 class="cmtt-8"> </span><span | |
11434 class="cmtt-8"> </span><span | |
11435 class="cmtt-8"> </span><span | |
11436 class="cmtt-8"> </span><span | |
11437 class="cmtt-8"> </span><span | |
11438 class="cmtt-8"> }</span> | |
11439 <br class="fancyvrb" /><a | |
11440 id="x1-111028r14"></a><span | |
11441 class="cmr-6">14</span><span | |
11442 class="cmtt-8"> </span><span | |
11443 class="cmtt-8"> </span> | |
11444 <br class="fancyvrb" /><a | |
11445 id="x1-111030r15"></a><span | |
11446 class="cmr-6">15</span><span | |
11447 class="cmtt-8"> </span><span | |
11448 class="cmtt-8"> </span><span | |
11449 class="cmtt-8"> </span><span | |
11450 class="cmtt-8"> 6)</span><span | |
11451 class="cmtt-8"> done</span> | |
11452 <br class="fancyvrb" /><a | |
11453 id="x1-111032r16"></a><span | |
11454 class="cmr-6">16</span><span | |
11455 class="cmtt-8"> </span><span | |
11456 class="cmtt-8"> </span> | |
11457 | |
11458 | |
11459 | |
11460 </div> | |
11461 <!--l. 384--><p class="noindent" > | |
11462 <h5 class="subsubsectionHead"><span class="titlemark">8.6.4. </span> <a | |
11463 id="x1-1120008.6.4"></a>format 1 specifics</h5> | |
11464 <!--l. 386--><p class="noindent" >Format 1 decodes partitions exactly as described earlier in the ’Residue Format: residue 1’ | |
11465 section. The following pseudocode presents the same algorithm. Assume: | |
11466 <ul class="itemize1"> | |
11467 <li class="itemize"><span | |
11468 class="cmtt-12">[n] </span>is the value in <span | |
11469 class="cmtt-12">[residue_partition_size]</span> | |
11470 </li> | |
11471 <li class="itemize"><span | |
11472 class="cmtt-12">[v] </span>is the residue vector | |
11473 </li> | |
11474 <li class="itemize"><span | |
11475 class="cmtt-12">[offset] </span>is the beginning read offset in [v]</li></ul> | |
11476 <!--l. 398--><p class="noindent" > | |
11477 <div class="fancyvrb" id="fancyvrb42"> | |
11478 <a | |
11479 id="x1-112002r1"></a><span | |
11480 class="cmr-6">1</span><span | |
11481 class="cmtt-8"> </span><span | |
11482 class="cmtt-8"> </span><span | |
11483 class="cmtt-8"> 1)</span><span | |
11484 class="cmtt-8"> [i]</span><span | |
11485 class="cmtt-8"> =</span><span | |
11486 class="cmtt-8"> 0</span> | |
11487 <br class="fancyvrb" /><a | |
11488 id="x1-112004r2"></a><span | |
11489 class="cmr-6">2</span><span | |
11490 class="cmtt-8"> </span><span | |
11491 class="cmtt-8"> </span><span | |
11492 class="cmtt-8"> 2)</span><span | |
11493 class="cmtt-8"> vector</span><span | |
11494 class="cmtt-8"> [entry\_temp]</span><span | |
11495 class="cmtt-8"> =</span><span | |
11496 class="cmtt-8"> read</span><span | |
11497 class="cmtt-8"> vector</span><span | |
11498 class="cmtt-8"> from</span><span | |
11499 class="cmtt-8"> packet</span><span | |
11500 class="cmtt-8"> using</span><span | |
11501 class="cmtt-8"> current</span><span | |
11502 class="cmtt-8"> codebook</span><span | |
11503 class="cmtt-8"> in</span><span | |
11504 class="cmtt-8"> VQ</span><span | |
11505 class="cmtt-8"> context</span> | |
11506 <br class="fancyvrb" /><a | |
11507 id="x1-112006r3"></a><span | |
11508 class="cmr-6">3</span><span | |
11509 class="cmtt-8"> </span><span | |
11510 class="cmtt-8"> </span><span | |
11511 class="cmtt-8"> 3)</span><span | |
11512 class="cmtt-8"> iterate</span><span | |
11513 class="cmtt-8"> [j]</span><span | |
11514 class="cmtt-8"> over</span><span | |
11515 class="cmtt-8"> the</span><span | |
11516 class="cmtt-8"> range</span><span | |
11517 class="cmtt-8"> 0</span><span | |
11518 class="cmtt-8"> ...</span><span | |
11519 class="cmtt-8"> [codebook\_dimensions]-1</span><span | |
11520 class="cmtt-8"> {</span> | |
11521 <br class="fancyvrb" /><a | |
11522 id="x1-112008r4"></a><span | |
11523 class="cmr-6">4</span><span | |
11524 class="cmtt-8"> </span><span | |
11525 class="cmtt-8"> </span> | |
11526 <br class="fancyvrb" /><a | |
11527 id="x1-112010r5"></a><span | |
11528 class="cmr-6">5</span><span | |
11529 class="cmtt-8"> </span><span | |
11530 class="cmtt-8"> </span><span | |
11531 class="cmtt-8"> </span><span | |
11532 class="cmtt-8"> </span><span | |
11533 class="cmtt-8"> </span><span | |
11534 class="cmtt-8"> </span><span | |
11535 class="cmtt-8"> </span><span | |
11536 class="cmtt-8"> 4)</span><span | |
11537 class="cmtt-8"> vector</span><span | |
11538 class="cmtt-8"> [v]</span><span | |
11539 class="cmtt-8"> element</span><span | |
11540 class="cmtt-8"> ([offset]+[i])</span><span | |
11541 class="cmtt-8"> =</span> | |
11542 <br class="fancyvrb" /><a | |
11543 id="x1-112012r6"></a><span | |
11544 class="cmr-6">6</span><span | |
11545 class="cmtt-8"> </span><span | |
11546 class="cmtt-8">  </span><span | |
11547 class="cmtt-8"> </span><span | |
11548 class="cmtt-8"> vector</span><span | |
11549 class="cmtt-8"> [v]</span><span | |
11550 class="cmtt-8"> element</span><span | |
11551 class="cmtt-8"> ([offset]+[i])</span><span | |
11552 class="cmtt-8"> +</span> | |
11553 <br class="fancyvrb" /><a | |
11554 id="x1-112014r7"></a><span | |
11555 class="cmr-6">7</span><span | |
11556 class="cmtt-8"> </span><span | |
11557 class="cmtt-8"> </span><span | |
11558 class="cmtt-8"> </span><span | |
11559 class="cmtt-8"> </span><span | |
11560 class="cmtt-8"> </span><span | |
11561 class="cmtt-8"> </span><span | |
11562 class="cmtt-8"> </span><span | |
11563 class="cmtt-8"> </span><span | |
11564 class="cmtt-8"> </span><span | |
11565 class="cmtt-8"> </span><span | |
11566 class="cmtt-8"> </span><span | |
11567 class="cmtt-8"> vector</span><span | |
11568 class="cmtt-8"> [entry\_temp]</span><span | |
11569 class="cmtt-8"> element</span><span | |
11570 class="cmtt-8"> [j]</span> | |
11571 <br class="fancyvrb" /><a | |
11572 id="x1-112016r8"></a><span | |
11573 class="cmr-6">8</span><span | |
11574 class="cmtt-8"> </span><span | |
11575 class="cmtt-8"> </span><span | |
11576 class="cmtt-8"> </span><span | |
11577 class="cmtt-8"> </span><span | |
11578 class="cmtt-8"> </span><span | |
11579 class="cmtt-8"> </span><span | |
11580 class="cmtt-8"> </span><span | |
11581 class="cmtt-8"> 5)</span><span | |
11582 class="cmtt-8"> increment</span><span | |
11583 class="cmtt-8"> [i]</span> | |
11584 <br class="fancyvrb" /><a | |
11585 id="x1-112018r9"></a><span | |
11586 class="cmr-6">9</span><span | |
11587 class="cmtt-8"> </span><span | |
11588 class="cmtt-8"> </span> | |
11589 <br class="fancyvrb" /><a | |
11590 id="x1-112020r10"></a><span | |
11591 class="cmr-6">10</span><span | |
11592 class="cmtt-8"> </span><span | |
11593 class="cmtt-8"> </span><span | |
11594 class="cmtt-8"> </span><span | |
11595 class="cmtt-8"> </span><span | |
11596 class="cmtt-8"> </span><span | |
11597 class="cmtt-8"> }</span> | |
11598 <br class="fancyvrb" /><a | |
11599 id="x1-112022r11"></a><span | |
11600 class="cmr-6">11</span><span | |
11601 class="cmtt-8"> </span><span | |
11602 class="cmtt-8"> </span> | |
11603 <br class="fancyvrb" /><a | |
11604 id="x1-112024r12"></a><span | |
11605 class="cmr-6">12</span><span | |
11606 class="cmtt-8"> </span><span | |
11607 class="cmtt-8"> </span><span | |
11608 class="cmtt-8"> </span><span | |
11609 class="cmtt-8"> 6)</span><span | |
11610 class="cmtt-8"> if</span><span | |
11611 class="cmtt-8"> (</span><span | |
11612 class="cmtt-8"> [i]</span><span | |
11613 class="cmtt-8"> is</span><span | |
11614 class="cmtt-8"> less</span><span | |
11615 class="cmtt-8"> than</span><span | |
11616 class="cmtt-8"> [n]</span><span | |
11617 class="cmtt-8"> )</span><span | |
11618 class="cmtt-8"> continue</span><span | |
11619 class="cmtt-8"> at</span><span | |
11620 class="cmtt-8"> step</span><span | |
11621 class="cmtt-8"> 2</span> | |
11622 <br class="fancyvrb" /><a | |
11623 id="x1-112026r13"></a><span | |
11624 class="cmr-6">13</span><span | |
11625 class="cmtt-8"> </span><span | |
11626 class="cmtt-8"> </span><span | |
11627 class="cmtt-8"> </span><span | |
11628 class="cmtt-8"> 7)</span><span | |
11629 class="cmtt-8"> done</span> | |
11630 </div> | |
11631 <!--l. 416--><p class="noindent" > | |
11632 <h5 class="subsubsectionHead"><span class="titlemark">8.6.5. </span> <a | |
11633 id="x1-1130008.6.5"></a>format 2 specifics</h5> | |
11634 <!--l. 418--><p class="noindent" >Format 2 is reducible to format 1. It may be implemented as an additional step prior to and an | |
11635 additional post-decode step after a normal format 1 decode. | |
11636 | |
11637 | |
11638 | |
11639 <!--l. 421--><p class="noindent" >Format 2 handles ’do not decode’ vectors differently than residue 0 or 1; if all vectors are marked | |
11640 ’do not decode’, no decode occurrs. However, if at least one vector is to be decoded, all | |
11641 the vectors are decoded. We then request normal format 1 to decode a single vector | |
11642 representing all output channels, rather than a vector for each channel. After decode, | |
11643 deinterleave the vector into independent vectors, one for each output channel. That | |
11644 is: | |
11645 <!--l. 429--><p class="noindent" > | |
11646 <dl class="enumerate-enumitem"><dt class="enumerate-enumitem"> | |
11647 1. </dt><dd | |
11648 class="enumerate-enumitem">If all vectors 0 through <span | |
11649 class="cmti-12">ch</span>-1 are marked ’do not decode’, allocate and clear a single | |
11650 vector <span | |
11651 class="cmtt-12">[v]</span>of length <span | |
11652 class="cmti-12">ch*n </span>and skip step 2 below; proceed directly to the post-decode | |
11653 step. | |
11654 </dd><dt class="enumerate-enumitem"> | |
11655 2. </dt><dd | |
11656 class="enumerate-enumitem">Rather than performing format 1 decode to produce <span | |
11657 class="cmti-12">ch </span>vectors of length <span | |
11658 class="cmti-12">n </span>each, call | |
11659 format 1 decode to produce a single vector <span | |
11660 class="cmtt-12">[v] </span>of length <span | |
11661 class="cmti-12">ch*n</span>. | |
11662 </dd><dt class="enumerate-enumitem"> | |
11663 3. </dt><dd | |
11664 class="enumerate-enumitem">Post decode: Deinterleave the single vector <span | |
11665 class="cmtt-12">[v] </span>returned by format 1 decode as | |
11666 described above into <span | |
11667 class="cmti-12">ch </span>independent vectors, one for each outputchannel, according | |
11668 to: | |
11669 <div class="fancyvrb" id="fancyvrb43"> | |
11670 <a | |
11671 id="x1-113005r1"></a><span | |
11672 class="cmr-6">1</span><span | |
11673 class="cmtt-8"> </span><span | |
11674 class="cmtt-8"> </span><span | |
11675 class="cmtt-8"> </span><span | |
11676 class="cmtt-8"> 1)</span><span | |
11677 class="cmtt-8"> iterate</span><span | |
11678 class="cmtt-8"> [i]</span><span | |
11679 class="cmtt-8"> over</span><span | |
11680 class="cmtt-8"> the</span><span | |
11681 class="cmtt-8"> range</span><span | |
11682 class="cmtt-8"> 0</span><span | |
11683 class="cmtt-8"> ...</span><span | |
11684 class="cmtt-8"> [n]-1</span><span | |
11685 class="cmtt-8"> {</span> | |
11686 <br class="fancyvrb" /><a | |
11687 id="x1-113007r2"></a><span | |
11688 class="cmr-6">2</span><span | |
11689 class="cmtt-8"> </span><span | |
11690 class="cmtt-8"> </span> | |
11691 <br class="fancyvrb" /><a | |
11692 id="x1-113009r3"></a><span | |
11693 class="cmr-6">3</span><span | |
11694 class="cmtt-8"> </span><span | |
11695 class="cmtt-8"> </span><span | |
11696 class="cmtt-8"> </span><span | |
11697 class="cmtt-8"> </span><span | |
11698 class="cmtt-8"> </span><span | |
11699 class="cmtt-8"> </span><span | |
11700 class="cmtt-8"> </span><span | |
11701 class="cmtt-8"> </span><span | |
11702 class="cmtt-8"> 2)</span><span | |
11703 class="cmtt-8"> iterate</span><span | |
11704 class="cmtt-8"> [j]</span><span | |
11705 class="cmtt-8"> over</span><span | |
11706 class="cmtt-8"> the</span><span | |
11707 class="cmtt-8"> range</span><span | |
11708 class="cmtt-8"> 0</span><span | |
11709 class="cmtt-8"> ...</span><span | |
11710 class="cmtt-8"> [ch]-1</span><span | |
11711 class="cmtt-8"> {</span> | |
11712 <br class="fancyvrb" /><a | |
11713 id="x1-113011r4"></a><span | |
11714 class="cmr-6">4</span><span | |
11715 class="cmtt-8"> </span><span | |
11716 class="cmtt-8"> </span> | |
11717 <br class="fancyvrb" /><a | |
11718 id="x1-113013r5"></a><span | |
11719 class="cmr-6">5</span><span | |
11720 class="cmtt-8"> </span><span | |
11721 class="cmtt-8"> </span><span | |
11722 class="cmtt-8"> </span><span | |
11723 class="cmtt-8"> </span><span | |
11724 class="cmtt-8"> </span><span | |
11725 class="cmtt-8"> </span><span | |
11726 class="cmtt-8"> </span><span | |
11727 class="cmtt-8"> </span><span | |
11728 class="cmtt-8"> </span><span | |
11729 class="cmtt-8"> </span><span | |
11730 class="cmtt-8"> </span><span | |
11731 class="cmtt-8"> </span><span | |
11732 class="cmtt-8"> </span><span | |
11733 class="cmtt-8"> 3)</span><span | |
11734 class="cmtt-8"> output</span><span | |
11735 class="cmtt-8"> vector</span><span | |
11736 class="cmtt-8"> number</span><span | |
11737 class="cmtt-8"> [j]</span><span | |
11738 class="cmtt-8"> element</span><span | |
11739 class="cmtt-8"> [i]</span><span | |
11740 class="cmtt-8"> =</span><span | |
11741 class="cmtt-8"> vector</span><span | |
11742 class="cmtt-8"> [v]</span><span | |
11743 class="cmtt-8"> element</span><span | |
11744 class="cmtt-8"> ([i]</span><span | |
11745 class="cmtt-8"> *</span><span | |
11746 class="cmtt-8"> [ch]</span><span | |
11747 class="cmtt-8"> +</span><span | |
11748 class="cmtt-8"> [j])</span> | |
11749 <br class="fancyvrb" /><a | |
11750 id="x1-113015r6"></a><span | |
11751 class="cmr-6">6</span><span | |
11752 class="cmtt-8"> </span><span | |
11753 class="cmtt-8"> </span> | |
11754 <br class="fancyvrb" /><a | |
11755 id="x1-113017r7"></a><span | |
11756 class="cmr-6">7</span><span | |
11757 class="cmtt-8"> </span><span | |
11758 class="cmtt-8"> </span><span | |
11759 class="cmtt-8"> </span><span | |
11760 class="cmtt-8"> </span><span | |
11761 class="cmtt-8"> </span><span | |
11762 class="cmtt-8"> </span><span | |
11763 class="cmtt-8"> </span><span | |
11764 class="cmtt-8"> </span><span | |
11765 class="cmtt-8"> </span><span | |
11766 class="cmtt-8"> </span><span | |
11767 class="cmtt-8"> </span><span | |
11768 class="cmtt-8"> }</span> | |
11769 <br class="fancyvrb" /><a | |
11770 id="x1-113019r8"></a><span | |
11771 class="cmr-6">8</span><span | |
11772 class="cmtt-8"> </span><span | |
11773 class="cmtt-8"> </span><span | |
11774 class="cmtt-8"> </span><span | |
11775 class="cmtt-8"> </span><span | |
11776 class="cmtt-8"> </span><span | |
11777 class="cmtt-8"> </span><span | |
11778 class="cmtt-8"> }</span> | |
11779 <br class="fancyvrb" /><a | |
11780 id="x1-113021r9"></a><span | |
11781 class="cmr-6">9</span><span | |
11782 class="cmtt-8"> </span><span | |
11783 class="cmtt-8"> </span> | |
11784 <br class="fancyvrb" /><a | |
11785 id="x1-113023r10"></a><span | |
11786 class="cmr-6">10</span><span | |
11787 class="cmtt-8"> </span><span | |
11788 class="cmtt-8"> </span><span | |
11789 class="cmtt-8"> </span><span | |
11790 class="cmtt-8"> 4)</span><span | |
11791 class="cmtt-8"> done</span> | |
11792 </div> | |
11793 </dd></dl> | |
11794 | |
11795 | |
11796 | |
11797 | |
11798 | |
11799 | |
11800 <h3 class="sectionHead"><span class="titlemark">9. </span> <a | |
11801 id="x1-1140009"></a>Helper equations</h3> | |
11802 <!--l. 6--><p class="noindent" > | |
11803 <h4 class="subsectionHead"><span class="titlemark">9.1. </span> <a | |
11804 id="x1-1150009.1"></a>Overview</h4> | |
11805 <!--l. 8--><p class="noindent" >The equations below are used in multiple places by the Vorbis codec specification. Rather than | |
11806 cluttering up the main specification documents, they are defined here and referenced where | |
11807 appropriate. | |
11808 <!--l. 13--><p class="noindent" > | |
11809 <h4 class="subsectionHead"><span class="titlemark">9.2. </span> <a | |
11810 id="x1-1160009.2"></a>Functions</h4> | |
11811 <!--l. 15--><p class="noindent" > | |
11812 <h5 class="subsubsectionHead"><span class="titlemark">9.2.1. </span> <a | |
11813 id="x1-1170009.2.1"></a>ilog</h5> | |
11814 <!--l. 17--><p class="noindent" >The ”ilog(x)” function returns the position number (1 through n) of the highest set bit in the | |
11815 two’s complement integer value <span | |
11816 class="cmtt-12">[x]</span>. Values of <span | |
11817 class="cmtt-12">[x] </span>less than zero are defined to return | |
11818 zero. | |
11819 <!--l. 20--><p class="noindent" > | |
11820 <div class="fancyvrb" id="fancyvrb44"> | |
11821 <a | |
11822 id="x1-117002r1"></a><span | |
11823 class="cmr-6">1</span><span | |
11824 class="cmtt-8"> </span><span | |
11825 class="cmtt-8"> </span><span | |
11826 class="cmtt-8"> </span><span | |
11827 class="cmtt-8"> 1)</span><span | |
11828 class="cmtt-8"> [return\_value]</span><span | |
11829 class="cmtt-8"> =</span><span | |
11830 class="cmtt-8"> 0;</span> | |
11831 <br class="fancyvrb" /><a | |
11832 id="x1-117004r2"></a><span | |
11833 class="cmr-6">2</span><span | |
11834 class="cmtt-8"> </span><span | |
11835 class="cmtt-8"> </span><span | |
11836 class="cmtt-8"> </span><span | |
11837 class="cmtt-8"> 2)</span><span | |
11838 class="cmtt-8"> if</span><span | |
11839 class="cmtt-8"> (</span><span | |
11840 class="cmtt-8"> [x]</span><span | |
11841 class="cmtt-8"> is</span><span | |
11842 class="cmtt-8"> greater</span><span | |
11843 class="cmtt-8"> than</span><span | |
11844 class="cmtt-8"> zero</span><span | |
11845 class="cmtt-8"> )</span><span | |
11846 class="cmtt-8"> {</span> | |
11847 <br class="fancyvrb" /><a | |
11848 id="x1-117006r3"></a><span | |
11849 class="cmr-6">3</span><span | |
11850 class="cmtt-8"> </span><span | |
11851 class="cmtt-8"> </span> | |
11852 <br class="fancyvrb" /><a | |
11853 id="x1-117008r4"></a><span | |
11854 class="cmr-6">4</span><span | |
11855 class="cmtt-8"> </span><span | |
11856 class="cmtt-8"> </span><span | |
11857 class="cmtt-8"> </span><span | |
11858 class="cmtt-8"> </span><span | |
11859 class="cmtt-8"> </span><span | |
11860 class="cmtt-8"> </span><span | |
11861 class="cmtt-8"> </span><span | |
11862 class="cmtt-8"> </span><span | |
11863 class="cmtt-8"> 3)</span><span | |
11864 class="cmtt-8"> increment</span><span | |
11865 class="cmtt-8"> [return\_value];</span> | |
11866 <br class="fancyvrb" /><a | |
11867 id="x1-117010r5"></a><span | |
11868 class="cmr-6">5</span><span | |
11869 class="cmtt-8"> </span><span | |
11870 class="cmtt-8"> </span><span | |
11871 class="cmtt-8"> </span><span | |
11872 class="cmtt-8"> </span><span | |
11873 class="cmtt-8"> </span><span | |
11874 class="cmtt-8"> </span><span | |
11875 class="cmtt-8"> </span><span | |
11876 class="cmtt-8"> </span><span | |
11877 class="cmtt-8"> 4)</span><span | |
11878 class="cmtt-8"> logical</span><span | |
11879 class="cmtt-8"> shift</span><span | |
11880 class="cmtt-8"> [x]</span><span | |
11881 class="cmtt-8"> one</span><span | |
11882 class="cmtt-8"> bit</span><span | |
11883 class="cmtt-8"> to</span><span | |
11884 class="cmtt-8"> the</span><span | |
11885 class="cmtt-8"> right,</span><span | |
11886 class="cmtt-8"> padding</span><span | |
11887 class="cmtt-8"> the</span><span | |
11888 class="cmtt-8"> MSb</span><span | |
11889 class="cmtt-8"> with</span><span | |
11890 class="cmtt-8"> zero</span> | |
11891 <br class="fancyvrb" /><a | |
11892 id="x1-117012r6"></a><span | |
11893 class="cmr-6">6</span><span | |
11894 class="cmtt-8"> </span><span | |
11895 class="cmtt-8"> </span><span | |
11896 class="cmtt-8"> </span><span | |
11897 class="cmtt-8"> </span><span | |
11898 class="cmtt-8"> </span><span | |
11899 class="cmtt-8"> </span><span | |
11900 class="cmtt-8"> </span><span | |
11901 class="cmtt-8"> </span><span | |
11902 class="cmtt-8"> 5)</span><span | |
11903 class="cmtt-8"> repeat</span><span | |
11904 class="cmtt-8"> at</span><span | |
11905 class="cmtt-8"> step</span><span | |
11906 class="cmtt-8"> 2)</span> | |
11907 <br class="fancyvrb" /><a | |
11908 id="x1-117014r7"></a><span | |
11909 class="cmr-6">7</span><span | |
11910 class="cmtt-8"> </span><span | |
11911 class="cmtt-8"> </span> | |
11912 <br class="fancyvrb" /><a | |
11913 id="x1-117016r8"></a><span | |
11914 class="cmr-6">8</span><span | |
11915 class="cmtt-8"> </span><span | |
11916 class="cmtt-8"> </span><span | |
11917 class="cmtt-8"> </span><span | |
11918 class="cmtt-8"> </span><span | |
11919 class="cmtt-8"> </span><span | |
11920 class="cmtt-8"> </span><span | |
11921 class="cmtt-8"> }</span> | |
11922 <br class="fancyvrb" /><a | |
11923 id="x1-117018r9"></a><span | |
11924 class="cmr-6">9</span><span | |
11925 class="cmtt-8"> </span><span | |
11926 class="cmtt-8"> </span> | |
11927 <br class="fancyvrb" /><a | |
11928 id="x1-117020r10"></a><span | |
11929 class="cmr-6">10</span><span | |
11930 class="cmtt-8"> </span><span | |
11931 class="cmtt-8"> </span><span | |
11932 class="cmtt-8"> </span><span | |
11933 class="cmtt-8"> </span><span | |
11934 class="cmtt-8"> 6)</span><span | |
11935 class="cmtt-8"> done</span> | |
11936 </div> | |
11937 | |
11938 | |
11939 | |
11940 <!--l. 33--><p class="noindent" >Examples: | |
11941 <ul class="itemize1"> | |
11942 <li class="itemize">ilog(0) = 0; | |
11943 </li> | |
11944 <li class="itemize">ilog(1) = 1; | |
11945 </li> | |
11946 <li class="itemize">ilog(2) = 2; | |
11947 </li> | |
11948 <li class="itemize">ilog(3) = 2; | |
11949 </li> | |
11950 <li class="itemize">ilog(4) = 3; | |
11951 </li> | |
11952 <li class="itemize">ilog(7) = 3; | |
11953 </li> | |
11954 <li class="itemize">ilog(negative number) = 0;</li></ul> | |
11955 <!--l. 48--><p class="noindent" > | |
11956 <h5 class="subsubsectionHead"><span class="titlemark">9.2.2. </span> <a | |
11957 id="x1-1180009.2.2"></a>float32_unpack</h5> | |
11958 <!--l. 50--><p class="noindent" >”float32_unpack(x)” is intended to translate the packed binary representation of a Vorbis | |
11959 codebook float value into the representation used by the decoder for floating point numbers. For | |
11960 purposes of this example, we will unpack a Vorbis float32 into a host-native floating point | |
11961 number. | |
11962 <!--l. 56--><p class="noindent" > | |
11963 <div class="fancyvrb" id="fancyvrb45"> | |
11964 <a | |
11965 id="x1-118002r1"></a><span | |
11966 class="cmr-6">1</span><span | |
11967 class="cmtt-8"> </span><span | |
11968 class="cmtt-8"> </span><span | |
11969 class="cmtt-8"> </span><span | |
11970 class="cmtt-8"> 1)</span><span | |
11971 class="cmtt-8"> [mantissa]</span><span | |
11972 class="cmtt-8"> =</span><span | |
11973 class="cmtt-8"> [x]</span><span | |
11974 class="cmtt-8"> bitwise</span><span | |
11975 class="cmtt-8"> AND</span><span | |
11976 class="cmtt-8"> 0x1fffff</span><span | |
11977 class="cmtt-8"> (unsigned</span><span | |
11978 class="cmtt-8"> result)</span> | |
11979 <br class="fancyvrb" /><a | |
11980 id="x1-118004r2"></a><span | |
11981 class="cmr-6">2</span><span | |
11982 class="cmtt-8"> </span><span | |
11983 class="cmtt-8"> </span><span | |
11984 class="cmtt-8"> </span><span | |
11985 class="cmtt-8"> 2)</span><span | |
11986 class="cmtt-8"> [sign]</span><span | |
11987 class="cmtt-8"> =</span><span | |
11988 class="cmtt-8"> [x]</span><span | |
11989 class="cmtt-8"> bitwise</span><span | |
11990 class="cmtt-8"> AND</span><span | |
11991 class="cmtt-8"> 0x80000000</span><span | |
11992 class="cmtt-8"> (unsigned</span><span | |
11993 class="cmtt-8"> result)</span> | |
11994 <br class="fancyvrb" /><a | |
11995 id="x1-118006r3"></a><span | |
11996 class="cmr-6">3</span><span | |
11997 class="cmtt-8"> </span><span | |
11998 class="cmtt-8"> </span><span | |
11999 class="cmtt-8"> </span><span | |
12000 class="cmtt-8"> 3)</span><span | |
12001 class="cmtt-8"> [exponent]</span><span | |
12002 class="cmtt-8"> =</span><span | |
12003 class="cmtt-8"> (</span><span | |
12004 class="cmtt-8"> [x]</span><span | |
12005 class="cmtt-8"> bitwise</span><span | |
12006 class="cmtt-8"> AND</span><span | |
12007 class="cmtt-8"> 0x7fe00000)</span><span | |
12008 class="cmtt-8"> shifted</span><span | |
12009 class="cmtt-8"> right</span><span | |
12010 class="cmtt-8"> 21</span><span | |
12011 class="cmtt-8"> bits</span><span | |
12012 class="cmtt-8"> (unsigned</span><span | |
12013 class="cmtt-8"> result)</span> | |
12014 <br class="fancyvrb" /><a | |
12015 id="x1-118008r4"></a><span | |
12016 class="cmr-6">4</span><span | |
12017 class="cmtt-8"> </span><span | |
12018 class="cmtt-8"> </span><span | |
12019 class="cmtt-8"> </span><span | |
12020 class="cmtt-8"> 4)</span><span | |
12021 class="cmtt-8"> if</span><span | |
12022 class="cmtt-8"> (</span><span | |
12023 class="cmtt-8"> [sign]</span><span | |
12024 class="cmtt-8"> is</span><span | |
12025 class="cmtt-8"> nonzero</span><span | |
12026 class="cmtt-8"> )</span><span | |
12027 class="cmtt-8"> then</span><span | |
12028 class="cmtt-8"> negate</span><span | |
12029 class="cmtt-8"> [mantissa]</span> | |
12030 <br class="fancyvrb" /><a | |
12031 id="x1-118010r5"></a><span | |
12032 class="cmr-6">5</span><span | |
12033 class="cmtt-8"> </span><span | |
12034 class="cmtt-8"> </span><span | |
12035 class="cmtt-8"> </span><span | |
12036 class="cmtt-8"> 5)</span><span | |
12037 class="cmtt-8"> return</span><span | |
12038 class="cmtt-8"> [mantissa]</span><span | |
12039 class="cmtt-8"> *</span><span | |
12040 class="cmtt-8"> (</span><span | |
12041 class="cmtt-8"> 2</span><span | |
12042 class="cmtt-8"> ^</span><span | |
12043 class="cmtt-8"> (</span><span | |
12044 class="cmtt-8"> [exponent]</span><span | |
12045 class="cmtt-8"> -</span><span | |
12046 class="cmtt-8"> 788</span><span | |
12047 class="cmtt-8"> )</span><span | |
12048 class="cmtt-8"> )</span> | |
12049 </div> | |
12050 | |
12051 | |
12052 | |
12053 <!--l. 66--><p class="noindent" > | |
12054 <h5 class="subsubsectionHead"><span class="titlemark">9.2.3. </span> <a | |
12055 id="x1-1190009.2.3"></a>lookup1_values</h5> | |
12056 <!--l. 68--><p class="noindent" >”lookup1_values(codebook_entries,codebook_dimensions)” is used to compute the | |
12057 correct length of the value index for a codebook VQ lookup table of lookup type 1. | |
12058 The values on this list are permuted to construct the VQ vector lookup table of size | |
12059 <span | |
12060 class="cmtt-12">[codebook_entries]</span>. | |
12061 <!--l. 74--><p class="noindent" >The return value for this function is defined to be ’the greatest integer value for which | |
12062 <span | |
12063 class="cmtt-12">[return_value] </span>to the power of <span | |
12064 class="cmtt-12">[codebook_dimensions] </span>is less than or equal to | |
12065 <span | |
12066 class="cmtt-12">[codebook_entries]</span>’. | |
12067 <!--l. 81--><p class="noindent" > | |
12068 <h5 class="subsubsectionHead"><span class="titlemark">9.2.4. </span> <a | |
12069 id="x1-1200009.2.4"></a>low_neighbor</h5> | |
12070 <!--l. 83--><p class="noindent" >”low_neighbor(v,x)” finds the position <span | |
12071 class="cmtt-12">n </span>in vector <span | |
12072 class="cmtt-12">[v] </span>of the greatest value scalar element for | |
12073 which <span | |
12074 class="cmtt-12">n </span>is less than <span | |
12075 class="cmtt-12">[x] </span>and vector <span | |
12076 class="cmtt-12">[v] </span>element <span | |
12077 class="cmtt-12">n </span>is less than vector <span | |
12078 class="cmtt-12">[v] </span>element | |
12079 <span | |
12080 class="cmtt-12">[x]</span>. | |
12081 <!--l. 88--><p class="noindent" > | |
12082 <h5 class="subsubsectionHead"><span class="titlemark">9.2.5. </span> <a | |
12083 id="x1-1210009.2.5"></a>high_neighbor</h5> | |
12084 <!--l. 90--><p class="noindent" >”high_neighbor(v,x)” finds the position <span | |
12085 class="cmtt-12">n </span>in vector [v] of the lowest value scalar element for | |
12086 which <span | |
12087 class="cmtt-12">n </span>is less than <span | |
12088 class="cmtt-12">[x] </span>and vector <span | |
12089 class="cmtt-12">[v] </span>element <span | |
12090 class="cmtt-12">n </span>is greater than vector <span | |
12091 class="cmtt-12">[v] </span>element | |
12092 <span | |
12093 class="cmtt-12">[x]</span>. | |
12094 <!--l. 97--><p class="noindent" > | |
12095 <h5 class="subsubsectionHead"><span class="titlemark">9.2.6. </span> <a | |
12096 id="x1-1220009.2.6"></a>render_point</h5> | |
12097 <!--l. 99--><p class="noindent" >”render_point(x0,y0,x1,y1,X)” is used to find the Y value at point X along the line specified by | |
12098 x0, x1, y0 and y1. This function uses an integer algorithm to solve for the point directly without | |
12099 calculating intervening values along the line. | |
12100 | |
12101 | |
12102 | |
12103 <!--l. 104--><p class="noindent" > | |
12104 <div class="fancyvrb" id="fancyvrb46"> | |
12105 <a | |
12106 id="x1-122002r1"></a><span | |
12107 class="cmr-6">1</span><span | |
12108 class="cmtt-8"> </span><span | |
12109 class="cmtt-8"> </span><span | |
12110 class="cmtt-8"> </span><span | |
12111 class="cmtt-8"> 1)</span><span | |
12112 class="cmtt-8"> </span><span | |
12113 class="cmtt-8"> [dy]</span><span | |
12114 class="cmtt-8"> =</span><span | |
12115 class="cmtt-8"> [y1]</span><span | |
12116 class="cmtt-8"> -</span><span | |
12117 class="cmtt-8"> [y0]</span> | |
12118 <br class="fancyvrb" /><a | |
12119 id="x1-122004r2"></a><span | |
12120 class="cmr-6">2</span><span | |
12121 class="cmtt-8"> </span><span | |
12122 class="cmtt-8"> </span><span | |
12123 class="cmtt-8"> </span><span | |
12124 class="cmtt-8"> 2)</span><span | |
12125 class="cmtt-8"> [adx]</span><span | |
12126 class="cmtt-8"> =</span><span | |
12127 class="cmtt-8"> [x1]</span><span | |
12128 class="cmtt-8"> -</span><span | |
12129 class="cmtt-8"> [x0]</span> | |
12130 <br class="fancyvrb" /><a | |
12131 id="x1-122006r3"></a><span | |
12132 class="cmr-6">3</span><span | |
12133 class="cmtt-8"> </span><span | |
12134 class="cmtt-8"> </span><span | |
12135 class="cmtt-8"> </span><span | |
12136 class="cmtt-8"> 3)</span><span | |
12137 class="cmtt-8"> [ady]</span><span | |
12138 class="cmtt-8"> =</span><span | |
12139 class="cmtt-8"> absolute</span><span | |
12140 class="cmtt-8"> value</span><span | |
12141 class="cmtt-8"> of</span><span | |
12142 class="cmtt-8"> [dy]</span> | |
12143 <br class="fancyvrb" /><a | |
12144 id="x1-122008r4"></a><span | |
12145 class="cmr-6">4</span><span | |
12146 class="cmtt-8"> </span><span | |
12147 class="cmtt-8"> </span><span | |
12148 class="cmtt-8"> </span><span | |
12149 class="cmtt-8"> 4)</span><span | |
12150 class="cmtt-8"> [err]</span><span | |
12151 class="cmtt-8"> =</span><span | |
12152 class="cmtt-8"> [ady]</span><span | |
12153 class="cmtt-8"> *</span><span | |
12154 class="cmtt-8"> ([X]</span><span | |
12155 class="cmtt-8"> -</span><span | |
12156 class="cmtt-8"> [x0])</span> | |
12157 <br class="fancyvrb" /><a | |
12158 id="x1-122010r5"></a><span | |
12159 class="cmr-6">5</span><span | |
12160 class="cmtt-8"> </span><span | |
12161 class="cmtt-8"> </span><span | |
12162 class="cmtt-8"> </span><span | |
12163 class="cmtt-8"> 5)</span><span | |
12164 class="cmtt-8"> [off]</span><span | |
12165 class="cmtt-8"> =</span><span | |
12166 class="cmtt-8"> [err]</span><span | |
12167 class="cmtt-8"> /</span><span | |
12168 class="cmtt-8"> [adx]</span><span | |
12169 class="cmtt-8"> using</span><span | |
12170 class="cmtt-8"> integer</span><span | |
12171 class="cmtt-8"> division</span> | |
12172 <br class="fancyvrb" /><a | |
12173 id="x1-122012r6"></a><span | |
12174 class="cmr-6">6</span><span | |
12175 class="cmtt-8"> </span><span | |
12176 class="cmtt-8"> </span><span | |
12177 class="cmtt-8"> </span><span | |
12178 class="cmtt-8"> 6)</span><span | |
12179 class="cmtt-8"> if</span><span | |
12180 class="cmtt-8"> (</span><span | |
12181 class="cmtt-8"> [dy]</span><span | |
12182 class="cmtt-8"> is</span><span | |
12183 class="cmtt-8"> less</span><span | |
12184 class="cmtt-8"> than</span><span | |
12185 class="cmtt-8"> zero</span><span | |
12186 class="cmtt-8"> )</span><span | |
12187 class="cmtt-8"> {</span> | |
12188 <br class="fancyvrb" /><a | |
12189 id="x1-122014r7"></a><span | |
12190 class="cmr-6">7</span><span | |
12191 class="cmtt-8"> </span><span | |
12192 class="cmtt-8"> </span> | |
12193 <br class="fancyvrb" /><a | |
12194 id="x1-122016r8"></a><span | |
12195 class="cmr-6">8</span><span | |
12196 class="cmtt-8"> </span><span | |
12197 class="cmtt-8"> </span><span | |
12198 class="cmtt-8"> </span><span | |
12199 class="cmtt-8"> </span><span | |
12200 class="cmtt-8"> </span><span | |
12201 class="cmtt-8"> </span><span | |
12202 class="cmtt-8"> </span><span | |
12203 class="cmtt-8"> </span><span | |
12204 class="cmtt-8"> 7)</span><span | |
12205 class="cmtt-8"> [Y]</span><span | |
12206 class="cmtt-8"> =</span><span | |
12207 class="cmtt-8"> [y0]</span><span | |
12208 class="cmtt-8"> -</span><span | |
12209 class="cmtt-8"> [off]</span> | |
12210 <br class="fancyvrb" /><a | |
12211 id="x1-122018r9"></a><span | |
12212 class="cmr-6">9</span><span | |
12213 class="cmtt-8"> </span><span | |
12214 class="cmtt-8"> </span> | |
12215 <br class="fancyvrb" /><a | |
12216 id="x1-122020r10"></a><span | |
12217 class="cmr-6">10</span><span | |
12218 class="cmtt-8"> </span><span | |
12219 class="cmtt-8"> </span><span | |
12220 class="cmtt-8"> </span><span | |
12221 class="cmtt-8"> </span><span | |
12222 class="cmtt-8"> </span><span | |
12223 class="cmtt-8"> </span><span | |
12224 class="cmtt-8"> }</span><span | |
12225 class="cmtt-8"> else</span><span | |
12226 class="cmtt-8"> {</span> | |
12227 <br class="fancyvrb" /><a | |
12228 id="x1-122022r11"></a><span | |
12229 class="cmr-6">11</span><span | |
12230 class="cmtt-8"> </span><span | |
12231 class="cmtt-8"> </span> | |
12232 <br class="fancyvrb" /><a | |
12233 id="x1-122024r12"></a><span | |
12234 class="cmr-6">12</span><span | |
12235 class="cmtt-8"> </span><span | |
12236 class="cmtt-8"> </span><span | |
12237 class="cmtt-8"> </span><span | |
12238 class="cmtt-8"> </span><span | |
12239 class="cmtt-8"> </span><span | |
12240 class="cmtt-8"> </span><span | |
12241 class="cmtt-8"> </span><span | |
12242 class="cmtt-8"> </span><span | |
12243 class="cmtt-8"> 8)</span><span | |
12244 class="cmtt-8"> [Y]</span><span | |
12245 class="cmtt-8"> =</span><span | |
12246 class="cmtt-8"> [y0]</span><span | |
12247 class="cmtt-8"> +</span><span | |
12248 class="cmtt-8"> [off]</span> | |
12249 <br class="fancyvrb" /><a | |
12250 id="x1-122026r13"></a><span | |
12251 class="cmr-6">13</span><span | |
12252 class="cmtt-8"> </span><span | |
12253 class="cmtt-8"> </span> | |
12254 <br class="fancyvrb" /><a | |
12255 id="x1-122028r14"></a><span | |
12256 class="cmr-6">14</span><span | |
12257 class="cmtt-8"> </span><span | |
12258 class="cmtt-8"> </span><span | |
12259 class="cmtt-8"> </span><span | |
12260 class="cmtt-8"> </span><span | |
12261 class="cmtt-8"> </span><span | |
12262 class="cmtt-8"> </span><span | |
12263 class="cmtt-8"> }</span> | |
12264 <br class="fancyvrb" /><a | |
12265 id="x1-122030r15"></a><span | |
12266 class="cmr-6">15</span><span | |
12267 class="cmtt-8"> </span><span | |
12268 class="cmtt-8"> </span> | |
12269 <br class="fancyvrb" /><a | |
12270 id="x1-122032r16"></a><span | |
12271 class="cmr-6">16</span><span | |
12272 class="cmtt-8"> </span><span | |
12273 class="cmtt-8"> </span><span | |
12274 class="cmtt-8"> </span><span | |
12275 class="cmtt-8"> 9)</span><span | |
12276 class="cmtt-8"> done</span> | |
12277 </div> | |
12278 <!--l. 125--><p class="noindent" > | |
12279 <h5 class="subsubsectionHead"><span class="titlemark">9.2.7. </span> <a | |
12280 id="x1-1230009.2.7"></a>render_line</h5> | |
12281 <!--l. 127--><p class="noindent" >Floor decode type one uses the integer line drawing algorithm of ”render_line(x0, y0, x1, y1, v)” | |
12282 to construct an integer floor curve for contiguous piecewise line segments. Note that it has not | |
12283 been relevant elsewhere, but here we must define integer division as rounding division of both | |
12284 positive and negative numbers toward zero. | |
12285 <!--l. 134--><p class="noindent" > | |
12286 <div class="fancyvrb" id="fancyvrb47"> | |
12287 <a | |
12288 id="x1-123002r1"></a><span | |
12289 class="cmr-6">1</span><span | |
12290 class="cmtt-8"> </span><span | |
12291 class="cmtt-8"> </span><span | |
12292 class="cmtt-8"> </span><span | |
12293 class="cmtt-8"> 1)</span><span | |
12294 class="cmtt-8"> </span><span | |
12295 class="cmtt-8"> </span><span | |
12296 class="cmtt-8"> [dy]</span><span | |
12297 class="cmtt-8"> =</span><span | |
12298 class="cmtt-8"> [y1]</span><span | |
12299 class="cmtt-8"> -</span><span | |
12300 class="cmtt-8"> [y0]</span> | |
12301 <br class="fancyvrb" /><a | |
12302 id="x1-123004r2"></a><span | |
12303 class="cmr-6">2</span><span | |
12304 class="cmtt-8"> </span><span | |
12305 class="cmtt-8"> </span><span | |
12306 class="cmtt-8"> </span><span | |
12307 class="cmtt-8"> 2)</span><span | |
12308 class="cmtt-8"> </span><span | |
12309 class="cmtt-8"> [adx]</span><span | |
12310 class="cmtt-8"> =</span><span | |
12311 class="cmtt-8"> [x1]</span><span | |
12312 class="cmtt-8"> -</span><span | |
12313 class="cmtt-8"> [x0]</span> | |
12314 <br class="fancyvrb" /><a | |
12315 id="x1-123006r3"></a><span | |
12316 class="cmr-6">3</span><span | |
12317 class="cmtt-8"> </span><span | |
12318 class="cmtt-8"> </span><span | |
12319 class="cmtt-8"> </span><span | |
12320 class="cmtt-8"> 3)</span><span | |
12321 class="cmtt-8"> </span><span | |
12322 class="cmtt-8"> [ady]</span><span | |
12323 class="cmtt-8"> =</span><span | |
12324 class="cmtt-8"> absolute</span><span | |
12325 class="cmtt-8"> value</span><span | |
12326 class="cmtt-8"> of</span><span | |
12327 class="cmtt-8"> [dy]</span> | |
12328 <br class="fancyvrb" /><a | |
12329 id="x1-123008r4"></a><span | |
12330 class="cmr-6">4</span><span | |
12331 class="cmtt-8"> </span><span | |
12332 class="cmtt-8"> </span><span | |
12333 class="cmtt-8"> </span><span | |
12334 class="cmtt-8"> 4)</span><span | |
12335 class="cmtt-8"> [base]</span><span | |
12336 class="cmtt-8"> =</span><span | |
12337 class="cmtt-8"> [dy]</span><span | |
12338 class="cmtt-8"> /</span><span | |
12339 class="cmtt-8"> [adx]</span><span | |
12340 class="cmtt-8"> using</span><span | |
12341 class="cmtt-8"> integer</span><span | |
12342 class="cmtt-8"> division</span> | |
12343 <br class="fancyvrb" /><a | |
12344 id="x1-123010r5"></a><span | |
12345 class="cmr-6">5</span><span | |
12346 class="cmtt-8"> </span><span | |
12347 class="cmtt-8"> </span><span | |
12348 class="cmtt-8"> </span><span | |
12349 class="cmtt-8"> 5)</span><span | |
12350 class="cmtt-8"> </span><span | |
12351 class="cmtt-8"> </span><span | |
12352 class="cmtt-8"> </span><span | |
12353 class="cmtt-8"> [x]</span><span | |
12354 class="cmtt-8"> =</span><span | |
12355 class="cmtt-8"> [x0]</span> | |
12356 <br class="fancyvrb" /><a | |
12357 id="x1-123012r6"></a><span | |
12358 class="cmr-6">6</span><span | |
12359 class="cmtt-8"> </span><span | |
12360 class="cmtt-8"> </span><span | |
12361 class="cmtt-8"> </span><span | |
12362 class="cmtt-8"> 6)</span><span | |
12363 class="cmtt-8"> </span><span | |
12364 class="cmtt-8"> </span><span | |
12365 class="cmtt-8"> </span><span | |
12366 class="cmtt-8"> [y]</span><span | |
12367 class="cmtt-8"> =</span><span | |
12368 class="cmtt-8"> [y0]</span> | |
12369 <br class="fancyvrb" /><a | |
12370 id="x1-123014r7"></a><span | |
12371 class="cmr-6">7</span><span | |
12372 class="cmtt-8"> </span><span | |
12373 class="cmtt-8"> </span><span | |
12374 class="cmtt-8"> </span><span | |
12375 class="cmtt-8"> 7)</span><span | |
12376 class="cmtt-8"> </span><span | |
12377 class="cmtt-8"> [err]</span><span | |
12378 class="cmtt-8"> =</span><span | |
12379 class="cmtt-8"> 0</span> | |
12380 <br class="fancyvrb" /><a | |
12381 id="x1-123016r8"></a><span | |
12382 class="cmr-6">8</span><span | |
12383 class="cmtt-8"> </span><span | |
12384 class="cmtt-8"> </span> | |
12385 <br class="fancyvrb" /><a | |
12386 id="x1-123018r9"></a><span | |
12387 class="cmr-6">9</span><span | |
12388 class="cmtt-8"> </span><span | |
12389 class="cmtt-8"> </span><span | |
12390 class="cmtt-8"> </span><span | |
12391 class="cmtt-8"> 8)</span><span | |
12392 class="cmtt-8"> if</span><span | |
12393 class="cmtt-8"> (</span><span | |
12394 class="cmtt-8"> [dy]</span><span | |
12395 class="cmtt-8"> is</span><span | |
12396 class="cmtt-8"> less</span><span | |
12397 class="cmtt-8"> than</span><span | |
12398 class="cmtt-8"> 0</span><span | |
12399 class="cmtt-8"> )</span><span | |
12400 class="cmtt-8"> {</span> | |
12401 <br class="fancyvrb" /><a | |
12402 id="x1-123020r10"></a><span | |
12403 class="cmr-6">10</span><span | |
12404 class="cmtt-8"> </span><span | |
12405 class="cmtt-8"> </span> | |
12406 <br class="fancyvrb" /><a | |
12407 id="x1-123022r11"></a><span | |
12408 class="cmr-6">11</span><span | |
12409 class="cmtt-8"> </span><span | |
12410 class="cmtt-8"> </span><span | |
12411 class="cmtt-8"> </span><span | |
12412 class="cmtt-8"> </span><span | |
12413 class="cmtt-8"> </span><span | |
12414 class="cmtt-8"> </span><span | |
12415 class="cmtt-8"> </span><span | |
12416 class="cmtt-8"> </span><span | |
12417 class="cmtt-8"> </span><span | |
12418 class="cmtt-8"> 9)</span><span | |
12419 class="cmtt-8"> [sy]</span><span | |
12420 class="cmtt-8"> =</span><span | |
12421 class="cmtt-8"> [base]</span><span | |
12422 class="cmtt-8"> -</span><span | |
12423 class="cmtt-8"> 1</span> | |
12424 <br class="fancyvrb" /><a | |
12425 id="x1-123024r12"></a><span | |
12426 class="cmr-6">12</span><span | |
12427 class="cmtt-8"> </span><span | |
12428 class="cmtt-8"> </span> | |
12429 <br class="fancyvrb" /><a | |
12430 id="x1-123026r13"></a><span | |
12431 class="cmr-6">13</span><span | |
12432 class="cmtt-8"> </span><span | |
12433 class="cmtt-8"> </span><span | |
12434 class="cmtt-8"> </span><span | |
12435 class="cmtt-8"> </span><span | |
12436 class="cmtt-8"> </span><span | |
12437 class="cmtt-8"> </span><span | |
12438 class="cmtt-8"> }</span><span | |
12439 class="cmtt-8"> else</span><span | |
12440 class="cmtt-8"> {</span> | |
12441 <br class="fancyvrb" /><a | |
12442 id="x1-123028r14"></a><span | |
12443 class="cmr-6">14</span><span | |
12444 class="cmtt-8"> </span><span | |
12445 class="cmtt-8"> </span> | |
12446 <br class="fancyvrb" /><a | |
12447 id="x1-123030r15"></a><span | |
12448 class="cmr-6">15</span><span | |
12449 class="cmtt-8"> </span><span | |
12450 class="cmtt-8"> </span><span | |
12451 class="cmtt-8"> </span><span | |
12452 class="cmtt-8"> </span><span | |
12453 class="cmtt-8"> </span><span | |
12454 class="cmtt-8"> </span><span | |
12455 class="cmtt-8"> </span><span | |
12456 class="cmtt-8"> </span><span | |
12457 class="cmtt-8"> 10)</span><span | |
12458 class="cmtt-8"> [sy]</span><span | |
12459 class="cmtt-8"> =</span><span | |
12460 class="cmtt-8"> [base]</span><span | |
12461 class="cmtt-8"> +</span><span | |
12462 class="cmtt-8"> 1</span> | |
12463 <br class="fancyvrb" /><a | |
12464 id="x1-123032r16"></a><span | |
12465 class="cmr-6">16</span><span | |
12466 class="cmtt-8"> </span><span | |
12467 class="cmtt-8"> </span> | |
12468 <br class="fancyvrb" /><a | |
12469 id="x1-123034r17"></a><span | |
12470 class="cmr-6">17</span><span | |
12471 class="cmtt-8"> </span><span | |
12472 class="cmtt-8"> </span><span | |
12473 class="cmtt-8"> </span><span | |
12474 class="cmtt-8"> </span><span | |
12475 class="cmtt-8"> </span><span | |
12476 class="cmtt-8"> </span><span | |
12477 class="cmtt-8"> }</span> | |
12478 <br class="fancyvrb" /><a | |
12479 id="x1-123036r18"></a><span | |
12480 class="cmr-6">18</span><span | |
12481 class="cmtt-8"> </span><span | |
12482 class="cmtt-8"> </span> | |
12483 <br class="fancyvrb" /><a | |
12484 id="x1-123038r19"></a><span | |
12485 class="cmr-6">19</span><span | |
12486 class="cmtt-8"> </span><span | |
12487 class="cmtt-8"> </span><span | |
12488 class="cmtt-8"> 11)</span><span | |
12489 class="cmtt-8"> [ady]</span><span | |
12490 class="cmtt-8"> =</span><span | |
12491 class="cmtt-8"> [ady]</span><span | |
12492 class="cmtt-8"> -</span><span | |
12493 class="cmtt-8"> (absolute</span><span | |
12494 class="cmtt-8"> value</span><span | |
12495 class="cmtt-8"> of</span><span | |
12496 class="cmtt-8"> [base])</span><span | |
12497 class="cmtt-8"> *</span><span | |
12498 class="cmtt-8"> [adx]</span> | |
12499 <br class="fancyvrb" /><a | |
12500 id="x1-123040r20"></a><span | |
12501 class="cmr-6">20</span><span | |
12502 class="cmtt-8"> </span><span | |
12503 class="cmtt-8"> </span><span | |
12504 class="cmtt-8"> 12)</span><span | |
12505 class="cmtt-8"> vector</span><span | |
12506 class="cmtt-8"> [v]</span><span | |
12507 class="cmtt-8"> element</span><span | |
12508 class="cmtt-8"> [x]</span><span | |
12509 class="cmtt-8"> =</span><span | |
12510 class="cmtt-8"> [y]</span> | |
12511 <br class="fancyvrb" /><a | |
12512 id="x1-123042r21"></a><span | |
12513 class="cmr-6">21</span><span | |
12514 class="cmtt-8"> </span><span | |
12515 class="cmtt-8"> </span> | |
12516 <br class="fancyvrb" /><a | |
12517 id="x1-123044r22"></a><span | |
12518 class="cmr-6">22</span><span | |
12519 class="cmtt-8"> </span><span | |
12520 class="cmtt-8"> </span><span | |
12521 class="cmtt-8"> 13)</span><span | |
12522 class="cmtt-8"> iterate</span><span | |
12523 class="cmtt-8"> [x]</span><span | |
12524 class="cmtt-8"> over</span><span | |
12525 class="cmtt-8"> the</span><span | |
12526 class="cmtt-8"> range</span><span | |
12527 class="cmtt-8"> [x0]+1</span><span | |
12528 class="cmtt-8"> ...</span><span | |
12529 class="cmtt-8"> [x1]-1</span><span | |
12530 class="cmtt-8"> {</span> | |
12531 | |
12532 | |
12533 | |
12534 <br class="fancyvrb" /><a | |
12535 id="x1-123046r23"></a><span | |
12536 class="cmr-6">23</span><span | |
12537 class="cmtt-8"> </span><span | |
12538 class="cmtt-8"> </span> | |
12539 <br class="fancyvrb" /><a | |
12540 id="x1-123048r24"></a><span | |
12541 class="cmr-6">24</span><span | |
12542 class="cmtt-8"> </span><span | |
12543 class="cmtt-8"> </span><span | |
12544 class="cmtt-8"> </span><span | |
12545 class="cmtt-8"> </span><span | |
12546 class="cmtt-8"> </span><span | |
12547 class="cmtt-8"> </span><span | |
12548 class="cmtt-8"> </span><span | |
12549 class="cmtt-8"> </span><span | |
12550 class="cmtt-8"> 14)</span><span | |
12551 class="cmtt-8"> [err]</span><span | |
12552 class="cmtt-8"> =</span><span | |
12553 class="cmtt-8"> [err]</span><span | |
12554 class="cmtt-8"> +</span><span | |
12555 class="cmtt-8"> [ady];</span> | |
12556 <br class="fancyvrb" /><a | |
12557 id="x1-123050r25"></a><span | |
12558 class="cmr-6">25</span><span | |
12559 class="cmtt-8"> </span><span | |
12560 class="cmtt-8"> </span><span | |
12561 class="cmtt-8"> </span><span | |
12562 class="cmtt-8"> </span><span | |
12563 class="cmtt-8"> </span><span | |
12564 class="cmtt-8"> </span><span | |
12565 class="cmtt-8"> </span><span | |
12566 class="cmtt-8"> </span><span | |
12567 class="cmtt-8"> 15)</span><span | |
12568 class="cmtt-8"> if</span><span | |
12569 class="cmtt-8"> (</span><span | |
12570 class="cmtt-8"> [err]</span><span | |
12571 class="cmtt-8"> >=</span><span | |
12572 class="cmtt-8"> [adx]</span><span | |
12573 class="cmtt-8"> )</span><span | |
12574 class="cmtt-8"> {</span> | |
12575 <br class="fancyvrb" /><a | |
12576 id="x1-123052r26"></a><span | |
12577 class="cmr-6">26</span><span | |
12578 class="cmtt-8"> </span><span | |
12579 class="cmtt-8"> </span> | |
12580 <br class="fancyvrb" /><a | |
12581 id="x1-123054r27"></a><span | |
12582 class="cmr-6">27</span><span | |
12583 class="cmtt-8"> </span><span | |
12584 class="cmtt-8"> </span><span | |
12585 class="cmtt-8"> </span><span | |
12586 class="cmtt-8"> </span><span | |
12587 class="cmtt-8"> </span><span | |
12588 class="cmtt-8"> </span><span | |
12589 class="cmtt-8"> </span><span | |
12590 class="cmtt-8"> </span><span | |
12591 class="cmtt-8"> </span><span | |
12592 class="cmtt-8"> </span><span | |
12593 class="cmtt-8"> </span><span | |
12594 class="cmtt-8"> </span><span | |
12595 class="cmtt-8"> </span><span | |
12596 class="cmtt-8"> </span><span | |
12597 class="cmtt-8"> 16)</span><span | |
12598 class="cmtt-8"> [err]</span><span | |
12599 class="cmtt-8"> =</span><span | |
12600 class="cmtt-8"> [err]</span><span | |
12601 class="cmtt-8"> -</span><span | |
12602 class="cmtt-8"> [adx]</span> | |
12603 <br class="fancyvrb" /><a | |
12604 id="x1-123056r28"></a><span | |
12605 class="cmr-6">28</span><span | |
12606 class="cmtt-8"> </span><span | |
12607 class="cmtt-8"> </span><span | |
12608 class="cmtt-8"> </span><span | |
12609 class="cmtt-8"> </span><span | |
12610 class="cmtt-8"> </span><span | |
12611 class="cmtt-8"> </span><span | |
12612 class="cmtt-8"> </span><span | |
12613 class="cmtt-8"> </span><span | |
12614 class="cmtt-8"> </span><span | |
12615 class="cmtt-8"> </span><span | |
12616 class="cmtt-8"> </span><span | |
12617 class="cmtt-8"> </span><span | |
12618 class="cmtt-8"> </span><span | |
12619 class="cmtt-8"> </span><span | |
12620 class="cmtt-8"> 17)</span><span | |
12621 class="cmtt-8"> </span><span | |
12622 class="cmtt-8"> </span><span | |
12623 class="cmtt-8"> [y]</span><span | |
12624 class="cmtt-8"> =</span><span | |
12625 class="cmtt-8"> [y]</span><span | |
12626 class="cmtt-8"> +</span><span | |
12627 class="cmtt-8"> [sy]</span> | |
12628 <br class="fancyvrb" /><a | |
12629 id="x1-123058r29"></a><span | |
12630 class="cmr-6">29</span><span | |
12631 class="cmtt-8"> </span><span | |
12632 class="cmtt-8"> </span> | |
12633 <br class="fancyvrb" /><a | |
12634 id="x1-123060r30"></a><span | |
12635 class="cmr-6">30</span><span | |
12636 class="cmtt-8"> </span><span | |
12637 class="cmtt-8"> </span><span | |
12638 class="cmtt-8"> </span><span | |
12639 class="cmtt-8"> </span><span | |
12640 class="cmtt-8"> </span><span | |
12641 class="cmtt-8"> </span><span | |
12642 class="cmtt-8"> </span><span | |
12643 class="cmtt-8"> </span><span | |
12644 class="cmtt-8"> </span><span | |
12645 class="cmtt-8"> </span><span | |
12646 class="cmtt-8"> </span><span | |
12647 class="cmtt-8"> </span><span | |
12648 class="cmtt-8"> }</span><span | |
12649 class="cmtt-8"> else</span><span | |
12650 class="cmtt-8"> {</span> | |
12651 <br class="fancyvrb" /><a | |
12652 id="x1-123062r31"></a><span | |
12653 class="cmr-6">31</span><span | |
12654 class="cmtt-8"> </span><span | |
12655 class="cmtt-8"> </span> | |
12656 <br class="fancyvrb" /><a | |
12657 id="x1-123064r32"></a><span | |
12658 class="cmr-6">32</span><span | |
12659 class="cmtt-8"> </span><span | |
12660 class="cmtt-8"> </span><span | |
12661 class="cmtt-8"> </span><span | |
12662 class="cmtt-8"> </span><span | |
12663 class="cmtt-8"> </span><span | |
12664 class="cmtt-8"> </span><span | |
12665 class="cmtt-8"> </span><span | |
12666 class="cmtt-8"> </span><span | |
12667 class="cmtt-8"> </span><span | |
12668 class="cmtt-8"> </span><span | |
12669 class="cmtt-8"> </span><span | |
12670 class="cmtt-8"> </span><span | |
12671 class="cmtt-8"> </span><span | |
12672 class="cmtt-8"> </span><span | |
12673 class="cmtt-8"> 18)</span><span | |
12674 class="cmtt-8"> [y]</span><span | |
12675 class="cmtt-8"> =</span><span | |
12676 class="cmtt-8"> [y]</span><span | |
12677 class="cmtt-8"> +</span><span | |
12678 class="cmtt-8"> [base]</span> | |
12679 <br class="fancyvrb" /><a | |
12680 id="x1-123066r33"></a><span | |
12681 class="cmr-6">33</span><span | |
12682 class="cmtt-8"> </span><span | |
12683 class="cmtt-8"> </span> | |
12684 <br class="fancyvrb" /><a | |
12685 id="x1-123068r34"></a><span | |
12686 class="cmr-6">34</span><span | |
12687 class="cmtt-8"> </span><span | |
12688 class="cmtt-8"> </span><span | |
12689 class="cmtt-8"> </span><span | |
12690 class="cmtt-8"> </span><span | |
12691 class="cmtt-8"> </span><span | |
12692 class="cmtt-8"> </span><span | |
12693 class="cmtt-8"> </span><span | |
12694 class="cmtt-8"> </span><span | |
12695 class="cmtt-8"> </span><span | |
12696 class="cmtt-8"> </span><span | |
12697 class="cmtt-8"> </span><span | |
12698 class="cmtt-8"> </span><span | |
12699 class="cmtt-8"> }</span> | |
12700 <br class="fancyvrb" /><a | |
12701 id="x1-123070r35"></a><span | |
12702 class="cmr-6">35</span><span | |
12703 class="cmtt-8"> </span><span | |
12704 class="cmtt-8"> </span> | |
12705 <br class="fancyvrb" /><a | |
12706 id="x1-123072r36"></a><span | |
12707 class="cmr-6">36</span><span | |
12708 class="cmtt-8"> </span><span | |
12709 class="cmtt-8"> </span><span | |
12710 class="cmtt-8"> </span><span | |
12711 class="cmtt-8"> </span><span | |
12712 class="cmtt-8"> </span><span | |
12713 class="cmtt-8"> </span><span | |
12714 class="cmtt-8"> </span><span | |
12715 class="cmtt-8"> </span><span | |
12716 class="cmtt-8"> 19)</span><span | |
12717 class="cmtt-8"> vector</span><span | |
12718 class="cmtt-8"> [v]</span><span | |
12719 class="cmtt-8"> element</span><span | |
12720 class="cmtt-8"> [x]</span><span | |
12721 class="cmtt-8"> =</span><span | |
12722 class="cmtt-8"> [y]</span> | |
12723 <br class="fancyvrb" /><a | |
12724 id="x1-123074r37"></a><span | |
12725 class="cmr-6">37</span><span | |
12726 class="cmtt-8"> </span><span | |
12727 class="cmtt-8"> </span> | |
12728 <br class="fancyvrb" /><a | |
12729 id="x1-123076r38"></a><span | |
12730 class="cmr-6">38</span><span | |
12731 class="cmtt-8"> </span><span | |
12732 class="cmtt-8"> </span><span | |
12733 class="cmtt-8"> </span><span | |
12734 class="cmtt-8"> </span><span | |
12735 class="cmtt-8"> </span><span | |
12736 class="cmtt-8"> </span><span | |
12737 class="cmtt-8"> }</span> | |
12738 </div> | |
12739 | |
12740 | |
12741 | |
12742 | |
12743 | |
12744 | |
12745 <h3 class="sectionHead"><span class="titlemark">10. </span> <a | |
12746 id="x1-12400010"></a>Tables</h3> | |
12747 <!--l. 6--><p class="noindent" > | |
12748 <h4 class="subsectionHead"><span class="titlemark">10.1. </span> <a | |
12749 id="x1-12500010.1"></a>floor1_inverse_dB_table</h4> | |
12750 <!--l. 8--><p class="noindent" >The vector <span | |
12751 class="cmtt-12">[floor1_inverse_dB_table] </span>is a 256 element static lookup table consiting of the | |
12752 following values (read left to right then top to bottom): | |
12753 <!--l. 12--><p class="noindent" > | |
12754 <div class="fancyvrb" id="fancyvrb48"> | |
12755 <a | |
12756 id="x1-125002r1"></a><span | |
12757 class="cmr-6">1</span><span | |
12758 class="cmtt-8"> </span><span | |
12759 class="cmtt-8"> </span><span | |
12760 class="cmtt-8"> </span><span | |
12761 class="cmtt-8"> 1.0649863e-07,</span><span | |
12762 class="cmtt-8"> 1.1341951e-07,</span><span | |
12763 class="cmtt-8"> 1.2079015e-07,</span><span | |
12764 class="cmtt-8"> 1.2863978e-07,</span> | |
12765 <br class="fancyvrb" /><a | |
12766 id="x1-125004r2"></a><span | |
12767 class="cmr-6">2</span><span | |
12768 class="cmtt-8"> </span><span | |
12769 class="cmtt-8"> </span><span | |
12770 class="cmtt-8"> </span><span | |
12771 class="cmtt-8"> 1.3699951e-07,</span><span | |
12772 class="cmtt-8"> 1.4590251e-07,</span><span | |
12773 class="cmtt-8"> 1.5538408e-07,</span><span | |
12774 class="cmtt-8"> 1.6548181e-07,</span> | |
12775 <br class="fancyvrb" /><a | |
12776 id="x1-125006r3"></a><span | |
12777 class="cmr-6">3</span><span | |
12778 class="cmtt-8"> </span><span | |
12779 class="cmtt-8"> </span><span | |
12780 class="cmtt-8"> </span><span | |
12781 class="cmtt-8"> 1.7623575e-07,</span><span | |
12782 class="cmtt-8"> 1.8768855e-07,</span><span | |
12783 class="cmtt-8"> 1.9988561e-07,</span><span | |
12784 class="cmtt-8"> 2.1287530e-07,</span> | |
12785 <br class="fancyvrb" /><a | |
12786 id="x1-125008r4"></a><span | |
12787 class="cmr-6">4</span><span | |
12788 class="cmtt-8"> </span><span | |
12789 class="cmtt-8"> </span><span | |
12790 class="cmtt-8"> </span><span | |
12791 class="cmtt-8"> 2.2670913e-07,</span><span | |
12792 class="cmtt-8"> 2.4144197e-07,</span><span | |
12793 class="cmtt-8"> 2.5713223e-07,</span><span | |
12794 class="cmtt-8"> 2.7384213e-07,</span> | |
12795 <br class="fancyvrb" /><a | |
12796 id="x1-125010r5"></a><span | |
12797 class="cmr-6">5</span><span | |
12798 class="cmtt-8"> </span><span | |
12799 class="cmtt-8"> </span><span | |
12800 class="cmtt-8"> </span><span | |
12801 class="cmtt-8"> 2.9163793e-07,</span><span | |
12802 class="cmtt-8"> 3.1059021e-07,</span><span | |
12803 class="cmtt-8"> 3.3077411e-07,</span><span | |
12804 class="cmtt-8"> 3.5226968e-07,</span> | |
12805 <br class="fancyvrb" /><a | |
12806 id="x1-125012r6"></a><span | |
12807 class="cmr-6">6</span><span | |
12808 class="cmtt-8"> </span><span | |
12809 class="cmtt-8"> </span><span | |
12810 class="cmtt-8"> </span><span | |
12811 class="cmtt-8"> 3.7516214e-07,</span><span | |
12812 class="cmtt-8"> 3.9954229e-07,</span><span | |
12813 class="cmtt-8"> 4.2550680e-07,</span><span | |
12814 class="cmtt-8"> 4.5315863e-07,</span> | |
12815 <br class="fancyvrb" /><a | |
12816 id="x1-125014r7"></a><span | |
12817 class="cmr-6">7</span><span | |
12818 class="cmtt-8"> </span><span | |
12819 class="cmtt-8"> </span><span | |
12820 class="cmtt-8"> </span><span | |
12821 class="cmtt-8"> 4.8260743e-07,</span><span | |
12822 class="cmtt-8"> 5.1396998e-07,</span><span | |
12823 class="cmtt-8"> 5.4737065e-07,</span><span | |
12824 class="cmtt-8"> 5.8294187e-07,</span> | |
12825 <br class="fancyvrb" /><a | |
12826 id="x1-125016r8"></a><span | |
12827 class="cmr-6">8</span><span | |
12828 class="cmtt-8"> </span><span | |
12829 class="cmtt-8"> </span><span | |
12830 class="cmtt-8"> </span><span | |
12831 class="cmtt-8"> 6.2082472e-07,</span><span | |
12832 class="cmtt-8"> 6.6116941e-07,</span><span | |
12833 class="cmtt-8"> 7.0413592e-07,</span><span | |
12834 class="cmtt-8"> 7.4989464e-07,</span> | |
12835 <br class="fancyvrb" /><a | |
12836 id="x1-125018r9"></a><span | |
12837 class="cmr-6">9</span><span | |
12838 class="cmtt-8"> </span><span | |
12839 class="cmtt-8"> </span><span | |
12840 class="cmtt-8"> </span><span | |
12841 class="cmtt-8"> 7.9862701e-07,</span><span | |
12842 class="cmtt-8"> 8.5052630e-07,</span><span | |
12843 class="cmtt-8"> 9.0579828e-07,</span><span | |
12844 class="cmtt-8"> 9.6466216e-07,</span> | |
12845 <br class="fancyvrb" /><a | |
12846 id="x1-125020r10"></a><span | |
12847 class="cmr-6">10</span><span | |
12848 class="cmtt-8"> </span><span | |
12849 class="cmtt-8"> </span><span | |
12850 class="cmtt-8"> </span><span | |
12851 class="cmtt-8"> 1.0273513e-06,</span><span | |
12852 class="cmtt-8"> 1.0941144e-06,</span><span | |
12853 class="cmtt-8"> 1.1652161e-06,</span><span | |
12854 class="cmtt-8"> 1.2409384e-06,</span> | |
12855 <br class="fancyvrb" /><a | |
12856 id="x1-125022r11"></a><span | |
12857 class="cmr-6">11</span><span | |
12858 class="cmtt-8"> </span><span | |
12859 class="cmtt-8"> </span><span | |
12860 class="cmtt-8"> </span><span | |
12861 class="cmtt-8"> 1.3215816e-06,</span><span | |
12862 class="cmtt-8"> 1.4074654e-06,</span><span | |
12863 class="cmtt-8"> 1.4989305e-06,</span><span | |
12864 class="cmtt-8"> 1.5963394e-06,</span> | |
12865 <br class="fancyvrb" /><a | |
12866 id="x1-125024r12"></a><span | |
12867 class="cmr-6">12</span><span | |
12868 class="cmtt-8"> </span><span | |
12869 class="cmtt-8"> </span><span | |
12870 class="cmtt-8"> </span><span | |
12871 class="cmtt-8"> 1.7000785e-06,</span><span | |
12872 class="cmtt-8"> 1.8105592e-06,</span><span | |
12873 class="cmtt-8"> 1.9282195e-06,</span><span | |
12874 class="cmtt-8"> 2.0535261e-06,</span> | |
12875 <br class="fancyvrb" /><a | |
12876 id="x1-125026r13"></a><span | |
12877 class="cmr-6">13</span><span | |
12878 class="cmtt-8"> </span><span | |
12879 class="cmtt-8"> </span><span | |
12880 class="cmtt-8"> </span><span | |
12881 class="cmtt-8"> 2.1869758e-06,</span><span | |
12882 class="cmtt-8"> 2.3290978e-06,</span><span | |
12883 class="cmtt-8"> 2.4804557e-06,</span><span | |
12884 class="cmtt-8"> 2.6416497e-06,</span> | |
12885 <br class="fancyvrb" /><a | |
12886 id="x1-125028r14"></a><span | |
12887 class="cmr-6">14</span><span | |
12888 class="cmtt-8"> </span><span | |
12889 class="cmtt-8"> </span><span | |
12890 class="cmtt-8"> </span><span | |
12891 class="cmtt-8"> 2.8133190e-06,</span><span | |
12892 class="cmtt-8"> 2.9961443e-06,</span><span | |
12893 class="cmtt-8"> 3.1908506e-06,</span><span | |
12894 class="cmtt-8"> 3.3982101e-06,</span> | |
12895 <br class="fancyvrb" /><a | |
12896 id="x1-125030r15"></a><span | |
12897 class="cmr-6">15</span><span | |
12898 class="cmtt-8"> </span><span | |
12899 class="cmtt-8"> </span><span | |
12900 class="cmtt-8"> </span><span | |
12901 class="cmtt-8"> 3.6190449e-06,</span><span | |
12902 class="cmtt-8"> 3.8542308e-06,</span><span | |
12903 class="cmtt-8"> 4.1047004e-06,</span><span | |
12904 class="cmtt-8"> 4.3714470e-06,</span> | |
12905 <br class="fancyvrb" /><a | |
12906 id="x1-125032r16"></a><span | |
12907 class="cmr-6">16</span><span | |
12908 class="cmtt-8"> </span><span | |
12909 class="cmtt-8"> </span><span | |
12910 class="cmtt-8"> </span><span | |
12911 class="cmtt-8"> 4.6555282e-06,</span><span | |
12912 class="cmtt-8"> 4.9580707e-06,</span><span | |
12913 class="cmtt-8"> 5.2802740e-06,</span><span | |
12914 class="cmtt-8"> 5.6234160e-06,</span> | |
12915 <br class="fancyvrb" /><a | |
12916 id="x1-125034r17"></a><span | |
12917 class="cmr-6">17</span><span | |
12918 class="cmtt-8"> </span><span | |
12919 class="cmtt-8"> </span><span | |
12920 class="cmtt-8"> </span><span | |
12921 class="cmtt-8"> 5.9888572e-06,</span><span | |
12922 class="cmtt-8"> 6.3780469e-06,</span><span | |
12923 class="cmtt-8"> 6.7925283e-06,</span><span | |
12924 class="cmtt-8"> 7.2339451e-06,</span> | |
12925 <br class="fancyvrb" /><a | |
12926 id="x1-125036r18"></a><span | |
12927 class="cmr-6">18</span><span | |
12928 class="cmtt-8"> </span><span | |
12929 class="cmtt-8"> </span><span | |
12930 class="cmtt-8"> </span><span | |
12931 class="cmtt-8"> 7.7040476e-06,</span><span | |
12932 class="cmtt-8"> 8.2047000e-06,</span><span | |
12933 class="cmtt-8"> 8.7378876e-06,</span><span | |
12934 class="cmtt-8"> 9.3057248e-06,</span> | |
12935 <br class="fancyvrb" /><a | |
12936 id="x1-125038r19"></a><span | |
12937 class="cmr-6">19</span><span | |
12938 class="cmtt-8"> </span><span | |
12939 class="cmtt-8"> </span><span | |
12940 class="cmtt-8"> </span><span | |
12941 class="cmtt-8"> 9.9104632e-06,</span><span | |
12942 class="cmtt-8"> 1.0554501e-05,</span><span | |
12943 class="cmtt-8"> 1.1240392e-05,</span><span | |
12944 class="cmtt-8"> 1.1970856e-05,</span> | |
12945 <br class="fancyvrb" /><a | |
12946 id="x1-125040r20"></a><span | |
12947 class="cmr-6">20</span><span | |
12948 class="cmtt-8"> </span><span | |
12949 class="cmtt-8"> </span><span | |
12950 class="cmtt-8"> </span><span | |
12951 class="cmtt-8"> 1.2748789e-05,</span><span | |
12952 class="cmtt-8"> 1.3577278e-05,</span><span | |
12953 class="cmtt-8"> 1.4459606e-05,</span><span | |
12954 class="cmtt-8"> 1.5399272e-05,</span> | |
12955 <br class="fancyvrb" /><a | |
12956 id="x1-125042r21"></a><span | |
12957 class="cmr-6">21</span><span | |
12958 class="cmtt-8"> </span><span | |
12959 class="cmtt-8"> </span><span | |
12960 class="cmtt-8"> </span><span | |
12961 class="cmtt-8"> 1.6400004e-05,</span><span | |
12962 class="cmtt-8"> 1.7465768e-05,</span><span | |
12963 class="cmtt-8"> 1.8600792e-05,</span><span | |
12964 class="cmtt-8"> 1.9809576e-05,</span> | |
12965 <br class="fancyvrb" /><a | |
12966 id="x1-125044r22"></a><span | |
12967 class="cmr-6">22</span><span | |
12968 class="cmtt-8"> </span><span | |
12969 class="cmtt-8"> </span><span | |
12970 class="cmtt-8"> </span><span | |
12971 class="cmtt-8"> 2.1096914e-05,</span><span | |
12972 class="cmtt-8"> 2.2467911e-05,</span><span | |
12973 class="cmtt-8"> 2.3928002e-05,</span><span | |
12974 class="cmtt-8"> 2.5482978e-05,</span> | |
12975 <br class="fancyvrb" /><a | |
12976 id="x1-125046r23"></a><span | |
12977 class="cmr-6">23</span><span | |
12978 class="cmtt-8"> </span><span | |
12979 class="cmtt-8"> </span><span | |
12980 class="cmtt-8"> </span><span | |
12981 class="cmtt-8"> 2.7139006e-05,</span><span | |
12982 class="cmtt-8"> 2.8902651e-05,</span><span | |
12983 class="cmtt-8"> 3.0780908e-05,</span><span | |
12984 class="cmtt-8"> 3.2781225e-05,</span> | |
12985 <br class="fancyvrb" /><a | |
12986 id="x1-125048r24"></a><span | |
12987 class="cmr-6">24</span><span | |
12988 class="cmtt-8"> </span><span | |
12989 class="cmtt-8"> </span><span | |
12990 class="cmtt-8"> </span><span | |
12991 class="cmtt-8"> 3.4911534e-05,</span><span | |
12992 class="cmtt-8"> 3.7180282e-05,</span><span | |
12993 class="cmtt-8"> 3.9596466e-05,</span><span | |
12994 class="cmtt-8"> 4.2169667e-05,</span> | |
12995 <br class="fancyvrb" /><a | |
12996 id="x1-125050r25"></a><span | |
12997 class="cmr-6">25</span><span | |
12998 class="cmtt-8"> </span><span | |
12999 class="cmtt-8"> </span><span | |
13000 class="cmtt-8"> </span><span | |
13001 class="cmtt-8"> 4.4910090e-05,</span><span | |
13002 class="cmtt-8"> 4.7828601e-05,</span><span | |
13003 class="cmtt-8"> 5.0936773e-05,</span><span | |
13004 class="cmtt-8"> 5.4246931e-05,</span> | |
13005 <br class="fancyvrb" /><a | |
13006 id="x1-125052r26"></a><span | |
13007 class="cmr-6">26</span><span | |
13008 class="cmtt-8"> </span><span | |
13009 class="cmtt-8"> </span><span | |
13010 class="cmtt-8"> </span><span | |
13011 class="cmtt-8"> 5.7772202e-05,</span><span | |
13012 class="cmtt-8"> 6.1526565e-05,</span><span | |
13013 class="cmtt-8"> 6.5524908e-05,</span><span | |
13014 class="cmtt-8"> 6.9783085e-05,</span> | |
13015 <br class="fancyvrb" /><a | |
13016 id="x1-125054r27"></a><span | |
13017 class="cmr-6">27</span><span | |
13018 class="cmtt-8"> </span><span | |
13019 class="cmtt-8"> </span><span | |
13020 class="cmtt-8"> </span><span | |
13021 class="cmtt-8"> 7.4317983e-05,</span><span | |
13022 class="cmtt-8"> 7.9147585e-05,</span><span | |
13023 class="cmtt-8"> 8.4291040e-05,</span><span | |
13024 class="cmtt-8"> 8.9768747e-05,</span> | |
13025 <br class="fancyvrb" /><a | |
13026 id="x1-125056r28"></a><span | |
13027 class="cmr-6">28</span><span | |
13028 class="cmtt-8"> </span><span | |
13029 class="cmtt-8"> </span><span | |
13030 class="cmtt-8"> </span><span | |
13031 class="cmtt-8"> 9.5602426e-05,</span><span | |
13032 class="cmtt-8"> 0.00010181521,</span><span | |
13033 class="cmtt-8"> 0.00010843174,</span><span | |
13034 class="cmtt-8"> 0.00011547824,</span> | |
13035 <br class="fancyvrb" /><a | |
13036 id="x1-125058r29"></a><span | |
13037 class="cmr-6">29</span><span | |
13038 class="cmtt-8"> </span><span | |
13039 class="cmtt-8"> </span><span | |
13040 class="cmtt-8"> </span><span | |
13041 class="cmtt-8"> 0.00012298267,</span><span | |
13042 class="cmtt-8"> 0.00013097477,</span><span | |
13043 class="cmtt-8"> 0.00013948625,</span><span | |
13044 class="cmtt-8"> 0.00014855085,</span> | |
13045 <br class="fancyvrb" /><a | |
13046 id="x1-125060r30"></a><span | |
13047 class="cmr-6">30</span><span | |
13048 class="cmtt-8"> </span><span | |
13049 class="cmtt-8"> </span><span | |
13050 class="cmtt-8"> </span><span | |
13051 class="cmtt-8"> 0.00015820453,</span><span | |
13052 class="cmtt-8"> 0.00016848555,</span><span | |
13053 class="cmtt-8"> 0.00017943469,</span><span | |
13054 class="cmtt-8"> 0.00019109536,</span> | |
13055 <br class="fancyvrb" /><a | |
13056 id="x1-125062r31"></a><span | |
13057 class="cmr-6">31</span><span | |
13058 class="cmtt-8"> </span><span | |
13059 class="cmtt-8"> </span><span | |
13060 class="cmtt-8"> </span><span | |
13061 class="cmtt-8"> 0.00020351382,</span><span | |
13062 class="cmtt-8"> 0.00021673929,</span><span | |
13063 class="cmtt-8"> 0.00023082423,</span><span | |
13064 class="cmtt-8"> 0.00024582449,</span> | |
13065 <br class="fancyvrb" /><a | |
13066 id="x1-125064r32"></a><span | |
13067 class="cmr-6">32</span><span | |
13068 class="cmtt-8"> </span><span | |
13069 class="cmtt-8"> </span><span | |
13070 class="cmtt-8"> </span><span | |
13071 class="cmtt-8"> 0.00026179955,</span><span | |
13072 class="cmtt-8"> 0.00027881276,</span><span | |
13073 class="cmtt-8"> 0.00029693158,</span><span | |
13074 class="cmtt-8"> 0.00031622787,</span> | |
13075 <br class="fancyvrb" /><a | |
13076 id="x1-125066r33"></a><span | |
13077 class="cmr-6">33</span><span | |
13078 class="cmtt-8"> </span><span | |
13079 class="cmtt-8"> </span><span | |
13080 class="cmtt-8"> </span><span | |
13081 class="cmtt-8"> 0.00033677814,</span><span | |
13082 class="cmtt-8"> 0.00035866388,</span><span | |
13083 class="cmtt-8"> 0.00038197188,</span><span | |
13084 class="cmtt-8"> 0.00040679456,</span> | |
13085 <br class="fancyvrb" /><a | |
13086 id="x1-125068r34"></a><span | |
13087 class="cmr-6">34</span><span | |
13088 class="cmtt-8"> </span><span | |
13089 class="cmtt-8"> </span><span | |
13090 class="cmtt-8"> </span><span | |
13091 class="cmtt-8"> 0.00043323036,</span><span | |
13092 class="cmtt-8"> 0.00046138411,</span><span | |
13093 class="cmtt-8"> 0.00049136745,</span><span | |
13094 class="cmtt-8"> 0.00052329927,</span> | |
13095 <br class="fancyvrb" /><a | |
13096 id="x1-125070r35"></a><span | |
13097 class="cmr-6">35</span><span | |
13098 class="cmtt-8"> </span><span | |
13099 class="cmtt-8"> </span><span | |
13100 class="cmtt-8"> </span><span | |
13101 class="cmtt-8"> 0.00055730621,</span><span | |
13102 class="cmtt-8"> 0.00059352311,</span><span | |
13103 class="cmtt-8"> 0.00063209358,</span><span | |
13104 class="cmtt-8"> 0.00067317058,</span> | |
13105 <br class="fancyvrb" /><a | |
13106 id="x1-125072r36"></a><span | |
13107 class="cmr-6">36</span><span | |
13108 class="cmtt-8"> </span><span | |
13109 class="cmtt-8"> </span><span | |
13110 class="cmtt-8"> </span><span | |
13111 class="cmtt-8"> 0.00071691700,</span><span | |
13112 class="cmtt-8"> 0.00076350630,</span><span | |
13113 class="cmtt-8"> 0.00081312324,</span><span | |
13114 class="cmtt-8"> 0.00086596457,</span> | |
13115 <br class="fancyvrb" /><a | |
13116 id="x1-125074r37"></a><span | |
13117 class="cmr-6">37</span><span | |
13118 class="cmtt-8"> </span><span | |
13119 class="cmtt-8"> </span><span | |
13120 class="cmtt-8"> </span><span | |
13121 class="cmtt-8"> 0.00092223983,</span><span | |
13122 class="cmtt-8"> 0.00098217216,</span><span | |
13123 class="cmtt-8"> 0.0010459992,</span><span | |
13124 class="cmtt-8"> </span><span | |
13125 class="cmtt-8"> 0.0011139742,</span> | |
13126 <br class="fancyvrb" /><a | |
13127 id="x1-125076r38"></a><span | |
13128 class="cmr-6">38</span><span | |
13129 class="cmtt-8"> </span><span | |
13130 class="cmtt-8"> </span><span | |
13131 class="cmtt-8"> </span><span | |
13132 class="cmtt-8"> 0.0011863665,</span><span | |
13133 class="cmtt-8"> </span><span | |
13134 class="cmtt-8"> 0.0012634633,</span><span | |
13135 class="cmtt-8"> </span><span | |
13136 class="cmtt-8"> 0.0013455702,</span><span | |
13137 class="cmtt-8"> </span><span | |
13138 class="cmtt-8"> 0.0014330129,</span> | |
13139 <br class="fancyvrb" /><a | |
13140 id="x1-125078r39"></a><span | |
13141 class="cmr-6">39</span><span | |
13142 class="cmtt-8"> </span><span | |
13143 class="cmtt-8"> </span><span | |
13144 class="cmtt-8"> </span><span | |
13145 class="cmtt-8"> 0.0015261382,</span><span | |
13146 class="cmtt-8"> </span><span | |
13147 class="cmtt-8"> 0.0016253153,</span><span | |
13148 class="cmtt-8"> </span><span | |
13149 class="cmtt-8"> 0.0017309374,</span><span | |
13150 class="cmtt-8"> </span><span | |
13151 class="cmtt-8"> 0.0018434235,</span> | |
13152 <br class="fancyvrb" /><a | |
13153 id="x1-125080r40"></a><span | |
13154 class="cmr-6">40</span><span | |
13155 class="cmtt-8"> </span><span | |
13156 class="cmtt-8"> </span><span | |
13157 class="cmtt-8"> </span><span | |
13158 class="cmtt-8"> 0.0019632195,</span><span | |
13159 class="cmtt-8"> </span><span | |
13160 class="cmtt-8"> 0.0020908006,</span><span | |
13161 class="cmtt-8"> </span><span | |
13162 class="cmtt-8"> 0.0022266726,</span><span | |
13163 class="cmtt-8"> </span><span | |
13164 class="cmtt-8"> 0.0023713743,</span> | |
13165 <br class="fancyvrb" /><a | |
13166 id="x1-125082r41"></a><span | |
13167 class="cmr-6">41</span><span | |
13168 class="cmtt-8"> </span><span | |
13169 class="cmtt-8"> </span><span | |
13170 class="cmtt-8"> </span><span | |
13171 class="cmtt-8"> 0.0025254795,</span><span | |
13172 class="cmtt-8"> </span><span | |
13173 class="cmtt-8"> 0.0026895994,</span><span | |
13174 class="cmtt-8"> </span><span | |
13175 class="cmtt-8"> 0.0028643847,</span><span | |
13176 class="cmtt-8"> </span><span | |
13177 class="cmtt-8"> 0.0030505286,</span> | |
13178 <br class="fancyvrb" /><a | |
13179 id="x1-125084r42"></a><span | |
13180 class="cmr-6">42</span><span | |
13181 class="cmtt-8"> </span><span | |
13182 class="cmtt-8"> </span><span | |
13183 class="cmtt-8"> </span><span | |
13184 class="cmtt-8"> 0.0032487691,</span><span | |
13185 class="cmtt-8"> </span><span | |
13186 class="cmtt-8"> 0.0034598925,</span><span | |
13187 class="cmtt-8"> </span><span | |
13188 class="cmtt-8"> 0.0036847358,</span><span | |
13189 class="cmtt-8"> </span><span | |
13190 class="cmtt-8"> 0.0039241906,</span> | |
13191 | |
13192 | |
13193 | |
13194 <br class="fancyvrb" /><a | |
13195 id="x1-125086r43"></a><span | |
13196 class="cmr-6">43</span><span | |
13197 class="cmtt-8"> </span><span | |
13198 class="cmtt-8"> </span><span | |
13199 class="cmtt-8"> </span><span | |
13200 class="cmtt-8"> 0.0041792066,</span><span | |
13201 class="cmtt-8"> </span><span | |
13202 class="cmtt-8"> 0.0044507950,</span><span | |
13203 class="cmtt-8"> </span><span | |
13204 class="cmtt-8"> 0.0047400328,</span><span | |
13205 class="cmtt-8"> </span><span | |
13206 class="cmtt-8"> 0.0050480668,</span> | |
13207 <br class="fancyvrb" /><a | |
13208 id="x1-125088r44"></a><span | |
13209 class="cmr-6">44</span><span | |
13210 class="cmtt-8"> </span><span | |
13211 class="cmtt-8"> </span><span | |
13212 class="cmtt-8"> </span><span | |
13213 class="cmtt-8"> 0.0053761186,</span><span | |
13214 class="cmtt-8"> </span><span | |
13215 class="cmtt-8"> 0.0057254891,</span><span | |
13216 class="cmtt-8"> </span><span | |
13217 class="cmtt-8"> 0.0060975636,</span><span | |
13218 class="cmtt-8"> </span><span | |
13219 class="cmtt-8"> 0.0064938176,</span> | |
13220 <br class="fancyvrb" /><a | |
13221 id="x1-125090r45"></a><span | |
13222 class="cmr-6">45</span><span | |
13223 class="cmtt-8"> </span><span | |
13224 class="cmtt-8"> </span><span | |
13225 class="cmtt-8"> </span><span | |
13226 class="cmtt-8"> 0.0069158225,</span><span | |
13227 class="cmtt-8"> </span><span | |
13228 class="cmtt-8"> 0.0073652516,</span><span | |
13229 class="cmtt-8"> </span><span | |
13230 class="cmtt-8"> 0.0078438871,</span><span | |
13231 class="cmtt-8"> </span><span | |
13232 class="cmtt-8"> 0.0083536271,</span> | |
13233 <br class="fancyvrb" /><a | |
13234 id="x1-125092r46"></a><span | |
13235 class="cmr-6">46</span><span | |
13236 class="cmtt-8"> </span><span | |
13237 class="cmtt-8"> </span><span | |
13238 class="cmtt-8"> </span><span | |
13239 class="cmtt-8"> 0.0088964928,</span><span | |
13240 class="cmtt-8"> </span><span | |
13241 class="cmtt-8"> 0.009474637,</span><span | |
13242 class="cmtt-8"> </span><span | |
13243 class="cmtt-8"> </span><span | |
13244 class="cmtt-8"> 0.010090352,</span><span | |
13245 class="cmtt-8"> </span><span | |
13246 class="cmtt-8"> </span><span | |
13247 class="cmtt-8"> 0.010746080,</span> | |
13248 <br class="fancyvrb" /><a | |
13249 id="x1-125094r47"></a><span | |
13250 class="cmr-6">47</span><span | |
13251 class="cmtt-8"> </span><span | |
13252 class="cmtt-8"> </span><span | |
13253 class="cmtt-8"> </span><span | |
13254 class="cmtt-8"> 0.011444421,</span><span | |
13255 class="cmtt-8"> </span><span | |
13256 class="cmtt-8"> </span><span | |
13257 class="cmtt-8"> 0.012188144,</span><span | |
13258 class="cmtt-8"> </span><span | |
13259 class="cmtt-8"> </span><span | |
13260 class="cmtt-8"> 0.012980198,</span><span | |
13261 class="cmtt-8"> </span><span | |
13262 class="cmtt-8"> </span><span | |
13263 class="cmtt-8"> 0.013823725,</span> | |
13264 <br class="fancyvrb" /><a | |
13265 id="x1-125096r48"></a><span | |
13266 class="cmr-6">48</span><span | |
13267 class="cmtt-8"> </span><span | |
13268 class="cmtt-8"> </span><span | |
13269 class="cmtt-8"> </span><span | |
13270 class="cmtt-8"> 0.014722068,</span><span | |
13271 class="cmtt-8"> </span><span | |
13272 class="cmtt-8"> </span><span | |
13273 class="cmtt-8"> 0.015678791,</span><span | |
13274 class="cmtt-8"> </span><span | |
13275 class="cmtt-8"> </span><span | |
13276 class="cmtt-8"> 0.016697687,</span><span | |
13277 class="cmtt-8"> </span><span | |
13278 class="cmtt-8"> </span><span | |
13279 class="cmtt-8"> 0.017782797,</span> | |
13280 <br class="fancyvrb" /><a | |
13281 id="x1-125098r49"></a><span | |
13282 class="cmr-6">49</span><span | |
13283 class="cmtt-8"> </span><span | |
13284 class="cmtt-8"> </span><span | |
13285 class="cmtt-8"> </span><span | |
13286 class="cmtt-8"> 0.018938423,</span><span | |
13287 class="cmtt-8"> </span><span | |
13288 class="cmtt-8"> </span><span | |
13289 class="cmtt-8"> 0.020169149,</span><span | |
13290 class="cmtt-8"> </span><span | |
13291 class="cmtt-8"> </span><span | |
13292 class="cmtt-8"> 0.021479854,</span><span | |
13293 class="cmtt-8"> </span><span | |
13294 class="cmtt-8"> </span><span | |
13295 class="cmtt-8"> 0.022875735,</span> | |
13296 <br class="fancyvrb" /><a | |
13297 id="x1-125100r50"></a><span | |
13298 class="cmr-6">50</span><span | |
13299 class="cmtt-8"> </span><span | |
13300 class="cmtt-8"> </span><span | |
13301 class="cmtt-8"> </span><span | |
13302 class="cmtt-8"> 0.024362330,</span><span | |
13303 class="cmtt-8"> </span><span | |
13304 class="cmtt-8"> </span><span | |
13305 class="cmtt-8"> 0.025945531,</span><span | |
13306 class="cmtt-8"> </span><span | |
13307 class="cmtt-8"> </span><span | |
13308 class="cmtt-8"> 0.027631618,</span><span | |
13309 class="cmtt-8"> </span><span | |
13310 class="cmtt-8"> </span><span | |
13311 class="cmtt-8"> 0.029427276,</span> | |
13312 <br class="fancyvrb" /><a | |
13313 id="x1-125102r51"></a><span | |
13314 class="cmr-6">51</span><span | |
13315 class="cmtt-8"> </span><span | |
13316 class="cmtt-8"> </span><span | |
13317 class="cmtt-8"> </span><span | |
13318 class="cmtt-8"> 0.031339626,</span><span | |
13319 class="cmtt-8"> </span><span | |
13320 class="cmtt-8"> </span><span | |
13321 class="cmtt-8"> 0.033376252,</span><span | |
13322 class="cmtt-8"> </span><span | |
13323 class="cmtt-8"> </span><span | |
13324 class="cmtt-8"> 0.035545228,</span><span | |
13325 class="cmtt-8"> </span><span | |
13326 class="cmtt-8"> </span><span | |
13327 class="cmtt-8"> 0.037855157,</span> | |
13328 <br class="fancyvrb" /><a | |
13329 id="x1-125104r52"></a><span | |
13330 class="cmr-6">52</span><span | |
13331 class="cmtt-8"> </span><span | |
13332 class="cmtt-8"> </span><span | |
13333 class="cmtt-8"> </span><span | |
13334 class="cmtt-8"> 0.040315199,</span><span | |
13335 class="cmtt-8"> </span><span | |
13336 class="cmtt-8"> </span><span | |
13337 class="cmtt-8"> 0.042935108,</span><span | |
13338 class="cmtt-8"> </span><span | |
13339 class="cmtt-8"> </span><span | |
13340 class="cmtt-8"> 0.045725273,</span><span | |
13341 class="cmtt-8"> </span><span | |
13342 class="cmtt-8"> </span><span | |
13343 class="cmtt-8"> 0.048696758,</span> | |
13344 <br class="fancyvrb" /><a | |
13345 id="x1-125106r53"></a><span | |
13346 class="cmr-6">53</span><span | |
13347 class="cmtt-8"> </span><span | |
13348 class="cmtt-8"> </span><span | |
13349 class="cmtt-8"> </span><span | |
13350 class="cmtt-8"> 0.051861348,</span><span | |
13351 class="cmtt-8"> </span><span | |
13352 class="cmtt-8"> </span><span | |
13353 class="cmtt-8"> 0.055231591,</span><span | |
13354 class="cmtt-8"> </span><span | |
13355 class="cmtt-8"> </span><span | |
13356 class="cmtt-8"> 0.058820850,</span><span | |
13357 class="cmtt-8"> </span><span | |
13358 class="cmtt-8"> </span><span | |
13359 class="cmtt-8"> 0.062643361,</span> | |
13360 <br class="fancyvrb" /><a | |
13361 id="x1-125108r54"></a><span | |
13362 class="cmr-6">54</span><span | |
13363 class="cmtt-8"> </span><span | |
13364 class="cmtt-8"> </span><span | |
13365 class="cmtt-8"> </span><span | |
13366 class="cmtt-8"> 0.066714279,</span><span | |
13367 class="cmtt-8"> </span><span | |
13368 class="cmtt-8"> </span><span | |
13369 class="cmtt-8"> 0.071049749,</span><span | |
13370 class="cmtt-8"> </span><span | |
13371 class="cmtt-8"> </span><span | |
13372 class="cmtt-8"> 0.075666962,</span><span | |
13373 class="cmtt-8"> </span><span | |
13374 class="cmtt-8"> </span><span | |
13375 class="cmtt-8"> 0.080584227,</span> | |
13376 <br class="fancyvrb" /><a | |
13377 id="x1-125110r55"></a><span | |
13378 class="cmr-6">55</span><span | |
13379 class="cmtt-8"> </span><span | |
13380 class="cmtt-8"> </span><span | |
13381 class="cmtt-8"> </span><span | |
13382 class="cmtt-8"> 0.085821044,</span><span | |
13383 class="cmtt-8"> </span><span | |
13384 class="cmtt-8"> </span><span | |
13385 class="cmtt-8"> 0.091398179,</span><span | |
13386 class="cmtt-8"> </span><span | |
13387 class="cmtt-8"> </span><span | |
13388 class="cmtt-8"> 0.097337747,</span><span | |
13389 class="cmtt-8"> </span><span | |
13390 class="cmtt-8"> </span><span | |
13391 class="cmtt-8"> 0.10366330,</span> | |
13392 <br class="fancyvrb" /><a | |
13393 id="x1-125112r56"></a><span | |
13394 class="cmr-6">56</span><span | |
13395 class="cmtt-8"> </span><span | |
13396 class="cmtt-8"> </span><span | |
13397 class="cmtt-8"> </span><span | |
13398 class="cmtt-8"> 0.11039993,</span><span | |
13399 class="cmtt-8"> </span><span | |
13400 class="cmtt-8"> </span><span | |
13401 class="cmtt-8"> </span><span | |
13402 class="cmtt-8"> 0.11757434,</span><span | |
13403 class="cmtt-8"> </span><span | |
13404 class="cmtt-8"> </span><span | |
13405 class="cmtt-8"> </span><span | |
13406 class="cmtt-8"> 0.12521498,</span><span | |
13407 class="cmtt-8"> </span><span | |
13408 class="cmtt-8"> </span><span | |
13409 class="cmtt-8"> </span><span | |
13410 class="cmtt-8"> 0.13335215,</span> | |
13411 <br class="fancyvrb" /><a | |
13412 id="x1-125114r57"></a><span | |
13413 class="cmr-6">57</span><span | |
13414 class="cmtt-8"> </span><span | |
13415 class="cmtt-8"> </span><span | |
13416 class="cmtt-8"> </span><span | |
13417 class="cmtt-8"> 0.14201813,</span><span | |
13418 class="cmtt-8"> </span><span | |
13419 class="cmtt-8"> </span><span | |
13420 class="cmtt-8"> </span><span | |
13421 class="cmtt-8"> 0.15124727,</span><span | |
13422 class="cmtt-8"> </span><span | |
13423 class="cmtt-8"> </span><span | |
13424 class="cmtt-8"> </span><span | |
13425 class="cmtt-8"> 0.16107617,</span><span | |
13426 class="cmtt-8"> </span><span | |
13427 class="cmtt-8"> </span><span | |
13428 class="cmtt-8"> </span><span | |
13429 class="cmtt-8"> 0.17154380,</span> | |
13430 <br class="fancyvrb" /><a | |
13431 id="x1-125116r58"></a><span | |
13432 class="cmr-6">58</span><span | |
13433 class="cmtt-8"> </span><span | |
13434 class="cmtt-8"> </span><span | |
13435 class="cmtt-8"> </span><span | |
13436 class="cmtt-8"> 0.18269168,</span><span | |
13437 class="cmtt-8"> </span><span | |
13438 class="cmtt-8"> </span><span | |
13439 class="cmtt-8"> </span><span | |
13440 class="cmtt-8"> 0.19456402,</span><span | |
13441 class="cmtt-8"> </span><span | |
13442 class="cmtt-8"> </span><span | |
13443 class="cmtt-8"> </span><span | |
13444 class="cmtt-8"> 0.20720788,</span><span | |
13445 class="cmtt-8"> </span><span | |
13446 class="cmtt-8"> </span><span | |
13447 class="cmtt-8"> </span><span | |
13448 class="cmtt-8"> 0.22067342,</span> | |
13449 <br class="fancyvrb" /><a | |
13450 id="x1-125118r59"></a><span | |
13451 class="cmr-6">59</span><span | |
13452 class="cmtt-8"> </span><span | |
13453 class="cmtt-8"> </span><span | |
13454 class="cmtt-8"> </span><span | |
13455 class="cmtt-8"> 0.23501402,</span><span | |
13456 class="cmtt-8"> </span><span | |
13457 class="cmtt-8"> </span><span | |
13458 class="cmtt-8"> </span><span | |
13459 class="cmtt-8"> 0.25028656,</span><span | |
13460 class="cmtt-8"> </span><span | |
13461 class="cmtt-8"> </span><span | |
13462 class="cmtt-8"> </span><span | |
13463 class="cmtt-8"> 0.26655159,</span><span | |
13464 class="cmtt-8"> </span><span | |
13465 class="cmtt-8"> </span><span | |
13466 class="cmtt-8"> </span><span | |
13467 class="cmtt-8"> 0.28387361,</span> | |
13468 <br class="fancyvrb" /><a | |
13469 id="x1-125120r60"></a><span | |
13470 class="cmr-6">60</span><span | |
13471 class="cmtt-8"> </span><span | |
13472 class="cmtt-8"> </span><span | |
13473 class="cmtt-8"> </span><span | |
13474 class="cmtt-8"> 0.30232132,</span><span | |
13475 class="cmtt-8"> </span><span | |
13476 class="cmtt-8"> </span><span | |
13477 class="cmtt-8"> </span><span | |
13478 class="cmtt-8"> 0.32196786,</span><span | |
13479 class="cmtt-8"> </span><span | |
13480 class="cmtt-8"> </span><span | |
13481 class="cmtt-8"> </span><span | |
13482 class="cmtt-8"> 0.34289114,</span><span | |
13483 class="cmtt-8"> </span><span | |
13484 class="cmtt-8"> </span><span | |
13485 class="cmtt-8"> </span><span | |
13486 class="cmtt-8"> 0.36517414,</span> | |
13487 <br class="fancyvrb" /><a | |
13488 id="x1-125122r61"></a><span | |
13489 class="cmr-6">61</span><span | |
13490 class="cmtt-8"> </span><span | |
13491 class="cmtt-8"> </span><span | |
13492 class="cmtt-8"> </span><span | |
13493 class="cmtt-8"> 0.38890521,</span><span | |
13494 class="cmtt-8"> </span><span | |
13495 class="cmtt-8"> </span><span | |
13496 class="cmtt-8"> </span><span | |
13497 class="cmtt-8"> 0.41417847,</span><span | |
13498 class="cmtt-8"> </span><span | |
13499 class="cmtt-8"> </span><span | |
13500 class="cmtt-8"> </span><span | |
13501 class="cmtt-8"> 0.44109412,</span><span | |
13502 class="cmtt-8"> </span><span | |
13503 class="cmtt-8"> </span><span | |
13504 class="cmtt-8"> </span><span | |
13505 class="cmtt-8"> 0.46975890,</span> | |
13506 <br class="fancyvrb" /><a | |
13507 id="x1-125124r62"></a><span | |
13508 class="cmr-6">62</span><span | |
13509 class="cmtt-8"> </span><span | |
13510 class="cmtt-8"> </span><span | |
13511 class="cmtt-8"> </span><span | |
13512 class="cmtt-8"> 0.50028648,</span><span | |
13513 class="cmtt-8"> </span><span | |
13514 class="cmtt-8"> </span><span | |
13515 class="cmtt-8"> </span><span | |
13516 class="cmtt-8"> 0.53279791,</span><span | |
13517 class="cmtt-8"> </span><span | |
13518 class="cmtt-8"> </span><span | |
13519 class="cmtt-8"> </span><span | |
13520 class="cmtt-8"> 0.56742212,</span><span | |
13521 class="cmtt-8"> </span><span | |
13522 class="cmtt-8"> </span><span | |
13523 class="cmtt-8"> </span><span | |
13524 class="cmtt-8"> 0.60429640,</span> | |
13525 <br class="fancyvrb" /><a | |
13526 id="x1-125126r63"></a><span | |
13527 class="cmr-6">63</span><span | |
13528 class="cmtt-8"> </span><span | |
13529 class="cmtt-8"> </span><span | |
13530 class="cmtt-8"> </span><span | |
13531 class="cmtt-8"> 0.64356699,</span><span | |
13532 class="cmtt-8"> </span><span | |
13533 class="cmtt-8"> </span><span | |
13534 class="cmtt-8"> </span><span | |
13535 class="cmtt-8"> 0.68538959,</span><span | |
13536 class="cmtt-8"> </span><span | |
13537 class="cmtt-8"> </span><span | |
13538 class="cmtt-8"> </span><span | |
13539 class="cmtt-8"> 0.72993007,</span><span | |
13540 class="cmtt-8"> </span><span | |
13541 class="cmtt-8"> </span><span | |
13542 class="cmtt-8"> </span><span | |
13543 class="cmtt-8"> 0.77736504,</span> | |
13544 <br class="fancyvrb" /><a | |
13545 id="x1-125128r64"></a><span | |
13546 class="cmr-6">64</span><span | |
13547 class="cmtt-8"> </span><span | |
13548 class="cmtt-8"> </span><span | |
13549 class="cmtt-8"> </span><span | |
13550 class="cmtt-8"> 0.82788260,</span><span | |
13551 class="cmtt-8"> </span><span | |
13552 class="cmtt-8"> </span><span | |
13553 class="cmtt-8"> </span><span | |
13554 class="cmtt-8"> 0.88168307,</span><span | |
13555 class="cmtt-8"> </span><span | |
13556 class="cmtt-8"> </span><span | |
13557 class="cmtt-8"> </span><span | |
13558 class="cmtt-8"> 0.9389798,</span><span | |
13559 class="cmtt-8"> </span><span | |
13560 class="cmtt-8"> </span><span | |
13561 class="cmtt-8"> </span><span | |
13562 class="cmtt-8"> </span><span | |
13563 class="cmtt-8"> 1.</span> | |
13564 </div> | |
13565 | |
13566 | |
13567 | |
13568 | |
13569 | |
13570 | |
13571 <h3 class="sectionHead"><span class="titlemark">A. </span> <a | |
13572 id="x1-126000A"></a>Embedding Vorbis into an Ogg stream</h3> | |
13573 <!--l. 6--><p class="noindent" > | |
13574 <h4 class="subsectionHead"><span class="titlemark">A.1. </span> <a | |
13575 id="x1-127000A.1"></a>Overview</h4> | |
13576 <!--l. 8--><p class="noindent" >This document describes using Ogg logical and physical transport streams to encapsulate Vorbis | |
13577 compressed audio packet data into file form. | |
13578 <!--l. 12--><p class="noindent" >The <a | |
13579 href="#x1-20001">Section 1</a>, “<a | |
13580 href="#x1-20001">Introduction and Description<!--tex4ht:ref: vorbis:spec:intro --></a>” provides an overview of the construction of | |
13581 Vorbis audio packets. | |
13582 <!--l. 15--><p class="noindent" >The <a | |
13583 href="oggstream.html" >Ogg bitstream overview</a> and <a | |
13584 href="framing.html" >Ogg logical bitstream and framing spec</a> provide detailed | |
13585 descriptions of Ogg transport streams. This specification document assumes a working | |
13586 knowledge of the concepts covered in these named backround documents. Please read them | |
13587 first. | |
13588 <!--l. 22--><p class="noindent" > | |
13589 <h5 class="subsubsectionHead"><span class="titlemark">A.1.1. </span> <a | |
13590 id="x1-128000A.1.1"></a>Restrictions</h5> | |
13591 <!--l. 24--><p class="noindent" >The Ogg/Vorbis I specification currently dictates that Ogg/Vorbis streams use Ogg transport | |
13592 streams in degenerate, unmultiplexed form only. That is: | |
13593 <ul class="itemize1"> | |
13594 <li class="itemize">A meta-headerless Ogg file encapsulates the Vorbis I packets | |
13595 </li> | |
13596 <li class="itemize">The Ogg stream may be chained, i.e., contain multiple, contigous logical streams | |
13597 (links). | |
13598 </li> | |
13599 <li class="itemize">The Ogg stream must be unmultiplexed (only one stream, a Vorbis audio stream, | |
13600 per link) | |
13601 </li></ul> | |
13602 | |
13603 | |
13604 | |
13605 <!--l. 41--><p class="noindent" >This is not to say that it is not currently possible to multiplex Vorbis with other media | |
13606 types into a multi-stream Ogg file. At the time this document was written, Ogg was | |
13607 becoming a popular container for low-bitrate movies consisting of DivX video and Vorbis | |
13608 audio. However, a ’Vorbis I audio file’ is taken to imply Vorbis audio existing alone | |
13609 within a degenerate Ogg stream. A compliant ’Vorbis audio player’ is not required to | |
13610 implement Ogg support beyond the specific support of Vorbis within a degenrate Ogg | |
13611 stream (naturally, application authors are encouraged to support full multiplexed Ogg | |
13612 handling). | |
13613 <!--l. 55--><p class="noindent" > | |
13614 <h5 class="subsubsectionHead"><span class="titlemark">A.1.2. </span> <a | |
13615 id="x1-129000A.1.2"></a>MIME type</h5> | |
13616 <!--l. 57--><p class="noindent" >The MIME type of Ogg files depend on the context. Specifically, complex multimedia and | |
13617 applications should use <span | |
13618 class="cmtt-12">application/ogg</span>, while visual media should use <span | |
13619 class="cmtt-12">video/ogg</span>, and audio | |
13620 <span | |
13621 class="cmtt-12">audio/ogg</span>. Vorbis data encapsulated in Ogg may appear in any of those types. RTP | |
13622 encapsulated Vorbis should use <span | |
13623 class="cmtt-12">audio/vorbis </span>+ <span | |
13624 class="cmtt-12">audio/vorbis-config</span>. | |
13625 <!--l. 65--><p class="noindent" > | |
13626 <h4 class="subsectionHead"><span class="titlemark">A.2. </span> <a | |
13627 id="x1-130000A.2"></a>Encapsulation</h4> | |
13628 <!--l. 67--><p class="noindent" >Ogg encapsulation of a Vorbis packet stream is straightforward. | |
13629 <ul class="itemize1"> | |
13630 <li class="itemize">The first Vorbis packet (the identification header), which uniquely identifies a stream | |
13631 as Vorbis audio, is placed alone in the first page of the logical Ogg stream. This | |
13632 results in a first Ogg page of exactly 58 bytes at the very beginning of the logical | |
13633 stream. | |
13634 </li> | |
13635 <li class="itemize">This first page is marked ’beginning of stream’ in the page flags. | |
13636 </li> | |
13637 <li class="itemize">The second and third vorbis packets (comment and setup headers) may span one or | |
13638 more pages beginning on the second page of the logical stream. However many pages | |
13639 they span, the third header packet finishes the page on which it ends. The next (first | |
13640 audio) packet must begin on a fresh page. | |
13641 | |
13642 | |
13643 | |
13644 </li> | |
13645 <li class="itemize">The granule position of these first pages containing only headers is zero. | |
13646 </li> | |
13647 <li class="itemize">The first audio packet of the logical stream begins a fresh Ogg page. | |
13648 </li> | |
13649 <li class="itemize">Packets are placed into ogg pages in order until the end of stream. | |
13650 </li> | |
13651 <li class="itemize">The last page is marked ’end of stream’ in the page flags. | |
13652 </li> | |
13653 <li class="itemize">Vorbis packets may span page boundaries. | |
13654 </li> | |
13655 <li class="itemize">The granule position of pages containing Vorbis audio is in units of PCM audio | |
13656 samples (per channel; a stereo stream’s granule position does not increment at twice | |
13657 the speed of a mono stream). | |
13658 </li> | |
13659 <li class="itemize">The granule position of a page represents the end PCM sample position of the last | |
13660 packet <span | |
13661 class="cmti-12">completed </span>on that page. The ’last PCM sample’ is the last complete sample | |
13662 returned by decode, not an internal sample awaiting lapping with a subsequent block. | |
13663 A page that is entirely spanned by a single packet (that completes on a subsequent | |
13664 page) has no granule position, and the granule position is set to ’-1’. | |
13665 <!--l. 126--><p class="noindent" >Note that the last decoded (fully lapped) PCM sample from a packet is not | |
13666 necessarily the middle sample from that block. If, eg, the current Vorbis packet | |
13667 encodes a ”long block” and the next Vorbis packet encodes a ”short block”, the last | |
13668 decodable sample from the current packet be at position (3*long_block_length/4) - | |
13669 (short_block_length/4). | |
13670 </li> | |
13671 <li class="itemize">The granule (PCM) position of the first page need not indicate that the stream | |
13672 started at position zero. Although the granule position belongs to the last completed | |
13673 packet on the page and a valid granule position must be positive, by inference it may | |
13674 indicate that the PCM position of the beginning of audio is positive or negative. | |
13675 <ul class="itemize2"> | |
13676 <li class="itemize">A positive starting value simply indicates that this stream begins at some | |
13677 positive time offset, potentially within a larger program. This is a common case | |
13678 when connecting to the middle of broadcast stream. | |
13679 </li> | |
13680 <li class="itemize">A negative value indicates that output samples preceeding time zero should be | |
13681 | |
13682 | |
13683 | |
13684 discarded during decoding; this technique is used to allow sample-granularity | |
13685 editing of the stream start time of already-encoded Vorbis streams. The number | |
13686 of samples to be discarded must not exceed the overlap-add span of the first two | |
13687 audio packets. | |
13688 </li></ul> | |
13689 <!--l. 161--><p class="noindent" >In both of these cases in which the initial audio PCM starting offset is nonzero, the | |
13690 second finished audio packet must flush the page on which it appears and the | |
13691 third packet begin a fresh page. This allows the decoder to always be able to | |
13692 perform PCM position adjustments before needing to return any PCM data from | |
13693 synthesis, resulting in correct positioning information without any aditional seeking | |
13694 logic. | |
13695 <!--l. 170--><p class="noindent" ><span class="likesubparagraphHead"><a | |
13696 id="x1-131000A.2"></a><span | |
13697 class="cmbx-12">Note:</span></span> Failure to do so should, at worst, cause a decoder implementation to return | |
13698 incorrect positioning information for seeking operations at the very beginning of the | |
13699 stream. | |
13700 </li> | |
13701 <li class="itemize">A granule position on the final page in a stream that indicates less audio data than the | |
13702 final packet would normally return is used to end the stream on other than even frame | |
13703 boundaries. The difference between the actual available data returned and the | |
13704 declared amount indicates how many trailing samples to discard from the decoding | |
13705 process. | |
13706 </li></ul> | |
13707 | |
13708 | |
13709 | |
13710 <h3 class="sectionHead"><span class="titlemark">B. </span> <a | |
13711 id="x1-132000B"></a>Vorbis encapsulation in RTP</h3> | |
13712 <!--l. 8--><p class="noindent" >Please consult RFC 5215 <span | |
13713 class="cmti-12">“RTP Payload Format for Vorbis Encoded Audio” </span>for description of | |
13714 how to embed Vorbis audio in an RTP stream. | |
13715 | |
13716 | |
13717 | |
13718 | |
13719 | |
13720 | |
13721 <h3 class="likesectionHead"><a | |
13722 id="x1-133000B"></a>Colophon</h3> | |
13723 <!--l. 6--><p class="noindent" ><img | |
13724 src="Vorbis_I_spec13x.png" alt="PIC" class="graphics"><!--tex4ht:graphics | |
13725 name="Vorbis_I_spec13x.png" src="xifish.pdf" | |
13726 --> | |
13727 <!--l. 10--><p class="noindent" >Ogg is a <a | |
13728 href="http://www.xiph.org/" >Xiph.Org Foundation</a> effort to protect essential tenets of Internet multimedia from | |
13729 corporate hostage-taking; Open Source is the net’s greatest tool to keep everyone honest. See | |
13730 <a | |
13731 href="http://www.xiph.org/about.html" >About the Xiph.Org Foundation</a> for details. | |
13732 <!--l. 17--><p class="noindent" >Ogg Vorbis is the first Ogg audio CODEC. Anyone may freely use and distribute the Ogg and | |
13733 Vorbis specification, whether in a private, public or corporate capacity. However, the Xiph.Org | |
13734 Foundation and the Ogg project (xiph.org) reserve the right to set the Ogg Vorbis specification | |
13735 and certify specification compliance. | |
13736 <!--l. 23--><p class="noindent" >Xiph.Org’s Vorbis software CODEC implementation is distributed under a BSD-like license. This | |
13737 does not restrict third parties from distributing independent implementations of Vorbis software | |
13738 under other licenses. | |
13739 <!--l. 28--><p class="noindent" >Ogg, Vorbis, Xiph.Org Foundation and their logos are trademarks (tm) of the <a | |
13740 href="http://www.xiph.org/" >Xiph.Org | |
13741 Foundation</a>. These pages are copyright (C) 1994-2007 Xiph.Org Foundation. All rights | |
13742 reserved. | |
13743 <!--l. 33--><p class="noindent" >This document is set using <span class="LATEX">L<span class="A">A</span><span class="TEX">T<span | |
13744 class="E">E</span>X</span></span>. | |
13745 | |
13746 | |
13747 | |
13748 <h3 class="likesectionHead"><a | |
13749 id="x1-134000B"></a>References</h3> | |
13750 <!--l. 125--><p class="noindent" > | |
13751 <div class="thebibliography"> | |
13752 <p class="bibitem" ><span class="biblabel"> | |
13753 [1]<span class="bibsp">   </span></span><a | |
13754 id="XSporer/Brandenburg/Edler"></a>T. Sporer, K. Brandenburg and | |
13755 B. Edler, The use of multirate filter banks for coding of high quality digital audio, | |
13756 <a | |
13757 href="http://www.iocon.com/resource/docs/ps/eusipco_corrected.ps" class="url" ><span | |
13758 class="cmtt-12">http://www.iocon.com/resource/docs/ps/eusipco_corrected.ps</span></a>. | |
13759 </p> | |
13760 </div> | |
13761 | |
13762 </body></html> | |
13763 | |
13764 | |
13765 | |
13766 |