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.zip
rockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.tar.gz
rockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.tar.bz2
rockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.tar.xz
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 1287a95..8c319ab 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,
return(-1);
}
-static inline long decode_packed_block(codebook *book, oggpack_buffer *b,
+static long decode_packed_block(codebook *book, oggpack_buffer *b,
long *buf, int n){
long *bufptr = buf;
long *bufend = buf + n;
@@ -399,6 +399,55 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a,
return(0);
}
+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;
+ int shift=point-book->binarypoint;
+ long entries[32];
+ ogg_int32_t *p0 = &(a[0][offset]);
+ ogg_int32_t *p1 = &(a[1][offset]);
+
+ if(shift>=0){
+
+ for(i=0;i<n;){
+ chunk=32;
+ if (chunk*book->dim>(n-i)*2)
+ chunk=((n-i)*2+book->dim-1)/book->dim;
+ 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;
+ do{
+ *p0++ += *t++>>shift;
+ *p1++ += *t++>>shift;
+ }while(t<u);
+ }
+ if (read<chunk)return-1;
+ i += read*book->dim/2;
+ }
+ }else{
+ shift = -shift;
+ for(i=0;i<n;){
+ chunk=32;
+ if (chunk*book->dim>(n-i)*2)
+ chunk=((n-i)*2+book->dim-1)/book->dim;
+ 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;
+ do{
+ *p0++ += *t++<<shift;
+ *p1++ += *t++<<shift;
+ }while(t<u);
+ }
+ if (read<chunk)return-1;
+ i += read*book->dim/2;
+ }
+ }
+ return(0);
+}
+
long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
long offset,int ch,
oggpack_buffer *b,int n,int point){
@@ -408,6 +457,9 @@ long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,
int shift=point-book->binarypoint;
long entries[32];
+ if (!(book->dim&1) && ch==2)
+ return vorbis_book_decodevv_add_2ch_even(book,a,offset,b,n,point);
+
if(shift>=0){
for(i=offset;i<offset+n;){