1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * AAC Spectral Band Replication decoding functions 3cabdff1aSopenharmony_ci * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl ) 4cabdff1aSopenharmony_ci * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * Fixed point code 7cabdff1aSopenharmony_ci * Copyright (c) 2013 8cabdff1aSopenharmony_ci * MIPS Technologies, Inc., California. 9cabdff1aSopenharmony_ci * 10cabdff1aSopenharmony_ci * This file is part of FFmpeg. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 13cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 14cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 15cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 18cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 19cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20cabdff1aSopenharmony_ci * Lesser General Public License for more details. 21cabdff1aSopenharmony_ci * 22cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 23cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 24cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci/** 28cabdff1aSopenharmony_ci * @file 29cabdff1aSopenharmony_ci * AAC Spectral Band Replication decoding functions 30cabdff1aSopenharmony_ci * @author Robert Swain ( rob opendot cl ) 31cabdff1aSopenharmony_ci * @author Stanislav Ocovaj ( stanislav.ocovaj@imgtec.com ) 32cabdff1aSopenharmony_ci * @author Zoran Basaric ( zoran.basaric@imgtec.com ) 33cabdff1aSopenharmony_ci */ 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci#include "libavutil/qsort.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_cistatic av_cold void aacsbr_tableinit(void) 38cabdff1aSopenharmony_ci{ 39cabdff1aSopenharmony_ci int n; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci for (n = 0; n < 320; n++) 42cabdff1aSopenharmony_ci sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n]; 43cabdff1aSopenharmony_ci} 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ciav_cold void AAC_RENAME(ff_aac_sbr_init)(void) 46cabdff1aSopenharmony_ci{ 47cabdff1aSopenharmony_ci static const struct { 48cabdff1aSopenharmony_ci const void *sbr_codes, *sbr_bits; 49cabdff1aSopenharmony_ci const unsigned int table_size, elem_size; 50cabdff1aSopenharmony_ci } sbr_tmp[] = { 51cabdff1aSopenharmony_ci SBR_VLC_ROW(t_huffman_env_1_5dB), 52cabdff1aSopenharmony_ci SBR_VLC_ROW(f_huffman_env_1_5dB), 53cabdff1aSopenharmony_ci SBR_VLC_ROW(t_huffman_env_bal_1_5dB), 54cabdff1aSopenharmony_ci SBR_VLC_ROW(f_huffman_env_bal_1_5dB), 55cabdff1aSopenharmony_ci SBR_VLC_ROW(t_huffman_env_3_0dB), 56cabdff1aSopenharmony_ci SBR_VLC_ROW(f_huffman_env_3_0dB), 57cabdff1aSopenharmony_ci SBR_VLC_ROW(t_huffman_env_bal_3_0dB), 58cabdff1aSopenharmony_ci SBR_VLC_ROW(f_huffman_env_bal_3_0dB), 59cabdff1aSopenharmony_ci SBR_VLC_ROW(t_huffman_noise_3_0dB), 60cabdff1aSopenharmony_ci SBR_VLC_ROW(t_huffman_noise_bal_3_0dB), 61cabdff1aSopenharmony_ci }; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci // SBR VLC table initialization 64cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(0, 1098); 65cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(1, 1092); 66cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(2, 768); 67cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(3, 1026); 68cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(4, 1058); 69cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(5, 1052); 70cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(6, 544); 71cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(7, 544); 72cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(8, 592); 73cabdff1aSopenharmony_ci SBR_INIT_VLC_STATIC(9, 512); 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci aacsbr_tableinit(); 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci AAC_RENAME(ff_ps_init)(); 78cabdff1aSopenharmony_ci} 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci/** Places SBR in pure upsampling mode. */ 81cabdff1aSopenharmony_cistatic void sbr_turnoff(SpectralBandReplication *sbr) { 82cabdff1aSopenharmony_ci sbr->start = 0; 83cabdff1aSopenharmony_ci sbr->ready_for_dequant = 0; 84cabdff1aSopenharmony_ci // Init defults used in pure upsampling mode 85cabdff1aSopenharmony_ci sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 86cabdff1aSopenharmony_ci sbr->m[1] = 0; 87cabdff1aSopenharmony_ci // Reset values for first SBR header 88cabdff1aSopenharmony_ci sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; 89cabdff1aSopenharmony_ci memset(&sbr->spectrum_params, -1, sizeof(SpectrumParameters)); 90cabdff1aSopenharmony_ci} 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ciav_cold void AAC_RENAME(ff_aac_sbr_ctx_init)(AACContext *ac, SpectralBandReplication *sbr, int id_aac) 93cabdff1aSopenharmony_ci{ 94cabdff1aSopenharmony_ci if(sbr->mdct.mdct_bits) 95cabdff1aSopenharmony_ci return; 96cabdff1aSopenharmony_ci sbr->kx[0] = sbr->kx[1]; 97cabdff1aSopenharmony_ci sbr->id_aac = id_aac; 98cabdff1aSopenharmony_ci sbr_turnoff(sbr); 99cabdff1aSopenharmony_ci sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); 100cabdff1aSopenharmony_ci sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); 101cabdff1aSopenharmony_ci /* SBR requires samples to be scaled to +/-32768.0 to work correctly. 102cabdff1aSopenharmony_ci * mdct scale factors are adjusted to scale up from +/-1.0 at analysis 103cabdff1aSopenharmony_ci * and scale back down at synthesis. */ 104cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_init)(&sbr->mdct, 7, 1, 1.0 / (64 * 32768.0)); 105cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_init)(&sbr->mdct_ana, 7, 1, -2.0 * 32768.0); 106cabdff1aSopenharmony_ci AAC_RENAME(ff_ps_ctx_init)(&sbr->ps); 107cabdff1aSopenharmony_ci AAC_RENAME(ff_sbrdsp_init)(&sbr->dsp); 108cabdff1aSopenharmony_ci aacsbr_func_ptr_init(&sbr->c); 109cabdff1aSopenharmony_ci} 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ciav_cold void AAC_RENAME(ff_aac_sbr_ctx_close)(SpectralBandReplication *sbr) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_end)(&sbr->mdct); 114cabdff1aSopenharmony_ci AAC_RENAME_32(ff_mdct_end)(&sbr->mdct_ana); 115cabdff1aSopenharmony_ci} 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_cistatic int qsort_comparison_function_int16(const void *a, const void *b) 118cabdff1aSopenharmony_ci{ 119cabdff1aSopenharmony_ci return *(const int16_t *)a - *(const int16_t *)b; 120cabdff1aSopenharmony_ci} 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_cistatic inline int in_table_int16(const int16_t *table, int last_el, int16_t needle) 123cabdff1aSopenharmony_ci{ 124cabdff1aSopenharmony_ci int i; 125cabdff1aSopenharmony_ci for (i = 0; i <= last_el; i++) 126cabdff1aSopenharmony_ci if (table[i] == needle) 127cabdff1aSopenharmony_ci return 1; 128cabdff1aSopenharmony_ci return 0; 129cabdff1aSopenharmony_ci} 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci/// Limiter Frequency Band Table (14496-3 sp04 p198) 132cabdff1aSopenharmony_cistatic void sbr_make_f_tablelim(SpectralBandReplication *sbr) 133cabdff1aSopenharmony_ci{ 134cabdff1aSopenharmony_ci int k; 135cabdff1aSopenharmony_ci if (sbr->bs_limiter_bands > 0) { 136cabdff1aSopenharmony_ci static const INTFLOAT bands_warped[3] = { Q23(1.32715174233856803909f), //2^(0.49/1.2) 137cabdff1aSopenharmony_ci Q23(1.18509277094158210129f), //2^(0.49/2) 138cabdff1aSopenharmony_ci Q23(1.11987160404675912501f) }; //2^(0.49/3) 139cabdff1aSopenharmony_ci const INTFLOAT lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1]; 140cabdff1aSopenharmony_ci int16_t patch_borders[7]; 141cabdff1aSopenharmony_ci uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci patch_borders[0] = sbr->kx[1]; 144cabdff1aSopenharmony_ci for (k = 1; k <= sbr->num_patches; k++) 145cabdff1aSopenharmony_ci patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1]; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci memcpy(sbr->f_tablelim, sbr->f_tablelow, 148cabdff1aSopenharmony_ci (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0])); 149cabdff1aSopenharmony_ci if (sbr->num_patches > 1) 150cabdff1aSopenharmony_ci memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1, 151cabdff1aSopenharmony_ci (sbr->num_patches - 1) * sizeof(patch_borders[0])); 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_ci AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0], 154cabdff1aSopenharmony_ci uint16_t, 155cabdff1aSopenharmony_ci qsort_comparison_function_int16); 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci sbr->n_lim = sbr->n[0] + sbr->num_patches - 1; 158cabdff1aSopenharmony_ci while (out < sbr->f_tablelim + sbr->n_lim) { 159cabdff1aSopenharmony_ci#if USE_FIXED 160cabdff1aSopenharmony_ci if ((*in << 23) >= *out * lim_bands_per_octave_warped) { 161cabdff1aSopenharmony_ci#else 162cabdff1aSopenharmony_ci if (*in >= *out * lim_bands_per_octave_warped) { 163cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 164cabdff1aSopenharmony_ci *++out = *in++; 165cabdff1aSopenharmony_ci } else if (*in == *out || 166cabdff1aSopenharmony_ci !in_table_int16(patch_borders, sbr->num_patches, *in)) { 167cabdff1aSopenharmony_ci in++; 168cabdff1aSopenharmony_ci sbr->n_lim--; 169cabdff1aSopenharmony_ci } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) { 170cabdff1aSopenharmony_ci *out = *in++; 171cabdff1aSopenharmony_ci sbr->n_lim--; 172cabdff1aSopenharmony_ci } else { 173cabdff1aSopenharmony_ci *++out = *in++; 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci } else { 177cabdff1aSopenharmony_ci sbr->f_tablelim[0] = sbr->f_tablelow[0]; 178cabdff1aSopenharmony_ci sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]]; 179cabdff1aSopenharmony_ci sbr->n_lim = 1; 180cabdff1aSopenharmony_ci } 181cabdff1aSopenharmony_ci} 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_cistatic unsigned int read_sbr_header(SpectralBandReplication *sbr, GetBitContext *gb) 184cabdff1aSopenharmony_ci{ 185cabdff1aSopenharmony_ci unsigned int cnt = get_bits_count(gb); 186cabdff1aSopenharmony_ci uint8_t bs_header_extra_1; 187cabdff1aSopenharmony_ci uint8_t bs_header_extra_2; 188cabdff1aSopenharmony_ci int old_bs_limiter_bands = sbr->bs_limiter_bands; 189cabdff1aSopenharmony_ci SpectrumParameters old_spectrum_params; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci sbr->start = 1; 192cabdff1aSopenharmony_ci sbr->ready_for_dequant = 0; 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci // Save last spectrum parameters variables to compare to new ones 195cabdff1aSopenharmony_ci memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)); 196cabdff1aSopenharmony_ci 197cabdff1aSopenharmony_ci sbr->bs_amp_res_header = get_bits1(gb); 198cabdff1aSopenharmony_ci sbr->spectrum_params.bs_start_freq = get_bits(gb, 4); 199cabdff1aSopenharmony_ci sbr->spectrum_params.bs_stop_freq = get_bits(gb, 4); 200cabdff1aSopenharmony_ci sbr->spectrum_params.bs_xover_band = get_bits(gb, 3); 201cabdff1aSopenharmony_ci skip_bits(gb, 2); // bs_reserved 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_ci bs_header_extra_1 = get_bits1(gb); 204cabdff1aSopenharmony_ci bs_header_extra_2 = get_bits1(gb); 205cabdff1aSopenharmony_ci 206cabdff1aSopenharmony_ci if (bs_header_extra_1) { 207cabdff1aSopenharmony_ci sbr->spectrum_params.bs_freq_scale = get_bits(gb, 2); 208cabdff1aSopenharmony_ci sbr->spectrum_params.bs_alter_scale = get_bits1(gb); 209cabdff1aSopenharmony_ci sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2); 210cabdff1aSopenharmony_ci } else { 211cabdff1aSopenharmony_ci sbr->spectrum_params.bs_freq_scale = 2; 212cabdff1aSopenharmony_ci sbr->spectrum_params.bs_alter_scale = 1; 213cabdff1aSopenharmony_ci sbr->spectrum_params.bs_noise_bands = 2; 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci // Check if spectrum parameters changed 217cabdff1aSopenharmony_ci if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters))) 218cabdff1aSopenharmony_ci sbr->reset = 1; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci if (bs_header_extra_2) { 221cabdff1aSopenharmony_ci sbr->bs_limiter_bands = get_bits(gb, 2); 222cabdff1aSopenharmony_ci sbr->bs_limiter_gains = get_bits(gb, 2); 223cabdff1aSopenharmony_ci sbr->bs_interpol_freq = get_bits1(gb); 224cabdff1aSopenharmony_ci sbr->bs_smoothing_mode = get_bits1(gb); 225cabdff1aSopenharmony_ci } else { 226cabdff1aSopenharmony_ci sbr->bs_limiter_bands = 2; 227cabdff1aSopenharmony_ci sbr->bs_limiter_gains = 2; 228cabdff1aSopenharmony_ci sbr->bs_interpol_freq = 1; 229cabdff1aSopenharmony_ci sbr->bs_smoothing_mode = 1; 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset) 233cabdff1aSopenharmony_ci sbr_make_f_tablelim(sbr); 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci return get_bits_count(gb) - cnt; 236cabdff1aSopenharmony_ci} 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_cistatic int array_min_int16(const int16_t *array, int nel) 239cabdff1aSopenharmony_ci{ 240cabdff1aSopenharmony_ci int i, min = array[0]; 241cabdff1aSopenharmony_ci for (i = 1; i < nel; i++) 242cabdff1aSopenharmony_ci min = FFMIN(array[i], min); 243cabdff1aSopenharmony_ci return min; 244cabdff1aSopenharmony_ci} 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_cistatic int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band) 247cabdff1aSopenharmony_ci{ 248cabdff1aSopenharmony_ci // Requirements (14496-3 sp04 p205) 249cabdff1aSopenharmony_ci if (n_master <= 0) { 250cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master); 251cabdff1aSopenharmony_ci return -1; 252cabdff1aSopenharmony_ci } 253cabdff1aSopenharmony_ci if (bs_xover_band >= n_master) { 254cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 255cabdff1aSopenharmony_ci "Invalid bitstream, crossover band index beyond array bounds: %d\n", 256cabdff1aSopenharmony_ci bs_xover_band); 257cabdff1aSopenharmony_ci return -1; 258cabdff1aSopenharmony_ci } 259cabdff1aSopenharmony_ci return 0; 260cabdff1aSopenharmony_ci} 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci/// Master Frequency Band Table (14496-3 sp04 p194) 263cabdff1aSopenharmony_cistatic int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr, 264cabdff1aSopenharmony_ci SpectrumParameters *spectrum) 265cabdff1aSopenharmony_ci{ 266cabdff1aSopenharmony_ci unsigned int temp, max_qmf_subbands = 0; 267cabdff1aSopenharmony_ci unsigned int start_min, stop_min; 268cabdff1aSopenharmony_ci int k; 269cabdff1aSopenharmony_ci const int8_t *sbr_offset_ptr; 270cabdff1aSopenharmony_ci int16_t stop_dk[13]; 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci switch (sbr->sample_rate) { 273cabdff1aSopenharmony_ci case 16000: 274cabdff1aSopenharmony_ci sbr_offset_ptr = sbr_offset[0]; 275cabdff1aSopenharmony_ci break; 276cabdff1aSopenharmony_ci case 22050: 277cabdff1aSopenharmony_ci sbr_offset_ptr = sbr_offset[1]; 278cabdff1aSopenharmony_ci break; 279cabdff1aSopenharmony_ci case 24000: 280cabdff1aSopenharmony_ci sbr_offset_ptr = sbr_offset[2]; 281cabdff1aSopenharmony_ci break; 282cabdff1aSopenharmony_ci case 32000: 283cabdff1aSopenharmony_ci sbr_offset_ptr = sbr_offset[3]; 284cabdff1aSopenharmony_ci break; 285cabdff1aSopenharmony_ci case 44100: case 48000: case 64000: 286cabdff1aSopenharmony_ci sbr_offset_ptr = sbr_offset[4]; 287cabdff1aSopenharmony_ci break; 288cabdff1aSopenharmony_ci case 88200: case 96000: case 128000: case 176400: case 192000: 289cabdff1aSopenharmony_ci sbr_offset_ptr = sbr_offset[5]; 290cabdff1aSopenharmony_ci break; 291cabdff1aSopenharmony_ci default: 292cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 293cabdff1aSopenharmony_ci "Unsupported sample rate for SBR: %d\n", sbr->sample_rate); 294cabdff1aSopenharmony_ci return -1; 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci if (sbr->sample_rate < 32000) { 298cabdff1aSopenharmony_ci temp = 3000; 299cabdff1aSopenharmony_ci } else if (sbr->sample_rate < 64000) { 300cabdff1aSopenharmony_ci temp = 4000; 301cabdff1aSopenharmony_ci } else 302cabdff1aSopenharmony_ci temp = 5000; 303cabdff1aSopenharmony_ci 304cabdff1aSopenharmony_ci start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate; 305cabdff1aSopenharmony_ci stop_min = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate; 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq]; 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci if (spectrum->bs_stop_freq < 14) { 310cabdff1aSopenharmony_ci sbr->k[2] = stop_min; 311cabdff1aSopenharmony_ci make_bands(stop_dk, stop_min, 64, 13); 312cabdff1aSopenharmony_ci AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16); 313cabdff1aSopenharmony_ci for (k = 0; k < spectrum->bs_stop_freq; k++) 314cabdff1aSopenharmony_ci sbr->k[2] += stop_dk[k]; 315cabdff1aSopenharmony_ci } else if (spectrum->bs_stop_freq == 14) { 316cabdff1aSopenharmony_ci sbr->k[2] = 2*sbr->k[0]; 317cabdff1aSopenharmony_ci } else if (spectrum->bs_stop_freq == 15) { 318cabdff1aSopenharmony_ci sbr->k[2] = 3*sbr->k[0]; 319cabdff1aSopenharmony_ci } else { 320cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 321cabdff1aSopenharmony_ci "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq); 322cabdff1aSopenharmony_ci return -1; 323cabdff1aSopenharmony_ci } 324cabdff1aSopenharmony_ci sbr->k[2] = FFMIN(64, sbr->k[2]); 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci // Requirements (14496-3 sp04 p205) 327cabdff1aSopenharmony_ci if (sbr->sample_rate <= 32000) { 328cabdff1aSopenharmony_ci max_qmf_subbands = 48; 329cabdff1aSopenharmony_ci } else if (sbr->sample_rate == 44100) { 330cabdff1aSopenharmony_ci max_qmf_subbands = 35; 331cabdff1aSopenharmony_ci } else if (sbr->sample_rate >= 48000) 332cabdff1aSopenharmony_ci max_qmf_subbands = 32; 333cabdff1aSopenharmony_ci else 334cabdff1aSopenharmony_ci av_assert0(0); 335cabdff1aSopenharmony_ci 336cabdff1aSopenharmony_ci if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) { 337cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 338cabdff1aSopenharmony_ci "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]); 339cabdff1aSopenharmony_ci return -1; 340cabdff1aSopenharmony_ci } 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci if (!spectrum->bs_freq_scale) { 343cabdff1aSopenharmony_ci int dk, k2diff; 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci dk = spectrum->bs_alter_scale + 1; 346cabdff1aSopenharmony_ci sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1; 347cabdff1aSopenharmony_ci if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) 348cabdff1aSopenharmony_ci return -1; 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_ci for (k = 1; k <= sbr->n_master; k++) 351cabdff1aSopenharmony_ci sbr->f_master[k] = dk; 352cabdff1aSopenharmony_ci 353cabdff1aSopenharmony_ci k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk; 354cabdff1aSopenharmony_ci if (k2diff < 0) { 355cabdff1aSopenharmony_ci sbr->f_master[1]--; 356cabdff1aSopenharmony_ci sbr->f_master[2]-= (k2diff < -1); 357cabdff1aSopenharmony_ci } else if (k2diff) { 358cabdff1aSopenharmony_ci sbr->f_master[sbr->n_master]++; 359cabdff1aSopenharmony_ci } 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_ci sbr->f_master[0] = sbr->k[0]; 362cabdff1aSopenharmony_ci for (k = 1; k <= sbr->n_master; k++) 363cabdff1aSopenharmony_ci sbr->f_master[k] += sbr->f_master[k - 1]; 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_ci } else { 366cabdff1aSopenharmony_ci int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = {1,2,3} 367cabdff1aSopenharmony_ci int two_regions, num_bands_0; 368cabdff1aSopenharmony_ci int vdk0_max, vdk1_min; 369cabdff1aSopenharmony_ci int16_t vk0[49]; 370cabdff1aSopenharmony_ci#if USE_FIXED 371cabdff1aSopenharmony_ci int tmp, nz = 0; 372cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci if (49 * sbr->k[2] > 110 * sbr->k[0]) { 375cabdff1aSopenharmony_ci two_regions = 1; 376cabdff1aSopenharmony_ci sbr->k[1] = 2 * sbr->k[0]; 377cabdff1aSopenharmony_ci } else { 378cabdff1aSopenharmony_ci two_regions = 0; 379cabdff1aSopenharmony_ci sbr->k[1] = sbr->k[2]; 380cabdff1aSopenharmony_ci } 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci#if USE_FIXED 383cabdff1aSopenharmony_ci tmp = (sbr->k[1] << 23) / sbr->k[0]; 384cabdff1aSopenharmony_ci while (tmp < 0x40000000) { 385cabdff1aSopenharmony_ci tmp <<= 1; 386cabdff1aSopenharmony_ci nz++; 387cabdff1aSopenharmony_ci } 388cabdff1aSopenharmony_ci tmp = fixed_log(tmp - 0x80000000); 389cabdff1aSopenharmony_ci tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); 390cabdff1aSopenharmony_ci tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; 391cabdff1aSopenharmony_ci num_bands_0 = ((tmp + 0x400000) >> 23) * 2; 392cabdff1aSopenharmony_ci#else 393cabdff1aSopenharmony_ci num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2; 394cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 395cabdff1aSopenharmony_ci 396cabdff1aSopenharmony_ci if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205) 397cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0); 398cabdff1aSopenharmony_ci return -1; 399cabdff1aSopenharmony_ci } 400cabdff1aSopenharmony_ci 401cabdff1aSopenharmony_ci vk0[0] = 0; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0); 404cabdff1aSopenharmony_ci 405cabdff1aSopenharmony_ci AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16); 406cabdff1aSopenharmony_ci vdk0_max = vk0[num_bands_0]; 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_ci vk0[0] = sbr->k[0]; 409cabdff1aSopenharmony_ci for (k = 1; k <= num_bands_0; k++) { 410cabdff1aSopenharmony_ci if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205) 411cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]); 412cabdff1aSopenharmony_ci return -1; 413cabdff1aSopenharmony_ci } 414cabdff1aSopenharmony_ci vk0[k] += vk0[k-1]; 415cabdff1aSopenharmony_ci } 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci if (two_regions) { 418cabdff1aSopenharmony_ci int16_t vk1[49]; 419cabdff1aSopenharmony_ci#if USE_FIXED 420cabdff1aSopenharmony_ci int num_bands_1; 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci tmp = (sbr->k[2] << 23) / sbr->k[1]; 423cabdff1aSopenharmony_ci nz = 0; 424cabdff1aSopenharmony_ci while (tmp < 0x40000000) { 425cabdff1aSopenharmony_ci tmp <<= 1; 426cabdff1aSopenharmony_ci nz++; 427cabdff1aSopenharmony_ci } 428cabdff1aSopenharmony_ci tmp = fixed_log(tmp - 0x80000000); 429cabdff1aSopenharmony_ci tmp = (int)(((int64_t)tmp * CONST_RECIP_LN2 + 0x20000000) >> 30); 430cabdff1aSopenharmony_ci tmp = (((tmp + 0x80) >> 8) + ((8 - nz) << 23)) * half_bands; 431cabdff1aSopenharmony_ci if (spectrum->bs_alter_scale) 432cabdff1aSopenharmony_ci tmp = (int)(((int64_t)tmp * CONST_076923 + 0x40000000) >> 31); 433cabdff1aSopenharmony_ci num_bands_1 = ((tmp + 0x400000) >> 23) * 2; 434cabdff1aSopenharmony_ci#else 435cabdff1aSopenharmony_ci float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f 436cabdff1aSopenharmony_ci : 1.0f; // bs_alter_scale = {0,1} 437cabdff1aSopenharmony_ci int num_bands_1 = lrintf(half_bands * invwarp * 438cabdff1aSopenharmony_ci log2f(sbr->k[2] / (float)sbr->k[1])) * 2; 439cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 440cabdff1aSopenharmony_ci make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1); 441cabdff1aSopenharmony_ci 442cabdff1aSopenharmony_ci vdk1_min = array_min_int16(vk1 + 1, num_bands_1); 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci if (vdk1_min < vdk0_max) { 445cabdff1aSopenharmony_ci int change; 446cabdff1aSopenharmony_ci AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); 447cabdff1aSopenharmony_ci change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1); 448cabdff1aSopenharmony_ci vk1[1] += change; 449cabdff1aSopenharmony_ci vk1[num_bands_1] -= change; 450cabdff1aSopenharmony_ci } 451cabdff1aSopenharmony_ci 452cabdff1aSopenharmony_ci AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16); 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci vk1[0] = sbr->k[1]; 455cabdff1aSopenharmony_ci for (k = 1; k <= num_bands_1; k++) { 456cabdff1aSopenharmony_ci if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205) 457cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]); 458cabdff1aSopenharmony_ci return -1; 459cabdff1aSopenharmony_ci } 460cabdff1aSopenharmony_ci vk1[k] += vk1[k-1]; 461cabdff1aSopenharmony_ci } 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci sbr->n_master = num_bands_0 + num_bands_1; 464cabdff1aSopenharmony_ci if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) 465cabdff1aSopenharmony_ci return -1; 466cabdff1aSopenharmony_ci memcpy(&sbr->f_master[0], vk0, 467cabdff1aSopenharmony_ci (num_bands_0 + 1) * sizeof(sbr->f_master[0])); 468cabdff1aSopenharmony_ci memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1, 469cabdff1aSopenharmony_ci num_bands_1 * sizeof(sbr->f_master[0])); 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci } else { 472cabdff1aSopenharmony_ci sbr->n_master = num_bands_0; 473cabdff1aSopenharmony_ci if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xover_band)) 474cabdff1aSopenharmony_ci return -1; 475cabdff1aSopenharmony_ci memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0])); 476cabdff1aSopenharmony_ci } 477cabdff1aSopenharmony_ci } 478cabdff1aSopenharmony_ci 479cabdff1aSopenharmony_ci return 0; 480cabdff1aSopenharmony_ci} 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ci/// High Frequency Generation - Patch Construction (14496-3 sp04 p216 fig. 4.46) 483cabdff1aSopenharmony_cistatic int sbr_hf_calc_npatches(AACContext *ac, SpectralBandReplication *sbr) 484cabdff1aSopenharmony_ci{ 485cabdff1aSopenharmony_ci int i, k, last_k = -1, last_msb = -1, sb = 0; 486cabdff1aSopenharmony_ci int msb = sbr->k[0]; 487cabdff1aSopenharmony_ci int usb = sbr->kx[1]; 488cabdff1aSopenharmony_ci int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate; 489cabdff1aSopenharmony_ci 490cabdff1aSopenharmony_ci sbr->num_patches = 0; 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci if (goal_sb < sbr->kx[1] + sbr->m[1]) { 493cabdff1aSopenharmony_ci for (k = 0; sbr->f_master[k] < goal_sb; k++) ; 494cabdff1aSopenharmony_ci } else 495cabdff1aSopenharmony_ci k = sbr->n_master; 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci do { 498cabdff1aSopenharmony_ci int odd = 0; 499cabdff1aSopenharmony_ci if (k == last_k && msb == last_msb) { 500cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "patch construction failed\n"); 501cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 502cabdff1aSopenharmony_ci } 503cabdff1aSopenharmony_ci last_k = k; 504cabdff1aSopenharmony_ci last_msb = msb; 505cabdff1aSopenharmony_ci for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) { 506cabdff1aSopenharmony_ci sb = sbr->f_master[i]; 507cabdff1aSopenharmony_ci odd = (sb + sbr->k[0]) & 1; 508cabdff1aSopenharmony_ci } 509cabdff1aSopenharmony_ci 510cabdff1aSopenharmony_ci // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5. 511cabdff1aSopenharmony_ci // After this check the final number of patches can still be six which is 512cabdff1aSopenharmony_ci // illegal however the Coding Technologies decoder check stream has a final 513cabdff1aSopenharmony_ci // count of 6 patches 514cabdff1aSopenharmony_ci if (sbr->num_patches > 5) { 515cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches); 516cabdff1aSopenharmony_ci return -1; 517cabdff1aSopenharmony_ci } 518cabdff1aSopenharmony_ci 519cabdff1aSopenharmony_ci sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0); 520cabdff1aSopenharmony_ci sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches]; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci if (sbr->patch_num_subbands[sbr->num_patches] > 0) { 523cabdff1aSopenharmony_ci usb = sb; 524cabdff1aSopenharmony_ci msb = sb; 525cabdff1aSopenharmony_ci sbr->num_patches++; 526cabdff1aSopenharmony_ci } else 527cabdff1aSopenharmony_ci msb = sbr->kx[1]; 528cabdff1aSopenharmony_ci 529cabdff1aSopenharmony_ci if (sbr->f_master[k] - sb < 3) 530cabdff1aSopenharmony_ci k = sbr->n_master; 531cabdff1aSopenharmony_ci } while (sb != sbr->kx[1] + sbr->m[1]); 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_ci if (sbr->num_patches > 1 && 534cabdff1aSopenharmony_ci sbr->patch_num_subbands[sbr->num_patches - 1] < 3) 535cabdff1aSopenharmony_ci sbr->num_patches--; 536cabdff1aSopenharmony_ci 537cabdff1aSopenharmony_ci return 0; 538cabdff1aSopenharmony_ci} 539cabdff1aSopenharmony_ci 540cabdff1aSopenharmony_ci/// Derived Frequency Band Tables (14496-3 sp04 p197) 541cabdff1aSopenharmony_cistatic int sbr_make_f_derived(AACContext *ac, SpectralBandReplication *sbr) 542cabdff1aSopenharmony_ci{ 543cabdff1aSopenharmony_ci int k, temp; 544cabdff1aSopenharmony_ci#if USE_FIXED 545cabdff1aSopenharmony_ci int nz = 0; 546cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 547cabdff1aSopenharmony_ci 548cabdff1aSopenharmony_ci sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band; 549cabdff1aSopenharmony_ci sbr->n[0] = (sbr->n[1] + 1) >> 1; 550cabdff1aSopenharmony_ci 551cabdff1aSopenharmony_ci memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band], 552cabdff1aSopenharmony_ci (sbr->n[1] + 1) * sizeof(sbr->f_master[0])); 553cabdff1aSopenharmony_ci sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0]; 554cabdff1aSopenharmony_ci sbr->kx[1] = sbr->f_tablehigh[0]; 555cabdff1aSopenharmony_ci 556cabdff1aSopenharmony_ci // Requirements (14496-3 sp04 p205) 557cabdff1aSopenharmony_ci if (sbr->kx[1] + sbr->m[1] > 64) { 558cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 559cabdff1aSopenharmony_ci "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]); 560cabdff1aSopenharmony_ci return -1; 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci if (sbr->kx[1] > 32) { 563cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]); 564cabdff1aSopenharmony_ci return -1; 565cabdff1aSopenharmony_ci } 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci sbr->f_tablelow[0] = sbr->f_tablehigh[0]; 568cabdff1aSopenharmony_ci temp = sbr->n[1] & 1; 569cabdff1aSopenharmony_ci for (k = 1; k <= sbr->n[0]; k++) 570cabdff1aSopenharmony_ci sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp]; 571cabdff1aSopenharmony_ci#if USE_FIXED 572cabdff1aSopenharmony_ci temp = (sbr->k[2] << 23) / sbr->kx[1]; 573cabdff1aSopenharmony_ci while (temp < 0x40000000) { 574cabdff1aSopenharmony_ci temp <<= 1; 575cabdff1aSopenharmony_ci nz++; 576cabdff1aSopenharmony_ci } 577cabdff1aSopenharmony_ci temp = fixed_log(temp - 0x80000000); 578cabdff1aSopenharmony_ci temp = (int)(((int64_t)temp * CONST_RECIP_LN2 + 0x20000000) >> 30); 579cabdff1aSopenharmony_ci temp = (((temp + 0x80) >> 8) + ((8 - nz) << 23)) * sbr->spectrum_params.bs_noise_bands; 580cabdff1aSopenharmony_ci 581cabdff1aSopenharmony_ci sbr->n_q = (temp + 0x400000) >> 23; 582cabdff1aSopenharmony_ci if (sbr->n_q < 1) 583cabdff1aSopenharmony_ci sbr->n_q = 1; 584cabdff1aSopenharmony_ci#else 585cabdff1aSopenharmony_ci sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands * 586cabdff1aSopenharmony_ci log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3 587cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_ci if (sbr->n_q > 5) { 590cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q); 591cabdff1aSopenharmony_ci return -1; 592cabdff1aSopenharmony_ci } 593cabdff1aSopenharmony_ci 594cabdff1aSopenharmony_ci sbr->f_tablenoise[0] = sbr->f_tablelow[0]; 595cabdff1aSopenharmony_ci temp = 0; 596cabdff1aSopenharmony_ci for (k = 1; k <= sbr->n_q; k++) { 597cabdff1aSopenharmony_ci temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k); 598cabdff1aSopenharmony_ci sbr->f_tablenoise[k] = sbr->f_tablelow[temp]; 599cabdff1aSopenharmony_ci } 600cabdff1aSopenharmony_ci 601cabdff1aSopenharmony_ci if (sbr_hf_calc_npatches(ac, sbr) < 0) 602cabdff1aSopenharmony_ci return -1; 603cabdff1aSopenharmony_ci 604cabdff1aSopenharmony_ci sbr_make_f_tablelim(sbr); 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_ci sbr->data[0].f_indexnoise = 0; 607cabdff1aSopenharmony_ci sbr->data[1].f_indexnoise = 0; 608cabdff1aSopenharmony_ci 609cabdff1aSopenharmony_ci return 0; 610cabdff1aSopenharmony_ci} 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_cistatic av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec, 613cabdff1aSopenharmony_ci int elements) 614cabdff1aSopenharmony_ci{ 615cabdff1aSopenharmony_ci int i; 616cabdff1aSopenharmony_ci for (i = 0; i < elements; i++) { 617cabdff1aSopenharmony_ci vec[i] = get_bits1(gb); 618cabdff1aSopenharmony_ci } 619cabdff1aSopenharmony_ci} 620cabdff1aSopenharmony_ci 621cabdff1aSopenharmony_ci/** ceil(log2(index+1)) */ 622cabdff1aSopenharmony_cistatic const int8_t ceil_log2[] = { 623cabdff1aSopenharmony_ci 0, 1, 2, 2, 3, 3, 624cabdff1aSopenharmony_ci}; 625cabdff1aSopenharmony_ci 626cabdff1aSopenharmony_cistatic int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr, 627cabdff1aSopenharmony_ci GetBitContext *gb, SBRData *ch_data) 628cabdff1aSopenharmony_ci{ 629cabdff1aSopenharmony_ci int i; 630cabdff1aSopenharmony_ci int bs_pointer = 0; 631cabdff1aSopenharmony_ci // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots 632cabdff1aSopenharmony_ci int abs_bord_trail = 16; 633cabdff1aSopenharmony_ci int num_rel_lead, num_rel_trail; 634cabdff1aSopenharmony_ci unsigned bs_num_env_old = ch_data->bs_num_env; 635cabdff1aSopenharmony_ci int bs_frame_class, bs_num_env; 636cabdff1aSopenharmony_ci 637cabdff1aSopenharmony_ci ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env]; 638cabdff1aSopenharmony_ci ch_data->bs_amp_res = sbr->bs_amp_res_header; 639cabdff1aSopenharmony_ci ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; 640cabdff1aSopenharmony_ci 641cabdff1aSopenharmony_ci switch (bs_frame_class = get_bits(gb, 2)) { 642cabdff1aSopenharmony_ci case FIXFIX: 643cabdff1aSopenharmony_ci bs_num_env = 1 << get_bits(gb, 2); 644cabdff1aSopenharmony_ci if (bs_num_env > 4) { 645cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 646cabdff1aSopenharmony_ci "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n", 647cabdff1aSopenharmony_ci bs_num_env); 648cabdff1aSopenharmony_ci return -1; 649cabdff1aSopenharmony_ci } 650cabdff1aSopenharmony_ci ch_data->bs_num_env = bs_num_env; 651cabdff1aSopenharmony_ci num_rel_lead = ch_data->bs_num_env - 1; 652cabdff1aSopenharmony_ci if (ch_data->bs_num_env == 1) 653cabdff1aSopenharmony_ci ch_data->bs_amp_res = 0; 654cabdff1aSopenharmony_ci 655cabdff1aSopenharmony_ci 656cabdff1aSopenharmony_ci ch_data->t_env[0] = 0; 657cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / 660cabdff1aSopenharmony_ci ch_data->bs_num_env; 661cabdff1aSopenharmony_ci for (i = 0; i < num_rel_lead; i++) 662cabdff1aSopenharmony_ci ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; 663cabdff1aSopenharmony_ci 664cabdff1aSopenharmony_ci ch_data->bs_freq_res[1] = get_bits1(gb); 665cabdff1aSopenharmony_ci for (i = 1; i < ch_data->bs_num_env; i++) 666cabdff1aSopenharmony_ci ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; 667cabdff1aSopenharmony_ci break; 668cabdff1aSopenharmony_ci case FIXVAR: 669cabdff1aSopenharmony_ci abs_bord_trail += get_bits(gb, 2); 670cabdff1aSopenharmony_ci num_rel_trail = get_bits(gb, 2); 671cabdff1aSopenharmony_ci ch_data->bs_num_env = num_rel_trail + 1; 672cabdff1aSopenharmony_ci ch_data->t_env[0] = 0; 673cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 674cabdff1aSopenharmony_ci 675cabdff1aSopenharmony_ci for (i = 0; i < num_rel_trail; i++) 676cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env - 1 - i] = 677cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; 678cabdff1aSopenharmony_ci 679cabdff1aSopenharmony_ci bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); 680cabdff1aSopenharmony_ci 681cabdff1aSopenharmony_ci for (i = 0; i < ch_data->bs_num_env; i++) 682cabdff1aSopenharmony_ci ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); 683cabdff1aSopenharmony_ci break; 684cabdff1aSopenharmony_ci case VARFIX: 685cabdff1aSopenharmony_ci ch_data->t_env[0] = get_bits(gb, 2); 686cabdff1aSopenharmony_ci num_rel_lead = get_bits(gb, 2); 687cabdff1aSopenharmony_ci ch_data->bs_num_env = num_rel_lead + 1; 688cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 689cabdff1aSopenharmony_ci 690cabdff1aSopenharmony_ci for (i = 0; i < num_rel_lead; i++) 691cabdff1aSopenharmony_ci ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ci bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); 694cabdff1aSopenharmony_ci 695cabdff1aSopenharmony_ci get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); 696cabdff1aSopenharmony_ci break; 697cabdff1aSopenharmony_ci case VARVAR: 698cabdff1aSopenharmony_ci ch_data->t_env[0] = get_bits(gb, 2); 699cabdff1aSopenharmony_ci abs_bord_trail += get_bits(gb, 2); 700cabdff1aSopenharmony_ci num_rel_lead = get_bits(gb, 2); 701cabdff1aSopenharmony_ci num_rel_trail = get_bits(gb, 2); 702cabdff1aSopenharmony_ci bs_num_env = num_rel_lead + num_rel_trail + 1; 703cabdff1aSopenharmony_ci 704cabdff1aSopenharmony_ci if (bs_num_env > 5) { 705cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 706cabdff1aSopenharmony_ci "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n", 707cabdff1aSopenharmony_ci bs_num_env); 708cabdff1aSopenharmony_ci return -1; 709cabdff1aSopenharmony_ci } 710cabdff1aSopenharmony_ci ch_data->bs_num_env = bs_num_env; 711cabdff1aSopenharmony_ci 712cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; 713cabdff1aSopenharmony_ci 714cabdff1aSopenharmony_ci for (i = 0; i < num_rel_lead; i++) 715cabdff1aSopenharmony_ci ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; 716cabdff1aSopenharmony_ci for (i = 0; i < num_rel_trail; i++) 717cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env - 1 - i] = 718cabdff1aSopenharmony_ci ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; 719cabdff1aSopenharmony_ci 720cabdff1aSopenharmony_ci bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); 721cabdff1aSopenharmony_ci 722cabdff1aSopenharmony_ci get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); 723cabdff1aSopenharmony_ci break; 724cabdff1aSopenharmony_ci } 725cabdff1aSopenharmony_ci ch_data->bs_frame_class = bs_frame_class; 726cabdff1aSopenharmony_ci 727cabdff1aSopenharmony_ci av_assert0(bs_pointer >= 0); 728cabdff1aSopenharmony_ci if (bs_pointer > ch_data->bs_num_env + 1) { 729cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 730cabdff1aSopenharmony_ci "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n", 731cabdff1aSopenharmony_ci bs_pointer); 732cabdff1aSopenharmony_ci return -1; 733cabdff1aSopenharmony_ci } 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci for (i = 1; i <= ch_data->bs_num_env; i++) { 736cabdff1aSopenharmony_ci if (ch_data->t_env[i-1] >= ch_data->t_env[i]) { 737cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Not strictly monotone time borders\n"); 738cabdff1aSopenharmony_ci return -1; 739cabdff1aSopenharmony_ci } 740cabdff1aSopenharmony_ci } 741cabdff1aSopenharmony_ci 742cabdff1aSopenharmony_ci ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1; 743cabdff1aSopenharmony_ci 744cabdff1aSopenharmony_ci ch_data->t_q[0] = ch_data->t_env[0]; 745cabdff1aSopenharmony_ci ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env]; 746cabdff1aSopenharmony_ci if (ch_data->bs_num_noise > 1) { 747cabdff1aSopenharmony_ci int idx; 748cabdff1aSopenharmony_ci if (ch_data->bs_frame_class == FIXFIX) { 749cabdff1aSopenharmony_ci idx = ch_data->bs_num_env >> 1; 750cabdff1aSopenharmony_ci } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR 751cabdff1aSopenharmony_ci idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1); 752cabdff1aSopenharmony_ci } else { // VARFIX 753cabdff1aSopenharmony_ci if (!bs_pointer) 754cabdff1aSopenharmony_ci idx = 1; 755cabdff1aSopenharmony_ci else if (bs_pointer == 1) 756cabdff1aSopenharmony_ci idx = ch_data->bs_num_env - 1; 757cabdff1aSopenharmony_ci else // bs_pointer > 1 758cabdff1aSopenharmony_ci idx = bs_pointer - 1; 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci ch_data->t_q[1] = ch_data->t_env[idx]; 761cabdff1aSopenharmony_ci } 762cabdff1aSopenharmony_ci 763cabdff1aSopenharmony_ci ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev 764cabdff1aSopenharmony_ci ch_data->e_a[1] = -1; 765cabdff1aSopenharmony_ci if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0 766cabdff1aSopenharmony_ci ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer; 767cabdff1aSopenharmony_ci } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1 768cabdff1aSopenharmony_ci ch_data->e_a[1] = bs_pointer - 1; 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci return 0; 771cabdff1aSopenharmony_ci} 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_cistatic void copy_sbr_grid(SBRData *dst, const SBRData *src) { 774cabdff1aSopenharmony_ci //These variables are saved from the previous frame rather than copied 775cabdff1aSopenharmony_ci dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env]; 776cabdff1aSopenharmony_ci dst->t_env_num_env_old = dst->t_env[dst->bs_num_env]; 777cabdff1aSopenharmony_ci dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env); 778cabdff1aSopenharmony_ci 779cabdff1aSopenharmony_ci //These variables are read from the bitstream and therefore copied 780cabdff1aSopenharmony_ci memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res)); 781cabdff1aSopenharmony_ci memcpy(dst->t_env, src->t_env, sizeof(dst->t_env)); 782cabdff1aSopenharmony_ci memcpy(dst->t_q, src->t_q, sizeof(dst->t_q)); 783cabdff1aSopenharmony_ci dst->bs_num_env = src->bs_num_env; 784cabdff1aSopenharmony_ci dst->bs_amp_res = src->bs_amp_res; 785cabdff1aSopenharmony_ci dst->bs_num_noise = src->bs_num_noise; 786cabdff1aSopenharmony_ci dst->bs_frame_class = src->bs_frame_class; 787cabdff1aSopenharmony_ci dst->e_a[1] = src->e_a[1]; 788cabdff1aSopenharmony_ci} 789cabdff1aSopenharmony_ci 790cabdff1aSopenharmony_ci/// Read how the envelope and noise floor data is delta coded 791cabdff1aSopenharmony_cistatic void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb, 792cabdff1aSopenharmony_ci SBRData *ch_data) 793cabdff1aSopenharmony_ci{ 794cabdff1aSopenharmony_ci get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); 795cabdff1aSopenharmony_ci get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); 796cabdff1aSopenharmony_ci} 797cabdff1aSopenharmony_ci 798cabdff1aSopenharmony_ci/// Read inverse filtering data 799cabdff1aSopenharmony_cistatic void read_sbr_invf(SpectralBandReplication *sbr, GetBitContext *gb, 800cabdff1aSopenharmony_ci SBRData *ch_data) 801cabdff1aSopenharmony_ci{ 802cabdff1aSopenharmony_ci int i; 803cabdff1aSopenharmony_ci 804cabdff1aSopenharmony_ci memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t)); 805cabdff1aSopenharmony_ci for (i = 0; i < sbr->n_q; i++) 806cabdff1aSopenharmony_ci ch_data->bs_invf_mode[0][i] = get_bits(gb, 2); 807cabdff1aSopenharmony_ci} 808cabdff1aSopenharmony_ci 809cabdff1aSopenharmony_cistatic int read_sbr_envelope(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, 810cabdff1aSopenharmony_ci SBRData *ch_data, int ch) 811cabdff1aSopenharmony_ci{ 812cabdff1aSopenharmony_ci int bits; 813cabdff1aSopenharmony_ci int i, j, k; 814cabdff1aSopenharmony_ci const VLCElem *t_huff, *f_huff; 815cabdff1aSopenharmony_ci int t_lav, f_lav; 816cabdff1aSopenharmony_ci const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; 817cabdff1aSopenharmony_ci const int odd = sbr->n[1] & 1; 818cabdff1aSopenharmony_ci 819cabdff1aSopenharmony_ci if (sbr->bs_coupling && ch) { 820cabdff1aSopenharmony_ci if (ch_data->bs_amp_res) { 821cabdff1aSopenharmony_ci bits = 5; 822cabdff1aSopenharmony_ci t_huff = vlc_sbr[T_HUFFMAN_ENV_BAL_3_0DB].table; 823cabdff1aSopenharmony_ci t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_BAL_3_0DB]; 824cabdff1aSopenharmony_ci f_huff = vlc_sbr[F_HUFFMAN_ENV_BAL_3_0DB].table; 825cabdff1aSopenharmony_ci f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_3_0DB]; 826cabdff1aSopenharmony_ci } else { 827cabdff1aSopenharmony_ci bits = 6; 828cabdff1aSopenharmony_ci t_huff = vlc_sbr[T_HUFFMAN_ENV_BAL_1_5DB].table; 829cabdff1aSopenharmony_ci t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_BAL_1_5DB]; 830cabdff1aSopenharmony_ci f_huff = vlc_sbr[F_HUFFMAN_ENV_BAL_1_5DB].table; 831cabdff1aSopenharmony_ci f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_1_5DB]; 832cabdff1aSopenharmony_ci } 833cabdff1aSopenharmony_ci } else { 834cabdff1aSopenharmony_ci if (ch_data->bs_amp_res) { 835cabdff1aSopenharmony_ci bits = 6; 836cabdff1aSopenharmony_ci t_huff = vlc_sbr[T_HUFFMAN_ENV_3_0DB].table; 837cabdff1aSopenharmony_ci t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_3_0DB]; 838cabdff1aSopenharmony_ci f_huff = vlc_sbr[F_HUFFMAN_ENV_3_0DB].table; 839cabdff1aSopenharmony_ci f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_3_0DB]; 840cabdff1aSopenharmony_ci } else { 841cabdff1aSopenharmony_ci bits = 7; 842cabdff1aSopenharmony_ci t_huff = vlc_sbr[T_HUFFMAN_ENV_1_5DB].table; 843cabdff1aSopenharmony_ci t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_1_5DB]; 844cabdff1aSopenharmony_ci f_huff = vlc_sbr[F_HUFFMAN_ENV_1_5DB].table; 845cabdff1aSopenharmony_ci f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_1_5DB]; 846cabdff1aSopenharmony_ci } 847cabdff1aSopenharmony_ci } 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci for (i = 0; i < ch_data->bs_num_env; i++) { 850cabdff1aSopenharmony_ci if (ch_data->bs_df_env[i]) { 851cabdff1aSopenharmony_ci // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame 852cabdff1aSopenharmony_ci if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) { 853cabdff1aSopenharmony_ci for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { 854cabdff1aSopenharmony_ci ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][j] + delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav); 855cabdff1aSopenharmony_ci if (ch_data->env_facs_q[i + 1][j] > 127U) { 856cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); 857cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 858cabdff1aSopenharmony_ci } 859cabdff1aSopenharmony_ci } 860cabdff1aSopenharmony_ci } else if (ch_data->bs_freq_res[i + 1]) { 861cabdff1aSopenharmony_ci for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { 862cabdff1aSopenharmony_ci k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1] 863cabdff1aSopenharmony_ci ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav); 864cabdff1aSopenharmony_ci if (ch_data->env_facs_q[i + 1][j] > 127U) { 865cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); 866cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 867cabdff1aSopenharmony_ci } 868cabdff1aSopenharmony_ci } 869cabdff1aSopenharmony_ci } else { 870cabdff1aSopenharmony_ci for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { 871cabdff1aSopenharmony_ci k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j] 872cabdff1aSopenharmony_ci ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i][k] + delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav); 873cabdff1aSopenharmony_ci if (ch_data->env_facs_q[i + 1][j] > 127U) { 874cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); 875cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 876cabdff1aSopenharmony_ci } 877cabdff1aSopenharmony_ci } 878cabdff1aSopenharmony_ci } 879cabdff1aSopenharmony_ci } else { 880cabdff1aSopenharmony_ci ch_data->env_facs_q[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance 881cabdff1aSopenharmony_ci for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { 882cabdff1aSopenharmony_ci ch_data->env_facs_q[i + 1][j] = ch_data->env_facs_q[i + 1][j - 1] + delta * (get_vlc2(gb, f_huff, 9, 3) - f_lav); 883cabdff1aSopenharmony_ci if (ch_data->env_facs_q[i + 1][j] > 127U) { 884cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "env_facs_q %d is invalid\n", ch_data->env_facs_q[i + 1][j]); 885cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 886cabdff1aSopenharmony_ci } 887cabdff1aSopenharmony_ci } 888cabdff1aSopenharmony_ci } 889cabdff1aSopenharmony_ci } 890cabdff1aSopenharmony_ci 891cabdff1aSopenharmony_ci //assign 0th elements of env_facs_q from last elements 892cabdff1aSopenharmony_ci memcpy(ch_data->env_facs_q[0], ch_data->env_facs_q[ch_data->bs_num_env], 893cabdff1aSopenharmony_ci sizeof(ch_data->env_facs_q[0])); 894cabdff1aSopenharmony_ci 895cabdff1aSopenharmony_ci return 0; 896cabdff1aSopenharmony_ci} 897cabdff1aSopenharmony_ci 898cabdff1aSopenharmony_cistatic int read_sbr_noise(AACContext *ac, SpectralBandReplication *sbr, GetBitContext *gb, 899cabdff1aSopenharmony_ci SBRData *ch_data, int ch) 900cabdff1aSopenharmony_ci{ 901cabdff1aSopenharmony_ci int i, j; 902cabdff1aSopenharmony_ci const VLCElem *t_huff, *f_huff; 903cabdff1aSopenharmony_ci int t_lav, f_lav; 904cabdff1aSopenharmony_ci int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; 905cabdff1aSopenharmony_ci 906cabdff1aSopenharmony_ci if (sbr->bs_coupling && ch) { 907cabdff1aSopenharmony_ci t_huff = vlc_sbr[T_HUFFMAN_NOISE_BAL_3_0DB].table; 908cabdff1aSopenharmony_ci t_lav = vlc_sbr_lav[T_HUFFMAN_NOISE_BAL_3_0DB]; 909cabdff1aSopenharmony_ci f_huff = vlc_sbr[F_HUFFMAN_ENV_BAL_3_0DB].table; 910cabdff1aSopenharmony_ci f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_3_0DB]; 911cabdff1aSopenharmony_ci } else { 912cabdff1aSopenharmony_ci t_huff = vlc_sbr[T_HUFFMAN_NOISE_3_0DB].table; 913cabdff1aSopenharmony_ci t_lav = vlc_sbr_lav[T_HUFFMAN_NOISE_3_0DB]; 914cabdff1aSopenharmony_ci f_huff = vlc_sbr[F_HUFFMAN_ENV_3_0DB].table; 915cabdff1aSopenharmony_ci f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_3_0DB]; 916cabdff1aSopenharmony_ci } 917cabdff1aSopenharmony_ci 918cabdff1aSopenharmony_ci for (i = 0; i < ch_data->bs_num_noise; i++) { 919cabdff1aSopenharmony_ci if (ch_data->bs_df_noise[i]) { 920cabdff1aSopenharmony_ci for (j = 0; j < sbr->n_q; j++) { 921cabdff1aSopenharmony_ci ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i][j] + delta * (get_vlc2(gb, t_huff, 9, 2) - t_lav); 922cabdff1aSopenharmony_ci if (ch_data->noise_facs_q[i + 1][j] > 30U) { 923cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); 924cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 925cabdff1aSopenharmony_ci } 926cabdff1aSopenharmony_ci } 927cabdff1aSopenharmony_ci } else { 928cabdff1aSopenharmony_ci ch_data->noise_facs_q[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level 929cabdff1aSopenharmony_ci for (j = 1; j < sbr->n_q; j++) { 930cabdff1aSopenharmony_ci ch_data->noise_facs_q[i + 1][j] = ch_data->noise_facs_q[i + 1][j - 1] + delta * (get_vlc2(gb, f_huff, 9, 3) - f_lav); 931cabdff1aSopenharmony_ci if (ch_data->noise_facs_q[i + 1][j] > 30U) { 932cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "noise_facs_q %d is invalid\n", ch_data->noise_facs_q[i + 1][j]); 933cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 934cabdff1aSopenharmony_ci } 935cabdff1aSopenharmony_ci } 936cabdff1aSopenharmony_ci } 937cabdff1aSopenharmony_ci } 938cabdff1aSopenharmony_ci 939cabdff1aSopenharmony_ci //assign 0th elements of noise_facs_q from last elements 940cabdff1aSopenharmony_ci memcpy(ch_data->noise_facs_q[0], ch_data->noise_facs_q[ch_data->bs_num_noise], 941cabdff1aSopenharmony_ci sizeof(ch_data->noise_facs_q[0])); 942cabdff1aSopenharmony_ci return 0; 943cabdff1aSopenharmony_ci} 944cabdff1aSopenharmony_ci 945cabdff1aSopenharmony_cistatic void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, 946cabdff1aSopenharmony_ci GetBitContext *gb, 947cabdff1aSopenharmony_ci int bs_extension_id, int *num_bits_left) 948cabdff1aSopenharmony_ci{ 949cabdff1aSopenharmony_ci switch (bs_extension_id) { 950cabdff1aSopenharmony_ci case EXTENSION_ID_PS: 951cabdff1aSopenharmony_ci if (!ac->oc[1].m4ac.ps) { 952cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); 953cabdff1aSopenharmony_ci skip_bits_long(gb, *num_bits_left); // bs_fill_bits 954cabdff1aSopenharmony_ci *num_bits_left = 0; 955cabdff1aSopenharmony_ci } else { 956cabdff1aSopenharmony_ci *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left); 957cabdff1aSopenharmony_ci ac->avctx->profile = FF_PROFILE_AAC_HE_V2; 958cabdff1aSopenharmony_ci } 959cabdff1aSopenharmony_ci break; 960cabdff1aSopenharmony_ci default: 961cabdff1aSopenharmony_ci // some files contain 0-padding 962cabdff1aSopenharmony_ci if (bs_extension_id || *num_bits_left > 16 || show_bits(gb, *num_bits_left)) 963cabdff1aSopenharmony_ci avpriv_request_sample(ac->avctx, "Reserved SBR extensions"); 964cabdff1aSopenharmony_ci skip_bits_long(gb, *num_bits_left); // bs_fill_bits 965cabdff1aSopenharmony_ci *num_bits_left = 0; 966cabdff1aSopenharmony_ci break; 967cabdff1aSopenharmony_ci } 968cabdff1aSopenharmony_ci} 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_cistatic int read_sbr_single_channel_element(AACContext *ac, 971cabdff1aSopenharmony_ci SpectralBandReplication *sbr, 972cabdff1aSopenharmony_ci GetBitContext *gb) 973cabdff1aSopenharmony_ci{ 974cabdff1aSopenharmony_ci int ret; 975cabdff1aSopenharmony_ci 976cabdff1aSopenharmony_ci if (get_bits1(gb)) // bs_data_extra 977cabdff1aSopenharmony_ci skip_bits(gb, 4); // bs_reserved 978cabdff1aSopenharmony_ci 979cabdff1aSopenharmony_ci if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) 980cabdff1aSopenharmony_ci return -1; 981cabdff1aSopenharmony_ci read_sbr_dtdf(sbr, gb, &sbr->data[0]); 982cabdff1aSopenharmony_ci read_sbr_invf(sbr, gb, &sbr->data[0]); 983cabdff1aSopenharmony_ci if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) 984cabdff1aSopenharmony_ci return ret; 985cabdff1aSopenharmony_ci if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) 986cabdff1aSopenharmony_ci return ret; 987cabdff1aSopenharmony_ci 988cabdff1aSopenharmony_ci if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) 989cabdff1aSopenharmony_ci get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); 990cabdff1aSopenharmony_ci 991cabdff1aSopenharmony_ci return 0; 992cabdff1aSopenharmony_ci} 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_cistatic int read_sbr_channel_pair_element(AACContext *ac, 995cabdff1aSopenharmony_ci SpectralBandReplication *sbr, 996cabdff1aSopenharmony_ci GetBitContext *gb) 997cabdff1aSopenharmony_ci{ 998cabdff1aSopenharmony_ci int ret; 999cabdff1aSopenharmony_ci 1000cabdff1aSopenharmony_ci if (get_bits1(gb)) // bs_data_extra 1001cabdff1aSopenharmony_ci skip_bits(gb, 8); // bs_reserved 1002cabdff1aSopenharmony_ci 1003cabdff1aSopenharmony_ci if ((sbr->bs_coupling = get_bits1(gb))) { 1004cabdff1aSopenharmony_ci if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) 1005cabdff1aSopenharmony_ci return -1; 1006cabdff1aSopenharmony_ci copy_sbr_grid(&sbr->data[1], &sbr->data[0]); 1007cabdff1aSopenharmony_ci read_sbr_dtdf(sbr, gb, &sbr->data[0]); 1008cabdff1aSopenharmony_ci read_sbr_dtdf(sbr, gb, &sbr->data[1]); 1009cabdff1aSopenharmony_ci read_sbr_invf(sbr, gb, &sbr->data[0]); 1010cabdff1aSopenharmony_ci memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); 1011cabdff1aSopenharmony_ci memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); 1012cabdff1aSopenharmony_ci if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) 1013cabdff1aSopenharmony_ci return ret; 1014cabdff1aSopenharmony_ci if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) 1015cabdff1aSopenharmony_ci return ret; 1016cabdff1aSopenharmony_ci if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) 1017cabdff1aSopenharmony_ci return ret; 1018cabdff1aSopenharmony_ci if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) 1019cabdff1aSopenharmony_ci return ret; 1020cabdff1aSopenharmony_ci } else { 1021cabdff1aSopenharmony_ci if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) || 1022cabdff1aSopenharmony_ci read_sbr_grid(ac, sbr, gb, &sbr->data[1])) 1023cabdff1aSopenharmony_ci return -1; 1024cabdff1aSopenharmony_ci read_sbr_dtdf(sbr, gb, &sbr->data[0]); 1025cabdff1aSopenharmony_ci read_sbr_dtdf(sbr, gb, &sbr->data[1]); 1026cabdff1aSopenharmony_ci read_sbr_invf(sbr, gb, &sbr->data[0]); 1027cabdff1aSopenharmony_ci read_sbr_invf(sbr, gb, &sbr->data[1]); 1028cabdff1aSopenharmony_ci if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[0], 0)) < 0) 1029cabdff1aSopenharmony_ci return ret; 1030cabdff1aSopenharmony_ci if((ret = read_sbr_envelope(ac, sbr, gb, &sbr->data[1], 1)) < 0) 1031cabdff1aSopenharmony_ci return ret; 1032cabdff1aSopenharmony_ci if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[0], 0)) < 0) 1033cabdff1aSopenharmony_ci return ret; 1034cabdff1aSopenharmony_ci if((ret = read_sbr_noise(ac, sbr, gb, &sbr->data[1], 1)) < 0) 1035cabdff1aSopenharmony_ci return ret; 1036cabdff1aSopenharmony_ci } 1037cabdff1aSopenharmony_ci 1038cabdff1aSopenharmony_ci if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) 1039cabdff1aSopenharmony_ci get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); 1040cabdff1aSopenharmony_ci if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) 1041cabdff1aSopenharmony_ci get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); 1042cabdff1aSopenharmony_ci 1043cabdff1aSopenharmony_ci return 0; 1044cabdff1aSopenharmony_ci} 1045cabdff1aSopenharmony_ci 1046cabdff1aSopenharmony_cistatic unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr, 1047cabdff1aSopenharmony_ci GetBitContext *gb, int id_aac) 1048cabdff1aSopenharmony_ci{ 1049cabdff1aSopenharmony_ci unsigned int cnt = get_bits_count(gb); 1050cabdff1aSopenharmony_ci 1051cabdff1aSopenharmony_ci sbr->id_aac = id_aac; 1052cabdff1aSopenharmony_ci sbr->ready_for_dequant = 1; 1053cabdff1aSopenharmony_ci 1054cabdff1aSopenharmony_ci if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { 1055cabdff1aSopenharmony_ci if (read_sbr_single_channel_element(ac, sbr, gb)) { 1056cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1057cabdff1aSopenharmony_ci return get_bits_count(gb) - cnt; 1058cabdff1aSopenharmony_ci } 1059cabdff1aSopenharmony_ci } else if (id_aac == TYPE_CPE) { 1060cabdff1aSopenharmony_ci if (read_sbr_channel_pair_element(ac, sbr, gb)) { 1061cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1062cabdff1aSopenharmony_ci return get_bits_count(gb) - cnt; 1063cabdff1aSopenharmony_ci } 1064cabdff1aSopenharmony_ci } else { 1065cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1066cabdff1aSopenharmony_ci "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); 1067cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1068cabdff1aSopenharmony_ci return get_bits_count(gb) - cnt; 1069cabdff1aSopenharmony_ci } 1070cabdff1aSopenharmony_ci if (get_bits1(gb)) { // bs_extended_data 1071cabdff1aSopenharmony_ci int num_bits_left = get_bits(gb, 4); // bs_extension_size 1072cabdff1aSopenharmony_ci if (num_bits_left == 15) 1073cabdff1aSopenharmony_ci num_bits_left += get_bits(gb, 8); // bs_esc_count 1074cabdff1aSopenharmony_ci 1075cabdff1aSopenharmony_ci num_bits_left <<= 3; 1076cabdff1aSopenharmony_ci while (num_bits_left > 7) { 1077cabdff1aSopenharmony_ci num_bits_left -= 2; 1078cabdff1aSopenharmony_ci read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id 1079cabdff1aSopenharmony_ci } 1080cabdff1aSopenharmony_ci if (num_bits_left < 0) { 1081cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n"); 1082cabdff1aSopenharmony_ci } 1083cabdff1aSopenharmony_ci if (num_bits_left > 0) 1084cabdff1aSopenharmony_ci skip_bits(gb, num_bits_left); 1085cabdff1aSopenharmony_ci } 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_ci return get_bits_count(gb) - cnt; 1088cabdff1aSopenharmony_ci} 1089cabdff1aSopenharmony_ci 1090cabdff1aSopenharmony_cistatic void sbr_reset(AACContext *ac, SpectralBandReplication *sbr) 1091cabdff1aSopenharmony_ci{ 1092cabdff1aSopenharmony_ci int err; 1093cabdff1aSopenharmony_ci err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params); 1094cabdff1aSopenharmony_ci if (err >= 0) 1095cabdff1aSopenharmony_ci err = sbr_make_f_derived(ac, sbr); 1096cabdff1aSopenharmony_ci if (err < 0) { 1097cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1098cabdff1aSopenharmony_ci "SBR reset failed. Switching SBR to pure upsampling mode.\n"); 1099cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1100cabdff1aSopenharmony_ci } 1101cabdff1aSopenharmony_ci} 1102cabdff1aSopenharmony_ci 1103cabdff1aSopenharmony_ci/** 1104cabdff1aSopenharmony_ci * Decode Spectral Band Replication extension data; reference: table 4.55. 1105cabdff1aSopenharmony_ci * 1106cabdff1aSopenharmony_ci * @param crc flag indicating the presence of CRC checksum 1107cabdff1aSopenharmony_ci * @param cnt length of TYPE_FIL syntactic element in bytes 1108cabdff1aSopenharmony_ci * 1109cabdff1aSopenharmony_ci * @return Returns number of bytes consumed from the TYPE_FIL element. 1110cabdff1aSopenharmony_ci */ 1111cabdff1aSopenharmony_ciint AAC_RENAME(ff_decode_sbr_extension)(AACContext *ac, SpectralBandReplication *sbr, 1112cabdff1aSopenharmony_ci GetBitContext *gb_host, int crc, int cnt, int id_aac) 1113cabdff1aSopenharmony_ci{ 1114cabdff1aSopenharmony_ci unsigned int num_sbr_bits = 0, num_align_bits; 1115cabdff1aSopenharmony_ci unsigned bytes_read; 1116cabdff1aSopenharmony_ci GetBitContext gbc = *gb_host, *gb = &gbc; 1117cabdff1aSopenharmony_ci skip_bits_long(gb_host, cnt*8 - 4); 1118cabdff1aSopenharmony_ci 1119cabdff1aSopenharmony_ci sbr->reset = 0; 1120cabdff1aSopenharmony_ci 1121cabdff1aSopenharmony_ci if (!sbr->sample_rate) 1122cabdff1aSopenharmony_ci sbr->sample_rate = 2 * ac->oc[1].m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support 1123cabdff1aSopenharmony_ci if (!ac->oc[1].m4ac.ext_sample_rate) 1124cabdff1aSopenharmony_ci ac->oc[1].m4ac.ext_sample_rate = 2 * ac->oc[1].m4ac.sample_rate; 1125cabdff1aSopenharmony_ci 1126cabdff1aSopenharmony_ci if (crc) { 1127cabdff1aSopenharmony_ci skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check 1128cabdff1aSopenharmony_ci num_sbr_bits += 10; 1129cabdff1aSopenharmony_ci } 1130cabdff1aSopenharmony_ci 1131cabdff1aSopenharmony_ci //Save some state from the previous frame. 1132cabdff1aSopenharmony_ci sbr->kx[0] = sbr->kx[1]; 1133cabdff1aSopenharmony_ci sbr->m[0] = sbr->m[1]; 1134cabdff1aSopenharmony_ci sbr->kx_and_m_pushed = 1; 1135cabdff1aSopenharmony_ci 1136cabdff1aSopenharmony_ci num_sbr_bits++; 1137cabdff1aSopenharmony_ci if (get_bits1(gb)) // bs_header_flag 1138cabdff1aSopenharmony_ci num_sbr_bits += read_sbr_header(sbr, gb); 1139cabdff1aSopenharmony_ci 1140cabdff1aSopenharmony_ci if (sbr->reset) 1141cabdff1aSopenharmony_ci sbr_reset(ac, sbr); 1142cabdff1aSopenharmony_ci 1143cabdff1aSopenharmony_ci if (sbr->start) 1144cabdff1aSopenharmony_ci num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac); 1145cabdff1aSopenharmony_ci 1146cabdff1aSopenharmony_ci num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7; 1147cabdff1aSopenharmony_ci bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3); 1148cabdff1aSopenharmony_ci 1149cabdff1aSopenharmony_ci if (bytes_read > cnt) { 1150cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1151cabdff1aSopenharmony_ci "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read); 1152cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1153cabdff1aSopenharmony_ci } 1154cabdff1aSopenharmony_ci return cnt; 1155cabdff1aSopenharmony_ci} 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci/** 1158cabdff1aSopenharmony_ci * Analysis QMF Bank (14496-3 sp04 p206) 1159cabdff1aSopenharmony_ci * 1160cabdff1aSopenharmony_ci * @param x pointer to the beginning of the first sample window 1161cabdff1aSopenharmony_ci * @param W array of complex-valued samples split into subbands 1162cabdff1aSopenharmony_ci */ 1163cabdff1aSopenharmony_ci#ifndef sbr_qmf_analysis 1164cabdff1aSopenharmony_ci#if USE_FIXED 1165cabdff1aSopenharmony_cistatic void sbr_qmf_analysis(AVFixedDSPContext *dsp, FFTContext *mdct, 1166cabdff1aSopenharmony_ci#else 1167cabdff1aSopenharmony_cistatic void sbr_qmf_analysis(AVFloatDSPContext *dsp, FFTContext *mdct, 1168cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1169cabdff1aSopenharmony_ci SBRDSPContext *sbrdsp, const INTFLOAT *in, INTFLOAT *x, 1170cabdff1aSopenharmony_ci INTFLOAT z[320], INTFLOAT W[2][32][32][2], int buf_idx) 1171cabdff1aSopenharmony_ci{ 1172cabdff1aSopenharmony_ci int i; 1173cabdff1aSopenharmony_ci#if USE_FIXED 1174cabdff1aSopenharmony_ci int j; 1175cabdff1aSopenharmony_ci#endif 1176cabdff1aSopenharmony_ci memcpy(x , x+1024, (320-32)*sizeof(x[0])); 1177cabdff1aSopenharmony_ci memcpy(x+288, in, 1024*sizeof(x[0])); 1178cabdff1aSopenharmony_ci for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames 1179cabdff1aSopenharmony_ci // are not supported 1180cabdff1aSopenharmony_ci dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320); 1181cabdff1aSopenharmony_ci sbrdsp->sum64x5(z); 1182cabdff1aSopenharmony_ci sbrdsp->qmf_pre_shuffle(z); 1183cabdff1aSopenharmony_ci#if USE_FIXED 1184cabdff1aSopenharmony_ci for (j = 64; j < 128; j++) { 1185cabdff1aSopenharmony_ci if (z[j] > 1<<24) { 1186cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_WARNING, 1187cabdff1aSopenharmony_ci "sbr_qmf_analysis: value %09d too large, setting to %09d\n", 1188cabdff1aSopenharmony_ci z[j], 1<<24); 1189cabdff1aSopenharmony_ci z[j] = 1<<24; 1190cabdff1aSopenharmony_ci } else if (z[j] < -(1<<24)) { 1191cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_WARNING, 1192cabdff1aSopenharmony_ci "sbr_qmf_analysis: value %09d too small, setting to %09d\n", 1193cabdff1aSopenharmony_ci z[j], -(1<<24)); 1194cabdff1aSopenharmony_ci z[j] = -(1<<24); 1195cabdff1aSopenharmony_ci } 1196cabdff1aSopenharmony_ci } 1197cabdff1aSopenharmony_ci#endif 1198cabdff1aSopenharmony_ci mdct->imdct_half(mdct, z, z+64); 1199cabdff1aSopenharmony_ci sbrdsp->qmf_post_shuffle(W[buf_idx][i], z); 1200cabdff1aSopenharmony_ci x += 32; 1201cabdff1aSopenharmony_ci } 1202cabdff1aSopenharmony_ci} 1203cabdff1aSopenharmony_ci#endif 1204cabdff1aSopenharmony_ci 1205cabdff1aSopenharmony_ci/** 1206cabdff1aSopenharmony_ci * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank 1207cabdff1aSopenharmony_ci * (14496-3 sp04 p206) 1208cabdff1aSopenharmony_ci */ 1209cabdff1aSopenharmony_ci#ifndef sbr_qmf_synthesis 1210cabdff1aSopenharmony_cistatic void sbr_qmf_synthesis(FFTContext *mdct, 1211cabdff1aSopenharmony_ci#if USE_FIXED 1212cabdff1aSopenharmony_ci SBRDSPContext *sbrdsp, AVFixedDSPContext *dsp, 1213cabdff1aSopenharmony_ci#else 1214cabdff1aSopenharmony_ci SBRDSPContext *sbrdsp, AVFloatDSPContext *dsp, 1215cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1216cabdff1aSopenharmony_ci INTFLOAT *out, INTFLOAT X[2][38][64], 1217cabdff1aSopenharmony_ci INTFLOAT mdct_buf[2][64], 1218cabdff1aSopenharmony_ci INTFLOAT *v0, int *v_off, const unsigned int div) 1219cabdff1aSopenharmony_ci{ 1220cabdff1aSopenharmony_ci int i, n; 1221cabdff1aSopenharmony_ci const INTFLOAT *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; 1222cabdff1aSopenharmony_ci const int step = 128 >> div; 1223cabdff1aSopenharmony_ci INTFLOAT *v; 1224cabdff1aSopenharmony_ci for (i = 0; i < 32; i++) { 1225cabdff1aSopenharmony_ci if (*v_off < step) { 1226cabdff1aSopenharmony_ci int saved_samples = (1280 - 128) >> div; 1227cabdff1aSopenharmony_ci memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(INTFLOAT)); 1228cabdff1aSopenharmony_ci *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - step; 1229cabdff1aSopenharmony_ci } else { 1230cabdff1aSopenharmony_ci *v_off -= step; 1231cabdff1aSopenharmony_ci } 1232cabdff1aSopenharmony_ci v = v0 + *v_off; 1233cabdff1aSopenharmony_ci if (div) { 1234cabdff1aSopenharmony_ci for (n = 0; n < 32; n++) { 1235cabdff1aSopenharmony_ci X[0][i][ n] = -X[0][i][n]; 1236cabdff1aSopenharmony_ci X[0][i][32+n] = X[1][i][31-n]; 1237cabdff1aSopenharmony_ci } 1238cabdff1aSopenharmony_ci mdct->imdct_half(mdct, mdct_buf[0], X[0][i]); 1239cabdff1aSopenharmony_ci sbrdsp->qmf_deint_neg(v, mdct_buf[0]); 1240cabdff1aSopenharmony_ci } else { 1241cabdff1aSopenharmony_ci sbrdsp->neg_odd_64(X[1][i]); 1242cabdff1aSopenharmony_ci mdct->imdct_half(mdct, mdct_buf[0], X[0][i]); 1243cabdff1aSopenharmony_ci mdct->imdct_half(mdct, mdct_buf[1], X[1][i]); 1244cabdff1aSopenharmony_ci sbrdsp->qmf_deint_bfly(v, mdct_buf[1], mdct_buf[0]); 1245cabdff1aSopenharmony_ci } 1246cabdff1aSopenharmony_ci dsp->vector_fmul (out, v , sbr_qmf_window , 64 >> div); 1247cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out , 64 >> div); 1248cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out , 64 >> div); 1249cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out , 64 >> div); 1250cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out , 64 >> div); 1251cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out , 64 >> div); 1252cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out , 64 >> div); 1253cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out , 64 >> div); 1254cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out , 64 >> div); 1255cabdff1aSopenharmony_ci dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out , 64 >> div); 1256cabdff1aSopenharmony_ci out += 64 >> div; 1257cabdff1aSopenharmony_ci } 1258cabdff1aSopenharmony_ci} 1259cabdff1aSopenharmony_ci#endif 1260cabdff1aSopenharmony_ci 1261cabdff1aSopenharmony_ci/// Generate the subband filtered lowband 1262cabdff1aSopenharmony_cistatic int sbr_lf_gen(AACContext *ac, SpectralBandReplication *sbr, 1263cabdff1aSopenharmony_ci INTFLOAT X_low[32][40][2], const INTFLOAT W[2][32][32][2], 1264cabdff1aSopenharmony_ci int buf_idx) 1265cabdff1aSopenharmony_ci{ 1266cabdff1aSopenharmony_ci int i, k; 1267cabdff1aSopenharmony_ci const int t_HFGen = 8; 1268cabdff1aSopenharmony_ci const int i_f = 32; 1269cabdff1aSopenharmony_ci memset(X_low, 0, 32*sizeof(*X_low)); 1270cabdff1aSopenharmony_ci for (k = 0; k < sbr->kx[1]; k++) { 1271cabdff1aSopenharmony_ci for (i = t_HFGen; i < i_f + t_HFGen; i++) { 1272cabdff1aSopenharmony_ci X_low[k][i][0] = W[buf_idx][i - t_HFGen][k][0]; 1273cabdff1aSopenharmony_ci X_low[k][i][1] = W[buf_idx][i - t_HFGen][k][1]; 1274cabdff1aSopenharmony_ci } 1275cabdff1aSopenharmony_ci } 1276cabdff1aSopenharmony_ci buf_idx = 1-buf_idx; 1277cabdff1aSopenharmony_ci for (k = 0; k < sbr->kx[0]; k++) { 1278cabdff1aSopenharmony_ci for (i = 0; i < t_HFGen; i++) { 1279cabdff1aSopenharmony_ci X_low[k][i][0] = W[buf_idx][i + i_f - t_HFGen][k][0]; 1280cabdff1aSopenharmony_ci X_low[k][i][1] = W[buf_idx][i + i_f - t_HFGen][k][1]; 1281cabdff1aSopenharmony_ci } 1282cabdff1aSopenharmony_ci } 1283cabdff1aSopenharmony_ci return 0; 1284cabdff1aSopenharmony_ci} 1285cabdff1aSopenharmony_ci 1286cabdff1aSopenharmony_ci/// High Frequency Generator (14496-3 sp04 p215) 1287cabdff1aSopenharmony_cistatic int sbr_hf_gen(AACContext *ac, SpectralBandReplication *sbr, 1288cabdff1aSopenharmony_ci INTFLOAT X_high[64][40][2], const INTFLOAT X_low[32][40][2], 1289cabdff1aSopenharmony_ci const INTFLOAT (*alpha0)[2], const INTFLOAT (*alpha1)[2], 1290cabdff1aSopenharmony_ci const INTFLOAT bw_array[5], const uint8_t *t_env, 1291cabdff1aSopenharmony_ci int bs_num_env) 1292cabdff1aSopenharmony_ci{ 1293cabdff1aSopenharmony_ci int j, x; 1294cabdff1aSopenharmony_ci int g = 0; 1295cabdff1aSopenharmony_ci int k = sbr->kx[1]; 1296cabdff1aSopenharmony_ci for (j = 0; j < sbr->num_patches; j++) { 1297cabdff1aSopenharmony_ci for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) { 1298cabdff1aSopenharmony_ci const int p = sbr->patch_start_subband[j] + x; 1299cabdff1aSopenharmony_ci while (g <= sbr->n_q && k >= sbr->f_tablenoise[g]) 1300cabdff1aSopenharmony_ci g++; 1301cabdff1aSopenharmony_ci g--; 1302cabdff1aSopenharmony_ci 1303cabdff1aSopenharmony_ci if (g < 0) { 1304cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1305cabdff1aSopenharmony_ci "ERROR : no subband found for frequency %d\n", k); 1306cabdff1aSopenharmony_ci return -1; 1307cabdff1aSopenharmony_ci } 1308cabdff1aSopenharmony_ci 1309cabdff1aSopenharmony_ci sbr->dsp.hf_gen(X_high[k] + ENVELOPE_ADJUSTMENT_OFFSET, 1310cabdff1aSopenharmony_ci X_low[p] + ENVELOPE_ADJUSTMENT_OFFSET, 1311cabdff1aSopenharmony_ci alpha0[p], alpha1[p], bw_array[g], 1312cabdff1aSopenharmony_ci 2 * t_env[0], 2 * t_env[bs_num_env]); 1313cabdff1aSopenharmony_ci } 1314cabdff1aSopenharmony_ci } 1315cabdff1aSopenharmony_ci if (k < sbr->m[1] + sbr->kx[1]) 1316cabdff1aSopenharmony_ci memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high)); 1317cabdff1aSopenharmony_ci 1318cabdff1aSopenharmony_ci return 0; 1319cabdff1aSopenharmony_ci} 1320cabdff1aSopenharmony_ci 1321cabdff1aSopenharmony_ci/// Generate the subband filtered lowband 1322cabdff1aSopenharmony_cistatic int sbr_x_gen(SpectralBandReplication *sbr, INTFLOAT X[2][38][64], 1323cabdff1aSopenharmony_ci const INTFLOAT Y0[38][64][2], const INTFLOAT Y1[38][64][2], 1324cabdff1aSopenharmony_ci const INTFLOAT X_low[32][40][2], int ch) 1325cabdff1aSopenharmony_ci{ 1326cabdff1aSopenharmony_ci int k, i; 1327cabdff1aSopenharmony_ci const int i_f = 32; 1328cabdff1aSopenharmony_ci const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0); 1329cabdff1aSopenharmony_ci memset(X, 0, 2*sizeof(*X)); 1330cabdff1aSopenharmony_ci for (k = 0; k < sbr->kx[0]; k++) { 1331cabdff1aSopenharmony_ci for (i = 0; i < i_Temp; i++) { 1332cabdff1aSopenharmony_ci X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; 1333cabdff1aSopenharmony_ci X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; 1334cabdff1aSopenharmony_ci } 1335cabdff1aSopenharmony_ci } 1336cabdff1aSopenharmony_ci for (; k < sbr->kx[0] + sbr->m[0]; k++) { 1337cabdff1aSopenharmony_ci for (i = 0; i < i_Temp; i++) { 1338cabdff1aSopenharmony_ci X[0][i][k] = Y0[i + i_f][k][0]; 1339cabdff1aSopenharmony_ci X[1][i][k] = Y0[i + i_f][k][1]; 1340cabdff1aSopenharmony_ci } 1341cabdff1aSopenharmony_ci } 1342cabdff1aSopenharmony_ci 1343cabdff1aSopenharmony_ci for (k = 0; k < sbr->kx[1]; k++) { 1344cabdff1aSopenharmony_ci for (i = i_Temp; i < 38; i++) { 1345cabdff1aSopenharmony_ci X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; 1346cabdff1aSopenharmony_ci X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; 1347cabdff1aSopenharmony_ci } 1348cabdff1aSopenharmony_ci } 1349cabdff1aSopenharmony_ci for (; k < sbr->kx[1] + sbr->m[1]; k++) { 1350cabdff1aSopenharmony_ci for (i = i_Temp; i < i_f; i++) { 1351cabdff1aSopenharmony_ci X[0][i][k] = Y1[i][k][0]; 1352cabdff1aSopenharmony_ci X[1][i][k] = Y1[i][k][1]; 1353cabdff1aSopenharmony_ci } 1354cabdff1aSopenharmony_ci } 1355cabdff1aSopenharmony_ci return 0; 1356cabdff1aSopenharmony_ci} 1357cabdff1aSopenharmony_ci 1358cabdff1aSopenharmony_ci/** High Frequency Adjustment (14496-3 sp04 p217) and Mapping 1359cabdff1aSopenharmony_ci * (14496-3 sp04 p217) 1360cabdff1aSopenharmony_ci */ 1361cabdff1aSopenharmony_cistatic int sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, 1362cabdff1aSopenharmony_ci SBRData *ch_data, int e_a[2]) 1363cabdff1aSopenharmony_ci{ 1364cabdff1aSopenharmony_ci int e, i, m; 1365cabdff1aSopenharmony_ci 1366cabdff1aSopenharmony_ci memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1])); 1367cabdff1aSopenharmony_ci for (e = 0; e < ch_data->bs_num_env; e++) { 1368cabdff1aSopenharmony_ci const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]]; 1369cabdff1aSopenharmony_ci uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; 1370cabdff1aSopenharmony_ci int k; 1371cabdff1aSopenharmony_ci 1372cabdff1aSopenharmony_ci if (sbr->kx[1] != table[0]) { 1373cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, "kx != f_table{high,low}[0]. " 1374cabdff1aSopenharmony_ci "Derived frequency tables were not regenerated.\n"); 1375cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1376cabdff1aSopenharmony_ci return AVERROR_BUG; 1377cabdff1aSopenharmony_ci } 1378cabdff1aSopenharmony_ci for (i = 0; i < ilim; i++) 1379cabdff1aSopenharmony_ci for (m = table[i]; m < table[i + 1]; m++) 1380cabdff1aSopenharmony_ci sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; 1381cabdff1aSopenharmony_ci 1382cabdff1aSopenharmony_ci // ch_data->bs_num_noise > 1 => 2 noise floors 1383cabdff1aSopenharmony_ci k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]); 1384cabdff1aSopenharmony_ci for (i = 0; i < sbr->n_q; i++) 1385cabdff1aSopenharmony_ci for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++) 1386cabdff1aSopenharmony_ci sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i]; 1387cabdff1aSopenharmony_ci 1388cabdff1aSopenharmony_ci for (i = 0; i < sbr->n[1]; i++) { 1389cabdff1aSopenharmony_ci if (ch_data->bs_add_harmonic_flag) { 1390cabdff1aSopenharmony_ci const unsigned int m_midpoint = 1391cabdff1aSopenharmony_ci (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1; 1392cabdff1aSopenharmony_ci 1393cabdff1aSopenharmony_ci ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] * 1394cabdff1aSopenharmony_ci (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1)); 1395cabdff1aSopenharmony_ci } 1396cabdff1aSopenharmony_ci } 1397cabdff1aSopenharmony_ci 1398cabdff1aSopenharmony_ci for (i = 0; i < ilim; i++) { 1399cabdff1aSopenharmony_ci int additional_sinusoid_present = 0; 1400cabdff1aSopenharmony_ci for (m = table[i]; m < table[i + 1]; m++) { 1401cabdff1aSopenharmony_ci if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) { 1402cabdff1aSopenharmony_ci additional_sinusoid_present = 1; 1403cabdff1aSopenharmony_ci break; 1404cabdff1aSopenharmony_ci } 1405cabdff1aSopenharmony_ci } 1406cabdff1aSopenharmony_ci memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present, 1407cabdff1aSopenharmony_ci (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0])); 1408cabdff1aSopenharmony_ci } 1409cabdff1aSopenharmony_ci } 1410cabdff1aSopenharmony_ci 1411cabdff1aSopenharmony_ci memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0])); 1412cabdff1aSopenharmony_ci return 0; 1413cabdff1aSopenharmony_ci} 1414cabdff1aSopenharmony_ci 1415cabdff1aSopenharmony_ci/// Estimation of current envelope (14496-3 sp04 p218) 1416cabdff1aSopenharmony_cistatic void sbr_env_estimate(AAC_FLOAT (*e_curr)[48], INTFLOAT X_high[64][40][2], 1417cabdff1aSopenharmony_ci SpectralBandReplication *sbr, SBRData *ch_data) 1418cabdff1aSopenharmony_ci{ 1419cabdff1aSopenharmony_ci int e, m; 1420cabdff1aSopenharmony_ci int kx1 = sbr->kx[1]; 1421cabdff1aSopenharmony_ci 1422cabdff1aSopenharmony_ci if (sbr->bs_interpol_freq) { 1423cabdff1aSopenharmony_ci for (e = 0; e < ch_data->bs_num_env; e++) { 1424cabdff1aSopenharmony_ci#if USE_FIXED 1425cabdff1aSopenharmony_ci const SoftFloat recip_env_size = av_int2sf(0x20000000 / (ch_data->t_env[e + 1] - ch_data->t_env[e]), 30); 1426cabdff1aSopenharmony_ci#else 1427cabdff1aSopenharmony_ci const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]); 1428cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1429cabdff1aSopenharmony_ci int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; 1430cabdff1aSopenharmony_ci int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; 1431cabdff1aSopenharmony_ci 1432cabdff1aSopenharmony_ci for (m = 0; m < sbr->m[1]; m++) { 1433cabdff1aSopenharmony_ci AAC_FLOAT sum = sbr->dsp.sum_square(X_high[m+kx1] + ilb, iub - ilb); 1434cabdff1aSopenharmony_ci#if USE_FIXED 1435cabdff1aSopenharmony_ci e_curr[e][m] = av_mul_sf(sum, recip_env_size); 1436cabdff1aSopenharmony_ci#else 1437cabdff1aSopenharmony_ci e_curr[e][m] = sum * recip_env_size; 1438cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1439cabdff1aSopenharmony_ci } 1440cabdff1aSopenharmony_ci } 1441cabdff1aSopenharmony_ci } else { 1442cabdff1aSopenharmony_ci int k, p; 1443cabdff1aSopenharmony_ci 1444cabdff1aSopenharmony_ci for (e = 0; e < ch_data->bs_num_env; e++) { 1445cabdff1aSopenharmony_ci const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]); 1446cabdff1aSopenharmony_ci int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; 1447cabdff1aSopenharmony_ci int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; 1448cabdff1aSopenharmony_ci const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; 1449cabdff1aSopenharmony_ci 1450cabdff1aSopenharmony_ci for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) { 1451cabdff1aSopenharmony_ci#if USE_FIXED 1452cabdff1aSopenharmony_ci SoftFloat sum = FLOAT_0; 1453cabdff1aSopenharmony_ci const SoftFloat den = av_int2sf(0x20000000 / (env_size * (table[p + 1] - table[p])), 29); 1454cabdff1aSopenharmony_ci for (k = table[p]; k < table[p + 1]; k++) { 1455cabdff1aSopenharmony_ci sum = av_add_sf(sum, sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb)); 1456cabdff1aSopenharmony_ci } 1457cabdff1aSopenharmony_ci sum = av_mul_sf(sum, den); 1458cabdff1aSopenharmony_ci#else 1459cabdff1aSopenharmony_ci float sum = 0.0f; 1460cabdff1aSopenharmony_ci const int den = env_size * (table[p + 1] - table[p]); 1461cabdff1aSopenharmony_ci 1462cabdff1aSopenharmony_ci for (k = table[p]; k < table[p + 1]; k++) { 1463cabdff1aSopenharmony_ci sum += sbr->dsp.sum_square(X_high[k] + ilb, iub - ilb); 1464cabdff1aSopenharmony_ci } 1465cabdff1aSopenharmony_ci sum /= den; 1466cabdff1aSopenharmony_ci#endif /* USE_FIXED */ 1467cabdff1aSopenharmony_ci for (k = table[p]; k < table[p + 1]; k++) { 1468cabdff1aSopenharmony_ci e_curr[e][k - kx1] = sum; 1469cabdff1aSopenharmony_ci } 1470cabdff1aSopenharmony_ci } 1471cabdff1aSopenharmony_ci } 1472cabdff1aSopenharmony_ci } 1473cabdff1aSopenharmony_ci} 1474cabdff1aSopenharmony_ci 1475cabdff1aSopenharmony_civoid AAC_RENAME(ff_sbr_apply)(AACContext *ac, SpectralBandReplication *sbr, int id_aac, 1476cabdff1aSopenharmony_ci INTFLOAT* L, INTFLOAT* R) 1477cabdff1aSopenharmony_ci{ 1478cabdff1aSopenharmony_ci int downsampled = ac->oc[1].m4ac.ext_sample_rate < sbr->sample_rate; 1479cabdff1aSopenharmony_ci int ch; 1480cabdff1aSopenharmony_ci int nch = (id_aac == TYPE_CPE) ? 2 : 1; 1481cabdff1aSopenharmony_ci int err; 1482cabdff1aSopenharmony_ci 1483cabdff1aSopenharmony_ci if (id_aac != sbr->id_aac) { 1484cabdff1aSopenharmony_ci av_log(ac->avctx, id_aac == TYPE_LFE ? AV_LOG_VERBOSE : AV_LOG_WARNING, 1485cabdff1aSopenharmony_ci "element type mismatch %d != %d\n", id_aac, sbr->id_aac); 1486cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1487cabdff1aSopenharmony_ci } 1488cabdff1aSopenharmony_ci 1489cabdff1aSopenharmony_ci if (sbr->start && !sbr->ready_for_dequant) { 1490cabdff1aSopenharmony_ci av_log(ac->avctx, AV_LOG_ERROR, 1491cabdff1aSopenharmony_ci "No quantized data read for sbr_dequant.\n"); 1492cabdff1aSopenharmony_ci sbr_turnoff(sbr); 1493cabdff1aSopenharmony_ci } 1494cabdff1aSopenharmony_ci 1495cabdff1aSopenharmony_ci if (!sbr->kx_and_m_pushed) { 1496cabdff1aSopenharmony_ci sbr->kx[0] = sbr->kx[1]; 1497cabdff1aSopenharmony_ci sbr->m[0] = sbr->m[1]; 1498cabdff1aSopenharmony_ci } else { 1499cabdff1aSopenharmony_ci sbr->kx_and_m_pushed = 0; 1500cabdff1aSopenharmony_ci } 1501cabdff1aSopenharmony_ci 1502cabdff1aSopenharmony_ci if (sbr->start) { 1503cabdff1aSopenharmony_ci sbr_dequant(sbr, id_aac); 1504cabdff1aSopenharmony_ci sbr->ready_for_dequant = 0; 1505cabdff1aSopenharmony_ci } 1506cabdff1aSopenharmony_ci for (ch = 0; ch < nch; ch++) { 1507cabdff1aSopenharmony_ci /* decode channel */ 1508cabdff1aSopenharmony_ci sbr_qmf_analysis(ac->fdsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples, 1509cabdff1aSopenharmony_ci (INTFLOAT*)sbr->qmf_filter_scratch, 1510cabdff1aSopenharmony_ci sbr->data[ch].W, sbr->data[ch].Ypos); 1511cabdff1aSopenharmony_ci sbr->c.sbr_lf_gen(ac, sbr, sbr->X_low, 1512cabdff1aSopenharmony_ci (const INTFLOAT (*)[32][32][2]) sbr->data[ch].W, 1513cabdff1aSopenharmony_ci sbr->data[ch].Ypos); 1514cabdff1aSopenharmony_ci sbr->data[ch].Ypos ^= 1; 1515cabdff1aSopenharmony_ci if (sbr->start) { 1516cabdff1aSopenharmony_ci sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1, 1517cabdff1aSopenharmony_ci (const INTFLOAT (*)[40][2]) sbr->X_low, sbr->k[0]); 1518cabdff1aSopenharmony_ci sbr_chirp(sbr, &sbr->data[ch]); 1519cabdff1aSopenharmony_ci av_assert0(sbr->data[ch].bs_num_env > 0); 1520cabdff1aSopenharmony_ci sbr_hf_gen(ac, sbr, sbr->X_high, 1521cabdff1aSopenharmony_ci (const INTFLOAT (*)[40][2]) sbr->X_low, 1522cabdff1aSopenharmony_ci (const INTFLOAT (*)[2]) sbr->alpha0, 1523cabdff1aSopenharmony_ci (const INTFLOAT (*)[2]) sbr->alpha1, 1524cabdff1aSopenharmony_ci sbr->data[ch].bw_array, sbr->data[ch].t_env, 1525cabdff1aSopenharmony_ci sbr->data[ch].bs_num_env); 1526cabdff1aSopenharmony_ci 1527cabdff1aSopenharmony_ci // hf_adj 1528cabdff1aSopenharmony_ci err = sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); 1529cabdff1aSopenharmony_ci if (!err) { 1530cabdff1aSopenharmony_ci sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); 1531cabdff1aSopenharmony_ci sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); 1532cabdff1aSopenharmony_ci sbr->c.sbr_hf_assemble(sbr->data[ch].Y[sbr->data[ch].Ypos], 1533cabdff1aSopenharmony_ci (const INTFLOAT (*)[40][2]) sbr->X_high, 1534cabdff1aSopenharmony_ci sbr, &sbr->data[ch], 1535cabdff1aSopenharmony_ci sbr->data[ch].e_a); 1536cabdff1aSopenharmony_ci } 1537cabdff1aSopenharmony_ci } 1538cabdff1aSopenharmony_ci 1539cabdff1aSopenharmony_ci /* synthesis */ 1540cabdff1aSopenharmony_ci sbr->c.sbr_x_gen(sbr, sbr->X[ch], 1541cabdff1aSopenharmony_ci (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[1-sbr->data[ch].Ypos], 1542cabdff1aSopenharmony_ci (const INTFLOAT (*)[64][2]) sbr->data[ch].Y[ sbr->data[ch].Ypos], 1543cabdff1aSopenharmony_ci (const INTFLOAT (*)[40][2]) sbr->X_low, ch); 1544cabdff1aSopenharmony_ci } 1545cabdff1aSopenharmony_ci 1546cabdff1aSopenharmony_ci if (ac->oc[1].m4ac.ps == 1) { 1547cabdff1aSopenharmony_ci if (sbr->ps.common.start) { 1548cabdff1aSopenharmony_ci AAC_RENAME(ff_ps_apply)(ac->avctx, &sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]); 1549cabdff1aSopenharmony_ci } else { 1550cabdff1aSopenharmony_ci memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0])); 1551cabdff1aSopenharmony_ci } 1552cabdff1aSopenharmony_ci nch = 2; 1553cabdff1aSopenharmony_ci } 1554cabdff1aSopenharmony_ci 1555cabdff1aSopenharmony_ci sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp, 1556cabdff1aSopenharmony_ci L, sbr->X[0], sbr->qmf_filter_scratch, 1557cabdff1aSopenharmony_ci sbr->data[0].synthesis_filterbank_samples, 1558cabdff1aSopenharmony_ci &sbr->data[0].synthesis_filterbank_samples_offset, 1559cabdff1aSopenharmony_ci downsampled); 1560cabdff1aSopenharmony_ci if (nch == 2) 1561cabdff1aSopenharmony_ci sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp, 1562cabdff1aSopenharmony_ci R, sbr->X[1], sbr->qmf_filter_scratch, 1563cabdff1aSopenharmony_ci sbr->data[1].synthesis_filterbank_samples, 1564cabdff1aSopenharmony_ci &sbr->data[1].synthesis_filterbank_samples_offset, 1565cabdff1aSopenharmony_ci downsampled); 1566cabdff1aSopenharmony_ci} 1567cabdff1aSopenharmony_ci 1568cabdff1aSopenharmony_cistatic void aacsbr_func_ptr_init(AACSBRContext *c) 1569cabdff1aSopenharmony_ci{ 1570cabdff1aSopenharmony_ci c->sbr_lf_gen = sbr_lf_gen; 1571cabdff1aSopenharmony_ci c->sbr_hf_assemble = sbr_hf_assemble; 1572cabdff1aSopenharmony_ci c->sbr_x_gen = sbr_x_gen; 1573cabdff1aSopenharmony_ci c->sbr_hf_inverse_filter = sbr_hf_inverse_filter; 1574cabdff1aSopenharmony_ci 1575cabdff1aSopenharmony_ci#if !USE_FIXED 1576cabdff1aSopenharmony_ci#if ARCH_MIPS 1577cabdff1aSopenharmony_ci ff_aacsbr_func_ptr_init_mips(c); 1578cabdff1aSopenharmony_ci#endif 1579cabdff1aSopenharmony_ci#endif 1580cabdff1aSopenharmony_ci} 1581