summaryrefslogtreecommitdiff
path: root/apps/codecs/libfaad/bits.h
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2010-07-01 21:18:42 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2010-07-01 21:18:42 +0000
commit52f17dfe9d5221fdc83b2c5d719fe701dce46f24 (patch)
tree6fdecfc1e9560e2566214bc8336b401df02663bc /apps/codecs/libfaad/bits.h
parentb013fb76c464b5125026b4d6c95c49a046d0924c (diff)
downloadrockbox-52f17dfe9d5221fdc83b2c5d719fe701dce46f24.tar.gz
rockbox-52f17dfe9d5221fdc83b2c5d719fe701dce46f24.zip
Submit FS#11445. Speed up of faad (aac) decoder via several optimizations like refactoring some requantization routines, moving several arrays and code tables to IRAM, using an optimized swap32() function and inlining several huffman decoder functions. Decoding is sped up by ~10% (PP5002, PP5022, MCF5249) and ~22% (MCF5250).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27225 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libfaad/bits.h')
-rw-r--r--apps/codecs/libfaad/bits.h34
1 files changed, 6 insertions, 28 deletions
diff --git a/apps/codecs/libfaad/bits.h b/apps/codecs/libfaad/bits.h
index 0ebe04b03f..815db59c68 100644
--- a/apps/codecs/libfaad/bits.h
+++ b/apps/codecs/libfaad/bits.h
@@ -55,15 +55,11 @@ typedef struct _bitfile
55 void *buffer; 55 void *buffer;
56} bitfile; 56} bitfile;
57 57
58 58/* rockbox: use asm optimized swap32()
59#if defined (_WIN32) && !defined(_WIN32_WCE) && !defined(__MINGW32__)
60#define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax
61#elif defined(LINUX) || defined(DJGPP) || defined(__MINGW32__)
62#define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) )
63#else
64#define BSWAP(a) \ 59#define BSWAP(a) \
65 ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff)) 60 ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff))
66#endif 61*/
62#define BSWAP(a) swap32(a)
67 63
68static uint32_t bitmask[] = { 64static uint32_t bitmask[] = {
69 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 65 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF,
@@ -81,7 +77,7 @@ void faad_initbits_rev(bitfile *ld, void *buffer,
81 uint32_t bits_in_buffer); 77 uint32_t bits_in_buffer);
82uint8_t faad_byte_align(bitfile *ld); 78uint8_t faad_byte_align(bitfile *ld);
83uint32_t faad_get_processed_bits(bitfile *ld); 79uint32_t faad_get_processed_bits(bitfile *ld);
84void faad_flushbits_ex(bitfile *ld, uint32_t bits); 80INLINE void faad_flushbits_ex(bitfile *ld, uint32_t bits);
85void faad_rewindbits(bitfile *ld); 81void faad_rewindbits(bitfile *ld);
86uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits 82uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
87 DEBUGDEC); 83 DEBUGDEC);
@@ -93,28 +89,10 @@ uint32_t faad_origbitbuffer_size(bitfile *ld);
93/* circumvent memory alignment errors on ARM */ 89/* circumvent memory alignment errors on ARM */
94static INLINE uint32_t getdword(void *mem) 90static INLINE uint32_t getdword(void *mem)
95{ 91{
96#ifdef ARM
97 uint32_t tmp;
98#ifndef ARCH_IS_BIG_ENDIAN 92#ifndef ARCH_IS_BIG_ENDIAN
99 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3]; 93 return BSWAP(*(uint32_t*)mem);
100 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2];
101 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1];
102 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0];
103#else
104 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0];
105 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1];
106 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2];
107 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3];
108#endif
109
110 return tmp;
111#else 94#else
112 uint32_t tmp; 95 return *(uint32_t*)mem;
113 tmp = *(uint32_t*)mem;
114#ifndef ARCH_IS_BIG_ENDIAN
115 BSWAP(tmp);
116#endif
117 return tmp;
118#endif 96#endif
119} 97}
120 98