xref: /aosp_15_r20/external/libldac/src/pack_ldac.c (revision aef9bcd9217ad2365ebc8e70efaf94b64e04df14)
1*aef9bcd9SKiyoung Kim /*
2*aef9bcd9SKiyoung Kim  * Copyright (C) 2003 - 2016 Sony Corporation
3*aef9bcd9SKiyoung Kim  *
4*aef9bcd9SKiyoung Kim  * Licensed under the Apache License, Version 2.0 (the "License");
5*aef9bcd9SKiyoung Kim  * you may not use this file except in compliance with the License.
6*aef9bcd9SKiyoung Kim  * You may obtain a copy of the License at
7*aef9bcd9SKiyoung Kim  *
8*aef9bcd9SKiyoung Kim  *      http://www.apache.org/licenses/LICENSE-2.0
9*aef9bcd9SKiyoung Kim  *
10*aef9bcd9SKiyoung Kim  * Unless required by applicable law or agreed to in writing, software
11*aef9bcd9SKiyoung Kim  * distributed under the License is distributed on an "AS IS" BASIS,
12*aef9bcd9SKiyoung Kim  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*aef9bcd9SKiyoung Kim  * See the License for the specific language governing permissions and
14*aef9bcd9SKiyoung Kim  * limitations under the License.
15*aef9bcd9SKiyoung Kim  */
16*aef9bcd9SKiyoung Kim 
17*aef9bcd9SKiyoung Kim #include "ldac.h"
18*aef9bcd9SKiyoung Kim 
19*aef9bcd9SKiyoung Kim /***************************************************************************************************
20*aef9bcd9SKiyoung Kim     Pack and Store from MSB
21*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_store_ldac(int idata,int nbits,STREAM * p_block,int * p_loc)22*aef9bcd9SKiyoung Kim static void pack_store_ldac(
23*aef9bcd9SKiyoung Kim int idata,
24*aef9bcd9SKiyoung Kim int nbits,
25*aef9bcd9SKiyoung Kim STREAM *p_block,
26*aef9bcd9SKiyoung Kim int *p_loc)
27*aef9bcd9SKiyoung Kim {
28*aef9bcd9SKiyoung Kim     STREAM *p_bufptr;
29*aef9bcd9SKiyoung Kim     register int bpos;
30*aef9bcd9SKiyoung Kim     register unsigned int tmp;
31*aef9bcd9SKiyoung Kim 
32*aef9bcd9SKiyoung Kim     p_bufptr = p_block + (*p_loc >> LDAC_LOC_SHIFT);
33*aef9bcd9SKiyoung Kim     bpos = *p_loc & LDAC_LOC_MASK;
34*aef9bcd9SKiyoung Kim 
35*aef9bcd9SKiyoung Kim     tmp = (idata << (24-nbits)) & 0xffffff;
36*aef9bcd9SKiyoung Kim     tmp >>= bpos;
37*aef9bcd9SKiyoung Kim     *p_bufptr++ |= (tmp>>16);
38*aef9bcd9SKiyoung Kim     *p_bufptr++ = (tmp>>8) & 0xff;
39*aef9bcd9SKiyoung Kim     *p_bufptr = tmp & 0xff;
40*aef9bcd9SKiyoung Kim 
41*aef9bcd9SKiyoung Kim     *p_loc += nbits;
42*aef9bcd9SKiyoung Kim 
43*aef9bcd9SKiyoung Kim     return;
44*aef9bcd9SKiyoung Kim }
45*aef9bcd9SKiyoung Kim 
46*aef9bcd9SKiyoung Kim 
47*aef9bcd9SKiyoung Kim /***************************************************************************************************
48*aef9bcd9SKiyoung Kim     Pack Frame Header
49*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_frame_header_ldac(int smplrate_id,int chconfig_id,int frame_length,int frame_status,STREAM * p_stream)50*aef9bcd9SKiyoung Kim DECLFUNC void pack_frame_header_ldac(
51*aef9bcd9SKiyoung Kim int smplrate_id,
52*aef9bcd9SKiyoung Kim int chconfig_id,
53*aef9bcd9SKiyoung Kim int frame_length,
54*aef9bcd9SKiyoung Kim int frame_status,
55*aef9bcd9SKiyoung Kim STREAM *p_stream)
56*aef9bcd9SKiyoung Kim {
57*aef9bcd9SKiyoung Kim     int loc = 0;
58*aef9bcd9SKiyoung Kim 
59*aef9bcd9SKiyoung Kim     pack_store_ldac(LDAC_SYNCWORD, LDAC_SYNCWORDBITS, p_stream, &loc);
60*aef9bcd9SKiyoung Kim 
61*aef9bcd9SKiyoung Kim     pack_store_ldac(smplrate_id, LDAC_SMPLRATEBITS, p_stream, &loc);
62*aef9bcd9SKiyoung Kim 
63*aef9bcd9SKiyoung Kim     pack_store_ldac(chconfig_id, LDAC_CHCONFIG2BITS, p_stream, &loc);
64*aef9bcd9SKiyoung Kim 
65*aef9bcd9SKiyoung Kim     pack_store_ldac(frame_length-1, LDAC_FRAMELEN2BITS, p_stream, &loc);
66*aef9bcd9SKiyoung Kim 
67*aef9bcd9SKiyoung Kim     pack_store_ldac(frame_status, LDAC_FRAMESTATBITS, p_stream, &loc);
68*aef9bcd9SKiyoung Kim 
69*aef9bcd9SKiyoung Kim     return;
70*aef9bcd9SKiyoung Kim }
71*aef9bcd9SKiyoung Kim 
72*aef9bcd9SKiyoung Kim /***************************************************************************************************
73*aef9bcd9SKiyoung Kim     Pack Frame Alignment
74*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_frame_alignment_ldac(STREAM * p_stream,int * p_loc,int nbytes_frame)75*aef9bcd9SKiyoung Kim static void pack_frame_alignment_ldac(
76*aef9bcd9SKiyoung Kim STREAM *p_stream,
77*aef9bcd9SKiyoung Kim int *p_loc,
78*aef9bcd9SKiyoung Kim int nbytes_frame)
79*aef9bcd9SKiyoung Kim {
80*aef9bcd9SKiyoung Kim     int i;
81*aef9bcd9SKiyoung Kim     int nbytes_filled;
82*aef9bcd9SKiyoung Kim 
83*aef9bcd9SKiyoung Kim     nbytes_filled = nbytes_frame - *p_loc / LDAC_BYTESIZE;
84*aef9bcd9SKiyoung Kim 
85*aef9bcd9SKiyoung Kim     for (i = 0; i < nbytes_filled; i++) {
86*aef9bcd9SKiyoung Kim         pack_store_ldac(LDAC_FILLCODE, LDAC_BYTESIZE, p_stream, p_loc);
87*aef9bcd9SKiyoung Kim     }
88*aef9bcd9SKiyoung Kim 
89*aef9bcd9SKiyoung Kim     return;
90*aef9bcd9SKiyoung Kim }
91*aef9bcd9SKiyoung Kim 
92*aef9bcd9SKiyoung Kim /***************************************************************************************************
93*aef9bcd9SKiyoung Kim     Pack Byte Alignment
94*aef9bcd9SKiyoung Kim ***************************************************************************************************/
95*aef9bcd9SKiyoung Kim #define pack_block_alignment_ldac(p_stream, p_loc) pack_byte_alignment_ldac((p_stream), (p_loc))
96*aef9bcd9SKiyoung Kim 
pack_byte_alignment_ldac(STREAM * p_stream,int * p_loc)97*aef9bcd9SKiyoung Kim static void pack_byte_alignment_ldac(
98*aef9bcd9SKiyoung Kim STREAM *p_stream,
99*aef9bcd9SKiyoung Kim int *p_loc)
100*aef9bcd9SKiyoung Kim {
101*aef9bcd9SKiyoung Kim     int nbits_padding;
102*aef9bcd9SKiyoung Kim 
103*aef9bcd9SKiyoung Kim     nbits_padding = ((*p_loc + LDAC_BYTESIZE - 1) / LDAC_BYTESIZE) * LDAC_BYTESIZE - *p_loc;
104*aef9bcd9SKiyoung Kim 
105*aef9bcd9SKiyoung Kim     if (nbits_padding > 0) {
106*aef9bcd9SKiyoung Kim         pack_store_ldac(0, nbits_padding, p_stream, p_loc);
107*aef9bcd9SKiyoung Kim     }
108*aef9bcd9SKiyoung Kim 
109*aef9bcd9SKiyoung Kim     return;
110*aef9bcd9SKiyoung Kim }
111*aef9bcd9SKiyoung Kim 
112*aef9bcd9SKiyoung Kim /***************************************************************************************************
113*aef9bcd9SKiyoung Kim     Pack Band Info
114*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_band_info_ldac(AB * p_ab,STREAM * p_stream,int * p_loc)115*aef9bcd9SKiyoung Kim static void pack_band_info_ldac(
116*aef9bcd9SKiyoung Kim AB *p_ab,
117*aef9bcd9SKiyoung Kim STREAM *p_stream,
118*aef9bcd9SKiyoung Kim int *p_loc)
119*aef9bcd9SKiyoung Kim {
120*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ab->nbands-LDAC_BAND_OFFSET, LDAC_NBANDBITS, p_stream, p_loc);
121*aef9bcd9SKiyoung Kim 
122*aef9bcd9SKiyoung Kim     pack_store_ldac(LDAC_FALSE, LDAC_FLAGBITS, p_stream, p_loc);
123*aef9bcd9SKiyoung Kim 
124*aef9bcd9SKiyoung Kim     return;
125*aef9bcd9SKiyoung Kim }
126*aef9bcd9SKiyoung Kim 
127*aef9bcd9SKiyoung Kim /***************************************************************************************************
128*aef9bcd9SKiyoung Kim     Pack Gradient Data
129*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_gradient_ldac(AB * p_ab,STREAM * p_stream,int * p_loc)130*aef9bcd9SKiyoung Kim static void pack_gradient_ldac(
131*aef9bcd9SKiyoung Kim AB *p_ab,
132*aef9bcd9SKiyoung Kim STREAM *p_stream,
133*aef9bcd9SKiyoung Kim int *p_loc)
134*aef9bcd9SKiyoung Kim {
135*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ab->grad_mode, LDAC_GRADMODEBITS, p_stream, p_loc);
136*aef9bcd9SKiyoung Kim 
137*aef9bcd9SKiyoung Kim     if (p_ab->grad_mode == LDAC_MODE_0) {
138*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ab->grad_qu_l, LDAC_GRADQU0BITS, p_stream, p_loc);
139*aef9bcd9SKiyoung Kim 
140*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ab->grad_qu_h-1, LDAC_GRADQU0BITS, p_stream, p_loc);
141*aef9bcd9SKiyoung Kim 
142*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ab->grad_os_l, LDAC_GRADOSBITS, p_stream, p_loc);
143*aef9bcd9SKiyoung Kim 
144*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ab->grad_os_h, LDAC_GRADOSBITS, p_stream, p_loc);
145*aef9bcd9SKiyoung Kim     }
146*aef9bcd9SKiyoung Kim     else {
147*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ab->grad_qu_l, LDAC_GRADQU1BITS, p_stream, p_loc);
148*aef9bcd9SKiyoung Kim 
149*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ab->grad_os_l, LDAC_GRADOSBITS, p_stream, p_loc);
150*aef9bcd9SKiyoung Kim     }
151*aef9bcd9SKiyoung Kim 
152*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ab->nadjqus, LDAC_NADJQUBITS, p_stream, p_loc);
153*aef9bcd9SKiyoung Kim 
154*aef9bcd9SKiyoung Kim     return;
155*aef9bcd9SKiyoung Kim }
156*aef9bcd9SKiyoung Kim 
157*aef9bcd9SKiyoung Kim /***************************************************************************************************
158*aef9bcd9SKiyoung Kim     Subfunction: Pack Scale Factor Data - Mode 0
159*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_scale_factor_0_ldac(AC * p_ac,STREAM * p_stream,int * p_loc)160*aef9bcd9SKiyoung Kim static void pack_scale_factor_0_ldac(
161*aef9bcd9SKiyoung Kim AC *p_ac,
162*aef9bcd9SKiyoung Kim STREAM *p_stream,
163*aef9bcd9SKiyoung Kim int *p_loc)
164*aef9bcd9SKiyoung Kim {
165*aef9bcd9SKiyoung Kim     HCENC *p_hcsf;
166*aef9bcd9SKiyoung Kim     int iqu;
167*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
168*aef9bcd9SKiyoung Kim     int dif, val0, val1;
169*aef9bcd9SKiyoung Kim     const unsigned char *p_tbl;
170*aef9bcd9SKiyoung Kim 
171*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ac->sfc_bitlen-LDAC_MINSFCBLEN_0, LDAC_SFCBLENBITS, p_stream, p_loc);
172*aef9bcd9SKiyoung Kim 
173*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ac->sfc_offset, LDAC_IDSFBITS, p_stream, p_loc);
174*aef9bcd9SKiyoung Kim 
175*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ac->sfc_weight, LDAC_SFCWTBLBITS, p_stream, p_loc);
176*aef9bcd9SKiyoung Kim 
177*aef9bcd9SKiyoung Kim     p_tbl = gaa_sfcwgt_ldac[p_ac->sfc_weight];
178*aef9bcd9SKiyoung Kim     val0 = p_ac->a_idsf[0] + p_tbl[0];
179*aef9bcd9SKiyoung Kim 
180*aef9bcd9SKiyoung Kim     pack_store_ldac(val0-p_ac->sfc_offset, p_ac->sfc_bitlen, p_stream, p_loc);
181*aef9bcd9SKiyoung Kim 
182*aef9bcd9SKiyoung Kim     p_hcsf = ga_hcenc_sf0_ldac + (p_ac->sfc_bitlen-LDAC_MINSFCBLEN_0);
183*aef9bcd9SKiyoung Kim     for (iqu = 1; iqu < nqus; iqu++) {
184*aef9bcd9SKiyoung Kim         val1 = p_ac->a_idsf[iqu] + p_tbl[iqu];
185*aef9bcd9SKiyoung Kim         dif = (val1 - val0) & p_hcsf->mask;
186*aef9bcd9SKiyoung Kim         pack_store_ldac(hc_word_ldac(p_hcsf->p_tbl+dif), hc_len_ldac(p_hcsf->p_tbl+dif), p_stream, p_loc);
187*aef9bcd9SKiyoung Kim         val0 = val1;
188*aef9bcd9SKiyoung Kim     }
189*aef9bcd9SKiyoung Kim 
190*aef9bcd9SKiyoung Kim     return;
191*aef9bcd9SKiyoung Kim }
192*aef9bcd9SKiyoung Kim 
193*aef9bcd9SKiyoung Kim /***************************************************************************************************
194*aef9bcd9SKiyoung Kim     Subfunction: Pack Scale Factor Data - Mode 1
195*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_scale_factor_1_ldac(AC * p_ac,STREAM * p_stream,int * p_loc)196*aef9bcd9SKiyoung Kim static void pack_scale_factor_1_ldac(
197*aef9bcd9SKiyoung Kim AC *p_ac,
198*aef9bcd9SKiyoung Kim STREAM *p_stream,
199*aef9bcd9SKiyoung Kim int *p_loc)
200*aef9bcd9SKiyoung Kim {
201*aef9bcd9SKiyoung Kim     int iqu;
202*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
203*aef9bcd9SKiyoung Kim     const unsigned char *p_tbl;
204*aef9bcd9SKiyoung Kim 
205*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ac->sfc_bitlen-LDAC_MINSFCBLEN_1, LDAC_SFCBLENBITS, p_stream, p_loc);
206*aef9bcd9SKiyoung Kim 
207*aef9bcd9SKiyoung Kim     if (p_ac->sfc_bitlen > 4) {
208*aef9bcd9SKiyoung Kim         for (iqu = 0; iqu < nqus; iqu++) {
209*aef9bcd9SKiyoung Kim             pack_store_ldac(p_ac->a_idsf[iqu], LDAC_IDSFBITS, p_stream, p_loc);
210*aef9bcd9SKiyoung Kim         }
211*aef9bcd9SKiyoung Kim     }
212*aef9bcd9SKiyoung Kim     else {
213*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ac->sfc_offset, LDAC_IDSFBITS, p_stream, p_loc);
214*aef9bcd9SKiyoung Kim 
215*aef9bcd9SKiyoung Kim         pack_store_ldac(p_ac->sfc_weight, LDAC_SFCWTBLBITS, p_stream, p_loc);
216*aef9bcd9SKiyoung Kim 
217*aef9bcd9SKiyoung Kim         p_tbl = gaa_sfcwgt_ldac[p_ac->sfc_weight];
218*aef9bcd9SKiyoung Kim         for (iqu = 0; iqu < nqus; iqu++) {
219*aef9bcd9SKiyoung Kim             pack_store_ldac(p_ac->a_idsf[iqu]+p_tbl[iqu]-p_ac->sfc_offset, p_ac->sfc_bitlen, p_stream, p_loc);
220*aef9bcd9SKiyoung Kim         }
221*aef9bcd9SKiyoung Kim     }
222*aef9bcd9SKiyoung Kim 
223*aef9bcd9SKiyoung Kim     return;
224*aef9bcd9SKiyoung Kim }
225*aef9bcd9SKiyoung Kim 
226*aef9bcd9SKiyoung Kim /***************************************************************************************************
227*aef9bcd9SKiyoung Kim     Subfunction: Pack Scale Factor Data - Mode 2
228*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_scale_factor_2_ldac(AC * p_ac,STREAM * p_stream,int * p_loc)229*aef9bcd9SKiyoung Kim static void pack_scale_factor_2_ldac(
230*aef9bcd9SKiyoung Kim AC *p_ac,
231*aef9bcd9SKiyoung Kim STREAM *p_stream,
232*aef9bcd9SKiyoung Kim int *p_loc)
233*aef9bcd9SKiyoung Kim {
234*aef9bcd9SKiyoung Kim     HCENC *p_hcsf;
235*aef9bcd9SKiyoung Kim     int iqu;
236*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
237*aef9bcd9SKiyoung Kim     int dif;
238*aef9bcd9SKiyoung Kim 
239*aef9bcd9SKiyoung Kim     pack_store_ldac(p_ac->sfc_bitlen-LDAC_MINSFCBLEN_2, LDAC_SFCBLENBITS, p_stream, p_loc);
240*aef9bcd9SKiyoung Kim 
241*aef9bcd9SKiyoung Kim     p_hcsf = ga_hcenc_sf1_ldac + (p_ac->sfc_bitlen-LDAC_MINSFCBLEN_2);
242*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < nqus; iqu++) {
243*aef9bcd9SKiyoung Kim         dif = (p_ac->a_idsf[iqu] - p_ac->p_ab->ap_ac[0]->a_idsf[iqu]) & p_hcsf->mask;
244*aef9bcd9SKiyoung Kim         pack_store_ldac(hc_word_ldac(p_hcsf->p_tbl+dif), hc_len_ldac(p_hcsf->p_tbl+dif), p_stream, p_loc);
245*aef9bcd9SKiyoung Kim     }
246*aef9bcd9SKiyoung Kim 
247*aef9bcd9SKiyoung Kim     return;
248*aef9bcd9SKiyoung Kim }
249*aef9bcd9SKiyoung Kim 
250*aef9bcd9SKiyoung Kim /***************************************************************************************************
251*aef9bcd9SKiyoung Kim     Pack Scale Factor Data
252*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_scale_factor_ldac(AC * p_ac,STREAM * p_stream,int * p_loc)253*aef9bcd9SKiyoung Kim static void pack_scale_factor_ldac(
254*aef9bcd9SKiyoung Kim AC *p_ac,
255*aef9bcd9SKiyoung Kim STREAM *p_stream,
256*aef9bcd9SKiyoung Kim int *p_loc)
257*aef9bcd9SKiyoung Kim {
258*aef9bcd9SKiyoung Kim     int sfc_mode = p_ac->sfc_mode;
259*aef9bcd9SKiyoung Kim 
260*aef9bcd9SKiyoung Kim     pack_store_ldac(sfc_mode, LDAC_SFCMODEBITS, p_stream, p_loc);
261*aef9bcd9SKiyoung Kim 
262*aef9bcd9SKiyoung Kim     if (p_ac->ich == 0) {
263*aef9bcd9SKiyoung Kim         if (sfc_mode == LDAC_MODE_0) {
264*aef9bcd9SKiyoung Kim             pack_scale_factor_0_ldac(p_ac, p_stream, p_loc);
265*aef9bcd9SKiyoung Kim         }
266*aef9bcd9SKiyoung Kim         else {
267*aef9bcd9SKiyoung Kim             pack_scale_factor_1_ldac(p_ac, p_stream, p_loc);
268*aef9bcd9SKiyoung Kim         }
269*aef9bcd9SKiyoung Kim     }
270*aef9bcd9SKiyoung Kim     else {
271*aef9bcd9SKiyoung Kim         if (sfc_mode == LDAC_MODE_0) {
272*aef9bcd9SKiyoung Kim             pack_scale_factor_0_ldac(p_ac, p_stream, p_loc);
273*aef9bcd9SKiyoung Kim         }
274*aef9bcd9SKiyoung Kim         else {
275*aef9bcd9SKiyoung Kim             pack_scale_factor_2_ldac(p_ac, p_stream, p_loc);
276*aef9bcd9SKiyoung Kim         }
277*aef9bcd9SKiyoung Kim     }
278*aef9bcd9SKiyoung Kim 
279*aef9bcd9SKiyoung Kim     return;
280*aef9bcd9SKiyoung Kim }
281*aef9bcd9SKiyoung Kim 
282*aef9bcd9SKiyoung Kim /***************************************************************************************************
283*aef9bcd9SKiyoung Kim     Pack Spectrum Data
284*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_spectrum_ldac(AC * p_ac,STREAM * p_stream,int * p_loc)285*aef9bcd9SKiyoung Kim static void pack_spectrum_ldac(
286*aef9bcd9SKiyoung Kim AC *p_ac,
287*aef9bcd9SKiyoung Kim STREAM *p_stream,
288*aef9bcd9SKiyoung Kim int *p_loc)
289*aef9bcd9SKiyoung Kim {
290*aef9bcd9SKiyoung Kim     int iqu, isp, i;
291*aef9bcd9SKiyoung Kim     int lsp, hsp;
292*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
293*aef9bcd9SKiyoung Kim     int nsps, idwl1, wl, val;
294*aef9bcd9SKiyoung Kim 
295*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < nqus; iqu++) {
296*aef9bcd9SKiyoung Kim         lsp = ga_isp_ldac[iqu];
297*aef9bcd9SKiyoung Kim         hsp = ga_isp_ldac[iqu+1];
298*aef9bcd9SKiyoung Kim         nsps = ga_nsps_ldac[iqu];
299*aef9bcd9SKiyoung Kim         idwl1 = p_ac->a_idwl1[iqu];
300*aef9bcd9SKiyoung Kim         wl = ga_wl_ldac[idwl1];
301*aef9bcd9SKiyoung Kim 
302*aef9bcd9SKiyoung Kim         if (idwl1 == 1) {
303*aef9bcd9SKiyoung Kim             isp = lsp;
304*aef9bcd9SKiyoung Kim 
305*aef9bcd9SKiyoung Kim             if (nsps == 2) {
306*aef9bcd9SKiyoung Kim                 val  = (p_ac->a_qspec[isp  ]+1) << 2;
307*aef9bcd9SKiyoung Kim                 val += (p_ac->a_qspec[isp+1]+1);
308*aef9bcd9SKiyoung Kim                 pack_store_ldac(ga_2dimenc_spec_ldac[val], LDAC_2DIMSPECBITS, p_stream, p_loc);
309*aef9bcd9SKiyoung Kim             }
310*aef9bcd9SKiyoung Kim             else {
311*aef9bcd9SKiyoung Kim                 for (i = 0; i < nsps>>2; i++, isp+=4) {
312*aef9bcd9SKiyoung Kim                     val  = (p_ac->a_qspec[isp  ]+1) << 6;
313*aef9bcd9SKiyoung Kim                     val += (p_ac->a_qspec[isp+1]+1) << 4;
314*aef9bcd9SKiyoung Kim                     val += (p_ac->a_qspec[isp+2]+1) << 2;
315*aef9bcd9SKiyoung Kim                     val += (p_ac->a_qspec[isp+3]+1);
316*aef9bcd9SKiyoung Kim                     pack_store_ldac(ga_4dimenc_spec_ldac[val], LDAC_4DIMSPECBITS, p_stream, p_loc);
317*aef9bcd9SKiyoung Kim                 }
318*aef9bcd9SKiyoung Kim             }
319*aef9bcd9SKiyoung Kim         }
320*aef9bcd9SKiyoung Kim         else {
321*aef9bcd9SKiyoung Kim             for (isp = lsp; isp < hsp; isp++) {
322*aef9bcd9SKiyoung Kim                 pack_store_ldac(p_ac->a_qspec[isp], wl, p_stream, p_loc);
323*aef9bcd9SKiyoung Kim             }
324*aef9bcd9SKiyoung Kim         }
325*aef9bcd9SKiyoung Kim     }
326*aef9bcd9SKiyoung Kim 
327*aef9bcd9SKiyoung Kim     return;
328*aef9bcd9SKiyoung Kim }
329*aef9bcd9SKiyoung Kim 
330*aef9bcd9SKiyoung Kim /***************************************************************************************************
331*aef9bcd9SKiyoung Kim     Pack Residual Data
332*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_residual_ldac(AC * p_ac,STREAM * p_stream,int * p_loc)333*aef9bcd9SKiyoung Kim static void pack_residual_ldac(
334*aef9bcd9SKiyoung Kim AC *p_ac,
335*aef9bcd9SKiyoung Kim STREAM *p_stream,
336*aef9bcd9SKiyoung Kim int *p_loc)
337*aef9bcd9SKiyoung Kim {
338*aef9bcd9SKiyoung Kim     int iqu, isp;
339*aef9bcd9SKiyoung Kim     int lsp, hsp;
340*aef9bcd9SKiyoung Kim     int nqus = p_ac->p_ab->nqus;
341*aef9bcd9SKiyoung Kim     int idwl2, wl;
342*aef9bcd9SKiyoung Kim 
343*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < nqus; iqu++) {
344*aef9bcd9SKiyoung Kim         idwl2 = p_ac->a_idwl2[iqu];
345*aef9bcd9SKiyoung Kim 
346*aef9bcd9SKiyoung Kim         if (idwl2 > 0) {
347*aef9bcd9SKiyoung Kim             lsp = ga_isp_ldac[iqu];
348*aef9bcd9SKiyoung Kim             hsp = ga_isp_ldac[iqu+1];
349*aef9bcd9SKiyoung Kim             wl = ga_wl_ldac[idwl2];
350*aef9bcd9SKiyoung Kim 
351*aef9bcd9SKiyoung Kim             for (isp = lsp; isp < hsp; isp++) {
352*aef9bcd9SKiyoung Kim                 pack_store_ldac(p_ac->a_rspec[isp], wl, p_stream, p_loc);
353*aef9bcd9SKiyoung Kim             }
354*aef9bcd9SKiyoung Kim         }
355*aef9bcd9SKiyoung Kim     }
356*aef9bcd9SKiyoung Kim 
357*aef9bcd9SKiyoung Kim     return;
358*aef9bcd9SKiyoung Kim }
359*aef9bcd9SKiyoung Kim 
360*aef9bcd9SKiyoung Kim /***************************************************************************************************
361*aef9bcd9SKiyoung Kim     Pack Audio Block
362*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_audio_block_ldac(AB * p_ab,STREAM * p_stream,int * p_loc)363*aef9bcd9SKiyoung Kim static int pack_audio_block_ldac(
364*aef9bcd9SKiyoung Kim AB *p_ab,
365*aef9bcd9SKiyoung Kim STREAM *p_stream,
366*aef9bcd9SKiyoung Kim int *p_loc)
367*aef9bcd9SKiyoung Kim {
368*aef9bcd9SKiyoung Kim     AC *p_ac;
369*aef9bcd9SKiyoung Kim     int ich;
370*aef9bcd9SKiyoung Kim     int nchs = p_ab->blk_nchs;
371*aef9bcd9SKiyoung Kim     int nbits_band, nbits_grad, a_nbits_scfc[2], a_nbits_spec[2], nbits_used;
372*aef9bcd9SKiyoung Kim     int loc;
373*aef9bcd9SKiyoung Kim 
374*aef9bcd9SKiyoung Kim     for (ich = 0; ich < 2; ich++) {
375*aef9bcd9SKiyoung Kim         a_nbits_scfc[ich] = 0;
376*aef9bcd9SKiyoung Kim         a_nbits_spec[ich] = 0;
377*aef9bcd9SKiyoung Kim     }
378*aef9bcd9SKiyoung Kim 
379*aef9bcd9SKiyoung Kim     loc = *p_loc;
380*aef9bcd9SKiyoung Kim     pack_band_info_ldac(p_ab, p_stream, p_loc);
381*aef9bcd9SKiyoung Kim     nbits_band = *p_loc - loc;
382*aef9bcd9SKiyoung Kim 
383*aef9bcd9SKiyoung Kim     loc = *p_loc;
384*aef9bcd9SKiyoung Kim     pack_gradient_ldac(p_ab, p_stream, p_loc);
385*aef9bcd9SKiyoung Kim     nbits_grad = *p_loc - loc;
386*aef9bcd9SKiyoung Kim 
387*aef9bcd9SKiyoung Kim     nbits_used = nbits_band + nbits_grad;
388*aef9bcd9SKiyoung Kim 
389*aef9bcd9SKiyoung Kim     for (ich = 0; ich < nchs; ich++) {
390*aef9bcd9SKiyoung Kim         p_ac = p_ab->ap_ac[ich];
391*aef9bcd9SKiyoung Kim 
392*aef9bcd9SKiyoung Kim         loc = *p_loc;
393*aef9bcd9SKiyoung Kim         pack_scale_factor_ldac(p_ac, p_stream, p_loc);
394*aef9bcd9SKiyoung Kim         a_nbits_scfc[ich] = *p_loc - loc;
395*aef9bcd9SKiyoung Kim 
396*aef9bcd9SKiyoung Kim         loc = *p_loc;
397*aef9bcd9SKiyoung Kim         pack_spectrum_ldac(p_ac, p_stream, p_loc);
398*aef9bcd9SKiyoung Kim         a_nbits_spec[ich] = *p_loc - loc;
399*aef9bcd9SKiyoung Kim 
400*aef9bcd9SKiyoung Kim         loc = *p_loc;
401*aef9bcd9SKiyoung Kim         pack_residual_ldac(p_ac, p_stream, p_loc);
402*aef9bcd9SKiyoung Kim         a_nbits_spec[ich] += *p_loc - loc;
403*aef9bcd9SKiyoung Kim 
404*aef9bcd9SKiyoung Kim         nbits_used += a_nbits_scfc[ich] + a_nbits_spec[ich];
405*aef9bcd9SKiyoung Kim     }
406*aef9bcd9SKiyoung Kim 
407*aef9bcd9SKiyoung Kim     if (nbits_used > p_ab->nbits_used) {
408*aef9bcd9SKiyoung Kim         *p_ab->p_error_code = LDAC_ERR_BIT_PACKING;
409*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
410*aef9bcd9SKiyoung Kim     }
411*aef9bcd9SKiyoung Kim     else if (nbits_used < p_ab->nbits_used) {
412*aef9bcd9SKiyoung Kim         *p_ab->p_error_code = LDAC_ERR_BIT_PACKING;
413*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
414*aef9bcd9SKiyoung Kim     }
415*aef9bcd9SKiyoung Kim 
416*aef9bcd9SKiyoung Kim     return LDAC_TRUE;
417*aef9bcd9SKiyoung Kim }
418*aef9bcd9SKiyoung Kim 
419*aef9bcd9SKiyoung Kim /***************************************************************************************************
420*aef9bcd9SKiyoung Kim     Pack Raw Data Frame
421*aef9bcd9SKiyoung Kim ***************************************************************************************************/
pack_raw_data_frame_ldac(SFINFO * p_sfinfo,STREAM * p_stream,int * p_loc,int * p_nbytes_used)422*aef9bcd9SKiyoung Kim DECLFUNC int pack_raw_data_frame_ldac(
423*aef9bcd9SKiyoung Kim SFINFO *p_sfinfo,
424*aef9bcd9SKiyoung Kim STREAM *p_stream,
425*aef9bcd9SKiyoung Kim int *p_loc,
426*aef9bcd9SKiyoung Kim int *p_nbytes_used)
427*aef9bcd9SKiyoung Kim {
428*aef9bcd9SKiyoung Kim     CFG *p_cfg = &p_sfinfo->cfg;
429*aef9bcd9SKiyoung Kim     AB *p_ab = p_sfinfo->p_ab;
430*aef9bcd9SKiyoung Kim     int ibk;
431*aef9bcd9SKiyoung Kim     int nbks = gaa_block_setting_ldac[p_cfg->chconfig_id][1];
432*aef9bcd9SKiyoung Kim 
433*aef9bcd9SKiyoung Kim     for (ibk = 0; ibk < nbks; ibk++) {
434*aef9bcd9SKiyoung Kim         if (!pack_audio_block_ldac(p_ab, p_stream, p_loc)) {
435*aef9bcd9SKiyoung Kim             return LDAC_ERR_PACK_BLOCK_FAILED;
436*aef9bcd9SKiyoung Kim         }
437*aef9bcd9SKiyoung Kim 
438*aef9bcd9SKiyoung Kim         pack_block_alignment_ldac(p_stream, p_loc);
439*aef9bcd9SKiyoung Kim 
440*aef9bcd9SKiyoung Kim         p_ab++;
441*aef9bcd9SKiyoung Kim     }
442*aef9bcd9SKiyoung Kim 
443*aef9bcd9SKiyoung Kim     pack_frame_alignment_ldac(p_stream, p_loc, p_cfg->frame_length);
444*aef9bcd9SKiyoung Kim 
445*aef9bcd9SKiyoung Kim     *p_nbytes_used = *p_loc / LDAC_BYTESIZE;
446*aef9bcd9SKiyoung Kim 
447*aef9bcd9SKiyoung Kim     return LDAC_ERR_NONE;
448*aef9bcd9SKiyoung Kim }
449*aef9bcd9SKiyoung Kim 
450*aef9bcd9SKiyoung Kim /***************************************************************************************************
451*aef9bcd9SKiyoung Kim     Pack Null Data Frame
452*aef9bcd9SKiyoung Kim ***************************************************************************************************/
453*aef9bcd9SKiyoung Kim static const int sa_null_data_size_ldac[2] = {
454*aef9bcd9SKiyoung Kim     11, 15,
455*aef9bcd9SKiyoung Kim };
456*aef9bcd9SKiyoung Kim static const STREAM saa_null_data_ldac[2][15] = {
457*aef9bcd9SKiyoung Kim     {0x07, 0xa0, 0x16, 0x00, 0x20, 0xad, 0x51, 0x45, 0x14, 0x50, 0x49},
458*aef9bcd9SKiyoung Kim     {0x07, 0xa0, 0x0a, 0x00, 0x20, 0xad, 0x51, 0x41, 0x24, 0x93, 0x00, 0x28, 0xa0, 0x92, 0x49},
459*aef9bcd9SKiyoung Kim };
460*aef9bcd9SKiyoung Kim 
pack_null_data_frame_ldac(SFINFO * p_sfinfo,STREAM * p_stream,int * p_loc,int * p_nbytes_used)461*aef9bcd9SKiyoung Kim DECLFUNC int pack_null_data_frame_ldac(
462*aef9bcd9SKiyoung Kim SFINFO *p_sfinfo,
463*aef9bcd9SKiyoung Kim STREAM *p_stream,
464*aef9bcd9SKiyoung Kim int *p_loc,
465*aef9bcd9SKiyoung Kim int *p_nbytes_used)
466*aef9bcd9SKiyoung Kim {
467*aef9bcd9SKiyoung Kim     CFG *p_cfg = &p_sfinfo->cfg;
468*aef9bcd9SKiyoung Kim     AB *p_ab = p_sfinfo->p_ab;
469*aef9bcd9SKiyoung Kim     int ibk;
470*aef9bcd9SKiyoung Kim     int nbks = gaa_block_setting_ldac[p_cfg->chconfig_id][1];
471*aef9bcd9SKiyoung Kim     int blk_type, size, offset = 0;
472*aef9bcd9SKiyoung Kim 
473*aef9bcd9SKiyoung Kim     for (ibk = 0; ibk < nbks; ibk++) {
474*aef9bcd9SKiyoung Kim         blk_type = p_ab->blk_type;
475*aef9bcd9SKiyoung Kim         size = sa_null_data_size_ldac[blk_type];
476*aef9bcd9SKiyoung Kim 
477*aef9bcd9SKiyoung Kim         copy_data_ldac(saa_null_data_ldac[blk_type], p_stream+offset, size*sizeof(STREAM));
478*aef9bcd9SKiyoung Kim         *p_loc += size*LDAC_BYTESIZE;
479*aef9bcd9SKiyoung Kim 
480*aef9bcd9SKiyoung Kim         offset += size;
481*aef9bcd9SKiyoung Kim         p_ab++;
482*aef9bcd9SKiyoung Kim     }
483*aef9bcd9SKiyoung Kim     if (p_cfg->frame_length < offset) {
484*aef9bcd9SKiyoung Kim         return LDAC_ERR_PACK_BLOCK_FAILED;
485*aef9bcd9SKiyoung Kim     }
486*aef9bcd9SKiyoung Kim 
487*aef9bcd9SKiyoung Kim     pack_frame_alignment_ldac(p_stream, p_loc, p_cfg->frame_length);
488*aef9bcd9SKiyoung Kim 
489*aef9bcd9SKiyoung Kim     *p_nbytes_used = *p_loc / LDAC_BYTESIZE;
490*aef9bcd9SKiyoung Kim 
491*aef9bcd9SKiyoung Kim     return LDAC_ERR_NONE;
492*aef9bcd9SKiyoung Kim }
493*aef9bcd9SKiyoung Kim 
494