1 /****************************************************************************** 2 * * 3 * Copyright (C) 2023 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 21 #pragma once 22 #define MAX_EQ_CHANNEL_COUNT (8) 23 #define MAX_EQ_AUDIO_DELAY (1024) 24 #define MAX_EQ_FIR_FILTER_SIZE (128) 25 #define MAX_EQ_SUBBAND_COUNT (256) 26 #define MAX_EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT (32) 27 #define MAX_EQ_FILTER_SECTION_COUNT (8) 28 #define MAX_EQ_FILTER_ELEMENT_COUNT (4) 29 #define MAX_MATCHING_PHASE_FILTER_COUNT (32) 30 31 #define EQ_FILTER_DOMAIN_NONE 0 32 #define EQ_FILTER_DOMAIN_TIME (1) 33 #define EQ_FILTER_DOMAIN_SUBBAND (2) 34 35 #define CONFIG_REAL_POLE (0) 36 #define CONFIG_COMPLEX_POLE (1) 37 #define CONFIG_REAL_ZERO_RADIUS_ONE (2) 38 #define CONFIG_REAL_ZERO (3) 39 #define CONFIG_GENERIC_ZERO (4) 40 41 #define STEP_RATIO_F_LOW (20.0f) 42 43 #define FILTER_ELEMENT_FORMAT_POLE_ZERO (0) 44 #define FILTER_ELEMENT_FORMAT_FIR (1) 45 46 #ifndef M_PI 47 #define M_PI (3.14159265358979323846) 48 #endif 49 50 #define STEP_RATIO_COMPUTED (0.0739601776f) 51 52 typedef struct { 53 WORD32 delay; 54 FLOAT32 state[MAX_EQ_CHANNEL_COUNT][MAX_EQ_AUDIO_DELAY]; 55 } ia_drc_audio_delay_struct; 56 57 typedef struct { 58 FLOAT32 radius; 59 FLOAT32 coeff[2]; 60 } ia_drc_second_order_filter_params_struct; 61 62 typedef struct { 63 WORD32 coeff_count; 64 FLOAT32 coeff[MAX_EQ_FIR_FILTER_SIZE]; 65 FLOAT32 state[MAX_EQ_CHANNEL_COUNT][MAX_EQ_FIR_FILTER_SIZE]; 66 } ia_drc_fir_filter_struct; 67 68 typedef struct { 69 WORD32 eq_frame_size_subband; 70 WORD32 coeff_count; 71 FLOAT32 subband_coeff[MAX_EQ_SUBBAND_COUNT]; 72 } ia_drc_subband_filter_struct; 73 74 typedef struct { 75 WORD32 filter_format; 76 WORD32 filter_param_count_for_zeros; 77 ia_drc_second_order_filter_params_struct 78 str_second_order_filter_params_for_zeros[MAX_EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT]; 79 WORD32 filter_param_count_for_poles; 80 ia_drc_second_order_filter_params_struct 81 str_second_order_filter_params_for_poles[MAX_EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT]; 82 ia_drc_fir_filter_struct str_fir_filter; 83 } ia_drc_intermediate_filter_params_struct; 84 85 typedef struct { 86 FLOAT32 state_in_1; 87 FLOAT32 state_in_2; 88 FLOAT32 state_out_1; 89 FLOAT32 state_out_2; 90 } ia_drc_filter_section_state_struct; 91 92 typedef struct { 93 FLOAT32 var_a1; 94 FLOAT32 var_a2; 95 FLOAT32 var_b1; 96 FLOAT32 var_b2; 97 ia_drc_filter_section_state_struct str_filter_section_state[MAX_EQ_CHANNEL_COUNT]; 98 } ia_drc_filter_section_struct; 99 100 typedef struct { 101 WORD32 member_count; 102 WORD32 member_index[EQ_MAX_CHANNEL_GROUP_COUNT]; 103 } ia_drc_cascade_alignment_group_struct; 104 105 typedef struct { 106 WORD32 is_valid; 107 WORD32 matches_filter_count; 108 WORD32 matches_filter[MAX_EQ_FILTER_SECTION_COUNT]; 109 FLOAT32 gain; 110 WORD32 section_count; 111 ia_drc_filter_section_struct str_filter_section[MAX_EQ_FILTER_SECTION_COUNT]; 112 ia_drc_audio_delay_struct str_audio_delay; 113 } ia_drc_phase_alignment_filter_struct; 114 115 typedef ia_drc_phase_alignment_filter_struct ia_drc_matching_phase_filter_struct; 116 117 typedef struct { 118 WORD32 matches_cascade_index; 119 WORD32 allpass_count; 120 ia_drc_matching_phase_filter_struct str_matching_phase_filter[MAX_MATCHING_PHASE_FILTER_COUNT]; 121 } ia_drc_allpass_chain_struct; 122 123 typedef struct { 124 WORD32 section_count; 125 ia_drc_filter_section_struct str_filter_section[MAX_EQ_FILTER_SECTION_COUNT]; 126 WORD32 fir_coeffs_present; 127 ia_drc_fir_filter_struct str_fir_filter; 128 ia_drc_audio_delay_struct str_audio_delay; 129 } ia_drc_pole_zero_filter_struct; 130 131 typedef struct { 132 FLOAT32 element_gain_linear; 133 WORD32 format; 134 ia_drc_pole_zero_filter_struct str_pole_zero_filter; 135 ia_drc_fir_filter_struct str_fir_filter; 136 WORD32 phase_alignment_filter_count; 137 ia_drc_phase_alignment_filter_struct str_phase_alignment_filter[MAX_EQ_FILTER_ELEMENT_COUNT]; 138 } ia_drc_eq_filter_element_struct; 139 140 typedef struct { 141 WORD32 element_count; 142 ia_drc_eq_filter_element_struct str_eq_filter_element[MAX_EQ_FILTER_ELEMENT_COUNT]; 143 ia_drc_matching_phase_filter_struct str_matching_phase_filter_element_0; 144 } ia_drc_eq_filter_block_struct; 145 146 typedef struct { 147 FLOAT32 cascade_gain_linear; 148 WORD32 block_count; 149 ia_drc_eq_filter_block_struct str_eq_filter_block[EQ_FILTER_BLOCK_COUNT_MAX]; 150 WORD32 phase_alignment_filter_count; 151 ia_drc_phase_alignment_filter_struct 152 str_phase_alignment_filter[EQ_FILTER_BLOCK_COUNT_MAX * EQ_FILTER_BLOCK_COUNT_MAX]; 153 } ia_drc_filter_cascade_t_domain_struct; 154 155 typedef struct { 156 WORD32 domain; 157 WORD32 audio_channel_count; 158 WORD32 eq_channel_group_count; 159 WORD32 eq_channel_group_for_channel[MAX_EQ_CHANNEL_COUNT]; 160 ia_drc_filter_cascade_t_domain_struct str_filter_cascade_t_domain[EQ_MAX_CHANNEL_GROUP_COUNT]; 161 ia_drc_subband_filter_struct str_subband_filter[EQ_MAX_CHANNEL_GROUP_COUNT]; 162 } ia_drc_eq_set_struct; 163 164 IA_ERRORCODE impd_drc_derive_eq_set(ia_drc_eq_coefficients_struct *pstr_eq_coefficients, 165 ia_drc_eq_instructions_struct *pstr_eq_instructions, 166 const FLOAT32 audio_sample_rate, const WORD32 drc_frame_size, 167 const WORD32 sub_band_domain_mode, 168 ia_drc_eq_set_struct *pstr_eq_set, VOID *ptr_scratch, 169 WORD32 *scratch_used); 170 171 IA_ERRORCODE impd_drc_get_eq_complexity(ia_drc_eq_set_struct *pstr_eq_set, 172 WORD32 *eq_complexity_level); 173