diff options
author | Nils Wallménius <nils@rockbox.org> | 2010-12-08 17:28:17 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2010-12-08 17:28:17 +0000 |
commit | 2aa511f6bdac6364fe09a0004e4e14b3fc17a6c2 (patch) | |
tree | 7c9bad037e3f57f7138d3846ccdccc48a752cd80 /apps/codecs | |
parent | aff90a9db734186e680c4ef747d66d32a83eb2aa (diff) | |
download | rockbox-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
Diffstat (limited to 'apps/codecs')
-rw-r--r-- | apps/codecs/libtremor/codebook.c | 16 | ||||
-rw-r--r-- | apps/codecs/libtremor/floor0.c | 7 | ||||
-rw-r--r-- | apps/codecs/libtremor/floor1.c | 11 | ||||
-rw-r--r-- | apps/codecs/libtremor/res012.c | 3 | ||||
-rw-r--r-- | apps/codecs/libtremor/vorbisfile.c | 3 |
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 */ | ||
383 | long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, | 384 | long 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 */ | ||
415 | long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a, | 417 | long 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) */ | ||
444 | long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, | 449 | long 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 */ | ||
484 | static long vorbis_book_decodevv_add_2ch_even(codebook *book,ogg_int32_t **a, | 488 | static 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 | } |