Index: apps/codecs/libatrac/fixp_math.h =================================================================== --- apps/codecs/libatrac/fixp_math.h (revision 28434) +++ apps/codecs/libatrac/fixp_math.h (working copy) @@ -108,4 +108,16 @@ return (int32_t)temp; } + + static inline int32_t fixmul15(int16_t x, int32_t y) + { + int64_t temp; + temp = y; + temp *= x; + + temp >>= 0; //16+15-16 = 15 bits + + return (int32_t)temp; + } + #endif Index: apps/codecs/libatrac/atrac3_arm.S =================================================================== --- apps/codecs/libatrac/atrac3_arm.S (revision 28434) +++ apps/codecs/libatrac/atrac3_arm.S (working copy) @@ -106,116 +106,123 @@ .iqmf_dewindow_outer_loop: /* outer loop 0...counter-1 */ /* 0.. 7 */ - ldmia r2!, {r4, r5} /* load win[0..1] */ + ldmia r2!, {r4, r5, r8, r9} /* load win[0..7] */ ldmia r1!, {r6, r7} /* load in[0..1] */ - smull lr , r9, r4, r6 /* s1 = win[0] * in[0] */ - smull r12, r8, r5, r7 /* s2 = win[1] * in[1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smulwb lr, r6, r4 /* s1 = in[0] * win[0] */ + smulwt r12, r7, r4 /* s2 = in[1] * win[1] */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r5, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7,r5, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r8, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r8, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ + smlawb lr, r6, r9, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r9, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + /* 8..15 */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + ldmia r2!, {r4, r5, r8, r9} /* load win[i..i+7] */ + ldmia r1!, {r6, r7} /* load in[i..i+1] */ + smlawb lr, r6, r4, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r4, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r5, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7,r5, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r8, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r8, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ - ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ + smlawb lr, r6, r9, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r9, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + /* 16..23 */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + ldmia r2!, {r4, r5, r8, r9} /* load win[i..i+7] */ + ldmia r1!, {r6, r7} /* load in[i..i+1] */ + smlawb lr, r6, r4, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r4, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r5, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7,r5, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r8, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r8, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ - ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ + smlawb lr, r6, r9, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r9, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + /* 24..31 */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + ldmia r2!, {r4, r5, r8, r9} /* load win[i..i+7] */ + ldmia r1!, {r6, r7} /* load in[i..i+1] */ + smlawb lr, r6, r4, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r4, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r5, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7,r5, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r8, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r8, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ - ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ + smlawb lr, r6, r9, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r9, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + /* 32..39 */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + ldmia r2!, {r4, r5, r8, r9} /* load win[i..i+7] */ + ldmia r1!, {r6, r7} /* load in[i..i+1] */ + smlawb lr, r6, r4, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r4, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r5, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7,r5, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r8, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r8, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ - ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ + smlawb lr, r6, r9, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r9, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + /* 40..47 */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + ldmia r2!, {r4, r5, r8, r9} /* load win[i..i+7] */ + ldmia r1!, {r6, r7} /* load in[i..i+1] */ + smlawb lr, r6, r4, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r4, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r5, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7,r5, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ + smlawb lr, r6, r8, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r8, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ - ldmia r2!, {r4, r5} /* load win[i...i+1] */ - ldmia r1!, {r6, r7} /* load in[i...i+1] */ - smlal lr , r9, r4, r6 /* s1 = win[i ] * in[i ] */ - smlal r12, r8, r5, r7 /* s2 = win[i+1] * in[i+1] */ + smlawb lr, r6, r9, lr /* s1 += in[i ] * win[i ] >> 16 */ + smlawt r12, r7, r9, r12 /* s2 += in[i+1] * win[i+1] >> 16 */ + + + + mov lr , lr , lsl #1 + //orr r9, lr , r9, lsl #1 /* s1 = low>>31 || hi<<1 */ + mov r12, r12, lsl #1 + //orr r8, r12, r8, lsl #1 /* s2 = low>>31 || hi<<1 */ - mov lr , lr , lsr #31 - orr r9, lr , r9, lsl #1 /* s1 = low>>31 || hi<<1 */ - mov r12, r12, lsr #31 - orr r8, r12, r8, lsl #1 /* s2 = low>>31 || hi<<1 */ - - stmia r0!, {r8, r9} /* store result out[0]=s2, out[1]=s1 */ + stmia r0!, {r12, lr} /* store result out[0]=s2, out[1]=s1 */ sub r1, r1, #184 /* roll back 64 entries = 184 bytes */ - sub r2, r2, #192 /* roll back 48 entries = 192 bytes = win[0] */ + sub r2, r2, #96 /* roll back 48 entries * 2 bytes = 96 bytes = win[0] */ subs r3, r3, #1 /* outer loop -= 1 */ bgt .iqmf_dewindow_outer_loop Index: apps/codecs/libatrac/atrac3.c =================================================================== --- apps/codecs/libatrac/atrac3.c (revision 28434) +++ apps/codecs/libatrac/atrac3.c (working copy) @@ -44,18 +44,15 @@ #define JOINT_STEREO 0x12 #define STEREO 0x2 -#ifdef ROCKBOX -#undef DEBUGF -#define DEBUGF(...) -#endif /* ROCKBOX */ + /* FFMAX/MIN/SWAP and av_clip were taken from libavutil/common.h */ #define FFMAX(a,b) ((a) > (b) ? (a) : (b)) #define FFMIN(a,b) ((a) > (b) ? (b) : (a)) #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) static VLC spectral_coeff_tab[7]; -static int32_t qmf_window[48] IBSS_ATTR; +static int16_t qmf_window[48] IBSS_ATTR; static int32_t atrac3_spectrum [2][1024] IBSS_ATTR __attribute__((aligned(16))); static int32_t atrac3_IMDCT_buf[2][ 512] IBSS_ATTR __attribute__((aligned(16))); static int32_t atrac3_prevFrame[2][1024] IBSS_ATTR; @@ -122,7 +119,7 @@ extern void atrac3_iqmf_dewindowing(int32_t *out, int32_t *in, - int32_t *win, + int16_t *win, unsigned int nIn); #elif defined (CPU_COLDFIRE) #define MULTIPLY_ADD_BLOCK \ @@ -141,7 +138,7 @@ static inline void atrac3_iqmf_dewindowing(int32_t *out, int32_t *in, - int32_t *win, + int16_t *win, unsigned int nIn) { int32_t j; @@ -177,19 +174,19 @@ } #else #define MULTIPLY_ADD_BLOCK(y1, y2, x, c, k) \ - y1 += fixmul31(c[k], x[k]); k++; \ - y2 += fixmul31(c[k], x[k]); k++; \ - y1 += fixmul31(c[k], x[k]); k++; \ - y2 += fixmul31(c[k], x[k]); k++; \ - y1 += fixmul31(c[k], x[k]); k++; \ - y2 += fixmul31(c[k], x[k]); k++; \ - y1 += fixmul31(c[k], x[k]); k++; \ - y2 += fixmul31(c[k], x[k]); k++; + y1 += fixmul15(c[k], x[k]); k++; \ + y2 += fixmul15(c[k], x[k]); k++; \ + y1 += fixmul15(c[k], x[k]); k++; \ + y2 += fixmul15(c[k], x[k]); k++; \ + y1 += fixmul15(c[k], x[k]); k++; \ + y2 += fixmul15(c[k], x[k]); k++; \ + y1 += fixmul15(c[k], x[k]); k++; \ + y2 += fixmul15(c[k], x[k]); k++; static inline void atrac3_iqmf_dewindowing(int32_t *out, int32_t *in, - int32_t *win, + int16_t *win, unsigned int nIn) { int32_t i, j, s1, s2; @@ -206,7 +203,9 @@ out[0] = s2; out[1] = s1; + } + } #endif @@ -244,11 +243,14 @@ static void iqmf (int32_t *inlo, int32_t *inhi, unsigned int nIn, int32_t *pOut, int32_t *delayBuf, int32_t *temp) { + unsigned int i=0; /* Restore the delay buffer */ memcpy(temp, delayBuf, 46*sizeof(int32_t)); /* loop1: matrixing */ atrac3_iqmf_matrixing(temp + 46, inlo, inhi, nIn); + for(i=0; i< nIn*2+48; i++) + temp[i]>>=0; /* loop2: dewindowing */ atrac3_iqmf_dewindowing(pOut, temp, qmf_window, nIn); @@ -269,11 +271,13 @@ static void IMLT(int32_t *pInput, int32_t *pOutput) { + // unsigned int i; /* Apply the imdct. */ ff_imdct_calc(9, pOutput, pInput); /* Windowing. */ atrac3_imdct_windowing(pOutput, window_lookup); + } @@ -320,9 +324,11 @@ /* Generate the QMF window. */ for (i=0 ; i<24; i++) { s = qmf_48tap_half_fix[i] << 1; - qmf_window[i] = s; - qmf_window[47 - i] = s; + DEBUGF("%f %d %f\n",qmf_48tap_half_fix[i]/2147483648.0,s>>16, ((int16_t)(s>>16))/65536.0); + qmf_window[i] = (int16_t)(s>>16); + qmf_window[47 - i] = (int16_t)(s>>16); } + } @@ -1229,7 +1235,7 @@ vlcs_initialized = 1; } - + init_atrac3_transforms(); /* init the joint-stereo decoding data */