diff options
Diffstat (limited to 'apps/codecs/libtremor/codebook.c')
-rw-r--r-- | apps/codecs/libtremor/codebook.c | 204 |
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 | ||
218 | STIN long decode_packed_entry_number(codebook *book, | 218 | STIN 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 *************************************/ |
368 | long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, | 368 | long 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 | ||
400 | long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a, | 400 | long 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 | ||
429 | long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, | 429 | long 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 | ||
518 | long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a, | 518 | long 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 | } |