1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 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 #include <stdio.h>
21*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include <string.h>
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
26*15dc779aSAndroid Build Coastguard Worker
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_rom.h"
29*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pvc_sb_parsing(ia_pvc_data_struct * ptr_pvc_data,WORD16 first_bnd_idx,FLOAT32 * p_qmfh)30*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_pvc_sb_parsing(ia_pvc_data_struct *ptr_pvc_data,
31*15dc779aSAndroid Build Coastguard Worker WORD16 first_bnd_idx, FLOAT32 *p_qmfh) {
32*15dc779aSAndroid Build Coastguard Worker WORD32 ksg, k;
33*15dc779aSAndroid Build Coastguard Worker WORD32 start_band, end_band;
34*15dc779aSAndroid Build Coastguard Worker WORD32 time_slot;
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_sbr_range_esg = &ptr_pvc_data->sbr_range_esg_arr[0];
37*15dc779aSAndroid Build Coastguard Worker
38*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < PVC_NUM_TIME_SLOTS; time_slot++) {
39*15dc779aSAndroid Build Coastguard Worker start_band = first_bnd_idx;
40*15dc779aSAndroid Build Coastguard Worker end_band = start_band + ptr_pvc_data->nb_high_per_grp - 1;
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker for (ksg = 0; ksg < ptr_pvc_data->nb_high; ksg++) {
43*15dc779aSAndroid Build Coastguard Worker for (k = start_band; k <= end_band; k++) {
44*15dc779aSAndroid Build Coastguard Worker p_qmfh[k] = (FLOAT32)pow(10.0f, (p_sbr_range_esg[ksg] / 10.0));
45*15dc779aSAndroid Build Coastguard Worker }
46*15dc779aSAndroid Build Coastguard Worker start_band += ptr_pvc_data->nb_high_per_grp;
47*15dc779aSAndroid Build Coastguard Worker if (ksg >= ptr_pvc_data->nb_high - 2) {
48*15dc779aSAndroid Build Coastguard Worker end_band = SBR_NUM_QMF_BANDS - 1;
49*15dc779aSAndroid Build Coastguard Worker } else {
50*15dc779aSAndroid Build Coastguard Worker end_band = start_band + ptr_pvc_data->nb_high_per_grp - 1;
51*15dc779aSAndroid Build Coastguard Worker if (end_band >= SBR_NUM_QMF_BANDS - 1) {
52*15dc779aSAndroid Build Coastguard Worker end_band = SBR_NUM_QMF_BANDS - 1;
53*15dc779aSAndroid Build Coastguard Worker }
54*15dc779aSAndroid Build Coastguard Worker }
55*15dc779aSAndroid Build Coastguard Worker }
56*15dc779aSAndroid Build Coastguard Worker p_sbr_range_esg = p_sbr_range_esg + 8;
57*15dc779aSAndroid Build Coastguard Worker p_qmfh = p_qmfh + SBR_NUM_QMF_BANDS;
58*15dc779aSAndroid Build Coastguard Worker }
59*15dc779aSAndroid Build Coastguard Worker return;
60*15dc779aSAndroid Build Coastguard Worker }
61*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pvc_qmf_grouping(ia_pvc_data_struct * ptr_pvc_data,WORD16 first_bnd_idx,FLOAT32 * p_qmf_ener,WORD32 first_pvc_timeslot)62*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_pvc_qmf_grouping(ia_pvc_data_struct *ptr_pvc_data,
63*15dc779aSAndroid Build Coastguard Worker WORD16 first_bnd_idx, FLOAT32 *p_qmf_ener,
64*15dc779aSAndroid Build Coastguard Worker WORD32 first_pvc_timeslot) {
65*15dc779aSAndroid Build Coastguard Worker WORD32 ksg, time_slot, ib;
66*15dc779aSAndroid Build Coastguard Worker WORD32 lbw, start_band, end_band;
67*15dc779aSAndroid Build Coastguard Worker FLOAT32 esg;
68*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_esg = (FLOAT32 *)ptr_pvc_data->esg;
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker lbw = 8 / ptr_pvc_data->pvc_rate;
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < PVC_NUM_TIME_SLOTS; time_slot++) {
73*15dc779aSAndroid Build Coastguard Worker for (ksg = 0; ksg < PVC_NB_LOW; ksg++) {
74*15dc779aSAndroid Build Coastguard Worker start_band = first_bnd_idx - lbw * PVC_NB_LOW + lbw * ksg;
75*15dc779aSAndroid Build Coastguard Worker end_band = start_band + lbw - 1;
76*15dc779aSAndroid Build Coastguard Worker if (start_band >= 0) {
77*15dc779aSAndroid Build Coastguard Worker esg = 0.0f;
78*15dc779aSAndroid Build Coastguard Worker for (ib = start_band; ib <= end_band; ib++) {
79*15dc779aSAndroid Build Coastguard Worker esg += p_qmf_ener[ib];
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker esg = esg / lbw;
82*15dc779aSAndroid Build Coastguard Worker } else {
83*15dc779aSAndroid Build Coastguard Worker esg = PVC_ESG_MIN_VAL;
84*15dc779aSAndroid Build Coastguard Worker }
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker if (esg > PVC_ESG_MIN_VAL) {
87*15dc779aSAndroid Build Coastguard Worker p_esg[(time_slot + 16 - 1) * 3 + ksg] = 10 * ((FLOAT32)log10(esg));
88*15dc779aSAndroid Build Coastguard Worker } else {
89*15dc779aSAndroid Build Coastguard Worker p_esg[(time_slot + 16 - 1) * 3 + ksg] = PVC_10LOG10_ESG_MIN_VAL;
90*15dc779aSAndroid Build Coastguard Worker }
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker p_qmf_ener = p_qmf_ener + SBR_NUM_QMF_BANDS_2;
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker if ((ptr_pvc_data->prev_pvc_flg == 0) ||
96*15dc779aSAndroid Build Coastguard Worker ((first_bnd_idx * ptr_pvc_data->pvc_rate) !=
97*15dc779aSAndroid Build Coastguard Worker (ptr_pvc_data->prev_first_bnd_idx * ptr_pvc_data->prev_pvc_rate))) {
98*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < 16 - 1 + first_pvc_timeslot; time_slot++) {
99*15dc779aSAndroid Build Coastguard Worker for (ksg = 0; ksg < PVC_NB_LOW; ksg++) {
100*15dc779aSAndroid Build Coastguard Worker p_esg[time_slot * 3 + ksg] =
101*15dc779aSAndroid Build Coastguard Worker p_esg[(16 - 1 + first_pvc_timeslot) * 3 + ksg];
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker }
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
ixheaacd_pvc_time_smoothing(ia_pvc_data_struct * ptr_pvc_data)109*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_pvc_time_smoothing(ia_pvc_data_struct *ptr_pvc_data) {
110*15dc779aSAndroid Build Coastguard Worker WORD32 time_slot;
111*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_smooth_esg = (FLOAT32 *)&ptr_pvc_data->smooth_esg_arr[0];
112*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < PVC_NUM_TIME_SLOTS; time_slot++) {
113*15dc779aSAndroid Build Coastguard Worker WORD32 ksg, time_slot_idx;
114*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_esg = (FLOAT32 *)&ptr_pvc_data->esg[time_slot + 16 - 1][2];
115*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_smth_wind_coeff = (FLOAT32 *)&ptr_pvc_data->p_smth_wind_coeff[0];
116*15dc779aSAndroid Build Coastguard Worker memset(p_smooth_esg, (WORD32)0.f, sizeof(FLOAT32) * PVC_NB_LOW);
117*15dc779aSAndroid Build Coastguard Worker for (time_slot_idx = 0; time_slot_idx < ptr_pvc_data->num_time_slots;
118*15dc779aSAndroid Build Coastguard Worker time_slot_idx++) {
119*15dc779aSAndroid Build Coastguard Worker ksg = PVC_NB_LOW - 1;
120*15dc779aSAndroid Build Coastguard Worker for (; ksg >= 0; ksg--) {
121*15dc779aSAndroid Build Coastguard Worker p_smooth_esg[ksg] += (*p_esg) * (*p_smth_wind_coeff);
122*15dc779aSAndroid Build Coastguard Worker p_esg--;
123*15dc779aSAndroid Build Coastguard Worker }
124*15dc779aSAndroid Build Coastguard Worker p_smth_wind_coeff++;
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker p_smooth_esg = p_smooth_esg + 3;
127*15dc779aSAndroid Build Coastguard Worker }
128*15dc779aSAndroid Build Coastguard Worker return;
129*15dc779aSAndroid Build Coastguard Worker }
130*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pvc_pred_env_sf(ia_pvc_data_struct * ptr_pvc_data)131*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_pvc_pred_env_sf(ia_pvc_data_struct *ptr_pvc_data) {
132*15dc779aSAndroid Build Coastguard Worker WORD32 ksg, kb;
133*15dc779aSAndroid Build Coastguard Worker WORD32 tab_1_index, tab_2_index;
134*15dc779aSAndroid Build Coastguard Worker WORD32 time_slot;
135*15dc779aSAndroid Build Coastguard Worker WORD8 *pred_tab_1, *pred_tab_2;
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp;
138*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_smooth_esg = &ptr_pvc_data->smooth_esg_arr[0];
139*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_sbr_range_esg = &ptr_pvc_data->sbr_range_esg_arr[0];
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker for (time_slot = 0; time_slot < PVC_NUM_TIME_SLOTS; time_slot++) {
142*15dc779aSAndroid Build Coastguard Worker tab_2_index = ptr_pvc_data->pvc_id[time_slot];
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker if (tab_2_index < ptr_pvc_data->p_pvc_id_boundary[0]) {
145*15dc779aSAndroid Build Coastguard Worker tab_1_index = 0;
146*15dc779aSAndroid Build Coastguard Worker } else if (tab_2_index < ptr_pvc_data->p_pvc_id_boundary[1]) {
147*15dc779aSAndroid Build Coastguard Worker tab_1_index = 1;
148*15dc779aSAndroid Build Coastguard Worker } else {
149*15dc779aSAndroid Build Coastguard Worker tab_1_index = 2;
150*15dc779aSAndroid Build Coastguard Worker }
151*15dc779aSAndroid Build Coastguard Worker
152*15dc779aSAndroid Build Coastguard Worker pred_tab_1 =
153*15dc779aSAndroid Build Coastguard Worker (WORD8 *)(&(ptr_pvc_data->p_pred_coeff_tab_1[tab_1_index * PVC_NB_LOW *
154*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->nb_high]));
155*15dc779aSAndroid Build Coastguard Worker pred_tab_2 = (WORD8 *)(&(
156*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pred_coeff_tab_2[tab_2_index * ptr_pvc_data->nb_high]));
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker for (ksg = 0; ksg < ptr_pvc_data->nb_high; ksg++) {
159*15dc779aSAndroid Build Coastguard Worker temp =
160*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(WORD8)(*(pred_tab_2++)) * ptr_pvc_data->p_q_fac[PVC_NB_LOW];
161*15dc779aSAndroid Build Coastguard Worker p_sbr_range_esg[ksg] = temp;
162*15dc779aSAndroid Build Coastguard Worker }
163*15dc779aSAndroid Build Coastguard Worker for (kb = 0; kb < PVC_NB_LOW; kb++) {
164*15dc779aSAndroid Build Coastguard Worker for (ksg = 0; ksg < ptr_pvc_data->nb_high; ksg++) {
165*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)(WORD8)(*(pred_tab_1++)) * ptr_pvc_data->p_q_fac[kb];
166*15dc779aSAndroid Build Coastguard Worker p_sbr_range_esg[ksg] += temp * p_smooth_esg[kb];
167*15dc779aSAndroid Build Coastguard Worker }
168*15dc779aSAndroid Build Coastguard Worker }
169*15dc779aSAndroid Build Coastguard Worker p_smooth_esg = p_smooth_esg + 3;
170*15dc779aSAndroid Build Coastguard Worker p_sbr_range_esg = p_sbr_range_esg + 8;
171*15dc779aSAndroid Build Coastguard Worker }
172*15dc779aSAndroid Build Coastguard Worker
173*15dc779aSAndroid Build Coastguard Worker return;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pvc_process(ia_pvc_data_struct * ptr_pvc_data,WORD16 first_bnd_idx,WORD32 first_pvc_timeslot,FLOAT32 * p_qmf_ener,FLOAT32 * p_qmfh)176*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_pvc_process(ia_pvc_data_struct *ptr_pvc_data,
177*15dc779aSAndroid Build Coastguard Worker WORD16 first_bnd_idx, WORD32 first_pvc_timeslot,
178*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_qmf_ener, FLOAT32 *p_qmfh) {
179*15dc779aSAndroid Build Coastguard Worker switch (ptr_pvc_data->pvc_mode) {
180*15dc779aSAndroid Build Coastguard Worker case 1:
181*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->nb_high = PVC_NB_HIGH_MODE1;
182*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->nb_high_per_grp = 8 / ptr_pvc_data->pvc_rate;
183*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pred_coeff_tab_1 =
184*15dc779aSAndroid Build Coastguard Worker (WORD8 *)ixheaacd_pred_coeff_table_1_mode_1;
185*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pred_coeff_tab_2 =
186*15dc779aSAndroid Build Coastguard Worker (WORD8 *)ixheaacd_pred_coeff_table_2_mode_1;
187*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pvc_id_boundary =
188*15dc779aSAndroid Build Coastguard Worker (UWORD8 *)ixheaacd_pred_coeff_pvc_id_boundaries_1;
189*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_q_fac = (FLOAT32 *)ixheaacd_q_factor_table_mode_1;
190*15dc779aSAndroid Build Coastguard Worker if (ptr_pvc_data->ns_mode) {
191*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->num_time_slots = 4;
192*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_smth_wind_coeff =
193*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ixheaacd_pvc_smoothing_wind_tab_ns4;
194*15dc779aSAndroid Build Coastguard Worker } else {
195*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->num_time_slots = 16;
196*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_smth_wind_coeff =
197*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ixheaacd_pvc_smoothing_wind_tab_ns16;
198*15dc779aSAndroid Build Coastguard Worker }
199*15dc779aSAndroid Build Coastguard Worker break;
200*15dc779aSAndroid Build Coastguard Worker case 2:
201*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->nb_high = PVC_NB_HIGH_MODE2;
202*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->nb_high_per_grp = 12 / ptr_pvc_data->pvc_rate;
203*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pred_coeff_tab_1 =
204*15dc779aSAndroid Build Coastguard Worker (WORD8 *)ixheaacd_pred_coeff_table_1_mode_2;
205*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pred_coeff_tab_2 =
206*15dc779aSAndroid Build Coastguard Worker (WORD8 *)ixheaacd_pred_coeff_table_2_mode_2;
207*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_pvc_id_boundary =
208*15dc779aSAndroid Build Coastguard Worker (UWORD8 *)ixheaacd_pred_coeff_pvc_id_boundaries_2;
209*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_q_fac = (FLOAT32 *)ixheaacd_q_factor_table_mode_2;
210*15dc779aSAndroid Build Coastguard Worker if (ptr_pvc_data->ns_mode) {
211*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->num_time_slots = 3;
212*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_smth_wind_coeff =
213*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ixheaacd_pvc_smoothing_wind_tab_ns3;
214*15dc779aSAndroid Build Coastguard Worker } else {
215*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->num_time_slots = 12;
216*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->p_smth_wind_coeff =
217*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)ixheaacd_pvc_smoothing_wind_tab_ns12;
218*15dc779aSAndroid Build Coastguard Worker }
219*15dc779aSAndroid Build Coastguard Worker break;
220*15dc779aSAndroid Build Coastguard Worker default:
221*15dc779aSAndroid Build Coastguard Worker return -1;
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->prev_pvc_id = ptr_pvc_data->pvc_id[PVC_NUM_TIME_SLOTS - 1];
224*15dc779aSAndroid Build Coastguard Worker
225*15dc779aSAndroid Build Coastguard Worker ixheaacd_pvc_qmf_grouping(ptr_pvc_data, first_bnd_idx, p_qmf_ener,
226*15dc779aSAndroid Build Coastguard Worker first_pvc_timeslot);
227*15dc779aSAndroid Build Coastguard Worker
228*15dc779aSAndroid Build Coastguard Worker ixheaacd_pvc_time_smoothing(ptr_pvc_data);
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker ixheaacd_pvc_pred_env_sf(ptr_pvc_data);
231*15dc779aSAndroid Build Coastguard Worker
232*15dc779aSAndroid Build Coastguard Worker ixheaacd_pvc_sb_parsing(ptr_pvc_data, first_bnd_idx, p_qmfh);
233*15dc779aSAndroid Build Coastguard Worker
234*15dc779aSAndroid Build Coastguard Worker memcpy((FLOAT32 *)(&ptr_pvc_data->esg[0][0]),
235*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)(&ptr_pvc_data->esg[PVC_NUM_TIME_SLOTS][0]),
236*15dc779aSAndroid Build Coastguard Worker sizeof(FLOAT32) * (PVC_NUM_TIME_SLOTS - 1) * 3);
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker return 0;
239*15dc779aSAndroid Build Coastguard Worker }
240