aboutsummaryrefslogtreecommitdiff
path: root/encoder/iusace_psy_mod.h
diff options
context:
space:
mode:
authorNikhil Bhavikatti <97579291+nikhil-bhavikatti@users.noreply.github.com>2023-07-14 13:04:15 +0530
committerGitHub <noreply@github.com>2023-07-14 13:04:15 +0530
commit797de4d1e90e8bcfc19fdae6923a116d761ba0d5 (patch)
tree17a76102f15961a01a4e359fc5e93b3fed342b0a /encoder/iusace_psy_mod.h
parente78e1c43c39d117f68c0a2d5c5447e56507b6e10 (diff)
downloadlibxaac-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.h150
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);