diff options
| author | Nils Wallménius <nils@rockbox.org> | 2010-05-12 22:41:17 +0000 |
|---|---|---|
| committer | Nils Wallménius <nils@rockbox.org> | 2010-05-12 22:41:17 +0000 |
| commit | 85f0873682635eeab11c1e6834ce0734b9cd3569 (patch) | |
| tree | 3e2779f828af76be9f549bb42f0c0a76a229f6d6 /apps/codecs/libtremor/codebook.c | |
| parent | e5d6d7a47ecd272639feba4ce0e23a174bbff681 (diff) | |
| download | rockbox-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.c | 31 |
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); |