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.15 2000/06/14 01:38:31 xiphmont Exp $
17 ********************************************************************/
22 #include "vorbis/codec.h"
23 #include "vorbis/codebook.h"
26 #include "sharedbook.h"
27 #include "bookinternal.h"
30 /* packs the given codebook into the bitstream **************************/
32 int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){
36 /* first the basic parameters */
37 _oggpack_write(opb,0x564342,24);
38 _oggpack_write(opb,c->dim,16);
39 _oggpack_write(opb,c->entries,24);
41 /* pack the codewords. There are two packings; length ordered and
42 length random. Decide between the two now. */
44 for(i=1;i<c->entries;i++)
45 if(c->lengthlist[i]<c->lengthlist[i-1])break;
46 if(i==c->entries)ordered=1;
49 /* length ordered. We only need to say how many codewords of
50 each length. The actual codewords are generated
54 _oggpack_write(opb,1,1); /* ordered */
55 _oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */
57 for(i=1;i<c->entries;i++){
58 long this=c->lengthlist[i];
59 long last=c->lengthlist[i-1];
61 for(j=last;j<this;j++){
62 _oggpack_write(opb,i-count,_ilog(c->entries-count));
67 _oggpack_write(opb,i-count,_ilog(c->entries-count));
70 /* length random. Again, we don't code the codeword itself, just
71 the length. This time, though, we have to encode each length */
72 _oggpack_write(opb,0,1); /* unordered */
74 /* algortihmic mapping has use for 'unused entries', which we tag
75 here. The algorithmic mapping happens as usual, but the unused
76 entry has no codeword. */
77 for(i=0;i<c->entries;i++)
78 if(c->lengthlist[i]==0)break;
81 _oggpack_write(opb,0,1); /* no unused entries */
82 for(i=0;i<c->entries;i++)
83 _oggpack_write(opb,c->lengthlist[i]-1,5);
85 _oggpack_write(opb,1,1); /* we have unused entries; thus we tag */
86 for(i=0;i<c->entries;i++){
87 if(c->lengthlist[i]==0){
88 _oggpack_write(opb,0,1);
90 _oggpack_write(opb,1,1);
91 _oggpack_write(opb,c->lengthlist[i]-1,5);
97 /* is the entry number the desired return value, or do we have a
98 mapping? If we have a mapping, what type? */
99 _oggpack_write(opb,c->maptype,4);
105 /* implicitly populated value mapping */
106 /* explicitly populated value mapping */
109 /* no quantlist? error */
113 /* values that define the dequantization */
114 _oggpack_write(opb,c->q_min,32);
115 _oggpack_write(opb,c->q_delta,32);
116 _oggpack_write(opb,c->q_quant-1,4);
117 _oggpack_write(opb,c->q_sequencep,1);
123 /* a single column of (c->entries/c->dim) quantized values for
124 building a full value list algorithmically (square lattice) */
125 quantvals=_book_maptype1_quantvals(c);
128 /* every value (c->entries*c->dim total) specified explicitly */
129 quantvals=c->entries*c->dim;
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(static_codebook));
153 /* make sure alignment is correct */
154 if(_oggpack_read(opb,24)!=0x564342)goto _eofout;
156 /* first the basic parameters */
157 s->dim=_oggpack_read(opb,16);
158 s->entries=_oggpack_read(opb,24);
159 if(s->entries==-1)goto _eofout;
161 /* codeword ordering.... length ordered or unordered? */
162 switch(_oggpack_read(opb,1)){
165 s->lengthlist=malloc(sizeof(long)*s->entries);
167 /* allocated but unused entries? */
168 if(_oggpack_read(opb,1)){
169 /* yes, unused entries */
171 for(i=0;i<s->entries;i++){
172 if(_oggpack_read(opb,1)){
173 long num=_oggpack_read(opb,5);
174 if(num==-1)goto _eofout;
175 s->lengthlist[i]=num+1;
180 /* all entries used; no tagging */
181 for(i=0;i<s->entries;i++){
182 long num=_oggpack_read(opb,5);
183 if(num==-1)goto _eofout;
184 s->lengthlist[i]=num+1;
192 long length=_oggpack_read(opb,5)+1;
193 s->lengthlist=malloc(sizeof(long)*s->entries);
195 for(i=0;i<s->entries;){
196 long num=_oggpack_read(opb,_ilog(s->entries-i));
197 if(num==-1)goto _eofout;
198 for(j=0;j<num;j++,i++)
199 s->lengthlist[i]=length;
209 /* Do we have a mapping to unpack? */
210 switch((s->maptype=_oggpack_read(opb,4))){
215 /* implicitly populated value mapping */
216 /* explicitly populated value mapping */
218 s->q_min=_oggpack_read(opb,32);
219 s->q_delta=_oggpack_read(opb,32);
220 s->q_quant=_oggpack_read(opb,4)+1;
221 s->q_sequencep=_oggpack_read(opb,1);
227 quantvals=_book_maptype1_quantvals(s);
230 quantvals=s->entries*s->dim;
234 /* quantized values */
235 s->quantlist=malloc(sizeof(double)*quantvals);
236 for(i=0;i<quantvals;i++)
237 s->quantlist[i]=_oggpack_read(opb,s->q_quant);
239 if(s->quantlist[quantvals-1]==-1)goto _eofout;
251 vorbis_staticbook_clear(s);
255 /* returns the number of bits ************************************************/
256 int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){
257 _oggpack_write(b,book->codelist[a],book->c->lengthlist[a]);
258 return(book->c->lengthlist[a]);
261 /* One the encode side, our vector writers are each designed for a
262 specific purpose, and the encoder is not flexible without modification:
264 The LSP vector coder uses a single stage nearest-match with no
265 interleave, so no step and no error return. This is specced by floor0
268 Residue0 encoding interleaves, uses multiple stages, and each stage
269 peels of a specific amount of resolution from a lattice (thus we want
270 to match by threshhold, not nearest match). Residue doesn't *have* to
271 be encoded that way, but to change it, one will need to add more
272 infrastructure on the encode side (decode side is specced and simpler) */
274 /* floor0 LSP (single stage, non interleaved, nearest match) */
275 /* returns entry number and *modifies a* to the quantization value *****/
276 int vorbis_book_errorv(codebook *book,double *a){
278 int best=_best(book,a,1);
280 a[k]=(book->valuelist+best*dim)[k];
284 /* returns the number of bits and *modifies a* to the quantization value *****/
285 int vorbis_book_encodev(codebook *book,int best,double *a,oggpack_buffer *b){
288 a[k]=(book->valuelist+best*dim)[k];
289 return(vorbis_book_encode(book,best,b));
292 /* res0 (multistage, interleave, lattice) */
293 /* returns the number of bits and *modifies a* to the remainder value ********/
294 int vorbis_book_encodevs(codebook *book,double *a,oggpack_buffer *b,
295 int step,int addmul){
297 int best=vorbis_book_besterror(book,a,step,addmul);
298 return(vorbis_book_encode(book,best,b));
301 /* Decode side is specced and easier, because we don't need to find
302 matches using different criteria; we simply read and map. There are
303 two things we need to do 'depending':
305 We may need to support interleave. We don't really, but it's
306 convenient to do it here rather than rebuild the vector later.
308 Cascades may be additive or multiplicitive; this is not inherent in
309 the codebook, but set in the code using the codebook. Like
310 interleaving, it's easiest to do it here.
311 stage==0 -> declarative (set the value)
313 stage==2 -> multiplicitive */
315 /* returns the entry number or -1 on eof *************************************/
316 long vorbis_book_decode(codebook *book, oggpack_buffer *b){
318 decode_aux *t=book->decode_tree;
320 switch(_oggpack_read1(b)){
334 /* returns the entry number or -1 on eof *************************************/
335 long vorbis_book_decodevs(codebook *book,double *a,oggpack_buffer *b,
336 int step,int addmul){
337 long entry=vorbis_book_decode(book,b);
339 if(entry==-1)return(-1);
342 for(i=0,o=0;i<book->dim;i++,o+=step)
343 a[o]=(book->valuelist+entry*book->dim)[i];
346 for(i=0,o=0;i<book->dim;i++,o+=step)
347 a[o]+=(book->valuelist+entry*book->dim)[i];
350 for(i=0,o=0;i<book->dim;i++,o+=step)
351 a[o]*=(book->valuelist+entry*book->dim)[i];
359 /* Simple enough; pack a few candidate codebooks, unpack them. Code a
360 number of vectors through (keeping track of the quantized values),
361 and decode using the unpacked book. quantized version of in should
365 #include "vorbis/book/lsp20_0.vqh"
366 #include "vorbis/book/lsp32_0.vqh"
367 #include "vorbis/book/res0_1a.vqh"
370 double test1[TESTSIZE]={
422 double test2[TESTSIZE]={
474 double test3[TESTSIZE]={
475 0,1,-2,3,4,-5,6,7,8,9,
476 8,-2,7,-1,4,6,8,3,1,-9,
477 10,11,12,13,14,15,26,17,18,19,
478 30,-25,-30,-1,-5,-32,4,3,-2,0};
480 static_codebook *testlist[]={&_vq_book_lsp20_0,
482 &_vq_book_res0_1a,NULL};
483 double *testvec[]={test1,test2,test3};
486 oggpack_buffer write;
489 _oggpack_writeinit(&write);
491 fprintf(stderr,"Testing codebook abstraction...:\n");
493 while(testlist[ptr]){
496 double *qv=alloca(sizeof(double)*TESTSIZE);
497 double *iv=alloca(sizeof(double)*TESTSIZE);
498 memcpy(qv,testvec[ptr],sizeof(double)*TESTSIZE);
499 memset(iv,0,sizeof(double)*TESTSIZE);
501 fprintf(stderr,"\tpacking/coding %ld... ",ptr);
503 /* pack the codebook, write the testvector */
504 _oggpack_reset(&write);
505 vorbis_book_init_encode(&c,testlist[ptr]); /* get it into memory
507 vorbis_staticbook_pack(testlist[ptr],&write);
508 fprintf(stderr,"Codebook size %ld bytes... ",_oggpack_bytes(&write));
509 for(i=0;i<TESTSIZE;i+=c.dim)
510 vorbis_book_encodev(&c,qv+i,&write);
511 vorbis_book_clear(&c);
513 fprintf(stderr,"OK.\n");
514 fprintf(stderr,"\tunpacking/decoding %ld... ",ptr);
516 /* transfer the write data to a read buffer and unpack/read */
517 _oggpack_readinit(&read,_oggpack_buffer(&write),_oggpack_bytes(&write));
518 if(vorbis_staticbook_unpack(&read,&s)){
519 fprintf(stderr,"Error unpacking codebook.\n");
522 if(vorbis_book_init_decode(&c,&s)){
523 fprintf(stderr,"Error initializing codebook.\n");
527 for(i=0;i<TESTSIZE;i+=c.dim)
528 if(vorbis_book_decodevs(&c,iv+i,&read,1,-1)==-1){
529 fprintf(stderr,"Error reading codebook test data (EOP).\n");
532 for(i=0;i<TESTSIZE;i++)
533 if(fabs(qv[i]-iv[i])>.000001){
534 fprintf(stderr,"read (%g) != written (%g) at position (%ld)\n",
539 fprintf(stderr,"OK\n");
543 /* The above is the trivial stuff; now try unquantizing a log scale codebook */