| 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 | |