Coverage Report

Created: 2026-02-26 06:35

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