1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: basic codebook pack/unpack/code/decode operations
15 last mod: $Id: codebook.c,v 1.10 2000/02/21 13:09:34 xiphmont Exp $
17 ********************************************************************/
21 #include "vorbis/codec.h"
22 #include "vorbis/codebook.h"
24 #include "bookinternal.h"
26 /**** pack/unpack helpers ******************************************/
27 static int ilog(unsigned int v){
36 /* code that packs the 24 bit float can be found in vq/bookutil.c */
38 static double _float24_unpack(long val){
39 double mant=val&0x3ffff;
40 double sign=val&0x800000;
41 double exp =(val&0x7c0000)>>18;
43 return(ldexp(mant,exp-17-VQ_FEXP_BIAS));
46 /* given a list of word lengths, generate a list of codewords. Works
47 for length ordered or unordered, always assigns the lowest valued
49 long *_make_words(long *l,long n){
52 long *r=malloc(n*sizeof(long));
53 memset(marker,0,sizeof(marker));
57 long entry=marker[length];
59 /* when we claim a node for an entry, we also claim the nodes
60 below it (pruning off the imagined tree that may have dangled
61 from it) as well as blocking the use of any nodes directly
65 if(length<32 && (entry>>length)){
66 /* error condition; the lengths must specify an overpopulated tree */
72 /* Look to see if the next shorter marker points to the node
73 above. if so, update it and repeat. */
75 for(j=length;j>0;j--){
78 /* have to jump branches */
82 marker[j]=marker[j-1]<<1;
83 break; /* invariant says next upper marker would already
84 have been moved if it was on the same path */
90 /* prune the tree; the implicit invariant says all the longer
91 markers were dangling from our just-taken node. Dangle them
92 from our *new* node. */
93 for(j=length+1;j<33;j++)
94 if((marker[j]>>1) == entry){
96 marker[j]=marker[j-1]<<1;
101 /* bitreverse the words because our bitwise packer/unpacker is LSb
115 /* build the decode helper tree from the codewords */
116 decode_aux *_make_decode_tree(codebook *c){
117 const static_codebook *s=c->c;
119 decode_aux *t=malloc(sizeof(decode_aux));
120 long *ptr0=t->ptr0=calloc(c->entries*2,sizeof(long));
121 long *ptr1=t->ptr1=calloc(c->entries*2,sizeof(long));
122 long *codelist=_make_words(s->lengthlist,s->entries);
124 if(codelist==NULL)return(NULL);
127 for(i=0;i<c->entries;i++){
129 for(j=0;j<s->lengthlist[i]-1;j++){
130 int bit=(codelist[i]>>j)&1;
141 if(!((codelist[i]>>j)&1))
150 /* unpack the quantized list of values for encode/decode ***********/
151 static double *_book_unquantize(const static_codebook *b){
154 double mindel=_float24_unpack(b->q_min);
155 double delta=_float24_unpack(b->q_delta);
156 double *r=malloc(sizeof(double)*b->entries*b->dim);
158 for(j=0;j<b->entries;j++){
160 for(k=0;k<b->dim;k++){
161 double val=b->quantlist[j*b->dim+k]*delta+last+mindel;
163 if(b->q_sequencep)last=val;
171 void vorbis_staticbook_clear(static_codebook *b){
172 if(b->quantlist)free(b->quantlist);
173 if(b->lengthlist)free(b->lengthlist);
175 free(b->encode_tree->ptr0);
176 free(b->encode_tree->ptr1);
177 free(b->encode_tree->p);
178 free(b->encode_tree->q);
179 memset(b->encode_tree,0,sizeof(encode_aux));
180 free(b->encode_tree);
182 memset(b,0,sizeof(static_codebook));
185 void vorbis_book_clear(codebook *b){
186 /* static book is not cleared; we're likely called on the lookup and
187 the static codebook belongs to the info struct */
189 free(b->decode_tree->ptr0);
190 free(b->decode_tree->ptr1);
191 memset(b->decode_tree,0,sizeof(decode_aux));
192 free(b->decode_tree);
194 if(b->valuelist)free(b->valuelist);
195 if(b->codelist)free(b->codelist);
196 memset(b,0,sizeof(codebook));
199 int vorbis_book_init_encode(codebook *c,const static_codebook *s){
200 memset(c,0,sizeof(codebook));
202 c->entries=s->entries;
204 c->codelist=_make_words(s->lengthlist,s->entries);
205 c->valuelist=_book_unquantize(s);
209 int vorbis_book_init_decode(codebook *c,const static_codebook *s){
210 memset(c,0,sizeof(codebook));
212 c->entries=s->entries;
214 c->valuelist=_book_unquantize(s);
215 c->decode_tree=_make_decode_tree(c);
216 if(c->decode_tree==NULL)goto err_out;
219 vorbis_book_clear(c);
223 /* packs the given codebook into the bitstream **************************/
225 int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){
229 /* first the basic parameters */
230 _oggpack_write(opb,0x564342,24);
231 _oggpack_write(opb,c->dim,16);
232 _oggpack_write(opb,c->entries,24);
234 /* pack the codewords. There are two packings; length ordered and
235 length random. Decide between the two now. */
237 for(i=1;i<c->entries;i++)
238 if(c->lengthlist[i]<c->lengthlist[i-1])break;
239 if(i==c->entries)ordered=1;
242 /* length ordered. We only need to say how many codewords of
243 each length. The actual codewords are generated
247 _oggpack_write(opb,1,1); /* ordered */
248 _oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */
250 for(i=1;i<c->entries;i++){
251 long this=c->lengthlist[i];
252 long last=c->lengthlist[i-1];
254 for(j=last;j<this;j++){
255 _oggpack_write(opb,i-count,ilog(c->entries-count));
260 _oggpack_write(opb,i-count,ilog(c->entries-count));
263 /* length random. Again, we don't code the codeword itself, just
264 the length. This time, though, we have to encode each length */
265 _oggpack_write(opb,0,1); /* unordered */
266 for(i=0;i<c->entries;i++)
267 _oggpack_write(opb,c->lengthlist[i]-1,5);
270 /* is the entry number the desired return value, or do we have a
273 /* we have a mapping. bundle it out. */
274 _oggpack_write(opb,1,1);
276 /* values that define the dequantization */
277 _oggpack_write(opb,c->q_min,24);
278 _oggpack_write(opb,c->q_delta,24);
279 _oggpack_write(opb,c->q_quant-1,4);
280 _oggpack_write(opb,c->q_sequencep,1);
282 /* quantized values */
283 for(i=0;i<c->entries*c->dim;i++)
284 _oggpack_write(opb,c->quantlist[i],c->q_quant);
288 _oggpack_write(opb,0,1);
294 /* unpacks a codebook from the packet buffer into the codebook struct,
295 readies the codebook auxiliary structures for decode *************/
296 int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
298 memset(s,0,sizeof(static_codebook));
300 /* make sure alignment is correct */
301 if(_oggpack_read(opb,24)!=0x564342)goto _eofout;
303 /* first the basic parameters */
304 s->dim=_oggpack_read(opb,16);
305 s->entries=_oggpack_read(opb,24);
306 if(s->entries==-1)goto _eofout;
308 /* codeword ordering.... length ordered or unordered? */
309 switch(_oggpack_read(opb,1)){
312 s->lengthlist=malloc(sizeof(long)*s->entries);
313 for(i=0;i<s->entries;i++){
314 long num=_oggpack_read(opb,5);
315 if(num==-1)goto _eofout;
316 s->lengthlist[i]=num+1;
323 long length=_oggpack_read(opb,5)+1;
324 s->lengthlist=malloc(sizeof(long)*s->entries);
326 for(i=0;i<s->entries;){
327 long num=_oggpack_read(opb,ilog(s->entries-i));
328 if(num==-1)goto _eofout;
329 for(j=0;j<num;j++,i++)
330 s->lengthlist[i]=length;
340 /* Do we have a mapping to unpack? */
341 if(_oggpack_read(opb,1)){
343 /* values that define the dequantization */
344 s->q_min=_oggpack_read(opb,24);
345 s->q_delta=_oggpack_read(opb,24);
346 s->q_quant=_oggpack_read(opb,4)+1;
347 s->q_sequencep=_oggpack_read(opb,1);
349 /* quantized values */
350 s->quantlist=malloc(sizeof(double)*s->entries*s->dim);
351 for(i=0;i<s->entries*s->dim;i++)
352 s->quantlist[i]=_oggpack_read(opb,s->q_quant);
353 if(s->quantlist[i-1]==-1)goto _eofout;
361 vorbis_staticbook_clear(s);
365 /* returns the number of bits ***************************************/
366 int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){
367 _oggpack_write(b,book->codelist[a],book->c->lengthlist[a]);
368 return(book->c->lengthlist[a]);
371 static int _best(codebook *book, double *a){
372 encode_aux *t=book->c->encode_tree;
374 int trees=t->ptr0[0];
379 int ptr=t->ptr0[trees],k;
380 /* optimized, using the decision tree */
383 double *p=book->valuelist+t->p[ptr];
384 double *q=book->valuelist+t->q[ptr];
387 c+=(p[k]-q[k])*(a[k]-(p[k]+q[k])*.5);
398 double *v=book->valuelist-ptr*dim;
399 for(k=0;k<book->dim;k++){
400 double one=a[k]-v[k];
403 if(best==-1 || dist<bestmetric){
412 /* returns the number of bits and *modifies a* to the quantization value *****/
413 int vorbis_book_encodev(codebook *book, double *a, oggpack_buffer *b){
415 int best=_best(book,a);
416 memcpy(a,book->valuelist+best*dim,dim*sizeof(double));
417 return(vorbis_book_encode(book,best,b));}
419 /* returns the number of bits and *modifies a* to the quantization error *****/
420 int vorbis_book_encodevE(codebook *book, double *a, oggpack_buffer *b){
422 int best=_best(book,a);
424 a[k]-=(book->valuelist+best*dim)[k];
425 return(vorbis_book_encode(book,best,b));
428 /* returns the total squared quantization error for best match and sets each
429 element of a to local error ***************/
430 double vorbis_book_vE(codebook *book, double *a){
432 int best=_best(book,a);
435 double val=(book->valuelist+best*dim)[k];
442 /* returns the entry number or -1 on eof *************************************/
443 long vorbis_book_decode(codebook *book, oggpack_buffer *b){
445 decode_aux *t=book->decode_tree;
447 switch(_oggpack_read1(b)){
461 /* returns the entry number or -1 on eof *************************************/
462 long vorbis_book_decodev(codebook *book, double *a, oggpack_buffer *b){
463 long entry=vorbis_book_decode(book,b);
465 if(entry==-1)return(-1);
466 for(i=0;i<book->dim;i++)a[i]+=(book->valuelist+entry*book->dim)[i];
472 /* Simple enough; pack a few candidate codebooks, unpack them. Code a
473 number of vectors through (keeping track of the quantized values),
474 and decode using the unpacked book. quantized version of in should
478 #include "vorbis/book/lsp20_0.vqh"
479 #include "vorbis/book/lsp32_0.vqh"
587 static_codebook *testlist[]={&_vq_book_lsp20_0,&_vq_book_lsp32_0,NULL};
588 double *testvec[]={test1,test2};
591 oggpack_buffer write;
594 _oggpack_writeinit(&write);
596 fprintf(stderr,"Testing codebook abstraction...:\n");
598 while(testlist[ptr]){
601 double *qv=alloca(sizeof(double)*TESTSIZE);
602 double *iv=alloca(sizeof(double)*TESTSIZE);
603 memcpy(qv,testvec[ptr],sizeof(double)*TESTSIZE);
604 memset(iv,0,sizeof(double)*TESTSIZE);
606 fprintf(stderr,"\tpacking/coding %ld... ",ptr);
608 /* pack the codebook, write the testvector */
609 _oggpack_reset(&write);
610 vorbis_book_init_encode(&c,testlist[ptr]); /* get it into memory
612 vorbis_staticbook_pack(testlist[ptr],&write);
613 fprintf(stderr,"Codebook size %ld bytes... ",_oggpack_bytes(&write));
614 for(i=0;i<TESTSIZE;i+=TESTDIM)
615 vorbis_book_encodev(&c,qv+i,&write);
616 vorbis_book_clear(&c);
618 fprintf(stderr,"OK.\n");
619 fprintf(stderr,"\tunpacking/decoding %ld... ",ptr);
621 /* transfer the write data to a read buffer and unpack/read */
622 _oggpack_readinit(&read,_oggpack_buffer(&write),_oggpack_bytes(&write));
623 if(vorbis_staticbook_unpack(&read,&s)){
624 fprintf(stderr,"Error unpacking codebook.\n");
627 if(vorbis_book_init_decode(&c,&s)){
628 fprintf(stderr,"Error initializing codebook.\n");
632 for(i=0;i<TESTSIZE;i+=TESTDIM)
633 if(vorbis_book_decodev(&c,iv+i,&read)==-1){
634 fprintf(stderr,"Error reading codebook test data (EOP).\n");
637 for(i=0;i<TESTSIZE;i++)
638 if(fabs(qv[i]-iv[i])>.000001){
639 fprintf(stderr,"input (%g) != output (%g) at position (%ld)\n",
640 iv[i],testvec[ptr][i]-qv[i],i);
644 fprintf(stderr,"OK\n");