summaryrefslogtreecommitdiff
path: root/apps/codecs/libwmapro/wma.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libwmapro/wma.c')
-rw-r--r--apps/codecs/libwmapro/wma.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/apps/codecs/libwmapro/wma.c b/apps/codecs/libwmapro/wma.c
index 64ec240..83cec89 100644
--- a/apps/codecs/libwmapro/wma.c
+++ b/apps/codecs/libwmapro/wma.c
@@ -20,6 +20,7 @@
*/
#include "wma.h"
+#include "codeclib.h" /* needed for av_log2() */
/**
*@brief Get the samples per frame for this stream.
@@ -109,14 +110,20 @@ int ff_wma_run_level_decode(GetBitContext* gb,
{
int32_t code, level, sign;
const unsigned int coef_mask = block_len - 1;
+ /* Rockbox: To be able to use rockbox' optimized mdct we need to pre-shift
+ * the values by >>(nbits-3). */
+ const int nbits = av_log2(block_len)+1;
+ const int shift = WMAPRO_FRACT-(nbits-3);
for (; offset < num_coefs; offset++) {
code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX);
if (code > 1) {
/** normal code */
offset += run_table[code];
sign = !get_bits1(gb);
- ptr[offset & coef_mask] = sign ? -level_table[code] : level_table[code];
- ptr[offset & coef_mask] <<= WMAPRO_FRACT;
+ /* Rockbox: To be able to use rockbox' optimized mdct we need
+ * invert the sign. */
+ ptr[offset & coef_mask] = sign ? level_table[code] : -level_table[code];
+ ptr[offset & coef_mask] <<= shift;
} else if (code == 1) {
/** EOB */
break;
@@ -143,8 +150,8 @@ int ff_wma_run_level_decode(GetBitContext* gb,
}
}
sign = !get_bits1(gb);
- ptr[offset & coef_mask] = sign ? -level : level;
- ptr[offset & coef_mask] <<= WMAPRO_FRACT;
+ ptr[offset & coef_mask] = sign ? level : -level;
+ ptr[offset & coef_mask] <<= shift;
}
}
/** NOTE: EOB can be omitted */