Recognizes if input is ogg or not.
[xiph.git] / Tremor / sharedbook.c
blob8e074925d03e45e15aa5ff166ba4f0e1374e4284
1 /********************************************************************
2 * *
3 * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. *
4 * *
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. *
8 * *
9 * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
10 * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ *
11 * *
12 ********************************************************************
14 function: basic shared codebook operations
16 ********************************************************************/
18 #include <stdlib.h>
19 #include <math.h>
20 #include <string.h>
21 #include "ogg.h"
22 #include "misc.h"
23 #include "ivorbiscodec.h"
24 #include "codebook.h"
26 /**** pack/unpack helpers ******************************************/
27 int _ilog(unsigned int v){
28 int ret=0;
29 while(v){
30 ret++;
31 v>>=1;
33 return(ret);
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. */
40 #define VQ_FEXP 10
41 #define VQ_FMAN 21
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;
51 if(mant){
52 while(!(mant&0x40000000)){
53 mant<<=1;
54 exp-=1;
57 if(sign)mant= -mant;
58 }else{
59 sign=0;
60 exp=-9999;
63 *point=exp;
64 return mant;
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){
71 long i,j,count=0;
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));
76 for(i=0;i<n;i++){
77 long length=l[i];
78 if(length>0){
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
84 above for leaves */
86 /* update ourself */
87 if(length<32 && (entry>>length)){
88 /* error condition; the lengths must specify an overpopulated tree */
89 _ogg_free(r);
90 return(NULL);
92 r[count++]=entry;
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--){
99 if(marker[j]&1){
100 /* have to jump branches */
101 if(j==1)
102 marker[1]++;
103 else
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 */
108 marker[j]++;
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){
117 entry=marker[j];
118 marker[j]=marker[j-1]<<1;
119 }else
120 break;
121 }else
122 if(sparsecount==0)count++;
125 /* bitreverse the words because our bitwise packer/unpacker is LSb
126 endian */
127 for(i=0,count=0;i<n;i++){
128 ogg_uint32_t temp=0;
129 for(j=0;j<l[i];j++){
130 temp<<=1;
131 temp|=(r[count]>>j)&1;
134 if(sparsecount){
135 if(l[i])
136 r[count++]=temp;
137 }else
138 r[count++]=temp;
141 return(r);
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);
152 while(1){
153 long acc=1;
154 long acc1=1;
155 int i;
156 for(i=0;i<b->dim;i++){
157 acc*=vals;
158 acc1*=vals+1;
160 if(acc<=b->entries && acc1>b->entries){
161 return(vals);
162 }else{
163 if(acc>b->entries){
164 vals--;
165 }else{
166 vals++;
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,
182 int *maxpoint){
183 long j,k,count=0;
184 if(b->maptype==1 || b->maptype==2){
185 int quantvals;
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));
192 *maxpoint=minpoint;
194 /* maptype 1 and 2 both use a quantized value vector, but
195 different sizes */
196 switch(b->maptype){
197 case 1:
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
204 that */
205 quantvals=_book_maptype1_quantvals(b);
206 for(j=0;j<b->entries;j++){
207 if((sparsemap && b->lengthlist[j]) || !sparsemap){
208 ogg_int32_t last=0;
209 int lastpoint=0;
210 int indexdiv=1;
211 for(k=0;k<b->dim;k++){
212 int index= (j/indexdiv)%quantvals;
213 int point=0;
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);
220 if(b->q_sequencep){
221 last=val;
222 lastpoint=point;
225 if(sparsemap){
226 r[sparsemap[count]*b->dim+k]=val;
227 rp[sparsemap[count]*b->dim+k]=point;
228 }else{
229 r[count*b->dim+k]=val;
230 rp[count*b->dim+k]=point;
232 if(*maxpoint<point)*maxpoint=point;
233 indexdiv*=quantvals;
235 count++;
239 break;
240 case 2:
241 for(j=0;j<b->entries;j++){
242 if((sparsemap && b->lengthlist[j]) || !sparsemap){
243 ogg_int32_t last=0;
244 int lastpoint=0;
246 for(k=0;k<b->dim;k++){
247 int point=0;
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);
254 if(b->q_sequencep){
255 last=val;
256 lastpoint=point;
259 if(sparsemap){
260 r[sparsemap[count]*b->dim+k]=val;
261 rp[sparsemap[count]*b->dim+k]=point;
262 }else{
263 r[count*b->dim+k]=val;
264 rp[count*b->dim+k]=point;
266 if(*maxpoint<point)*maxpoint=point;
268 count++;
271 break;
274 for(j=0;j<n*b->dim;j++)
275 if(rp[j]<*maxpoint)
276 r[j]>>=*maxpoint-rp[j];
278 _ogg_free(rp);
279 return(r);
281 return(NULL);
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);
293 _ogg_free(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){
324 int i,j,n=0,tabn;
325 int *sortindex;
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)
331 n++;
333 c->entries=s->entries;
334 c->used_entries=n;
335 c->dim=s->dim;
337 if(n>0){
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. */
348 /* perform sort */
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;
354 for(i=0;i<n;i++){
355 codes[i]=bitreverse(codes[i]);
356 codep[i]=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 */
364 for(i=0;i<n;i++){
365 int position=codep[i]-codes;
366 sortindex[position]=i;
369 for(i=0;i<n;i++)
370 c->codelist[sortindex[i]]=codes[i];
371 _ogg_free(codes);
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));
393 c->dec_maxlength=0;
395 for(i=0;i<n;i++){
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);
409 long lo=0,hi=0;
411 for(i=0;i<tabn;i++){
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;
434 return(0);
435 err_out:
436 vorbis_book_clear(c);
437 return(-1);