summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
authorMichael Giacomelli <giac2000@hotmail.com>2008-06-28 18:56:19 +0000
committerMichael Giacomelli <giac2000@hotmail.com>2008-06-28 18:56:19 +0000
commita06f651c3e5f52820e5c7233fa06ef21f793c812 (patch)
tree9f62f8c8308512ad1093bdcac2e90dd04a02ed28 /apps/codecs
parent54635b74a57e31877ac3c9dd9a7b9bf2b012e0e9 (diff)
Put the WMA windowing and output buffer into IRAM on targets with > 96KB of it. Improves 192k WMA decoding speed by about 2MHz on PP5024, and maybe saves some more when applying DSP.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17853 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/libwma/wmadec.h14
-rw-r--r--apps/codecs/libwma/wmadeci.c17
2 files changed, 21 insertions, 10 deletions
diff --git a/apps/codecs/libwma/wmadec.h b/apps/codecs/libwma/wmadec.h
index f7434ed759..30ba35b533 100644
--- a/apps/codecs/libwma/wmadec.h
+++ b/apps/codecs/libwma/wmadec.h
@@ -54,6 +54,17 @@
#define LSP_POW_BITS 7
+/*define IRAM for targets with 48k/80k IRAM split*/
+#ifndef IBSS_ATTR_WMA_LARGE_IRAM
+#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == MCF5250)
+/* PP5022/24 and MCF5250 have 128KB of IRAM, with 80KB allocated for codecs */
+#define IBSS_ATTR_WMA_LARGE_IRAM IBSS_ATTR
+#else
+/* other PP's and MCF5249 have 96KB of IRAM */
+#define IBSS_ATTR_WMA_LARGE_IRAM
+#endif
+#endif
+
typedef struct WMADecodeContext
{
GetBitContext gb;
@@ -110,7 +121,8 @@ typedef struct WMADecodeContext
MDCTContext mdct_ctx[BLOCK_NB_SIZES];
fixed32 *windows[BLOCK_NB_SIZES];
/* output buffer for one frame and the last for IMDCT windowing */
- fixed32 frame_out[MAX_CHANNELS][BLOCK_MAX_SIZE * 2];
+ fixed32 (*frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE*2];
+
/* last frame info */
uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4]; /* padding added */
int last_bitoffset;
diff --git a/apps/codecs/libwma/wmadeci.c b/apps/codecs/libwma/wmadeci.c
index 20c22187b2..23916f6dc8 100644
--- a/apps/codecs/libwma/wmadeci.c
+++ b/apps/codecs/libwma/wmadeci.c
@@ -52,6 +52,8 @@ CoefVLCTable;
static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
fixed32 coefsarray[MAX_CHANNELS][BLOCK_MAX_SIZE] IBSS_ATTR;
+/*decode and window into IRAM on targets with at least 80KB of codec IRAM*/
+fixed32 frame_out_buf[MAX_CHANNELS][BLOCK_MAX_SIZE * 2] IBSS_ATTR_WMA_LARGE_IRAM;
//static variables that replace malloced stuff
fixed32 stat0[2048], stat1[1024], stat2[512], stat3[256], stat4[128]; //these are the MDCT reconstruction windows
@@ -329,6 +331,7 @@ int wma_decode_init(WMADecodeContext* s, asf_waveformatex_t *wfx)
s->block_align = wfx->blockalign;
s->coefs = &coefsarray;
+ s->frame_out = &frame_out_buf;
if (wfx->codec_id == ASF_CODEC_ID_WMAV1) {
s->version = 1;
@@ -1369,7 +1372,6 @@ static int wma_decode_block(WMADecodeContext *s)
if (s->channel_coded[ch])
{
static fixed32 output[BLOCK_MAX_SIZE * 2] IBSS_ATTR;
-
int n4, index, n;
n = s->block_len;
@@ -1382,8 +1384,7 @@ static int wma_decode_block(WMADecodeContext *s)
/* add in the frame */
index = (s->frame_len / 2) + s->block_pos - n4;
-
- wma_window(s, output, &s->frame_out[ch][index]);
+ wma_window(s, output, &((*s->frame_out)[ch][index]));
@@ -1391,7 +1392,7 @@ static int wma_decode_block(WMADecodeContext *s)
channel if it is not coded */
if (s->ms_stereo && !s->channel_coded[1])
{
- wma_window(s, output, &s->frame_out[1][index]);
+ wma_window(s, output, &((*s->frame_out)[1][index]));
}
}
}
@@ -1415,7 +1416,6 @@ static int wma_decode_frame(WMADecodeContext *s, int32_t *samples)
int ret, i, n, ch, incr;
int32_t *ptr;
fixed32 *iptr;
- // rb->splash(HZ, "in wma_decode_frame");
/* read each block */
s->block_num = 0;
@@ -1443,17 +1443,16 @@ static int wma_decode_frame(WMADecodeContext *s, int32_t *samples)
for(ch = 0; ch < s->nb_channels; ++ch)
{
ptr = samples + ch;
- iptr = s->frame_out[ch];
+ iptr = &((*s->frame_out)[ch][0]);
for (i=0;i<n;++i)
{
*ptr = (*iptr++);
ptr += incr;
}
- /* prepare for next block */
- memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
- s->frame_len * sizeof(fixed32));
+ memmove(&((*s->frame_out)[ch][0]), &((*s->frame_out)[ch][s->frame_len]),
+ s->frame_len * sizeof(fixed32));
}
return 0;