148 lines
5.7 KiB
C
148 lines
5.7 KiB
C
/******************************************************************************
|
|
* *
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
|
|
#include "ixheaac_error_standards.h"
|
|
#include "ixheaace_error_codes.h"
|
|
#include <string.h>
|
|
#include "ixheaac_type_def.h"
|
|
#include "ixheaac_constants.h"
|
|
#include "impd_drc_common_enc.h"
|
|
#include "impd_drc_uni_drc.h"
|
|
#include "impd_drc_tables.h"
|
|
#include "impd_drc_api.h"
|
|
#include "ixheaace_api.h"
|
|
#include "ixheaace_aac_constants.h"
|
|
#include "ixheaace_psy_const.h"
|
|
#include "ixheaace_tns.h"
|
|
#include "ixheaace_tns_params.h"
|
|
#include "ixheaace_rom.h"
|
|
#include "ixheaace_common_rom.h"
|
|
#include "ixheaace_bitbuffer.h"
|
|
|
|
IA_ERRORCODE
|
|
ia_enhaacplus_enc_get_tns_param(
|
|
ixheaace_temporal_noise_shaping_config_tabulated *pstr_tns_config_tab, WORD32 bit_rate,
|
|
WORD32 channels, WORD32 block_type,
|
|
const ixheaace_temporal_noise_shaping_info_tab *pstr_tns_info_tab, WORD32 size) {
|
|
UWORD32 i;
|
|
|
|
if (pstr_tns_config_tab == NULL) {
|
|
return IA_EXHEAACE_INIT_FATAL_TNS_CONFIG_INIT_FAILED;
|
|
}
|
|
|
|
pstr_tns_config_tab->thresh_on = -1;
|
|
|
|
for (i = 0; i < size / sizeof(ixheaace_temporal_noise_shaping_info_tab); i++) {
|
|
if ((bit_rate >= pstr_tns_info_tab[i].bit_rate_from) &&
|
|
bit_rate <= pstr_tns_info_tab[i].bit_rate_to) {
|
|
switch (block_type) {
|
|
case LONG_WINDOW:
|
|
switch (channels) {
|
|
case NUM_CHANS_MONO:
|
|
|
|
pstr_tns_config_tab->thresh_on = pstr_tns_info_tab[i].param_mono_long.thresh_on;
|
|
pstr_tns_config_tab->lpc_start_freq =
|
|
pstr_tns_info_tab[i].param_mono_long.lpc_start_freq;
|
|
pstr_tns_config_tab->lpc_stop_freq =
|
|
pstr_tns_info_tab[i].param_mono_long.lpc_stop_freq;
|
|
pstr_tns_config_tab->tns_time_resolution =
|
|
pstr_tns_info_tab[i].param_mono_long.tns_time_resolution;
|
|
|
|
break;
|
|
case NUM_CHANS_STEREO:
|
|
|
|
pstr_tns_config_tab->thresh_on = pstr_tns_info_tab[i].param_stereo_long.thresh_on;
|
|
pstr_tns_config_tab->lpc_start_freq =
|
|
pstr_tns_info_tab[i].param_stereo_long.lpc_start_freq;
|
|
pstr_tns_config_tab->lpc_stop_freq =
|
|
pstr_tns_info_tab[i].param_stereo_long.lpc_stop_freq;
|
|
pstr_tns_config_tab->tns_time_resolution =
|
|
pstr_tns_info_tab[i].param_stereo_long.tns_time_resolution;
|
|
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case SHORT_WINDOW:
|
|
switch (channels) {
|
|
case NUM_CHANS_MONO:
|
|
|
|
pstr_tns_config_tab->thresh_on = pstr_tns_info_tab[i].param_mono_short.thresh_on;
|
|
pstr_tns_config_tab->lpc_start_freq =
|
|
pstr_tns_info_tab[i].param_mono_short.lpc_start_freq;
|
|
pstr_tns_config_tab->lpc_stop_freq =
|
|
pstr_tns_info_tab[i].param_mono_short.lpc_stop_freq;
|
|
pstr_tns_config_tab->tns_time_resolution =
|
|
pstr_tns_info_tab[i].param_mono_short.tns_time_resolution;
|
|
break;
|
|
case NUM_CHANS_STEREO:
|
|
|
|
pstr_tns_config_tab->thresh_on = pstr_tns_info_tab[i].param_stereo_short.thresh_on;
|
|
pstr_tns_config_tab->lpc_start_freq =
|
|
pstr_tns_info_tab[i].param_stereo_short.lpc_start_freq;
|
|
pstr_tns_config_tab->lpc_stop_freq =
|
|
pstr_tns_info_tab[i].param_stereo_short.lpc_stop_freq;
|
|
pstr_tns_config_tab->tns_time_resolution =
|
|
pstr_tns_info_tab[i].param_stereo_short.tns_time_resolution;
|
|
break;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// This check is not being done now
|
|
if (pstr_tns_config_tab->thresh_on == -1) {
|
|
return IA_EXHEAACE_INIT_FATAL_INVALID_TNS_PARAM;
|
|
}
|
|
|
|
return IA_NO_ERROR;
|
|
}
|
|
|
|
VOID ia_enhaacplus_enc_get_tns_max_bands(
|
|
WORD32 sampling_rate, WORD32 block_type, WORD32 *tns_max_sfb,
|
|
const ixheaace_temporal_noise_shaping_max_table *pstr_tns_max_bands_tab, WORD32 size,
|
|
WORD32 aot, WORD32 frame_length) {
|
|
UWORD32 i;
|
|
|
|
*tns_max_sfb = -1;
|
|
|
|
for (i = 0; i < size / sizeof(ixheaace_temporal_noise_shaping_max_table); i++) {
|
|
if (sampling_rate == pstr_tns_max_bands_tab[i].sampling_rate) {
|
|
if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
|
|
if (block_type == SHORT_WINDOW) {
|
|
*tns_max_sfb = (frame_length == (FRAME_LEN_SHORT_128))
|
|
? pstr_tns_max_bands_tab[i].max_band_1024_short_lc
|
|
: pstr_tns_max_bands_tab[i].max_band_960_short_lc;
|
|
} else {
|
|
*tns_max_sfb = (frame_length == FRAME_LEN_1024)
|
|
? pstr_tns_max_bands_tab[i].max_band_1024_long_lc
|
|
: pstr_tns_max_bands_tab[i].max_band_960_long_lc;
|
|
}
|
|
} else if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
|
|
*tns_max_sfb = (frame_length == FRAME_LEN_512)
|
|
? pstr_tns_max_bands_tab[i].max_band_512_ld
|
|
: pstr_tns_max_bands_tab[i].max_band_480_ld;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|