Coverage Report

Created: 2025-10-10 06:12

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