avcodec/aacdec_common: Avoid superfluous VLC structures for SBR VLCs

For all VLCs here, the number of bits of the VLC is
write-only, because it is hardcoded at the call site.
Therefore one can replace these VLC structures with
the only thing that is actually used: The pointer
to the VLCElem table.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2023-09-25 00:54:01 +02:00
parent 22d60524d8
commit 0b4e69cc87
3 changed files with 32 additions and 29 deletions

View File

@ -352,15 +352,16 @@ static const uint8_t t_huffman_noise_bal_3_0dB_codes[25] = {
0xff,
};
VLC ff_aac_sbr_vlc[10];
const VLCElem *ff_aac_sbr_vlc[10];
static av_cold void aacdec_common_init(void)
{
#define SBR_INIT_VLC_STATIC(num, size) \
VLC_INIT_STATIC(&ff_aac_sbr_vlc[num], 9, sbr_tmp[num].table_size / sbr_tmp[num].elem_size, \
#define SBR_INIT_VLC_STATIC(num) \
ff_aac_sbr_vlc[num] = \
ff_vlc_init_tables_sparse(&state, 9, sbr_tmp[num].table_size / sbr_tmp[num].elem_size, \
sbr_tmp[num].sbr_bits , 1, 1, \
sbr_tmp[num].sbr_codes, sbr_tmp[num].elem_size, sbr_tmp[num].elem_size, \
size)
NULL, 0, 0, 0)
#define SBR_VLC_ROW(name) \
{ name ## _codes, name ## _bits, sizeof(name ## _codes), sizeof(name ## _codes[0]) }
static const struct {
@ -379,8 +380,10 @@ static av_cold void aacdec_common_init(void)
SBR_VLC_ROW(t_huffman_noise_bal_3_0dB),
};
static VLCElem vlc_buf[304 + 270 + 550 + 300 + 328 +
294 + 306 + 268 + 510 + 366 + 462];
static VLCElem vlc_buf[(304 + 270 + 550 + 300 + 328 +
294 + 306 + 268 + 510 + 366 + 462) +
(1098 + 1092 + 768 + 1026 + 1058 +
1052 + 544 + 544 + 592 + 512)];
VLCInitState state = VLC_INIT_STATE(vlc_buf);
for (unsigned i = 0; i < 11; i++) {
@ -403,16 +406,16 @@ static av_cold void aacdec_common_init(void)
sizeof(ff_aac_scalefactor_code[0]), 0);
// SBR VLC table initialization
SBR_INIT_VLC_STATIC(0, 1098);
SBR_INIT_VLC_STATIC(1, 1092);
SBR_INIT_VLC_STATIC(2, 768);
SBR_INIT_VLC_STATIC(3, 1026);
SBR_INIT_VLC_STATIC(4, 1058);
SBR_INIT_VLC_STATIC(5, 1052);
SBR_INIT_VLC_STATIC(6, 544);
SBR_INIT_VLC_STATIC(7, 544);
SBR_INIT_VLC_STATIC(8, 592);
SBR_INIT_VLC_STATIC(9, 512);
SBR_INIT_VLC_STATIC(0);
SBR_INIT_VLC_STATIC(1);
SBR_INIT_VLC_STATIC(2);
SBR_INIT_VLC_STATIC(3);
SBR_INIT_VLC_STATIC(4);
SBR_INIT_VLC_STATIC(5);
SBR_INIT_VLC_STATIC(6);
SBR_INIT_VLC_STATIC(7);
SBR_INIT_VLC_STATIC(8);
SBR_INIT_VLC_STATIC(9);
}
av_cold void ff_aacdec_common_init_once(void)

View File

@ -38,7 +38,7 @@
FF_VISIBILITY_PUSH_HIDDEN
void ff_aacdec_common_init_once(void);
extern VLC ff_aac_sbr_vlc[10];
extern const VLCElem *ff_aac_sbr_vlc[10];
extern VLCElem ff_vlc_scalefactors[];
extern const VLCElem *ff_vlc_spectral[11];

View File

@ -811,29 +811,29 @@ static int read_sbr_envelope(AACContext *ac, SpectralBandReplication *sbr, GetBi
if (sbr->bs_coupling && ch) {
if (ch_data->bs_amp_res) {
bits = 5;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB].table;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_3_0DB];
t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_BAL_3_0DB];
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB].table;
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_3_0DB];
} else {
bits = 6;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB].table;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_BAL_1_5DB];
t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_BAL_1_5DB];
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB].table;
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_1_5DB];
f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_1_5DB];
}
} else {
if (ch_data->bs_amp_res) {
bits = 6;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB].table;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_3_0DB];
t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_3_0DB];
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB].table;
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_3_0DB];
} else {
bits = 7;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB].table;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_ENV_1_5DB];
t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_1_5DB];
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB].table;
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_1_5DB];
f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_1_5DB];
}
}
@ -896,14 +896,14 @@ static int read_sbr_noise(AACContext *ac, SpectralBandReplication *sbr, GetBitCo
int delta = (ch == 1 && sbr->bs_coupling == 1) + 1;
if (sbr->bs_coupling && ch) {
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB].table;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_BAL_3_0DB];
t_lav = vlc_sbr_lav[T_HUFFMAN_NOISE_BAL_3_0DB];
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB].table;
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_BAL_3_0DB];
f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_3_0DB];
} else {
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB].table;
t_huff = ff_aac_sbr_vlc[T_HUFFMAN_NOISE_3_0DB];
t_lav = vlc_sbr_lav[T_HUFFMAN_NOISE_3_0DB];
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB].table;
f_huff = ff_aac_sbr_vlc[F_HUFFMAN_ENV_3_0DB];
f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_3_0DB];
}