Coverage Report

Created: 2026-08-14 07:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vlc/contrib/contrib-build/libtheora/lib/huffdec.c
Line
Count
Source
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,2025           *
9
 * by the Xiph.Org Foundation and contributors                      *
10
 * https://www.xiph.org/                                            *
11
 *                                                                  *
12
 ********************************************************************
13
14
  function:
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
734k
#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
869k
#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
33.8k
int oc_huff_tree_unpack(oc_pack_buf *_opb,unsigned char _tokens[256][2]){
194
33.8k
  ogg_uint32_t code;
195
33.8k
  int          len;
196
33.8k
  int          ntokens;
197
33.8k
  int          nleaves;
198
33.8k
  code=0;
199
33.8k
  len=ntokens=nleaves=0;
200
2.08M
  for(;;){
201
2.08M
    long bits;
202
2.08M
    bits=oc_pack_read1(_opb);
203
    /*Only process nodes so long as there's more bits in the buffer.*/
204
2.08M
    if(oc_pack_bytes_left(_opb)<0)return TH_EBADHEADER;
205
    /*Read an internal node:*/
206
2.08M
    if(!bits){
207
1.02M
      len++;
208
      /*Don't allow codewords longer than 32 bits.*/
209
1.02M
      if(len>32)return TH_EBADHEADER;
210
1.02M
    }
211
    /*Read a leaf node:*/
212
1.05M
    else{
213
1.05M
      ogg_uint32_t code_bit;
214
1.05M
      int          neb;
215
1.05M
      int          nentries;
216
1.05M
      int          token;
217
      /*Don't allow more than 32 spec-tokens per codebook.*/
218
1.05M
      if(++nleaves>32)return TH_EBADHEADER;
219
1.05M
      bits=oc_pack_read(_opb,OC_NDCT_TOKEN_BITS);
220
1.05M
      neb=OC_DCT_TOKEN_MAP_LOG_NENTRIES[bits];
221
1.05M
      token=OC_DCT_TOKEN_MAP[bits];
222
1.05M
      nentries=1<<neb;
223
4.10M
      while(nentries-->0){
224
3.04M
        _tokens[ntokens][0]=(unsigned char)token++;
225
3.04M
        _tokens[ntokens][1]=(unsigned char)(len+neb);
226
3.04M
        ntokens++;
227
3.04M
      }
228
1.05M
      if(len<=0)break;
229
1.05M
      code_bit=0x80000000U>>len-1;
230
2.08M
      while(len>0&&(code&code_bit)){
231
1.02M
        code^=code_bit;
232
1.02M
        code_bit<<=1;
233
1.02M
        len--;
234
1.02M
      }
235
1.05M
      if(len<=0)break;
236
1.02M
      code|=code_bit;
237
1.02M
    }
238
2.08M
  }
239
33.8k
  return ntokens;
240
33.8k
}
241
242
/*Count how many tokens would be required to fill a subtree at depth _depth.
243
  _tokens: A list of internal tokens, in the order they are found in the
244
            codebook, and the lengths of their corresponding codewords.
245
  _depth:  The depth of the desired node in the corresponding tree structure.
246
  Return: The number of tokens that belong to that subtree.*/
247
6.59M
static int oc_huff_subtree_tokens(unsigned char _tokens[][2],int _depth){
248
6.59M
  ogg_uint32_t code;
249
6.59M
  int          ti;
250
6.59M
  code=0;
251
6.59M
  ti=0;
252
47.8M
  do{
253
47.8M
    if(_tokens[ti][1]-_depth<32)code+=0x80000000U>>_tokens[ti++][1]-_depth;
254
0
    else{
255
      /*Because of the expanded internal tokens, we can have codewords as long
256
         as 35 bits.
257
        A single recursion here is enough to advance past them.*/
258
0
      code++;
259
0
      ti+=oc_huff_subtree_tokens(_tokens+ti,_depth+31);
260
0
    }
261
47.8M
  }
262
47.8M
  while(code<0x80000000U);
263
6.59M
  return ti;
264
6.59M
}
265
266
/*Compute the number of bits to use for a collapsed tree node at the given
267
   depth.
268
  _tokens:  A list of internal tokens, in the order they are found in the
269
             codebook, and the lengths of their corresponding codewords.
270
  _ntokens: The number of tokens corresponding to this tree node.
271
  _depth:   The depth of this tree node.
272
  Return: The number of bits to use for a collapsed tree node rooted here.
273
          This is always at least one, even if this was a leaf node.*/
274
static int oc_huff_tree_collapse_depth(unsigned char _tokens[][2],
275
801k
 int _ntokens,int _depth){
276
801k
  int got_leaves;
277
801k
  int loccupancy;
278
801k
  int occupancy;
279
801k
  int slush;
280
801k
  int nbits;
281
801k
  int best_nbits;
282
801k
  slush=_depth>0?OC_HUFF_SLUSH:OC_ROOT_HUFF_SLUSH;
283
  /*It's legal to have a tree with just a single node, which requires no bits
284
     to decode and always returns the same token.
285
    However, no encoder actually does this (yet).
286
    To avoid a special case in oc_huff_token_decode(), we force the number of
287
     lookahead bits to be at least one.
288
    This will produce a tree that looks ahead one bit and then advances the
289
     stream zero bits.*/
290
801k
  nbits=1;
291
801k
  occupancy=2;
292
801k
  got_leaves=1;
293
1.89M
  do{
294
1.89M
    int ti;
295
1.89M
    if(got_leaves)best_nbits=nbits;
296
1.89M
    nbits++;
297
1.89M
    got_leaves=0;
298
1.89M
    loccupancy=occupancy;
299
26.0M
    for(occupancy=ti=0;ti<_ntokens;occupancy++){
300
24.1M
      if(_tokens[ti][1]<_depth+nbits)ti++;
301
12.0M
      else if(_tokens[ti][1]==_depth+nbits){
302
6.16M
        got_leaves=1;
303
6.16M
        ti++;
304
6.16M
      }
305
5.85M
      else ti+=oc_huff_subtree_tokens(_tokens+ti,_depth+nbits);
306
24.1M
    }
307
1.89M
  }
308
1.89M
  while(occupancy>loccupancy&&occupancy*slush>=1<<nbits);
309
801k
  return best_nbits;
310
801k
}
311
312
/*Determines the size in words of a Huffman tree node that represents a
313
   subtree of depth _nbits.
314
  _nbits: The depth of the subtree.
315
          This must be greater than zero.
316
  Return: The number of words required to store the node.*/
317
994k
static size_t oc_huff_node_size(int _nbits){
318
994k
  return 1+(1<<_nbits);
319
994k
}
320
321
/*Produces a collapsed-tree representation of the given token list.
322
  _tree: The storage for the collapsed Huffman tree.
323
         This may be NULL to compute the required storage size instead of
324
          constructing the tree.
325
  _tokens:  A list of internal tokens, in the order they are found in the
326
             codebook, and the lengths of their corresponding codewords.
327
  _ntokens: The number of tokens corresponding to this tree node.
328
  Return: The number of words required to store the tree.*/
329
static size_t oc_huff_tree_collapse(ogg_int16_t *_tree,
330
67.6k
 unsigned char _tokens[][2],int _ntokens){
331
67.6k
  ogg_int16_t   node[34];
332
67.6k
  unsigned char depth[34];
333
67.6k
  unsigned char last[34];
334
67.6k
  size_t        ntree;
335
67.6k
  int           ti;
336
67.6k
  int           l;
337
67.6k
  depth[0]=0;
338
67.6k
  last[0]=(unsigned char)(_ntokens-1);
339
67.6k
  ntree=0;
340
67.6k
  ti=0;
341
67.6k
  l=0;
342
801k
  do{
343
801k
    int nbits;
344
801k
    nbits=oc_huff_tree_collapse_depth(_tokens+ti,last[l]+1-ti,depth[l]);
345
801k
    node[l]=(ogg_int16_t)ntree;
346
801k
    ntree+=oc_huff_node_size(nbits);
347
801k
    if(_tree!=NULL)_tree[node[l]++]=(ogg_int16_t)nbits;
348
1.53M
    do{
349
7.61M
      while(ti<=last[l]&&_tokens[ti][1]<=depth[l]+nbits){
350
6.08M
        if(_tree!=NULL){
351
3.04M
          ogg_int16_t leaf;
352
3.04M
          int         nentries;
353
3.04M
          nentries=1<<depth[l]+nbits-_tokens[ti][1];
354
3.04M
          leaf=(ogg_int16_t)-(_tokens[ti][1]-depth[l]<<8|_tokens[ti][0]);
355
14.4M
          while(nentries-->0)_tree[node[l]++]=leaf;
356
3.04M
        }
357
6.08M
        ti++;
358
6.08M
      }
359
1.53M
      if(ti<=last[l]){
360
        /*We need to recurse*/
361
734k
        depth[l+1]=(unsigned char)(depth[l]+nbits);
362
734k
        if(_tree!=NULL)_tree[node[l]++]=(ogg_int16_t)ntree;
363
734k
        l++;
364
734k
        last[l]=
365
734k
         (unsigned char)(ti+oc_huff_subtree_tokens(_tokens+ti,depth[l])-1);
366
734k
        break;
367
734k
      }
368
      /*Pop back up a level of recursion.*/
369
801k
      else if(l-->0)nbits=depth[l+1]-depth[l];
370
1.53M
    }
371
801k
    while(l>=0);
372
801k
  }
373
801k
  while(l>=0);
374
67.6k
  return ntree;
375
67.6k
}
376
377
/*Unpacks a set of Huffman trees, and reduces them to a collapsed
378
   representation.
379
  _opb:   The buffer to unpack the trees from.
380
  _nodes: The table to fill with the Huffman trees.
381
  Return: 0 on success, or a negative value on error.
382
          The caller is responsible for cleaning up any partially initialized
383
           _nodes on failure.*/
384
int oc_huff_trees_unpack(oc_pack_buf *_opb,
385
433
 ogg_int16_t *_nodes[TH_NHUFFMAN_TABLES]){
386
433
  int i;
387
34.2k
  for(i=0;i<TH_NHUFFMAN_TABLES;i++){
388
33.8k
    unsigned char  tokens[256][2];
389
33.8k
    int            ntokens;
390
33.8k
    ogg_int16_t   *tree;
391
33.8k
    size_t         size;
392
    /*Unpack the full tree into a temporary buffer.*/
393
33.8k
    ntokens=oc_huff_tree_unpack(_opb,tokens);
394
33.8k
    if(ntokens<0)return ntokens;
395
    /*Figure out how big the collapsed tree will be and allocate space for it.*/
396
33.8k
    size=oc_huff_tree_collapse(NULL,tokens,ntokens);
397
    /*This should never happen; if it does it means you set OC_HUFF_SLUSH or
398
       OC_ROOT_HUFF_SLUSH too large.*/
399
33.8k
    if(size>32767)return TH_EIMPL;
400
33.8k
    tree=(ogg_int16_t *)_ogg_malloc(size*sizeof(*tree));
401
33.8k
    if(tree==NULL)return TH_EFAULT;
402
    /*Construct the collapsed the tree.*/
403
33.8k
    oc_huff_tree_collapse(tree,tokens,ntokens);
404
33.8k
    _nodes[i]=tree;
405
33.8k
  }
406
414
  return 0;
407
433
}
408
409
/*Determines the size in words of a Huffman subtree.
410
  _tree: The complete Huffman tree.
411
  _node: The index of the root of the desired subtree.
412
  Return: The number of words required to store the tree.*/
413
192k
static size_t oc_huff_tree_size(const ogg_int16_t *_tree,int _node){
414
192k
  size_t size;
415
192k
  int    nchildren;
416
192k
  int    n;
417
192k
  int    i;
418
192k
  n=_tree[_node];
419
192k
  size=oc_huff_node_size(n);
420
192k
  nchildren=1<<n;
421
192k
  i=0;
422
1.63M
  do{
423
1.63M
    int child;
424
1.63M
    child=_tree[_node+i+1];
425
1.63M
    if(child<=0)i+=1<<n-(-child>>8);
426
176k
    else{
427
176k
      size+=oc_huff_tree_size(_tree,child);
428
176k
      i++;
429
176k
    }
430
1.63M
  }
431
1.63M
  while(i<nchildren);
432
192k
  return size;
433
192k
}
434
435
/*Makes a copy of the given set of Huffman trees.
436
  _dst: The array to store the copy in.
437
  _src: The array of trees to copy.*/
438
int oc_huff_trees_copy(ogg_int16_t *_dst[TH_NHUFFMAN_TABLES],
439
203
 const ogg_int16_t *const _src[TH_NHUFFMAN_TABLES]){
440
203
  int i;
441
16.4k
  for(i=0;i<TH_NHUFFMAN_TABLES;i++){
442
16.2k
    size_t size;
443
16.2k
    size=oc_huff_tree_size(_src[i],0);
444
16.2k
    _dst[i]=(ogg_int16_t *)_ogg_malloc(size*sizeof(*_dst[i]));
445
16.2k
    if(_dst[i]==NULL){
446
0
      while(i-->0)_ogg_free(_dst[i]);
447
0
      return TH_EFAULT;
448
0
    }
449
16.2k
    memcpy(_dst[i],_src[i],size*sizeof(*_dst[i]));
450
16.2k
  }
451
203
  return 0;
452
203
}
453
454
/*Frees the memory used by a set of Huffman trees.
455
  _nodes: The array of trees to free.*/
456
640
void oc_huff_trees_clear(ogg_int16_t *_nodes[TH_NHUFFMAN_TABLES]){
457
640
  int i;
458
51.8k
  for(i=0;i<TH_NHUFFMAN_TABLES;i++)_ogg_free(_nodes[i]);
459
640
}
460
461
462
/*Unpacks a single token using the given Huffman tree.
463
  _opb:  The buffer to unpack the token from.
464
  _node: The tree to unpack the token with.
465
  Return: The token value.*/
466
724M
int oc_huff_token_decode_c(oc_pack_buf *_opb,const ogg_int16_t *_tree){
467
724M
  const unsigned char *ptr;
468
724M
  const unsigned char *stop;
469
724M
  oc_pb_window         window;
470
724M
  int                  available;
471
724M
  long                 bits;
472
724M
  int                  node;
473
724M
  int                  n;
474
724M
  ptr=_opb->ptr;
475
724M
  window=_opb->window;
476
724M
  stop=_opb->stop;
477
724M
  available=_opb->bits;
478
724M
  node=0;
479
725M
  for(;;){
480
725M
    n=_tree[node];
481
725M
    if(n>available){
482
807k
      unsigned shift;
483
807k
      shift=OC_PB_WINDOW_SIZE-available;
484
5.68M
      do{
485
        /*We don't bother setting eof because we won't check for it after we've
486
           started decoding DCT tokens.*/
487
5.68M
        if(ptr>=stop){
488
1.23k
          shift=(unsigned)-OC_LOTS_OF_BITS;
489
1.23k
          break;
490
1.23k
        }
491
5.68M
        shift-=8;
492
5.68M
        window|=(oc_pb_window)*ptr++<<shift;
493
5.68M
      }
494
5.68M
      while(shift>=8);
495
      /*Note: We never request more than 24 bits, so there's no need to fill in
496
         the last partial byte here.*/
497
807k
      available=OC_PB_WINDOW_SIZE-shift;
498
807k
    }
499
725M
    bits=window>>OC_PB_WINDOW_SIZE-n;
500
725M
    node=_tree[node+1+bits];
501
725M
    if(node<=0)break;
502
943k
    window<<=n;
503
943k
    available-=n;
504
943k
  }
505
724M
  node=-node;
506
724M
  n=node>>8;
507
724M
  window<<=n;
508
724M
  available-=n;
509
724M
  _opb->ptr=ptr;
510
724M
  _opb->window=window;
511
724M
  _opb->bits=available;
512
724M
  return node&255;
513
724M
}