Index: apps/codecs/libmusepack/synth_filter.c =================================================================== --- apps/codecs/libmusepack/synth_filter.c (revision 16465) +++ apps/codecs/libmusepack/synth_filter.c (working copy) @@ -120,6 +120,9 @@ #undef _ +// needed to prevent from internal overflow in calculate_V +#define OVERFLOW_FIX 1 + // V-coefficients were expanded (<<) by V_COEFFICIENT_EXPAND #define V_COEFFICIENT_EXPAND 27 @@ -294,22 +297,22 @@ V[42] = tmp - A[10] - A[11]; // 9 adds, 9 subs - A[ 0] = MPC_MULTIPLY_V((Sample[ 0] - Sample[31]), INVCOS01); - A[ 1] = MPC_MULTIPLY_V((Sample[ 1] - Sample[30]), INVCOS03); - A[ 2] = MPC_MULTIPLY_V((Sample[ 2] - Sample[29]), INVCOS05); - A[ 3] = MPC_MULTIPLY_V((Sample[ 3] - Sample[28]), INVCOS07); - A[ 4] = MPC_MULTIPLY_V((Sample[ 4] - Sample[27]), INVCOS09); - A[ 5] = MPC_MULTIPLY_V((Sample[ 5] - Sample[26]), INVCOS11); - A[ 6] = MPC_MULTIPLY_V((Sample[ 6] - Sample[25]), INVCOS13); - A[ 7] = MPC_MULTIPLY_V((Sample[ 7] - Sample[24]), INVCOS15); - A[ 8] = MPC_MULTIPLY_V((Sample[ 8] - Sample[23]), INVCOS17); - A[ 9] = MPC_MULTIPLY_V((Sample[ 9] - Sample[22]), INVCOS19); - A[10] = MPC_MULTIPLY_V((Sample[10] - Sample[21]), INVCOS21); - A[11] = MPC_MULTIPLY_V((Sample[11] - Sample[20]), INVCOS23); - A[12] = MPC_MULTIPLY_V((Sample[12] - Sample[19]), INVCOS25); - A[13] = MPC_MULTIPLY_V((Sample[13] - Sample[18]), INVCOS27); - A[14] = MPC_MULTIPLY_V((Sample[14] - Sample[17]), INVCOS29); - A[15] = MPC_MULTIPLY_V((Sample[15] - Sample[16]), INVCOS31); + A[ 0] = MPC_MULTIPLY_V(((Sample[ 0] - Sample[31])>>OVERFLOW_FIX), INVCOS01); + A[ 1] = MPC_MULTIPLY_V(((Sample[ 1] - Sample[30])>>OVERFLOW_FIX), INVCOS03); + A[ 2] = MPC_MULTIPLY_V(((Sample[ 2] - Sample[29])>>OVERFLOW_FIX), INVCOS05); + A[ 3] = MPC_MULTIPLY_V(((Sample[ 3] - Sample[28])>>OVERFLOW_FIX), INVCOS07); + A[ 4] = MPC_MULTIPLY_V(((Sample[ 4] - Sample[27])>>OVERFLOW_FIX), INVCOS09); + A[ 5] = MPC_MULTIPLY_V(((Sample[ 5] - Sample[26])>>OVERFLOW_FIX), INVCOS11); + A[ 6] = MPC_MULTIPLY_V(((Sample[ 6] - Sample[25])>>OVERFLOW_FIX), INVCOS13); + A[ 7] = MPC_MULTIPLY_V(((Sample[ 7] - Sample[24])>>OVERFLOW_FIX), INVCOS15); + A[ 8] = MPC_MULTIPLY_V(((Sample[ 8] - Sample[23])>>OVERFLOW_FIX), INVCOS17); + A[ 9] = MPC_MULTIPLY_V(((Sample[ 9] - Sample[22])>>OVERFLOW_FIX), INVCOS19); + A[10] = MPC_MULTIPLY_V(((Sample[10] - Sample[21])>>OVERFLOW_FIX), INVCOS21); + A[11] = MPC_MULTIPLY_V(((Sample[11] - Sample[20])>>OVERFLOW_FIX), INVCOS23); + A[12] = MPC_MULTIPLY_V(((Sample[12] - Sample[19])>>OVERFLOW_FIX), INVCOS25); + A[13] = MPC_MULTIPLY_V(((Sample[13] - Sample[18])>>OVERFLOW_FIX), INVCOS27); + A[14] = MPC_MULTIPLY_V(((Sample[14] - Sample[17])>>OVERFLOW_FIX), INVCOS29); + A[15] = MPC_MULTIPLY_V(((Sample[15] - Sample[16])>>OVERFLOW_FIX), INVCOS31); // 16 subs, 16 muls, 16 shifts B[ 0] = A[ 0] + A[15]; @@ -366,22 +369,22 @@ B[15] = MPC_MULTIPLY_V((A[13] - A[14]), INVCOS24); // 8 adds, 8 subs, 8 muls, 8 shift - A[ 0] = B[ 0] + B[ 1]; - A[ 1] = MPC_MULTIPLY_V((B[ 0] - B[ 1]), INVCOS16); - A[ 2] = B[ 2] + B[ 3]; - A[ 3] = MPC_MULTIPLY_V((B[ 2] - B[ 3]), INVCOS16); - A[ 4] = B[ 4] + B[ 5]; - A[ 5] = MPC_MULTIPLY_V((B[ 4] - B[ 5]), INVCOS16); - A[ 6] = B[ 6] + B[ 7]; - A[ 7] = MPC_MULTIPLY_V((B[ 6] - B[ 7]), INVCOS16); - A[ 8] = B[ 8] + B[ 9]; - A[ 9] = MPC_MULTIPLY_V((B[ 8] - B[ 9]), INVCOS16); - A[10] = B[10] + B[11]; - A[11] = MPC_MULTIPLY_V((B[10] - B[11]), INVCOS16); - A[12] = B[12] + B[13]; - A[13] = MPC_MULTIPLY_V((B[12] - B[13]), INVCOS16); - A[14] = B[14] + B[15]; - A[15] = MPC_MULTIPLY_V((B[14] - B[15]), INVCOS16); + A[ 0] = (B[ 0] + B[ 1])<