summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohamed Tarek <mt@rockbox.org>2010-08-04 23:21:35 +0000
committerMohamed Tarek <mt@rockbox.org>2010-08-04 23:21:35 +0000
commit467451878726a3755eb3b2b472a3b33299cb9245 (patch)
tree378586c8598a8b08470c6bf59de64124888bf511
parent2054ca8b98ba198d77203177da0164b52adf431d (diff)
downloadrockbox-467451878726a3755eb3b2b472a3b33299cb9245.tar.gz
rockbox-467451878726a3755eb3b2b472a3b33299cb9245.zip
Increase wmapro decoder output sample depth to 24 bits, makes the mean error between our output and the original floating point decoder ~5e-8. (FS#11498 by Buschel)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27703 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/libwmapro/wma.h1
-rw-r--r--apps/codecs/libwmapro/wmapro_math.h26
-rw-r--r--apps/codecs/libwmapro/wmaprodec.c6
-rw-r--r--apps/codecs/wmapro.c2
4 files changed, 19 insertions, 16 deletions
diff --git a/apps/codecs/libwmapro/wma.h b/apps/codecs/libwmapro/wma.h
index 84abeb349b..6fa7b94724 100644
--- a/apps/codecs/libwmapro/wma.h
+++ b/apps/codecs/libwmapro/wma.h
@@ -26,6 +26,7 @@
26#include "ffmpeg_put_bits.h" 26#include "ffmpeg_put_bits.h"
27 27
28#define WMAPRO_FRACT (17) 28#define WMAPRO_FRACT (17)
29#define WMAPRO_DSP_SAMPLE_DEPTH (WMAPRO_FRACT + 8)
29 30
30/* size of blocks */ 31/* size of blocks */
31#define BLOCK_MIN_BITS 7 32#define BLOCK_MIN_BITS 7
diff --git a/apps/codecs/libwmapro/wmapro_math.h b/apps/codecs/libwmapro/wmapro_math.h
index f5cfa5f1d9..17b4829362 100644
--- a/apps/codecs/libwmapro/wmapro_math.h
+++ b/apps/codecs/libwmapro/wmapro_math.h
@@ -223,21 +223,22 @@ static inline void vector_fixmul_window(int32_t *dst, const int32_t *src0,
223 asm volatile ( \ 223 asm volatile ( \
224 "ldmia %[src]!, {r1-r4} \n\t" \ 224 "ldmia %[src]!, {r1-r4} \n\t" \
225 "smull r0, r5, r1, %[mul] \n\t" \ 225 "smull r0, r5, r1, %[mul] \n\t" \
226 "mov r0, r0, lsr #24 \n\t" \ 226 "mov r0, r0, lsr #16 \n\t" \
227 "orr r0, r0, r5, lsl #8 \n\t" \ 227 "orr r0, r0, r5, lsl #16\n\t" \
228 "smull r1, r5, r2, %[mul] \n\t" \ 228 "smull r1, r5, r2, %[mul] \n\t" \
229 "mov r1, r1, lsr #24 \n\t" \ 229 "mov r1, r1, lsr #16 \n\t" \
230 "orr r1, r1, r5, lsl #8 \n\t" \ 230 "orr r1, r1, r5, lsl #16\n\t" \
231 "smull r2, r5, r3, %[mul] \n\t" \ 231 "smull r2, r5, r3, %[mul] \n\t" \
232 "mov r2, r2, lsr #24 \n\t" \ 232 "mov r2, r2, lsr #16 \n\t" \
233 "orr r2, r2, r5, lsl #8 \n\t" \ 233 "orr r2, r2, r5, lsl #16\n\t" \
234 "smull r3, r5, r4, %[mul] \n\t" \ 234 "smull r3, r5, r4, %[mul] \n\t" \
235 "mov r3, r3, lsr #24 \n\t" \ 235 "mov r3, r3, lsr #16 \n\t" \
236 "orr r3, r3, r5, lsl #8 \n\t" \ 236 "orr r3, r3, r5, lsl #16\n\t" \
237 "stmia %[dst]!, {r0-r3} \n" \ 237 "stmia %[dst]!, {r0-r3} \n" \
238 : [dst]"+r"(dst), [src]"+r"(src) \ 238 : [dst]"+r"(dst), [src]"+r"(src) \
239 : [mul]"r"(mul) \ 239 : [mul]"r"(mul) \
240 : "r0", "r1", "r2", "r3", "r4", "r5", "memory"); 240 : "r0", "r1", "r2", "r3", "r4", "r5", "memory");
241/* Disable ColdFire version until a correct version is written
241#elif defined (CPU_COLDFIRE) 242#elif defined (CPU_COLDFIRE)
242 #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \ 243 #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \
243 int32_t tmp; \ 244 int32_t tmp; \
@@ -270,12 +271,13 @@ static inline void vector_fixmul_window(int32_t *dst, const int32_t *src0,
270 [tmp] "=d" (tmp) \ 271 [tmp] "=d" (tmp) \
271 : [mul] "r" (mul) \ 272 : [mul] "r" (mul) \
272 : "d0", "d1", "d2", "d3", "memory", "cc"); 273 : "d0", "d1", "d2", "d3", "memory", "cc");
274*/
273#else 275#else
274 #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \ 276 #define VECT_MUL_SCALAR_KERNEL(dst, src, mul) \
275 dst[i ] = fixmul24(src[i ], mul); \ 277 dst[i ] = fixmul16(src[i ], mul); \
276 dst[i+1] = fixmul24(src[i+1], mul); \ 278 dst[i+1] = fixmul16(src[i+1], mul); \
277 dst[i+2] = fixmul24(src[i+2], mul); \ 279 dst[i+2] = fixmul16(src[i+2], mul); \
278 dst[i+3] = fixmul24(src[i+3], mul); 280 dst[i+3] = fixmul16(src[i+3], mul);
279#endif /* CPU_ARM, CPU_COLDFIRE */ 281#endif /* CPU_ARM, CPU_COLDFIRE */
280 282
281static inline void vector_fixmul_scalar(int32_t *dst, const int32_t *src, 283static inline void vector_fixmul_scalar(int32_t *dst, const int32_t *src,
diff --git a/apps/codecs/libwmapro/wmaprodec.c b/apps/codecs/libwmapro/wmaprodec.c
index e5a5fd94eb..018ea7c304 100644
--- a/apps/codecs/libwmapro/wmaprodec.c
+++ b/apps/codecs/libwmapro/wmaprodec.c
@@ -125,7 +125,7 @@
125#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) 125#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
126 126
127/* Define some multiple used constants */ 127/* Define some multiple used constants */
128#define SQRT2_FRACT24 0x016A09E6 /* 0x016A09E6 = (sqrt(2)*(1<<24)) */ 128#define SQRT2_FRACT16 0x00016A0A /* 0x00016A0A = (sqrt(2)*(1<<16)) */
129#define COS_PI4_FRACT16 0x0000B505 /* 0x0000B505 = (cos(pi/4)<<16) */ 129#define COS_PI4_FRACT16 0x0000B505 /* 0x0000B505 = (cos(pi/4)<<16) */
130#define ONE_FRACT16 0x00010000 /* 0x00010000 = (1<<16) */ 130#define ONE_FRACT16 0x00010000 /* 0x00010000 = (1<<16) */
131 131
@@ -1058,10 +1058,10 @@ static void inverse_channel_transform(WMAProDecodeCtx *s)
1058 int len = FFMIN(sfb[1], s->subframe_len) - sfb[0]; 1058 int len = FFMIN(sfb[1], s->subframe_len) - sfb[0];
1059 vector_fixmul_scalar(ch_data[0] + sfb[0], 1059 vector_fixmul_scalar(ch_data[0] + sfb[0],
1060 ch_data[0] + sfb[0], 1060 ch_data[0] + sfb[0],
1061 SQRT2_FRACT24, len); 1061 SQRT2_FRACT16, len);
1062 vector_fixmul_scalar(ch_data[1] + sfb[0], 1062 vector_fixmul_scalar(ch_data[1] + sfb[0],
1063 ch_data[1] + sfb[0], 1063 ch_data[1] + sfb[0],
1064 SQRT2_FRACT24, len); 1064 SQRT2_FRACT16, len);
1065 1065
1066 } 1066 }
1067 } 1067 }
diff --git a/apps/codecs/wmapro.c b/apps/codecs/wmapro.c
index 30e60e5716..75bbd24cda 100644
--- a/apps/codecs/wmapro.c
+++ b/apps/codecs/wmapro.c
@@ -44,7 +44,7 @@ enum codec_status codec_main(void)
44 int size; /* Size of the input frame to the decoder */ 44 int size; /* Size of the input frame to the decoder */
45 45
46 /* Generic codec initialisation */ 46 /* Generic codec initialisation */
47 ci->configure(DSP_SET_SAMPLE_DEPTH, WMAPRO_FRACT); 47 ci->configure(DSP_SET_SAMPLE_DEPTH, WMAPRO_DSP_SAMPLE_DEPTH);
48 48
49 49
50next_track: 50next_track: