1 /********************************************************************
2 * *
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. *
7 * *
8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
9 * by the Xiph.Org Foundation http://www.xiph.org/ *
10 * *
11 ********************************************************************
12
13 function: basic codebook pack/unpack/code/decode operations
14 last mod: $Id: codebook.c 17030 2010-03-25 06:52:55Z xiphmont $
15
16 ********************************************************************/
17
18 #include <stdlib.h>
19 #include <string.h>
20 #include <math.h>
21 #include <ogg/ogg.h>
22 #include "vorbis/codec.h"
23 #include "codebook.h"
24 #include "scales.h"
25 #include "misc.h"
26 #include "os.h"
27
28 /* packs the given codebook into the bitstream **************************/
29
vorbis_staticbook_pack(const static_codebook * c,oggpack_buffer * opb)30 int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){
31 long i,j;
32 int ordered=0;
33
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);
38
39 /* pack the codewords. There are two packings; length ordered and
40 length random. Decide between the two now. */
41
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;
45
46 if(ordered){
47 /* length ordered. We only need to say how many codewords of
48 each length. The actual codewords are generated
49 deterministically */
50
51 long count=0;
52 oggpack_write(opb,1,1); /* ordered */
53 oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */
54
55 for(i=1;i<c->entries;i++){
56 long this=c->lengthlist[i];
57 long last=c->lengthlist[i-1];
58 if(this>last){
59 for(j=last;j<this;j++){
60 oggpack_write(opb,i-count,_ilog(c->entries-count));
61 count=i;
62 }
63 }
64 }
65 oggpack_write(opb,i-count,_ilog(c->entries-count));
66
67 }else{
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 */
71
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;
77
78 if(i==c->entries){
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);
82 }else{
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);
87 }else{
88 oggpack_write(opb,1,1);
89 oggpack_write(opb,c->lengthlist[i]-1,5);
90 }
91 }
92 }
93 }
94
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);
98 switch(c->maptype){
99 case 0:
100 /* no mapping */
101 break;
102 case 1:case 2:
103 /* implicitly populated value mapping */
104 /* explicitly populated value mapping */
105
106 if(!c->quantlist){
107 /* no quantlist? error */
108 return(-1);
109 }
110
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);
116
117 {
118 int quantvals;
119 switch(c->maptype){
120 case 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);
124 break;
125 case 2:
126 /* every value (c->entries*c->dim total) specified explicitly */
127 quantvals=c->entries*c->dim;
128 break;
129 default: /* NOT_REACHABLE */
130 quantvals=-1;
131 }
132
133 /* quantized values */
134 for(i=0;i<quantvals;i++)
135 oggpack_write(opb,labs(c->quantlist[i]),c->q_quant);
136
137 }
138 break;
139 default:
140 /* error case; we don't have any other map types now */
141 return(-1);
142 }
143
144 return(0);
145 }
146
147 /* unpacks a codebook from the packet buffer into the codebook struct,
148 readies the codebook auxiliary structures for decode *************/
vorbis_staticbook_unpack(oggpack_buffer * opb)149 static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){
150 long i,j;
151 static_codebook *s=_ogg_calloc(1,sizeof(*s));
152 s->allocedp=1;
153
154 /* make sure alignment is correct */
155 if(oggpack_read(opb,24)!=0x564342)goto _eofout;
156
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;
161
162 if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout;
163
164 /* codeword ordering.... length ordered or unordered? */
165 switch((int)oggpack_read(opb,1)){
166 case 0:
167 /* unordered */
168 s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
169
170 /* allocated but unused entries? */
171 if(oggpack_read(opb,1)){
172 /* yes, unused entries */
173
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;
179 }else
180 s->lengthlist[i]=0;
181 }
182 }else{
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;
188 }
189 }
190
191 break;
192 case 1:
193 /* ordered */
194 {
195 long length=oggpack_read(opb,5)+1;
196 s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
197
198 for(i=0;i<s->entries;){
199 long num=oggpack_read(opb,_ilog(s->entries-i));
200 if(num==-1)goto _eofout;
201 if(length>32)goto _errout;
202 for(j=0;j<num && i<s->entries;j++,i++)
203 s->lengthlist[i]=length;
204 length++;
205 }
206 }
207 break;
208 default:
209 /* EOF */
210 goto _eofout;
211 }
212
213 /* Do we have a mapping to unpack? */
214 switch((s->maptype=oggpack_read(opb,4))){
215 case 0:
216 /* no mapping */
217 break;
218 case 1: case 2:
219 /* implicitly populated value mapping */
220 /* explicitly populated value mapping */
221
222 s->q_min=oggpack_read(opb,32);
223 s->q_delta=oggpack_read(opb,32);
224 s->q_quant=oggpack_read(opb,4)+1;
225 s->q_sequencep=oggpack_read(opb,1);
226 if(s->q_sequencep==-1)goto _eofout;
227
228 {
229 int quantvals=0;
230 switch(s->maptype){
231 case 1:
232 quantvals=(s->dim==0?0:_book_maptype1_quantvals(s));
233 break;
234 case 2:
235 quantvals=s->entries*s->dim;
236 break;
237 }
238
239 /* quantized values */
240 s->quantlist=_ogg_malloc(sizeof(*s->quantlist)*quantvals);
241 for(i=0;i<quantvals;i++)
242 s->quantlist[i]=oggpack_read(opb,s->q_quant);
243
244 if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout;
245 }
246 break;
247 default:
248 goto _errout;
249 }
250
251 /* all set */
252 return(s);
253
254 _errout:
255 _eofout:
256 vorbis_staticbook_destroy(s);
257 return(NULL);
258 }
259
260 /* returns the number of bits ************************************************/
vorbis_book_encode(codebook * book,int a,oggpack_buffer * b)261 int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){
262 if(a<0 || a>=book->c->entries)return(0);
263 oggpack_write(b,book->codelist[a],book->c->lengthlist[a]);
264 return(book->c->lengthlist[a]);
265 }
266
267 /* the 'eliminate the decode tree' optimization actually requires the
268 codewords to be MSb first, not LSb. This is an annoying inelegancy
269 (and one of the first places where carefully thought out design
270 turned out to be wrong; Vorbis II and future Ogg codecs should go
271 to an MSb bitpacker), but not actually the huge hit it appears to
272 be. The first-stage decode table catches most words so that
273 bitreverse is not in the main execution path. */
274
bitreverse(ogg_uint32_t x)275 static ogg_uint32_t bitreverse(ogg_uint32_t x){
276 x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000);
277 x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00);
278 x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0);
279 x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc);
280 return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa);
281 }
282
decode_packed_entry_number(codebook * book,oggpack_buffer * b)283 STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){
284 int read=book->dec_maxlength;
285 long lo,hi;
286 long lok = oggpack_look(b,book->dec_firsttablen);
287
288 if (lok >= 0) {
289 long entry = book->dec_firsttable[lok];
290 if(entry&0x80000000UL){
291 lo=(entry>>15)&0x7fff;
292 hi=book->used_entries-(entry&0x7fff);
293 }else{
294 oggpack_adv(b, book->dec_codelengths[entry-1]);
295 return(entry-1);
296 }
297 }else{
298 lo=0;
299 hi=book->used_entries;
300 }
301
302 lok = oggpack_look(b, read);
303
304 while(lok<0 && read>1)
305 lok = oggpack_look(b, --read);
306 if(lok<0)return -1;
307
308 /* bisect search for the codeword in the ordered list */
309 {
310 ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok);
311
312 while(hi-lo>1){
313 long p=(hi-lo)>>1;
314 long test=book->codelist[lo+p]>testword;
315 lo+=p&(test-1);
316 hi-=p&(-test);
317 }
318
319 if(book->dec_codelengths[lo]<=read){
320 oggpack_adv(b, book->dec_codelengths[lo]);
321 return(lo);
322 }
323 }
324
325 oggpack_adv(b, read);
326
327 return(-1);
328 }
329
330 /* Decode side is specced and easier, because we don't need to find
331 matches using different criteria; we simply read and map. There are
332 two things we need to do 'depending':
333
334 We may need to support interleave. We don't really, but it's
335 convenient to do it here rather than rebuild the vector later.
336
337 Cascades may be additive or multiplicitive; this is not inherent in
338 the codebook, but set in the code using the codebook. Like
339 interleaving, it's easiest to do it here.
340 addmul==0 -> declarative (set the value)
341 addmul==1 -> additive
342 addmul==2 -> multiplicitive */
343
344 /* returns the [original, not compacted] entry number or -1 on eof *********/
vorbis_book_decode(codebook * book,oggpack_buffer * b)345 long vorbis_book_decode(codebook *book, oggpack_buffer *b){
346 if(book->used_entries>0){
347 long packed_entry=decode_packed_entry_number(book,b);
348 if(packed_entry>=0)
349 return(book->dec_index[packed_entry]);
350 }
351
352 /* if there's no dec_index, the codebook unpacking isn't collapsed */
353 return(-1);
354 }
355
356 /* returns 0 on OK or -1 on eof *************************************/
vorbis_book_decodevs_add(codebook * book,float * a,oggpack_buffer * b,int n)357 long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){
358 if(book->used_entries>0){
359 int step=n/book->dim;
360 long *entry = alloca(sizeof(*entry)*step);
361 float **t = alloca(sizeof(*t)*step);
362 int i,j,o;
363
364 for (i = 0; i < step; i++) {
365 entry[i]=decode_packed_entry_number(book,b);
366 if(entry[i]==-1)return(-1);
367 t[i] = book->valuelist+entry[i]*book->dim;
368 }
369 for(i=0,o=0;i<book->dim;i++,o+=step)
370 for (j=0;j<step;j++)
371 a[o+j]+=t[j][i];
372 }
373 return(0);
374 }
375
vorbis_book_decodev_add(codebook * book,float * a,oggpack_buffer * b,int n)376 long vorbis_book_decodev_add(codebook *book,float *a,oggpack_buffer *b,int n){
377 if(book->used_entries>0){
378 int i,j,entry;
379 float *t;
380
381 if(book->dim>8){
382 for(i=0;i<n;){
383 entry = decode_packed_entry_number(book,b);
384 if(entry==-1)return(-1);
385 t = book->valuelist+entry*book->dim;
386 for (j=0;j<book->dim;)
387 a[i++]+=t[j++];
388 }
389 }else{
390 for(i=0;i<n;){
391 entry = decode_packed_entry_number(book,b);
392 if(entry==-1)return(-1);
393 t = book->valuelist+entry*book->dim;
394 j=0;
395 switch((int)book->dim){
396 case 8:
397 a[i++]+=t[j++];
398 case 7:
399 a[i++]+=t[j++];
400 case 6:
401 a[i++]+=t[j++];
402 case 5:
403 a[i++]+=t[j++];
404 case 4:
405 a[i++]+=t[j++];
406 case 3:
407 a[i++]+=t[j++];
408 case 2:
409 a[i++]+=t[j++];
410 case 1:
411 a[i++]+=t[j++];
412 case 0:
413 break;
414 }
415 }
416 }
417 }
418 return(0);
419 }
420
vorbis_book_decodev_set(codebook * book,float * a,oggpack_buffer * b,int n)421 long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){
422 if(book->used_entries>0){
423 int i,j,entry;
424 float *t;
425
426 for(i=0;i<n;){
427 entry = decode_packed_entry_number(book,b);
428 if(entry==-1)return(-1);
429 t = book->valuelist+entry*book->dim;
430 for (j=0;j<book->dim;)
431 a[i++]=t[j++];
432 }
433 }else{
434 int i,j;
435
436 for(i=0;i<n;){
437 for (j=0;j<book->dim;)
438 a[i++]=0.f;
439 }
440 }
441 return(0);
442 }
443
vorbis_book_decodevv_add(codebook * book,float ** a,long offset,int ch,oggpack_buffer * b,int n)444 long vorbis_book_decodevv_add(codebook *book,float **a,long offset,int ch,
445 oggpack_buffer *b,int n){
446
447 long i,j,entry;
448 int chptr=0;
449 if(book->used_entries>0){
450 for(i=offset/ch;i<(offset+n)/ch;){
451 entry = decode_packed_entry_number(book,b);
452 if(entry==-1)return(-1);
453 {
454 const float *t = book->valuelist+entry*book->dim;
455 for (j=0;j<book->dim;j++){
456 a[chptr++][i]+=t[j];
457 if(chptr==ch){
458 chptr=0;
459 i++;
460 }
461 }
462 }
463 }
464 }
465 return(0);
466 }
467