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.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.c | 54 |
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 | ||
202 | static inline long decode_packed_block(codebook *book, oggpack_buffer *b, | 202 | static 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 | ||
402 | static 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 | |||
402 | long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a, | 451 | long 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;){ |