1/******************************************************************************
2 *
3 * Copyright (C) 2018 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#ifndef IMPD_DRC_FILTER_BANK_H
21#define IMPD_DRC_FILTER_BANK_H
22
23#define FILTER_BANK_PARAMETER_COUNT 16
24#define CASCADE_ALLPASS_COUNT_MAX 9
25#define QMF_NUM_FILT_BANDS 64
26#define QMF_FILT_RESOLUTION 64
27
28typedef struct ia_drc_qmf_filt_struct {
29  FLOAT64* ana_buff;
30  FLOAT64* syn_buff;
31  FLOAT64 ana_tab_real[QMF_NUM_FILT_BANDS][2 * QMF_NUM_FILT_BANDS];
32  FLOAT64 ana_tab_imag[QMF_NUM_FILT_BANDS][2 * QMF_NUM_FILT_BANDS];
33  FLOAT64 syn_tab_real[2 * QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS];
34  FLOAT64 syn_tab_imag[2 * QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS];
35
36} ia_drc_qmf_filt_struct;
37
38typedef struct {
39  FLOAT32 f_cross_norm;
40  FLOAT32 gamma;
41  FLOAT32 delta;
42} ia_filter_bank_params_struct;
43
44typedef struct {
45  FLOAT32 s00;
46  FLOAT32 s01;
47  FLOAT32 s10;
48  FLOAT32 s11;
49} ia_lr_filter_state_struct;
50
51typedef struct {
52  FLOAT32 s0;
53  FLOAT32 s1;
54} ia_all_pass_filter_state_struct;
55
56typedef struct {
57  FLOAT32 a0;
58  FLOAT32 a1;
59  FLOAT32 a2;
60  FLOAT32 b0;
61  FLOAT32 b1;
62  FLOAT32 b2;
63  FLOAT32 x_p[MAX_CHANNEL_COUNT * 2];
64  FLOAT32 y_p[MAX_CHANNEL_COUNT * 2];
65} ia_iir_filter_struct;
66typedef struct {
67  ia_iir_filter_struct low_pass;
68  ia_iir_filter_struct high_pass;
69} ia_two_band_filt_struct;
70
71typedef struct {
72  ia_iir_filter_struct str_low_pass_stage_1;
73  ia_iir_filter_struct str_high_pass_stage_1;
74  ia_iir_filter_struct str_low_pass_stage_2;
75  ia_iir_filter_struct str_high_pass_stage_2;
76  ia_iir_filter_struct str_all_pass_stage_2;
77} ia_three_band_filt_struct;
78
79typedef struct {
80  ia_iir_filter_struct str_low_pass_stage_1;
81  ia_iir_filter_struct str_high_pass_stage_1;
82  ia_iir_filter_struct str_all_pass_stage_2_high;
83  ia_iir_filter_struct str_all_pass_stage_2_low;
84  ia_iir_filter_struct str_low_pass_stage_3_high;
85  ia_iir_filter_struct str_high_pass_stage_3_high;
86  ia_iir_filter_struct str_low_pass_stage_3_low;
87  ia_iir_filter_struct str_high_pass_stage_3_low;
88} ia_four_band_filt_struct;
89
90typedef struct {
91  ia_iir_filter_struct str_all_pass_stage;
92} ia_all_pass_filter_sturct;
93
94typedef struct {
95  ia_all_pass_filter_sturct
96      str_all_pass_cascade_filter[CASCADE_ALLPASS_COUNT_MAX];
97  WORD32 num_filter;
98} ia_all_pass_cascade_struct;
99
100typedef struct {
101  WORD32 num_bands;
102  WORD32 complexity;
103  ia_two_band_filt_struct str_two_band_bank;
104  ia_three_band_filt_struct str_three_band_bank;
105  ia_four_band_filt_struct str_four_band_bank;
106  ia_all_pass_cascade_struct str_all_pass_cascade;
107} ia_drc_filter_bank_struct;
108
109typedef struct {
110  WORD32 nfilter_banks;
111  WORD32 num_ph_align_ch_groups;
112  WORD32 complexity;
113  ia_drc_filter_bank_struct str_drc_filter_bank[8];
114} ia_filter_banks_struct;
115
116WORD32
117impd_init_all_filter_banks(
118    ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc,
119    ia_drc_instructions_struct* str_drc_instruction_str,
120    ia_filter_banks_struct* ia_filter_banks_struct);
121
122VOID impd_two_band_filter_process(ia_two_band_filt_struct* str_two_band_bank,
123                                  WORD32 c, WORD32 size, FLOAT32* audio_in,
124                                  FLOAT32* audio_out[]);
125
126VOID impd_three_band_filter_process(
127    ia_three_band_filt_struct* str_three_band_bank, WORD32 c, WORD32 size,
128    FLOAT32* audio_in, FLOAT32* audio_out[]);
129
130VOID impd_four_band_filter_process(ia_four_band_filt_struct* str_four_band_bank,
131                                   WORD32 c, WORD32 size, FLOAT32* audio_in,
132                                   FLOAT32* audio_out[]);
133
134VOID impd_all_pass_cascade_process(
135    ia_all_pass_cascade_struct* str_all_pass_cascade, WORD32 c, WORD32 size,
136    FLOAT32* audio_in);
137
138WORD32
139impd_shape_filt_block_init(
140    ia_shape_filter_block_params_struct* pstr_shape_filter_block_params,
141    shape_filter_block* shape_filter_block);
142
143WORD32
144impd_shape_filt_block_adapt(const FLOAT32 drc_gain,
145                            shape_filter_block* shape_filter_block);
146
147WORD32 impd_shape_filt_block_time_process(
148    shape_filter_block* shape_filter_block, FLOAT32* drc_gain,
149    const WORD32 channel, FLOAT32* audio_in, WORD32 start, WORD32 end);
150#endif
151