vorbis_codebook.c (13408B)
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 }