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