xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_aac_ec.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 <stdio.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.h>
23*15dc779aSAndroid Build Coastguard Worker #include <math.h>
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
32*15dc779aSAndroid Build Coastguard Worker 
33*15dc779aSAndroid Build Coastguard Worker #include <ixheaacd_cnst.h>
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
40*15dc779aSAndroid Build Coastguard Worker 
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker #include <ixheaacd_aac_rom.h>
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
45*15dc779aSAndroid Build Coastguard Worker 
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
47*15dc779aSAndroid Build Coastguard Worker 
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_rom.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
56*15dc779aSAndroid Build Coastguard Worker 
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
58*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_get_win_seq(WORD32 prev_win_seq)59*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_aac_ec_get_win_seq(WORD32 prev_win_seq) {
60*15dc779aSAndroid Build Coastguard Worker   WORD32 new_win_seq = ONLY_LONG_SEQUENCE;
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker   if (prev_win_seq == LONG_START_SEQUENCE || prev_win_seq == EIGHT_SHORT_SEQUENCE) {
63*15dc779aSAndroid Build Coastguard Worker     new_win_seq = LONG_STOP_SEQUENCE;
64*15dc779aSAndroid Build Coastguard Worker   }
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker   return new_win_seq;
67*15dc779aSAndroid Build Coastguard Worker }
68*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_flip_spec_sign(WORD32 * ptr_spec_coeff,WORD32 num_samples)69*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_aac_ec_flip_spec_sign(WORD32 *ptr_spec_coeff, WORD32 num_samples) {
70*15dc779aSAndroid Build Coastguard Worker   WORD32 idx;
71*15dc779aSAndroid Build Coastguard Worker   WORD32 random_value;
72*15dc779aSAndroid Build Coastguard Worker 
73*15dc779aSAndroid Build Coastguard Worker   for (idx = 0; idx < num_samples; idx++) {
74*15dc779aSAndroid Build Coastguard Worker     random_value = ptr_spec_coeff[idx] ^ idx;
75*15dc779aSAndroid Build Coastguard Worker     if ((random_value & 1) == 0) {
76*15dc779aSAndroid Build Coastguard Worker       ptr_spec_coeff[idx] = ixheaac_negate32_sat(ptr_spec_coeff[idx]);
77*15dc779aSAndroid Build Coastguard Worker     }
78*15dc779aSAndroid Build Coastguard Worker   }
79*15dc779aSAndroid Build Coastguard Worker }
80*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_store(ia_ec_state_str * pstr_ec_state,ia_aac_dec_channel_info_struct * pstr_aac_dec_channel_info,ia_ics_info_struct * pstr_ics_info)81*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_aac_ec_store(ia_ec_state_str *pstr_ec_state,
82*15dc779aSAndroid Build Coastguard Worker                                   ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
83*15dc779aSAndroid Build Coastguard Worker                                   ia_ics_info_struct *pstr_ics_info) {
84*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_spec_coeff = pstr_aac_dec_channel_info->ptr_spec_coeff;
85*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_spec_scale = pstr_aac_dec_channel_info->ptr_scale_factor;
86*15dc779aSAndroid Build Coastguard Worker   UWORD8 win_shape = pstr_ec_state->win_shape;
87*15dc779aSAndroid Build Coastguard Worker   WORD32 win_seq = pstr_ec_state->win_seq;
88*15dc779aSAndroid Build Coastguard Worker   WORD16 q_spec_scale[MAX_SPEC_SCALE_LEN];
89*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_temp_spec_coeff = &pstr_ec_state->str_ec_scratch.spec_coeff[0];
90*15dc779aSAndroid Build Coastguard Worker 
91*15dc779aSAndroid Build Coastguard Worker   memcpy(q_spec_scale, pstr_ec_state->q_spec_coeff, sizeof(q_spec_scale));
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->win_seq = pstr_ics_info->window_sequence;
94*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->win_shape = (UWORD8)pstr_ics_info->window_shape;
95*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->prev_win_group_len =
96*15dc779aSAndroid Build Coastguard Worker       *(pstr_ics_info->window_group_length + pstr_ics_info->num_window_groups - 1);
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker   memcpy(pstr_ec_state->q_spec_coeff, ptr_spec_scale, sizeof(pstr_ec_state->q_spec_coeff));
99*15dc779aSAndroid Build Coastguard Worker 
100*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_temp_spec_coeff, ptr_spec_coeff, LEN_SUPERFRAME * sizeof(ptr_temp_spec_coeff[0]));
101*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_spec_coeff, pstr_ec_state->spectral_coeff,
102*15dc779aSAndroid Build Coastguard Worker          LEN_SUPERFRAME * sizeof(ptr_spec_coeff[0]));
103*15dc779aSAndroid Build Coastguard Worker   memcpy(pstr_ec_state->spectral_coeff, ptr_temp_spec_coeff,
104*15dc779aSAndroid Build Coastguard Worker          sizeof(pstr_ec_state->spectral_coeff));
105*15dc779aSAndroid Build Coastguard Worker   pstr_ics_info->window_sequence = win_seq;
106*15dc779aSAndroid Build Coastguard Worker   pstr_ics_info->window_shape = win_shape;
107*15dc779aSAndroid Build Coastguard Worker 
108*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_spec_scale, q_spec_scale, MAX_SPEC_SCALE_LEN * sizeof(ptr_spec_scale[0]));
109*15dc779aSAndroid Build Coastguard Worker }
110*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_calc_sfb_nrg(WORD32 * ptr_spec_coeff,const ia_usac_samp_rate_info * pstr_samp_rate_info,const WORD32 win_seq,WORD32 win_trans,WORD32 * ptr_sfb_energy)111*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_aac_ec_calc_sfb_nrg(WORD32 *ptr_spec_coeff,
112*15dc779aSAndroid Build Coastguard Worker                                          const ia_usac_samp_rate_info *pstr_samp_rate_info,
113*15dc779aSAndroid Build Coastguard Worker                                          const WORD32 win_seq, WORD32 win_trans,
114*15dc779aSAndroid Build Coastguard Worker                                          WORD32 *ptr_sfb_energy) {
115*15dc779aSAndroid Build Coastguard Worker   const WORD16 *ptr_sfb_offset;
116*15dc779aSAndroid Build Coastguard Worker   WORD32 line = 0, sfb, total_scale_factor_bands = 0;
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker   switch (win_seq) {
119*15dc779aSAndroid Build Coastguard Worker     case EIGHT_SHORT_SEQUENCE:
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker       if (win_trans == NO_TRANSITION) {
122*15dc779aSAndroid Build Coastguard Worker         total_scale_factor_bands = pstr_samp_rate_info->num_sfb_128 - 1;
123*15dc779aSAndroid Build Coastguard Worker         ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_128;
124*15dc779aSAndroid Build Coastguard Worker 
125*15dc779aSAndroid Build Coastguard Worker         for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
126*15dc779aSAndroid Build Coastguard Worker           WORD32 accu = 1;
127*15dc779aSAndroid Build Coastguard Worker           WORD32 q_nrg;
128*15dc779aSAndroid Build Coastguard Worker           if (sfb == 0) {
129*15dc779aSAndroid Build Coastguard Worker             q_nrg = (sizeof(accu) << 3) - ixheaac_norm32(ptr_sfb_offset[sfb] - 0);
130*15dc779aSAndroid Build Coastguard Worker             for (; line < ptr_sfb_offset[sfb]; line++) {
131*15dc779aSAndroid Build Coastguard Worker               accu += ixheaac_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
132*15dc779aSAndroid Build Coastguard Worker             }
133*15dc779aSAndroid Build Coastguard Worker             ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
134*15dc779aSAndroid Build Coastguard Worker           }
135*15dc779aSAndroid Build Coastguard Worker           q_nrg = (sizeof(accu) << 3) -
136*15dc779aSAndroid Build Coastguard Worker                   ixheaac_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
137*15dc779aSAndroid Build Coastguard Worker           for (; line < ptr_sfb_offset[sfb + 1]; line++) {
138*15dc779aSAndroid Build Coastguard Worker             accu += ixheaac_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
139*15dc779aSAndroid Build Coastguard Worker           }
140*15dc779aSAndroid Build Coastguard Worker           ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
141*15dc779aSAndroid Build Coastguard Worker         }
142*15dc779aSAndroid Build Coastguard Worker       } else {
143*15dc779aSAndroid Build Coastguard Worker         total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
144*15dc779aSAndroid Build Coastguard Worker         ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker         for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
147*15dc779aSAndroid Build Coastguard Worker           WORD32 accu = 1;
148*15dc779aSAndroid Build Coastguard Worker           WORD32 q_nrg;
149*15dc779aSAndroid Build Coastguard Worker           if (sfb == 0) {
150*15dc779aSAndroid Build Coastguard Worker             q_nrg = (sizeof(accu) << 3) - ixheaac_norm32(ptr_sfb_offset[sfb] - 0);
151*15dc779aSAndroid Build Coastguard Worker             for (; line < ptr_sfb_offset[sfb]; line++) {
152*15dc779aSAndroid Build Coastguard Worker               accu +=
153*15dc779aSAndroid Build Coastguard Worker                   ixheaac_mult32(ptr_spec_coeff[line >> 3], ptr_spec_coeff[line >> 3]) >> q_nrg;
154*15dc779aSAndroid Build Coastguard Worker             }
155*15dc779aSAndroid Build Coastguard Worker             ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
156*15dc779aSAndroid Build Coastguard Worker           }
157*15dc779aSAndroid Build Coastguard Worker           q_nrg = (sizeof(accu) << 3) -
158*15dc779aSAndroid Build Coastguard Worker                   ixheaac_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
159*15dc779aSAndroid Build Coastguard Worker           for (; line < ptr_sfb_offset[sfb + 1]; line++) {
160*15dc779aSAndroid Build Coastguard Worker             accu +=
161*15dc779aSAndroid Build Coastguard Worker                 ixheaac_mult32(ptr_spec_coeff[line >> 3], ptr_spec_coeff[line >> 3]) >> q_nrg;
162*15dc779aSAndroid Build Coastguard Worker           }
163*15dc779aSAndroid Build Coastguard Worker           ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
164*15dc779aSAndroid Build Coastguard Worker         }
165*15dc779aSAndroid Build Coastguard Worker       }
166*15dc779aSAndroid Build Coastguard Worker       break;
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker     case ONLY_LONG_SEQUENCE:
169*15dc779aSAndroid Build Coastguard Worker     case LONG_START_SEQUENCE:
170*15dc779aSAndroid Build Coastguard Worker     case LONG_STOP_SEQUENCE:
171*15dc779aSAndroid Build Coastguard Worker 
172*15dc779aSAndroid Build Coastguard Worker       if (win_trans == NO_TRANSITION) {
173*15dc779aSAndroid Build Coastguard Worker         total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
174*15dc779aSAndroid Build Coastguard Worker         ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker         for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
177*15dc779aSAndroid Build Coastguard Worker           WORD32 accu = 1;
178*15dc779aSAndroid Build Coastguard Worker           WORD32 q_nrg;
179*15dc779aSAndroid Build Coastguard Worker           if (sfb == 0) {
180*15dc779aSAndroid Build Coastguard Worker             q_nrg = (sizeof(accu) << 3) - ixheaac_norm32(ptr_sfb_offset[sfb] - 0);
181*15dc779aSAndroid Build Coastguard Worker             for (; line < ptr_sfb_offset[sfb]; line++) {
182*15dc779aSAndroid Build Coastguard Worker               accu += ixheaac_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
183*15dc779aSAndroid Build Coastguard Worker             }
184*15dc779aSAndroid Build Coastguard Worker             ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
185*15dc779aSAndroid Build Coastguard Worker           }
186*15dc779aSAndroid Build Coastguard Worker           q_nrg = (sizeof(accu) << 3) -
187*15dc779aSAndroid Build Coastguard Worker                   ixheaac_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
188*15dc779aSAndroid Build Coastguard Worker           for (; line < ptr_sfb_offset[sfb + 1]; line++) {
189*15dc779aSAndroid Build Coastguard Worker             accu += ixheaac_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
190*15dc779aSAndroid Build Coastguard Worker           }
191*15dc779aSAndroid Build Coastguard Worker           ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
192*15dc779aSAndroid Build Coastguard Worker         }
193*15dc779aSAndroid Build Coastguard Worker       } else {
194*15dc779aSAndroid Build Coastguard Worker         total_scale_factor_bands = pstr_samp_rate_info->num_sfb_128 - 1;
195*15dc779aSAndroid Build Coastguard Worker         ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_128;
196*15dc779aSAndroid Build Coastguard Worker 
197*15dc779aSAndroid Build Coastguard Worker         for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
198*15dc779aSAndroid Build Coastguard Worker           WORD32 accu = 1;
199*15dc779aSAndroid Build Coastguard Worker           WORD32 q_nrg;
200*15dc779aSAndroid Build Coastguard Worker           if (sfb == 0) {
201*15dc779aSAndroid Build Coastguard Worker             q_nrg = (sizeof(accu) << 3) - ixheaac_norm32(ptr_sfb_offset[sfb] - 0);
202*15dc779aSAndroid Build Coastguard Worker             for (; line < ptr_sfb_offset[sfb] << 3; line++) {
203*15dc779aSAndroid Build Coastguard Worker               accu += (accu +
204*15dc779aSAndroid Build Coastguard Worker                        (ixheaac_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg)) >>
205*15dc779aSAndroid Build Coastguard Worker                       3;
206*15dc779aSAndroid Build Coastguard Worker             }
207*15dc779aSAndroid Build Coastguard Worker             ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
208*15dc779aSAndroid Build Coastguard Worker           }
209*15dc779aSAndroid Build Coastguard Worker           q_nrg = (sizeof(accu) << 3) -
210*15dc779aSAndroid Build Coastguard Worker                   ixheaac_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
211*15dc779aSAndroid Build Coastguard Worker           for (; line < ptr_sfb_offset[sfb + 1] << 3; line++) {
212*15dc779aSAndroid Build Coastguard Worker             accu +=
213*15dc779aSAndroid Build Coastguard Worker                 (accu + (ixheaac_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg)) >>
214*15dc779aSAndroid Build Coastguard Worker                 3;
215*15dc779aSAndroid Build Coastguard Worker           }
216*15dc779aSAndroid Build Coastguard Worker           ptr_sfb_energy[sfb] = ixheaac_norm32(accu);
217*15dc779aSAndroid Build Coastguard Worker         }
218*15dc779aSAndroid Build Coastguard Worker       }
219*15dc779aSAndroid Build Coastguard Worker       break;
220*15dc779aSAndroid Build Coastguard Worker   }
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_interpolate(WORD32 * ptr_spec_coeff,WORD16 * ptr_spec_scale_prev,WORD16 * ptr_spec_scale_act,WORD16 * ptr_spec_scale_out,WORD32 * nrg_prev,WORD32 * nrg_act,WORD32 num_sfb,const WORD16 * ptr_sfb_offset)223*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_aac_ec_interpolate(WORD32 *ptr_spec_coeff, WORD16 *ptr_spec_scale_prev,
224*15dc779aSAndroid Build Coastguard Worker                                         WORD16 *ptr_spec_scale_act, WORD16 *ptr_spec_scale_out,
225*15dc779aSAndroid Build Coastguard Worker                                         WORD32 *nrg_prev, WORD32 *nrg_act, WORD32 num_sfb,
226*15dc779aSAndroid Build Coastguard Worker                                         const WORD16 *ptr_sfb_offset) {
227*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb, line = 0;
228*15dc779aSAndroid Build Coastguard Worker   WORD32 fac_shift;
229*15dc779aSAndroid Build Coastguard Worker   WORD32 fac_mod;
230*15dc779aSAndroid Build Coastguard Worker 
231*15dc779aSAndroid Build Coastguard Worker   for (sfb = 0; sfb < num_sfb; sfb++) {
232*15dc779aSAndroid Build Coastguard Worker     fac_shift =
233*15dc779aSAndroid Build Coastguard Worker         nrg_prev[sfb] - nrg_act[sfb] + ((*ptr_spec_scale_act - *ptr_spec_scale_prev) << 1);
234*15dc779aSAndroid Build Coastguard Worker     fac_mod = fac_shift & 3;
235*15dc779aSAndroid Build Coastguard Worker     fac_shift = (fac_shift >> 2) + 1;
236*15dc779aSAndroid Build Coastguard Worker     fac_shift += *ptr_spec_scale_prev - max(*ptr_spec_scale_prev, *ptr_spec_scale_act);
237*15dc779aSAndroid Build Coastguard Worker     fac_shift = max(min(fac_shift, INT_BITS - 1), -(INT_BITS - 1));
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker     for (; line < ptr_sfb_offset[sfb]; line++) {
240*15dc779aSAndroid Build Coastguard Worker       WORD32 accu =
241*15dc779aSAndroid Build Coastguard Worker           ixheaac_mult32x16in32_shl(ptr_spec_coeff[line], ia_ec_interpolation_fac[fac_mod]);
242*15dc779aSAndroid Build Coastguard Worker       ptr_spec_coeff[line] = ixheaac_shl32_dir_sat(accu, fac_shift);
243*15dc779aSAndroid Build Coastguard Worker     }
244*15dc779aSAndroid Build Coastguard Worker   }
245*15dc779aSAndroid Build Coastguard Worker   *ptr_spec_scale_out = max(*ptr_spec_scale_prev, *ptr_spec_scale_act);
246*15dc779aSAndroid Build Coastguard Worker }
247*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_state(ia_ec_state_str * pstr_ec_state,WORD32 frame_status)248*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_aac_ec_state(ia_ec_state_str *pstr_ec_state, WORD32 frame_status) {
249*15dc779aSAndroid Build Coastguard Worker   WORD32 ec_state_val = (pstr_ec_state->prev_frame_ok[0] << 2) +
250*15dc779aSAndroid Build Coastguard Worker                         (pstr_ec_state->prev_frame_ok[1] << 1) + (frame_status);
251*15dc779aSAndroid Build Coastguard Worker 
252*15dc779aSAndroid Build Coastguard Worker   switch (ec_state_val) {
253*15dc779aSAndroid Build Coastguard Worker     case 0:
254*15dc779aSAndroid Build Coastguard Worker     case 4:
255*15dc779aSAndroid Build Coastguard Worker       if (pstr_ec_state->fade_idx < MAX_FADE_FRAMES) {
256*15dc779aSAndroid Build Coastguard Worker         pstr_ec_state->fade_idx++;
257*15dc779aSAndroid Build Coastguard Worker       }
258*15dc779aSAndroid Build Coastguard Worker       pstr_ec_state->conceal_state = FRAME_CONCEAL_SINGLE;
259*15dc779aSAndroid Build Coastguard Worker       break;
260*15dc779aSAndroid Build Coastguard Worker     case 1:
261*15dc779aSAndroid Build Coastguard Worker     case 2:
262*15dc779aSAndroid Build Coastguard Worker       if (pstr_ec_state->fade_idx > 0) {
263*15dc779aSAndroid Build Coastguard Worker         pstr_ec_state->fade_idx--;
264*15dc779aSAndroid Build Coastguard Worker       }
265*15dc779aSAndroid Build Coastguard Worker       pstr_ec_state->conceal_state = FRAME_FADE;
266*15dc779aSAndroid Build Coastguard Worker       break;
267*15dc779aSAndroid Build Coastguard Worker     case 5:
268*15dc779aSAndroid Build Coastguard Worker       if (pstr_ec_state->fade_idx > 0) {
269*15dc779aSAndroid Build Coastguard Worker         pstr_ec_state->fade_idx--;
270*15dc779aSAndroid Build Coastguard Worker       }
271*15dc779aSAndroid Build Coastguard Worker       pstr_ec_state->conceal_state = FRAME_OKAY;
272*15dc779aSAndroid Build Coastguard Worker       break;
273*15dc779aSAndroid Build Coastguard Worker       break;
274*15dc779aSAndroid Build Coastguard Worker     case 3:
275*15dc779aSAndroid Build Coastguard Worker     case 6:
276*15dc779aSAndroid Build Coastguard Worker     case 7:
277*15dc779aSAndroid Build Coastguard Worker       if (pstr_ec_state->fade_idx > 0) {
278*15dc779aSAndroid Build Coastguard Worker         pstr_ec_state->fade_idx--;
279*15dc779aSAndroid Build Coastguard Worker       }
280*15dc779aSAndroid Build Coastguard Worker       pstr_ec_state->conceal_state = FRAME_OKAY;
281*15dc779aSAndroid Build Coastguard Worker       break;
282*15dc779aSAndroid Build Coastguard Worker     default:
283*15dc779aSAndroid Build Coastguard Worker       pstr_ec_state->conceal_state = FRAME_OKAY;
284*15dc779aSAndroid Build Coastguard Worker   }
285*15dc779aSAndroid Build Coastguard Worker   if (pstr_ec_state->fade_idx > MAX_FADE_FRAMES) {
286*15dc779aSAndroid Build Coastguard Worker     pstr_ec_state->fade_idx = MAX_FADE_FRAMES;
287*15dc779aSAndroid Build Coastguard Worker   }
288*15dc779aSAndroid Build Coastguard Worker   if (pstr_ec_state->fade_idx == MAX_FADE_FRAMES) {
289*15dc779aSAndroid Build Coastguard Worker     pstr_ec_state->conceal_state = FRAME_MUTE;
290*15dc779aSAndroid Build Coastguard Worker   }
291*15dc779aSAndroid Build Coastguard Worker   if (pstr_ec_state->fade_idx < 0) {
292*15dc779aSAndroid Build Coastguard Worker     pstr_ec_state->fade_idx = 0;
293*15dc779aSAndroid Build Coastguard Worker   }
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_interpolate_frame(ia_ec_state_str * pstr_ec_state,ia_aac_dec_channel_info_struct * pstr_aac_dec_channel_info,const ia_usac_samp_rate_info * pstr_samp_rate_info,const WORD32 num_samples,const WORD32 frame_status,ia_ics_info_struct * pstr_ics_info)296*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_aac_ec_interpolate_frame(
297*15dc779aSAndroid Build Coastguard Worker     ia_ec_state_str *pstr_ec_state, ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
298*15dc779aSAndroid Build Coastguard Worker     const ia_usac_samp_rate_info *pstr_samp_rate_info, const WORD32 num_samples,
299*15dc779aSAndroid Build Coastguard Worker     const WORD32 frame_status, ia_ics_info_struct *pstr_ics_info) {
300*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_spec_coeff = pstr_aac_dec_channel_info->ptr_spec_coeff;
301*15dc779aSAndroid Build Coastguard Worker   WORD16 *ptr_spec_scale = pstr_aac_dec_channel_info->ptr_scale_factor;
302*15dc779aSAndroid Build Coastguard Worker 
303*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_nrg_prev[WIN_LEN_64];
304*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_nrg_act[WIN_LEN_64];
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker   WORD32 idx;
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker   memset(sfb_nrg_prev, 0, sizeof(sfb_nrg_prev));
309*15dc779aSAndroid Build Coastguard Worker   memset(sfb_nrg_act, 0, sizeof(sfb_nrg_act));
310*15dc779aSAndroid Build Coastguard Worker 
311*15dc779aSAndroid Build Coastguard Worker   if (!frame_status) {
312*15dc779aSAndroid Build Coastguard Worker     pstr_ics_info->window_shape = pstr_ec_state->win_shape;
313*15dc779aSAndroid Build Coastguard Worker     pstr_ics_info->window_sequence = pstr_ec_state->win_seq;
314*15dc779aSAndroid Build Coastguard Worker 
315*15dc779aSAndroid Build Coastguard Worker     for (idx = 0; idx < num_samples; idx++) {
316*15dc779aSAndroid Build Coastguard Worker       ptr_spec_coeff[idx] = pstr_ec_state->spectral_coeff[idx];
317*15dc779aSAndroid Build Coastguard Worker     }
318*15dc779aSAndroid Build Coastguard Worker 
319*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_spec_scale, pstr_ec_state->q_spec_coeff, 8 * sizeof(ptr_spec_scale[0]));
320*15dc779aSAndroid Build Coastguard Worker   }
321*15dc779aSAndroid Build Coastguard Worker 
322*15dc779aSAndroid Build Coastguard Worker   if (!pstr_ec_state->prev_frame_ok[1]) {
323*15dc779aSAndroid Build Coastguard Worker     if (frame_status && pstr_ec_state->prev_frame_ok[0]) {
324*15dc779aSAndroid Build Coastguard Worker       if (pstr_ics_info->window_sequence == EIGHT_SHORT_SEQUENCE) {
325*15dc779aSAndroid Build Coastguard Worker         WORD32 window;
326*15dc779aSAndroid Build Coastguard Worker         if (pstr_ec_state->win_seq == EIGHT_SHORT_SEQUENCE) {
327*15dc779aSAndroid Build Coastguard Worker           WORD32 total_scale_factor_bands = pstr_samp_rate_info->num_sfb_128 - 1;
328*15dc779aSAndroid Build Coastguard Worker           const WORD16 *ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_128;
329*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_shape = 1;
330*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_sequence = EIGHT_SHORT_SEQUENCE;
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker           for (window = 0; window < 8; window++) {
333*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_ec_calc_sfb_nrg(&ptr_spec_coeff[window * (num_samples / 8)],
334*15dc779aSAndroid Build Coastguard Worker                                          pstr_samp_rate_info, EIGHT_SHORT_SEQUENCE, NO_TRANSITION,
335*15dc779aSAndroid Build Coastguard Worker                                          sfb_nrg_prev);
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_ec_calc_sfb_nrg(
338*15dc779aSAndroid Build Coastguard Worker                 &pstr_ec_state->spectral_coeff[window * (num_samples / 8)], pstr_samp_rate_info,
339*15dc779aSAndroid Build Coastguard Worker                 EIGHT_SHORT_SEQUENCE, NO_TRANSITION, sfb_nrg_act);
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_ec_interpolate(
342*15dc779aSAndroid Build Coastguard Worker                 &ptr_spec_coeff[window * (num_samples / 8)], &ptr_spec_scale[window],
343*15dc779aSAndroid Build Coastguard Worker                 &pstr_ec_state->q_spec_coeff[window], &ptr_spec_scale[window], sfb_nrg_prev,
344*15dc779aSAndroid Build Coastguard Worker                 sfb_nrg_act, total_scale_factor_bands, ptr_sfb_offset);
345*15dc779aSAndroid Build Coastguard Worker           }
346*15dc779aSAndroid Build Coastguard Worker         } else {
347*15dc779aSAndroid Build Coastguard Worker           WORD32 total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
348*15dc779aSAndroid Build Coastguard Worker           const WORD16 *ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
349*15dc779aSAndroid Build Coastguard Worker           WORD16 spec_scale_out;
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_ec_calc_sfb_nrg(&ptr_spec_coeff[num_samples - (num_samples / 8)],
352*15dc779aSAndroid Build Coastguard Worker                                        pstr_samp_rate_info, EIGHT_SHORT_SEQUENCE,
353*15dc779aSAndroid Build Coastguard Worker                                        TRANS_SHORT_LONG, sfb_nrg_act);
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_ec_calc_sfb_nrg(pstr_ec_state->spectral_coeff, pstr_samp_rate_info,
356*15dc779aSAndroid Build Coastguard Worker                                        ONLY_LONG_SEQUENCE, NO_TRANSITION, sfb_nrg_prev);
357*15dc779aSAndroid Build Coastguard Worker 
358*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_shape = 0;
359*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_sequence = LONG_STOP_SEQUENCE;
360*15dc779aSAndroid Build Coastguard Worker 
361*15dc779aSAndroid Build Coastguard Worker           for (idx = 0; idx < num_samples; idx++) {
362*15dc779aSAndroid Build Coastguard Worker             ptr_spec_coeff[idx] = pstr_ec_state->spectral_coeff[idx];
363*15dc779aSAndroid Build Coastguard Worker           }
364*15dc779aSAndroid Build Coastguard Worker 
365*15dc779aSAndroid Build Coastguard Worker           for (idx = 0; idx < 8; idx++) {
366*15dc779aSAndroid Build Coastguard Worker             if (ptr_spec_scale[idx] > ptr_spec_scale[0]) {
367*15dc779aSAndroid Build Coastguard Worker               ptr_spec_scale[0] = ptr_spec_scale[idx];
368*15dc779aSAndroid Build Coastguard Worker             }
369*15dc779aSAndroid Build Coastguard Worker           }
370*15dc779aSAndroid Build Coastguard Worker 
371*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_ec_interpolate(ptr_spec_coeff, &pstr_ec_state->q_spec_coeff[0],
372*15dc779aSAndroid Build Coastguard Worker                                       &ptr_spec_scale[0], &spec_scale_out, sfb_nrg_prev,
373*15dc779aSAndroid Build Coastguard Worker                                       sfb_nrg_act, total_scale_factor_bands, ptr_sfb_offset);
374*15dc779aSAndroid Build Coastguard Worker 
375*15dc779aSAndroid Build Coastguard Worker           ptr_spec_scale[0] = spec_scale_out;
376*15dc779aSAndroid Build Coastguard Worker         }
377*15dc779aSAndroid Build Coastguard Worker       } else {
378*15dc779aSAndroid Build Coastguard Worker         WORD32 total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
379*15dc779aSAndroid Build Coastguard Worker         const WORD16 *ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
380*15dc779aSAndroid Build Coastguard Worker         WORD16 spec_scale_act = pstr_ec_state->q_spec_coeff[0];
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_ec_calc_sfb_nrg(ptr_spec_coeff, pstr_samp_rate_info, ONLY_LONG_SEQUENCE,
383*15dc779aSAndroid Build Coastguard Worker                                      NO_TRANSITION, sfb_nrg_prev);
384*15dc779aSAndroid Build Coastguard Worker 
385*15dc779aSAndroid Build Coastguard Worker         if (pstr_ec_state->win_seq == EIGHT_SHORT_SEQUENCE) {
386*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_shape = 1;
387*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_sequence = LONG_START_SEQUENCE;
388*15dc779aSAndroid Build Coastguard Worker 
389*15dc779aSAndroid Build Coastguard Worker           for (idx = 1; idx < 8; idx++) {
390*15dc779aSAndroid Build Coastguard Worker             if (pstr_ec_state->q_spec_coeff[idx] > spec_scale_act) {
391*15dc779aSAndroid Build Coastguard Worker               spec_scale_act = pstr_ec_state->q_spec_coeff[idx];
392*15dc779aSAndroid Build Coastguard Worker             }
393*15dc779aSAndroid Build Coastguard Worker           }
394*15dc779aSAndroid Build Coastguard Worker 
395*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_ec_calc_sfb_nrg(pstr_ec_state->spectral_coeff, pstr_samp_rate_info,
396*15dc779aSAndroid Build Coastguard Worker                                        EIGHT_SHORT_SEQUENCE, TRANS_SHORT_LONG, sfb_nrg_act);
397*15dc779aSAndroid Build Coastguard Worker         } else {
398*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_shape = 0;
399*15dc779aSAndroid Build Coastguard Worker           pstr_ics_info->window_sequence = ONLY_LONG_SEQUENCE;
400*15dc779aSAndroid Build Coastguard Worker 
401*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_ec_calc_sfb_nrg(pstr_ec_state->spectral_coeff, pstr_samp_rate_info,
402*15dc779aSAndroid Build Coastguard Worker                                        ONLY_LONG_SEQUENCE, NO_TRANSITION, sfb_nrg_act);
403*15dc779aSAndroid Build Coastguard Worker         }
404*15dc779aSAndroid Build Coastguard Worker 
405*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_ec_interpolate(ptr_spec_coeff, &ptr_spec_scale[0], &spec_scale_act,
406*15dc779aSAndroid Build Coastguard Worker                                     &ptr_spec_scale[0], sfb_nrg_prev, sfb_nrg_act,
407*15dc779aSAndroid Build Coastguard Worker                                     total_scale_factor_bands, ptr_sfb_offset);
408*15dc779aSAndroid Build Coastguard Worker       }
409*15dc779aSAndroid Build Coastguard Worker     }
410*15dc779aSAndroid Build Coastguard Worker 
411*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_ec_flip_spec_sign(ptr_spec_coeff, num_samples);
412*15dc779aSAndroid Build Coastguard Worker   }
413*15dc779aSAndroid Build Coastguard Worker 
414*15dc779aSAndroid Build Coastguard Worker   if (FRAME_MUTE == pstr_ec_state->conceal_state) {
415*15dc779aSAndroid Build Coastguard Worker     pstr_ics_info->window_shape = pstr_ec_state->win_shape;
416*15dc779aSAndroid Build Coastguard Worker     pstr_ics_info->window_sequence = ixheaacd_aac_ec_get_win_seq(pstr_ec_state->win_seq);
417*15dc779aSAndroid Build Coastguard Worker     pstr_ec_state->win_seq = pstr_ics_info->window_sequence;
418*15dc779aSAndroid Build Coastguard Worker     memset(ptr_spec_coeff, 0, num_samples * sizeof(ptr_spec_coeff[0]));
419*15dc779aSAndroid Build Coastguard Worker   }
420*15dc779aSAndroid Build Coastguard Worker }
421*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_ec_init(ia_ec_state_str * pstr_ec_state)422*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_aac_ec_init(ia_ec_state_str *pstr_ec_state) {
423*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->win_shape = CONCEAL_NOT_DEFINED;
424*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->win_seq = ONLY_LONG_SEQUENCE;
425*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->prev_win_group_len = 1;
426*15dc779aSAndroid Build Coastguard Worker 
427*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->conceal_state = FRAME_OKAY;
428*15dc779aSAndroid Build Coastguard Worker 
429*15dc779aSAndroid Build Coastguard Worker   memset(pstr_ec_state->spectral_coeff, 0, sizeof(pstr_ec_state->spectral_coeff));
430*15dc779aSAndroid Build Coastguard Worker   memset(pstr_ec_state->q_spec_coeff, 0, sizeof(pstr_ec_state->q_spec_coeff));
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->prev_frame_ok[0] = 1;
433*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->prev_frame_ok[1] = 1;
434*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->fade_idx = 0;
435*15dc779aSAndroid Build Coastguard Worker }
436*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_aac_apply_ec(ia_ec_state_str * pstr_ec_state,ia_aac_dec_channel_info_struct * pstr_aac_dec_channel_info,const ia_usac_samp_rate_info * pstr_samp_rate_info,const WORD32 num_samples,ia_ics_info_struct * pstr_ics_info,const WORD32 frame_status)437*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_aac_apply_ec(ia_ec_state_str *pstr_ec_state,
438*15dc779aSAndroid Build Coastguard Worker                            ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
439*15dc779aSAndroid Build Coastguard Worker                            const ia_usac_samp_rate_info *pstr_samp_rate_info,
440*15dc779aSAndroid Build Coastguard Worker                            const WORD32 num_samples, ia_ics_info_struct *pstr_ics_info,
441*15dc779aSAndroid Build Coastguard Worker                            const WORD32 frame_status) {
442*15dc779aSAndroid Build Coastguard Worker   if (pstr_ec_state->win_shape == CONCEAL_NOT_DEFINED) {
443*15dc779aSAndroid Build Coastguard Worker     pstr_ec_state->win_shape = (UWORD8)pstr_ics_info->window_shape;
444*15dc779aSAndroid Build Coastguard Worker   }
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker   if (frame_status && pstr_ec_state->prev_frame_ok[1]) {
447*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_ec_store(pstr_ec_state, pstr_aac_dec_channel_info, pstr_ics_info);
448*15dc779aSAndroid Build Coastguard Worker   }
449*15dc779aSAndroid Build Coastguard Worker 
450*15dc779aSAndroid Build Coastguard Worker   ixheaacd_aac_ec_state(pstr_ec_state, frame_status);
451*15dc779aSAndroid Build Coastguard Worker 
452*15dc779aSAndroid Build Coastguard Worker   ixheaacd_aac_ec_interpolate_frame(pstr_ec_state, pstr_aac_dec_channel_info, pstr_samp_rate_info,
453*15dc779aSAndroid Build Coastguard Worker                                     num_samples, frame_status, pstr_ics_info);
454*15dc779aSAndroid Build Coastguard Worker 
455*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->prev_frame_ok[0] = pstr_ec_state->prev_frame_ok[1];
456*15dc779aSAndroid Build Coastguard Worker   pstr_ec_state->prev_frame_ok[1] = frame_status;
457*15dc779aSAndroid Build Coastguard Worker }
458