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