1 /********************************************************************
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. *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
11 ********************************************************************
13 function: basic codebook pack/unpack/code/decode operations
16 ********************************************************************/
22 #include "vorbis/codec.h"
28 /* packs the given codebook into the bitstream **************************/
30 int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){
34 /* first the basic parameters */
35 oggpack_write(opb,0x564342,24);
36 oggpack_write(opb,c->dim,16);
37 oggpack_write(opb,c->entries,24);
39 /* pack the codewords. There are two packings; length ordered and
40 length random. Decide between the two now. */
42 for(i=1;i<c->entries;i++)
43 if(c->lengthlist[i-1]==0 || c->lengthlist[i]<c->lengthlist[i-1])break;
44 if(i==c->entries)ordered=1;
47 /* length ordered. We only need to say how many codewords of
48 each length. The actual codewords are generated
52 oggpack_write(opb,1,1); /* ordered */
53 oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */
55 for(i=1;i<c->entries;i++){
56 long this=c->lengthlist[i];
57 long last=c->lengthlist[i-1];
59 for(j=last;j<this;j++){
60 oggpack_write(opb,i-count,_ilog(c->entries-count));
65 oggpack_write(opb,i-count,_ilog(c->entries-count));
68 /* length random. Again, we don't code the codeword itself, just
69 the length. This time, though, we have to encode each length */
70 oggpack_write(opb,0,1); /* unordered */
72 /* algortihmic mapping has use for 'unused entries', which we tag
73 here. The algorithmic mapping happens as usual, but the unused
74 entry has no codeword. */
75 for(i=0;i<c->entries;i++)
76 if(c->lengthlist[i]==0)break;
79 oggpack_write(opb,0,1); /* no unused entries */
80 for(i=0;i<c->entries;i++)
81 oggpack_write(opb,c->lengthlist[i]-1,5);
83 oggpack_write(opb,1,1); /* we have unused entries; thus we tag */
84 for(i=0;i<c->entries;i++){
85 if(c->lengthlist[i]==0){
86 oggpack_write(opb,0,1);
88 oggpack_write(opb,1,1);
89 oggpack_write(opb,c->lengthlist[i]-1,5);
95 /* is the entry number the desired return value, or do we have a
96 mapping? If we have a mapping, what type? */
97 oggpack_write(opb,c->maptype,4);
103 /* implicitly populated value mapping */
104 /* explicitly populated value mapping */
107 /* no quantlist? error */
111 /* values that define the dequantization */
112 oggpack_write(opb,c->q_min,32);
113 oggpack_write(opb,c->q_delta,32);
114 oggpack_write(opb,c->q_quant-1,4);
115 oggpack_write(opb,c->q_sequencep,1);
121 /* a single column of (c->entries/c->dim) quantized values for
122 building a full value list algorithmically (square lattice) */
123 quantvals=_book_maptype1_quantvals(c);
126 /* every value (c->entries*c->dim total) specified explicitly */
127 quantvals=c->entries*c->dim;
129 default: /* NOT_REACHABLE */
133 /* quantized values */
134 for(i=0;i<quantvals;i++)
135 oggpack_write(opb,labs(c->quantlist[i]),c->q_quant);
140 /* error case; we don't have any other map types now */
147 /* unpacks a codebook from the packet buffer into the codebook struct,
148 readies the codebook auxiliary structures for decode *************/
149 int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
151 memset(s,0,sizeof(*s));
154 /* make sure alignment is correct */
155 if(oggpack_read(opb,24)!=0x564342)goto _eofout;
157 /* first the basic parameters */
158 s->dim=oggpack_read(opb,16);
159 s->entries=oggpack_read(opb,24);
160 if(s->entries==-1)goto _eofout;
162 if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout;
164 /* codeword ordering.... length ordered or unordered? */
165 switch((int)oggpack_read(opb,1)){
168 s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
170 /* allocated but unused entries? */
171 if(oggpack_read(opb,1)){
172 /* yes, unused entries */
174 for(i=0;i<s->entries;i++){
175 if(oggpack_read(opb,1)){
176 long num=oggpack_read(opb,5);
177 if(num==-1)goto _eofout;
178 s->lengthlist[i]=num+1;
183 /* all entries used; no tagging */
184 for(i=0;i<s->entries;i++){
185 long num=oggpack_read(opb,5);
186 if(num==-1)goto _eofout;
187 s->lengthlist[i]=num+1;
195 long length=oggpack_read(opb,5)+1;
196 s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
198 for(i=0;i<s->entries;){
199 long num=oggpack_read(opb,_ilog(s->entries-i));
200 if(num==-1)goto _eofout;
201 for(j=0;j<num && i<s->entries;j++,i++)
202 s->lengthlist[i]=length;
212 /* Do we have a mapping to unpack? */
213 switch((s->maptype=oggpack_read(opb,4))){
218 /* implicitly populated value mapping */
219 /* explicitly populated value mapping */
221 s->q_min=oggpack_read(opb,32);
222 s->q_delta=oggpack_read(opb,32);
223 s->q_quant=oggpack_read(opb,4)+1;
224 s->q_sequencep=oggpack_read(opb,1);
230 quantvals=(s->dim==0?0:_book_maptype1_quantvals(s));
233 quantvals=s->entries*s->dim;
237 /* quantized values */
238 s->quantlist=_ogg_malloc(sizeof(*s->quantlist)*quantvals);
239 for(i=0;i<quantvals;i++)
240 s->quantlist[i]=oggpack_read(opb,s->q_quant);
242 if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout;
254 vorbis_staticbook_clear(s);
258 /* returns the number of bits ************************************************/
259 int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){
260 if(a<0 || a>=book->c->entries)return(0);
261 oggpack_write(b,book->codelist[a],book->c->lengthlist[a]);
262 return(book->c->lengthlist[a]);
265 /* One the encode side, our vector writers are each designed for a
266 specific purpose, and the encoder is not flexible without modification:
268 The LSP vector coder uses a single stage nearest-match with no
269 interleave, so no step and no error return. This is specced by floor0
272 Residue0 encoding interleaves, uses multiple stages, and each stage
273 peels of a specific amount of resolution from a lattice (thus we want
274 to match by threshold, not nearest match). Residue doesn't *have* to
275 be encoded that way, but to change it, one will need to add more
276 infrastructure on the encode side (decode side is specced and simpler) */
278 /* floor0 LSP (single stage, non interleaved, nearest match) */
279 /* returns entry number and *modifies a* to the quantization value *****/
280 int vorbis_book_errorv(codebook *book,float *a){
282 int best=_best(book,a,1);
284 a[k]=(book->valuelist+best*dim)[k];
288 /* returns the number of bits and *modifies a* to the quantization value *****/
289 int vorbis_book_encodev(codebook *book,int best,float *a,oggpack_buffer *b){
292 a[k]=(book->valuelist+best*dim)[k];
293 return(vorbis_book_encode(book,best,b));
296 /* the 'eliminate the decode tree' optimization actually requires the
297 codewords to be MSb first, not LSb. This is an annoying inelegancy
298 (and one of the first places where carefully thought out design
299 turned out to be wrong; Vorbis II and future Ogg codecs should go
300 to an MSb bitpacker), but not actually the huge hit it appears to
301 be. The first-stage decode table catches most words so that
302 bitreverse is not in the main execution path. */
304 static ogg_uint32_t bitreverse(ogg_uint32_t x){
305 x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000);
306 x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00);
307 x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0);
308 x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc);
309 return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa);
312 STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){
313 int read=book->dec_maxlength;
315 long lok = oggpack_look(b,book->dec_firsttablen);
318 long entry = book->dec_firsttable[lok];
319 if(entry&0x80000000UL){
320 lo=(entry>>15)&0x7fff;
321 hi=book->used_entries-(entry&0x7fff);
323 oggpack_adv(b, book->dec_codelengths[entry-1]);
328 hi=book->used_entries;
331 lok = oggpack_look(b, read);
333 while(lok<0 && read>1)
334 lok = oggpack_look(b, --read);
337 /* bisect search for the codeword in the ordered list */
339 ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok);
343 long test=book->codelist[lo+p]>testword;
348 if(book->dec_codelengths[lo]<=read){
349 oggpack_adv(b, book->dec_codelengths[lo]);
354 oggpack_adv(b, read);
359 /* Decode side is specced and easier, because we don't need to find
360 matches using different criteria; we simply read and map. There are
361 two things we need to do 'depending':
363 We may need to support interleave. We don't really, but it's
364 convenient to do it here rather than rebuild the vector later.
366 Cascades may be additive or multiplicitive; this is not inherent in
367 the codebook, but set in the code using the codebook. Like
368 interleaving, it's easiest to do it here.
369 addmul==0 -> declarative (set the value)
370 addmul==1 -> additive
371 addmul==2 -> multiplicitive */
373 /* returns the [original, not compacted] entry number or -1 on eof *********/
374 long vorbis_book_decode(codebook *book, oggpack_buffer *b){
375 if(book->used_entries>0){
376 long packed_entry=decode_packed_entry_number(book,b);
378 return(book->dec_index[packed_entry]);
381 /* if there's no dec_index, the codebook unpacking isn't collapsed */
385 /* returns 0 on OK or -1 on eof *************************************/
386 long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){
387 if(book->used_entries>0){
388 int step=n/book->dim;
389 long *entry = alloca(sizeof(*entry)*step);
390 float **t = alloca(sizeof(*t)*step);
393 for (i = 0; i < step; i++) {
394 entry[i]=decode_packed_entry_number(book,b);
395 if(entry[i]==-1)return(-1);
396 t[i] = book->valuelist+entry[i]*book->dim;
398 for(i=0,o=0;i<book->dim;i++,o+=step)
405 long vorbis_book_decodev_add(codebook *book,float *a,oggpack_buffer *b,int n){
406 if(book->used_entries>0){
412 entry = decode_packed_entry_number(book,b);
413 if(entry==-1)return(-1);
414 t = book->valuelist+entry*book->dim;
415 for (j=0;j<book->dim;)
420 entry = decode_packed_entry_number(book,b);
421 if(entry==-1)return(-1);
422 t = book->valuelist+entry*book->dim;
424 switch((int)book->dim){
450 long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){
451 if(book->used_entries>0){
456 entry = decode_packed_entry_number(book,b);
457 if(entry==-1)return(-1);
458 t = book->valuelist+entry*book->dim;
459 for (j=0;j<book->dim;)
466 for (j=0;j<book->dim;)
473 long vorbis_book_decodevv_add(codebook *book,float **a,long offset,int ch,
474 oggpack_buffer *b,int n){
478 if(book->used_entries>0){
479 for(i=offset/ch;i<(offset+n)/ch;){
480 entry = decode_packed_entry_number(book,b);
481 if(entry==-1)return(-1);
483 const float *t = book->valuelist+entry*book->dim;
484 for (j=0;j<book->dim;j++){
498 /* Simple enough; pack a few candidate codebooks, unpack them. Code a
499 number of vectors through (keeping track of the quantized values),
500 and decode using the unpacked book. quantized version of in should
505 #include "vorbis/book/lsp20_0.vqh"
506 #include "vorbis/book/res0a_13.vqh"
509 float test1[TESTSIZE]={
561 float test3[TESTSIZE]={
562 0,1,-2,3,4,-5,6,7,8,9,
563 8,-2,7,-1,4,6,8,3,1,-9,
564 10,11,12,13,14,15,26,17,18,19,
565 30,-25,-30,-1,-5,-32,4,3,-2,0};
567 static_codebook *testlist[]={&_vq_book_lsp20_0,
568 &_vq_book_res0a_13,NULL};
569 float *testvec[]={test1,test3};
572 oggpack_buffer write;
575 oggpack_writeinit(&write);
577 fprintf(stderr,"Testing codebook abstraction...:\n");
579 while(testlist[ptr]){
582 float *qv=alloca(sizeof(*qv)*TESTSIZE);
583 float *iv=alloca(sizeof(*iv)*TESTSIZE);
584 memcpy(qv,testvec[ptr],sizeof(*qv)*TESTSIZE);
585 memset(iv,0,sizeof(*iv)*TESTSIZE);
587 fprintf(stderr,"\tpacking/coding %ld... ",ptr);
589 /* pack the codebook, write the testvector */
590 oggpack_reset(&write);
591 vorbis_book_init_encode(&c,testlist[ptr]); /* get it into memory
593 vorbis_staticbook_pack(testlist[ptr],&write);
594 fprintf(stderr,"Codebook size %ld bytes... ",oggpack_bytes(&write));
595 for(i=0;i<TESTSIZE;i+=c.dim){
596 int best=_best(&c,qv+i,1);
597 vorbis_book_encodev(&c,best,qv+i,&write);
599 vorbis_book_clear(&c);
601 fprintf(stderr,"OK.\n");
602 fprintf(stderr,"\tunpacking/decoding %ld... ",ptr);
604 /* transfer the write data to a read buffer and unpack/read */
605 oggpack_readinit(&read,oggpack_get_buffer(&write),oggpack_bytes(&write));
606 if(vorbis_staticbook_unpack(&read,&s)){
607 fprintf(stderr,"Error unpacking codebook.\n");
610 if(vorbis_book_init_decode(&c,&s)){
611 fprintf(stderr,"Error initializing codebook.\n");
615 for(i=0;i<TESTSIZE;i+=c.dim)
616 if(vorbis_book_decodev_set(&c,iv+i,&read,c.dim)==-1){
617 fprintf(stderr,"Error reading codebook test data (EOP).\n");
620 for(i=0;i<TESTSIZE;i++)
621 if(fabs(qv[i]-iv[i])>.000001){
622 fprintf(stderr,"read (%g) != written (%g) at position (%ld)\n",
627 fprintf(stderr,"OK\n");
631 /* The above is the trivial stuff; now try unquantizing a log scale codebook */