forked from len0rd/rockbox
Submit FS#12115: Use more IRAM in cook codec for several targets. Speeds up PP5022 and MCF5250 by ~3% and S5L87.0x by ~4%.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29913 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
8531380de4
commit
6117ffdde5
4 changed files with 116 additions and 26 deletions
|
|
@ -28,10 +28,10 @@
|
||||||
|
|
||||||
CODEC_HEADER
|
CODEC_HEADER
|
||||||
|
|
||||||
static RMContext rmctx;
|
static RMContext rmctx IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
static RMPacket pkt;
|
static RMPacket pkt IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
static COOKContext q IBSS_ATTR;
|
static COOKContext q IBSS_ATTR;
|
||||||
static int32_t rm_outbuf[2048];
|
static int32_t rm_outbuf[2048] IBSS_ATTR_COOK_LARGE_IRAM MEM_ALIGN_ATTR;
|
||||||
|
|
||||||
static void init_rm(RMContext *rmctx)
|
static void init_rm(RMContext *rmctx)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -102,32 +102,83 @@ static void dump_short_table(short* table, int size, int delimiter) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*************** init functions ***************/
|
/*************** init functions ***************/
|
||||||
#define VLCBUFSIZE 1500
|
/* Codebook sizes (11586 * 4 bytes in total) */
|
||||||
VLC_TYPE vlcbuf[21][VLCBUFSIZE][2];
|
/* Used for envelope_quant_index[]. */
|
||||||
|
static VLC_TYPE vlcbuf00[ 520][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf01[ 640][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf02[ 544][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf03[ 528][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf04[ 544][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf05[ 544][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf06[ 640][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf07[ 576][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf08[ 528][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf09[ 544][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf10[ 544][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf11[ 640][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
static VLC_TYPE vlcbuf12[ 544][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
/* Used for sqvh[]. */
|
||||||
|
static VLC_TYPE vlcbuf13[ 622][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf14[ 308][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf15[ 280][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf16[1456][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf17[ 694][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf18[ 698][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
static VLC_TYPE vlcbuf19[ 104][2] IBSS_ATTR_COOK_LARGE_IRAM;
|
||||||
|
/* Used for ccpl. */
|
||||||
|
static VLC_TYPE vlcbuf20[ 88][2] IBSS_ATTR_COOK_VLCBUF;
|
||||||
|
|
||||||
|
/* Code book sizes (11586 entries in total) */
|
||||||
|
static int env_size[13] = {520,640,544, 528,544,544,640,576,528,544,544,640,544};
|
||||||
|
static int sqvh_size[7] = {622,308,280,1456,694,698,104};
|
||||||
|
static int ccpl_size = 88;
|
||||||
|
|
||||||
|
|
||||||
static int init_cook_vlc_tables(COOKContext *q) {
|
static int init_cook_vlc_tables(COOKContext *q) {
|
||||||
int i, result;
|
int i, result = 0;
|
||||||
|
|
||||||
result = 0;
|
/* Set pointers for codebooks. */
|
||||||
|
q->envelope_quant_index[ 0].table = vlcbuf00;
|
||||||
|
q->envelope_quant_index[ 1].table = vlcbuf01;
|
||||||
|
q->envelope_quant_index[ 2].table = vlcbuf02;
|
||||||
|
q->envelope_quant_index[ 3].table = vlcbuf03;
|
||||||
|
q->envelope_quant_index[ 4].table = vlcbuf04;
|
||||||
|
q->envelope_quant_index[ 5].table = vlcbuf05;
|
||||||
|
q->envelope_quant_index[ 6].table = vlcbuf06;
|
||||||
|
q->envelope_quant_index[ 7].table = vlcbuf07;
|
||||||
|
q->envelope_quant_index[ 8].table = vlcbuf08;
|
||||||
|
q->envelope_quant_index[ 9].table = vlcbuf09;
|
||||||
|
q->envelope_quant_index[10].table = vlcbuf10;
|
||||||
|
q->envelope_quant_index[11].table = vlcbuf11;
|
||||||
|
q->envelope_quant_index[12].table = vlcbuf12;
|
||||||
|
q->sqvh[0].table = vlcbuf13;
|
||||||
|
q->sqvh[1].table = vlcbuf14;
|
||||||
|
q->sqvh[2].table = vlcbuf15;
|
||||||
|
q->sqvh[3].table = vlcbuf16;
|
||||||
|
q->sqvh[4].table = vlcbuf17;
|
||||||
|
q->sqvh[5].table = vlcbuf18;
|
||||||
|
q->sqvh[6].table = vlcbuf19;
|
||||||
|
q->ccpl.table = vlcbuf20;
|
||||||
|
|
||||||
|
/* Init envelope VLC (13 books) */
|
||||||
for (i=0 ; i<13 ; i++) {
|
for (i=0 ; i<13 ; i++) {
|
||||||
q->envelope_quant_index[i].table = vlcbuf[i];
|
q->envelope_quant_index[i].table_allocated = env_size[i];
|
||||||
q->envelope_quant_index[i].table_allocated = VLCBUFSIZE;
|
|
||||||
result |= init_vlc (&q->envelope_quant_index[i], 9, 24,
|
result |= init_vlc (&q->envelope_quant_index[i], 9, 24,
|
||||||
envelope_quant_index_huffbits[i], 1, 1,
|
envelope_quant_index_huffbits[i], 1, 1,
|
||||||
envelope_quant_index_huffcodes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
|
envelope_quant_index_huffcodes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
|
||||||
}
|
}
|
||||||
DEBUGF("sqvh VLC init\n");
|
|
||||||
|
/* Init subband VLC (7 books) */
|
||||||
for (i=0 ; i<7 ; i++) {
|
for (i=0 ; i<7 ; i++) {
|
||||||
q->sqvh[i].table = vlcbuf[i+13];
|
q->sqvh[i].table_allocated = sqvh_size[i];
|
||||||
q->sqvh[i].table_allocated = VLCBUFSIZE;
|
|
||||||
result |= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i],
|
result |= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i],
|
||||||
cvh_huffbits[i], 1, 1,
|
cvh_huffbits[i], 1, 1,
|
||||||
cvh_huffcodes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
|
cvh_huffcodes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Init Joint-Stereo VLC (1 book) */
|
||||||
if (q->nb_channels==2 && q->joint_stereo==1){
|
if (q->nb_channels==2 && q->joint_stereo==1){
|
||||||
q->ccpl.table = vlcbuf[20];
|
q->ccpl.table_allocated = ccpl_size;
|
||||||
q->ccpl.table_allocated = VLCBUFSIZE;
|
|
||||||
result |= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1,
|
result |= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1,
|
||||||
ccpl_huffbits[q->js_vlc_bits-2], 1, 1,
|
ccpl_huffbits[q->js_vlc_bits-2], 1, 1,
|
||||||
ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, INIT_VLC_USE_NEW_STATIC);
|
ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, INIT_VLC_USE_NEW_STATIC);
|
||||||
|
|
@ -414,7 +465,9 @@ static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index,
|
||||||
* @param mlt_buffer pointer to mlt coefficients
|
* @param mlt_buffer pointer to mlt coefficients
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void decode_vectors(COOKContext* q, int* category,
|
||||||
|
int *quant_index_table, REAL_T* mlt_buffer)
|
||||||
|
ICODE_ATTR_COOK_DECODE;
|
||||||
static void decode_vectors(COOKContext* q, int* category,
|
static void decode_vectors(COOKContext* q, int* category,
|
||||||
int *quant_index_table, REAL_T* mlt_buffer){
|
int *quant_index_table, REAL_T* mlt_buffer){
|
||||||
/* A zero in this table means that the subband coefficient is
|
/* A zero in this table means that the subband coefficient is
|
||||||
|
|
@ -438,7 +491,7 @@ static void decode_vectors(COOKContext* q, int* category,
|
||||||
memset(subband_coef_index, 0, sizeof(subband_coef_index));
|
memset(subband_coef_index, 0, sizeof(subband_coef_index));
|
||||||
memset(subband_coef_sign, 0, sizeof(subband_coef_sign));
|
memset(subband_coef_sign, 0, sizeof(subband_coef_sign));
|
||||||
}
|
}
|
||||||
q->scalar_dequant(q, index, quant_index_table[band],
|
scalar_dequant_math(q, index, quant_index_table[band],
|
||||||
subband_coef_index, subband_coef_sign,
|
subband_coef_index, subband_coef_sign,
|
||||||
&mlt_buffer[band * SUBBAND_SIZE]);
|
&mlt_buffer[band * SUBBAND_SIZE]);
|
||||||
}
|
}
|
||||||
|
|
@ -456,6 +509,7 @@ static void decode_vectors(COOKContext* q, int* category,
|
||||||
* @param mlt_buffer pointer to mlt coefficients
|
* @param mlt_buffer pointer to mlt coefficients
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void mono_decode(COOKContext *q, REAL_T* mlt_buffer) ICODE_ATTR_COOK_DECODE;
|
||||||
static void mono_decode(COOKContext *q, REAL_T* mlt_buffer) {
|
static void mono_decode(COOKContext *q, REAL_T* mlt_buffer) {
|
||||||
|
|
||||||
int category_index[128];
|
int category_index[128];
|
||||||
|
|
@ -818,10 +872,12 @@ int cook_decode_init(RMContext *rmctx, COOKContext *q)
|
||||||
|
|
||||||
|
|
||||||
/* Initialize COOK signal arithmetic handling */
|
/* Initialize COOK signal arithmetic handling */
|
||||||
|
/*
|
||||||
if (1) {
|
if (1) {
|
||||||
q->scalar_dequant = scalar_dequant_math;
|
q->scalar_dequant = scalar_dequant_math;
|
||||||
q->interpolate = interpolate_math;
|
q->interpolate = interpolate_math;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/* Try to catch some obviously faulty streams, othervise it might be exploitable */
|
/* Try to catch some obviously faulty streams, othervise it might be exploitable */
|
||||||
if (q->total_subbands > 53) {
|
if (q->total_subbands > 53) {
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,34 @@
|
||||||
#include "../librm/rm.h"
|
#include "../librm/rm.h"
|
||||||
#include "cookdata_fixpoint.h"
|
#include "cookdata_fixpoint.h"
|
||||||
|
|
||||||
|
#include "codeclib.h"
|
||||||
|
|
||||||
|
#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == MCF5250)
|
||||||
|
/* PP5022/24, MCF5250 have large IRAM */
|
||||||
|
#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR
|
||||||
|
#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR
|
||||||
|
#define ICONST_ATTR_COOK_LARGE_IRAM ICONST_ATTR
|
||||||
|
#define IBSS_ATTR_COOK_VLCBUF
|
||||||
|
#define ICODE_ATTR_COOK_DECODE
|
||||||
|
|
||||||
|
#elif defined(CPU_S5L870X)
|
||||||
|
/* S5L870X have even larger IRAM and it is faster to use ICODE_ATTR. */
|
||||||
|
#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR
|
||||||
|
#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR
|
||||||
|
#define ICONST_ATTR_COOK_LARGE_IRAM ICONST_ATTR
|
||||||
|
#define IBSS_ATTR_COOK_VLCBUF IBSS_ATTR
|
||||||
|
#define ICODE_ATTR_COOK_DECODE ICODE_ATTR
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* other CPUs IRAM is not large enough */
|
||||||
|
#define IBSS_ATTR_COOK_LARGE_IRAM
|
||||||
|
#define ICODE_ATTR_COOK_LARGE_IRAM
|
||||||
|
#define ICONST_ATTR_COOK_LARGE_IRAM
|
||||||
|
#define IBSS_ATTR_COOK_VLCBUF
|
||||||
|
#define ICODE_ATTR_COOK_DECODE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int *now;
|
int *now;
|
||||||
int *previous;
|
int *previous;
|
||||||
|
|
@ -86,13 +114,14 @@ typedef struct cook {
|
||||||
|
|
||||||
/* data buffers */
|
/* data buffers */
|
||||||
|
|
||||||
uint8_t decoded_bytes_buffer[1024];
|
uint8_t decoded_bytes_buffer[1024] MEM_ALIGN_ATTR;
|
||||||
REAL_T mono_mdct_output[2048] __attribute__ ((aligned(16)));
|
REAL_T mono_mdct_output[2048] MEM_ALIGN_ATTR;
|
||||||
REAL_T mono_previous_buffer1[1024];
|
REAL_T mono_previous_buffer1[1024] MEM_ALIGN_ATTR;
|
||||||
REAL_T mono_previous_buffer2[1024];
|
REAL_T mono_previous_buffer2[1024] MEM_ALIGN_ATTR;
|
||||||
REAL_T decode_buffer_1[1024];
|
REAL_T decode_buffer_1[1024] MEM_ALIGN_ATTR;
|
||||||
REAL_T decode_buffer_2[1024];
|
REAL_T decode_buffer_2[1024] MEM_ALIGN_ATTR;
|
||||||
REAL_T decode_buffer_0[1060]; /* static allocation for joint decode */
|
/* static allocation for joint decode */
|
||||||
|
REAL_T decode_buffer_0[1060] MEM_ALIGN_ATTR;
|
||||||
} COOKContext;
|
} COOKContext;
|
||||||
|
|
||||||
int cook_decode_init(RMContext *rmctx, COOKContext *q);
|
int cook_decode_init(RMContext *rmctx, COOKContext *q);
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,11 @@ static inline int av_clip(int a, int amin, int amax)
|
||||||
* @param subband_coef_sign use random noise instead of predetermined value
|
* @param subband_coef_sign use random noise instead of predetermined value
|
||||||
* @param mlt_ptr pointer to the mlt coefficients
|
* @param mlt_ptr pointer to the mlt coefficients
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void scalar_dequant_math(COOKContext *q, int index,
|
||||||
|
int quant_index, int* subband_coef_index,
|
||||||
|
int* subband_coef_sign, REAL_T *mlt_p)
|
||||||
|
ICODE_ATTR_COOK_DECODE;
|
||||||
static void scalar_dequant_math(COOKContext *q, int index,
|
static void scalar_dequant_math(COOKContext *q, int index,
|
||||||
int quant_index, int* subband_coef_index,
|
int quant_index, int* subband_coef_index,
|
||||||
int* subband_coef_sign, REAL_T *mlt_p)
|
int* subband_coef_sign, REAL_T *mlt_p)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue