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