diff options
| author | Tomasz Malesinski <tomal@rockbox.org> | 2007-09-27 21:58:51 +0000 |
|---|---|---|
| committer | Tomasz Malesinski <tomal@rockbox.org> | 2007-09-27 21:58:51 +0000 |
| commit | c13eba29ff5615cc74a7818e42cc9d464a7c7075 (patch) | |
| tree | eef1dfc0d4ed2b69e16b119b0d47052801ef827f /apps/codecs/Tremor/codebook.c | |
| parent | 1aaf5dbdb660d29ef384674f25c916f23da505bb (diff) | |
| download | rockbox-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.c | 54 |
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;){ |