1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
27*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_downsample_iir_filter(ixheaace_iir21_resampler * pstr_down_sampler,FLOAT32 * ptr_in_samples,FLOAT32 * ptr_out_samples,WORD32 in_stride,WORD32 num_in_samples,WORD32 * num_out_samples,WORD32 out_stride,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2)28*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_downsample_iir_filter(
29*15dc779aSAndroid Build Coastguard Worker ixheaace_iir21_resampler *pstr_down_sampler, FLOAT32 *ptr_in_samples,
30*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_out_samples, WORD32 in_stride, WORD32 num_in_samples, WORD32 *num_out_samples,
31*15dc779aSAndroid Build Coastguard Worker WORD32 out_stride, FLOAT32 *ptr_ring_buf1, FLOAT32 *ptr_ring_buf2) {
32*15dc779aSAndroid Build Coastguard Worker WORD32 i;
33*15dc779aSAndroid Build Coastguard Worker ixheaace_iir_filter *pstr_iir_filter = &(pstr_down_sampler->iir_filter);
34*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_iir_ring1, *ptr_iir_ring2;
35*15dc779aSAndroid Build Coastguard Worker FLOAT32 coeff_temp_a, coeff_temp_b;
36*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_coeff_filt = (FLOAT32 *)pstr_iir_filter->ptr_coeff_iir_num;
37*15dc779aSAndroid Build Coastguard Worker FLOAT32 iir_out = 0;
38*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp1 = 0.f, temp2 = 0.f;
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker *num_out_samples = 0;
41*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring1 = ptr_ring_buf1;
42*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2 = ptr_ring_buf2;
43*15dc779aSAndroid Build Coastguard Worker
44*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_in_samples; i++) {
45*15dc779aSAndroid Build Coastguard Worker temp1 = ptr_in_samples[i * in_stride] / 2;
46*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring1[i] = temp1;
47*15dc779aSAndroid Build Coastguard Worker coeff_temp_b = *ptr_coeff_filt;
48*15dc779aSAndroid Build Coastguard Worker temp1 = coeff_temp_b * (temp1 + ptr_iir_ring1[i - 10]);
49*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 16);
50*15dc779aSAndroid Build Coastguard Worker iir_out = (ptr_iir_ring2[i - 10] * coeff_temp_a);
51*15dc779aSAndroid Build Coastguard Worker
52*15dc779aSAndroid Build Coastguard Worker coeff_temp_b = *(ptr_coeff_filt + 1);
53*15dc779aSAndroid Build Coastguard Worker temp1 = (coeff_temp_b * (ptr_iir_ring1[i - 1] + ptr_iir_ring1[i - 9])) + temp1;
54*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 7);
55*15dc779aSAndroid Build Coastguard Worker temp2 = (ptr_iir_ring2[i - 1] * coeff_temp_a) + iir_out;
56*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 15);
57*15dc779aSAndroid Build Coastguard Worker iir_out = (ptr_iir_ring2[i - 9] * coeff_temp_a) + temp2;
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker coeff_temp_b = *(ptr_coeff_filt + 2);
60*15dc779aSAndroid Build Coastguard Worker temp1 = (coeff_temp_b * (ptr_iir_ring1[i - 2] + ptr_iir_ring1[i - 8])) + temp1;
61*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 8);
62*15dc779aSAndroid Build Coastguard Worker temp2 = (ptr_iir_ring2[i - 2] * coeff_temp_a) + iir_out;
63*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 14);
64*15dc779aSAndroid Build Coastguard Worker iir_out = (ptr_iir_ring2[i - 8] * coeff_temp_a) + temp2;
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker coeff_temp_b = *(ptr_coeff_filt + 3);
67*15dc779aSAndroid Build Coastguard Worker temp1 = (coeff_temp_b * (ptr_iir_ring1[i - 3] + ptr_iir_ring1[i - 7])) + temp1;
68*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 9);
69*15dc779aSAndroid Build Coastguard Worker temp2 = (ptr_iir_ring2[i - 3] * coeff_temp_a) + iir_out;
70*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 13);
71*15dc779aSAndroid Build Coastguard Worker iir_out = (ptr_iir_ring2[i - 7] * coeff_temp_a) + temp2;
72*15dc779aSAndroid Build Coastguard Worker
73*15dc779aSAndroid Build Coastguard Worker coeff_temp_b = *(ptr_coeff_filt + 4);
74*15dc779aSAndroid Build Coastguard Worker temp1 = (coeff_temp_b * (ptr_iir_ring1[i - 4] + ptr_iir_ring1[i - 6])) + temp1;
75*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 10);
76*15dc779aSAndroid Build Coastguard Worker temp2 = (ptr_iir_ring2[i - 4] * coeff_temp_a) + iir_out;
77*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 12);
78*15dc779aSAndroid Build Coastguard Worker iir_out = (ptr_iir_ring2[i - 6] * coeff_temp_a) + temp2;
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker coeff_temp_b = *(ptr_coeff_filt + 5);
81*15dc779aSAndroid Build Coastguard Worker temp1 = (coeff_temp_b * ptr_iir_ring1[i - 5]) + temp1;
82*15dc779aSAndroid Build Coastguard Worker coeff_temp_a = *(ptr_coeff_filt + 11);
83*15dc779aSAndroid Build Coastguard Worker iir_out = (ptr_iir_ring2[i - 5] * coeff_temp_a) + iir_out;
84*15dc779aSAndroid Build Coastguard Worker iir_out = temp1 - iir_out;
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2[i] = iir_out;
87*15dc779aSAndroid Build Coastguard Worker iir_out = (iir_out * (4681.0f / 32767.0f) * pstr_iir_filter->max);
88*15dc779aSAndroid Build Coastguard Worker
89*15dc779aSAndroid Build Coastguard Worker pstr_down_sampler->pending++;
90*15dc779aSAndroid Build Coastguard Worker
91*15dc779aSAndroid Build Coastguard Worker if (pstr_down_sampler->pending == pstr_down_sampler->ratio) {
92*15dc779aSAndroid Build Coastguard Worker ptr_out_samples[(*num_out_samples) * out_stride] = iir_out;
93*15dc779aSAndroid Build Coastguard Worker (*num_out_samples)++;
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker pstr_down_sampler->pending = 0;
96*15dc779aSAndroid Build Coastguard Worker }
97*15dc779aSAndroid Build Coastguard Worker }
98*15dc779aSAndroid Build Coastguard Worker }
99*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_copy_ring_buffers(FLOAT32 * ptr_iir_ring1,FLOAT32 * ptr_iir_ring2,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2)100*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_copy_ring_buffers(FLOAT32 *ptr_iir_ring1, FLOAT32 *ptr_iir_ring2,
101*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf1, FLOAT32 *ptr_ring_buf2) {
102*15dc779aSAndroid Build Coastguard Worker WORD32 i;
103*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp1, temp2, temp3;
104*15dc779aSAndroid Build Coastguard Worker for (i = (LEN_RING_BUF / 2) - 1; i >= 0; i--) {
105*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_iir_ring1++;
106*15dc779aSAndroid Build Coastguard Worker temp2 = *ptr_iir_ring2++;
107*15dc779aSAndroid Build Coastguard Worker temp3 = *ptr_iir_ring1++;
108*15dc779aSAndroid Build Coastguard Worker
109*15dc779aSAndroid Build Coastguard Worker *ptr_ring_buf1++ = temp1;
110*15dc779aSAndroid Build Coastguard Worker temp1 = *ptr_iir_ring2++;
111*15dc779aSAndroid Build Coastguard Worker *ptr_ring_buf2++ = temp2;
112*15dc779aSAndroid Build Coastguard Worker *ptr_ring_buf1++ = temp3;
113*15dc779aSAndroid Build Coastguard Worker *ptr_ring_buf2++ = temp1;
114*15dc779aSAndroid Build Coastguard Worker }
115*15dc779aSAndroid Build Coastguard Worker }
116*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_copy_ring_buffers_sos(FLOAT32 * ptr_iir_ring1,FLOAT32 * ptr_iir_ring2,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2,WORD32 len1,WORD32 len2)117*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_copy_ring_buffers_sos(FLOAT32 *ptr_iir_ring1,
118*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_iir_ring2,
119*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf1,
120*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf2, WORD32 len1,
121*15dc779aSAndroid Build Coastguard Worker WORD32 len2) {
122*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_ring_buf1, ptr_iir_ring1, len1 * sizeof(*ptr_ring_buf1));
123*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_ring_buf2, ptr_iir_ring2, len2 * sizeof(*ptr_ring_buf2));
124*15dc779aSAndroid Build Coastguard Worker }
125*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_update_ring_buffer_sos(FLOAT32 * ptr_ring_buf,FLOAT32 * ptr_samples,WORD32 len,WORD32 in_stride,WORD32 coeff_idx)126*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_update_ring_buffer_sos(FLOAT32 *ptr_ring_buf, FLOAT32 *ptr_samples,
127*15dc779aSAndroid Build Coastguard Worker WORD32 len, WORD32 in_stride,
128*15dc779aSAndroid Build Coastguard Worker WORD32 coeff_idx) {
129*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf[2 * coeff_idx] = ptr_samples[len - 2 * in_stride];
130*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf[2 * coeff_idx + 1] = ptr_samples[len - in_stride];
131*15dc779aSAndroid Build Coastguard Worker }
132*15dc779aSAndroid Build Coastguard Worker
ixheaace_get_input_scratch_buf(VOID * ptr_scr,FLOAT32 ** ptr_scratch_buf_inp)133*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_get_input_scratch_buf(VOID *ptr_scr, FLOAT32 **ptr_scratch_buf_inp) {
134*15dc779aSAndroid Build Coastguard Worker ixheaace_resampler_scratch *pstr_resampler_scr = (ixheaace_resampler_scratch *)ptr_scr;
135*15dc779aSAndroid Build Coastguard Worker
136*15dc779aSAndroid Build Coastguard Worker *ptr_scratch_buf_inp = pstr_resampler_scr->downsampler_in_buffer;
137*15dc779aSAndroid Build Coastguard Worker }
138*15dc779aSAndroid Build Coastguard Worker
ixheaace_resampler_scr_size(VOID)139*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaace_resampler_scr_size(VOID) {
140*15dc779aSAndroid Build Coastguard Worker return IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_resampler_scratch), BYTE_ALIGN_8);
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_iir_sos_filter(ixheaace_iir_sos_resampler * pstr_down_sampler,FLOAT32 * ptr_in_samples,WORD32 in_stride,FLOAT32 * ptr_out_samples,WORD32 num_in_samples,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2,WORD32 coeff_idx)143*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_iir_sos_filter(ixheaace_iir_sos_resampler *pstr_down_sampler,
144*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_samples, WORD32 in_stride,
145*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_out_samples, WORD32 num_in_samples,
146*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf1, FLOAT32 *ptr_ring_buf2,
147*15dc779aSAndroid Build Coastguard Worker WORD32 coeff_idx) {
148*15dc779aSAndroid Build Coastguard Worker WORD32 i;
149*15dc779aSAndroid Build Coastguard Worker ixheaace_iir_sos_filter *pstr_iir_filter = &(pstr_down_sampler->iir_filter);
150*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_coeff_den =
151*15dc779aSAndroid Build Coastguard Worker (pstr_iir_filter->ptr_coeff_iir_den + (coeff_idx * IIR_SOS_COEFFS));
152*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_coeff_num =
153*15dc779aSAndroid Build Coastguard Worker (pstr_iir_filter->ptr_coeff_iir_num + (coeff_idx * IIR_SOS_COEFFS));
154*15dc779aSAndroid Build Coastguard Worker FLOAT32 iir_out = 0.f;
155*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp1 = 0.f, temp2 = 0.f;
156*15dc779aSAndroid Build Coastguard Worker
157*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_in_samples; i++) {
158*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf1[2] = ptr_in_samples[i * in_stride];
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker temp1 = ptr_coeff_num[0] * ptr_in_samples[i * in_stride] +
161*15dc779aSAndroid Build Coastguard Worker ptr_coeff_num[1] * ptr_ring_buf1[1] + ptr_coeff_num[2] * ptr_ring_buf1[0];
162*15dc779aSAndroid Build Coastguard Worker temp2 = ptr_coeff_den[1] * ptr_ring_buf2[1] + ptr_coeff_den[2] * ptr_ring_buf2[0];
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker iir_out = temp1 - temp2;
165*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2[2] = iir_out;
166*15dc779aSAndroid Build Coastguard Worker
167*15dc779aSAndroid Build Coastguard Worker ptr_out_samples[i * in_stride] = iir_out;
168*15dc779aSAndroid Build Coastguard Worker
169*15dc779aSAndroid Build Coastguard Worker // Shift ring buffers
170*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf1[0] = ptr_ring_buf1[1];
171*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf1[1] = ptr_ring_buf1[2];
172*15dc779aSAndroid Build Coastguard Worker
173*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2[0] = ptr_ring_buf2[1];
174*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2[1] = ptr_ring_buf2[2];
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_iir_downsampler(ixheaace_iir21_resampler * pstr_down_sampler,FLOAT32 * ptr_in_samples,WORD32 num_in_samples,WORD32 in_stride,FLOAT32 * ptr_out_samples,WORD32 * num_out_samples,WORD32 out_stride,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2,ixheaace_resampler_scratch * pstr_resampler_scratch)178*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_iir_downsampler(ixheaace_iir21_resampler *pstr_down_sampler,
179*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_samples, WORD32 num_in_samples,
180*15dc779aSAndroid Build Coastguard Worker WORD32 in_stride, FLOAT32 *ptr_out_samples,
181*15dc779aSAndroid Build Coastguard Worker WORD32 *num_out_samples, WORD32 out_stride,
182*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf1, FLOAT32 *ptr_ring_buf2,
183*15dc779aSAndroid Build Coastguard Worker ixheaace_resampler_scratch *pstr_resampler_scratch) {
184*15dc779aSAndroid Build Coastguard Worker ixheaace_iir_filter *pstr_iir_filter = &(pstr_down_sampler->iir_filter);
185*15dc779aSAndroid Build Coastguard Worker WORD32 k;
186*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_iir_ring1, *ptr_iir_ring2, *ptr_out_temp;
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2 = pstr_iir_filter->ring_buf_2;
189*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring1 = pstr_iir_filter->ring_buf_1;
190*15dc779aSAndroid Build Coastguard Worker ptr_out_temp = pstr_resampler_scratch->downsampler_out_buffer;
191*15dc779aSAndroid Build Coastguard Worker
192*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers(ptr_iir_ring1, ptr_iir_ring2, ptr_ring_buf1, ptr_ring_buf2);
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_downsample_iir_filter(
195*15dc779aSAndroid Build Coastguard Worker pstr_down_sampler, ptr_in_samples, ptr_out_temp, in_stride, num_in_samples, num_out_samples,
196*15dc779aSAndroid Build Coastguard Worker out_stride, &ptr_ring_buf1[LEN_RING_BUF - 1], &ptr_ring_buf2[LEN_RING_BUF - 1]);
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < *num_out_samples; k++) {
199*15dc779aSAndroid Build Coastguard Worker ptr_out_samples[k * in_stride] = ptr_out_temp[k * out_stride];
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers(&ptr_ring_buf1[num_in_samples],
203*15dc779aSAndroid Build Coastguard Worker &ptr_ring_buf2[num_in_samples], ptr_iir_ring1,
204*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2);
205*15dc779aSAndroid Build Coastguard Worker }
206*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_iir_sos_downsampler(ixheaace_iir_sos_resampler * pstr_down_sampler,FLOAT32 * ptr_in_samples,WORD32 num_in_samples,WORD32 in_stride,FLOAT32 * ptr_out_samples,WORD32 * num_out_samples,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2,ixheaace_resampler_scratch * pstr_resampler_scratch)207*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_iir_sos_downsampler(ixheaace_iir_sos_resampler *pstr_down_sampler,
208*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_samples, WORD32 num_in_samples,
209*15dc779aSAndroid Build Coastguard Worker WORD32 in_stride, FLOAT32 *ptr_out_samples,
210*15dc779aSAndroid Build Coastguard Worker WORD32 *num_out_samples, FLOAT32 *ptr_ring_buf1,
211*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf2,
212*15dc779aSAndroid Build Coastguard Worker ixheaace_resampler_scratch *pstr_resampler_scratch) {
213*15dc779aSAndroid Build Coastguard Worker ixheaace_iir_sos_filter *pstr_iir_filter = &(pstr_down_sampler->iir_filter);
214*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_iir_ring1, *ptr_iir_ring2;
215*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_out_stage1, *ptr_out_stage2, *ptr_out_stage3, *ptr_out_stage4, *ptr_out_stage5,
216*15dc779aSAndroid Build Coastguard Worker *ptr_out_final;
217*15dc779aSAndroid Build Coastguard Worker WORD32 p = 0, idx = 0, offset1 = 0, offset2 = 0;
218*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_temp_buf1, *ptr_temp_buf2, *ptr_temp_ring_buf;
219*15dc779aSAndroid Build Coastguard Worker WORD32 upper_lim = num_in_samples * in_stride;
220*15dc779aSAndroid Build Coastguard Worker
221*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring1 = pstr_iir_filter->ring_buf_sos_1;
222*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2 = pstr_iir_filter->ring_buf_sos_2;
223*15dc779aSAndroid Build Coastguard Worker
224*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_iir_ring1, ptr_iir_ring2, ptr_ring_buf1,
225*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_2);
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1 = pstr_resampler_scratch->scratch_buf1_temp;
228*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf2 = pstr_resampler_scratch->scratch_buf2_temp;
229*15dc779aSAndroid Build Coastguard Worker ptr_temp_ring_buf = pstr_resampler_scratch->ring_buf_temp;
230*15dc779aSAndroid Build Coastguard Worker
231*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf1, ptr_ring_buf2, ptr_temp_buf1,
232*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_1);
233*15dc779aSAndroid Build Coastguard Worker
234*15dc779aSAndroid Build Coastguard Worker ptr_out_stage1 = pstr_resampler_scratch->downsampler_out_buffer;
235*15dc779aSAndroid Build Coastguard Worker
236*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_in_samples, upper_lim,
237*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
238*15dc779aSAndroid Build Coastguard Worker
239*15dc779aSAndroid Build Coastguard Worker // Stage 1
240*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_down_sampler, ptr_in_samples, in_stride, ptr_out_stage1,
241*15dc779aSAndroid Build Coastguard Worker num_in_samples, ptr_temp_buf1, ptr_temp_buf2, idx);
242*15dc779aSAndroid Build Coastguard Worker
243*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
244*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
245*15dc779aSAndroid Build Coastguard Worker
246*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
247*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
248*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker idx++;
251*15dc779aSAndroid Build Coastguard Worker
252*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage1, upper_lim,
253*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
254*15dc779aSAndroid Build Coastguard Worker
255*15dc779aSAndroid Build Coastguard Worker ptr_out_stage2 = pstr_resampler_scratch->downsampler_in_buffer;
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker // Stage 2
258*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_down_sampler, ptr_out_stage1, in_stride, ptr_out_stage2,
259*15dc779aSAndroid Build Coastguard Worker num_in_samples, ptr_temp_buf1, ptr_temp_buf2, idx);
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
262*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
263*15dc779aSAndroid Build Coastguard Worker
264*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
265*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
266*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker idx++;
269*15dc779aSAndroid Build Coastguard Worker
270*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage2, upper_lim,
271*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker ptr_out_stage3 = pstr_resampler_scratch->downsampler_out_buffer;
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker // Stage 3
276*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_down_sampler, ptr_out_stage2, in_stride, ptr_out_stage3,
277*15dc779aSAndroid Build Coastguard Worker num_in_samples, ptr_temp_buf1, ptr_temp_buf2, idx);
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
280*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
283*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
284*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker idx++;
287*15dc779aSAndroid Build Coastguard Worker
288*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage3, upper_lim,
289*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker ptr_out_stage4 = pstr_resampler_scratch->downsampler_in_buffer;
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker // Stage 4
294*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_down_sampler, ptr_out_stage3, in_stride, ptr_out_stage4,
295*15dc779aSAndroid Build Coastguard Worker num_in_samples, ptr_temp_buf1, ptr_temp_buf2, idx);
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
298*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
299*15dc779aSAndroid Build Coastguard Worker
300*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
301*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
302*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker idx++;
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage4, upper_lim,
307*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker ptr_out_stage5 = pstr_resampler_scratch->downsampler_out_buffer;
310*15dc779aSAndroid Build Coastguard Worker
311*15dc779aSAndroid Build Coastguard Worker // Stage 5
312*15dc779aSAndroid Build Coastguard Worker
313*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_down_sampler, ptr_out_stage4, in_stride, ptr_out_stage5,
314*15dc779aSAndroid Build Coastguard Worker num_in_samples, ptr_temp_buf1, ptr_temp_buf2, idx);
315*15dc779aSAndroid Build Coastguard Worker
316*15dc779aSAndroid Build Coastguard Worker idx++;
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage5, upper_lim,
319*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker ptr_out_final = pstr_resampler_scratch->downsampler_in_buffer;
322*15dc779aSAndroid Build Coastguard Worker
323*15dc779aSAndroid Build Coastguard Worker // Multiply by gain and perform downsamplng
324*15dc779aSAndroid Build Coastguard Worker *num_out_samples = 0;
325*15dc779aSAndroid Build Coastguard Worker for (p = 0; p < num_in_samples * in_stride; p += in_stride) {
326*15dc779aSAndroid Build Coastguard Worker ptr_out_final[p] = ptr_out_stage5[p] * pstr_down_sampler->iir_filter.gain_sos;
327*15dc779aSAndroid Build Coastguard Worker
328*15dc779aSAndroid Build Coastguard Worker pstr_down_sampler->pending++;
329*15dc779aSAndroid Build Coastguard Worker
330*15dc779aSAndroid Build Coastguard Worker if (pstr_down_sampler->pending == pstr_down_sampler->ratio) {
331*15dc779aSAndroid Build Coastguard Worker ptr_out_samples[(*num_out_samples) * in_stride] = ptr_out_final[p];
332*15dc779aSAndroid Build Coastguard Worker
333*15dc779aSAndroid Build Coastguard Worker (*num_out_samples)++;
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker pstr_down_sampler->pending = 0;
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker }
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker // Update ring buffers
340*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_temp_ring_buf,
341*15dc779aSAndroid Build Coastguard Worker ptr_temp_ring_buf + LEN_RING_BUF_SOS_1, ptr_ring_buf1,
342*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_2);
343*15dc779aSAndroid Build Coastguard Worker
344*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf1, ptr_ring_buf2, ptr_iir_ring1,
345*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_2);
346*15dc779aSAndroid Build Coastguard Worker }
347*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_iir_sos_upsampler(ixheaace_iir_sos_resampler * pstr_up_sampler,FLOAT32 * ptr_in_samples,WORD32 num_in_samples,WORD32 in_stride,FLOAT32 * ptr_out_samples,WORD32 * num_out_samples,FLOAT32 * ptr_ring_buf1,FLOAT32 * ptr_ring_buf2,ixheaace_resampler_scratch * pstr_resampler_scratch)348*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_iir_sos_upsampler(ixheaace_iir_sos_resampler *pstr_up_sampler,
349*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_samples, WORD32 num_in_samples,
350*15dc779aSAndroid Build Coastguard Worker WORD32 in_stride, FLOAT32 *ptr_out_samples,
351*15dc779aSAndroid Build Coastguard Worker WORD32 *num_out_samples, FLOAT32 *ptr_ring_buf1,
352*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_ring_buf2,
353*15dc779aSAndroid Build Coastguard Worker ixheaace_resampler_scratch *pstr_resampler_scratch) {
354*15dc779aSAndroid Build Coastguard Worker ixheaace_iir_sos_filter *pstr_iir_filter = &(pstr_up_sampler->iir_filter);
355*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_iir_ring1, *ptr_iir_ring2;
356*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_out_stage1, *ptr_out_stage2, *ptr_out_stage3, *ptr_out_stage4, *ptr_out_stage5;
357*15dc779aSAndroid Build Coastguard Worker FLOAT32 out_val;
358*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_temp_buf1, *ptr_temp_buf2, *ptr_temp_ring_buf;
359*15dc779aSAndroid Build Coastguard Worker WORD32 p = 0, idx = 0, offset1 = 0, offset2 = 0;
360*15dc779aSAndroid Build Coastguard Worker WORD32 upsample_fac = pstr_up_sampler->ratio;
361*15dc779aSAndroid Build Coastguard Worker WORD32 upper_lim = num_in_samples * in_stride * upsample_fac;
362*15dc779aSAndroid Build Coastguard Worker
363*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2 = pstr_iir_filter->ring_buf_sos_2;
364*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring1 = pstr_iir_filter->ring_buf_sos_1;
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_iir_ring1, ptr_iir_ring2, ptr_ring_buf1,
367*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_2);
368*15dc779aSAndroid Build Coastguard Worker
369*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1 = pstr_resampler_scratch->scratch_buf1_temp;
370*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf2 = pstr_resampler_scratch->scratch_buf2_temp;
371*15dc779aSAndroid Build Coastguard Worker ptr_temp_ring_buf = pstr_resampler_scratch->ring_buf_temp;
372*15dc779aSAndroid Build Coastguard Worker
373*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf1, ptr_ring_buf2, ptr_temp_buf1,
374*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_1);
375*15dc779aSAndroid Build Coastguard Worker
376*15dc779aSAndroid Build Coastguard Worker ptr_out_stage1 = pstr_resampler_scratch->downsampler_out_buffer;
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_in_samples, upper_lim,
379*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
380*15dc779aSAndroid Build Coastguard Worker
381*15dc779aSAndroid Build Coastguard Worker // Stage 1
382*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_up_sampler, ptr_in_samples, in_stride, ptr_out_stage1,
383*15dc779aSAndroid Build Coastguard Worker num_in_samples * upsample_fac, ptr_temp_buf1, ptr_temp_buf2,
384*15dc779aSAndroid Build Coastguard Worker idx);
385*15dc779aSAndroid Build Coastguard Worker
386*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
387*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
388*15dc779aSAndroid Build Coastguard Worker
389*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
390*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
391*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
392*15dc779aSAndroid Build Coastguard Worker
393*15dc779aSAndroid Build Coastguard Worker idx++;
394*15dc779aSAndroid Build Coastguard Worker
395*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage1, upper_lim,
396*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
397*15dc779aSAndroid Build Coastguard Worker
398*15dc779aSAndroid Build Coastguard Worker ptr_out_stage2 = pstr_resampler_scratch->downsampler_in_buffer;
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker // Stage 2
401*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_up_sampler, ptr_out_stage1, in_stride, ptr_out_stage2,
402*15dc779aSAndroid Build Coastguard Worker num_in_samples * upsample_fac, ptr_temp_buf1, ptr_temp_buf2,
403*15dc779aSAndroid Build Coastguard Worker idx);
404*15dc779aSAndroid Build Coastguard Worker
405*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
406*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
407*15dc779aSAndroid Build Coastguard Worker
408*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
409*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
410*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
411*15dc779aSAndroid Build Coastguard Worker
412*15dc779aSAndroid Build Coastguard Worker idx++;
413*15dc779aSAndroid Build Coastguard Worker
414*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage2, upper_lim,
415*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
416*15dc779aSAndroid Build Coastguard Worker
417*15dc779aSAndroid Build Coastguard Worker ptr_out_stage3 = pstr_resampler_scratch->downsampler_out_buffer;
418*15dc779aSAndroid Build Coastguard Worker
419*15dc779aSAndroid Build Coastguard Worker // Stage 3
420*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_up_sampler, ptr_out_stage2, in_stride, ptr_out_stage3,
421*15dc779aSAndroid Build Coastguard Worker num_in_samples * upsample_fac, ptr_temp_buf1, ptr_temp_buf2,
422*15dc779aSAndroid Build Coastguard Worker idx);
423*15dc779aSAndroid Build Coastguard Worker
424*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
425*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
426*15dc779aSAndroid Build Coastguard Worker
427*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
428*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
429*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
430*15dc779aSAndroid Build Coastguard Worker
431*15dc779aSAndroid Build Coastguard Worker idx++;
432*15dc779aSAndroid Build Coastguard Worker
433*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage3, upper_lim,
434*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
435*15dc779aSAndroid Build Coastguard Worker
436*15dc779aSAndroid Build Coastguard Worker ptr_out_stage4 = pstr_resampler_scratch->downsampler_in_buffer;
437*15dc779aSAndroid Build Coastguard Worker
438*15dc779aSAndroid Build Coastguard Worker // Stage 4
439*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_up_sampler, ptr_out_stage3, in_stride, ptr_out_stage4,
440*15dc779aSAndroid Build Coastguard Worker num_in_samples * upsample_fac, ptr_temp_buf1, ptr_temp_buf2,
441*15dc779aSAndroid Build Coastguard Worker idx);
442*15dc779aSAndroid Build Coastguard Worker
443*15dc779aSAndroid Build Coastguard Worker offset1 = LEN_RING_BUF_SOS_1 * idx;
444*15dc779aSAndroid Build Coastguard Worker offset2 = LEN_RING_BUF_SOS_1 * (idx + 1);
445*15dc779aSAndroid Build Coastguard Worker
446*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf2 + offset1, ptr_ring_buf2 + offset2,
447*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf1, ptr_temp_buf2, LEN_RING_BUF_SOS_1,
448*15dc779aSAndroid Build Coastguard Worker LEN_RING_BUF_SOS_1);
449*15dc779aSAndroid Build Coastguard Worker
450*15dc779aSAndroid Build Coastguard Worker idx++;
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage4, upper_lim,
453*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
454*15dc779aSAndroid Build Coastguard Worker
455*15dc779aSAndroid Build Coastguard Worker ptr_out_stage5 = pstr_resampler_scratch->downsampler_out_buffer;
456*15dc779aSAndroid Build Coastguard Worker
457*15dc779aSAndroid Build Coastguard Worker // Stage 5
458*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_iir_sos_filter(pstr_up_sampler, ptr_out_stage4, in_stride, ptr_out_stage5,
459*15dc779aSAndroid Build Coastguard Worker num_in_samples * upsample_fac, ptr_temp_buf1, ptr_temp_buf2,
460*15dc779aSAndroid Build Coastguard Worker idx);
461*15dc779aSAndroid Build Coastguard Worker
462*15dc779aSAndroid Build Coastguard Worker idx++;
463*15dc779aSAndroid Build Coastguard Worker
464*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_update_ring_buffer_sos(ptr_temp_ring_buf, ptr_out_stage5, upper_lim,
465*15dc779aSAndroid Build Coastguard Worker in_stride, idx);
466*15dc779aSAndroid Build Coastguard Worker
467*15dc779aSAndroid Build Coastguard Worker // Multiply by gain and perform downsamplng
468*15dc779aSAndroid Build Coastguard Worker *num_out_samples = 0;
469*15dc779aSAndroid Build Coastguard Worker for (p = 0; p < num_in_samples * in_stride * upsample_fac; p += in_stride) {
470*15dc779aSAndroid Build Coastguard Worker out_val = ptr_out_stage5[p] * pstr_up_sampler->iir_filter.gain_sos;
471*15dc779aSAndroid Build Coastguard Worker ptr_out_samples[p] = out_val;
472*15dc779aSAndroid Build Coastguard Worker (*num_out_samples)++;
473*15dc779aSAndroid Build Coastguard Worker }
474*15dc779aSAndroid Build Coastguard Worker
475*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_temp_ring_buf,
476*15dc779aSAndroid Build Coastguard Worker ptr_temp_ring_buf + LEN_RING_BUF_SOS_1, ptr_ring_buf1,
477*15dc779aSAndroid Build Coastguard Worker ptr_ring_buf2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_2);
478*15dc779aSAndroid Build Coastguard Worker
479*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_copy_ring_buffers_sos(ptr_ring_buf1, ptr_ring_buf2, ptr_iir_ring1,
480*15dc779aSAndroid Build Coastguard Worker ptr_iir_ring2, LEN_RING_BUF_SOS_1, LEN_RING_BUF_SOS_2);
481*15dc779aSAndroid Build Coastguard Worker }
482*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_compute_resampling_ratio(WORD32 ccfl_idx)483*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_compute_resampling_ratio(WORD32 ccfl_idx) {
484*15dc779aSAndroid Build Coastguard Worker WORD32 resamp_ratio;
485*15dc779aSAndroid Build Coastguard Worker
486*15dc779aSAndroid Build Coastguard Worker if (ccfl_idx == SBR_4_1) {
487*15dc779aSAndroid Build Coastguard Worker resamp_ratio = 2;
488*15dc779aSAndroid Build Coastguard Worker } else if (ccfl_idx == SBR_8_3) {
489*15dc779aSAndroid Build Coastguard Worker resamp_ratio = 4;
490*15dc779aSAndroid Build Coastguard Worker } else {
491*15dc779aSAndroid Build Coastguard Worker resamp_ratio = 1;
492*15dc779aSAndroid Build Coastguard Worker }
493*15dc779aSAndroid Build Coastguard Worker
494*15dc779aSAndroid Build Coastguard Worker return resamp_ratio;
495*15dc779aSAndroid Build Coastguard Worker }
496*15dc779aSAndroid Build Coastguard Worker
ixheaace_upsampling_inp_buf_generation(FLOAT32 * ptr_inp_buf,FLOAT32 * ptr_temp_buf,WORD32 num_samples,WORD32 upsamp_fac,WORD32 offset)497*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_upsampling_inp_buf_generation(FLOAT32 *ptr_inp_buf, FLOAT32 *ptr_temp_buf,
498*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, WORD32 upsamp_fac,
499*15dc779aSAndroid Build Coastguard Worker WORD32 offset) {
500*15dc779aSAndroid Build Coastguard Worker WORD32 idx, m = 0;
501*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_in_samples;
502*15dc779aSAndroid Build Coastguard Worker
503*15dc779aSAndroid Build Coastguard Worker memset(ptr_temp_buf, 0,
504*15dc779aSAndroid Build Coastguard Worker (num_samples * IXHEAACE_MAX_CH_IN_BS_ELE * upsamp_fac * sizeof(*ptr_temp_buf)));
505*15dc779aSAndroid Build Coastguard Worker
506*15dc779aSAndroid Build Coastguard Worker ptr_in_samples = ptr_inp_buf + offset;
507*15dc779aSAndroid Build Coastguard Worker
508*15dc779aSAndroid Build Coastguard Worker // Perform actual upsampling (repeat samples)
509*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_samples; idx++) {
510*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf[m++] = ptr_in_samples[idx * IXHEAACE_MAX_CH_IN_BS_ELE];
511*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf[m++] = ptr_in_samples[idx * IXHEAACE_MAX_CH_IN_BS_ELE + 1];
512*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf[m++] =
513*15dc779aSAndroid Build Coastguard Worker ptr_in_samples[idx *
514*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_CH_IN_BS_ELE]; // 1st channel sample repeated for upsampling
515*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf[m++] = ptr_in_samples[idx * IXHEAACE_MAX_CH_IN_BS_ELE +
516*15dc779aSAndroid Build Coastguard Worker 1]; // 2nd channel sample repeated for upsampling
517*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf[m++] =
518*15dc779aSAndroid Build Coastguard Worker ptr_in_samples[idx *
519*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_CH_IN_BS_ELE]; // 1st channel sample repeated for upsampling
520*15dc779aSAndroid Build Coastguard Worker ptr_temp_buf[m++] = ptr_in_samples[idx * IXHEAACE_MAX_CH_IN_BS_ELE +
521*15dc779aSAndroid Build Coastguard Worker 1]; // 2nd channel sample repeated for upsampling
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker }