summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2010-12-08 17:28:17 +0000
committerNils Wallménius <nils@rockbox.org>2010-12-08 17:28:17 +0000
commit2aa511f6bdac6364fe09a0004e4e14b3fc17a6c2 (patch)
tree7c9bad037e3f57f7138d3846ccdccc48a752cd80
parentaff90a9db734186e680c4ef747d66d32a83eb2aa (diff)
downloadrockbox-2aa511f6bdac6364fe09a0004e4e14b3fc17a6c2.tar.gz
rockbox-2aa511f6bdac6364fe09a0004e4e14b3fc17a6c2.zip
libtremor: merge upstream revisions 17541, 17542, 17543, 17544, 17545, 17546, 17547, 17555, 17572, bringing in various fixes and finally bringing our libtremor up to date, for now.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28773 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/libtremor/codebook.c16
-rw-r--r--apps/codecs/libtremor/floor0.c7
-rw-r--r--apps/codecs/libtremor/floor1.c11
-rw-r--r--apps/codecs/libtremor/res012.c3
-rw-r--r--apps/codecs/libtremor/vorbisfile.c3
5 files changed, 25 insertions, 15 deletions
diff --git a/apps/codecs/libtremor/codebook.c b/apps/codecs/libtremor/codebook.c
index e00d648a59..9413257e2a 100644
--- a/apps/codecs/libtremor/codebook.c
+++ b/apps/codecs/libtremor/codebook.c
@@ -380,6 +380,7 @@ long vorbis_book_decode(codebook *book, oggpack_buffer *b){
380} 380}
381 381
382/* returns 0 on OK or -1 on eof *************************************/ 382/* returns 0 on OK or -1 on eof *************************************/
383/* decode vector / dim granularity gaurding is done in the upper layer */
383long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, 384long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
384 oggpack_buffer *b,int n,int point){ 385 oggpack_buffer *b,int n,int point){
385 if(book->used_entries>0){ 386 if(book->used_entries>0){
@@ -412,6 +413,7 @@ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a,
412 return(0); 413 return(0);
413} 414}
414 415
416/* decode vector / dim granularity gaurding is done in the upper layer */
415long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a, 417long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
416 oggpack_buffer *b,int n,int point){ 418 oggpack_buffer *b,int n,int point){
417 if(book->used_entries>0){ 419 if(book->used_entries>0){
@@ -441,6 +443,9 @@ long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a,
441 return(0); 443 return(0);
442} 444}
443 445
446/* unlike the others, we guard against n not being an integer number
447 of <dim> internally rather than in the upper layer (called only by
448 floor0) */
444long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, 449long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
445 oggpack_buffer *b,int n,int point){ 450 oggpack_buffer *b,int n,int point){
446 if(book->used_entries>0){ 451 if(book->used_entries>0){
@@ -454,7 +459,7 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
454 entry = decode_packed_entry_number(book,b); 459 entry = decode_packed_entry_number(book,b);
455 if(entry==-1)return(-1); 460 if(entry==-1)return(-1);
456 t = book->valuelist+entry*book->dim; 461 t = book->valuelist+entry*book->dim;
457 for (j=0;j<book->dim;){ 462 for (j=0;i<n && j<book->dim;){
458 a[i++]=t[j++]>>shift; 463 a[i++]=t[j++]>>shift;
459 } 464 }
460 } 465 }
@@ -464,23 +469,22 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
464 entry = decode_packed_entry_number(book,b); 469 entry = decode_packed_entry_number(book,b);
465 if(entry==-1)return(-1); 470 if(entry==-1)return(-1);
466 t = book->valuelist+entry*book->dim; 471 t = book->valuelist+entry*book->dim;
467 for (j=0;j<book->dim;){ 472 for (j=0;i<n && j<book->dim;){
468 a[i++]=t[j++]<<shift; 473 a[i++]=t[j++]<<shift;
469 } 474 }
470 } 475 }
471 } 476 }
472 }else{ 477 }else{
473 478
474 int i,j; 479 int i;
475 for(i=0;i<n;){ 480 for(i=0;i<n;){
476 for (j=0;j<book->dim;){ 481 a[i++]=0;
477 a[i++]=0;
478 }
479 } 482 }
480 } 483 }
481 return(0); 484 return(0);
482} 485}
483 486
487/* decode vector / dim granularity gaurding is done in the upper layer */
484static long vorbis_book_decodevv_add_2ch_even(codebook *book,ogg_int32_t **a, 488static long vorbis_book_decodevv_add_2ch_even(codebook *book,ogg_int32_t **a,
485 long offset,oggpack_buffer *b, 489 long offset,oggpack_buffer *b,
486 unsigned int n,int point){ 490 unsigned int n,int point){
diff --git a/apps/codecs/libtremor/floor0.c b/apps/codecs/libtremor/floor0.c
index 075bc36ef7..cd0a9f89f6 100644
--- a/apps/codecs/libtremor/floor0.c
+++ b/apps/codecs/libtremor/floor0.c
@@ -330,6 +330,8 @@ static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){
330 for(j=0;j<info->numbooks;j++){ 330 for(j=0;j<info->numbooks;j++){
331 info->books[j]=oggpack_read(opb,8); 331 info->books[j]=oggpack_read(opb,8);
332 if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; 332 if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out;
333 if(ci->book_param[info->books[j]]->maptype==0)goto err_out;
334 if(ci->book_param[info->books[j]]->dim<1)goto err_out;
333 } 335 }
334 return(info); 336 return(info);
335 337
@@ -400,10 +402,9 @@ static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){
400 ogg_int32_t last=0; 402 ogg_int32_t last=0;
401 ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1)); 403 ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1));
402 404
403 for(j=0;j<look->m;j+=b->dim) 405 if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m,-24)==-1)goto eop;
404 if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim,-24)==-1)goto eop;
405 for(j=0;j<look->m;){ 406 for(j=0;j<look->m;){
406 for(k=0;k<b->dim;k++,j++)lsp[j]+=last; 407 for(k=0;j<look->m && k<b->dim;k++,j++)lsp[j]+=last;
407 last=lsp[j-1]; 408 last=lsp[j-1];
408 } 409 }
409 410
diff --git a/apps/codecs/libtremor/floor1.c b/apps/codecs/libtremor/floor1.c
index ae92b23058..65286399d0 100644
--- a/apps/codecs/libtremor/floor1.c
+++ b/apps/codecs/libtremor/floor1.c
@@ -361,7 +361,7 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
361 } 361 }
362 } 362 }
363 363
364 fit_value[i]=val+predicted; 364 fit_value[i]=(val+predicted)&0x7fff;;
365 fit_value[look->loneighbor[i-2]]&=0x7fff; 365 fit_value[look->loneighbor[i-2]]&=0x7fff;
366 fit_value[look->hineighbor[i-2]]&=0x7fff; 366 fit_value[look->hineighbor[i-2]]&=0x7fff;
367 367
@@ -393,14 +393,19 @@ static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
393 int hx=0; 393 int hx=0;
394 int lx=0; 394 int lx=0;
395 int ly=fit_value[0]*info->mult; 395 int ly=fit_value[0]*info->mult;
396 /* guard lookup against out-of-range values */
397 ly=(ly<0?0:ly>255?255:ly);
398
396 for(j=1;j<look->posts;j++){ 399 for(j=1;j<look->posts;j++){
397 int current=look->forward_index[j]; 400 int current=look->forward_index[j];
398 int hy=fit_value[current]&0x7fff; 401 int hy=fit_value[current]&0x7fff;
399 if(hy==fit_value[current]){ 402 if(hy==fit_value[current]){
400 403
404 hx=info->postlist[current];
401 hy*=info->mult; 405 hy*=info->mult;
402 hx=info->postlist[current]; 406 /* guard lookup against out-of-range values */
403 407 hy=(hy<0?0:hy>255?255:hy);
408
404 render_line(lx, ly, hx, hy, out); 409 render_line(lx, ly, hx, hy, out);
405 410
406 lx=hx; 411 lx=hx;
diff --git a/apps/codecs/libtremor/res012.c b/apps/codecs/libtremor/res012.c
index 1263fa65ba..79e3c23e15 100644
--- a/apps/codecs/libtremor/res012.c
+++ b/apps/codecs/libtremor/res012.c
@@ -135,6 +135,7 @@ static vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){
135 int entries = ci->book_param[info->groupbook]->entries; 135 int entries = ci->book_param[info->groupbook]->entries;
136 int dim = ci->book_param[info->groupbook]->dim; 136 int dim = ci->book_param[info->groupbook]->dim;
137 int partvals = 1; 137 int partvals = 1;
138 if (dim<1) goto errout;
138 while(dim>0){ 139 while(dim>0){
139 partvals *= info->partitions; 140 partvals *= info->partitions;
140 if(partvals > entries) goto errout; 141 if(partvals > entries) goto errout;
@@ -322,7 +323,7 @@ int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl,
322 if(s==0){ 323 if(s==0){
323 /* fetch the partition word */ 324 /* fetch the partition word */
324 int temp=vorbis_book_decode(look->phrasebook,&vb->opb); 325 int temp=vorbis_book_decode(look->phrasebook,&vb->opb);
325 if(temp==-1 || temp>info->partvals)goto eopbreak; 326 if(temp==-1 || temp>=info->partvals)goto eopbreak;
326 partword[l]=look->decodemap[temp]; 327 partword[l]=look->decodemap[temp];
327 if(partword[l]==NULL)goto errout; 328 if(partword[l]==NULL)goto errout;
328 } 329 }
diff --git a/apps/codecs/libtremor/vorbisfile.c b/apps/codecs/libtremor/vorbisfile.c
index f0a83364ec..5721178b67 100644
--- a/apps/codecs/libtremor/vorbisfile.c
+++ b/apps/codecs/libtremor/vorbisfile.c
@@ -902,7 +902,7 @@ static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial,
902 for second stage of seekable stream open; this saves having to 902 for second stage of seekable stream open; this saves having to
903 seek/reread first link's serialnumber data then. */ 903 seek/reread first link's serialnumber data then. */
904 vf->serialnos=_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos)); 904 vf->serialnos=_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos));
905 vf->serialnos[0]=vf->current_serialno; 905 vf->serialnos[0]=vf->current_serialno=vf->os.serialno;
906 vf->serialnos[1]=serialno_list_size; 906 vf->serialnos[1]=serialno_list_size;
907 memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos)); 907 memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos));
908 908
@@ -910,7 +910,6 @@ static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial,
910 vf->dataoffsets=_ogg_calloc(1,sizeof(*vf->dataoffsets)); 910 vf->dataoffsets=_ogg_calloc(1,sizeof(*vf->dataoffsets));
911 vf->offsets[0]=0; 911 vf->offsets[0]=0;
912 vf->dataoffsets[0]=vf->offset; 912 vf->dataoffsets[0]=vf->offset;
913 vf->current_serialno=vf->os.serialno;
914 913
915 vf->ready_state=PARTOPEN; 914 vf->ready_state=PARTOPEN;
916 } 915 }