xref: /aosp_15_r20/external/libxaac/encoder/iusace_windowing.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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_error_standards.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_rom.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
28*15dc779aSAndroid Build Coastguard Worker 
iusace_calc_window(FLOAT64 ** win,WORD32 win_sz,WORD32 win_sel)29*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE iusace_calc_window(FLOAT64 **win, WORD32 win_sz, WORD32 win_sel) {
30*15dc779aSAndroid Build Coastguard Worker   switch (win_sel) {
31*15dc779aSAndroid Build Coastguard Worker     case WIN_SEL_0:
32*15dc779aSAndroid Build Coastguard Worker       switch (win_sz) {
33*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_96:
34*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iexheaac_sine_win_96;
35*15dc779aSAndroid Build Coastguard Worker           break;
36*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_192:
37*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iexheaac_sine_win_192;
38*15dc779aSAndroid Build Coastguard Worker           break;
39*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_128:
40*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iusace_sine_win_128;
41*15dc779aSAndroid Build Coastguard Worker           break;
42*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_256:
43*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iusace_sine_win_256;
44*15dc779aSAndroid Build Coastguard Worker           break;
45*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_768:
46*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iexheaac_sine_win_768;
47*15dc779aSAndroid Build Coastguard Worker           break;
48*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_1024:
49*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iusace_sine_win_1024;
50*15dc779aSAndroid Build Coastguard Worker           break;
51*15dc779aSAndroid Build Coastguard Worker         default:
52*15dc779aSAndroid Build Coastguard Worker           return IA_EXHEAACE_EXE_FATAL_USAC_INVALID_WINDOW_LENGTH;
53*15dc779aSAndroid Build Coastguard Worker           break;
54*15dc779aSAndroid Build Coastguard Worker       }
55*15dc779aSAndroid Build Coastguard Worker       break;
56*15dc779aSAndroid Build Coastguard Worker     case WIN_SEL_1:
57*15dc779aSAndroid Build Coastguard Worker       switch (win_sz) {
58*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_96:
59*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iexheaac_kbd_win_96;
60*15dc779aSAndroid Build Coastguard Worker           break;
61*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_128:
62*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iusace_sine_win_128;
63*15dc779aSAndroid Build Coastguard Worker           break;
64*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_192:
65*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iexheaac_kbd_win_192;
66*15dc779aSAndroid Build Coastguard Worker           break;
67*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_256:
68*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iusace_kbd_win256;
69*15dc779aSAndroid Build Coastguard Worker           break;
70*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_768:
71*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iexheaac_kbd_win_768;
72*15dc779aSAndroid Build Coastguard Worker           break;
73*15dc779aSAndroid Build Coastguard Worker         case WIN_LEN_1024:
74*15dc779aSAndroid Build Coastguard Worker           *win = (FLOAT64 *)iusace_kbd_win1024;
75*15dc779aSAndroid Build Coastguard Worker           break;
76*15dc779aSAndroid Build Coastguard Worker         default:
77*15dc779aSAndroid Build Coastguard Worker           return IA_EXHEAACE_EXE_FATAL_USAC_INVALID_WINDOW_LENGTH;
78*15dc779aSAndroid Build Coastguard Worker           break;
79*15dc779aSAndroid Build Coastguard Worker       }
80*15dc779aSAndroid Build Coastguard Worker       break;
81*15dc779aSAndroid Build Coastguard Worker 
82*15dc779aSAndroid Build Coastguard Worker     default:
83*15dc779aSAndroid Build Coastguard Worker       return IA_EXHEAACE_EXE_FATAL_USAC_INVALID_WINDOW_SHAPE;
84*15dc779aSAndroid Build Coastguard Worker       break;
85*15dc779aSAndroid Build Coastguard Worker   }
86*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker 
iusace_windowing_long(FLOAT64 * ptr_overlap,FLOAT64 * ptr_win_long,FLOAT64 * ptr_win_buf,FLOAT64 * ptr_in_data,WORD32 n_long)89*15dc779aSAndroid Build Coastguard Worker VOID iusace_windowing_long(FLOAT64 *ptr_overlap, FLOAT64 *ptr_win_long, FLOAT64 *ptr_win_buf,
90*15dc779aSAndroid Build Coastguard Worker                            FLOAT64 *ptr_in_data, WORD32 n_long) {
91*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
92*15dc779aSAndroid Build Coastguard Worker   FLOAT64 *ptr_win = ptr_win_long + n_long - 1;
93*15dc779aSAndroid Build Coastguard Worker   WORD32 data_size = (OVERLAP_WIN_SIZE_576 * n_long) / LEN_SUPERFRAME;
94*15dc779aSAndroid Build Coastguard Worker 
95*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n_long; i++) {
96*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[i] = ptr_overlap[i] * ptr_win_long[i];
97*15dc779aSAndroid Build Coastguard Worker   }
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_overlap, ptr_overlap + n_long, data_size * sizeof(ptr_overlap[0]));
100*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_overlap + data_size, ptr_in_data, n_long * sizeof(ptr_overlap[0]));
101*15dc779aSAndroid Build Coastguard Worker 
102*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n_long; i++) {
103*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[i + n_long] = ptr_overlap[i] * (*ptr_win--);
104*15dc779aSAndroid Build Coastguard Worker   }
105*15dc779aSAndroid Build Coastguard Worker 
106*15dc779aSAndroid Build Coastguard Worker   return;
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker 
iusace_windowing_long_start(FLOAT64 * ptr_overlap,FLOAT64 * ptr_win_long,FLOAT64 * ptr_win_buf,FLOAT64 * ptr_in_data,WORD32 n_long,WORD32 nflat_ls,FLOAT64 * ptr_win_med,WORD32 win_sz)109*15dc779aSAndroid Build Coastguard Worker VOID iusace_windowing_long_start(FLOAT64 *ptr_overlap, FLOAT64 *ptr_win_long,
110*15dc779aSAndroid Build Coastguard Worker                                  FLOAT64 *ptr_win_buf, FLOAT64 *ptr_in_data, WORD32 n_long,
111*15dc779aSAndroid Build Coastguard Worker                                  WORD32 nflat_ls, FLOAT64 *ptr_win_med, WORD32 win_sz) {
112*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
113*15dc779aSAndroid Build Coastguard Worker   FLOAT64 *ptr_win = ptr_win_buf + 2 * n_long - 1;
114*15dc779aSAndroid Build Coastguard Worker   WORD32 data_size = (OVERLAP_WIN_SIZE_576 * n_long) / LEN_SUPERFRAME;
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n_long; i++) {
117*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[i] = ptr_overlap[i] * ptr_win_long[i];
118*15dc779aSAndroid Build Coastguard Worker   }
119*15dc779aSAndroid Build Coastguard Worker 
120*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_overlap, ptr_overlap + n_long, data_size * sizeof(ptr_overlap[0]));
121*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_overlap + data_size, ptr_in_data, n_long * sizeof(ptr_overlap[0]));
122*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_win_buf + n_long, ptr_overlap, nflat_ls * sizeof(ptr_win_buf[0]));
123*15dc779aSAndroid Build Coastguard Worker 
124*15dc779aSAndroid Build Coastguard Worker   ptr_win_med = ptr_win_med + win_sz - 1;
125*15dc779aSAndroid Build Coastguard Worker   win_sz = n_long - 2 * nflat_ls;
126*15dc779aSAndroid Build Coastguard Worker 
127*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < win_sz; i++) {
128*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[i + n_long + nflat_ls] = ptr_overlap[i + nflat_ls] * (*ptr_win_med--);
129*15dc779aSAndroid Build Coastguard Worker   }
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < nflat_ls; i++) {
132*15dc779aSAndroid Build Coastguard Worker     *ptr_win-- = 0;
133*15dc779aSAndroid Build Coastguard Worker   }
134*15dc779aSAndroid Build Coastguard Worker 
135*15dc779aSAndroid Build Coastguard Worker   return;
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker 
iusace_windowing_long_stop(FLOAT64 * ptr_overlap,FLOAT64 * ptr_win_long,FLOAT64 * ptr_win_buf,FLOAT64 * ptr_in_data,WORD32 n_long,WORD32 nflat_ls,FLOAT64 * ptr_win_med,WORD32 win_sz)138*15dc779aSAndroid Build Coastguard Worker VOID iusace_windowing_long_stop(FLOAT64 *ptr_overlap, FLOAT64 *ptr_win_long, FLOAT64 *ptr_win_buf,
139*15dc779aSAndroid Build Coastguard Worker                                 FLOAT64 *ptr_in_data, WORD32 n_long, WORD32 nflat_ls,
140*15dc779aSAndroid Build Coastguard Worker                                 FLOAT64 *ptr_win_med, WORD32 win_sz) {
141*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
142*15dc779aSAndroid Build Coastguard Worker   FLOAT64 *ptr_win = ptr_win_long + n_long - 1;
143*15dc779aSAndroid Build Coastguard Worker   WORD32 data_size = (OVERLAP_WIN_SIZE_576 * n_long) / LEN_SUPERFRAME;
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker   memset(ptr_win_buf, 0, nflat_ls * sizeof(FLOAT64));
146*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < win_sz; i++) {
147*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[i + nflat_ls] = ptr_overlap[i + nflat_ls] * ptr_win_med[i];
148*15dc779aSAndroid Build Coastguard Worker   }
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_win_buf + nflat_ls + win_sz, ptr_overlap + nflat_ls + win_sz,
151*15dc779aSAndroid Build Coastguard Worker          nflat_ls * sizeof(ptr_win_buf[0]));
152*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_overlap, ptr_overlap + n_long, data_size * sizeof(ptr_overlap[0]));
153*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_overlap + data_size, ptr_in_data, n_long * sizeof(ptr_overlap[0]));
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n_long; i++) {
156*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[i + n_long] = ptr_overlap[i] * (*ptr_win--);
157*15dc779aSAndroid Build Coastguard Worker   }
158*15dc779aSAndroid Build Coastguard Worker   return;
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker 
iusace_windowing_stop_start(FLOAT64 * ptr_overlap,FLOAT64 * ptr_win_buf,FLOAT64 * ptr_win_med,WORD32 win_sz,WORD32 n_long)161*15dc779aSAndroid Build Coastguard Worker VOID iusace_windowing_stop_start(FLOAT64 *ptr_overlap, FLOAT64 *ptr_win_buf, FLOAT64 *ptr_win_med,
162*15dc779aSAndroid Build Coastguard Worker                                  WORD32 win_sz, WORD32 n_long) {
163*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
164*15dc779aSAndroid Build Coastguard Worker   FLOAT64 *win_gen;
165*15dc779aSAndroid Build Coastguard Worker   WORD32 wsize = (n_long - win_sz) >> 1;
166*15dc779aSAndroid Build Coastguard Worker   win_gen = ptr_win_med;
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < win_sz; i++) {
169*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[wsize + i] = ptr_overlap[wsize + i] * (*win_gen++);
170*15dc779aSAndroid Build Coastguard Worker   }
171*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_win_buf + wsize, ptr_overlap + wsize, wsize * sizeof(FLOAT64));
172*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_win_buf + n_long, ptr_overlap + n_long, wsize * sizeof(FLOAT64));
173*15dc779aSAndroid Build Coastguard Worker 
174*15dc779aSAndroid Build Coastguard Worker   win_gen = ptr_win_med + win_sz - 1;
175*15dc779aSAndroid Build Coastguard Worker   win_sz = n_long - 2 * wsize;
176*15dc779aSAndroid Build Coastguard Worker 
177*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < win_sz; i++) {
178*15dc779aSAndroid Build Coastguard Worker     ptr_win_buf[n_long + wsize + i] = ptr_overlap[n_long + wsize + i] * (*win_gen--);
179*15dc779aSAndroid Build Coastguard Worker   }
180*15dc779aSAndroid Build Coastguard Worker   return;
181*15dc779aSAndroid Build Coastguard Worker }
182