summaryrefslogtreecommitdiff
path: root/apps/codecs/libtremor/codebook.c
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2010-05-12 22:41:17 +0000
committerNils Wallménius <nils@rockbox.org>2010-05-12 22:41:17 +0000
commit85f0873682635eeab11c1e6834ce0734b9cd3569 (patch)
tree3e2779f828af76be9f549bb42f0c0a76a229f6d6 /apps/codecs/libtremor/codebook.c
parente5d6d7a47ecd272639feba4ce0e23a174bbff681 (diff)
downloadrockbox-85f0873682635eeab11c1e6834ce0734b9cd3569.zip
rockbox-85f0873682635eeab11c1e6834ce0734b9cd3569.tar.gz
rockbox-85f0873682635eeab11c1e6834ce0734b9cd3569.tar.bz2
rockbox-85f0873682635eeab11c1e6834ce0734b9cd3569.tar.xz
Simplify special case function, speedup of about 0.2MHz on both coldfire and pp decoding the files in the test set
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25977 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libtremor/codebook.c')
-rw-r--r--apps/codecs/libtremor/codebook.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/apps/codecs/libtremor/codebook.c b/apps/codecs/libtremor/codebook.c
index ad817fc..c938f2f 100644
--- a/apps/codecs/libtremor/codebook.c
+++ b/apps/codecs/libtremor/codebook.c
@@ -464,48 +464,49 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
static long vorbis_book_decodevv_add_2ch_even(codebook *book,ogg_int32_t **a,
long offset,oggpack_buffer *b,
- int n,int point){
- long i,k,chunk,read;
+ unsigned int n,int point){
+ long k,chunk,read;
int shift=point-book->binarypoint;
long entries[32];
ogg_int32_t *p0 = &(a[0][offset]);
ogg_int32_t *p1 = &(a[1][offset]);
+ const unsigned long dim = book->dim;
+ const ogg_int32_t * const vlist = book->valuelist;
if(shift>=0){
-
- for(i=0;i<n;){
+ while(n>0){
chunk=32;
- if (chunk*book->dim>(n-i)*2)
- chunk=((n-i)*2+book->dim-1)/book->dim;
+ if (16*dim>n)
+ chunk=(n*2-1)/dim + 1;
read = decode_packed_block(book,b,entries,chunk);
for(k=0;k<read;k++){
- const ogg_int32_t *t = book->valuelist+entries[k]*book->dim;
- const ogg_int32_t *u = t+book->dim;
+ const ogg_int32_t *t = vlist+entries[k]*dim;
+ const ogg_int32_t *u = t+dim;
do{
*p0++ += *t++>>shift;
*p1++ += *t++>>shift;
}while(t<u);
}
if (read<chunk)return-1;
- i += read*book->dim/2;
+ n -= read*dim/2;
}
}else{
shift = -shift;
- for(i=0;i<n;){
+ while(n>0){
chunk=32;
- if (chunk*book->dim>(n-i)*2)
- chunk=((n-i)*2+book->dim-1)/book->dim;
+ if (16*dim>n)
+ chunk=(n*2-1)/dim + 1;
read = decode_packed_block(book,b,entries,chunk);
for(k=0;k<read;k++){
- const ogg_int32_t *t = book->valuelist+entries[k]*book->dim;
- const ogg_int32_t *u = t+book->dim;
+ const ogg_int32_t *t = vlist+entries[k]*dim;
+ const ogg_int32_t *u = t+dim;
do{
*p0++ += *t++<<shift;
*p1++ += *t++<<shift;
}while(t<u);
}
if (read<chunk)return-1;
- i += read*book->dim/2;
+ n -= read*dim/2;
}
}
return(0);