xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_mps_res_block.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 #include "ixheaac_type_def.h"
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_block.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_huffman.h"
31*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_extract_symbol(WORD32 value,WORD32 l_shift,WORD32 r_shift,WORD32 * pow_table_q17)32*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_res_extract_symbol(WORD32 value, WORD32 l_shift,
33*15dc779aSAndroid Build Coastguard Worker                                                           WORD32 r_shift, WORD32 *pow_table_q17) {
34*15dc779aSAndroid Build Coastguard Worker   WORD32 out;
35*15dc779aSAndroid Build Coastguard Worker   out = (WORD16)((value << l_shift) >> r_shift);
36*15dc779aSAndroid Build Coastguard Worker 
37*15dc779aSAndroid Build Coastguard Worker   if (out < 0) {
38*15dc779aSAndroid Build Coastguard Worker     out = -out;
39*15dc779aSAndroid Build Coastguard Worker     out = pow_table_q17[out];
40*15dc779aSAndroid Build Coastguard Worker     out = -out;
41*15dc779aSAndroid Build Coastguard Worker   } else
42*15dc779aSAndroid Build Coastguard Worker     out = pow_table_q17[out];
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker   return out;
45*15dc779aSAndroid Build Coastguard Worker }
46*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_extract_signed_symbol(WORD32 value,WORD32 l_shift,WORD32 r_shift,WORD32 * pow_table_q17,WORD32 * temp_word,WORD32 * pr_bit_pos)47*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_res_extract_signed_symbol(WORD32 value, WORD32 l_shift,
48*15dc779aSAndroid Build Coastguard Worker                                                                  WORD32 r_shift,
49*15dc779aSAndroid Build Coastguard Worker                                                                  WORD32 *pow_table_q17,
50*15dc779aSAndroid Build Coastguard Worker                                                                  WORD32 *temp_word,
51*15dc779aSAndroid Build Coastguard Worker                                                                  WORD32 *pr_bit_pos) {
52*15dc779aSAndroid Build Coastguard Worker   WORD32 out;
53*15dc779aSAndroid Build Coastguard Worker   out = ixheaac_extu(value, l_shift, r_shift);
54*15dc779aSAndroid Build Coastguard Worker   if (out) {
55*15dc779aSAndroid Build Coastguard Worker     WORD32 bit_pos = *pr_bit_pos;
56*15dc779aSAndroid Build Coastguard Worker     out = pow_table_q17[out];
57*15dc779aSAndroid Build Coastguard Worker     if (*temp_word & 0x80000000) {
58*15dc779aSAndroid Build Coastguard Worker       out = -out;
59*15dc779aSAndroid Build Coastguard Worker     }
60*15dc779aSAndroid Build Coastguard Worker     *temp_word = *temp_word << 1;
61*15dc779aSAndroid Build Coastguard Worker     bit_pos++;
62*15dc779aSAndroid Build Coastguard Worker     *pr_bit_pos = bit_pos;
63*15dc779aSAndroid Build Coastguard Worker   }
64*15dc779aSAndroid Build Coastguard Worker   return out;
65*15dc779aSAndroid Build Coastguard Worker }
66*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_inverse_quant_lb(WORD32 * x_invquant,WORD t_bands,WORD32 * pow_table_q17,WORD8 * pulse_data)67*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_res_inverse_quant_lb(WORD32 *x_invquant, WORD t_bands, WORD32 *pow_table_q17,
68*15dc779aSAndroid Build Coastguard Worker                                    WORD8 *pulse_data) {
69*15dc779aSAndroid Build Coastguard Worker   WORD32 j;
70*15dc779aSAndroid Build Coastguard Worker   WORD32 temp;
71*15dc779aSAndroid Build Coastguard Worker   WORD32 q_abs;
72*15dc779aSAndroid Build Coastguard Worker 
73*15dc779aSAndroid Build Coastguard Worker   for (j = t_bands - 1; j >= 0; j--) {
74*15dc779aSAndroid Build Coastguard Worker     q_abs = *pulse_data++;
75*15dc779aSAndroid Build Coastguard Worker     temp = (pow_table_q17[q_abs]);
76*15dc779aSAndroid Build Coastguard Worker     *x_invquant++ = -temp;
77*15dc779aSAndroid Build Coastguard Worker   }
78*15dc779aSAndroid Build Coastguard Worker }
79*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word1(ia_bit_buf_struct * it_bit_buf,WORD32 * qp,WORD16 * offsets,WORD no_bands,WORD group_no,const UWORD16 * h_ori,WORD32 * pow_table_q17,WORD32 maximum_bins_short)80*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word1(
81*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, WORD32 *qp, WORD16 *offsets, WORD no_bands, WORD group_no,
82*15dc779aSAndroid Build Coastguard Worker     const UWORD16 *h_ori, WORD32 *pow_table_q17, WORD32 maximum_bins_short) {
83*15dc779aSAndroid Build Coastguard Worker   WORD32 sp1, sp2;
84*15dc779aSAndroid Build Coastguard Worker   WORD32 flush_cw;
85*15dc779aSAndroid Build Coastguard Worker   WORD32 i, value, norm_val, off;
86*15dc779aSAndroid Build Coastguard Worker   WORD idx, grp_idx;
87*15dc779aSAndroid Build Coastguard Worker   WORD32 out1, out2;
88*15dc779aSAndroid Build Coastguard Worker   WORD32 err_code = 0;
89*15dc779aSAndroid Build Coastguard Worker   WORD len_idx = 0;
90*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
91*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = it_bit_buf->bit_pos;
92*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
93*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += 4;
94*15dc779aSAndroid Build Coastguard Worker 
95*15dc779aSAndroid Build Coastguard Worker   do {
96*15dc779aSAndroid Build Coastguard Worker     len_idx = offsets[1] - offsets[0];
97*15dc779aSAndroid Build Coastguard Worker     grp_idx = group_no;
98*15dc779aSAndroid Build Coastguard Worker     do {
99*15dc779aSAndroid Build Coastguard Worker       qp = qp + offsets[0];
100*15dc779aSAndroid Build Coastguard Worker       idx = len_idx;
101*15dc779aSAndroid Build Coastguard Worker       do {
102*15dc779aSAndroid Build Coastguard Worker         {
103*15dc779aSAndroid Build Coastguard Worker           UWORD16 first_offset;
104*15dc779aSAndroid Build Coastguard Worker           WORD16 sign_ret_val;
105*15dc779aSAndroid Build Coastguard Worker           UWORD32 read_word1;
106*15dc779aSAndroid Build Coastguard Worker           UWORD16 *h;
107*15dc779aSAndroid Build Coastguard Worker 
108*15dc779aSAndroid Build Coastguard Worker           read_word1 = read_word << bit_pos;
109*15dc779aSAndroid Build Coastguard Worker 
110*15dc779aSAndroid Build Coastguard Worker           h = (UWORD16 *)h_ori;
111*15dc779aSAndroid Build Coastguard Worker           h += (read_word1) >> (27);
112*15dc779aSAndroid Build Coastguard Worker           sign_ret_val = *h;
113*15dc779aSAndroid Build Coastguard Worker 
114*15dc779aSAndroid Build Coastguard Worker           first_offset = 5;
115*15dc779aSAndroid Build Coastguard Worker           while (sign_ret_val > 0) {
116*15dc779aSAndroid Build Coastguard Worker             bit_pos += first_offset;
117*15dc779aSAndroid Build Coastguard Worker             ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
118*15dc779aSAndroid Build Coastguard Worker                                         it_bit_buf->ptr_bit_buf_end);
119*15dc779aSAndroid Build Coastguard Worker             read_word1 = (read_word1) << (first_offset);
120*15dc779aSAndroid Build Coastguard Worker             first_offset = (sign_ret_val >> 11);
121*15dc779aSAndroid Build Coastguard Worker             h += sign_ret_val & (0x07FF);
122*15dc779aSAndroid Build Coastguard Worker             h += (read_word1) >> (32 - first_offset);
123*15dc779aSAndroid Build Coastguard Worker             sign_ret_val = *h;
124*15dc779aSAndroid Build Coastguard Worker           }
125*15dc779aSAndroid Build Coastguard Worker           bit_pos += ((sign_ret_val & 0x7fff) >> 11);
126*15dc779aSAndroid Build Coastguard Worker           bit_pos = min(bit_pos, 31);
127*15dc779aSAndroid Build Coastguard Worker           value = sign_ret_val & (0x07FF);
128*15dc779aSAndroid Build Coastguard Worker         }
129*15dc779aSAndroid Build Coastguard Worker         out1 = (value & 0x3E0) >> 5;
130*15dc779aSAndroid Build Coastguard Worker         out2 = value & 0x1F;
131*15dc779aSAndroid Build Coastguard Worker 
132*15dc779aSAndroid Build Coastguard Worker         flush_cw = read_word << bit_pos;
133*15dc779aSAndroid Build Coastguard Worker 
134*15dc779aSAndroid Build Coastguard Worker         sp1 = out1;
135*15dc779aSAndroid Build Coastguard Worker         sp2 = out2;
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker         if (out1) {
138*15dc779aSAndroid Build Coastguard Worker           if (flush_cw & 0x80000000) {
139*15dc779aSAndroid Build Coastguard Worker             out1 = -out1;
140*15dc779aSAndroid Build Coastguard Worker           }
141*15dc779aSAndroid Build Coastguard Worker           bit_pos++;
142*15dc779aSAndroid Build Coastguard Worker           flush_cw = (WORD32)flush_cw << 1;
143*15dc779aSAndroid Build Coastguard Worker         }
144*15dc779aSAndroid Build Coastguard Worker 
145*15dc779aSAndroid Build Coastguard Worker         if (out2) {
146*15dc779aSAndroid Build Coastguard Worker           bit_pos++;
147*15dc779aSAndroid Build Coastguard Worker           if (flush_cw & 0x80000000) {
148*15dc779aSAndroid Build Coastguard Worker             out2 = -out2;
149*15dc779aSAndroid Build Coastguard Worker           }
150*15dc779aSAndroid Build Coastguard Worker         }
151*15dc779aSAndroid Build Coastguard Worker 
152*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
153*15dc779aSAndroid Build Coastguard Worker                                     it_bit_buf->ptr_bit_buf_end);
154*15dc779aSAndroid Build Coastguard Worker         if (sp1 == 16) {
155*15dc779aSAndroid Build Coastguard Worker           i = 4;
156*15dc779aSAndroid Build Coastguard Worker           value = ixheaac_extu(read_word, bit_pos, 23);
157*15dc779aSAndroid Build Coastguard Worker           value = value | 0xfffffe00;
158*15dc779aSAndroid Build Coastguard Worker           norm_val = ixheaac_norm32(value);
159*15dc779aSAndroid Build Coastguard Worker 
160*15dc779aSAndroid Build Coastguard Worker           i += (norm_val - 22);
161*15dc779aSAndroid Build Coastguard Worker           bit_pos += (norm_val - 21);
162*15dc779aSAndroid Build Coastguard Worker 
163*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
164*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
165*15dc779aSAndroid Build Coastguard Worker 
166*15dc779aSAndroid Build Coastguard Worker           off = ixheaac_extu(read_word, bit_pos, 32 - i);
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker           bit_pos += i;
169*15dc779aSAndroid Build Coastguard Worker 
170*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
171*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
174*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker           i = off + ((WORD32)1 << i);
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker           if (i <= IQ_TABLE_SIZE_HALF)
179*15dc779aSAndroid Build Coastguard Worker             i = pow_table_q17[i];
180*15dc779aSAndroid Build Coastguard Worker           else {
181*15dc779aSAndroid Build Coastguard Worker             err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
182*15dc779aSAndroid Build Coastguard Worker           }
183*15dc779aSAndroid Build Coastguard Worker 
184*15dc779aSAndroid Build Coastguard Worker           if (out1 < 0) {
185*15dc779aSAndroid Build Coastguard Worker             out1 = -i;
186*15dc779aSAndroid Build Coastguard Worker           } else {
187*15dc779aSAndroid Build Coastguard Worker             out1 = i;
188*15dc779aSAndroid Build Coastguard Worker           }
189*15dc779aSAndroid Build Coastguard Worker           *qp++ = out1;
190*15dc779aSAndroid Build Coastguard Worker         } else {
191*15dc779aSAndroid Build Coastguard Worker           if (out1 <= 0) {
192*15dc779aSAndroid Build Coastguard Worker             out1 = -out1;
193*15dc779aSAndroid Build Coastguard Worker             out1 = pow_table_q17[out1];
194*15dc779aSAndroid Build Coastguard Worker             *qp++ = -out1;
195*15dc779aSAndroid Build Coastguard Worker           } else {
196*15dc779aSAndroid Build Coastguard Worker             out1 = pow_table_q17[out1];
197*15dc779aSAndroid Build Coastguard Worker             *qp++ = out1;
198*15dc779aSAndroid Build Coastguard Worker           }
199*15dc779aSAndroid Build Coastguard Worker         }
200*15dc779aSAndroid Build Coastguard Worker         if (sp2 == 16) {
201*15dc779aSAndroid Build Coastguard Worker           i = 4;
202*15dc779aSAndroid Build Coastguard Worker           value = ixheaac_extu(read_word, bit_pos, 23);
203*15dc779aSAndroid Build Coastguard Worker           value = value | 0xfffffe00;
204*15dc779aSAndroid Build Coastguard Worker           norm_val = ixheaac_norm32(value);
205*15dc779aSAndroid Build Coastguard Worker 
206*15dc779aSAndroid Build Coastguard Worker           i += (norm_val - 22);
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker           bit_pos += (norm_val - 21);
209*15dc779aSAndroid Build Coastguard Worker 
210*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
211*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
212*15dc779aSAndroid Build Coastguard Worker 
213*15dc779aSAndroid Build Coastguard Worker           off = ixheaac_extu(read_word, bit_pos, 32 - i);
214*15dc779aSAndroid Build Coastguard Worker 
215*15dc779aSAndroid Build Coastguard Worker           bit_pos += i;
216*15dc779aSAndroid Build Coastguard Worker 
217*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
218*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
219*15dc779aSAndroid Build Coastguard Worker 
220*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
221*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker           i = off + ((WORD32)1 << i);
224*15dc779aSAndroid Build Coastguard Worker 
225*15dc779aSAndroid Build Coastguard Worker           if (i <= IQ_TABLE_SIZE_HALF)
226*15dc779aSAndroid Build Coastguard Worker             i = pow_table_q17[i];
227*15dc779aSAndroid Build Coastguard Worker           else {
228*15dc779aSAndroid Build Coastguard Worker             err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
229*15dc779aSAndroid Build Coastguard Worker           }
230*15dc779aSAndroid Build Coastguard Worker 
231*15dc779aSAndroid Build Coastguard Worker           if (out2 < 0) {
232*15dc779aSAndroid Build Coastguard Worker             out2 = -i;
233*15dc779aSAndroid Build Coastguard Worker           } else {
234*15dc779aSAndroid Build Coastguard Worker             out2 = i;
235*15dc779aSAndroid Build Coastguard Worker           }
236*15dc779aSAndroid Build Coastguard Worker           *qp++ = out2;
237*15dc779aSAndroid Build Coastguard Worker         } else {
238*15dc779aSAndroid Build Coastguard Worker           if (out2 <= 0) {
239*15dc779aSAndroid Build Coastguard Worker             out2 = -out2;
240*15dc779aSAndroid Build Coastguard Worker             out2 = pow_table_q17[out2];
241*15dc779aSAndroid Build Coastguard Worker             *qp++ = -out2;
242*15dc779aSAndroid Build Coastguard Worker           } else {
243*15dc779aSAndroid Build Coastguard Worker             out2 = pow_table_q17[out2];
244*15dc779aSAndroid Build Coastguard Worker             *qp++ = out2;
245*15dc779aSAndroid Build Coastguard Worker           }
246*15dc779aSAndroid Build Coastguard Worker         }
247*15dc779aSAndroid Build Coastguard Worker 
248*15dc779aSAndroid Build Coastguard Worker         idx -= 2;
249*15dc779aSAndroid Build Coastguard Worker       } while (idx != 0);
250*15dc779aSAndroid Build Coastguard Worker 
251*15dc779aSAndroid Build Coastguard Worker       qp += (maximum_bins_short - offsets[1]);
252*15dc779aSAndroid Build Coastguard Worker       grp_idx--;
253*15dc779aSAndroid Build Coastguard Worker     } while (grp_idx != 0);
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker     offsets++;
256*15dc779aSAndroid Build Coastguard Worker     qp -= (maximum_bins_short * group_no);
257*15dc779aSAndroid Build Coastguard Worker     no_bands--;
258*15dc779aSAndroid Build Coastguard Worker   } while (no_bands >= 0);
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->bit_pos = bit_pos;
261*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->ptr_read_next = ptr_read_next - 4;
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker   return err_code;
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word1_lb(ia_bit_buf_struct * it_bif_buf,WORD32 len,const UWORD16 * h_ori,WORD32 * x_invquant,WORD32 * pow_table_q17,WORD8 * p_pul_arr)266*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word1_lb(
267*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bif_buf, WORD32 len, const UWORD16 *h_ori, WORD32 *x_invquant,
268*15dc779aSAndroid Build Coastguard Worker     WORD32 *pow_table_q17, WORD8 *p_pul_arr) {
269*15dc779aSAndroid Build Coastguard Worker   WORD32 sp1, sp2;
270*15dc779aSAndroid Build Coastguard Worker   WORD32 flush_cw;
271*15dc779aSAndroid Build Coastguard Worker   WORD32 i, value, norm_val, off;
272*15dc779aSAndroid Build Coastguard Worker   WORD idx;
273*15dc779aSAndroid Build Coastguard Worker   WORD32 out1, out2;
274*15dc779aSAndroid Build Coastguard Worker   WORD32 err_code = 0;
275*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bif_buf->ptr_read_next;
276*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = it_bif_buf->bit_pos;
277*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
278*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += 4;
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker   for (idx = len; idx != 0; idx -= 2) {
281*15dc779aSAndroid Build Coastguard Worker     {
282*15dc779aSAndroid Build Coastguard Worker       UWORD16 first_offset;
283*15dc779aSAndroid Build Coastguard Worker       WORD16 sign_ret_val;
284*15dc779aSAndroid Build Coastguard Worker       UWORD32 read_word1;
285*15dc779aSAndroid Build Coastguard Worker       UWORD16 *h;
286*15dc779aSAndroid Build Coastguard Worker 
287*15dc779aSAndroid Build Coastguard Worker       read_word1 = read_word << bit_pos;
288*15dc779aSAndroid Build Coastguard Worker 
289*15dc779aSAndroid Build Coastguard Worker       h = (UWORD16 *)h_ori;
290*15dc779aSAndroid Build Coastguard Worker       h += (read_word1) >> (27);
291*15dc779aSAndroid Build Coastguard Worker       sign_ret_val = *h;
292*15dc779aSAndroid Build Coastguard Worker 
293*15dc779aSAndroid Build Coastguard Worker       first_offset = 5;
294*15dc779aSAndroid Build Coastguard Worker       while (sign_ret_val > 0) {
295*15dc779aSAndroid Build Coastguard Worker         bit_pos += first_offset;
296*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
297*15dc779aSAndroid Build Coastguard Worker                                     it_bif_buf->ptr_bit_buf_end);
298*15dc779aSAndroid Build Coastguard Worker         read_word1 = (read_word1) << (first_offset);
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker         first_offset = (sign_ret_val >> 11);
301*15dc779aSAndroid Build Coastguard Worker         h += sign_ret_val & (0x07FF);
302*15dc779aSAndroid Build Coastguard Worker 
303*15dc779aSAndroid Build Coastguard Worker         h += (read_word1) >> (32 - first_offset);
304*15dc779aSAndroid Build Coastguard Worker         sign_ret_val = *h;
305*15dc779aSAndroid Build Coastguard Worker       }
306*15dc779aSAndroid Build Coastguard Worker       bit_pos += ((sign_ret_val & 0x7fff) >> 11);
307*15dc779aSAndroid Build Coastguard Worker       bit_pos = min(bit_pos, 31);
308*15dc779aSAndroid Build Coastguard Worker       value = sign_ret_val & (0x07FF);
309*15dc779aSAndroid Build Coastguard Worker     }
310*15dc779aSAndroid Build Coastguard Worker 
311*15dc779aSAndroid Build Coastguard Worker     flush_cw = read_word << bit_pos;
312*15dc779aSAndroid Build Coastguard Worker 
313*15dc779aSAndroid Build Coastguard Worker     out1 = (value & 0x3E0) >> 5;
314*15dc779aSAndroid Build Coastguard Worker     out2 = value & 0x1F;
315*15dc779aSAndroid Build Coastguard Worker 
316*15dc779aSAndroid Build Coastguard Worker     sp1 = out1;
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker     if (out1) {
319*15dc779aSAndroid Build Coastguard Worker       if (flush_cw & 0x80000000) {
320*15dc779aSAndroid Build Coastguard Worker         out1 = -out1;
321*15dc779aSAndroid Build Coastguard Worker       }
322*15dc779aSAndroid Build Coastguard Worker 
323*15dc779aSAndroid Build Coastguard Worker       bit_pos++;
324*15dc779aSAndroid Build Coastguard Worker       flush_cw = (WORD32)flush_cw << 1;
325*15dc779aSAndroid Build Coastguard Worker     }
326*15dc779aSAndroid Build Coastguard Worker 
327*15dc779aSAndroid Build Coastguard Worker     sp2 = out2;
328*15dc779aSAndroid Build Coastguard Worker     if (out2) {
329*15dc779aSAndroid Build Coastguard Worker       bit_pos++;
330*15dc779aSAndroid Build Coastguard Worker       if (flush_cw & 0x80000000) {
331*15dc779aSAndroid Build Coastguard Worker         out2 = -out2;
332*15dc779aSAndroid Build Coastguard Worker       }
333*15dc779aSAndroid Build Coastguard Worker     }
334*15dc779aSAndroid Build Coastguard Worker 
335*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
336*15dc779aSAndroid Build Coastguard Worker                                 it_bif_buf->ptr_bit_buf_end);
337*15dc779aSAndroid Build Coastguard Worker 
338*15dc779aSAndroid Build Coastguard Worker     if (sp1 == 16) {
339*15dc779aSAndroid Build Coastguard Worker       i = 4;
340*15dc779aSAndroid Build Coastguard Worker       value = ixheaac_extu(read_word, bit_pos, 23);
341*15dc779aSAndroid Build Coastguard Worker       value = value | 0xfffffe00;
342*15dc779aSAndroid Build Coastguard Worker       norm_val = ixheaac_norm32(value);
343*15dc779aSAndroid Build Coastguard Worker       i += (norm_val - 22);
344*15dc779aSAndroid Build Coastguard Worker       bit_pos += (norm_val - 21);
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
347*15dc779aSAndroid Build Coastguard Worker                                   it_bif_buf->ptr_bit_buf_end);
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker       off = ixheaac_extu(read_word, bit_pos, 32 - i);
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker       bit_pos += i;
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
354*15dc779aSAndroid Build Coastguard Worker                                   it_bif_buf->ptr_bit_buf_end);
355*15dc779aSAndroid Build Coastguard Worker       value = *p_pul_arr++;
356*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
357*15dc779aSAndroid Build Coastguard Worker                                   it_bif_buf->ptr_bit_buf_end);
358*15dc779aSAndroid Build Coastguard Worker       i = off + ((WORD32)1 << i);
359*15dc779aSAndroid Build Coastguard Worker       i = add_d(i, value);
360*15dc779aSAndroid Build Coastguard Worker 
361*15dc779aSAndroid Build Coastguard Worker       if (i <= IQ_TABLE_SIZE_HALF)
362*15dc779aSAndroid Build Coastguard Worker         i = pow_table_q17[i];
363*15dc779aSAndroid Build Coastguard Worker       else {
364*15dc779aSAndroid Build Coastguard Worker         err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
365*15dc779aSAndroid Build Coastguard Worker       }
366*15dc779aSAndroid Build Coastguard Worker       if (out1 < 0) {
367*15dc779aSAndroid Build Coastguard Worker         i = -i;
368*15dc779aSAndroid Build Coastguard Worker       }
369*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = i;
370*15dc779aSAndroid Build Coastguard Worker     } else {
371*15dc779aSAndroid Build Coastguard Worker       WORD8 temp = *p_pul_arr++;
372*15dc779aSAndroid Build Coastguard Worker       if (out1 <= 0) {
373*15dc779aSAndroid Build Coastguard Worker         out1 = sub_d(temp, out1);
374*15dc779aSAndroid Build Coastguard Worker         out1 = pow_table_q17[out1];
375*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = -out1;
376*15dc779aSAndroid Build Coastguard Worker       } else {
377*15dc779aSAndroid Build Coastguard Worker         out1 = add_d(out1, temp);
378*15dc779aSAndroid Build Coastguard Worker         out1 = pow_table_q17[out1];
379*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = out1;
380*15dc779aSAndroid Build Coastguard Worker       }
381*15dc779aSAndroid Build Coastguard Worker     }
382*15dc779aSAndroid Build Coastguard Worker 
383*15dc779aSAndroid Build Coastguard Worker     if (sp2 == 16) {
384*15dc779aSAndroid Build Coastguard Worker       i = 4;
385*15dc779aSAndroid Build Coastguard Worker       value = ixheaac_extu(read_word, bit_pos, 23);
386*15dc779aSAndroid Build Coastguard Worker       value = value | 0xfffffe00;
387*15dc779aSAndroid Build Coastguard Worker       norm_val = ixheaac_norm32(value);
388*15dc779aSAndroid Build Coastguard Worker 
389*15dc779aSAndroid Build Coastguard Worker       i += (norm_val - 22);
390*15dc779aSAndroid Build Coastguard Worker 
391*15dc779aSAndroid Build Coastguard Worker       bit_pos += (norm_val - 21);
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
394*15dc779aSAndroid Build Coastguard Worker                                   it_bif_buf->ptr_bit_buf_end);
395*15dc779aSAndroid Build Coastguard Worker 
396*15dc779aSAndroid Build Coastguard Worker       off = ixheaac_extu(read_word, bit_pos, 32 - i);
397*15dc779aSAndroid Build Coastguard Worker 
398*15dc779aSAndroid Build Coastguard Worker       bit_pos += i;
399*15dc779aSAndroid Build Coastguard Worker 
400*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
401*15dc779aSAndroid Build Coastguard Worker                                   it_bif_buf->ptr_bit_buf_end);
402*15dc779aSAndroid Build Coastguard Worker       value = *p_pul_arr++;
403*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
404*15dc779aSAndroid Build Coastguard Worker                                   it_bif_buf->ptr_bit_buf_end);
405*15dc779aSAndroid Build Coastguard Worker 
406*15dc779aSAndroid Build Coastguard Worker       i = off + ((WORD32)1 << i);
407*15dc779aSAndroid Build Coastguard Worker       i = add_d(i, value);
408*15dc779aSAndroid Build Coastguard Worker       if (i <= IQ_TABLE_SIZE_HALF)
409*15dc779aSAndroid Build Coastguard Worker         i = pow_table_q17[i];
410*15dc779aSAndroid Build Coastguard Worker       else {
411*15dc779aSAndroid Build Coastguard Worker         err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
412*15dc779aSAndroid Build Coastguard Worker       }
413*15dc779aSAndroid Build Coastguard Worker 
414*15dc779aSAndroid Build Coastguard Worker       if (out2 < 0) {
415*15dc779aSAndroid Build Coastguard Worker         i = -i;
416*15dc779aSAndroid Build Coastguard Worker       }
417*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = i;
418*15dc779aSAndroid Build Coastguard Worker     } else {
419*15dc779aSAndroid Build Coastguard Worker       WORD8 temp = *p_pul_arr++;
420*15dc779aSAndroid Build Coastguard Worker       if (out2 <= 0) {
421*15dc779aSAndroid Build Coastguard Worker         out2 = sub_d(temp, out2);
422*15dc779aSAndroid Build Coastguard Worker         out2 = pow_table_q17[out2];
423*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = -out2;
424*15dc779aSAndroid Build Coastguard Worker       } else {
425*15dc779aSAndroid Build Coastguard Worker         out2 = add_d(out2, temp);
426*15dc779aSAndroid Build Coastguard Worker         out2 = pow_table_q17[out2];
427*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = out2;
428*15dc779aSAndroid Build Coastguard Worker       }
429*15dc779aSAndroid Build Coastguard Worker     }
430*15dc779aSAndroid Build Coastguard Worker   }
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker   it_bif_buf->ptr_read_next = ptr_read_next - 4;
433*15dc779aSAndroid Build Coastguard Worker   it_bif_buf->bit_pos = bit_pos;
434*15dc779aSAndroid Build Coastguard Worker 
435*15dc779aSAndroid Build Coastguard Worker   return err_code;
436*15dc779aSAndroid Build Coastguard Worker }
437*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word2_4(ia_bit_buf_struct * it_bit_buf,WORD32 * qp,WORD16 * offsets,WORD no_bands,WORD group_no,const UWORD16 * h_ori,WORD32 * pow_table_q17,WORD32 sign,WORD32 maximum_bins_short)438*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_4(
439*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, WORD32 *qp, WORD16 *offsets, WORD no_bands, WORD group_no,
440*15dc779aSAndroid Build Coastguard Worker     const UWORD16 *h_ori, WORD32 *pow_table_q17, WORD32 sign, WORD32 maximum_bins_short) {
441*15dc779aSAndroid Build Coastguard Worker   WORD32 value;
442*15dc779aSAndroid Build Coastguard Worker   WORD idx, grp_idx;
443*15dc779aSAndroid Build Coastguard Worker   WORD idx_len;
444*15dc779aSAndroid Build Coastguard Worker   WORD32 *qp_org;
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
447*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = it_bit_buf->bit_pos;
448*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
449*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += 4;
450*15dc779aSAndroid Build Coastguard Worker   qp_org = qp;
451*15dc779aSAndroid Build Coastguard Worker   do {
452*15dc779aSAndroid Build Coastguard Worker     idx_len = offsets[1] - offsets[0];
453*15dc779aSAndroid Build Coastguard Worker     grp_idx = group_no;
454*15dc779aSAndroid Build Coastguard Worker 
455*15dc779aSAndroid Build Coastguard Worker     do {
456*15dc779aSAndroid Build Coastguard Worker       qp = qp + offsets[0];
457*15dc779aSAndroid Build Coastguard Worker       idx = idx_len;
458*15dc779aSAndroid Build Coastguard Worker       do {
459*15dc779aSAndroid Build Coastguard Worker         UWORD16 first_offset;
460*15dc779aSAndroid Build Coastguard Worker         WORD16 sign_ret_val;
461*15dc779aSAndroid Build Coastguard Worker         UWORD32 read_word1;
462*15dc779aSAndroid Build Coastguard Worker         UWORD16 *h;
463*15dc779aSAndroid Build Coastguard Worker 
464*15dc779aSAndroid Build Coastguard Worker         read_word1 = read_word << bit_pos;
465*15dc779aSAndroid Build Coastguard Worker 
466*15dc779aSAndroid Build Coastguard Worker         h = (UWORD16 *)h_ori;
467*15dc779aSAndroid Build Coastguard Worker         h += (read_word1) >> (27);
468*15dc779aSAndroid Build Coastguard Worker         sign_ret_val = *h;
469*15dc779aSAndroid Build Coastguard Worker 
470*15dc779aSAndroid Build Coastguard Worker         first_offset = 5;
471*15dc779aSAndroid Build Coastguard Worker         while (sign_ret_val > 0) {
472*15dc779aSAndroid Build Coastguard Worker           bit_pos += first_offset;
473*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
474*15dc779aSAndroid Build Coastguard Worker                                       it_bit_buf->ptr_bit_buf_end);
475*15dc779aSAndroid Build Coastguard Worker           read_word1 = (read_word1) << (first_offset);
476*15dc779aSAndroid Build Coastguard Worker 
477*15dc779aSAndroid Build Coastguard Worker           first_offset = (sign_ret_val >> 11);
478*15dc779aSAndroid Build Coastguard Worker           h += sign_ret_val & (0x07FF);
479*15dc779aSAndroid Build Coastguard Worker 
480*15dc779aSAndroid Build Coastguard Worker           h += (read_word1) >> (32 - first_offset);
481*15dc779aSAndroid Build Coastguard Worker           sign_ret_val = *h;
482*15dc779aSAndroid Build Coastguard Worker         }
483*15dc779aSAndroid Build Coastguard Worker         bit_pos += ((sign_ret_val & 0x7fff) >> 11);
484*15dc779aSAndroid Build Coastguard Worker         bit_pos = min(bit_pos, 31);
485*15dc779aSAndroid Build Coastguard Worker         value = sign_ret_val & (0x07FF);
486*15dc779aSAndroid Build Coastguard Worker 
487*15dc779aSAndroid Build Coastguard Worker         if (sign) {
488*15dc779aSAndroid Build Coastguard Worker           WORD32 temp_word;
489*15dc779aSAndroid Build Coastguard Worker           temp_word = read_word << bit_pos;
490*15dc779aSAndroid Build Coastguard Worker 
491*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_signed_symbol(value, 24, 30, pow_table_q17, &temp_word,
492*15dc779aSAndroid Build Coastguard Worker                                                      &bit_pos);
493*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_signed_symbol(value, 26, 30, pow_table_q17, &temp_word,
494*15dc779aSAndroid Build Coastguard Worker                                                      &bit_pos);
495*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_signed_symbol(value, 28, 30, pow_table_q17, &temp_word,
496*15dc779aSAndroid Build Coastguard Worker                                                      &bit_pos);
497*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_signed_symbol(value, 30, 30, pow_table_q17, &temp_word,
498*15dc779aSAndroid Build Coastguard Worker                                                      &bit_pos);
499*15dc779aSAndroid Build Coastguard Worker         } else {
500*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_symbol(value, 24, 30, pow_table_q17);
501*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_symbol(value, 26, 30, pow_table_q17);
502*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_symbol(value, 28, 30, pow_table_q17);
503*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_symbol(value, 30, 30, pow_table_q17);
504*15dc779aSAndroid Build Coastguard Worker         }
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
507*15dc779aSAndroid Build Coastguard Worker                                     it_bit_buf->ptr_bit_buf_end);
508*15dc779aSAndroid Build Coastguard Worker         idx -= 4;
509*15dc779aSAndroid Build Coastguard Worker       } while (idx != 0);
510*15dc779aSAndroid Build Coastguard Worker 
511*15dc779aSAndroid Build Coastguard Worker       qp += (maximum_bins_short - offsets[1]);
512*15dc779aSAndroid Build Coastguard Worker       grp_idx--;
513*15dc779aSAndroid Build Coastguard Worker     } while (grp_idx != 0);
514*15dc779aSAndroid Build Coastguard Worker     offsets++;
515*15dc779aSAndroid Build Coastguard Worker     qp = qp_org;
516*15dc779aSAndroid Build Coastguard Worker     no_bands--;
517*15dc779aSAndroid Build Coastguard Worker   } while (no_bands >= 0);
518*15dc779aSAndroid Build Coastguard Worker 
519*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->ptr_read_next = ptr_read_next - 4;
520*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->bit_pos = bit_pos;
521*15dc779aSAndroid Build Coastguard Worker 
522*15dc779aSAndroid Build Coastguard Worker   return 0;
523*15dc779aSAndroid Build Coastguard Worker }
524*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word2_4_lb(ia_bit_buf_struct * it_bit_buf,WORD32 len,const UWORD16 * h_ori,WORD32 * x_invquant,WORD32 * pow_table_q17,WORD8 * p_pul_arr,WORD32 sign)525*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_4_lb(
526*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, WORD32 len, const UWORD16 *h_ori, WORD32 *x_invquant,
527*15dc779aSAndroid Build Coastguard Worker     WORD32 *pow_table_q17, WORD8 *p_pul_arr, WORD32 sign) {
528*15dc779aSAndroid Build Coastguard Worker   WORD32 value;
529*15dc779aSAndroid Build Coastguard Worker   WORD idx;
530*15dc779aSAndroid Build Coastguard Worker 
531*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
532*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = it_bit_buf->bit_pos;
533*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
534*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += 4;
535*15dc779aSAndroid Build Coastguard Worker 
536*15dc779aSAndroid Build Coastguard Worker   for (idx = len; idx != 0; idx -= 4) {
537*15dc779aSAndroid Build Coastguard Worker     WORD32 res;
538*15dc779aSAndroid Build Coastguard Worker     WORD32 ampres, ampres1;
539*15dc779aSAndroid Build Coastguard Worker     WORD32 ampres2, ampres3;
540*15dc779aSAndroid Build Coastguard Worker     UWORD16 first_offset;
541*15dc779aSAndroid Build Coastguard Worker     WORD16 sign_ret_val;
542*15dc779aSAndroid Build Coastguard Worker     UWORD32 read_word1;
543*15dc779aSAndroid Build Coastguard Worker     UWORD16 *h;
544*15dc779aSAndroid Build Coastguard Worker 
545*15dc779aSAndroid Build Coastguard Worker     read_word1 = read_word << bit_pos;
546*15dc779aSAndroid Build Coastguard Worker 
547*15dc779aSAndroid Build Coastguard Worker     h = (UWORD16 *)h_ori;
548*15dc779aSAndroid Build Coastguard Worker     h += (read_word1) >> (27);
549*15dc779aSAndroid Build Coastguard Worker     sign_ret_val = *h;
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker     first_offset = 5;
552*15dc779aSAndroid Build Coastguard Worker     while (sign_ret_val > 0) {
553*15dc779aSAndroid Build Coastguard Worker       bit_pos += first_offset;
554*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
555*15dc779aSAndroid Build Coastguard Worker                                   it_bit_buf->ptr_bit_buf_end);
556*15dc779aSAndroid Build Coastguard Worker       read_word1 = (read_word1) << (first_offset);
557*15dc779aSAndroid Build Coastguard Worker 
558*15dc779aSAndroid Build Coastguard Worker       first_offset = (sign_ret_val >> 11);
559*15dc779aSAndroid Build Coastguard Worker       h += sign_ret_val & (0x07FF);
560*15dc779aSAndroid Build Coastguard Worker 
561*15dc779aSAndroid Build Coastguard Worker       h += (read_word1) >> (32 - first_offset);
562*15dc779aSAndroid Build Coastguard Worker       sign_ret_val = *h;
563*15dc779aSAndroid Build Coastguard Worker     }
564*15dc779aSAndroid Build Coastguard Worker     bit_pos += ((sign_ret_val & 0x7fff) >> 11);
565*15dc779aSAndroid Build Coastguard Worker     bit_pos = min(bit_pos, 31);
566*15dc779aSAndroid Build Coastguard Worker 
567*15dc779aSAndroid Build Coastguard Worker     value = sign_ret_val & (0x07FF);
568*15dc779aSAndroid Build Coastguard Worker 
569*15dc779aSAndroid Build Coastguard Worker     if (sign) {
570*15dc779aSAndroid Build Coastguard Worker       WORD32 out0, out1, out2, out3;
571*15dc779aSAndroid Build Coastguard Worker       WORD32 ampout0, ampout1, ampout2, ampout3;
572*15dc779aSAndroid Build Coastguard Worker       WORD32 temp_word;
573*15dc779aSAndroid Build Coastguard Worker       temp_word = read_word << bit_pos;
574*15dc779aSAndroid Build Coastguard Worker 
575*15dc779aSAndroid Build Coastguard Worker       out0 = (ixheaac_extu(value, 24, 30));
576*15dc779aSAndroid Build Coastguard Worker       ampout0 = add_d(out0, *p_pul_arr++);
577*15dc779aSAndroid Build Coastguard Worker       ampout0 = pow_table_q17[ampout0];
578*15dc779aSAndroid Build Coastguard Worker 
579*15dc779aSAndroid Build Coastguard Worker       if (out0) {
580*15dc779aSAndroid Build Coastguard Worker         if (temp_word & 0x80000000) {
581*15dc779aSAndroid Build Coastguard Worker           ampout0 = -ampout0;
582*15dc779aSAndroid Build Coastguard Worker         }
583*15dc779aSAndroid Build Coastguard Worker         temp_word = temp_word << 1;
584*15dc779aSAndroid Build Coastguard Worker         bit_pos++;
585*15dc779aSAndroid Build Coastguard Worker       } else {
586*15dc779aSAndroid Build Coastguard Worker         ampout0 = -ampout0;
587*15dc779aSAndroid Build Coastguard Worker       }
588*15dc779aSAndroid Build Coastguard Worker 
589*15dc779aSAndroid Build Coastguard Worker       out1 = (ixheaac_extu(value, 26, 30));
590*15dc779aSAndroid Build Coastguard Worker       ampout1 = add_d(out1, *p_pul_arr++);
591*15dc779aSAndroid Build Coastguard Worker       ampout1 = pow_table_q17[ampout1];
592*15dc779aSAndroid Build Coastguard Worker       if (out1) {
593*15dc779aSAndroid Build Coastguard Worker         if (temp_word & 0x80000000) {
594*15dc779aSAndroid Build Coastguard Worker           ampout1 = -(ampout1);
595*15dc779aSAndroid Build Coastguard Worker         }
596*15dc779aSAndroid Build Coastguard Worker         temp_word = temp_word << 1;
597*15dc779aSAndroid Build Coastguard Worker         bit_pos++;
598*15dc779aSAndroid Build Coastguard Worker       } else {
599*15dc779aSAndroid Build Coastguard Worker         ampout1 = -ampout1;
600*15dc779aSAndroid Build Coastguard Worker       }
601*15dc779aSAndroid Build Coastguard Worker       out2 = (ixheaac_extu(value, 28, 30));
602*15dc779aSAndroid Build Coastguard Worker       ampout2 = add_d(out2, *p_pul_arr++);
603*15dc779aSAndroid Build Coastguard Worker       ampout2 = pow_table_q17[ampout2];
604*15dc779aSAndroid Build Coastguard Worker       if (out2) {
605*15dc779aSAndroid Build Coastguard Worker         if (temp_word & 0x80000000) {
606*15dc779aSAndroid Build Coastguard Worker           ampout2 = -(ampout2);
607*15dc779aSAndroid Build Coastguard Worker         }
608*15dc779aSAndroid Build Coastguard Worker         temp_word = temp_word << 1;
609*15dc779aSAndroid Build Coastguard Worker         bit_pos++;
610*15dc779aSAndroid Build Coastguard Worker       } else {
611*15dc779aSAndroid Build Coastguard Worker         ampout2 = -ampout2;
612*15dc779aSAndroid Build Coastguard Worker       }
613*15dc779aSAndroid Build Coastguard Worker 
614*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampout0;
615*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampout1;
616*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampout2;
617*15dc779aSAndroid Build Coastguard Worker 
618*15dc779aSAndroid Build Coastguard Worker       out3 = (ixheaac_extu(value, 30, 30));
619*15dc779aSAndroid Build Coastguard Worker       ampout3 = add_d(out3, *p_pul_arr++);
620*15dc779aSAndroid Build Coastguard Worker       ampout3 = pow_table_q17[ampout3];
621*15dc779aSAndroid Build Coastguard Worker       if (out3) {
622*15dc779aSAndroid Build Coastguard Worker         if (temp_word & 0x80000000) {
623*15dc779aSAndroid Build Coastguard Worker           ampout3 = -(ampout3);
624*15dc779aSAndroid Build Coastguard Worker         }
625*15dc779aSAndroid Build Coastguard Worker         temp_word = temp_word << 1;
626*15dc779aSAndroid Build Coastguard Worker         bit_pos++;
627*15dc779aSAndroid Build Coastguard Worker       } else {
628*15dc779aSAndroid Build Coastguard Worker         ampout3 = -ampout3;
629*15dc779aSAndroid Build Coastguard Worker       }
630*15dc779aSAndroid Build Coastguard Worker 
631*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampout3;
632*15dc779aSAndroid Build Coastguard Worker     } else {
633*15dc779aSAndroid Build Coastguard Worker       ampres = *p_pul_arr++;
634*15dc779aSAndroid Build Coastguard Worker       res = (ixheaacd_res_exts(value, 24, 30));
635*15dc779aSAndroid Build Coastguard Worker       if (res > 0) {
636*15dc779aSAndroid Build Coastguard Worker         ampres = add_d(res, ampres);
637*15dc779aSAndroid Build Coastguard Worker         ampres = pow_table_q17[ampres];
638*15dc779aSAndroid Build Coastguard Worker       } else {
639*15dc779aSAndroid Build Coastguard Worker         ampres = sub_d(ampres, res);
640*15dc779aSAndroid Build Coastguard Worker         ampres = pow_table_q17[ampres];
641*15dc779aSAndroid Build Coastguard Worker         ampres = -ampres;
642*15dc779aSAndroid Build Coastguard Worker       }
643*15dc779aSAndroid Build Coastguard Worker       res = (ixheaacd_res_exts(value, 26, 30));
644*15dc779aSAndroid Build Coastguard Worker       ampres1 = *p_pul_arr++;
645*15dc779aSAndroid Build Coastguard Worker       if (res > 0) {
646*15dc779aSAndroid Build Coastguard Worker         ampres1 = add_d(res, ampres1);
647*15dc779aSAndroid Build Coastguard Worker         ampres1 = pow_table_q17[ampres1];
648*15dc779aSAndroid Build Coastguard Worker       } else {
649*15dc779aSAndroid Build Coastguard Worker         ampres1 = sub_d(ampres1, res);
650*15dc779aSAndroid Build Coastguard Worker         ampres1 = pow_table_q17[ampres1];
651*15dc779aSAndroid Build Coastguard Worker         ampres1 = -ampres1;
652*15dc779aSAndroid Build Coastguard Worker       }
653*15dc779aSAndroid Build Coastguard Worker       res = (ixheaacd_res_exts(value, 28, 30));
654*15dc779aSAndroid Build Coastguard Worker       ampres2 = *p_pul_arr++;
655*15dc779aSAndroid Build Coastguard Worker       if (res > 0) {
656*15dc779aSAndroid Build Coastguard Worker         ampres2 = add_d(res, ampres2);
657*15dc779aSAndroid Build Coastguard Worker         ampres2 = pow_table_q17[ampres2];
658*15dc779aSAndroid Build Coastguard Worker       } else {
659*15dc779aSAndroid Build Coastguard Worker         ampres2 = sub_d(ampres2, res);
660*15dc779aSAndroid Build Coastguard Worker         ampres2 = pow_table_q17[ampres2];
661*15dc779aSAndroid Build Coastguard Worker         ampres2 = -ampres2;
662*15dc779aSAndroid Build Coastguard Worker       }
663*15dc779aSAndroid Build Coastguard Worker       res = (ixheaacd_res_exts(value, 30, 30));
664*15dc779aSAndroid Build Coastguard Worker       ampres3 = *p_pul_arr++;
665*15dc779aSAndroid Build Coastguard Worker       if (res > 0) {
666*15dc779aSAndroid Build Coastguard Worker         ampres3 = add_d(res, ampres3);
667*15dc779aSAndroid Build Coastguard Worker         ampres3 = pow_table_q17[ampres3];
668*15dc779aSAndroid Build Coastguard Worker       } else {
669*15dc779aSAndroid Build Coastguard Worker         ampres3 = sub_d(ampres3, res);
670*15dc779aSAndroid Build Coastguard Worker         ampres3 = pow_table_q17[ampres3];
671*15dc779aSAndroid Build Coastguard Worker         ampres3 = -ampres3;
672*15dc779aSAndroid Build Coastguard Worker       }
673*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampres;
674*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampres1;
675*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampres2;
676*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampres3;
677*15dc779aSAndroid Build Coastguard Worker     }
678*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
679*15dc779aSAndroid Build Coastguard Worker                                 it_bit_buf->ptr_bit_buf_end);
680*15dc779aSAndroid Build Coastguard Worker   }
681*15dc779aSAndroid Build Coastguard Worker 
682*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->ptr_read_next = ptr_read_next - 4;
683*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->bit_pos = bit_pos;
684*15dc779aSAndroid Build Coastguard Worker 
685*15dc779aSAndroid Build Coastguard Worker   return 0;
686*15dc779aSAndroid Build Coastguard Worker }
687*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word2_2(ia_bit_buf_struct * it_bif_buf,WORD32 * qp,WORD16 * offsets,WORD no_bands,WORD group_no,const UWORD16 * h_ori,WORD32 * pow_table_q17,WORD32 sign,WORD32 maximum_bins_short)688*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_2(
689*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bif_buf, WORD32 *qp, WORD16 *offsets, WORD no_bands, WORD group_no,
690*15dc779aSAndroid Build Coastguard Worker     const UWORD16 *h_ori, WORD32 *pow_table_q17, WORD32 sign, WORD32 maximum_bins_short)
691*15dc779aSAndroid Build Coastguard Worker 
692*15dc779aSAndroid Build Coastguard Worker {
693*15dc779aSAndroid Build Coastguard Worker   WORD32 value;
694*15dc779aSAndroid Build Coastguard Worker   WORD idx, grp_idx;
695*15dc779aSAndroid Build Coastguard Worker   WORD len_idx;
696*15dc779aSAndroid Build Coastguard Worker 
697*15dc779aSAndroid Build Coastguard Worker   WORD32 *qp_org = qp;
698*15dc779aSAndroid Build Coastguard Worker 
699*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bif_buf->ptr_read_next;
700*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = it_bif_buf->bit_pos;
701*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
702*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += 4;
703*15dc779aSAndroid Build Coastguard Worker 
704*15dc779aSAndroid Build Coastguard Worker   do {
705*15dc779aSAndroid Build Coastguard Worker     len_idx = offsets[1] - offsets[0];
706*15dc779aSAndroid Build Coastguard Worker     grp_idx = group_no;
707*15dc779aSAndroid Build Coastguard Worker     do {
708*15dc779aSAndroid Build Coastguard Worker       qp += offsets[0];
709*15dc779aSAndroid Build Coastguard Worker       idx = len_idx;
710*15dc779aSAndroid Build Coastguard Worker       do {
711*15dc779aSAndroid Build Coastguard Worker         UWORD16 first_offset;
712*15dc779aSAndroid Build Coastguard Worker         WORD16 sign_ret_val;
713*15dc779aSAndroid Build Coastguard Worker         UWORD32 read_word1;
714*15dc779aSAndroid Build Coastguard Worker         UWORD16 *h;
715*15dc779aSAndroid Build Coastguard Worker 
716*15dc779aSAndroid Build Coastguard Worker         read_word1 = read_word << bit_pos;
717*15dc779aSAndroid Build Coastguard Worker 
718*15dc779aSAndroid Build Coastguard Worker         h = (UWORD16 *)h_ori;
719*15dc779aSAndroid Build Coastguard Worker         h += (read_word1) >> (27);
720*15dc779aSAndroid Build Coastguard Worker         sign_ret_val = *h;
721*15dc779aSAndroid Build Coastguard Worker 
722*15dc779aSAndroid Build Coastguard Worker         first_offset = 5;
723*15dc779aSAndroid Build Coastguard Worker         while (sign_ret_val > 0) {
724*15dc779aSAndroid Build Coastguard Worker           bit_pos += first_offset;
725*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
726*15dc779aSAndroid Build Coastguard Worker                                       it_bif_buf->ptr_bit_buf_end);
727*15dc779aSAndroid Build Coastguard Worker           read_word1 = (read_word1) << (first_offset);
728*15dc779aSAndroid Build Coastguard Worker 
729*15dc779aSAndroid Build Coastguard Worker           first_offset = (sign_ret_val >> 11);
730*15dc779aSAndroid Build Coastguard Worker           h += sign_ret_val & (0x07FF);
731*15dc779aSAndroid Build Coastguard Worker 
732*15dc779aSAndroid Build Coastguard Worker           h += (read_word1) >> (32 - first_offset);
733*15dc779aSAndroid Build Coastguard Worker           sign_ret_val = *h;
734*15dc779aSAndroid Build Coastguard Worker         }
735*15dc779aSAndroid Build Coastguard Worker         bit_pos += ((sign_ret_val & 0x7fff) >> 11);
736*15dc779aSAndroid Build Coastguard Worker         bit_pos = min(bit_pos, 31);
737*15dc779aSAndroid Build Coastguard Worker         value = sign_ret_val & (0x07FF);
738*15dc779aSAndroid Build Coastguard Worker 
739*15dc779aSAndroid Build Coastguard Worker         if (sign) {
740*15dc779aSAndroid Build Coastguard Worker           WORD32 temp_word;
741*15dc779aSAndroid Build Coastguard Worker           temp_word = read_word << bit_pos;
742*15dc779aSAndroid Build Coastguard Worker 
743*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_signed_symbol(value, 24, 28, pow_table_q17, &temp_word,
744*15dc779aSAndroid Build Coastguard Worker                                                      &bit_pos);
745*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_signed_symbol(value, 28, 28, pow_table_q17, &temp_word,
746*15dc779aSAndroid Build Coastguard Worker                                                      &bit_pos);
747*15dc779aSAndroid Build Coastguard Worker         } else {
748*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_symbol(value, 24, 28, pow_table_q17);
749*15dc779aSAndroid Build Coastguard Worker           *qp++ = ixheaacd_res_extract_symbol(value, 28, 28, pow_table_q17);
750*15dc779aSAndroid Build Coastguard Worker         }
751*15dc779aSAndroid Build Coastguard Worker 
752*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
753*15dc779aSAndroid Build Coastguard Worker                                     it_bif_buf->ptr_bit_buf_end);
754*15dc779aSAndroid Build Coastguard Worker         idx -= 2;
755*15dc779aSAndroid Build Coastguard Worker       } while (idx != 0);
756*15dc779aSAndroid Build Coastguard Worker 
757*15dc779aSAndroid Build Coastguard Worker       qp += (maximum_bins_short - offsets[1]);
758*15dc779aSAndroid Build Coastguard Worker       grp_idx--;
759*15dc779aSAndroid Build Coastguard Worker     } while (grp_idx != 0);
760*15dc779aSAndroid Build Coastguard Worker 
761*15dc779aSAndroid Build Coastguard Worker     offsets++;
762*15dc779aSAndroid Build Coastguard Worker     qp = qp_org;
763*15dc779aSAndroid Build Coastguard Worker     no_bands--;
764*15dc779aSAndroid Build Coastguard Worker   } while (no_bands >= 0);
765*15dc779aSAndroid Build Coastguard Worker 
766*15dc779aSAndroid Build Coastguard Worker   it_bif_buf->ptr_read_next = ptr_read_next - 4;
767*15dc779aSAndroid Build Coastguard Worker   it_bif_buf->bit_pos = bit_pos;
768*15dc779aSAndroid Build Coastguard Worker 
769*15dc779aSAndroid Build Coastguard Worker   return 0;
770*15dc779aSAndroid Build Coastguard Worker }
771*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word2_2_lb(ia_bit_buf_struct * it_bit_buf,WORD32 len,const UWORD16 * h_ori,WORD32 * x_invquant,WORD32 * pow_table_q17,WORD8 * p_pul_arr,WORD32 sign)772*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_2_lb(
773*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, WORD32 len, const UWORD16 *h_ori, WORD32 *x_invquant,
774*15dc779aSAndroid Build Coastguard Worker     WORD32 *pow_table_q17, WORD8 *p_pul_arr, WORD32 sign) {
775*15dc779aSAndroid Build Coastguard Worker   WORD32 value, res, ampres;
776*15dc779aSAndroid Build Coastguard Worker   WORD idx;
777*15dc779aSAndroid Build Coastguard Worker 
778*15dc779aSAndroid Build Coastguard Worker   UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
779*15dc779aSAndroid Build Coastguard Worker   WORD32 bit_pos = it_bit_buf->bit_pos;
780*15dc779aSAndroid Build Coastguard Worker   WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
781*15dc779aSAndroid Build Coastguard Worker   ptr_read_next += 4;
782*15dc779aSAndroid Build Coastguard Worker 
783*15dc779aSAndroid Build Coastguard Worker   for (idx = len; idx != 0; idx -= 2) {
784*15dc779aSAndroid Build Coastguard Worker     {
785*15dc779aSAndroid Build Coastguard Worker       UWORD16 first_offset;
786*15dc779aSAndroid Build Coastguard Worker       WORD16 sign_ret_val;
787*15dc779aSAndroid Build Coastguard Worker       UWORD32 read_word1;
788*15dc779aSAndroid Build Coastguard Worker       UWORD16 *h;
789*15dc779aSAndroid Build Coastguard Worker 
790*15dc779aSAndroid Build Coastguard Worker       read_word1 = read_word << bit_pos;
791*15dc779aSAndroid Build Coastguard Worker 
792*15dc779aSAndroid Build Coastguard Worker       h = (UWORD16 *)h_ori;
793*15dc779aSAndroid Build Coastguard Worker       h += (read_word1) >> (27);
794*15dc779aSAndroid Build Coastguard Worker       sign_ret_val = *h;
795*15dc779aSAndroid Build Coastguard Worker 
796*15dc779aSAndroid Build Coastguard Worker       first_offset = 5;
797*15dc779aSAndroid Build Coastguard Worker       while (sign_ret_val > 0) {
798*15dc779aSAndroid Build Coastguard Worker         bit_pos += first_offset;
799*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
800*15dc779aSAndroid Build Coastguard Worker                                     it_bit_buf->ptr_bit_buf_end);
801*15dc779aSAndroid Build Coastguard Worker         read_word1 = (read_word1) << (first_offset);
802*15dc779aSAndroid Build Coastguard Worker 
803*15dc779aSAndroid Build Coastguard Worker         first_offset = (sign_ret_val >> 11);
804*15dc779aSAndroid Build Coastguard Worker         h += sign_ret_val & (0x07FF);
805*15dc779aSAndroid Build Coastguard Worker 
806*15dc779aSAndroid Build Coastguard Worker         h += (read_word1) >> (32 - first_offset);
807*15dc779aSAndroid Build Coastguard Worker         sign_ret_val = *h;
808*15dc779aSAndroid Build Coastguard Worker       }
809*15dc779aSAndroid Build Coastguard Worker       bit_pos += ((sign_ret_val & 0x7fff) >> 11);
810*15dc779aSAndroid Build Coastguard Worker       bit_pos = min(bit_pos, 31);
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker       value = sign_ret_val & (0x07FF);
813*15dc779aSAndroid Build Coastguard Worker     }
814*15dc779aSAndroid Build Coastguard Worker 
815*15dc779aSAndroid Build Coastguard Worker     if (sign) {
816*15dc779aSAndroid Build Coastguard Worker       WORD32 out0, out1, temp_word;
817*15dc779aSAndroid Build Coastguard Worker       WORD32 ampout0, ampout1;
818*15dc779aSAndroid Build Coastguard Worker 
819*15dc779aSAndroid Build Coastguard Worker       ampout0 = *p_pul_arr++;
820*15dc779aSAndroid Build Coastguard Worker       ampout1 = *p_pul_arr++;
821*15dc779aSAndroid Build Coastguard Worker 
822*15dc779aSAndroid Build Coastguard Worker       out0 = value & 0xf0;
823*15dc779aSAndroid Build Coastguard Worker 
824*15dc779aSAndroid Build Coastguard Worker       ampout0 = add_d(ampout0, (UWORD32)out0 >> 4);
825*15dc779aSAndroid Build Coastguard Worker       ampout0 = pow_table_q17[ampout0];
826*15dc779aSAndroid Build Coastguard Worker 
827*15dc779aSAndroid Build Coastguard Worker       out1 = value & 0xf;
828*15dc779aSAndroid Build Coastguard Worker       ampout1 = add_d(out1, ampout1);
829*15dc779aSAndroid Build Coastguard Worker       ampout1 = pow_table_q17[ampout1];
830*15dc779aSAndroid Build Coastguard Worker 
831*15dc779aSAndroid Build Coastguard Worker       temp_word = read_word << bit_pos;
832*15dc779aSAndroid Build Coastguard Worker       if (out0) {
833*15dc779aSAndroid Build Coastguard Worker         if (temp_word & 0x80000000) {
834*15dc779aSAndroid Build Coastguard Worker           ampout0 = -(ampout0);
835*15dc779aSAndroid Build Coastguard Worker         }
836*15dc779aSAndroid Build Coastguard Worker         bit_pos++;
837*15dc779aSAndroid Build Coastguard Worker         temp_word = temp_word << 1;
838*15dc779aSAndroid Build Coastguard Worker       } else {
839*15dc779aSAndroid Build Coastguard Worker         ampout0 = -(ampout0);
840*15dc779aSAndroid Build Coastguard Worker       }
841*15dc779aSAndroid Build Coastguard Worker       if (out1) {
842*15dc779aSAndroid Build Coastguard Worker         if (temp_word & 0x80000000) {
843*15dc779aSAndroid Build Coastguard Worker           ampout1 = -(ampout1);
844*15dc779aSAndroid Build Coastguard Worker         }
845*15dc779aSAndroid Build Coastguard Worker         bit_pos++;
846*15dc779aSAndroid Build Coastguard Worker       } else {
847*15dc779aSAndroid Build Coastguard Worker         ampout1 = -(ampout1);
848*15dc779aSAndroid Build Coastguard Worker       }
849*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
850*15dc779aSAndroid Build Coastguard Worker                                   it_bit_buf->ptr_bit_buf_end);
851*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampout0;
852*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = ampout1;
853*15dc779aSAndroid Build Coastguard Worker     } else {
854*15dc779aSAndroid Build Coastguard Worker       res = ((value << 24) >> 28);
855*15dc779aSAndroid Build Coastguard Worker       ampres = *p_pul_arr++;
856*15dc779aSAndroid Build Coastguard Worker       if (res > 0) {
857*15dc779aSAndroid Build Coastguard Worker         ampres = add_d(res, ampres);
858*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = pow_table_q17[ampres];
859*15dc779aSAndroid Build Coastguard Worker       } else {
860*15dc779aSAndroid Build Coastguard Worker         ampres = sub_d(ampres, res);
861*15dc779aSAndroid Build Coastguard Worker         ampres = pow_table_q17[ampres];
862*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = -ampres;
863*15dc779aSAndroid Build Coastguard Worker       }
864*15dc779aSAndroid Build Coastguard Worker 
865*15dc779aSAndroid Build Coastguard Worker       res = ((value << 28) >> 28);
866*15dc779aSAndroid Build Coastguard Worker       value = *p_pul_arr++;
867*15dc779aSAndroid Build Coastguard Worker       if (res > 0) {
868*15dc779aSAndroid Build Coastguard Worker         ampres = add_d(res, value);
869*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = pow_table_q17[ampres];
870*15dc779aSAndroid Build Coastguard Worker       } else {
871*15dc779aSAndroid Build Coastguard Worker         ampres = sub_d(value, res);
872*15dc779aSAndroid Build Coastguard Worker         ampres = pow_table_q17[ampres];
873*15dc779aSAndroid Build Coastguard Worker         *x_invquant++ = -ampres;
874*15dc779aSAndroid Build Coastguard Worker       }
875*15dc779aSAndroid Build Coastguard Worker     }
876*15dc779aSAndroid Build Coastguard Worker     ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
877*15dc779aSAndroid Build Coastguard Worker                                 it_bit_buf->ptr_bit_buf_end);
878*15dc779aSAndroid Build Coastguard Worker   }
879*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->ptr_read_next = ptr_read_next - 4;
880*15dc779aSAndroid Build Coastguard Worker   it_bit_buf->bit_pos = bit_pos;
881*15dc779aSAndroid Build Coastguard Worker 
882*15dc779aSAndroid Build Coastguard Worker   return 0;
883*15dc779aSAndroid Build Coastguard Worker }
884*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word_all(ia_bit_buf_struct * it_bit_buf,WORD32 code_no,WORD32 * quantized_coef,WORD16 * band_offsets,WORD start,WORD band,WORD group_no,ia_mps_dec_residual_aac_tables_struct * aac_tables_ptr,WORD32 maximum_bins_short)885*15dc779aSAndroid Build Coastguard Worker WORD ixheaacd_res_c_block_decode_huff_word_all(
886*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, WORD32 code_no, WORD32 *quantized_coef, WORD16 *band_offsets,
887*15dc779aSAndroid Build Coastguard Worker     WORD start, WORD band, WORD group_no, ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr,
888*15dc779aSAndroid Build Coastguard Worker     WORD32 maximum_bins_short) {
889*15dc779aSAndroid Build Coastguard Worker   WORD ret_val = 0;
890*15dc779aSAndroid Build Coastguard Worker   WORD start_bit_pos = it_bit_buf->bit_pos;
891*15dc779aSAndroid Build Coastguard Worker   UWORD8 *start_read_pos = it_bit_buf->ptr_read_next;
892*15dc779aSAndroid Build Coastguard Worker   const UWORD16 *h_ori = (UWORD16 *)(aac_tables_ptr->code_book[code_no]);
893*15dc779aSAndroid Build Coastguard Worker   WORD32 *pow_table = (WORD32 *)aac_tables_ptr->res_block_tables_ptr->pow_table_q17;
894*15dc779aSAndroid Build Coastguard Worker   WORD32 no_bands = band - start - 1;
895*15dc779aSAndroid Build Coastguard Worker   WORD16 *p_band_off = band_offsets + start;
896*15dc779aSAndroid Build Coastguard Worker 
897*15dc779aSAndroid Build Coastguard Worker   if (code_no == 11) {
898*15dc779aSAndroid Build Coastguard Worker     const UWORD16 *h_ori = aac_tables_ptr->res_huffmann_tables_ptr->huffman_codebook_11;
899*15dc779aSAndroid Build Coastguard Worker     ret_val =
900*15dc779aSAndroid Build Coastguard Worker         ixheaacd_res_c_block_decode_huff_word1(it_bit_buf, quantized_coef, p_band_off, no_bands,
901*15dc779aSAndroid Build Coastguard Worker                                                group_no, h_ori, pow_table, maximum_bins_short);
902*15dc779aSAndroid Build Coastguard Worker   } else if (code_no <= 4) {
903*15dc779aSAndroid Build Coastguard Worker     WORD32 sign = 0;
904*15dc779aSAndroid Build Coastguard Worker 
905*15dc779aSAndroid Build Coastguard Worker     if (code_no > 2) sign = 1;
906*15dc779aSAndroid Build Coastguard Worker     ret_val = ixheaacd_res_c_block_decode_huff_word2_4(it_bit_buf, quantized_coef, p_band_off,
907*15dc779aSAndroid Build Coastguard Worker                                                        no_bands, group_no, h_ori, pow_table, sign,
908*15dc779aSAndroid Build Coastguard Worker                                                        maximum_bins_short);
909*15dc779aSAndroid Build Coastguard Worker   }
910*15dc779aSAndroid Build Coastguard Worker 
911*15dc779aSAndroid Build Coastguard Worker   else if (code_no <= 10) {
912*15dc779aSAndroid Build Coastguard Worker     WORD32 sign = 0;
913*15dc779aSAndroid Build Coastguard Worker 
914*15dc779aSAndroid Build Coastguard Worker     if (code_no > 6) sign = 1;
915*15dc779aSAndroid Build Coastguard Worker     ret_val = ixheaacd_res_c_block_decode_huff_word2_2(it_bit_buf, quantized_coef, p_band_off,
916*15dc779aSAndroid Build Coastguard Worker                                                        no_bands, group_no, h_ori, pow_table, sign,
917*15dc779aSAndroid Build Coastguard Worker                                                        maximum_bins_short);
918*15dc779aSAndroid Build Coastguard Worker   }
919*15dc779aSAndroid Build Coastguard Worker   {
920*15dc779aSAndroid Build Coastguard Worker     WORD bits_cons;
921*15dc779aSAndroid Build Coastguard Worker     bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
922*15dc779aSAndroid Build Coastguard Worker                        (it_bit_buf->bit_pos - start_bit_pos));
923*15dc779aSAndroid Build Coastguard Worker     it_bit_buf->cnt_bits -= bits_cons;
924*15dc779aSAndroid Build Coastguard Worker   }
925*15dc779aSAndroid Build Coastguard Worker   return ret_val;
926*15dc779aSAndroid Build Coastguard Worker }
927*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_c_block_decode_huff_word_all_lb(ia_bit_buf_struct * it_bit_buf,WORD32 code_no,WORD32 len,ia_mps_dec_residual_aac_tables_struct * aac_tables_ptr,WORD32 * x_invquant,WORD8 * p_pul_arr)928*15dc779aSAndroid Build Coastguard Worker WORD ixheaacd_res_c_block_decode_huff_word_all_lb(
929*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, WORD32 code_no, WORD32 len,
930*15dc779aSAndroid Build Coastguard Worker     ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr, WORD32 *x_invquant, WORD8 *p_pul_arr) {
931*15dc779aSAndroid Build Coastguard Worker   WORD ret_val = 0;
932*15dc779aSAndroid Build Coastguard Worker   WORD start_bit_pos = it_bit_buf->bit_pos;
933*15dc779aSAndroid Build Coastguard Worker   WORD32 *pow_table = (WORD32 *)aac_tables_ptr->res_block_tables_ptr->pow_table_q17;
934*15dc779aSAndroid Build Coastguard Worker   UWORD8 *start_read_pos = it_bit_buf->ptr_read_next;
935*15dc779aSAndroid Build Coastguard Worker 
936*15dc779aSAndroid Build Coastguard Worker   const UWORD16 *h_ori = (UWORD16 *)(aac_tables_ptr->code_book[code_no]);
937*15dc779aSAndroid Build Coastguard Worker 
938*15dc779aSAndroid Build Coastguard Worker   if (code_no == 11) {
939*15dc779aSAndroid Build Coastguard Worker     const UWORD16 *h_ori = aac_tables_ptr->res_huffmann_tables_ptr->huffman_codebook_11;
940*15dc779aSAndroid Build Coastguard Worker     ret_val = ixheaacd_res_c_block_decode_huff_word1_lb(it_bit_buf, len, h_ori, x_invquant,
941*15dc779aSAndroid Build Coastguard Worker                                                         pow_table, p_pul_arr);
942*15dc779aSAndroid Build Coastguard Worker   } else if (code_no <= 4) {
943*15dc779aSAndroid Build Coastguard Worker     WORD32 sign = 0;
944*15dc779aSAndroid Build Coastguard Worker     if (code_no > 2) sign = 1;
945*15dc779aSAndroid Build Coastguard Worker     ret_val = ixheaacd_res_c_block_decode_huff_word2_4_lb(it_bit_buf, len, h_ori, x_invquant,
946*15dc779aSAndroid Build Coastguard Worker                                                           pow_table, p_pul_arr, sign);
947*15dc779aSAndroid Build Coastguard Worker   } else if (code_no <= 10) {
948*15dc779aSAndroid Build Coastguard Worker     WORD32 sign = 0;
949*15dc779aSAndroid Build Coastguard Worker     if (code_no > 6) sign = 1;
950*15dc779aSAndroid Build Coastguard Worker     ret_val = ixheaacd_res_c_block_decode_huff_word2_2_lb(it_bit_buf, len, h_ori, x_invquant,
951*15dc779aSAndroid Build Coastguard Worker                                                           pow_table, p_pul_arr, sign);
952*15dc779aSAndroid Build Coastguard Worker   }
953*15dc779aSAndroid Build Coastguard Worker 
954*15dc779aSAndroid Build Coastguard Worker   {
955*15dc779aSAndroid Build Coastguard Worker     WORD bits_cons;
956*15dc779aSAndroid Build Coastguard Worker     if (it_bit_buf->bit_pos <= 7) {
957*15dc779aSAndroid Build Coastguard Worker       bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
958*15dc779aSAndroid Build Coastguard Worker                          (it_bit_buf->bit_pos - start_bit_pos));
959*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->cnt_bits -= bits_cons;
960*15dc779aSAndroid Build Coastguard Worker     } else {
961*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->ptr_read_next += (it_bit_buf->bit_pos) >> 3;
962*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->bit_pos = it_bit_buf->bit_pos & 0x7;
963*15dc779aSAndroid Build Coastguard Worker 
964*15dc779aSAndroid Build Coastguard Worker       bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
965*15dc779aSAndroid Build Coastguard Worker                          ((it_bit_buf->bit_pos - start_bit_pos)));
966*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->cnt_bits -= bits_cons;
967*15dc779aSAndroid Build Coastguard Worker     }
968*15dc779aSAndroid Build Coastguard Worker   }
969*15dc779aSAndroid Build Coastguard Worker   return ret_val;
970*15dc779aSAndroid Build Coastguard Worker }
971*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_apply_one_scf(WORD32 scale_factor,WORD32 * x_invquant,WORD32 end,WORD32 * scale_table_ptr)972*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_res_apply_one_scf(WORD32 scale_factor, WORD32 *x_invquant, WORD32 end,
973*15dc779aSAndroid Build Coastguard Worker                                        WORD32 *scale_table_ptr) {
974*15dc779aSAndroid Build Coastguard Worker   WORD32 j;
975*15dc779aSAndroid Build Coastguard Worker 
976*15dc779aSAndroid Build Coastguard Worker   WORD32 temp_1;
977*15dc779aSAndroid Build Coastguard Worker   WORD32 q_factor;
978*15dc779aSAndroid Build Coastguard Worker   WORD32 buffer1;
979*15dc779aSAndroid Build Coastguard Worker   WORD16 scale_short;
980*15dc779aSAndroid Build Coastguard Worker 
981*15dc779aSAndroid Build Coastguard Worker   if (scale_factor < 24) {
982*15dc779aSAndroid Build Coastguard Worker     for (j = end; j > 0; j--) {
983*15dc779aSAndroid Build Coastguard Worker       *x_invquant++ = 0;
984*15dc779aSAndroid Build Coastguard Worker     }
985*15dc779aSAndroid Build Coastguard Worker   } else {
986*15dc779aSAndroid Build Coastguard Worker     WORD32 shift;
987*15dc779aSAndroid Build Coastguard Worker     q_factor = 37 - (scale_factor >> 2);
988*15dc779aSAndroid Build Coastguard Worker 
989*15dc779aSAndroid Build Coastguard Worker     scale_short = scale_table_ptr[(scale_factor & 0x0003)];
990*15dc779aSAndroid Build Coastguard Worker 
991*15dc779aSAndroid Build Coastguard Worker     shift = q_factor;
992*15dc779aSAndroid Build Coastguard Worker 
993*15dc779aSAndroid Build Coastguard Worker     if (shift > 0) {
994*15dc779aSAndroid Build Coastguard Worker       if (scale_short == (WORD16)0x8000) {
995*15dc779aSAndroid Build Coastguard Worker         for (j = end; j > 0; j--) {
996*15dc779aSAndroid Build Coastguard Worker           temp_1 = *x_invquant;
997*15dc779aSAndroid Build Coastguard Worker 
998*15dc779aSAndroid Build Coastguard Worker           buffer1 = ixheaac_mult32x16in32_shl_sat(temp_1, scale_short);
999*15dc779aSAndroid Build Coastguard Worker           buffer1 = ixheaac_shr32(buffer1, shift);
1000*15dc779aSAndroid Build Coastguard Worker           *x_invquant++ = buffer1;
1001*15dc779aSAndroid Build Coastguard Worker         }
1002*15dc779aSAndroid Build Coastguard Worker       } else {
1003*15dc779aSAndroid Build Coastguard Worker         for (j = end; j > 0; j--) {
1004*15dc779aSAndroid Build Coastguard Worker           temp_1 = *x_invquant;
1005*15dc779aSAndroid Build Coastguard Worker 
1006*15dc779aSAndroid Build Coastguard Worker           buffer1 = ixheaac_mult32x16in32_shl(temp_1, scale_short);
1007*15dc779aSAndroid Build Coastguard Worker 
1008*15dc779aSAndroid Build Coastguard Worker           buffer1 = ixheaac_shr32(buffer1, shift);
1009*15dc779aSAndroid Build Coastguard Worker           *x_invquant++ = buffer1;
1010*15dc779aSAndroid Build Coastguard Worker         }
1011*15dc779aSAndroid Build Coastguard Worker       }
1012*15dc779aSAndroid Build Coastguard Worker     } else {
1013*15dc779aSAndroid Build Coastguard Worker       shift = -shift;
1014*15dc779aSAndroid Build Coastguard Worker       if (shift > 0) {
1015*15dc779aSAndroid Build Coastguard Worker         if (scale_short == (WORD16)0x8000) {
1016*15dc779aSAndroid Build Coastguard Worker           for (j = end; j > 0; j--) {
1017*15dc779aSAndroid Build Coastguard Worker             temp_1 = *x_invquant;
1018*15dc779aSAndroid Build Coastguard Worker             temp_1 = ixheaac_shl32(temp_1, shift - 1);
1019*15dc779aSAndroid Build Coastguard Worker 
1020*15dc779aSAndroid Build Coastguard Worker             buffer1 = ixheaac_mult32x16in32_shl_sat(temp_1, scale_short);
1021*15dc779aSAndroid Build Coastguard Worker 
1022*15dc779aSAndroid Build Coastguard Worker             buffer1 = ixheaac_shl32(buffer1, 1);
1023*15dc779aSAndroid Build Coastguard Worker             *x_invquant++ = buffer1;
1024*15dc779aSAndroid Build Coastguard Worker           }
1025*15dc779aSAndroid Build Coastguard Worker         } else {
1026*15dc779aSAndroid Build Coastguard Worker           for (j = end; j > 0; j--) {
1027*15dc779aSAndroid Build Coastguard Worker             temp_1 = *x_invquant;
1028*15dc779aSAndroid Build Coastguard Worker             temp_1 = ixheaac_shl32(temp_1, shift - 1);
1029*15dc779aSAndroid Build Coastguard Worker 
1030*15dc779aSAndroid Build Coastguard Worker             buffer1 = ixheaac_mult32x16in32_shl(temp_1, scale_short);
1031*15dc779aSAndroid Build Coastguard Worker 
1032*15dc779aSAndroid Build Coastguard Worker             buffer1 = ixheaac_shl32(buffer1, 1);
1033*15dc779aSAndroid Build Coastguard Worker             *x_invquant++ = buffer1;
1034*15dc779aSAndroid Build Coastguard Worker           }
1035*15dc779aSAndroid Build Coastguard Worker         }
1036*15dc779aSAndroid Build Coastguard Worker       } else {
1037*15dc779aSAndroid Build Coastguard Worker         if (scale_short == (WORD16)0x8000) {
1038*15dc779aSAndroid Build Coastguard Worker           for (j = end; j > 0; j--) {
1039*15dc779aSAndroid Build Coastguard Worker             temp_1 = *x_invquant;
1040*15dc779aSAndroid Build Coastguard Worker 
1041*15dc779aSAndroid Build Coastguard Worker             buffer1 = ixheaac_mult32x16in32_shl_sat(temp_1, scale_short);
1042*15dc779aSAndroid Build Coastguard Worker 
1043*15dc779aSAndroid Build Coastguard Worker             *x_invquant++ = buffer1;
1044*15dc779aSAndroid Build Coastguard Worker           }
1045*15dc779aSAndroid Build Coastguard Worker         } else {
1046*15dc779aSAndroid Build Coastguard Worker           for (j = end; j > 0; j--) {
1047*15dc779aSAndroid Build Coastguard Worker             temp_1 = *x_invquant;
1048*15dc779aSAndroid Build Coastguard Worker 
1049*15dc779aSAndroid Build Coastguard Worker             buffer1 = ixheaac_mult32x16in32_shl(temp_1, scale_short);
1050*15dc779aSAndroid Build Coastguard Worker 
1051*15dc779aSAndroid Build Coastguard Worker             *x_invquant++ = buffer1;
1052*15dc779aSAndroid Build Coastguard Worker           }
1053*15dc779aSAndroid Build Coastguard Worker         }
1054*15dc779aSAndroid Build Coastguard Worker       }
1055*15dc779aSAndroid Build Coastguard Worker     }
1056*15dc779aSAndroid Build Coastguard Worker   }
1057*15dc779aSAndroid Build Coastguard Worker }
1058*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_res_apply_scfs(WORD32 * x_invquant,WORD16 * sc_factor,WORD t_bands,WORD8 * offset,WORD32 * scale_table_ptr)1059*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_res_apply_scfs(WORD32 *x_invquant, WORD16 *sc_factor, WORD t_bands, WORD8 *offset,
1060*15dc779aSAndroid Build Coastguard Worker                              WORD32 *scale_table_ptr) {
1061*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1062*15dc779aSAndroid Build Coastguard Worker   WORD16 scale_factor;
1063*15dc779aSAndroid Build Coastguard Worker 
1064*15dc779aSAndroid Build Coastguard Worker   for (i = t_bands - 1; i >= 0; i--) {
1065*15dc779aSAndroid Build Coastguard Worker     scale_factor = *sc_factor++;
1066*15dc779aSAndroid Build Coastguard Worker     ixheaacd_res_apply_one_scf(scale_factor, x_invquant, *offset, scale_table_ptr);
1067*15dc779aSAndroid Build Coastguard Worker     x_invquant += *offset;
1068*15dc779aSAndroid Build Coastguard Worker     offset++;
1069*15dc779aSAndroid Build Coastguard Worker   }
1070*15dc779aSAndroid Build Coastguard Worker }
1071