xref: /aosp_15_r20/external/libldac/src/bitalloc_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 
21*aef9bcd9SKiyoung Kim /***************************************************************************************************
22*aef9bcd9SKiyoung Kim     Subfunction: Calculate Bits for Audio Block
23*aef9bcd9SKiyoung Kim ***************************************************************************************************/
encode_audio_block_a_ldac(AB * p_ab,int hqu)24*aef9bcd9SKiyoung Kim static int encode_audio_block_a_ldac(
25*aef9bcd9SKiyoung Kim AB *p_ab,
26*aef9bcd9SKiyoung Kim int hqu)
27*aef9bcd9SKiyoung Kim {
28*aef9bcd9SKiyoung Kim     AC *p_ac;
29*aef9bcd9SKiyoung Kim     int ich, iqu;
30*aef9bcd9SKiyoung Kim     int nchs = p_ab->blk_nchs;
31*aef9bcd9SKiyoung Kim     int tmp, nbits = 0;
32*aef9bcd9SKiyoung Kim     int idsp, idwl1, idwl2;
33*aef9bcd9SKiyoung Kim     int grad_mode = p_ab->grad_mode;
34*aef9bcd9SKiyoung Kim     int grad_qu_l = p_ab->grad_qu_l;
35*aef9bcd9SKiyoung Kim     int grad_qu_h = p_ab->grad_qu_h;
36*aef9bcd9SKiyoung Kim     int grad_os_l = p_ab->grad_os_l;
37*aef9bcd9SKiyoung Kim     int grad_os_h = p_ab->grad_os_h;
38*aef9bcd9SKiyoung Kim     int *p_grad = p_ab->a_grad;
39*aef9bcd9SKiyoung Kim     int *p_idsf, *p_addwl, *p_idwl1, *p_idwl2;
40*aef9bcd9SKiyoung Kim     const unsigned char *p_t;
41*aef9bcd9SKiyoung Kim 
42*aef9bcd9SKiyoung Kim     /* Calculate Gradient Curve */
43*aef9bcd9SKiyoung Kim     tmp = grad_qu_h - grad_qu_l;
44*aef9bcd9SKiyoung Kim 
45*aef9bcd9SKiyoung Kim     for (iqu = 0; iqu < grad_qu_h; iqu++) {
46*aef9bcd9SKiyoung Kim         p_grad[iqu] = -grad_os_l;
47*aef9bcd9SKiyoung Kim     }
48*aef9bcd9SKiyoung Kim     for (iqu = grad_qu_h; iqu < hqu; iqu++) {
49*aef9bcd9SKiyoung Kim         p_grad[iqu] = -grad_os_h;
50*aef9bcd9SKiyoung Kim     }
51*aef9bcd9SKiyoung Kim 
52*aef9bcd9SKiyoung Kim     if (tmp > 0) {
53*aef9bcd9SKiyoung Kim         p_t = gaa_resamp_grad_ldac[tmp-1];
54*aef9bcd9SKiyoung Kim 
55*aef9bcd9SKiyoung Kim         tmp = grad_os_h - grad_os_l;
56*aef9bcd9SKiyoung Kim         if (tmp > 0) {
57*aef9bcd9SKiyoung Kim             tmp = tmp-1;
58*aef9bcd9SKiyoung Kim             for (iqu = grad_qu_l; iqu < grad_qu_h; iqu++) {
59*aef9bcd9SKiyoung Kim                 p_grad[iqu] -= ((*p_t++ * tmp) >> 8) + 1;
60*aef9bcd9SKiyoung Kim             }
61*aef9bcd9SKiyoung Kim         }
62*aef9bcd9SKiyoung Kim         else if (tmp < 0) {
63*aef9bcd9SKiyoung Kim             tmp = -tmp-1;
64*aef9bcd9SKiyoung Kim             for (iqu = grad_qu_l; iqu < grad_qu_h; iqu++) {
65*aef9bcd9SKiyoung Kim                 p_grad[iqu] += ((*p_t++ * tmp) >> 8) + 1;
66*aef9bcd9SKiyoung Kim             }
67*aef9bcd9SKiyoung Kim         }
68*aef9bcd9SKiyoung Kim     }
69*aef9bcd9SKiyoung Kim 
70*aef9bcd9SKiyoung Kim     /* Calculate Bits */
71*aef9bcd9SKiyoung Kim     for (ich = 0; ich < nchs; ich++) {
72*aef9bcd9SKiyoung Kim         p_ac = p_ab->ap_ac[ich];
73*aef9bcd9SKiyoung Kim 	p_idsf = p_ac->a_idsf;
74*aef9bcd9SKiyoung Kim 	p_addwl = p_ac->a_addwl;
75*aef9bcd9SKiyoung Kim 	p_idwl1 = p_ac->a_idwl1;
76*aef9bcd9SKiyoung Kim 	p_idwl2 = p_ac->a_idwl2;
77*aef9bcd9SKiyoung Kim 
78*aef9bcd9SKiyoung Kim         if (grad_mode == LDAC_MODE_0) {
79*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < hqu; iqu++) {
80*aef9bcd9SKiyoung Kim                 idwl1 = p_idsf[iqu] + p_grad[iqu];
81*aef9bcd9SKiyoung Kim                 if (idwl1 < LDAC_MINIDWL1) {
82*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MINIDWL1;
83*aef9bcd9SKiyoung Kim                 }
84*aef9bcd9SKiyoung Kim                 idwl2 = 0;
85*aef9bcd9SKiyoung Kim                 if (idwl1 > LDAC_MAXIDWL1) {
86*aef9bcd9SKiyoung Kim                     idwl2 = idwl1 - LDAC_MAXIDWL1;
87*aef9bcd9SKiyoung Kim                     if (idwl2 > LDAC_MAXIDWL2) {
88*aef9bcd9SKiyoung Kim                         idwl2 = LDAC_MAXIDWL2;
89*aef9bcd9SKiyoung Kim                     }
90*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MAXIDWL1;
91*aef9bcd9SKiyoung Kim                 }
92*aef9bcd9SKiyoung Kim                 p_idwl1[iqu] = idwl1;
93*aef9bcd9SKiyoung Kim                 p_idwl2[iqu] = idwl2;
94*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
95*aef9bcd9SKiyoung Kim                 nbits += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
96*aef9bcd9SKiyoung Kim             }
97*aef9bcd9SKiyoung Kim         }
98*aef9bcd9SKiyoung Kim         else if (grad_mode == LDAC_MODE_1) {
99*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < hqu; iqu++) {
100*aef9bcd9SKiyoung Kim                 idwl1 = p_idsf[iqu] + p_grad[iqu] + p_addwl[iqu];
101*aef9bcd9SKiyoung Kim                 if (idwl1 > 0) {
102*aef9bcd9SKiyoung Kim                     idwl1 = idwl1 >> 1;
103*aef9bcd9SKiyoung Kim                 }
104*aef9bcd9SKiyoung Kim                 if (idwl1 < LDAC_MINIDWL1) {
105*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MINIDWL1;
106*aef9bcd9SKiyoung Kim                 }
107*aef9bcd9SKiyoung Kim                 idwl2 = 0;
108*aef9bcd9SKiyoung Kim                 if (idwl1 > LDAC_MAXIDWL1) {
109*aef9bcd9SKiyoung Kim                     idwl2 = idwl1 - LDAC_MAXIDWL1;
110*aef9bcd9SKiyoung Kim                     if (idwl2 > LDAC_MAXIDWL2) {
111*aef9bcd9SKiyoung Kim                         idwl2 = LDAC_MAXIDWL2;
112*aef9bcd9SKiyoung Kim                     }
113*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MAXIDWL1;
114*aef9bcd9SKiyoung Kim                 }
115*aef9bcd9SKiyoung Kim                 p_idwl1[iqu] = idwl1;
116*aef9bcd9SKiyoung Kim                 p_idwl2[iqu] = idwl2;
117*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
118*aef9bcd9SKiyoung Kim                 nbits += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
119*aef9bcd9SKiyoung Kim             }
120*aef9bcd9SKiyoung Kim         }
121*aef9bcd9SKiyoung Kim         else if (grad_mode == LDAC_MODE_2) {
122*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < hqu; iqu++) {
123*aef9bcd9SKiyoung Kim                 idwl1 = p_idsf[iqu] + p_grad[iqu] + p_addwl[iqu];
124*aef9bcd9SKiyoung Kim                 if (idwl1 > 0) {
125*aef9bcd9SKiyoung Kim                     idwl1 = (idwl1*3) >> 3;
126*aef9bcd9SKiyoung Kim                 }
127*aef9bcd9SKiyoung Kim                 if (idwl1 < LDAC_MINIDWL1) {
128*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MINIDWL1;
129*aef9bcd9SKiyoung Kim                 }
130*aef9bcd9SKiyoung Kim                 idwl2 = 0;
131*aef9bcd9SKiyoung Kim                 if (idwl1 > LDAC_MAXIDWL1) {
132*aef9bcd9SKiyoung Kim                     idwl2 = idwl1 - LDAC_MAXIDWL1;
133*aef9bcd9SKiyoung Kim                     if (idwl2 > LDAC_MAXIDWL2) {
134*aef9bcd9SKiyoung Kim                         idwl2 = LDAC_MAXIDWL2;
135*aef9bcd9SKiyoung Kim                     }
136*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MAXIDWL1;
137*aef9bcd9SKiyoung Kim                 }
138*aef9bcd9SKiyoung Kim                 p_idwl1[iqu] = idwl1;
139*aef9bcd9SKiyoung Kim                 p_idwl2[iqu] = idwl2;
140*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
141*aef9bcd9SKiyoung Kim                 nbits += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
142*aef9bcd9SKiyoung Kim             }
143*aef9bcd9SKiyoung Kim         }
144*aef9bcd9SKiyoung Kim         else if (grad_mode == LDAC_MODE_3) {
145*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < hqu; iqu++) {
146*aef9bcd9SKiyoung Kim                 idwl1 = p_idsf[iqu] + p_grad[iqu] + p_addwl[iqu];
147*aef9bcd9SKiyoung Kim                 if (idwl1 > 0) {
148*aef9bcd9SKiyoung Kim                     idwl1 = idwl1 >> 2;
149*aef9bcd9SKiyoung Kim                 }
150*aef9bcd9SKiyoung Kim                 if (idwl1 < LDAC_MINIDWL1) {
151*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MINIDWL1;
152*aef9bcd9SKiyoung Kim                 }
153*aef9bcd9SKiyoung Kim                 idwl2 = 0;
154*aef9bcd9SKiyoung Kim                 if (idwl1 > LDAC_MAXIDWL1) {
155*aef9bcd9SKiyoung Kim                     idwl2 = idwl1 - LDAC_MAXIDWL1;
156*aef9bcd9SKiyoung Kim                     if (idwl2 > LDAC_MAXIDWL2) {
157*aef9bcd9SKiyoung Kim                         idwl2 = LDAC_MAXIDWL2;
158*aef9bcd9SKiyoung Kim                     }
159*aef9bcd9SKiyoung Kim                     idwl1 = LDAC_MAXIDWL1;
160*aef9bcd9SKiyoung Kim                 }
161*aef9bcd9SKiyoung Kim                 p_idwl1[iqu] = idwl1;
162*aef9bcd9SKiyoung Kim                 p_idwl2[iqu] = idwl2;
163*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
164*aef9bcd9SKiyoung Kim                 nbits += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
165*aef9bcd9SKiyoung Kim             }
166*aef9bcd9SKiyoung Kim         }
167*aef9bcd9SKiyoung Kim     }
168*aef9bcd9SKiyoung Kim 
169*aef9bcd9SKiyoung Kim     return nbits;
170*aef9bcd9SKiyoung Kim }
171*aef9bcd9SKiyoung Kim 
172*aef9bcd9SKiyoung Kim /***************************************************************************************************
173*aef9bcd9SKiyoung Kim     Subfunction: Calculate Bits for Audio Block
174*aef9bcd9SKiyoung Kim ***************************************************************************************************/
encode_audio_block_b_ldac(AB * p_ab,int nadjqus)175*aef9bcd9SKiyoung Kim static int encode_audio_block_b_ldac(
176*aef9bcd9SKiyoung Kim AB *p_ab,
177*aef9bcd9SKiyoung Kim int nadjqus)
178*aef9bcd9SKiyoung Kim {
179*aef9bcd9SKiyoung Kim     AC *p_ac;
180*aef9bcd9SKiyoung Kim     int ich, iqu;
181*aef9bcd9SKiyoung Kim     int nchs = p_ab->blk_nchs;
182*aef9bcd9SKiyoung Kim     int nqus = min_ldac(LDAC_MAXNADJQUS, p_ab->nqus);
183*aef9bcd9SKiyoung Kim     int nbits = 0;
184*aef9bcd9SKiyoung Kim     int idsp, idwl1, idwl2;
185*aef9bcd9SKiyoung Kim     int *p_idwl1, *p_idwl2, *p_tmp;
186*aef9bcd9SKiyoung Kim 
187*aef9bcd9SKiyoung Kim     /* Calculate Bits */
188*aef9bcd9SKiyoung Kim     for (ich = 0; ich < nchs; ich++) {
189*aef9bcd9SKiyoung Kim         p_ac = p_ab->ap_ac[ich];
190*aef9bcd9SKiyoung Kim 	p_idwl1 = p_ac->a_idwl1;
191*aef9bcd9SKiyoung Kim 	p_idwl2 = p_ac->a_idwl2;
192*aef9bcd9SKiyoung Kim 	p_tmp = p_ac->a_tmp;
193*aef9bcd9SKiyoung Kim 
194*aef9bcd9SKiyoung Kim         for (iqu = 0; iqu < nqus; iqu++) {
195*aef9bcd9SKiyoung Kim             idwl1 = p_tmp[iqu];
196*aef9bcd9SKiyoung Kim             if (iqu < nadjqus) {
197*aef9bcd9SKiyoung Kim                 idwl1++;
198*aef9bcd9SKiyoung Kim             }
199*aef9bcd9SKiyoung Kim             idwl2 = 0;
200*aef9bcd9SKiyoung Kim             if (idwl1 > LDAC_MAXIDWL1) {
201*aef9bcd9SKiyoung Kim                 idwl2 = idwl1 - LDAC_MAXIDWL1;
202*aef9bcd9SKiyoung Kim                 if (idwl2 > LDAC_MAXIDWL2) {
203*aef9bcd9SKiyoung Kim                     idwl2 = LDAC_MAXIDWL2;
204*aef9bcd9SKiyoung Kim                 }
205*aef9bcd9SKiyoung Kim                 idwl1 = LDAC_MAXIDWL1;
206*aef9bcd9SKiyoung Kim             }
207*aef9bcd9SKiyoung Kim             p_idwl1[iqu] = idwl1;
208*aef9bcd9SKiyoung Kim             p_idwl2[iqu] = idwl2;
209*aef9bcd9SKiyoung Kim             idsp = ga_idsp_ldac[iqu];
210*aef9bcd9SKiyoung Kim             nbits += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
211*aef9bcd9SKiyoung Kim         }
212*aef9bcd9SKiyoung Kim     }
213*aef9bcd9SKiyoung Kim 
214*aef9bcd9SKiyoung Kim     return nbits;
215*aef9bcd9SKiyoung Kim }
216*aef9bcd9SKiyoung Kim 
217*aef9bcd9SKiyoung Kim /***************************************************************************************************
218*aef9bcd9SKiyoung Kim     Subfunction: Decrease Lower Offset of Gradient Curve
219*aef9bcd9SKiyoung Kim ***************************************************************************************************/
decrease_offset_low_ldac(AB * p_ab,int limit,int * p_nbits_spec)220*aef9bcd9SKiyoung Kim static int decrease_offset_low_ldac(
221*aef9bcd9SKiyoung Kim AB *p_ab,
222*aef9bcd9SKiyoung Kim int limit,
223*aef9bcd9SKiyoung Kim int *p_nbits_spec)
224*aef9bcd9SKiyoung Kim {
225*aef9bcd9SKiyoung Kim     int ncalls = 0;
226*aef9bcd9SKiyoung Kim     int nqus = p_ab->nqus;
227*aef9bcd9SKiyoung Kim     int grad_os_l = p_ab->grad_os_l;
228*aef9bcd9SKiyoung Kim     int nbits_avail = p_ab->nbits_avail;
229*aef9bcd9SKiyoung Kim     int step = limit - grad_os_l;
230*aef9bcd9SKiyoung Kim     int a_checked[LDAC_MAXGRADOS+1];
231*aef9bcd9SKiyoung Kim 
232*aef9bcd9SKiyoung Kim     if (*p_nbits_spec > nbits_avail) {
233*aef9bcd9SKiyoung Kim         memset(a_checked, 0, (LDAC_MAXGRADOS+1)*sizeof(int));
234*aef9bcd9SKiyoung Kim 
235*aef9bcd9SKiyoung Kim         while (grad_os_l < limit) {
236*aef9bcd9SKiyoung Kim             if (step > 1) {
237*aef9bcd9SKiyoung Kim                 step = (step+1)/2;
238*aef9bcd9SKiyoung Kim             }
239*aef9bcd9SKiyoung Kim 
240*aef9bcd9SKiyoung Kim             if (*p_nbits_spec < nbits_avail) {
241*aef9bcd9SKiyoung Kim                 grad_os_l -= step;
242*aef9bcd9SKiyoung Kim                 if (grad_os_l < 0) {
243*aef9bcd9SKiyoung Kim                     grad_os_l += step;
244*aef9bcd9SKiyoung Kim                     break;
245*aef9bcd9SKiyoung Kim                 }
246*aef9bcd9SKiyoung Kim                 else if (a_checked[grad_os_l]) {
247*aef9bcd9SKiyoung Kim                     grad_os_l += step;
248*aef9bcd9SKiyoung Kim                     break;
249*aef9bcd9SKiyoung Kim                 }
250*aef9bcd9SKiyoung Kim             }
251*aef9bcd9SKiyoung Kim             else if (*p_nbits_spec > nbits_avail) {
252*aef9bcd9SKiyoung Kim                 grad_os_l += step;
253*aef9bcd9SKiyoung Kim                 if (grad_os_l > LDAC_MAXGRADOS) {
254*aef9bcd9SKiyoung Kim                     grad_os_l -= step;
255*aef9bcd9SKiyoung Kim                     break;
256*aef9bcd9SKiyoung Kim                 }
257*aef9bcd9SKiyoung Kim                 else if (a_checked[grad_os_l]) {
258*aef9bcd9SKiyoung Kim                     grad_os_l -= step;
259*aef9bcd9SKiyoung Kim                     break;
260*aef9bcd9SKiyoung Kim                 }
261*aef9bcd9SKiyoung Kim             }
262*aef9bcd9SKiyoung Kim             else {
263*aef9bcd9SKiyoung Kim                 break;
264*aef9bcd9SKiyoung Kim             }
265*aef9bcd9SKiyoung Kim 
266*aef9bcd9SKiyoung Kim             p_ab->grad_os_l = grad_os_l;
267*aef9bcd9SKiyoung Kim             *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
268*aef9bcd9SKiyoung Kim             a_checked[grad_os_l] = *p_nbits_spec;
269*aef9bcd9SKiyoung Kim             ncalls++;
270*aef9bcd9SKiyoung Kim         }
271*aef9bcd9SKiyoung Kim 
272*aef9bcd9SKiyoung Kim         while ((*p_nbits_spec > nbits_avail) && (grad_os_l < limit)) {
273*aef9bcd9SKiyoung Kim             p_ab->grad_os_l = ++grad_os_l;
274*aef9bcd9SKiyoung Kim             *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
275*aef9bcd9SKiyoung Kim             ncalls++;
276*aef9bcd9SKiyoung Kim         }
277*aef9bcd9SKiyoung Kim     }
278*aef9bcd9SKiyoung Kim 
279*aef9bcd9SKiyoung Kim     return ncalls;
280*aef9bcd9SKiyoung Kim }
281*aef9bcd9SKiyoung Kim 
282*aef9bcd9SKiyoung Kim /***************************************************************************************************
283*aef9bcd9SKiyoung Kim     Subfunction: Decrease Higher Offset of Gradient Curve
284*aef9bcd9SKiyoung Kim ***************************************************************************************************/
decrease_offset_high_ldac(AB * p_ab,int * p_nbits_spec)285*aef9bcd9SKiyoung Kim static int decrease_offset_high_ldac(
286*aef9bcd9SKiyoung Kim AB *p_ab,
287*aef9bcd9SKiyoung Kim int *p_nbits_spec)
288*aef9bcd9SKiyoung Kim {
289*aef9bcd9SKiyoung Kim     int ncalls = 0;
290*aef9bcd9SKiyoung Kim     int nqus = p_ab->nqus;
291*aef9bcd9SKiyoung Kim     int grad_os_h = p_ab->grad_os_h;
292*aef9bcd9SKiyoung Kim     int nbits_avail = p_ab->nbits_avail;
293*aef9bcd9SKiyoung Kim     int step = LDAC_MAXGRADOS - grad_os_h;
294*aef9bcd9SKiyoung Kim     int a_checked[LDAC_MAXGRADOS+1];
295*aef9bcd9SKiyoung Kim 
296*aef9bcd9SKiyoung Kim     if (*p_nbits_spec > nbits_avail) {
297*aef9bcd9SKiyoung Kim         memset(a_checked, 0, (LDAC_MAXGRADOS+1)*sizeof(int));
298*aef9bcd9SKiyoung Kim 
299*aef9bcd9SKiyoung Kim         while (grad_os_h < LDAC_MAXGRADOS) {
300*aef9bcd9SKiyoung Kim             if (step > 1) {
301*aef9bcd9SKiyoung Kim                 step = (step+1)/2;
302*aef9bcd9SKiyoung Kim             }
303*aef9bcd9SKiyoung Kim 
304*aef9bcd9SKiyoung Kim             if (*p_nbits_spec < nbits_avail) {
305*aef9bcd9SKiyoung Kim                 grad_os_h -= step;
306*aef9bcd9SKiyoung Kim                 if (grad_os_h < 0) {
307*aef9bcd9SKiyoung Kim                     grad_os_h += step;
308*aef9bcd9SKiyoung Kim                     break;
309*aef9bcd9SKiyoung Kim                 }
310*aef9bcd9SKiyoung Kim                 else if (a_checked[grad_os_h]) {
311*aef9bcd9SKiyoung Kim                     grad_os_h += step;
312*aef9bcd9SKiyoung Kim                     break;
313*aef9bcd9SKiyoung Kim                 }
314*aef9bcd9SKiyoung Kim             }
315*aef9bcd9SKiyoung Kim             else if (*p_nbits_spec > nbits_avail) {
316*aef9bcd9SKiyoung Kim                 grad_os_h += step;
317*aef9bcd9SKiyoung Kim                 if (grad_os_h > LDAC_MAXGRADOS) {
318*aef9bcd9SKiyoung Kim                     grad_os_h -= step;
319*aef9bcd9SKiyoung Kim                     break;
320*aef9bcd9SKiyoung Kim                 }
321*aef9bcd9SKiyoung Kim                 else if (a_checked[grad_os_h]) {
322*aef9bcd9SKiyoung Kim                     grad_os_h -= step;
323*aef9bcd9SKiyoung Kim                     break;
324*aef9bcd9SKiyoung Kim                 }
325*aef9bcd9SKiyoung Kim             }
326*aef9bcd9SKiyoung Kim             else {
327*aef9bcd9SKiyoung Kim                 break;
328*aef9bcd9SKiyoung Kim             }
329*aef9bcd9SKiyoung Kim 
330*aef9bcd9SKiyoung Kim             p_ab->grad_os_h = grad_os_h;
331*aef9bcd9SKiyoung Kim             *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
332*aef9bcd9SKiyoung Kim             a_checked[grad_os_h] = *p_nbits_spec;
333*aef9bcd9SKiyoung Kim             ncalls++;
334*aef9bcd9SKiyoung Kim         }
335*aef9bcd9SKiyoung Kim 
336*aef9bcd9SKiyoung Kim         while ((*p_nbits_spec > nbits_avail) && (grad_os_h < LDAC_MAXGRADOS)) {
337*aef9bcd9SKiyoung Kim             p_ab->grad_os_h = ++grad_os_h;
338*aef9bcd9SKiyoung Kim             *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
339*aef9bcd9SKiyoung Kim             ncalls++;
340*aef9bcd9SKiyoung Kim         }
341*aef9bcd9SKiyoung Kim     }
342*aef9bcd9SKiyoung Kim 
343*aef9bcd9SKiyoung Kim     return ncalls;
344*aef9bcd9SKiyoung Kim }
345*aef9bcd9SKiyoung Kim 
346*aef9bcd9SKiyoung Kim /***************************************************************************************************
347*aef9bcd9SKiyoung Kim     Subfunction: Increase Lower Offset of Gradient Curve
348*aef9bcd9SKiyoung Kim ***************************************************************************************************/
increase_offset_low_ldac(AB * p_ab,int * p_nbits_spec)349*aef9bcd9SKiyoung Kim static int increase_offset_low_ldac(
350*aef9bcd9SKiyoung Kim AB *p_ab,
351*aef9bcd9SKiyoung Kim int *p_nbits_spec)
352*aef9bcd9SKiyoung Kim {
353*aef9bcd9SKiyoung Kim     int ncalls = 0;
354*aef9bcd9SKiyoung Kim     int nqus = p_ab->nqus;
355*aef9bcd9SKiyoung Kim     int grad_os_l = p_ab->grad_os_l;
356*aef9bcd9SKiyoung Kim     int nbits_avail = p_ab->nbits_avail;
357*aef9bcd9SKiyoung Kim     int step = grad_os_l;
358*aef9bcd9SKiyoung Kim     int a_checked[LDAC_MAXGRADOS+1];
359*aef9bcd9SKiyoung Kim 
360*aef9bcd9SKiyoung Kim     memset(a_checked, 0, (LDAC_MAXGRADOS+1)*sizeof(int));
361*aef9bcd9SKiyoung Kim 
362*aef9bcd9SKiyoung Kim     while (grad_os_l > 0) {
363*aef9bcd9SKiyoung Kim         if (step > 1) {
364*aef9bcd9SKiyoung Kim             step = (step+1)/2;
365*aef9bcd9SKiyoung Kim         }
366*aef9bcd9SKiyoung Kim 
367*aef9bcd9SKiyoung Kim         if (*p_nbits_spec < nbits_avail) {
368*aef9bcd9SKiyoung Kim             grad_os_l -= step;
369*aef9bcd9SKiyoung Kim             if (grad_os_l < 0) {
370*aef9bcd9SKiyoung Kim                 grad_os_l += step;
371*aef9bcd9SKiyoung Kim                 break;
372*aef9bcd9SKiyoung Kim             }
373*aef9bcd9SKiyoung Kim             else if (a_checked[grad_os_l]) {
374*aef9bcd9SKiyoung Kim                 grad_os_l += step;
375*aef9bcd9SKiyoung Kim                 break;
376*aef9bcd9SKiyoung Kim             }
377*aef9bcd9SKiyoung Kim         }
378*aef9bcd9SKiyoung Kim         else if (*p_nbits_spec > nbits_avail) {
379*aef9bcd9SKiyoung Kim             grad_os_l += step;
380*aef9bcd9SKiyoung Kim             if (grad_os_l > LDAC_MAXGRADOS) {
381*aef9bcd9SKiyoung Kim                 grad_os_l -= step;
382*aef9bcd9SKiyoung Kim                 break;
383*aef9bcd9SKiyoung Kim             }
384*aef9bcd9SKiyoung Kim             else if (a_checked[grad_os_l]) {
385*aef9bcd9SKiyoung Kim                 grad_os_l -= step;
386*aef9bcd9SKiyoung Kim                 break;
387*aef9bcd9SKiyoung Kim             }
388*aef9bcd9SKiyoung Kim         }
389*aef9bcd9SKiyoung Kim         else {
390*aef9bcd9SKiyoung Kim             break;
391*aef9bcd9SKiyoung Kim         }
392*aef9bcd9SKiyoung Kim 
393*aef9bcd9SKiyoung Kim         p_ab->grad_os_l = grad_os_l;
394*aef9bcd9SKiyoung Kim         *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
395*aef9bcd9SKiyoung Kim         a_checked[grad_os_l] = *p_nbits_spec;
396*aef9bcd9SKiyoung Kim         ncalls++;
397*aef9bcd9SKiyoung Kim     }
398*aef9bcd9SKiyoung Kim 
399*aef9bcd9SKiyoung Kim     while ((*p_nbits_spec > nbits_avail) && (grad_os_l < LDAC_MAXGRADOS)) {
400*aef9bcd9SKiyoung Kim         p_ab->grad_os_l = ++grad_os_l;
401*aef9bcd9SKiyoung Kim         *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
402*aef9bcd9SKiyoung Kim         ncalls++;
403*aef9bcd9SKiyoung Kim     }
404*aef9bcd9SKiyoung Kim 
405*aef9bcd9SKiyoung Kim     return ncalls;
406*aef9bcd9SKiyoung Kim }
407*aef9bcd9SKiyoung Kim 
408*aef9bcd9SKiyoung Kim 
409*aef9bcd9SKiyoung Kim /***************************************************************************************************
410*aef9bcd9SKiyoung Kim     Subfunction: Increase Lower QU of Gradient Curve
411*aef9bcd9SKiyoung Kim ***************************************************************************************************/
increase_qu_low_ldac(AB * p_ab,int * p_nbits_spec)412*aef9bcd9SKiyoung Kim static int increase_qu_low_ldac(
413*aef9bcd9SKiyoung Kim AB *p_ab,
414*aef9bcd9SKiyoung Kim int *p_nbits_spec)
415*aef9bcd9SKiyoung Kim {
416*aef9bcd9SKiyoung Kim     int ncalls = 0;
417*aef9bcd9SKiyoung Kim     int nqus = p_ab->nqus;
418*aef9bcd9SKiyoung Kim     int grad_qu_l = p_ab->grad_qu_l;
419*aef9bcd9SKiyoung Kim     int grad_qu_h = p_ab->grad_qu_h;
420*aef9bcd9SKiyoung Kim     int nbits_avail = p_ab->nbits_avail;
421*aef9bcd9SKiyoung Kim     int step = grad_qu_h - grad_qu_l;
422*aef9bcd9SKiyoung Kim     int a_checked[LDAC_DEFGRADQUH+1];
423*aef9bcd9SKiyoung Kim 
424*aef9bcd9SKiyoung Kim     memset(a_checked, 0, (LDAC_DEFGRADQUH+1)*sizeof(int));
425*aef9bcd9SKiyoung Kim 
426*aef9bcd9SKiyoung Kim     while ((grad_qu_l > 0) && (grad_qu_l < LDAC_DEFGRADQUH)) {
427*aef9bcd9SKiyoung Kim         if (step > 1) {
428*aef9bcd9SKiyoung Kim             step = (step+1)/2;
429*aef9bcd9SKiyoung Kim         }
430*aef9bcd9SKiyoung Kim 
431*aef9bcd9SKiyoung Kim         if (*p_nbits_spec < nbits_avail) {
432*aef9bcd9SKiyoung Kim             grad_qu_l += step;
433*aef9bcd9SKiyoung Kim             if (grad_qu_l > LDAC_DEFGRADQUH) {
434*aef9bcd9SKiyoung Kim                 grad_qu_l -= step;
435*aef9bcd9SKiyoung Kim                 break;
436*aef9bcd9SKiyoung Kim             }
437*aef9bcd9SKiyoung Kim             else if (a_checked[grad_qu_l]) {
438*aef9bcd9SKiyoung Kim                 grad_qu_l -= step;
439*aef9bcd9SKiyoung Kim                 break;
440*aef9bcd9SKiyoung Kim             }
441*aef9bcd9SKiyoung Kim         }
442*aef9bcd9SKiyoung Kim         else if (*p_nbits_spec > nbits_avail) {
443*aef9bcd9SKiyoung Kim             grad_qu_l -= step;
444*aef9bcd9SKiyoung Kim             if (grad_qu_l < 0) {
445*aef9bcd9SKiyoung Kim                 grad_qu_l += step;
446*aef9bcd9SKiyoung Kim                 break;
447*aef9bcd9SKiyoung Kim             }
448*aef9bcd9SKiyoung Kim             else if (a_checked[grad_qu_l]) {
449*aef9bcd9SKiyoung Kim                 grad_qu_l += step;
450*aef9bcd9SKiyoung Kim                 break;
451*aef9bcd9SKiyoung Kim             }
452*aef9bcd9SKiyoung Kim         }
453*aef9bcd9SKiyoung Kim         else {
454*aef9bcd9SKiyoung Kim             break;
455*aef9bcd9SKiyoung Kim         }
456*aef9bcd9SKiyoung Kim 
457*aef9bcd9SKiyoung Kim         p_ab->grad_qu_l = grad_qu_l;
458*aef9bcd9SKiyoung Kim         *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
459*aef9bcd9SKiyoung Kim         a_checked[grad_qu_l] = *p_nbits_spec;
460*aef9bcd9SKiyoung Kim         ncalls++;
461*aef9bcd9SKiyoung Kim     }
462*aef9bcd9SKiyoung Kim 
463*aef9bcd9SKiyoung Kim     while ((*p_nbits_spec > nbits_avail) && (grad_qu_l <= LDAC_DEFGRADQUH)) {
464*aef9bcd9SKiyoung Kim         p_ab->grad_qu_l = --grad_qu_l;
465*aef9bcd9SKiyoung Kim         *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
466*aef9bcd9SKiyoung Kim         ncalls++;
467*aef9bcd9SKiyoung Kim     }
468*aef9bcd9SKiyoung Kim 
469*aef9bcd9SKiyoung Kim     return ncalls;
470*aef9bcd9SKiyoung Kim }
471*aef9bcd9SKiyoung Kim 
472*aef9bcd9SKiyoung Kim /***************************************************************************************************
473*aef9bcd9SKiyoung Kim     Subfunction: Increase Lower QU of Gradient Curve
474*aef9bcd9SKiyoung Kim ***************************************************************************************************/
increase_qu_low_0_ldac(AB * p_ab,int * p_nbits_spec)475*aef9bcd9SKiyoung Kim static int increase_qu_low_0_ldac(
476*aef9bcd9SKiyoung Kim AB *p_ab,
477*aef9bcd9SKiyoung Kim int *p_nbits_spec)
478*aef9bcd9SKiyoung Kim {
479*aef9bcd9SKiyoung Kim     int ncalls = 0;
480*aef9bcd9SKiyoung Kim     int nqus = p_ab->nqus;
481*aef9bcd9SKiyoung Kim     int grad_qu_l = p_ab->grad_qu_l;
482*aef9bcd9SKiyoung Kim     int grad_qu_h = p_ab->grad_qu_h;
483*aef9bcd9SKiyoung Kim     int nbits_avail = p_ab->nbits_avail;
484*aef9bcd9SKiyoung Kim     int step = grad_qu_h - grad_qu_l;
485*aef9bcd9SKiyoung Kim     int a_checked[LDAC_MAXGRADQU+1];
486*aef9bcd9SKiyoung Kim 
487*aef9bcd9SKiyoung Kim     memset(a_checked, 0, (LDAC_MAXGRADQU+1)*sizeof(int));
488*aef9bcd9SKiyoung Kim 
489*aef9bcd9SKiyoung Kim     while ((grad_qu_l > 0) && (grad_qu_l < grad_qu_h)) {
490*aef9bcd9SKiyoung Kim         if (step > 1) {
491*aef9bcd9SKiyoung Kim             step = step/2;
492*aef9bcd9SKiyoung Kim         }
493*aef9bcd9SKiyoung Kim 
494*aef9bcd9SKiyoung Kim         if (*p_nbits_spec < nbits_avail) {
495*aef9bcd9SKiyoung Kim             grad_qu_l += step;
496*aef9bcd9SKiyoung Kim             if (grad_qu_l >= grad_qu_h) {
497*aef9bcd9SKiyoung Kim                 grad_qu_l -= step;
498*aef9bcd9SKiyoung Kim                 break;
499*aef9bcd9SKiyoung Kim             }
500*aef9bcd9SKiyoung Kim             else if (a_checked[grad_qu_l]) {
501*aef9bcd9SKiyoung Kim                 grad_qu_l -= step;
502*aef9bcd9SKiyoung Kim                 break;
503*aef9bcd9SKiyoung Kim             }
504*aef9bcd9SKiyoung Kim         }
505*aef9bcd9SKiyoung Kim         else if (*p_nbits_spec > nbits_avail) {
506*aef9bcd9SKiyoung Kim             grad_qu_l -= step;
507*aef9bcd9SKiyoung Kim             if (grad_qu_l < 0) {
508*aef9bcd9SKiyoung Kim                 grad_qu_l += step;
509*aef9bcd9SKiyoung Kim                 break;
510*aef9bcd9SKiyoung Kim             }
511*aef9bcd9SKiyoung Kim             else if (a_checked[grad_qu_l]) {
512*aef9bcd9SKiyoung Kim                 grad_qu_l += step;
513*aef9bcd9SKiyoung Kim                 break;
514*aef9bcd9SKiyoung Kim             }
515*aef9bcd9SKiyoung Kim         }
516*aef9bcd9SKiyoung Kim         else {
517*aef9bcd9SKiyoung Kim             break;
518*aef9bcd9SKiyoung Kim         }
519*aef9bcd9SKiyoung Kim 
520*aef9bcd9SKiyoung Kim         p_ab->grad_qu_l = grad_qu_l;
521*aef9bcd9SKiyoung Kim         *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
522*aef9bcd9SKiyoung Kim         a_checked[grad_qu_l] = *p_nbits_spec;
523*aef9bcd9SKiyoung Kim         ncalls++;
524*aef9bcd9SKiyoung Kim     }
525*aef9bcd9SKiyoung Kim 
526*aef9bcd9SKiyoung Kim     while ((*p_nbits_spec > nbits_avail) && (grad_qu_l > 0)) {
527*aef9bcd9SKiyoung Kim         p_ab->grad_qu_l = --grad_qu_l;
528*aef9bcd9SKiyoung Kim         *p_nbits_spec = encode_audio_block_a_ldac(p_ab, nqus);
529*aef9bcd9SKiyoung Kim         ncalls++;
530*aef9bcd9SKiyoung Kim     }
531*aef9bcd9SKiyoung Kim 
532*aef9bcd9SKiyoung Kim     return ncalls;
533*aef9bcd9SKiyoung Kim }
534*aef9bcd9SKiyoung Kim 
535*aef9bcd9SKiyoung Kim /***************************************************************************************************
536*aef9bcd9SKiyoung Kim     Subfunction: Adjust Remaining Bits
537*aef9bcd9SKiyoung Kim ***************************************************************************************************/
adjust_remain_bits_ldac(AB * p_ab,int * p_nbits_spec,int * p_nadjqus)538*aef9bcd9SKiyoung Kim static int adjust_remain_bits_ldac(
539*aef9bcd9SKiyoung Kim AB *p_ab,
540*aef9bcd9SKiyoung Kim int *p_nbits_spec,
541*aef9bcd9SKiyoung Kim int *p_nadjqus)
542*aef9bcd9SKiyoung Kim {
543*aef9bcd9SKiyoung Kim     int ich, iqu;
544*aef9bcd9SKiyoung Kim     int ncalls = 0;
545*aef9bcd9SKiyoung Kim     int nbits_fix, nbits_spec;
546*aef9bcd9SKiyoung Kim     int nbits_avail = p_ab->nbits_avail;
547*aef9bcd9SKiyoung Kim     int idsp, idwl1, idwl2, tmp;
548*aef9bcd9SKiyoung Kim     int step = LDAC_MAXNADJQUS>>1;
549*aef9bcd9SKiyoung Kim     int nadjqus = LDAC_MAXNADJQUS>>1;
550*aef9bcd9SKiyoung Kim     int nchs = p_ab->blk_nchs;
551*aef9bcd9SKiyoung Kim     int nqus = min_ldac(LDAC_MAXNADJQUS, p_ab->nqus);
552*aef9bcd9SKiyoung Kim     int grad_mode = p_ab->grad_mode;
553*aef9bcd9SKiyoung Kim     int *p_grad = p_ab->a_grad;
554*aef9bcd9SKiyoung Kim     int *p_idsf, *p_addwl, *p_idwl1, *p_idwl2, *p_tmp;
555*aef9bcd9SKiyoung Kim     AC *p_ac;
556*aef9bcd9SKiyoung Kim 
557*aef9bcd9SKiyoung Kim     nbits_fix = 0;
558*aef9bcd9SKiyoung Kim     for (ich = 0; ich < nchs; ich++){
559*aef9bcd9SKiyoung Kim         p_ac = p_ab->ap_ac[ich];
560*aef9bcd9SKiyoung Kim         p_idsf = p_ac->a_idsf;
561*aef9bcd9SKiyoung Kim         p_addwl = p_ac->a_addwl;
562*aef9bcd9SKiyoung Kim         p_idwl1 = p_ac->a_idwl1;
563*aef9bcd9SKiyoung Kim         p_idwl2 = p_ac->a_idwl2;
564*aef9bcd9SKiyoung Kim         p_tmp = p_ac->a_tmp;
565*aef9bcd9SKiyoung Kim 
566*aef9bcd9SKiyoung Kim         if (grad_mode == LDAC_MODE_0) {
567*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < nqus; iqu++) {
568*aef9bcd9SKiyoung Kim 		idwl1 = p_idwl1[iqu];
569*aef9bcd9SKiyoung Kim 		idwl2 = p_idwl2[iqu];
570*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
571*aef9bcd9SKiyoung Kim                 nbits_fix += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
572*aef9bcd9SKiyoung Kim                 tmp = p_idsf[iqu] + p_grad[iqu];
573*aef9bcd9SKiyoung Kim                 if (tmp < LDAC_MINIDWL1) {
574*aef9bcd9SKiyoung Kim                     tmp = LDAC_MINIDWL1;
575*aef9bcd9SKiyoung Kim                 }
576*aef9bcd9SKiyoung Kim                 p_tmp[iqu] = tmp;
577*aef9bcd9SKiyoung Kim             }
578*aef9bcd9SKiyoung Kim         }
579*aef9bcd9SKiyoung Kim         else if (grad_mode == LDAC_MODE_1) {
580*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < nqus; iqu++) {
581*aef9bcd9SKiyoung Kim 		idwl1 = p_idwl1[iqu];
582*aef9bcd9SKiyoung Kim 		idwl2 = p_idwl2[iqu];
583*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
584*aef9bcd9SKiyoung Kim                 nbits_fix += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
585*aef9bcd9SKiyoung Kim                 tmp = p_idsf[iqu] + p_grad[iqu] + p_addwl[iqu];
586*aef9bcd9SKiyoung Kim                 if (tmp > 0) {
587*aef9bcd9SKiyoung Kim                     tmp = tmp >> 1;
588*aef9bcd9SKiyoung Kim                 }
589*aef9bcd9SKiyoung Kim                 if (tmp < LDAC_MINIDWL1) {
590*aef9bcd9SKiyoung Kim                     tmp = LDAC_MINIDWL1;
591*aef9bcd9SKiyoung Kim                 }
592*aef9bcd9SKiyoung Kim                 p_tmp[iqu] = tmp;
593*aef9bcd9SKiyoung Kim             }
594*aef9bcd9SKiyoung Kim         }
595*aef9bcd9SKiyoung Kim         else if (grad_mode == LDAC_MODE_2) {
596*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < nqus; iqu++) {
597*aef9bcd9SKiyoung Kim 		idwl1 = p_idwl1[iqu];
598*aef9bcd9SKiyoung Kim 		idwl2 = p_idwl2[iqu];
599*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
600*aef9bcd9SKiyoung Kim                 nbits_fix += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
601*aef9bcd9SKiyoung Kim                 tmp = p_idsf[iqu] + p_grad[iqu] + p_addwl[iqu];
602*aef9bcd9SKiyoung Kim                 if (tmp > 0) {
603*aef9bcd9SKiyoung Kim                     tmp = (tmp*3) >> 3;
604*aef9bcd9SKiyoung Kim                 }
605*aef9bcd9SKiyoung Kim                 if (tmp < LDAC_MINIDWL1) {
606*aef9bcd9SKiyoung Kim                     tmp = LDAC_MINIDWL1;
607*aef9bcd9SKiyoung Kim                 }
608*aef9bcd9SKiyoung Kim                 p_tmp[iqu] = tmp;
609*aef9bcd9SKiyoung Kim             }
610*aef9bcd9SKiyoung Kim         }
611*aef9bcd9SKiyoung Kim         else if (grad_mode == LDAC_MODE_3) {
612*aef9bcd9SKiyoung Kim             for (iqu = 0; iqu < nqus; iqu++) {
613*aef9bcd9SKiyoung Kim 		idwl1 = p_idwl1[iqu];
614*aef9bcd9SKiyoung Kim 		idwl2 = p_idwl2[iqu];
615*aef9bcd9SKiyoung Kim                 idsp = ga_idsp_ldac[iqu];
616*aef9bcd9SKiyoung Kim                 nbits_fix += gaa_ndim_wls_ldac[idsp][idwl1] + ga_wl_ldac[idwl2] * ga_nsps_ldac[iqu];
617*aef9bcd9SKiyoung Kim                 tmp = p_idsf[iqu] + p_grad[iqu] + p_addwl[iqu];
618*aef9bcd9SKiyoung Kim                 if (tmp > 0) {
619*aef9bcd9SKiyoung Kim                     tmp = tmp >> 2;
620*aef9bcd9SKiyoung Kim                 }
621*aef9bcd9SKiyoung Kim                 if (tmp < LDAC_MINIDWL1) {
622*aef9bcd9SKiyoung Kim                     tmp = LDAC_MINIDWL1;
623*aef9bcd9SKiyoung Kim                 }
624*aef9bcd9SKiyoung Kim                 p_tmp[iqu] = tmp;
625*aef9bcd9SKiyoung Kim             }
626*aef9bcd9SKiyoung Kim         }
627*aef9bcd9SKiyoung Kim     }
628*aef9bcd9SKiyoung Kim 
629*aef9bcd9SKiyoung Kim     nbits_fix = *p_nbits_spec - nbits_fix;
630*aef9bcd9SKiyoung Kim     nbits_spec = nbits_fix + encode_audio_block_b_ldac(p_ab, nadjqus);
631*aef9bcd9SKiyoung Kim     ncalls++;
632*aef9bcd9SKiyoung Kim 
633*aef9bcd9SKiyoung Kim     while (step > 1) {
634*aef9bcd9SKiyoung Kim         step >>= 1;
635*aef9bcd9SKiyoung Kim 
636*aef9bcd9SKiyoung Kim         if (nbits_spec < nbits_avail) {
637*aef9bcd9SKiyoung Kim             nadjqus += step;
638*aef9bcd9SKiyoung Kim             if (nadjqus > p_ab->nqus) {
639*aef9bcd9SKiyoung Kim                 nadjqus = p_ab->nqus;
640*aef9bcd9SKiyoung Kim             }
641*aef9bcd9SKiyoung Kim         }
642*aef9bcd9SKiyoung Kim         else if (nbits_spec > nbits_avail) {
643*aef9bcd9SKiyoung Kim             nadjqus -= step;
644*aef9bcd9SKiyoung Kim         }
645*aef9bcd9SKiyoung Kim         else {
646*aef9bcd9SKiyoung Kim             if (nadjqus > p_ab->nqus) {
647*aef9bcd9SKiyoung Kim                 nadjqus = p_ab->nqus;
648*aef9bcd9SKiyoung Kim             }
649*aef9bcd9SKiyoung Kim             break;
650*aef9bcd9SKiyoung Kim         }
651*aef9bcd9SKiyoung Kim         nbits_spec = nbits_fix + encode_audio_block_b_ldac(p_ab, nadjqus);
652*aef9bcd9SKiyoung Kim         ncalls++;
653*aef9bcd9SKiyoung Kim     }
654*aef9bcd9SKiyoung Kim 
655*aef9bcd9SKiyoung Kim     if (nbits_spec > nbits_avail) {
656*aef9bcd9SKiyoung Kim         nadjqus--;
657*aef9bcd9SKiyoung Kim         nbits_spec = nbits_fix + encode_audio_block_b_ldac(p_ab, nadjqus);
658*aef9bcd9SKiyoung Kim         ncalls++;
659*aef9bcd9SKiyoung Kim     }
660*aef9bcd9SKiyoung Kim     *p_nadjqus = nadjqus;
661*aef9bcd9SKiyoung Kim     *p_nbits_spec = nbits_spec;
662*aef9bcd9SKiyoung Kim 
663*aef9bcd9SKiyoung Kim     return ncalls;
664*aef9bcd9SKiyoung Kim }
665*aef9bcd9SKiyoung Kim 
666*aef9bcd9SKiyoung Kim /***************************************************************************************************
667*aef9bcd9SKiyoung Kim     Allocate Bits
668*aef9bcd9SKiyoung Kim ***************************************************************************************************/
669*aef9bcd9SKiyoung Kim #define LDAC_UPPER_NOISE_LEVEL 20
670*aef9bcd9SKiyoung Kim #define LDAC_LOWER_NOISE_LEVEL 5
671*aef9bcd9SKiyoung Kim 
alloc_bits_ldac(AB * p_ab)672*aef9bcd9SKiyoung Kim DECLFUNC int alloc_bits_ldac(
673*aef9bcd9SKiyoung Kim AB *p_ab)
674*aef9bcd9SKiyoung Kim {
675*aef9bcd9SKiyoung Kim     int nbits_avail, nbits_side = 0, nbits_spec = 0;
676*aef9bcd9SKiyoung Kim     int nbits_ab = p_ab->nbits_ab;
677*aef9bcd9SKiyoung Kim 
678*aef9bcd9SKiyoung Kim     nbits_side = encode_side_info_ldac(p_ab);
679*aef9bcd9SKiyoung Kim     p_ab->nbits_avail = nbits_avail = nbits_ab - nbits_side;
680*aef9bcd9SKiyoung Kim 
681*aef9bcd9SKiyoung Kim     nbits_spec = encode_audio_block_a_ldac(p_ab, p_ab->nqus);
682*aef9bcd9SKiyoung Kim 
683*aef9bcd9SKiyoung Kim     if (nbits_spec > nbits_avail) {
684*aef9bcd9SKiyoung Kim         if (p_ab->grad_mode == LDAC_MODE_0) {
685*aef9bcd9SKiyoung Kim             decrease_offset_low_ldac(p_ab, LDAC_UPPER_NOISE_LEVEL, &nbits_spec);
686*aef9bcd9SKiyoung Kim 
687*aef9bcd9SKiyoung Kim             decrease_offset_high_ldac(p_ab, &nbits_spec);
688*aef9bcd9SKiyoung Kim 
689*aef9bcd9SKiyoung Kim             decrease_offset_low_ldac(p_ab, LDAC_MAXGRADOS, &nbits_spec);
690*aef9bcd9SKiyoung Kim         }
691*aef9bcd9SKiyoung Kim         else {
692*aef9bcd9SKiyoung Kim             decrease_offset_low_ldac(p_ab, LDAC_MAXGRADOS, &nbits_spec);
693*aef9bcd9SKiyoung Kim         }
694*aef9bcd9SKiyoung Kim 
695*aef9bcd9SKiyoung Kim         while ((nbits_spec > nbits_avail) && (p_ab->nbands > LDAC_BAND_OFFSET)) {
696*aef9bcd9SKiyoung Kim             p_ab->nbands--;
697*aef9bcd9SKiyoung Kim             p_ab->nqus = ga_nqus_ldac[p_ab->nbands];
698*aef9bcd9SKiyoung Kim 
699*aef9bcd9SKiyoung Kim             nbits_side = encode_side_info_ldac(p_ab);
700*aef9bcd9SKiyoung Kim             p_ab->nbits_avail = nbits_avail = nbits_ab - nbits_side;
701*aef9bcd9SKiyoung Kim 
702*aef9bcd9SKiyoung Kim             nbits_spec = encode_audio_block_a_ldac(p_ab, p_ab->nqus);
703*aef9bcd9SKiyoung Kim         }
704*aef9bcd9SKiyoung Kim     }
705*aef9bcd9SKiyoung Kim 
706*aef9bcd9SKiyoung Kim     if (nbits_spec < nbits_avail) {
707*aef9bcd9SKiyoung Kim         if (p_ab->grad_mode == LDAC_MODE_0) {
708*aef9bcd9SKiyoung Kim             increase_offset_low_ldac(p_ab, &nbits_spec);
709*aef9bcd9SKiyoung Kim 
710*aef9bcd9SKiyoung Kim             increase_qu_low_0_ldac(p_ab, &nbits_spec);
711*aef9bcd9SKiyoung Kim         }
712*aef9bcd9SKiyoung Kim         else {
713*aef9bcd9SKiyoung Kim             increase_offset_low_ldac(p_ab, &nbits_spec);
714*aef9bcd9SKiyoung Kim 
715*aef9bcd9SKiyoung Kim             increase_qu_low_ldac(p_ab, &nbits_spec);
716*aef9bcd9SKiyoung Kim         }
717*aef9bcd9SKiyoung Kim     }
718*aef9bcd9SKiyoung Kim 
719*aef9bcd9SKiyoung Kim     p_ab->nadjqus = 0;
720*aef9bcd9SKiyoung Kim     adjust_remain_bits_ldac(p_ab, &nbits_spec, &p_ab->nadjqus);
721*aef9bcd9SKiyoung Kim 
722*aef9bcd9SKiyoung Kim     if (nbits_spec > nbits_avail) {
723*aef9bcd9SKiyoung Kim         *p_ab->p_error_code = LDAC_ERR_BIT_ALLOCATION;
724*aef9bcd9SKiyoung Kim         return LDAC_FALSE;
725*aef9bcd9SKiyoung Kim     }
726*aef9bcd9SKiyoung Kim     p_ab->nbits_spec = nbits_spec;
727*aef9bcd9SKiyoung Kim     p_ab->nbits_used = nbits_spec + nbits_side;
728*aef9bcd9SKiyoung Kim 
729*aef9bcd9SKiyoung Kim 
730*aef9bcd9SKiyoung Kim     return LDAC_TRUE;
731*aef9bcd9SKiyoung Kim }
732*aef9bcd9SKiyoung Kim 
733*aef9bcd9SKiyoung Kim 
734