1 /********************************************************************
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
5 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
6 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
7 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
12 ********************************************************************
14 function: basic shared codebook operations
16 ********************************************************************/
23 #include "ivorbiscodec.h"
26 /**** pack/unpack helpers ******************************************/
27 int _ilog(unsigned int v
){
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. */
42 #define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */
44 static ogg_int32_t
_float32_unpack(long val
,int *point
){
45 long mant
=val
&0x1fffff;
46 int sign
=val
&0x80000000;
47 long exp
=(val
&0x7fe00000L
)>>VQ_FMAN
;
49 exp
-=(VQ_FMAN
-1)+VQ_FEXP_BIAS
;
52 while(!(mant
&0x40000000)){
67 /* given a list of word lengths, generate a list of codewords. Works
68 for length ordered or unordered, always assigns the lowest valued
69 codewords first. Extended to handle unused entries (length 0) */
70 ogg_uint32_t
*_make_words(long *l
,long n
,long sparsecount
){
72 ogg_uint32_t marker
[33];
73 ogg_uint32_t
*r
=(ogg_uint32_t
*)_ogg_malloc((sparsecount
?sparsecount
:n
)*sizeof(*r
));
74 memset(marker
,0,sizeof(marker
));
79 ogg_uint32_t entry
=marker
[length
];
81 /* when we claim a node for an entry, we also claim the nodes
82 below it (pruning off the imagined tree that may have dangled
83 from it) as well as blocking the use of any nodes directly
87 if(length
<32 && (entry
>>length
)){
88 /* error condition; the lengths must specify an overpopulated tree */
94 /* Look to see if the next shorter marker points to the node
95 above. if so, update it and repeat. */
97 for(j
=length
;j
>0;j
--){
100 /* have to jump branches */
104 marker
[j
]=marker
[j
-1]<<1;
105 break; /* invariant says next upper marker would already
106 have been moved if it was on the same path */
112 /* prune the tree; the implicit invariant says all the longer
113 markers were dangling from our just-taken node. Dangle them
114 from our *new* node. */
115 for(j
=length
+1;j
<33;j
++)
116 if((marker
[j
]>>1) == entry
){
118 marker
[j
]=marker
[j
-1]<<1;
122 if(sparsecount
==0)count
++;
125 /* bitreverse the words because our bitwise packer/unpacker is LSb
127 for(i
=0,count
=0;i
<n
;i
++){
131 temp
|=(r
[count
]>>j
)&1;
144 /* there might be a straightforward one-line way to do the below
145 that's portable and totally safe against roundoff, but I haven't
146 thought of it. Therefore, we opt on the side of caution */
147 long _book_maptype1_quantvals(const static_codebook
*b
){
148 /* get us a starting hint, we'll polish it below */
149 int bits
=_ilog(b
->entries
);
150 int vals
=b
->entries
>>((bits
-1)*(b
->dim
-1)/b
->dim
);
156 for(i
=0;i
<b
->dim
;i
++){
160 if(acc
<=b
->entries
&& acc1
>b
->entries
){
172 /* different than what _book_unquantize does for mainline:
173 we repack the book in a fixed point format that shares the same
174 binary point. Upon first use, we can shift point if needed */
176 /* we need to deal with two map types: in map type 1, the values are
177 generated algorithmically (each column of the vector counts through
178 the values in the quant vector). in map type 2, all the values came
179 in in an explicit list. Both value lists must be unpacked */
181 ogg_int32_t
*_book_unquantize(const static_codebook
*b
,int n
,int *sparsemap
,
184 if(b
->maptype
==1 || b
->maptype
==2){
186 int minpoint
,delpoint
;
187 ogg_int32_t mindel
=_float32_unpack(b
->q_min
,&minpoint
);
188 ogg_int32_t delta
=_float32_unpack(b
->q_delta
,&delpoint
);
189 ogg_int32_t
*r
=(ogg_int32_t
*)_ogg_calloc(n
*b
->dim
,sizeof(*r
));
190 int *rp
=(int *)_ogg_calloc(n
*b
->dim
,sizeof(*rp
));
194 /* maptype 1 and 2 both use a quantized value vector, but
198 /* most of the time, entries%dimensions == 0, but we need to be
199 well defined. We define that the possible vales at each
200 scalar is values == entries/dim. If entries%dim != 0, we'll
201 have 'too few' values (values*dim<entries), which means that
202 we'll have 'left over' entries; left over entries use zeroed
203 values (and are wasted). So don't generate codebooks like
205 quantvals
=_book_maptype1_quantvals(b
);
206 for(j
=0;j
<b
->entries
;j
++){
207 if((sparsemap
&& b
->lengthlist
[j
]) || !sparsemap
){
211 for(k
=0;k
<b
->dim
;k
++){
212 int index
= (j
/indexdiv
)%quantvals
;
214 int val
=VFLOAT_MULTI(delta
,delpoint
,
215 abs(b
->quantlist
[index
]),&point
);
217 val
=VFLOAT_ADD(mindel
,minpoint
,val
,point
,&point
);
218 val
=VFLOAT_ADD(last
,lastpoint
,val
,point
,&point
);
226 r
[sparsemap
[count
]*b
->dim
+k
]=val
;
227 rp
[sparsemap
[count
]*b
->dim
+k
]=point
;
229 r
[count
*b
->dim
+k
]=val
;
230 rp
[count
*b
->dim
+k
]=point
;
232 if(*maxpoint
<point
)*maxpoint
=point
;
241 for(j
=0;j
<b
->entries
;j
++){
242 if((sparsemap
&& b
->lengthlist
[j
]) || !sparsemap
){
246 for(k
=0;k
<b
->dim
;k
++){
248 int val
=VFLOAT_MULTI(delta
,delpoint
,
249 abs(b
->quantlist
[j
*b
->dim
+k
]),&point
);
251 val
=VFLOAT_ADD(mindel
,minpoint
,val
,point
,&point
);
252 val
=VFLOAT_ADD(last
,lastpoint
,val
,point
,&point
);
260 r
[sparsemap
[count
]*b
->dim
+k
]=val
;
261 rp
[sparsemap
[count
]*b
->dim
+k
]=point
;
263 r
[count
*b
->dim
+k
]=val
;
264 rp
[count
*b
->dim
+k
]=point
;
266 if(*maxpoint
<point
)*maxpoint
=point
;
274 for(j
=0;j
<n
*b
->dim
;j
++)
276 r
[j
]>>=*maxpoint
-rp
[j
];
284 void vorbis_staticbook_clear(static_codebook
*b
){
285 if(b
->quantlist
)_ogg_free(b
->quantlist
);
286 if(b
->lengthlist
)_ogg_free(b
->lengthlist
);
287 memset(b
,0,sizeof(*b
));
291 void vorbis_staticbook_destroy(static_codebook
*b
){
292 vorbis_staticbook_clear(b
);
296 void vorbis_book_clear(codebook
*b
){
297 /* static book is not cleared; we're likely called on the lookup and
298 the static codebook belongs to the info struct */
299 if(b
->valuelist
)_ogg_free(b
->valuelist
);
300 if(b
->codelist
)_ogg_free(b
->codelist
);
302 if(b
->dec_index
)_ogg_free(b
->dec_index
);
303 if(b
->dec_codelengths
)_ogg_free(b
->dec_codelengths
);
304 if(b
->dec_firsttable
)_ogg_free(b
->dec_firsttable
);
306 memset(b
,0,sizeof(*b
));
309 static ogg_uint32_t
bitreverse(ogg_uint32_t x
){
310 x
= ((x
>>16)&0x0000ffffUL
) | ((x
<<16)&0xffff0000UL
);
311 x
= ((x
>> 8)&0x00ff00ffUL
) | ((x
<< 8)&0xff00ff00UL
);
312 x
= ((x
>> 4)&0x0f0f0f0fUL
) | ((x
<< 4)&0xf0f0f0f0UL
);
313 x
= ((x
>> 2)&0x33333333UL
) | ((x
<< 2)&0xccccccccUL
);
314 return((x
>> 1)&0x55555555UL
) | ((x
<< 1)&0xaaaaaaaaUL
);
317 static int sort32a(const void *a
,const void *b
){
318 return (**(ogg_uint32_t
**)a
>**(ogg_uint32_t
**)b
)-
319 (**(ogg_uint32_t
**)a
<**(ogg_uint32_t
**)b
);
322 /* decode codebook arrangement is more heavily optimized than encode */
323 int vorbis_book_init_decode(codebook
*c
,const static_codebook
*s
){
326 memset(c
,0,sizeof(*c
));
328 /* count actually used entries */
329 for(i
=0;i
<s
->entries
;i
++)
330 if(s
->lengthlist
[i
]>0)
333 c
->entries
=s
->entries
;
338 /* two different remappings go on here.
340 First, we collapse the likely sparse codebook down only to
341 actually represented values/words. This collapsing needs to be
342 indexed as map-valueless books are used to encode original entry
343 positions as integers.
345 Second, we reorder all vectors, including the entry index above,
346 by sorted bitreversed codeword to allow treeless decode. */
349 ogg_uint32_t
*codes
=_make_words(s
->lengthlist
,s
->entries
,c
->used_entries
);
350 ogg_uint32_t
**codep
=(ogg_uint32_t
**)alloca(sizeof(*codep
)*n
);
352 if(codes
==NULL
)goto err_out
;
355 codes
[i
]=bitreverse(codes
[i
]);
359 qsort(codep
,n
,sizeof(*codep
),sort32a
);
361 sortindex
=(int *)alloca(n
*sizeof(*sortindex
));
362 c
->codelist
=(ogg_uint32_t
*)_ogg_malloc(n
*sizeof(*c
->codelist
));
363 /* the index is a reverse index */
365 int position
=codep
[i
]-codes
;
366 sortindex
[position
]=i
;
370 c
->codelist
[sortindex
[i
]]=codes
[i
];
375 c
->valuelist
=_book_unquantize(s
,n
,sortindex
,&c
->binarypoint
);
376 c
->dec_index
=(int *)_ogg_malloc(n
*sizeof(*c
->dec_index
));
378 for(n
=0,i
=0;i
<s
->entries
;i
++)
379 if(s
->lengthlist
[i
]>0)
380 c
->dec_index
[sortindex
[n
++]]=i
;
382 c
->dec_codelengths
=(char *)_ogg_malloc(n
*sizeof(*c
->dec_codelengths
));
383 for(n
=0,i
=0;i
<s
->entries
;i
++)
384 if(s
->lengthlist
[i
]>0)
385 c
->dec_codelengths
[sortindex
[n
++]]=s
->lengthlist
[i
];
387 c
->dec_firsttablen
=_ilog(c
->used_entries
)-4; /* this is magic */
388 if(c
->dec_firsttablen
<5)c
->dec_firsttablen
=5;
389 if(c
->dec_firsttablen
>8)c
->dec_firsttablen
=8;
391 tabn
=1<<c
->dec_firsttablen
;
392 c
->dec_firsttable
=(ogg_uint32_t
*)_ogg_calloc(tabn
,sizeof(*c
->dec_firsttable
));
396 if(c
->dec_maxlength
<c
->dec_codelengths
[i
])
397 c
->dec_maxlength
=c
->dec_codelengths
[i
];
398 if(c
->dec_codelengths
[i
]<=c
->dec_firsttablen
){
399 ogg_uint32_t orig
=bitreverse(c
->codelist
[i
]);
400 for(j
=0;j
<(1<<(c
->dec_firsttablen
-c
->dec_codelengths
[i
]));j
++)
401 c
->dec_firsttable
[orig
|(j
<<c
->dec_codelengths
[i
])]=i
+1;
405 /* now fill in 'unused' entries in the firsttable with hi/lo search
406 hints for the non-direct-hits */
408 ogg_uint32_t mask
=0xfffffffeUL
<<(31-c
->dec_firsttablen
);
412 ogg_uint32_t word
=i
<<(32-c
->dec_firsttablen
);
413 if(c
->dec_firsttable
[bitreverse(word
)]==0){
414 while((lo
+1)<n
&& c
->codelist
[lo
+1]<=word
)lo
++;
415 while( hi
<n
&& word
>=(c
->codelist
[hi
]&mask
))hi
++;
417 /* we only actually have 15 bits per hint to play with here.
418 In order to overflow gracefully (nothing breaks, efficiency
419 just drops), encode as the difference from the extremes. */
421 unsigned long loval
=lo
;
422 unsigned long hival
=n
-hi
;
424 if(loval
>0x7fff)loval
=0x7fff;
425 if(hival
>0x7fff)hival
=0x7fff;
426 c
->dec_firsttable
[bitreverse(word
)]=
427 0x80000000UL
| (loval
<<15) | hival
;
436 vorbis_book_clear(c
);