summaryrefslogtreecommitdiff
path: root/apps/codecs/libtremor/codebook.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libtremor/codebook.c')
-rw-r--r--apps/codecs/libtremor/codebook.c204
1 files changed, 102 insertions, 102 deletions
diff --git a/apps/codecs/libtremor/codebook.c b/apps/codecs/libtremor/codebook.c
index c6027480a7..6ed6a08672 100644
--- a/apps/codecs/libtremor/codebook.c
+++ b/apps/codecs/libtremor/codebook.c
@@ -49,19 +49,19 @@ int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
49 /* yes, unused entries */ 49 /* yes, unused entries */
50 50
51 for(i=0;i<s->entries;i++){ 51 for(i=0;i<s->entries;i++){
52 if(oggpack_read(opb,1)){ 52 if(oggpack_read(opb,1)){
53 long num=oggpack_read(opb,5); 53 long num=oggpack_read(opb,5);
54 if(num==-1)goto _eofout; 54 if(num==-1)goto _eofout;
55 s->lengthlist[i]=num+1; 55 s->lengthlist[i]=num+1;
56 }else 56 }else
57 s->lengthlist[i]=0; 57 s->lengthlist[i]=0;
58 } 58 }
59 }else{ 59 }else{
60 /* all entries used; no tagging */ 60 /* all entries used; no tagging */
61 for(i=0;i<s->entries;i++){ 61 for(i=0;i<s->entries;i++){
62 long num=oggpack_read(opb,5); 62 long num=oggpack_read(opb,5);
63 if(num==-1)goto _eofout; 63 if(num==-1)goto _eofout;
64 s->lengthlist[i]=num+1; 64 s->lengthlist[i]=num+1;
65 } 65 }
66 } 66 }
67 67
@@ -73,11 +73,11 @@ int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
73 s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); 73 s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries);
74 74
75 for(i=0;i<s->entries;){ 75 for(i=0;i<s->entries;){
76 long num=oggpack_read(opb,_ilog(s->entries-i)); 76 long num=oggpack_read(opb,_ilog(s->entries-i));
77 if(num==-1)goto _eofout; 77 if(num==-1)goto _eofout;
78 for(j=0;j<num && i<s->entries;j++,i++) 78 for(j=0;j<num && i<s->entries;j++,i++)
79 s->lengthlist[i]=length; 79 s->lengthlist[i]=length;
80 length++; 80 length++;
81 } 81 }
82 } 82 }
83 break; 83 break;
@@ -104,17 +104,17 @@ int vorbis_staticbook_unpack(oggpack_buffer *opb,static_codebook *s){
104 int quantvals=0; 104 int quantvals=0;
105 switch(s->maptype){ 105 switch(s->maptype){
106 case 1: 106 case 1:
107 quantvals=_book_maptype1_quantvals(s); 107 quantvals=_book_maptype1_quantvals(s);
108 break; 108 break;
109 case 2: 109 case 2:
110 quantvals=s->entries*s->dim; 110 quantvals=s->entries*s->dim;
111 break; 111 break;
112 } 112 }
113 113
114 /* quantized values */ 114 /* quantized values */
115 s->quantlist=(long *)_ogg_malloc(sizeof(*s->quantlist)*quantvals); 115 s->quantlist=(long *)_ogg_malloc(sizeof(*s->quantlist)*quantvals);
116 for(i=0;i<quantvals;i++) 116 for(i=0;i<quantvals;i++)
117 s->quantlist[i]=oggpack_read(opb,s->q_quant); 117 s->quantlist[i]=oggpack_read(opb,s->q_quant);
118 118
119 if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; 119 if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout;
120 } 120 }
@@ -216,7 +216,7 @@ static inline ogg_uint32_t bitreverse(register ogg_uint32_t x)
216} 216}
217 217
218STIN long decode_packed_entry_number(codebook *book, 218STIN long decode_packed_entry_number(codebook *book,
219 oggpack_buffer *b){ 219 oggpack_buffer *b){
220 int read=book->dec_maxlength; 220 int read=book->dec_maxlength;
221 long lo,hi; 221 long lo,hi;
222 long lok = oggpack_look(b,book->dec_firsttablen); 222 long lok = oggpack_look(b,book->dec_firsttablen);
@@ -284,25 +284,25 @@ static long decode_packed_block(codebook *book, oggpack_buffer *b,
284 ptr = (ogg_uint32_t *)(adr&~3); 284 ptr = (ogg_uint32_t *)(adr&~3);
285 bitend = ((adr&3)+b->headend)*8; 285 bitend = ((adr&3)+b->headend)*8;
286 while (bufptr<bufend){ 286 while (bufptr<bufend){
287 long entry, lo, hi; 287 long entry, lo, hi;
288 if (UNLIKELY(cachesize<book->dec_maxlength)) { 288 if (UNLIKELY(cachesize<book->dec_maxlength)) {
289 if (bit-cachesize+32>=bitend) 289 if (bit-cachesize+32>=bitend)
290 break; 290 break;
291 bit-=cachesize; 291 bit-=cachesize;
292 cache=letoh32(ptr[bit>>5]) >> (bit&31); 292 cache=letoh32(ptr[bit>>5]) >> (bit&31);
293 if (bit&31) 293 if (bit&31)
294 cache|=letoh32(ptr[(bit>>5)+1]) << (32-(bit&31)); 294 cache|=letoh32(ptr[(bit>>5)+1]) << (32-(bit&31));
295 cachesize=32; 295 cachesize=32;
296 bit+=32; 296 bit+=32;
297 } 297 }
298 298
299 entry=book->dec_firsttable[cache&((1<<book->dec_firsttablen)-1)]; 299 entry=book->dec_firsttable[cache&((1<<book->dec_firsttablen)-1)];
300 if(UNLIKELY(entry&0x80000000UL)){ 300 if(UNLIKELY(entry&0x80000000UL)){
301 lo=(entry>>15)&0x7fff; 301 lo=(entry>>15)&0x7fff;
302 hi=book->used_entries-(entry&0x7fff); 302 hi=book->used_entries-(entry&0x7fff);
303 { 303 {
304 ogg_uint32_t testword=bitreverse((ogg_uint32_t)cache); 304 ogg_uint32_t testword=bitreverse((ogg_uint32_t)cache);
305 305
306 while(LIKELY(hi-lo>1)){ 306 while(LIKELY(hi-lo>1)){
307 long p=(hi-lo)>>1; 307 long p=(hi-lo)>>1;
308 if (book->codelist[lo+p]>testword) 308 if (book->codelist[lo+p]>testword)
@@ -312,15 +312,15 @@ static long decode_packed_block(codebook *book, oggpack_buffer *b,
312 } 312 }
313 entry=lo; 313 entry=lo;
314 } 314 }
315 }else 315 }else
316 entry--; 316 entry--;
317 317
318 *bufptr++=entry; 318 *bufptr++=entry;
319 { 319 {
320 int l=book->dec_codelengths[entry]; 320 int l=book->dec_codelengths[entry];
321 cachesize-=l; 321 cachesize-=l;
322 cache>>=l; 322 cache>>=l;
323 } 323 }
324 } 324 }
325 325
326 adr=(unsigned long)b->headptr; 326 adr=(unsigned long)b->headptr;
@@ -366,7 +366,7 @@ long vorbis_book_decode(codebook *book, oggpack_buffer *b){
366 366
367/* returns 0 on OK or -1 on eof *************************************/ 367/* returns 0 on OK or -1 on eof *************************************/
368long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, 368long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
369 oggpack_buffer *b,int n,int point){ 369 oggpack_buffer *b,int n,int point){
370 if(book->used_entries>0){ 370 if(book->used_entries>0){
371 int step=n/book->dim; 371 int step=n/book->dim;
372 long *entry = (long *)alloca(sizeof(*entry)*step); 372 long *entry = (long *)alloca(sizeof(*entry)*step);
@@ -376,29 +376,29 @@ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
376 376
377 if(shift>=0){ 377 if(shift>=0){
378 for (i = 0; i < step; i++) { 378 for (i = 0; i < step; i++) {
379 entry[i]=decode_packed_entry_number(book,b); 379 entry[i]=decode_packed_entry_number(book,b);
380 if(entry[i]==-1)return(-1); 380 if(entry[i]==-1)return(-1);
381 t[i] = book->valuelist+entry[i]*book->dim; 381 t[i] = book->valuelist+entry[i]*book->dim;
382 } 382 }
383 for(i=0,o=0;i<book->dim;i++,o+=step) 383 for(i=0,o=0;i<book->dim;i++,o+=step)
384 for (j=0;j<step;j++) 384 for (j=0;j<step;j++)
385 a[o+j]+=t[j][i]>>shift; 385 a[o+j]+=t[j][i]>>shift;
386 }else{ 386 }else{
387 for (i = 0; i < step; i++) { 387 for (i = 0; i < step; i++) {
388 entry[i]=decode_packed_entry_number(book,b); 388 entry[i]=decode_packed_entry_number(book,b);
389 if(entry[i]==-1)return(-1); 389 if(entry[i]==-1)return(-1);
390 t[i] = book->valuelist+entry[i]*book->dim; 390 t[i] = book->valuelist+entry[i]*book->dim;
391 } 391 }
392 for(i=0,o=0;i<book->dim;i++,o+=step) 392 for(i=0,o=0;i<book->dim;i++,o+=step)
393 for (j=0;j<step;j++) 393 for (j=0;j<step;j++)
394 a[o+j]+=t[j][i]<<-shift; 394 a[o+j]+=t[j][i]<<-shift;
395 } 395 }
396 } 396 }
397 return(0); 397 return(0);
398} 398}
399 399
400long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a, 400long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
401 oggpack_buffer *b,int n,int point){ 401 oggpack_buffer *b,int n,int point){
402 if(book->used_entries>0){ 402 if(book->used_entries>0){
403 int i,j,entry; 403 int i,j,entry;
404 ogg_int32_t *t; 404 ogg_int32_t *t;
@@ -406,20 +406,20 @@ long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
406 406
407 if(shift>=0){ 407 if(shift>=0){
408 for(i=0;i<n;){ 408 for(i=0;i<n;){
409 entry = decode_packed_entry_number(book,b); 409 entry = decode_packed_entry_number(book,b);
410 if(entry==-1)return(-1); 410 if(entry==-1)return(-1);
411 t = book->valuelist+entry*book->dim; 411 t = book->valuelist+entry*book->dim;
412 for (j=0;j<book->dim;) 412 for (j=0;j<book->dim;)
413 a[i++]+=t[j++]>>shift; 413 a[i++]+=t[j++]>>shift;
414 } 414 }
415 }else{ 415 }else{
416 shift = -shift; 416 shift = -shift;
417 for(i=0;i<n;){ 417 for(i=0;i<n;){
418 entry = decode_packed_entry_number(book,b); 418 entry = decode_packed_entry_number(book,b);
419 if(entry==-1)return(-1); 419 if(entry==-1)return(-1);
420 t = book->valuelist+entry*book->dim; 420 t = book->valuelist+entry*book->dim;
421 for (j=0;j<book->dim;) 421 for (j=0;j<book->dim;)
422 a[i++]+=t[j++]<<shift; 422 a[i++]+=t[j++]<<shift;
423 } 423 }
424 } 424 }
425 } 425 }
@@ -427,7 +427,7 @@ long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
427} 427}
428 428
429long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, 429long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
430 oggpack_buffer *b,int n,int point){ 430 oggpack_buffer *b,int n,int point){
431 if(book->used_entries>0){ 431 if(book->used_entries>0){
432 int i,j,entry; 432 int i,j,entry;
433 ogg_int32_t *t; 433 ogg_int32_t *t;
@@ -436,22 +436,22 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
436 if(shift>=0){ 436 if(shift>=0){
437 437
438 for(i=0;i<n;){ 438 for(i=0;i<n;){
439 entry = decode_packed_entry_number(book,b); 439 entry = decode_packed_entry_number(book,b);
440 if(entry==-1)return(-1); 440 if(entry==-1)return(-1);
441 t = book->valuelist+entry*book->dim; 441 t = book->valuelist+entry*book->dim;
442 for (j=0;j<book->dim;){ 442 for (j=0;j<book->dim;){
443 a[i++]=t[j++]>>shift; 443 a[i++]=t[j++]>>shift;
444 } 444 }
445 } 445 }
446 }else{ 446 }else{
447 shift = -shift; 447 shift = -shift;
448 for(i=0;i<n;){ 448 for(i=0;i<n;){
449 entry = decode_packed_entry_number(book,b); 449 entry = decode_packed_entry_number(book,b);
450 if(entry==-1)return(-1); 450 if(entry==-1)return(-1);
451 t = book->valuelist+entry*book->dim; 451 t = book->valuelist+entry*book->dim;
452 for (j=0;j<book->dim;){ 452 for (j=0;j<book->dim;){
453 a[i++]=t[j++]<<shift; 453 a[i++]=t[j++]<<shift;
454 } 454 }
455 } 455 }
456 } 456 }
457 }else{ 457 }else{
@@ -459,7 +459,7 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
459 int i,j; 459 int i,j;
460 for(i=0;i<n;){ 460 for(i=0;i<n;){
461 for (j=0;j<book->dim;){ 461 for (j=0;j<book->dim;){
462 a[i++]=0; 462 a[i++]=0;
463 } 463 }
464 } 464 }
465 } 465 }
@@ -516,8 +516,8 @@ static long vorbis_book_decodevv_add_2ch_even(codebook *book,ogg_int32_t **a,
516} 516}
517 517
518long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a, 518long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
519 long offset,int ch, 519 long offset,int ch,
520 oggpack_buffer *b,int n,int point){ 520 oggpack_buffer *b,int n,int point){
521 if(LIKELY(book->used_entries>0)){ 521 if(LIKELY(book->used_entries>0)){
522 long i,j,k,chunk,read; 522 long i,j,k,chunk,read;
523 int chptr=0; 523 int chptr=0;
@@ -535,14 +535,14 @@ long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
535 chunk=((offset+n-i)*ch+book->dim-1)/book->dim; 535 chunk=((offset+n-i)*ch+book->dim-1)/book->dim;
536 read = decode_packed_block(book,b,entries,chunk); 536 read = decode_packed_block(book,b,entries,chunk);
537 for(k=0;k<read;k++){ 537 for(k=0;k<read;k++){
538 const ogg_int32_t *t = book->valuelist+entries[k]*book->dim; 538 const ogg_int32_t *t = book->valuelist+entries[k]*book->dim;
539 for (j=0;j<book->dim;j++){ 539 for (j=0;j<book->dim;j++){
540 a[chptr++][i]+=t[j]>>shift; 540 a[chptr++][i]+=t[j]>>shift;
541 if(chptr==ch){ 541 if(chptr==ch){
542 chptr=0; 542 chptr=0;
543 i++; 543 i++;
544 } 544 }
545 } 545 }
546 } 546 }
547 if (read<chunk)return-1; 547 if (read<chunk)return-1;
548 } 548 }
@@ -554,14 +554,14 @@ long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
554 chunk=((offset+n-i)*ch+book->dim-1)/book->dim; 554 chunk=((offset+n-i)*ch+book->dim-1)/book->dim;
555 read = decode_packed_block(book,b,entries,chunk); 555 read = decode_packed_block(book,b,entries,chunk);
556 for(k=0;k<read;k++){ 556 for(k=0;k<read;k++){
557 const ogg_int32_t *t = book->valuelist+entries[k]*book->dim; 557 const ogg_int32_t *t = book->valuelist+entries[k]*book->dim;
558 for (j=0;j<book->dim;j++){ 558 for (j=0;j<book->dim;j++){
559 a[chptr++][i]+=t[j]<<shift; 559 a[chptr++][i]+=t[j]<<shift;
560 if(chptr==ch){ 560 if(chptr==ch){
561 chptr=0; 561 chptr=0;
562 i++; 562 i++;
563 } 563 }
564 } 564 }
565 } 565 }
566 if (read<chunk)return-1; 566 if (read<chunk)return-1;
567 } 567 }