summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/codebook.c
diff options
context:
space:
mode:
authorTomasz Malesinski <tomal@rockbox.org>2007-09-27 21:58:51 +0000
committerTomasz Malesinski <tomal@rockbox.org>2007-09-27 21:58:51 +0000
commitc13eba29ff5615cc74a7818e42cc9d464a7c7075 (patch)
treeeef1dfc0d4ed2b69e16b119b0d47052801ef827f /apps/codecs/Tremor/codebook.c
parent1aaf5dbdb660d29ef384674f25c916f23da505bb (diff)
downloadrockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.tar.gz
rockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.zip
FS #7833: Optimizations to the Vorbis codec:
- ARM assembly version of parts of mdct, - special case for vorbis_book_decodevv_add for 2 channels and even book->dim, - store the output in vb->pcm if possible, as it is usually in IRAM as opposed to v->pcm. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14875 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/Tremor/codebook.c')
-rw-r--r--apps/codecs/Tremor/codebook.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/apps/codecs/Tremor/codebook.c b/apps/codecs/Tremor/codebook.c
index 1287a95011..8c319ab49e 100644
--- a/apps/codecs/Tremor/codebook.c
+++ b/apps/codecs/Tremor/codebook.c
@@ -199,7 +199,7 @@ STIN long decode_packed_entry_number(codebook *book,
199 return(-1); 199 return(-1);
200} 200}
201 201
202static inline long decode_packed_block(codebook *book, oggpack_buffer *b, 202static long decode_packed_block(codebook *book, oggpack_buffer *b,
203 long *buf, int n){ 203 long *buf, int n){
204 long *bufptr = buf; 204 long *bufptr = buf;
205 long *bufend = buf + n; 205 long *bufend = buf + n;
@@ -399,6 +399,55 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
399 return(0); 399 return(0);
400} 400}
401 401
402static long vorbis_book_decodevv_add_2ch_even(codebook *book,ogg_int32_t **a,
403 long offset,oggpack_buffer *b,
404 int n,int point){
405 long i,k,chunk,read;
406 int shift=point-book->binarypoint;
407 long entries[32];
408 ogg_int32_t *p0 = &(a[0][offset]);
409 ogg_int32_t *p1 = &(a[1][offset]);
410
411 if(shift>=0){
412
413 for(i=0;i<n;){
414 chunk=32;
415 if (chunk*book->dim>(n-i)*2)
416 chunk=((n-i)*2+book->dim-1)/book->dim;
417 read = decode_packed_block(book,b,entries,chunk);
418 for(k=0;k<read;k++){
419 const ogg_int32_t *t = book->valuelist+entries[k]*book->dim;
420 const ogg_int32_t *u = t+book->dim;
421 do{
422 *p0++ += *t++>>shift;
423 *p1++ += *t++>>shift;
424 }while(t<u);
425 }
426 if (read<chunk)return-1;
427 i += read*book->dim/2;
428 }
429 }else{
430 shift = -shift;
431 for(i=0;i<n;){
432 chunk=32;
433 if (chunk*book->dim>(n-i)*2)
434 chunk=((n-i)*2+book->dim-1)/book->dim;
435 read = decode_packed_block(book,b,entries,chunk);
436 for(k=0;k<read;k++){
437 const ogg_int32_t *t = book->valuelist+entries[k]*book->dim;
438 const ogg_int32_t *u = t+book->dim;
439 do{
440 *p0++ += *t++<<shift;
441 *p1++ += *t++<<shift;
442 }while(t<u);
443 }
444 if (read<chunk)return-1;
445 i += read*book->dim/2;
446 }
447 }
448 return(0);
449}
450
402long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a, 451long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
403 long offset,int ch, 452 long offset,int ch,
404 oggpack_buffer *b,int n,int point){ 453 oggpack_buffer *b,int n,int point){
@@ -408,6 +457,9 @@ long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
408 int shift=point-book->binarypoint; 457 int shift=point-book->binarypoint;
409 long entries[32]; 458 long entries[32];
410 459
460 if (!(book->dim&1) && ch==2)
461 return vorbis_book_decodevv_add_2ch_even(book,a,offset,b,n,point);
462
411 if(shift>=0){ 463 if(shift>=0){
412 464
413 for(i=offset;i<offset+n;){ 465 for(i=offset;i<offset+n;){