From 4522960541f6769c29333b313cdd7fa66eeba164 Mon Sep 17 00:00:00 2001 From: Buschel Date: Sun, 24 Apr 2011 13:54:02 +0000 Subject: [PATCH] Clean up array sizes in the SBR + PS part of libfaad. Add MAX_NTSRPS (=38), use MAX_NTSR and MAX_NTSRHFG at the right places. RAM (IRAM) usage is reduced by 2 KB. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29773 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libfaad/drm_dec.c | 14 ++++++++++---- apps/codecs/libfaad/drm_dec.h | 4 +++- apps/codecs/libfaad/ps_dec.c | 36 +++++++++++++++++++++++++----------- apps/codecs/libfaad/ps_dec.h | 6 +++++- apps/codecs/libfaad/sbr_dec.c | 12 ++++++++++-- apps/codecs/libfaad/sbr_dec.h | 3 +-- apps/codecs/libfaad/sbr_qmf.c | 10 +++++----- apps/codecs/libfaad/sbr_qmf.h | 6 +++--- 8 files changed, 62 insertions(+), 29 deletions(-) diff --git a/apps/codecs/libfaad/drm_dec.c b/apps/codecs/libfaad/drm_dec.c index 8bf905169..0cf40df23 100644 --- a/apps/codecs/libfaad/drm_dec.c +++ b/apps/codecs/libfaad/drm_dec.c @@ -658,7 +658,7 @@ static void drm_ps_delta_decode(drm_ps_info *ps) } } -static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64], uint8_t rateselect) +static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[MAX_NTSRPS][64], uint8_t rateselect) { uint8_t s, b, k; complex_t qfrac, tmp0, tmp, in, R0; @@ -773,7 +773,9 @@ static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64], uint8_t ra ps->delay_buf_index_ser[k] = temp_delay_ser[k]; } -static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64]) +static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64]) { uint8_t s, b, ifreq, qclass; real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; @@ -833,7 +835,9 @@ static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[3 } } -static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64]) +static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64]) { uint8_t s, b, qclass, ifreq; real_t tmp, coeff1, coeff2; @@ -924,7 +928,9 @@ void drm_ps_free(drm_ps_info *ps) } /* main DRM PS decoding function */ -uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64]) +uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64]) { uint8_t rateselect = (samplerate >= 24000); diff --git a/apps/codecs/libfaad/drm_dec.h b/apps/codecs/libfaad/drm_dec.h index e90b2340b..34923c643 100644 --- a/apps/codecs/libfaad/drm_dec.h +++ b/apps/codecs/libfaad/drm_dec.h @@ -88,7 +88,9 @@ uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld); drm_ps_info *drm_ps_init(void); void drm_ps_free(drm_ps_info *ps); -uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64]); +uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64]); #ifdef __cplusplus } diff --git a/apps/codecs/libfaad/ps_dec.c b/apps/codecs/libfaad/ps_dec.c index f5d5ca948..9a176235d 100644 --- a/apps/codecs/libfaad/ps_dec.c +++ b/apps/codecs/libfaad/ps_dec.c @@ -181,10 +181,16 @@ static void map20indexto34(int8_t *index, uint8_t bins); static void map34indexto20(int8_t *index, uint8_t bins); #endif static void ps_data_decode(ps_info *ps); -static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); -static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); +static void ps_decorrelate(ps_info *ps, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64], + qmf_t X_hybrid_left[32][32], + qmf_t X_hybrid_right[32][32]); +static void ps_mix_phase(ps_info *ps, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64], + qmf_t X_hybrid_left[32][32], + qmf_t X_hybrid_right[32][32]); /* */ @@ -1027,8 +1033,11 @@ static void ps_data_decode(ps_info *ps) } /* decorrelate the mono signal using an allpass filter */ -static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) +static void ps_decorrelate(ps_info *ps, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64], + qmf_t X_hybrid_left[32][32], + qmf_t X_hybrid_right[32][32]) { uint8_t gr, n, m, bk; uint8_t temp_delay = 0; @@ -1423,8 +1432,11 @@ static const real_t ipdopd_sin_tab[] = { FRAC_CONST(-0.000000000000000) }; -static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) +static void ps_mix_phase(ps_info *ps, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64], + qmf_t X_hybrid_left[32][32], + qmf_t X_hybrid_right[32][32]) { uint8_t n; uint8_t gr; @@ -1939,13 +1951,15 @@ ps_info *ps_init(uint8_t sr_index) } /* main Parametric Stereo decoding function */ -uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) +uint8_t ps_decode(ps_info *ps, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64]) { static qmf_t X_hybrid_left[32][32]; static qmf_t X_hybrid_right[32][32]; - memset(&X_hybrid_left,0,sizeof(X_hybrid_left)); - memset(&X_hybrid_right,0,sizeof(X_hybrid_right)); + memset(&X_hybrid_left , 0, sizeof(X_hybrid_left)); + memset(&X_hybrid_right, 0, sizeof(X_hybrid_right)); /* delta decoding of the bitstream data */ ps_data_decode(ps); diff --git a/apps/codecs/libfaad/ps_dec.h b/apps/codecs/libfaad/ps_dec.h index fca1f775e..03cefd6fc 100644 --- a/apps/codecs/libfaad/ps_dec.h +++ b/apps/codecs/libfaad/ps_dec.h @@ -39,6 +39,8 @@ extern "C" { #define MAX_PS_ENVELOPES 5 #define NO_ALLPASS_LINKS 3 +#define MAX_NTSRPS 38 /* max number_time_slots * rate + 6 (delay) */ + typedef struct { /* bitstream parameters */ @@ -138,7 +140,9 @@ uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header); ps_info *ps_init(uint8_t sr_index); void ps_free(ps_info *ps); -uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]); +uint8_t ps_decode(ps_info *ps, + qmf_t X_left[MAX_NTSRPS][64], + qmf_t X_right[MAX_NTSRPS][64]); #ifdef __cplusplus diff --git a/apps/codecs/libfaad/sbr_dec.c b/apps/codecs/libfaad/sbr_dec.c index 6fe884639..c460be0c0 100644 --- a/apps/codecs/libfaad/sbr_dec.c +++ b/apps/codecs/libfaad/sbr_dec.c @@ -43,8 +43,16 @@ /* globals */ -static qmf_t X_left [MAX_NTSRHFG][64] IBSS_ATTR_FAAD_XLARGE_IRAM MEM_ALIGN_ATTR; -static qmf_t X_right[MAX_NTSRHFG][64] IBSS_ATTR_FAAD_XLARGE_IRAM MEM_ALIGN_ATTR; +#if (defined(PS_DEC) || defined(DRM_PS)) +/* In case of PS_DEC or DRM_PS we need larger buffer data when calling + * ps_decode() or drm_ps_decode(). */ +static qmf_t X_left [MAX_NTSRPS][64] IBSS_ATTR_FAAD_XLARGE_IRAM MEM_ALIGN_ATTR; +static qmf_t X_right[MAX_NTSRPS][64] IBSS_ATTR_FAAD_XLARGE_IRAM MEM_ALIGN_ATTR; +#else +/* No PS functions called. Keep using MAX_NTSR as array size. */ +static qmf_t X_left [MAX_NTSR][64] IBSS_ATTR_FAAD_XLARGE_IRAM MEM_ALIGN_ATTR; +static qmf_t X_right[MAX_NTSR][64] IBSS_ATTR_FAAD_XLARGE_IRAM MEM_ALIGN_ATTR; +#endif /* static function declarations */ diff --git a/apps/codecs/libfaad/sbr_dec.h b/apps/codecs/libfaad/sbr_dec.h index 25b3e37f5..aa145fe34 100644 --- a/apps/codecs/libfaad/sbr_dec.h +++ b/apps/codecs/libfaad/sbr_dec.h @@ -39,8 +39,7 @@ extern "C" { #include "drm_dec.h" #endif -/* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */ -#define MAX_NTSRHFG 40 +#define MAX_NTSRHFG 40 /* maximum of number_time_slots * rate + HFGen. 16*2+8 */ #define MAX_NTSR 32 /* max number_time_slots * rate, ok for DRM and not DRM mode */ /* MAX_M: maximum value for M */ diff --git a/apps/codecs/libfaad/sbr_qmf.c b/apps/codecs/libfaad/sbr_qmf.c index bb6e176a3..7cb62c241 100644 --- a/apps/codecs/libfaad/sbr_qmf.c +++ b/apps/codecs/libfaad/sbr_qmf.c @@ -76,7 +76,7 @@ void qmfa_end(qmfa_info *qmfa) } void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, - qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx) + qmf_t X[MAX_NTSR][64], uint8_t offset, uint8_t kx) { real_t u[64] MEM_ALIGN_ATTR; #ifndef SBR_LOW_POWER @@ -224,7 +224,7 @@ void qmfs_end(qmfs_info *qmfs) #ifdef SBR_LOW_POWER -void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSR][64], real_t *output) { real_t x[16] MEM_ALIGN_ATTR; @@ -288,7 +288,7 @@ void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][6 } } -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSR][64], real_t *output) { real_t x[64] MEM_ALIGN_ATTR; @@ -398,7 +398,7 @@ static const complex_t qmf32_pre_twiddle[] = (MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + \ MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k]))) -void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSR][64], real_t *output) { real_t x1[32] MEM_ALIGN_ATTR; @@ -461,7 +461,7 @@ void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][6 } } -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSR][64], real_t *output) { real_t real1[32] MEM_ALIGN_ATTR; diff --git a/apps/codecs/libfaad/sbr_qmf.h b/apps/codecs/libfaad/sbr_qmf.h index f940ccfa0..5ed8ff85d 100644 --- a/apps/codecs/libfaad/sbr_qmf.h +++ b/apps/codecs/libfaad/sbr_qmf.h @@ -38,10 +38,10 @@ qmfs_info *qmfs_init(uint8_t channels); void qmfs_end(qmfs_info *qmfs); void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, - qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx); -void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + qmf_t X[MAX_NTSR][64], uint8_t offset, uint8_t kx); +void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSR][64], real_t *output); -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSR][64], real_t *output); -- 2.11.4.GIT