diff options
author | Nikhil Bhavikatti <97579291+nikhil-bhavikatti@users.noreply.github.com> | 2023-07-14 13:04:15 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-14 13:04:15 +0530 |
commit | 797de4d1e90e8bcfc19fdae6923a116d761ba0d5 (patch) | |
tree | 17a76102f15961a01a4e359fc5e93b3fed342b0a /encoder/iusace_psy_mod.h | |
parent | e78e1c43c39d117f68c0a2d5c5447e56507b6e10 (diff) | |
download | libxaac-797de4d1e90e8bcfc19fdae6923a116d761ba0d5.tar.gz |
USAC along with DRC support for libxaac encoder (#37)
Diffstat (limited to 'encoder/iusace_psy_mod.h')
-rw-r--r-- | encoder/iusace_psy_mod.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/encoder/iusace_psy_mod.h b/encoder/iusace_psy_mod.h new file mode 100644 index 0000000..b051d2f --- /dev/null +++ b/encoder/iusace_psy_mod.h @@ -0,0 +1,150 @@ +/****************************************************************************** + * * + * 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 + */ + +#pragma once +#include <stdio.h> + +#define MAX_NUM_GROUPED_SFB (60) +#define MAX_BARK_VALUE (24.0f) +#define MASK_LOW_FAC (3.0f) +#define MASK_HIGH_FAC (1.5f) +#define MASK_LOW_SP_ENERGY_L (3.0f) +#define MASK_HIGH_SP_ENERGY_L (2.0f) +#define MASK_HIGH_SP_ENERGY_L_LBR (1.5f) +#define MASK_LOW_SP_ENERGY_S (2.0f) +#define MASK_HIGH_SP_ENERGY_S (1.5f) +#define C_RATIO (0.001258925f) + +#define MAXIMUM_SCALE_FACTOR_BAND_LONG 51 +#define MAXIMUM_SCALE_FACTOR_BAND_SHORT 15 + +#define MAX_GROUPED_SFB 51 +#define MAX_GROUPED_SFB_TEMP 60 +#define BLOCK_SWITCHING_OFFSET (1 * 1024 + 3 * 128 + 64 + 128) +#define MAX_CHANNEL_BITS 6144 +#define MAX_SFB_SHORT 15 + +#define TRANS_FAC 8 +#ifndef FRAME_LEN_SHORT_128 +#define FRAME_LEN_SHORT_128 (FRAME_LEN_LONG / TRANS_FAC) +#endif + +typedef struct { + WORD32 sfb_count; + WORD32 sfb_active; + WORD32 sfb_offset[MAXIMUM_SCALE_FACTOR_BAND_LONG + 1]; + FLOAT32 sfb_thr_quiet[MAXIMUM_SCALE_FACTOR_BAND_LONG]; + FLOAT32 max_allowed_inc_fac; + FLOAT32 min_remaining_thr_fac; + WORD32 low_pass_line; + FLOAT32 clip_energy; + FLOAT32 ratio; + FLOAT32 sfb_mask_low_fac[MAXIMUM_SCALE_FACTOR_BAND_LONG]; + FLOAT32 sfb_mask_high_fac[MAXIMUM_SCALE_FACTOR_BAND_LONG]; + FLOAT32 sfb_mask_low_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_LONG]; + FLOAT32 sfb_mask_high_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_LONG]; + FLOAT32 sfb_min_snr[MAXIMUM_SCALE_FACTOR_BAND_LONG]; +} ia_psy_mod_long_config_struct; + +typedef struct { + WORD32 sfb_count; + WORD32 sfb_active; + WORD32 sfb_offset[MAXIMUM_SCALE_FACTOR_BAND_SHORT + 1]; + FLOAT32 sfb_thr_quiet[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 max_allowed_inc_fac; + FLOAT32 min_remaining_thr_fac; + WORD32 low_pass_line; + FLOAT32 clip_energy; + FLOAT32 ratio; + FLOAT32 sfb_mask_low_fac[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 sfb_mask_high_fac[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 sfb_mask_low_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 sfb_mask_high_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 sfb_min_snr[MAXIMUM_SCALE_FACTOR_BAND_SHORT]; +} ia_psy_mod_short_config_struct; + +typedef struct { + WORD32 sfb_count; + WORD32 max_sfb_per_grp; + WORD32 sfb_per_group; + WORD32 window_sequence; + WORD32 window_shape; + WORD32 sfb_offsets[100]; + FLOAT32 *ptr_sfb_energy; + FLOAT32 *ptr_sfb_spread_energy; + FLOAT32 *ptr_sfb_thr; + FLOAT64 *ptr_spec_coeffs; + FLOAT32 sfb_sum_lr_energy; + FLOAT32 pe; + FLOAT32 sfb_min_snr[100]; + WORD32 ms_used[100]; +} ia_psy_mod_out_data_struct; + +typedef struct { + WORD32 window_sequence; + FLOAT32 sfb_thr_nm1[MAX_GROUPED_SFB_TEMP]; + FLOAT32 *ptr_sfb_thr_long; + FLOAT32 sfb_thr_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 *ptr_sfb_energy_long; + FLOAT32 ptr_sfb_energy_long_ms[MAX_GROUPED_SFB_TEMP]; + FLOAT32 ptr_sfb_energy_short_ms[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 sfb_energy_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; + FLOAT32 *ptr_sfb_spreaded_energy_long; + FLOAT32 sfb_spreaded_energy_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT]; +} ia_psy_mod_data_struct; + +typedef struct ia_psy_mod_struct { + ia_psy_mod_long_config_struct str_psy_long_config[MAX_TIME_CHANNELS]; + ia_psy_mod_short_config_struct str_psy_short_config[MAX_TIME_CHANNELS]; + ia_psy_mod_data_struct str_psy_data[MAX_TIME_CHANNELS]; + ia_psy_mod_out_data_struct str_psy_out_data[MAX_TIME_CHANNELS]; + FLOAT32 mdct_spec_coeff_buf[MAX_TIME_CHANNELS][1024]; +} ia_psy_mod_struct; + +typedef struct ia_sfb_params_struct { + WORD32 num_sfb[MAX_TIME_CHANNELS]; + WORD32 max_sfb[MAX_TIME_CHANNELS]; + WORD32 max_sfb_ste; + WORD32 sfb_width_table[MAX_TIME_CHANNELS][MAX_SFB_LONG]; + WORD32 grouped_sfb_offset[MAX_TIME_CHANNELS][MAX_SF_BANDS + 1]; + WORD32 sfb_offset[MAX_TIME_CHANNELS][MAX_SF_BANDS + 1]; + WORD32 num_window_groups[MAX_TIME_CHANNELS]; + WORD32 window_group_length[MAX_TIME_CHANNELS][8]; + WORD32 window_shape[MAX_TIME_CHANNELS]; + WORD32 window_sequence[MAX_TIME_CHANNELS]; + WORD32 common_win[MAX_TIME_CHANNELS]; + +} ia_sfb_params_struct; + +VOID iusace_psy_mod_init(ia_psy_mod_struct *pstr_psy_mod, WORD32 sample_rate, WORD32 bit_rate, + WORD32 band_width, WORD32 num_channels, WORD32 ch, WORD32 ele_id, + WORD32 ccfl); + +VOID iusace_psy_mod_sb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms, + FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS], + WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type, + FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch, + WORD32 ccfl); + +VOID iusace_psy_mod_lb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms, + FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS], + WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type, + FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch, + WORD32 ccfl); |