forked from len0rd/rockbox
Apply a bunch of simple AAC decoder optimizations. Biggest speedup is on ColdFire targets, but ARM targets benefits too. Allows realtime playback of some AAC files on Iriver targets (H1x0, H3x0). Remove support for some rarely used AAC profiles to reduce code size a bit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11038 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
0e5bd54cbb
commit
3fa5e5f592
11 changed files with 62 additions and 41 deletions
|
|
@ -32,7 +32,7 @@
|
|||
#include <string.h>
|
||||
#include "bits.h"
|
||||
|
||||
uint8_t static_buffer[1024] IBSS_ATTR;
|
||||
uint8_t static_buffer[1024];
|
||||
|
||||
/* initialize buffer, call once before first getbits or showbits */
|
||||
void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size)
|
||||
|
|
|
|||
|
|
@ -960,7 +960,17 @@ cfft_info *cffti(uint16_t n)
|
|||
cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info));
|
||||
|
||||
cfft->n = n;
|
||||
|
||||
if (n <= 512)
|
||||
{
|
||||
static complex_t work_buf[512] IBSS_ATTR;
|
||||
|
||||
cfft->work = work_buf;
|
||||
}
|
||||
else
|
||||
{
|
||||
cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t));
|
||||
}
|
||||
|
||||
#ifndef FIXED_POINT
|
||||
cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t));
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ extern "C" {
|
|||
|
||||
#ifdef FIXED_POINT
|
||||
|
||||
ALIGN static const complex_t cfft_tab_512[] =
|
||||
ALIGN static const complex_t cfft_tab_512[] ICONST_ATTR =
|
||||
{
|
||||
{ FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
|
||||
{ FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) },
|
||||
|
|
@ -1036,7 +1036,7 @@ ALIGN static const complex_t cfft_tab_480[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const complex_t cfft_tab_64[] =
|
||||
ALIGN static const complex_t cfft_tab_64[] ICONST_ATTR =
|
||||
{
|
||||
{ FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
|
||||
{ FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) },
|
||||
|
|
@ -1680,7 +1680,7 @@ ALIGN static const complex_t cfft_tab_240[] =
|
|||
|
||||
#endif
|
||||
|
||||
ALIGN static const complex_t cfft_tab_128[] =
|
||||
ALIGN static const complex_t cfft_tab_128[] ICONST_ATTR =
|
||||
{
|
||||
{ FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) },
|
||||
{ FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) },
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ extern struct codec_api* ci;
|
|||
|
||||
|
||||
// Define LC_ONLY_DECODER if you want a pure AAC LC decoder (independant of SBR_DEC and PS_DEC)
|
||||
//#define LC_ONLY_DECODER
|
||||
#define LC_ONLY_DECODER
|
||||
#ifdef LC_ONLY_DECODER
|
||||
#undef LD_DEC
|
||||
#undef LTP_DEC
|
||||
|
|
|
|||
|
|
@ -127,6 +127,7 @@ static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, ui
|
|||
|
||||
faad_imdct(mdct, in_data, out_data);
|
||||
#else
|
||||
(void) len;
|
||||
faad_imdct(fb->mdct2048, in_data, out_data);
|
||||
#endif
|
||||
}
|
||||
|
|
@ -159,7 +160,7 @@ static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t
|
|||
}
|
||||
#endif
|
||||
|
||||
ALIGN real_t transf_buf[2*1024] = {0};
|
||||
ALIGN real_t transf_buf[2*1024] IBSS_ATTR;
|
||||
|
||||
void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape,
|
||||
uint8_t window_shape_prev, real_t *freq_in,
|
||||
|
|
@ -191,6 +192,8 @@ void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape,
|
|||
window_long = fb->ld_window[window_shape];
|
||||
window_long_prev = fb->ld_window[window_shape_prev];
|
||||
} else {
|
||||
#else
|
||||
(void) object_type;
|
||||
#endif
|
||||
window_long = fb->long_window[window_shape];
|
||||
window_long_prev = fb->long_window[window_shape_prev];
|
||||
|
|
@ -359,6 +362,8 @@ void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape,
|
|||
window_long = fb->ld_window[window_shape];
|
||||
window_long_prev = fb->ld_window[window_shape_prev];
|
||||
} else {
|
||||
#else
|
||||
(void) object_type;
|
||||
#endif
|
||||
window_long = fb->long_window[window_shape];
|
||||
window_long_prev = fb->long_window[window_shape_prev];
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ extern "C" {
|
|||
#pragma warning(disable:4244)
|
||||
#endif
|
||||
|
||||
ALIGN static const real_t kbd_long_1024[] =
|
||||
ALIGN static const real_t kbd_long_1024[] ICONST_ATTR =
|
||||
{
|
||||
FRAC_CONST(0.00029256153896361),
|
||||
FRAC_CONST(0.00042998567353047),
|
||||
|
|
@ -2030,7 +2030,7 @@ ALIGN static const real_t kbd_long_960[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const real_t kbd_short_128[] =
|
||||
ALIGN static const real_t kbd_short_128[] ICONST_ATTR =
|
||||
{
|
||||
FRAC_CONST(4.3795702929468881e-005),
|
||||
FRAC_CONST(0.00011867384265436617),
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out)
|
|||
real_t scale = 0, b_scale = 0;
|
||||
#endif
|
||||
#endif
|
||||
ALIGN static complex_t Z1[512];
|
||||
ALIGN static complex_t Z1[512] IBSS_ATTR;
|
||||
complex_t *sincos = mdct->sincos;
|
||||
|
||||
uint16_t N = mdct->N;
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ extern "C" {
|
|||
#ifdef FIXED_POINT
|
||||
|
||||
/* 256 (N/4) complex twiddle factors */
|
||||
ALIGN static const complex_t mdct_tab_2048[] =
|
||||
ALIGN static const complex_t mdct_tab_2048[] ICONST_ATTR =
|
||||
{
|
||||
{ FRAC_CONST(0.999999926465718), FRAC_CONST(0.000383495187571) },
|
||||
{ FRAC_CONST(0.999994043728986), FRAC_CONST(0.003451449920136) },
|
||||
|
|
@ -552,7 +552,7 @@ ALIGN static const complex_t mdct_tab_2048[] =
|
|||
};
|
||||
|
||||
/* 64 (N/4) complex twiddle factors */
|
||||
ALIGN static const complex_t mdct_tab_256[] =
|
||||
ALIGN static const complex_t mdct_tab_256[] ICONST_ATTR =
|
||||
{
|
||||
{ FRAC_CONST(0.999995293809576), FRAC_CONST(0.003067956762966) },
|
||||
{ FRAC_CONST(0.999618822495179), FRAC_CONST(0.027608145778966) },
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ extern "C" {
|
|||
#pragma warning(disable:4244)
|
||||
#endif
|
||||
|
||||
ALIGN static const real_t sine_long_1024[] =
|
||||
ALIGN static const real_t sine_long_1024[] ICONST_ATTR =
|
||||
{
|
||||
FRAC_CONST(0.00076699031874270449),
|
||||
FRAC_CONST(0.002300969151425805),
|
||||
|
|
@ -2031,7 +2031,7 @@ ALIGN static const real_t sine_long_960[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const real_t sine_short_128[] =
|
||||
ALIGN static const real_t sine_short_128[] ICONST_ATTR =
|
||||
{
|
||||
FRAC_CONST(0.0061358846491544753),
|
||||
FRAC_CONST(0.01840672990580482),
|
||||
|
|
|
|||
|
|
@ -71,34 +71,34 @@ ALIGN static const uint8_t num_swb_480_window[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const uint8_t num_swb_960_window[] =
|
||||
ALIGN static const uint8_t num_swb_960_window[] ICONST_ATTR =
|
||||
{
|
||||
40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40
|
||||
};
|
||||
|
||||
ALIGN static const uint8_t num_swb_1024_window[] =
|
||||
ALIGN static const uint8_t num_swb_1024_window[] ICONST_ATTR =
|
||||
{
|
||||
41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
|
||||
};
|
||||
|
||||
ALIGN static const uint8_t num_swb_128_window[] =
|
||||
ALIGN static const uint8_t num_swb_128_window[] ICONST_ATTR =
|
||||
{
|
||||
12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_96[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_96[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
|
||||
64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240,
|
||||
276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_128_96[] =
|
||||
ALIGN static const uint16_t swb_offset_128_96[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_64[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_64[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
|
||||
64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
|
||||
|
|
@ -106,12 +106,12 @@ ALIGN static const uint16_t swb_offset_1024_64[] =
|
|||
864, 904, 944, 984, 1024
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_128_64[] =
|
||||
ALIGN static const uint16_t swb_offset_128_64[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_48[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_48[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
|
||||
80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
|
||||
|
|
@ -135,12 +135,12 @@ ALIGN static const uint16_t swb_offset_480_48[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const uint16_t swb_offset_128_48[] =
|
||||
ALIGN static const uint16_t swb_offset_128_48[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_32[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_32[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
|
||||
80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
|
||||
|
|
@ -164,7 +164,7 @@ ALIGN static const uint16_t swb_offset_480_32[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_24[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_24[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
|
||||
76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220,
|
||||
|
|
@ -187,36 +187,36 @@ ALIGN static const uint16_t swb_offset_480_24[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const uint16_t swb_offset_128_24[] =
|
||||
ALIGN static const uint16_t swb_offset_128_24[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_16[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_16[] ICONST_ATTR =
|
||||
{
|
||||
0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
|
||||
136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
|
||||
368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_128_16[] =
|
||||
ALIGN static const uint16_t swb_offset_128_16[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_1024_8[] =
|
||||
ALIGN static const uint16_t swb_offset_1024_8[] ICONST_ATTR =
|
||||
{
|
||||
0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172,
|
||||
188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
|
||||
476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t swb_offset_128_8[] =
|
||||
ALIGN static const uint16_t swb_offset_128_8[] ICONST_ATTR =
|
||||
{
|
||||
0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
|
||||
};
|
||||
|
||||
ALIGN static const uint16_t *swb_offset_1024_window[] =
|
||||
ALIGN static const uint16_t *swb_offset_1024_window[] ICODE_ATTR =
|
||||
{
|
||||
swb_offset_1024_96, /* 96000 */
|
||||
swb_offset_1024_96, /* 88200 */
|
||||
|
|
@ -266,7 +266,7 @@ ALIGN static const uint16_t *swb_offset_480_window[] =
|
|||
};
|
||||
#endif
|
||||
|
||||
ALIGN static const uint16_t *swb_offset_128_window[] =
|
||||
ALIGN static const uint16_t *swb_offset_128_window[] ICODE_ATTR =
|
||||
{
|
||||
swb_offset_128_96, /* 96000 */
|
||||
swb_offset_128_96, /* 88200 */
|
||||
|
|
@ -534,7 +534,7 @@ static uint8_t quant_to_spec(NeAACDecHandle hDecoder,
|
|||
ic_stream *ics, int16_t *quant_data,
|
||||
real_t *spec_data, uint16_t frame_len)
|
||||
{
|
||||
ALIGN static const real_t pow2_table[] =
|
||||
ALIGN static const real_t pow2_table[] ICONST_ATTR =
|
||||
{
|
||||
COEF_CONST(1.0),
|
||||
COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */
|
||||
|
|
@ -1049,8 +1049,8 @@ uint8_t reconstruct_channel_pair(NeAACDecHandle hDecoder, ic_stream *ics1, ic_st
|
|||
element *cpe, int16_t *spec_data1, int16_t *spec_data2)
|
||||
{
|
||||
uint8_t retval;
|
||||
ALIGN static real_t spec_coef1[1024];
|
||||
ALIGN static real_t spec_coef2[1024];
|
||||
ALIGN static real_t spec_coef1[1024] IBSS_ATTR;
|
||||
ALIGN static real_t spec_coef2[1024] IBSS_ATTR;
|
||||
|
||||
#ifdef PROFILE
|
||||
int64_t count = faad_get_ts();
|
||||
|
|
|
|||
|
|
@ -559,7 +559,7 @@ void raw_data_block(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo,
|
|||
/* Table 4.4.4 and */
|
||||
/* Table 4.4.9 */
|
||||
ALIGN int16_t spec_data[1024] = {0};
|
||||
element sce IBSS_ATTR;
|
||||
element sce;
|
||||
static uint8_t single_lfe_channel_element(NeAACDecHandle hDecoder, bitfile *ld,
|
||||
uint8_t channel, uint8_t *tag)
|
||||
{
|
||||
|
|
@ -603,9 +603,9 @@ static uint8_t single_lfe_channel_element(NeAACDecHandle hDecoder, bitfile *ld,
|
|||
}
|
||||
|
||||
/* Table 4.4.5 */
|
||||
ALIGN int16_t spec_data1[1024];
|
||||
ALIGN int16_t spec_data2[1024];
|
||||
element cpe IBSS_ATTR;
|
||||
ALIGN int16_t spec_data1[1024] IBSS_ATTR;
|
||||
ALIGN int16_t spec_data2[1024] IBSS_ATTR;
|
||||
element cpe;
|
||||
static uint8_t channel_pair_element(NeAACDecHandle hDecoder, bitfile *ld,
|
||||
uint8_t channels, uint8_t *tag)
|
||||
{
|
||||
|
|
@ -833,6 +833,8 @@ static uint8_t ics_info(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld,
|
|||
}
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
(void) common_window;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
@ -1166,8 +1168,8 @@ static void gain_control_data(bitfile *ld, ic_stream *ics)
|
|||
#endif
|
||||
|
||||
#ifdef SCALABLE_DEC
|
||||
ALIGN int16_t spec_data1[1024] IBSS_ATTR;
|
||||
ALIGN int16_t spec_data2[1024] IBSS_ATTR;
|
||||
ALIGN int16_t spec_data1[1024];
|
||||
ALIGN int16_t spec_data2[1024];
|
||||
/* Table 4.4.13 ASME */
|
||||
void aac_scalable_main_element(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo,
|
||||
bitfile *ld, program_config *pce, drc_info *drc)
|
||||
|
|
@ -1610,6 +1612,8 @@ static uint8_t section_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld
|
|||
#ifdef ERROR_RESILIENCE
|
||||
if (hDecoder->aacSectionDataResilienceFlag)
|
||||
sect_cb_bits = 5;
|
||||
#else
|
||||
(void) hDecoder;
|
||||
#endif
|
||||
|
||||
ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits
|
||||
|
|
@ -1797,6 +1801,8 @@ static uint8_t scale_factor_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfil
|
|||
#ifdef ERROR_RESILIENCE
|
||||
if (!hDecoder->aacScalefactorDataResilienceFlag)
|
||||
{
|
||||
#else
|
||||
(void) hDecoder;
|
||||
#endif
|
||||
ret = decode_scale_factors(ics, ld);
|
||||
#ifdef ERROR_RESILIENCE
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue