/src/libtheora/lib/huffdec.c
Line | Count | Source (jump to first uncovered line) |
1 | | /******************************************************************** |
2 | | * * |
3 | | * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * |
4 | | * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
5 | | * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
6 | | * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
7 | | * * |
8 | | * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * |
9 | | * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * |
10 | | * * |
11 | | ******************************************************************** |
12 | | |
13 | | function: |
14 | | last mod: $Id$ |
15 | | |
16 | | ********************************************************************/ |
17 | | |
18 | | #include <stdlib.h> |
19 | | #include <string.h> |
20 | | #include <ogg/ogg.h> |
21 | | #include "huffdec.h" |
22 | | #include "decint.h" |
23 | | |
24 | | |
25 | | |
26 | | /*Instead of storing every branching in the tree, subtrees can be collapsed |
27 | | into one node, with a table of size 1<<nbits pointing directly to its |
28 | | descedents nbits levels down. |
29 | | This allows more than one bit to be read at a time, and avoids following all |
30 | | the intermediate branches with next to no increased code complexity once |
31 | | the collapsed tree has been built. |
32 | | We do _not_ require that a subtree be complete to be collapsed, but instead |
33 | | store duplicate pointers in the table, and record the actual depth of the |
34 | | node below its parent. |
35 | | This tells us the number of bits to advance the stream after reaching it. |
36 | | |
37 | | This turns out to be equivalent to the method described in \cite{Hash95}, |
38 | | without the requirement that codewords be sorted by length. |
39 | | If the codewords were sorted by length (so-called ``canonical-codes''), they |
40 | | could be decoded much faster via either Lindell and Moffat's approach or |
41 | | Hashemian's Condensed Huffman Code approach, the latter of which has an |
42 | | extremely small memory footprint. |
43 | | We can't use Choueka et al.'s finite state machine approach, which is |
44 | | extremely fast, because we can't allow multiple symbols to be output at a |
45 | | time; the codebook can and does change between symbols. |
46 | | It also has very large memory requirements, which impairs cache coherency. |
47 | | |
48 | | We store the tree packed in an array of 16-bit integers (words). |
49 | | Each node consists of a single word, followed consecutively by two or more |
50 | | indices of its children. |
51 | | Let n be the value of this first word. |
52 | | This is the number of bits that need to be read to traverse the node, and |
53 | | must be positive. |
54 | | 1<<n entries follow in the array, each an index to a child node. |
55 | | If the child is positive, then it is the index of another internal node in |
56 | | the table. |
57 | | If the child is negative or zero, then it is a leaf node. |
58 | | These are stored directly in the child pointer to save space, since they only |
59 | | require a single word. |
60 | | If a leaf node would have been encountered before reading n bits, then it is |
61 | | duplicated the necessary number of times in this table. |
62 | | Leaf nodes pack both a token value and their actual depth in the tree. |
63 | | The token in the leaf node is (-leaf&255). |
64 | | The number of bits that need to be consumed to reach the leaf, starting from |
65 | | the current node, is (-leaf>>8). |
66 | | |
67 | | @ARTICLE{Hash95, |
68 | | author="Reza Hashemian", |
69 | | title="Memory Efficient and High-Speed Search {Huffman} Coding", |
70 | | journal="{IEEE} Transactions on Communications", |
71 | | volume=43, |
72 | | number=10, |
73 | | pages="2576--2581", |
74 | | month=Oct, |
75 | | year=1995 |
76 | | }*/ |
77 | | |
78 | | |
79 | | |
80 | | /*The map from external spec-defined tokens to internal tokens. |
81 | | This is constructed so that any extra bits read with the original token value |
82 | | can be masked off the least significant bits of its internal token index. |
83 | | In addition, all of the tokens which require additional extra bits are placed |
84 | | at the start of the list, and grouped by type. |
85 | | OC_DCT_REPEAT_RUN3_TOKEN is placed first, as it is an extra-special case, so |
86 | | giving it index 0 may simplify comparisons on some architectures. |
87 | | These requirements require some substantial reordering.*/ |
88 | | static const unsigned char OC_DCT_TOKEN_MAP[TH_NDCT_TOKENS]={ |
89 | | /*OC_DCT_EOB1_TOKEN (0 extra bits)*/ |
90 | | 15, |
91 | | /*OC_DCT_EOB2_TOKEN (0 extra bits)*/ |
92 | | 16, |
93 | | /*OC_DCT_EOB3_TOKEN (0 extra bits)*/ |
94 | | 17, |
95 | | /*OC_DCT_REPEAT_RUN0_TOKEN (2 extra bits)*/ |
96 | | 88, |
97 | | /*OC_DCT_REPEAT_RUN1_TOKEN (3 extra bits)*/ |
98 | | 80, |
99 | | /*OC_DCT_REPEAT_RUN2_TOKEN (4 extra bits)*/ |
100 | | 1, |
101 | | /*OC_DCT_REPEAT_RUN3_TOKEN (12 extra bits)*/ |
102 | | 0, |
103 | | /*OC_DCT_SHORT_ZRL_TOKEN (3 extra bits)*/ |
104 | | 48, |
105 | | /*OC_DCT_ZRL_TOKEN (6 extra bits)*/ |
106 | | 14, |
107 | | /*OC_ONE_TOKEN (0 extra bits)*/ |
108 | | 56, |
109 | | /*OC_MINUS_ONE_TOKEN (0 extra bits)*/ |
110 | | 57, |
111 | | /*OC_TWO_TOKEN (0 extra bits)*/ |
112 | | 58, |
113 | | /*OC_MINUS_TWO_TOKEN (0 extra bits)*/ |
114 | | 59, |
115 | | /*OC_DCT_VAL_CAT2 (1 extra bit)*/ |
116 | | 60, |
117 | | 62, |
118 | | 64, |
119 | | 66, |
120 | | /*OC_DCT_VAL_CAT3 (2 extra bits)*/ |
121 | | 68, |
122 | | /*OC_DCT_VAL_CAT4 (3 extra bits)*/ |
123 | | 72, |
124 | | /*OC_DCT_VAL_CAT5 (4 extra bits)*/ |
125 | | 2, |
126 | | /*OC_DCT_VAL_CAT6 (5 extra bits)*/ |
127 | | 4, |
128 | | /*OC_DCT_VAL_CAT7 (6 extra bits)*/ |
129 | | 6, |
130 | | /*OC_DCT_VAL_CAT8 (10 extra bits)*/ |
131 | | 8, |
132 | | /*OC_DCT_RUN_CAT1A (1 extra bit)*/ |
133 | | 18, |
134 | | 20, |
135 | | 22, |
136 | | 24, |
137 | | 26, |
138 | | /*OC_DCT_RUN_CAT1B (3 extra bits)*/ |
139 | | 32, |
140 | | /*OC_DCT_RUN_CAT1C (4 extra bits)*/ |
141 | | 12, |
142 | | /*OC_DCT_RUN_CAT2A (2 extra bits)*/ |
143 | | 28, |
144 | | /*OC_DCT_RUN_CAT2B (3 extra bits)*/ |
145 | | 40 |
146 | | }; |
147 | | |
148 | | /*The log base 2 of number of internal tokens associated with each of the spec |
149 | | tokens (i.e., how many of the extra bits are folded into the token value). |
150 | | Increasing the maximum value beyond 3 will enlarge the amount of stack |
151 | | required for tree construction.*/ |
152 | | static const unsigned char OC_DCT_TOKEN_MAP_LOG_NENTRIES[TH_NDCT_TOKENS]={ |
153 | | 0,0,0,2,3,0,0,3,0,0,0,0,0,1,1,1,1,2,3,1,1,1,2,1,1,1,1,1,3,1,2,3 |
154 | | }; |
155 | | |
156 | | |
157 | | /*The size a lookup table is allowed to grow to relative to the number of |
158 | | unique nodes it contains. |
159 | | E.g., if OC_HUFF_SLUSH is 4, then at most 75% of the space in the tree is |
160 | | wasted (1/4 of the space must be used). |
161 | | Larger numbers can decode tokens with fewer read operations, while smaller |
162 | | numbers may save more space. |
163 | | With a sample file: |
164 | | 32233473 read calls are required when no tree collapsing is done (100.0%). |
165 | | 19269269 read calls are required when OC_HUFF_SLUSH is 1 (59.8%). |
166 | | 11144969 read calls are required when OC_HUFF_SLUSH is 2 (34.6%). |
167 | | 10538563 read calls are required when OC_HUFF_SLUSH is 4 (32.7%). |
168 | | 10192578 read calls are required when OC_HUFF_SLUSH is 8 (31.6%). |
169 | | Since a value of 2 gets us the vast majority of the speed-up with only a |
170 | | small amount of wasted memory, this is what we use. |
171 | | This value must be less than 128, or you could create a tree with more than |
172 | | 32767 entries, which would overflow the 16-bit words used to index it.*/ |
173 | 5.60k | #define OC_HUFF_SLUSH (2) |
174 | | /*The root of the tree is on the fast path, and a larger value here is more |
175 | | beneficial than elsewhere in the tree. |
176 | | 7 appears to give the best performance, trading off between increased use of |
177 | | the single-read fast path and cache footprint for the tables, though |
178 | | obviously this will depend on your cache size. |
179 | | Using 7 here, the VP3 tables are about twice as large compared to using 2.*/ |
180 | 367k | #define OC_ROOT_HUFF_SLUSH (7) |
181 | | |
182 | | |
183 | | |
184 | | /*Unpacks a Huffman codebook. |
185 | | _opb: The buffer to unpack from. |
186 | | _tokens: Stores a list of internal tokens, in the order they were found in |
187 | | the codebook, and the lengths of their corresponding codewords. |
188 | | This is enough to completely define the codebook, while minimizing |
189 | | stack usage and avoiding temporary allocations (for platforms |
190 | | where free() is a no-op). |
191 | | Return: The number of internal tokens in the codebook, or a negative value |
192 | | on error.*/ |
193 | 90.7k | int oc_huff_tree_unpack(oc_pack_buf *_opb,unsigned char _tokens[256][2]){ |
194 | 90.7k | ogg_uint32_t code; |
195 | 90.7k | int len; |
196 | 90.7k | int ntokens; |
197 | 90.7k | int nleaves; |
198 | 90.7k | code=0; |
199 | 90.7k | len=ntokens=nleaves=0; |
200 | 100k | for(;;){ |
201 | 100k | long bits; |
202 | 100k | bits=oc_pack_read1(_opb); |
203 | | /*Only process nodes so long as there's more bits in the buffer.*/ |
204 | 100k | if(oc_pack_bytes_left(_opb)<0)return TH_EBADHEADER; |
205 | | /*Read an internal node:*/ |
206 | 99.8k | if(!bits){ |
207 | 5.12k | len++; |
208 | | /*Don't allow codewords longer than 32 bits.*/ |
209 | 5.12k | if(len>32)return TH_EBADHEADER; |
210 | 5.12k | } |
211 | | /*Read a leaf node:*/ |
212 | 94.6k | else{ |
213 | 94.6k | ogg_uint32_t code_bit; |
214 | 94.6k | int neb; |
215 | 94.6k | int nentries; |
216 | 94.6k | int token; |
217 | | /*Don't allow more than 32 spec-tokens per codebook.*/ |
218 | 94.6k | if(++nleaves>32)return TH_EBADHEADER; |
219 | 94.6k | bits=oc_pack_read(_opb,OC_NDCT_TOKEN_BITS); |
220 | 94.6k | neb=OC_DCT_TOKEN_MAP_LOG_NENTRIES[bits]; |
221 | 94.6k | token=OC_DCT_TOKEN_MAP[bits]; |
222 | 94.6k | nentries=1<<neb; |
223 | 485k | while(nentries-->0){ |
224 | 390k | _tokens[ntokens][0]=(unsigned char)token++; |
225 | 390k | _tokens[ntokens][1]=(unsigned char)(len+neb); |
226 | 390k | ntokens++; |
227 | 390k | } |
228 | 94.6k | code_bit=0x80000000U>>len-1; |
229 | 98.6k | while(len>0&&(code&code_bit)){ |
230 | 4.00k | code^=code_bit; |
231 | 4.00k | code_bit<<=1; |
232 | 4.00k | len--; |
233 | 4.00k | } |
234 | 94.6k | if(len<=0)break; |
235 | 4.18k | code|=code_bit; |
236 | 4.18k | } |
237 | 99.8k | } |
238 | 90.5k | return ntokens; |
239 | 90.7k | } |
240 | | |
241 | | /*Count how many tokens would be required to fill a subtree at depth _depth. |
242 | | _tokens: A list of internal tokens, in the order they are found in the |
243 | | codebook, and the lengths of their corresponding codewords. |
244 | | _depth: The depth of the desired node in the corresponding tree structure. |
245 | | Return: The number of tokens that belong to that subtree.*/ |
246 | 291k | static int oc_huff_subtree_tokens(unsigned char _tokens[][2],int _depth){ |
247 | 291k | ogg_uint32_t code; |
248 | 291k | int ti; |
249 | 291k | code=0; |
250 | 291k | ti=0; |
251 | 814k | do{ |
252 | 814k | if(_tokens[ti][1]-_depth<32)code+=0x80000000U>>_tokens[ti++][1]-_depth; |
253 | 72 | else{ |
254 | | /*Because of the expanded internal tokens, we can have codewords as long |
255 | | as 35 bits. |
256 | | A single recursion here is enough to advance past them.*/ |
257 | 72 | code++; |
258 | 72 | ti+=oc_huff_subtree_tokens(_tokens+ti,_depth+31); |
259 | 72 | } |
260 | 814k | } |
261 | 814k | while(code<0x80000000U); |
262 | 291k | return ti; |
263 | 291k | } |
264 | | |
265 | | /*Compute the number of bits to use for a collapsed tree node at the given |
266 | | depth. |
267 | | _tokens: A list of internal tokens, in the order they are found in the |
268 | | codebook, and the lengths of their corresponding codewords. |
269 | | _ntokens: The number of tokens corresponding to this tree node. |
270 | | _depth: The depth of this tree node. |
271 | | Return: The number of bits to use for a collapsed tree node rooted here. |
272 | | This is always at least one, even if this was a leaf node.*/ |
273 | | static int oc_huff_tree_collapse_depth(unsigned char _tokens[][2], |
274 | 186k | int _ntokens,int _depth){ |
275 | 186k | int got_leaves; |
276 | 186k | int loccupancy; |
277 | 186k | int occupancy; |
278 | 186k | int slush; |
279 | 186k | int nbits; |
280 | 186k | int best_nbits; |
281 | 186k | slush=_depth>0?OC_HUFF_SLUSH:OC_ROOT_HUFF_SLUSH; |
282 | | /*It's legal to have a tree with just a single node, which requires no bits |
283 | | to decode and always returns the same token. |
284 | | However, no encoder actually does this (yet). |
285 | | To avoid a special case in oc_huff_token_decode(), we force the number of |
286 | | lookahead bits to be at least one. |
287 | | This will produce a tree that looks ahead one bit and then advances the |
288 | | stream zero bits.*/ |
289 | 186k | nbits=1; |
290 | 186k | occupancy=2; |
291 | 186k | got_leaves=1; |
292 | 338k | do{ |
293 | 338k | int ti; |
294 | 338k | if(got_leaves)best_nbits=nbits; |
295 | 338k | nbits++; |
296 | 338k | got_leaves=0; |
297 | 338k | loccupancy=occupancy; |
298 | 2.04M | for(occupancy=ti=0;ti<_ntokens;occupancy++){ |
299 | 1.70M | if(_tokens[ti][1]<_depth+nbits)ti++; |
300 | 901k | else if(_tokens[ti][1]==_depth+nbits){ |
301 | 615k | got_leaves=1; |
302 | 615k | ti++; |
303 | 615k | } |
304 | 285k | else ti+=oc_huff_subtree_tokens(_tokens+ti,_depth+nbits); |
305 | 1.70M | } |
306 | 338k | } |
307 | 338k | while(occupancy>loccupancy&&occupancy*slush>=1<<nbits); |
308 | 186k | return best_nbits; |
309 | 186k | } |
310 | | |
311 | | /*Determines the size in words of a Huffman tree node that represents a |
312 | | subtree of depth _nbits. |
313 | | _nbits: The depth of the subtree. |
314 | | This must be greater than zero. |
315 | | Return: The number of words required to store the node.*/ |
316 | 274k | static size_t oc_huff_node_size(int _nbits){ |
317 | 274k | return 1+(1<<_nbits); |
318 | 274k | } |
319 | | |
320 | | /*Produces a collapsed-tree representation of the given token list. |
321 | | _tree: The storage for the collapsed Huffman tree. |
322 | | This may be NULL to compute the required storage size instead of |
323 | | constructing the tree. |
324 | | _tokens: A list of internal tokens, in the order they are found in the |
325 | | codebook, and the lengths of their corresponding codewords. |
326 | | _ntokens: The number of tokens corresponding to this tree node. |
327 | | Return: The number of words required to store the tree.*/ |
328 | | static size_t oc_huff_tree_collapse(ogg_int16_t *_tree, |
329 | 181k | unsigned char _tokens[][2],int _ntokens){ |
330 | 181k | ogg_int16_t node[34]; |
331 | 181k | unsigned char depth[34]; |
332 | 181k | unsigned char last[34]; |
333 | 181k | size_t ntree; |
334 | 181k | int ti; |
335 | 181k | int l; |
336 | 181k | depth[0]=0; |
337 | 181k | last[0]=(unsigned char)(_ntokens-1); |
338 | 181k | ntree=0; |
339 | 181k | ti=0; |
340 | 181k | l=0; |
341 | 186k | do{ |
342 | 186k | int nbits; |
343 | 186k | nbits=oc_huff_tree_collapse_depth(_tokens+ti,last[l]+1-ti,depth[l]); |
344 | 186k | node[l]=(ogg_int16_t)ntree; |
345 | 186k | ntree+=oc_huff_node_size(nbits); |
346 | 186k | if(_tree!=NULL)_tree[node[l]++]=(ogg_int16_t)nbits; |
347 | 192k | do{ |
348 | 968k | while(ti<=last[l]&&_tokens[ti][1]<=depth[l]+nbits){ |
349 | 776k | if(_tree!=NULL){ |
350 | 388k | ogg_int16_t leaf; |
351 | 388k | int nentries; |
352 | 388k | nentries=1<<depth[l]+nbits-_tokens[ti][1]; |
353 | 388k | leaf=(ogg_int16_t)-(_tokens[ti][1]-depth[l]<<8|_tokens[ti][0]); |
354 | 828k | while(nentries-->0)_tree[node[l]++]=leaf; |
355 | 388k | } |
356 | 776k | ti++; |
357 | 776k | } |
358 | 192k | if(ti<=last[l]){ |
359 | | /*We need to recurse*/ |
360 | 5.60k | depth[l+1]=(unsigned char)(depth[l]+nbits); |
361 | 5.60k | if(_tree!=NULL)_tree[node[l]++]=(ogg_int16_t)ntree; |
362 | 5.60k | l++; |
363 | 5.60k | last[l]= |
364 | 5.60k | (unsigned char)(ti+oc_huff_subtree_tokens(_tokens+ti,depth[l])-1); |
365 | 5.60k | break; |
366 | 5.60k | } |
367 | | /*Pop back up a level of recursion.*/ |
368 | 186k | else if(l-->0)nbits=depth[l+1]-depth[l]; |
369 | 192k | } |
370 | 186k | while(l>=0); |
371 | 186k | } |
372 | 186k | while(l>=0); |
373 | 0 | return ntree; |
374 | 181k | } |
375 | | |
376 | | /*Unpacks a set of Huffman trees, and reduces them to a collapsed |
377 | | representation. |
378 | | _opb: The buffer to unpack the trees from. |
379 | | _nodes: The table to fill with the Huffman trees. |
380 | | Return: 0 on success, or a negative value on error. |
381 | | The caller is responsible for cleaning up any partially initialized |
382 | | _nodes on failure.*/ |
383 | | int oc_huff_trees_unpack(oc_pack_buf *_opb, |
384 | 1.32k | ogg_int16_t *_nodes[TH_NHUFFMAN_TABLES]){ |
385 | 1.32k | int i; |
386 | 91.8k | for(i=0;i<TH_NHUFFMAN_TABLES;i++){ |
387 | 90.7k | unsigned char tokens[256][2]; |
388 | 90.7k | int ntokens; |
389 | 90.7k | ogg_int16_t *tree; |
390 | 90.7k | size_t size; |
391 | | /*Unpack the full tree into a temporary buffer.*/ |
392 | 90.7k | ntokens=oc_huff_tree_unpack(_opb,tokens); |
393 | 90.7k | if(ntokens<0)return ntokens; |
394 | | /*Figure out how big the collapsed tree will be and allocate space for it.*/ |
395 | 90.5k | size=oc_huff_tree_collapse(NULL,tokens,ntokens); |
396 | | /*This should never happen; if it does it means you set OC_HUFF_SLUSH or |
397 | | OC_ROOT_HUFF_SLUSH too large.*/ |
398 | 90.5k | if(size>32767)return TH_EIMPL; |
399 | 90.5k | tree=(ogg_int16_t *)_ogg_malloc(size*sizeof(*tree)); |
400 | 90.5k | if(tree==NULL)return TH_EFAULT; |
401 | | /*Construct the collapsed the tree.*/ |
402 | 90.5k | oc_huff_tree_collapse(tree,tokens,ntokens); |
403 | 90.5k | _nodes[i]=tree; |
404 | 90.5k | } |
405 | 1.11k | return 0; |
406 | 1.32k | } |
407 | | |
408 | | /*Determines the size in words of a Huffman subtree. |
409 | | _tree: The complete Huffman tree. |
410 | | _node: The index of the root of the desired subtree. |
411 | | Return: The number of words required to store the tree.*/ |
412 | 87.5k | static size_t oc_huff_tree_size(const ogg_int16_t *_tree,int _node){ |
413 | 87.5k | size_t size; |
414 | 87.5k | int nchildren; |
415 | 87.5k | int n; |
416 | 87.5k | int i; |
417 | 87.5k | n=_tree[_node]; |
418 | 87.5k | size=oc_huff_node_size(n); |
419 | 87.5k | nchildren=1<<n; |
420 | 87.5k | i=0; |
421 | 360k | do{ |
422 | 360k | int child; |
423 | 360k | child=_tree[_node+i+1]; |
424 | 360k | if(child<=0)i+=1<<n-(-child>>8); |
425 | 1.42k | else{ |
426 | 1.42k | size+=oc_huff_tree_size(_tree,child); |
427 | 1.42k | i++; |
428 | 1.42k | } |
429 | 360k | } |
430 | 360k | while(i<nchildren); |
431 | 87.5k | return size; |
432 | 87.5k | } |
433 | | |
434 | | /*Makes a copy of the given set of Huffman trees. |
435 | | _dst: The array to store the copy in. |
436 | | _src: The array of trees to copy.*/ |
437 | | int oc_huff_trees_copy(ogg_int16_t *_dst[TH_NHUFFMAN_TABLES], |
438 | 1.07k | const ogg_int16_t *const _src[TH_NHUFFMAN_TABLES]){ |
439 | 1.07k | int total; |
440 | 1.07k | int i; |
441 | 1.07k | total=0; |
442 | 87.2k | for(i=0;i<TH_NHUFFMAN_TABLES;i++){ |
443 | 86.1k | size_t size; |
444 | 86.1k | size=oc_huff_tree_size(_src[i],0); |
445 | 86.1k | total+=size; |
446 | 86.1k | _dst[i]=(ogg_int16_t *)_ogg_malloc(size*sizeof(*_dst[i])); |
447 | 86.1k | if(_dst[i]==NULL){ |
448 | 0 | while(i-->0)_ogg_free(_dst[i]); |
449 | 0 | return TH_EFAULT; |
450 | 0 | } |
451 | 86.1k | memcpy(_dst[i],_src[i],size*sizeof(*_dst[i])); |
452 | 86.1k | } |
453 | 1.07k | return 0; |
454 | 1.07k | } |
455 | | |
456 | | /*Frees the memory used by a set of Huffman trees. |
457 | | _nodes: The array of trees to free.*/ |
458 | 2.42k | void oc_huff_trees_clear(ogg_int16_t *_nodes[TH_NHUFFMAN_TABLES]){ |
459 | 2.42k | int i; |
460 | 196k | for(i=0;i<TH_NHUFFMAN_TABLES;i++)_ogg_free(_nodes[i]); |
461 | 2.42k | } |
462 | | |
463 | | |
464 | | /*Unpacks a single token using the given Huffman tree. |
465 | | _opb: The buffer to unpack the token from. |
466 | | _node: The tree to unpack the token with. |
467 | | Return: The token value.*/ |
468 | 90.2M | int oc_huff_token_decode_c(oc_pack_buf *_opb,const ogg_int16_t *_tree){ |
469 | 90.2M | const unsigned char *ptr; |
470 | 90.2M | const unsigned char *stop; |
471 | 90.2M | oc_pb_window window; |
472 | 90.2M | int available; |
473 | 90.2M | long bits; |
474 | 90.2M | int node; |
475 | 90.2M | int n; |
476 | 90.2M | ptr=_opb->ptr; |
477 | 90.2M | window=_opb->window; |
478 | 90.2M | stop=_opb->stop; |
479 | 90.2M | available=_opb->bits; |
480 | 90.2M | node=0; |
481 | 90.2M | for(;;){ |
482 | 90.2M | n=_tree[node]; |
483 | 90.2M | if(n>available){ |
484 | 5.36k | unsigned shift; |
485 | 5.36k | shift=OC_PB_WINDOW_SIZE-available; |
486 | 39.2k | do{ |
487 | | /*We don't bother setting eof because we won't check for it after we've |
488 | | started decoding DCT tokens.*/ |
489 | 39.2k | if(ptr>=stop){ |
490 | 268 | shift=(unsigned)-OC_LOTS_OF_BITS; |
491 | 268 | break; |
492 | 268 | } |
493 | 39.0k | shift-=8; |
494 | 39.0k | window|=(oc_pb_window)*ptr++<<shift; |
495 | 39.0k | } |
496 | 39.0k | while(shift>=8); |
497 | | /*Note: We never request more than 24 bits, so there's no need to fill in |
498 | | the last partial byte here.*/ |
499 | 5.36k | available=OC_PB_WINDOW_SIZE-shift; |
500 | 5.36k | } |
501 | 90.2M | bits=window>>OC_PB_WINDOW_SIZE-n; |
502 | 90.2M | node=_tree[node+1+bits]; |
503 | 90.2M | if(node<=0)break; |
504 | 73.5k | window<<=n; |
505 | 73.5k | available-=n; |
506 | 73.5k | } |
507 | 90.2M | node=-node; |
508 | 90.2M | n=node>>8; |
509 | 90.2M | window<<=n; |
510 | 90.2M | available-=n; |
511 | 90.2M | _opb->ptr=ptr; |
512 | 90.2M | _opb->window=window; |
513 | 90.2M | _opb->bits=available; |
514 | 90.2M | return node&255; |
515 | 90.2M | } |