Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vorbis/lib/sharedbook.c
Line
Count
Source
1
/********************************************************************
2
 *                                                                  *
3
 * THIS FILE IS PART OF THE OggVorbis 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 OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015             *
9
 * by the Xiph.Org Foundation https://xiph.org/                     *
10
 *                                                                  *
11
 ********************************************************************
12
13
 function: basic shared codebook operations
14
15
 ********************************************************************/
16
17
#include <stdlib.h>
18
#include <limits.h>
19
#include <math.h>
20
#include <string.h>
21
#include <ogg/ogg.h>
22
#include "os.h"
23
#include "misc.h"
24
#include "vorbis/codec.h"
25
#include "codebook.h"
26
#include "scales.h"
27
28
/**** pack/unpack helpers ******************************************/
29
30
389k
int ov_ilog(ogg_uint32_t v){
31
389k
  int ret;
32
2.88M
  for(ret=0;v;ret++)v>>=1;
33
389k
  return ret;
34
389k
}
35
36
/* 32 bit float (not IEEE; nonnormalized mantissa +
37
   biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm
38
   Why not IEEE?  It's just not that important here. */
39
40
#define VQ_FEXP 10
41
3.72k
#define VQ_FMAN 21
42
1.86k
#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */
43
44
/* doesn't currently guard under/overflow */
45
0
long _float32_pack(float val){
46
0
  int sign=0;
47
0
  long exp;
48
0
  long mant;
49
0
  if(val<0){
50
0
    sign=0x80000000;
51
0
    val= -val;
52
0
  }
53
0
  exp= floor(log(val)/log(2.f)+.001); /* +epsilon */
54
0
  mant=rint(ldexp(val,(VQ_FMAN-1)-exp));
55
0
  exp=(exp+VQ_FEXP_BIAS)<<VQ_FMAN;
56
57
0
  return(sign|exp|mant);
58
0
}
59
60
1.86k
float _float32_unpack(long val){
61
1.86k
  double mant=val&0x1fffff;
62
1.86k
  int    sign=val&0x80000000;
63
1.86k
  long   exp =(val&0x7fe00000L)>>VQ_FMAN;
64
1.86k
  if(sign)mant= -mant;
65
1.86k
  exp=exp-(VQ_FMAN-1)-VQ_FEXP_BIAS;
66
  /* clamp excessive exponent values */
67
1.86k
  if (exp>63){
68
44
    exp=63;
69
44
  }
70
1.86k
  if (exp<-63){
71
1.56k
    exp=-63;
72
1.56k
  }
73
1.86k
  return(ldexp(mant,exp));
74
1.86k
}
75
76
/* given a list of word lengths, generate a list of codewords.  Works
77
   for length ordered or unordered, always assigns the lowest valued
78
   codewords first.  Extended to handle unused entries (length 0) */
79
0
ogg_uint32_t *_make_words(char *l,long n,long sparsecount){
80
0
  long i,j,count=0;
81
0
  ogg_uint32_t marker[33];
82
0
  ogg_uint32_t *r=_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r));
83
0
  memset(marker,0,sizeof(marker));
84
85
0
  for(i=0;i<n;i++){
86
0
    long length=l[i];
87
0
    if(length>0){
88
0
      ogg_uint32_t entry=marker[length];
89
90
      /* when we claim a node for an entry, we also claim the nodes
91
         below it (pruning off the imagined tree that may have dangled
92
         from it) as well as blocking the use of any nodes directly
93
         above for leaves */
94
95
      /* update ourself */
96
0
      if(length<32 && (entry>>length)){
97
        /* error condition; the lengths must specify an overpopulated tree */
98
0
        _ogg_free(r);
99
0
        return(NULL);
100
0
      }
101
0
      r[count++]=entry;
102
103
      /* Look to see if the next shorter marker points to the node
104
         above. if so, update it and repeat.  */
105
0
      {
106
0
        for(j=length;j>0;j--){
107
108
0
          if(marker[j]&1){
109
            /* have to jump branches */
110
0
            if(j==1)
111
0
              marker[1]++;
112
0
            else
113
0
              marker[j]=marker[j-1]<<1;
114
0
            break; /* invariant says next upper marker would already
115
                      have been moved if it was on the same path */
116
0
          }
117
0
          marker[j]++;
118
0
        }
119
0
      }
120
121
      /* prune the tree; the implicit invariant says all the longer
122
         markers were dangling from our just-taken node.  Dangle them
123
         from our *new* node. */
124
0
      for(j=length+1;j<33;j++)
125
0
        if((marker[j]>>1) == entry){
126
0
          entry=marker[j];
127
0
          marker[j]=marker[j-1]<<1;
128
0
        }else
129
0
          break;
130
0
    }else
131
0
      if(sparsecount==0)count++;
132
0
  }
133
134
  /* any underpopulated tree must be rejected. */
135
  /* Single-entry codebooks are a retconned extension to the spec.
136
     They have a single codeword '0' of length 1 that results in an
137
     underpopulated tree.  Shield that case from the underformed tree check. */
138
0
  if(!(count==1 && marker[2]==2)){
139
0
    for(i=1;i<33;i++)
140
0
      if(marker[i] & (0xffffffffUL>>(32-i))){
141
0
        _ogg_free(r);
142
0
        return(NULL);
143
0
      }
144
0
  }
145
146
  /* bitreverse the words because our bitwise packer/unpacker is LSb
147
     endian */
148
0
  for(i=0,count=0;i<n;i++){
149
0
    ogg_uint32_t temp=0;
150
0
    for(j=0;j<l[i];j++){
151
0
      temp<<=1;
152
0
      temp|=(r[count]>>j)&1;
153
0
    }
154
155
0
    if(sparsecount){
156
0
      if(l[i])
157
0
        r[count++]=temp;
158
0
    }else
159
0
      r[count++]=temp;
160
0
  }
161
162
0
  return(r);
163
0
}
164
165
/* given a list of word lengths, generate a list of packed MSb codewords and
166
   entry numbers.  This is like the above, except that the codewords are MSb
167
   first and aligned to be 32-bits in size, and the lower 24 bits include the
168
   entry number the codeword corresponds to. */
169
836
static ogg_int64_t *dec_make_words(signed char *l,long n,long sparsecount){
170
836
  long i,j,count=0;
171
836
  ogg_uint32_t marker[33];
172
836
  ogg_int64_t *r=_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r));
173
836
  if(r==NULL)return(NULL);
174
836
  memset(marker,0,sizeof(marker));
175
176
2.42k
  for(i=0;i<n;i++){
177
1.60k
    long length=l[i];
178
1.60k
    if(length>0){
179
1.59k
      ogg_uint32_t entry=marker[length];
180
181
      /* when we claim a node for an entry, we also claim the nodes
182
         below it (pruning off the imagined tree that may have dangled
183
         from it) as well as blocking the use of any nodes directly
184
         above for leaves */
185
186
      /* update ourself */
187
1.59k
      if(length<32 && (entry>>length)){
188
        /* error condition; the lengths must specify an overpopulated tree */
189
13
        _ogg_free(r);
190
13
        return(NULL);
191
13
      }
192
1.58k
      r[count++]=(ogg_int64_t)entry<<(32-l[i]+24)|i;
193
194
      /* Look to see if the next shorter marker points to the node
195
         above. if so, update it and repeat.  */
196
1.58k
      {
197
3.80k
        for(j=length;j>0;j--){
198
199
2.96k
          if(marker[j]&1){
200
            /* have to jump branches */
201
745
            if(j==1)
202
18
              marker[1]++;
203
727
            else
204
727
              marker[j]=marker[j-1]<<1;
205
745
            break; /* invariant says next upper marker would already
206
                      have been moved if it was on the same path */
207
745
          }
208
2.22k
          marker[j]++;
209
2.22k
        }
210
1.58k
      }
211
212
      /* prune the tree; the implicit invariant says all the longer
213
         markers were dangling from our just-taken node.  Dangle them
214
         from our *new* node. */
215
27.9k
      for(j=length+1;j<33;j++)
216
26.8k
        if((marker[j]>>1) == entry){
217
26.3k
          entry=marker[j];
218
26.3k
          marker[j]=marker[j-1]<<1;
219
26.3k
        }else
220
512
          break;
221
1.58k
    }else
222
6
      if(sparsecount==0)count++;
223
1.60k
  }
224
225
  /* any underpopulated tree must be rejected. */
226
  /* Single-entry codebooks are a retconned extension to the spec.
227
     They have a single codeword '0' of length 1 that results in an
228
     underpopulated tree.  Shield that case from the underformed tree check. */
229
823
  if(!(count==1 && marker[2]==2)){
230
48
    for(i=1;i<33;i++)
231
48
      if(marker[i] & (0xffffffffUL>>(32-i))){
232
36
        _ogg_free(r);
233
36
        return(NULL);
234
36
      }
235
36
  }
236
237
787
  return(r);
238
823
}
239
240
/* there might be a straightforward one-line way to do the below
241
   that's portable and totally safe against roundoff, but I haven't
242
   thought of it.  Therefore, we opt on the side of caution */
243
2.16k
long _book_maptype1_quantvals(long dim, long entries){
244
2.16k
  long vals;
245
2.16k
  if(entries<1){
246
9
    return(0);
247
9
  }
248
2.15k
  vals=floor(pow((float)entries,1.f/dim));
249
250
  /* the above *should* be reliable, but we'll not assume that FP is
251
     ever reliable when bitstream sync is at stake; verify via integer
252
     means that vals really is the greatest value of dim for which
253
     vals^dim <= entries */
254
  /* treat the above as an initial guess */
255
2.15k
  if(vals<1){
256
0
    vals=1;
257
0
  }
258
2.15k
  while(1){
259
2.15k
    long acc=1;
260
2.15k
    long acc1=1;
261
2.15k
    int i;
262
24.1k
    for(i=0;i<dim;i++){
263
21.9k
      if(entries/vals<acc)break;
264
21.9k
      acc*=vals;
265
21.9k
      if(LONG_MAX/(vals+1)<acc1)acc1=LONG_MAX;
266
19.7k
      else acc1*=vals+1;
267
21.9k
    }
268
2.15k
    if(i>=dim && acc<=entries && acc1>entries){
269
2.15k
      return(vals);
270
2.15k
    }else{
271
0
      if(i<dim || acc>entries){
272
0
        vals--;
273
0
      }else{
274
0
        vals++;
275
0
      }
276
0
    }
277
2.15k
  }
278
2.15k
}
279
280
/* unpack the quantized list of values for decode ***********/
281
/* we need to deal with two map types: in map type 1, the values are
282
   generated algorithmically (each column of the vector counts through
283
   the values in the quant vector). in map type 2, all the values came
284
   in in an explicit list.  Both value lists must be unpacked */
285
void _book_unquantize(float *r,const dec_codebook *b,ogg_int32_t n,
286
930
                      ogg_int64_t *sparsemap){
287
930
  ogg_int32_t i,j,k;
288
930
  if(b->maptype==1 || b->maptype==2){
289
930
    ogg_int32_t quantvals;
290
930
    float mindel=_float32_unpack(b->q_min);
291
930
    float delta=_float32_unpack(b->q_delta);
292
293
    /* maptype 1 and 2 both use a quantized value vector, but
294
       different sizes */
295
930
    switch(b->maptype){
296
924
    case 1:
297
      /* most of the time, entries%dimensions == 0, but we need to be
298
         well defined.  We define that the possible vales at each
299
         scalar is values == entries/dim.  If entries%dim != 0, we'll
300
         have 'too few' values (values*dim<entries), which means that
301
         we'll have 'left over' entries; left over entries use zeroed
302
         values (and are wasted).  So don't generate codebooks like
303
         that */
304
924
      quantvals=(ogg_int32_t)_book_maptype1_quantvals(b->dim, b->entries);
305
1.98k
      for(i=0;i<n;i++){
306
1.05k
        float last=0.f;
307
1.05k
        int indexdiv=1;
308
1.05k
        j=(long)(sparsemap?sparsemap[i]&0xffffff:i);
309
11.9k
        for(k=0;k<b->dim;k++){
310
10.9k
          ogg_int32_t index=(j/indexdiv)%quantvals;
311
10.9k
          float val=b->quantlist[index];
312
10.9k
          val=fabs(val)*delta+mindel+last;
313
10.9k
          if(b->q_sequencep)last=val;
314
10.9k
          r[i*b->dim+k]=val;
315
10.9k
          indexdiv*=quantvals;
316
10.9k
        }
317
1.05k
      }
318
924
      break;
319
6
    case 2:
320
12
      for(i=0;i<n;i++){
321
6
        float last=0.f;
322
6
        j=(ogg_int32_t)(sparsemap?sparsemap[i]&0xffffff:i);
323
14
        for(k=0;k<b->dim;k++){
324
8
          float val=b->quantlist[j*b->dim+k];
325
8
          val=fabs(val)*delta+mindel+last;
326
8
          if(b->q_sequencep)last=val;
327
8
          r[i*b->dim+k]=val;
328
8
        }
329
6
      }
330
6
      break;
331
930
    }
332
333
930
  }
334
930
}
335
336
0
void vorbis_staticbook_destroy(static_codebook *b){
337
0
  if(b->allocedp){
338
0
    if(b->quantlist)_ogg_free(b->quantlist);
339
0
    if(b->lengthlist)_ogg_free(b->lengthlist);
340
0
    memset(b,0,sizeof(*b));
341
0
    _ogg_free(b);
342
0
  } /* otherwise, it is in static memory */
343
0
}
344
345
0
void vorbis_book_clear(codebook *b){
346
  /* static book is not cleared; we're likely called on the lookup and
347
     the static codebook belongs to the info struct */
348
0
  if(b->valuelist)_ogg_free(b->valuelist);
349
0
  if(b->codelist)_ogg_free(b->codelist);
350
351
0
  memset(b,0,sizeof(*b));
352
0
}
353
354
3.88k
void vorbis_decbook_clear(dec_codebook *b){
355
3.88k
  if(b->quantlist)_ogg_free(b->quantlist);
356
3.88k
  if(b->firsttable)_ogg_free(b->firsttable);
357
3.88k
  if(b->codelist)_ogg_free(b->codelist);
358
3.88k
  if(b->codelengths)_ogg_free(b->codelengths);
359
3.88k
  if(b->index)_ogg_free(b->index);
360
3.88k
  if(b->valuelist)_ogg_free(b->valuelist);
361
3.88k
  memset(b,0,sizeof(*b));
362
3.88k
}
363
364
0
int vorbis_book_init_encode(codebook *c,const static_codebook *s){
365
366
0
  memset(c,0,sizeof(*c));
367
0
  c->c=s;
368
0
  c->entries=s->entries;
369
0
  c->used_entries=s->entries;
370
0
  c->dim=s->dim;
371
0
  c->codelist=_make_words(s->lengthlist,s->entries,0);
372
0
  c->quantvals=_book_maptype1_quantvals(s->dim, s->entries);
373
0
  c->minval=(int)rint(_float32_unpack(s->q_min));
374
0
  c->delta=(int)rint(_float32_unpack(s->q_delta));
375
376
0
  return(0);
377
0
}
378
379
268
static ogg_uint32_t bitreverse(ogg_uint32_t x){
380
268
  x=    ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL);
381
268
  x=    ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL);
382
268
  x=    ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL);
383
268
  x=    ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL);
384
268
  return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL);
385
268
}
386
387
0
static int sort64a(const void *a,const void *b){
388
0
  return ( *(ogg_int64_t *)a>*(ogg_int64_t *)b)-
389
0
    ( *(ogg_int64_t *)a<*(ogg_int64_t *)b);
390
0
}
391
392
/* decode codebook arrangement is more heavily optimized than encode */
393
986
int vorbis_book_init_decode(dec_codebook *c){
394
986
  ogg_int32_t i,j,n;
395
986
  ogg_int64_t *codes=NULL;
396
397
  /* only initialize once */
398
986
  if(c->codelist)return(0);
399
400
986
  if(c->codelengths){
401
    /* unordered codebook */
402
    /* count actually used entries */
403
836
    n=0;
404
3.09k
    for(i=0;i<c->entries;i++)
405
2.26k
      if(c->codelengths[i]>0)
406
2.25k
        n++;
407
408
836
    if(n>0){
409
836
      signed char *codelengths;
410
      /* two different remappings go on here.
411
412
      First, we collapse the likely sparse codebook down only to
413
      actually represented values/words.  This collapsing needs to be
414
      indexed as map-valueless books are used to encode original entry
415
      positions as integers.
416
417
      Second, we reorder all vectors, including the entry index above,
418
      by sorted bitreversed codeword to allow treeless decode. */
419
420
      /* perform sort */
421
836
      codes=dec_make_words(c->codelengths,c->entries,n);
422
836
      if(codes==NULL)goto err_out;
423
424
787
      qsort(codes,n,sizeof(*codes),sort64a);
425
426
787
      c->codelist=_ogg_malloc(n*sizeof(*c->codelist));
427
787
      if(c->codelist==NULL)goto err_out;
428
429
1.57k
      for(i=0;i<n;i++){
430
787
        c->codelist[i]=(ogg_uint32_t)(codes[i]>>24);
431
787
      }
432
433
787
      if(c->maptype==1 || c->maptype==2){
434
787
        c->valuelist=_ogg_malloc(c->dim*n*sizeof(*c->valuelist));
435
787
        if(c->valuelist==NULL)goto err_out;
436
787
        _book_unquantize(c->valuelist,c,n,codes);
437
787
        _ogg_free(c->quantlist);
438
787
        c->quantlist=NULL;
439
787
      }
440
787
      c->index=_ogg_malloc(n*sizeof(*c->index));
441
787
      if(c->index==NULL)goto err_out;
442
787
      codelengths=_ogg_malloc(n*sizeof(*c->codelengths));
443
787
      if(codelengths==NULL)goto err_out;
444
445
      /* save the index of used entries, compact and reorder the codelengths,
446
         and find min/max length */
447
787
      c->minlength=32;
448
787
      c->maxlength=0;
449
1.57k
      for(i=0;i<n;i++){
450
787
        j=(ogg_int32_t)(codes[i]&0xffffff);
451
787
        c->index[i]=j;
452
787
        codelengths[i]=c->codelengths[j];
453
787
        if(codelengths[i]<c->minlength)
454
787
          c->minlength=codelengths[i];
455
787
        if(codelengths[i]>c->maxlength)
456
787
          c->maxlength=codelengths[i];
457
787
      }
458
787
      _ogg_free(codes);
459
787
      codes=NULL;
460
787
      _ogg_free(c->codelengths);
461
787
      c->codelengths=codelengths;
462
787
    }
463
836
  }else{
464
    /* ordered codebook:
465
       we can avoid building an explicit list of codepoints, which can be a big
466
       advantage as we approach the limits of the spec with upwards of 16
467
       million codebook entries.  We follow the approach of Alistair Moffat and
468
       Andrew Turpin: On the Implementation of Minimum Redundancy Prefix Codes,
469
       IEEE Transactions on Communications, 45(10):1200--1207, October, 1997,
470
       except modified to have codewords in order of increasing length, instead
471
       of decreasing. */
472
150
    n=c->entries;
473
150
    if(n>0){
474
150
      ogg_uint32_t prev_entry;
475
150
      ogg_uint32_t code;
476
150
      int nlengths;
477
150
      int length;
478
150
      int l;
479
150
      nlengths=c->maxlength-c->minlength+1;
480
150
      c->codelist=_ogg_malloc(nlengths*sizeof(*c->codelist));
481
150
      if(c->codelist==NULL)goto err_out;
482
      /* for this case, codelist[l] contains the last codeword of the l'th
483
         length, left-aligned in a 32-bit word, with all remaining bits filled
484
         with trailing 1's.  This ensures that 32 bits taken from the stream
485
         will be <= codelist[l] if the codeword length is <= length l. */
486
150
      prev_entry=0;
487
150
      code=0;
488
150
      length=c->minlength;
489
300
      for(l=0;l<nlengths;l++,length++){
490
150
        ogg_uint32_t nentries;
491
150
        nentries=c->index[l]-prev_entry;
492
        /* guard against an over-populated tree.  We do not check the last
493
           length, because it should exactly use the remaining space, which
494
           causes code to wrap to 0 (something this check prevents for any
495
           earlier length).  We'll check it after the loop. */
496
150
        if(l+1<nlengths && nentries>((0xffffffffUL-code)>>(32-length)))
497
0
          goto err_out;
498
150
        code+=nentries<<(32-length);
499
        /* this requires that the first length have a non-zero number of
500
           entries, or c->codelist[0] will wrap to 0xffffffff, making the list
501
           non-monotonic. */
502
150
        c->codelist[l]=code-1;
503
150
        prev_entry=c->index[l];
504
150
      }
505
      /* for a complete tree, the last value will have all bits set, which
506
         guarantees we will not walk past the end of the array during decode */
507
150
      if(c->codelist[nlengths-1]!=0xffffffffUL){
508
        /* reject over/underpopulated trees, with the exception of a
509
           single-entry codebook. */
510
16
        if(n!=1 || c->maxlength!=1)goto err_out;
511
16
      }
512
143
      if(c->maptype==1 || c->maptype==2){
513
143
        c->valuelist=_ogg_malloc(c->dim*n*sizeof(*c->valuelist));
514
143
        if(c->valuelist==NULL)goto err_out;
515
143
        _book_unquantize(c->valuelist,c,n,NULL);
516
143
        _ogg_free(c->quantlist);
517
143
        c->quantlist=NULL;
518
143
      }
519
143
    }
520
150
  }
521
  /* build the fastpath lookup table */
522
930
  if(n>0){
523
930
    if(n==1 && c->maxlength==1){
524
      /* special case the 'single entry codebook' with a single bit
525
       fastpath table (that always returns entry 0 )in order to use
526
       unmodified decode paths. */
527
796
      c->firsttablen=1;
528
796
      c->firsttable=_ogg_calloc(2,sizeof(*c->firsttable));
529
796
      if(c->firsttable==NULL)goto err_out;
530
796
      c->firsttable[0]=c->firsttable[1]=1;
531
532
796
    }else{
533
134
      int used_bits;
534
134
      int tabn;
535
134
      used_bits=ov_ilog(n);
536
134
      c->firsttablen=(signed char)(used_bits-4); /* this is magic */
537
134
      if(c->firsttablen<5)c->firsttablen=5;
538
      /* if the codewords all have similar lengths, we might wind up with a
539
         table smaller than the shorter codes: increase the size or we could
540
         take the slow path in a large fraction of cases */
541
134
      if(c->firsttablen<c->minlength+1)
542
0
        c->firsttablen=c->minlength+1;
543
      /* also cap the table by the max length, or we are just wasting space */
544
134
      if(c->firsttablen>c->maxlength)
545
134
        c->firsttablen=c->maxlength;
546
      /* if we have an ordered book with a very large minimum length, an 8-bit
547
         table would be mostly wasted.  Instead, try to make one just large
548
         enough to get a good guess for the codeword length. */
549
134
      if(c->codelengths==NULL && c->minlength>8)
550
0
        c->firsttablen=c->maxlength-c->minlength+1;
551
134
      if(c->firsttablen>8)c->firsttablen=8;
552
553
134
      tabn=1<<c->firsttablen;
554
134
      c->firsttable=_ogg_calloc(tabn,sizeof(*c->firsttable));
555
134
      if(c->firsttable==NULL)goto err_out;
556
557
134
      if(c->codelengths!=NULL){
558
        /* unordered codebook:
559
           use the codewords for each entry to build the fastpath table */
560
0
        for(i=0;i<n;i++){
561
0
          if(c->codelengths[i]<=c->firsttablen){
562
0
            ogg_uint32_t orig=bitreverse(c->codelist[i]);
563
0
            for(j=0;j<(1<<(c->firsttablen-c->codelengths[i]));j++)
564
              /* pack the length into the table, too, to avoid an extra lookup.
565
                 This also guarantees the table value is non-zero, since the
566
                 length of any used entry is positive. */
567
0
              c->firsttable[orig|(j<<c->codelengths[i])]=
568
0
               i<<6|c->codelengths[i];
569
0
          }
570
0
        }
571
572
        /* now fill in 'unused' entries in the firsttable with hi/lo search
573
           hints for the non-direct-hits */
574
0
        {
575
0
          ogg_uint32_t mask=0xfffffffeUL<<(31-c->firsttablen);
576
0
          long lo=0,hi=0;
577
0
          int hint_shift;
578
579
0
          c->hi_max=n;
580
0
          hint_shift=used_bits>15?used_bits-15:0;
581
0
          c->hint_shift=(signed char)hint_shift;
582
0
          for(i=0;i<tabn;i++){
583
0
            ogg_uint32_t word=((ogg_uint32_t)i<<(32-c->firsttablen));
584
0
            if(c->firsttable[bitreverse(word)]==0){
585
0
              while((lo+1)<n && c->codelist[lo+1]<=word)lo++;
586
0
              while(    hi<n && word>=(c->codelist[hi]&mask))hi++;
587
588
              /* we only actually have 15 bits per hint to play with here.
589
                 In order to overflow gracefully (nothing breaks, efficiency
590
                 just drops), shift the values down when the range gets too
591
                 large.  We encode the hi value as a difference from the max so
592
                 truncation error moves it upwards without risk of stepping
593
                 past the end of the arrays. */
594
0
              {
595
0
                unsigned long loval=lo>>hint_shift;
596
0
                unsigned long hival=(n-hi)>>hint_shift;
597
598
0
                if(loval>0x7fff)loval=0x7fff;
599
0
                if(hival>0x7fff)hival=0x7fff;
600
0
                c->firsttable[bitreverse(word)]=
601
0
                  0x80000000UL | (loval<<15) | hival;
602
0
              }
603
0
            }
604
0
          }
605
0
        }
606
134
      }else{
607
134
        ogg_uint32_t code;
608
134
        int nlengths;
609
134
        int length;
610
134
        int l;
611
        /* ordered codebook:
612
           step through the code lengths to build the fastpath table */
613
134
        nlengths=c->maxlength-c->minlength+1;
614
134
        c->hi_max=nlengths-1;
615
134
        c->hint_shift=0;
616
134
        length=c->minlength;
617
134
        code=0;
618
268
        for(i=l=0;length<=c->firsttablen;l++,length++){
619
402
          for(;i<c->index[l];i++,code++){
620
268
            ogg_uint32_t orig=bitreverse(code<<(32-length));
621
536
            for(j=0;j<(1<<(c->firsttablen-length));j++){
622
              /* pack the length into the table to avoid an extra lookup */
623
268
              c->firsttable[(j<<length)|orig]=i<<6|length;
624
268
            }
625
268
          }
626
134
          code<<=1;
627
134
        }
628
629
        /* now fill in 'unused' entries in the firsttable with length search
630
           hints for the non-direct hits.  In this case, instead of storing the
631
           hi/lo entry codewords in the table, we store the (index of) the
632
           shortest and longest lengths of any codeword that starts with that
633
           prefix. */
634
134
        if(l<nlengths){
635
0
          int lo=l;
636
0
          do{
637
0
            ogg_uint32_t nleft;
638
0
            ogg_uint32_t slot_count;
639
            /* how many more codes are left of this length? */
640
0
            nleft=(c->codelist[l]>>(32-length))-code+1;
641
0
            slot_count=(ogg_uint32_t)1<<(length-c->firsttablen);
642
0
            if(nleft>=slot_count){
643
0
              ogg_uint32_t word=code>>(length-c->firsttablen);
644
0
              c->firsttable[bitreverse(word<<(32-c->firsttablen))]=
645
0
               0x80000000UL | ((ogg_uint32_t)lo<<15) | (nlengths-1-l);
646
0
              code+=slot_count;
647
0
              lo=l;
648
0
            }else{
649
              /* not enough: consider longer codes */
650
0
              l++;
651
0
              length++;
652
0
              code<<=1;
653
0
              if(nleft==0)lo=l;
654
0
            }
655
0
          }
656
0
          while(l<nlengths);
657
0
        }
658
134
      }
659
134
    }
660
930
  }
661
662
930
  return(0);
663
56
 err_out:
664
56
  if(codes)_ogg_free(codes);
665
  /* our caller will clean up the partially initialized book */
666
56
  return(-1);
667
930
}
668
669
0
long vorbis_book_codeword(codebook *book,int entry){
670
0
  if(book->c) /* only use with encode; decode optimizations are
671
                 allowed to break this */
672
0
    return book->codelist[entry];
673
0
  return -1;
674
0
}
675
676
0
long vorbis_book_codelen(codebook *book,int entry){
677
0
  if(book->c) /* only use with encode; decode optimizations are
678
                 allowed to break this */
679
0
    return book->c->lengthlist[entry];
680
0
  return -1;
681
0
}
682
683
#ifdef _V_SELFTEST
684
685
/* Unit tests of the dequantizer; this stuff will be OK
686
   cross-platform, I simply want to be sure that special mapping cases
687
   actually work properly; a bug could go unnoticed for a while */
688
689
#include <stdio.h>
690
691
/* cases:
692
693
   no mapping
694
   full, explicit mapping
695
   algorithmic mapping
696
697
   nonsequential
698
   sequential
699
*/
700
701
static ogg_uint16_t full_quantlist1[]={0,1,2,3,    4,5,6,7, 8,3,6,1};
702
static ogg_uint16_t partial_quantlist1[]={0,7,2};
703
704
/* no mapping */
705
dec_codebook test1={
706
  4,0,0,0,16,0,0,
707
  0,0,0,0,0,
708
  NULL,
709
  NULL,NULL,NULL,NULL,NULL
710
};
711
static float *test1_result=NULL;
712
713
/* linear, full mapping, nonsequential */
714
dec_codebook test2={
715
  4,0,0,0,3,0,0,
716
  2,4,0,3761766400U,1611661312,
717
  full_quantlist1,
718
  NULL,NULL,NULL,NULL,NULL
719
};
720
static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2};
721
722
/* linear, full mapping, sequential */
723
dec_codebook test3={
724
  4,0,0,0,3,0,0,
725
  2,4,1,3761766400U,1611661312,
726
  full_quantlist1,
727
  NULL,NULL,NULL,NULL,NULL
728
};
729
static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6};
730
731
/* linear, algorithmic mapping, nonsequential */
732
dec_codebook test4={
733
  3,0,0,0,27,0,0,
734
  1,4,0,3761766400U,1611661312,
735
  partial_quantlist1,
736
  NULL,NULL,NULL,NULL,NULL
737
};
738
static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3,
739
                              -3, 4,-3, 4, 4,-3, -1, 4,-3,
740
                              -3,-1,-3, 4,-1,-3, -1,-1,-3,
741
                              -3,-3, 4, 4,-3, 4, -1,-3, 4,
742
                              -3, 4, 4, 4, 4, 4, -1, 4, 4,
743
                              -3,-1, 4, 4,-1, 4, -1,-1, 4,
744
                              -3,-3,-1, 4,-3,-1, -1,-3,-1,
745
                              -3, 4,-1, 4, 4,-1, -1, 4,-1,
746
                              -3,-1,-1, 4,-1,-1, -1,-1,-1};
747
748
/* linear, algorithmic mapping, sequential */
749
dec_codebook test5={
750
  3,0,0,0,27,0,0,
751
  1,4,1,3761766400U,1611661312,
752
  partial_quantlist1,
753
  NULL,NULL,NULL,NULL,NULL,
754
};
755
static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7,
756
                              -3, 1,-2, 4, 8, 5, -1, 3, 0,
757
                              -3,-4,-7, 4, 3, 0, -1,-2,-5,
758
                              -3,-6,-2, 4, 1, 5, -1,-4, 0,
759
                              -3, 1, 5, 4, 8,12, -1, 3, 7,
760
                              -3,-4, 0, 4, 3, 7, -1,-2, 2,
761
                              -3,-6,-7, 4, 1, 0, -1,-4,-5,
762
                              -3, 1, 0, 4, 8, 7, -1, 3, 2,
763
                              -3,-4,-5, 4, 3, 2, -1,-2,-3};
764
765
void run_test(dec_codebook *b,float *comp){
766
  float out[3*27];
767
  int i;
768
769
  if(comp){
770
    _book_unquantize(out,b,b->entries,NULL);
771
    for(i=0;i<b->entries*b->dim;i++)
772
      if(fabs(out[i]-comp[i])>.0001){
773
        fprintf(stderr,"disagreement in unquantized and reference data:\n"
774
                "position %d, %g != %g\n",i,out[i],comp[i]);
775
        exit(1);
776
      }
777
778
  }
779
}
780
781
int main(){
782
  /* run the nine dequant tests, and compare to the hand-rolled results */
783
  fprintf(stderr,"Dequant test 1... ");
784
  run_test(&test1,test1_result);
785
  fprintf(stderr,"OK\nDequant test 2... ");
786
  run_test(&test2,test2_result);
787
  fprintf(stderr,"OK\nDequant test 3... ");
788
  run_test(&test3,test3_result);
789
  fprintf(stderr,"OK\nDequant test 4... ");
790
  run_test(&test4,test4_result);
791
  fprintf(stderr,"OK\nDequant test 5... ");
792
  run_test(&test5,test5_result);
793
  fprintf(stderr,"OK\n\n");
794
795
  return(0);
796
}
797
798
#endif