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.14 2000/05/08 20:49:48 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 the number of bits and *modifies a* to the quantization value *****/
276 int vorbis_book_encodev(codebook *book,double *a,oggpack_buffer *b){
278 int best=_best(book,a,1);
280 a[k]=(book->valuelist+best*dim)[k];
281 return(vorbis_book_encode(book,best,b));
284 /* res0 (multistage, interleave, lattice) */
285 /* returns the number of bits and *modifies a* to the remainder value ********/
286 int vorbis_book_encodevs(codebook *book,double *a,oggpack_buffer *b,
287 int step,int addmul){
289 int best=vorbis_book_besterror(book,a,step,addmul);
290 return(vorbis_book_encode(book,best,b));
293 /* Decode side is specced and easier, because we don't need to find
294 matches using different criteria; we simply read and map. There are
295 two things we need to do 'depending':
297 We may need to support interleave. We don't really, but it's
298 convenient to do it here rather than rebuild the vector later.
300 Cascades may be additive or multiplicitive; this is not inherent in
301 the codebook, but set in the code using the codebook. Like
302 interleaving, it's easiest to do it here.
303 stage==0 -> declarative (set the value)
305 stage==2 -> multiplicitive */
307 /* returns the entry number or -1 on eof *************************************/
308 long vorbis_book_decode(codebook *book, oggpack_buffer *b){
310 decode_aux *t=book->decode_tree;
312 switch(_oggpack_read1(b)){
326 /* returns the entry number or -1 on eof *************************************/
327 long vorbis_book_decodevs(codebook *book,double *a,oggpack_buffer *b,
328 int step,int addmul){
329 long entry=vorbis_book_decode(book,b);
331 if(entry==-1)return(-1);
334 for(i=0,o=0;i<book->dim;i++,o+=step)
335 a[o]=(book->valuelist+entry*book->dim)[i];
338 for(i=0,o=0;i<book->dim;i++,o+=step)
339 a[o]+=(book->valuelist+entry*book->dim)[i];
342 for(i=0,o=0;i<book->dim;i++,o+=step)
343 a[o]*=(book->valuelist+entry*book->dim)[i];
351 /* Simple enough; pack a few candidate codebooks, unpack them. Code a
352 number of vectors through (keeping track of the quantized values),
353 and decode using the unpacked book. quantized version of in should
357 #include "vorbis/book/lsp20_0.vqh"
358 #include "vorbis/book/lsp32_0.vqh"
359 #include "vorbis/book/res0_1a.vqh"
362 double test1[TESTSIZE]={
414 double test2[TESTSIZE]={
466 double test3[TESTSIZE]={
467 0,1,-2,3,4,-5,6,7,8,9,
468 8,-2,7,-1,4,6,8,3,1,-9,
469 10,11,12,13,14,15,26,17,18,19,
470 30,-25,-30,-1,-5,-32,4,3,-2,0};
472 static_codebook *testlist[]={&_vq_book_lsp20_0,
474 &_vq_book_res0_1a,NULL};
475 double *testvec[]={test1,test2,test3};
478 oggpack_buffer write;
481 _oggpack_writeinit(&write);
483 fprintf(stderr,"Testing codebook abstraction...:\n");
485 while(testlist[ptr]){
488 double *qv=alloca(sizeof(double)*TESTSIZE);
489 double *iv=alloca(sizeof(double)*TESTSIZE);
490 memcpy(qv,testvec[ptr],sizeof(double)*TESTSIZE);
491 memset(iv,0,sizeof(double)*TESTSIZE);
493 fprintf(stderr,"\tpacking/coding %ld... ",ptr);
495 /* pack the codebook, write the testvector */
496 _oggpack_reset(&write);
497 vorbis_book_init_encode(&c,testlist[ptr]); /* get it into memory
499 vorbis_staticbook_pack(testlist[ptr],&write);
500 fprintf(stderr,"Codebook size %ld bytes... ",_oggpack_bytes(&write));
501 for(i=0;i<TESTSIZE;i+=c.dim)
502 vorbis_book_encodev(&c,qv+i,&write);
503 vorbis_book_clear(&c);
505 fprintf(stderr,"OK.\n");
506 fprintf(stderr,"\tunpacking/decoding %ld... ",ptr);
508 /* transfer the write data to a read buffer and unpack/read */
509 _oggpack_readinit(&read,_oggpack_buffer(&write),_oggpack_bytes(&write));
510 if(vorbis_staticbook_unpack(&read,&s)){
511 fprintf(stderr,"Error unpacking codebook.\n");
514 if(vorbis_book_init_decode(&c,&s)){
515 fprintf(stderr,"Error initializing codebook.\n");
519 for(i=0;i<TESTSIZE;i+=c.dim)
520 if(vorbis_book_decodevs(&c,iv+i,&read,1,-1)==-1){
521 fprintf(stderr,"Error reading codebook test data (EOP).\n");
524 for(i=0;i<TESTSIZE;i++)
525 if(fabs(qv[i]-iv[i])>.000001){
526 fprintf(stderr,"read (%g) != written (%g) at position (%ld)\n",
531 fprintf(stderr,"OK\n");
535 /* The above is the trivial stuff; now try unquantizing a log scale codebook */