1 /*
2 * AAC coefficients encoder
3 * Copyright (C) 2008-2009 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * AAC coefficients encoder
25 */
26
27 /***********************************
28 * TODOs:
29 * speedup quantizer selection
30 * add sane pulse detection
31 ***********************************/
32
33 #include "libavutil/libm.h" // brought forward to work around cygwin header breakage
34
42
43 /** Frequency in Hz for lower limit of noise substitution **/
44 #define NOISE_LOW_LIMIT 4000
45
46 /** Total number of usable codebooks **/
48
49 /** bits needed to code codebook run value for long windows */
51 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
52 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10,
53 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
54 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15
55 };
56
57 /** bits needed to code codebook run value for short windows */
59 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
60 };
61
64 };
65
66 /** Map to convert values from BandCodingPath index to a codebook index **/
67 static const uint8_t aac_cb_out_map[
CB_TOT] = {0,1,2,3,4,5,6,7,8,9,10,11,13};
68 /** Inverse map to convert from codebooks to BandCodingPath indices **/
69 static const uint8_t aac_cb_in_map[
CB_TOT+1] = {0,1,2,3,4,5,6,7,8,9,10,11,0,12};
70
71 /**
72 * Quantize one coefficient.
73 * @return absolute value of the quantized coefficient
74 * @see 3GPP TS26.403 5.6.2 "Scalefactor determination"
75 */
77 {
79 return sqrtf(a * sqrtf(a)) + 0.4054;
80 }
81
83 int size,
float Q34,
int is_signed,
int maxval)
84 {
85 int i;
86 double qc;
87 for (i = 0; i <
size; i++) {
88 qc = scaled[i] * Q34;
89 out[i] = (int)
FFMIN(qc + 0.4054, (
double)maxval);
90 if (is_signed && in[i] < 0.0f) {
91 out[i] = -out[i];
92 }
93 }
94 }
95
97 {
98 #ifndef USE_REALLY_FULL_SEARCH
99 int i;
100 for (i = 0; i <
size; i++) {
101 float a = fabsf(in[i]);
102 out[i] = sqrtf(a * sqrtf(a));
103 }
104 #endif /* USE_REALLY_FULL_SEARCH */
105 }
106
107 static const uint8_t aac_cb_range [12] = {0, 3, 3, 3, 3, 9, 9, 8, 8, 13, 13, 17};
108 static const uint8_t aac_cb_maxval[12] = {0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, 16};
109
110 /**
111 * Calculate rate distortion cost for quantizing with given codebook
112 *
113 * @return quantization distortion
114 */
118 const float *scaled,
int size,
int scale_idx,
119 int cb,
const float lambda,
const float uplim,
120 int *
bits,
int BT_ZERO,
int BT_UNSIGNED,
121 int BT_PAIR, int BT_ESC, int BT_NOISE)
122 {
127 const float CLIPPED_ESCAPE = 165140.0f*IQ;
128 int i, j;
129 float cost = 0;
130 const int dim = BT_PAIR ? 2 : 4;
131 int resbits = 0;
132 int off;
133
134 if (BT_ZERO) {
135 for (i = 0; i <
size; i++)
136 cost += in[i]*in[i];
137 if (bits)
138 *bits = 0;
139 return cost * lambda;
140 }
141 if (BT_NOISE) {
142 for (i = 0; i <
size; i++)
143 cost += in[i]*in[i];
144 if (bits)
145 *bits = 0;
146 return cost * lambda;
147 }
148 if (!scaled) {
151 }
153 if (BT_UNSIGNED) {
154 off = 0;
155 } else {
157 }
158 for (i = 0; i <
size; i +=
dim) {
159 const float *vec;
160 int *quants = s->
qcoefs + i;
161 int curidx = 0;
162 int curbits;
163 float rd = 0.0f;
164 for (j = 0; j <
dim; j++) {
166 curidx += quants[j] + off;
167 }
170 if (BT_UNSIGNED) {
171 for (j = 0; j <
dim; j++) {
172 float t = fabsf(in[i+j]);
173 float di;
174 if (BT_ESC && vec[j] == 64.0f) { //FIXME: slow
175 if (t >= CLIPPED_ESCAPE) {
176 di = t - CLIPPED_ESCAPE;
177 curbits += 21;
178 } else {
179 int c = av_clip_uintp2(
quant(t, Q), 13);
180 di = t - c*
cbrtf(c)*IQ;
181 curbits +=
av_log2(c)*2 - 4 + 1;
182 }
183 } else {
184 di = t - vec[j]*IQ;
185 }
186 if (vec[j] != 0.0f)
187 curbits++;
188 rd += di*di;
189 }
190 } else {
191 for (j = 0; j <
dim; j++) {
192 float di = in[i+j] - vec[j]*IQ;
193 rd += di*di;
194 }
195 }
196 cost += rd * lambda + curbits;
197 resbits += curbits;
198 if (cost >= uplim)
199 return uplim;
200 if (pb) {
202 if (BT_UNSIGNED)
203 for (j = 0; j <
dim; j++)
206 if (BT_ESC) {
207 for (j = 0; j < 2; j++) {
209 int coef = av_clip_uintp2(
quant(fabsf(in[i+j]), Q), 13);
211
212 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2);
214 }
215 }
216 }
217 }
218 }
219
220 if (bits)
221 *bits = resbits;
222 return cost;
223 }
224
226 const float *
in,
const float *scaled,
227 int size,
int scale_idx,
int cb,
228 const float lambda, const float uplim,
231 return 0.0f;
232 }
233
234 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE) \
235 static float quantize_and_encode_band_cost_ ## NAME( \
236 struct AACEncContext *s, \
237 PutBitContext *pb, const float *in, \
238 const float *scaled, int size, int scale_idx, \
239 int cb, const float lambda, const float uplim, \
240 int *bits) { \
241 return quantize_and_encode_band_cost_template( \
242 s, pb, in, scaled, size, scale_idx, \
243 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, \
244 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE); \
245 }
246
254
258 const
float *scaled,
int size,
int scale_idx,
259 int cb, const
float lambda, const
float uplim,
261 quantize_and_encode_band_cost_ZERO,
262 quantize_and_encode_band_cost_SQUAD,
263 quantize_and_encode_band_cost_SQUAD,
264 quantize_and_encode_band_cost_UQUAD,
265 quantize_and_encode_band_cost_UQUAD,
266 quantize_and_encode_band_cost_SPAIR,
267 quantize_and_encode_band_cost_SPAIR,
268 quantize_and_encode_band_cost_UPAIR,
269 quantize_and_encode_band_cost_UPAIR,
270 quantize_and_encode_band_cost_UPAIR,
271 quantize_and_encode_band_cost_UPAIR,
272 quantize_and_encode_band_cost_ESC,
274 quantize_and_encode_band_cost_NOISE,
275 };
276
277 #define quantize_and_encode_band_cost( \
278 s, pb, in, scaled, size, scale_idx, cb, \
279 lambda, uplim, bits) \
280 quantize_and_encode_band_cost_arr[cb]( \
281 s, pb, in, scaled, size, scale_idx, cb, \
282 lambda, uplim, bits)
283
285 const float *scaled,
int size,
int scale_idx,
286 int cb,
const float lambda,
const float uplim,
288 {
290 cb, lambda, uplim, bits);
291 }
292
294 const float *
in,
int size,
int scale_idx,
295 int cb,
const float lambda)
296 {
299 }
300
301 static float find_max_val(
int group_len,
int swb_size,
const float *scaled) {
302 float maxval = 0.0f;
303 int w2, i;
304 for (w2 = 0; w2 < group_len; w2++) {
305 for (i = 0; i < swb_size; i++) {
306 maxval =
FFMAX(maxval, scaled[w2*128+i]);
307 }
308 }
309 return maxval;
310 }
311
314 float Q34 = sqrtf(Q * sqrtf(Q));
316 qmaxval = maxval * Q34 + 0.4054f;
317 if (qmaxval == 0) cb = 0;
318 else if (qmaxval == 1) cb = 1;
319 else if (qmaxval == 2) cb = 3;
320 else if (qmaxval <= 4) cb = 5;
321 else if (qmaxval <= 7) cb = 7;
322 else if (qmaxval <= 12) cb = 9;
323 else cb = 11;
325 }
326
327 /**
328 * structure used in optimal codebook search
329 */
331 int prev_idx;
///< pointer to the previous path point
335
336 /**
337 * Encode band info for single window group bands.
338 */
340 int win, int group_len, const float lambda)
341 {
344 int i, j;
347 const int run_esc = (1 <<
run_bits) - 1;
348 int idx, ppos,
count;
349 int stackrun[120], stackcb[120], stack_len;
351 int next_mincb = 0;
352
354 start = win*128;
355 for (cb = 0; cb <
CB_TOT; cb++) {
359 }
360 for (swb = 0; swb < max_sfb; swb++) {
362 if (sce->
zeroes[win*16 + swb]) {
363 for (cb = 0; cb <
CB_TOT; cb++) {
367 }
368 } else {
369 float minrd = next_minrd;
370 int mincb = next_mincb;
372 next_mincb = 0;
373 for (cb = 0; cb <
CB_TOT; cb++) {
374 float cost_stay_here, cost_get_here;
375 float rd = 0.0f;
376 for (w = 0; w < group_len; w++) {
379 s->
scoefs + start + w*128, size,
382 }
383 cost_stay_here = path[swb][
cb].
cost + rd;
384 cost_get_here = minrd + rd + run_bits + 4;
388 if (cost_get_here < cost_stay_here) {
390 path[swb+1][
cb].
cost = cost_get_here;
391 path[swb+1][
cb].
run = 1;
392 } else {
394 path[swb+1][
cb].
cost = cost_stay_here;
396 }
397 if (path[swb+1][cb].cost < next_minrd) {
398 next_minrd = path[swb+1][
cb].
cost;
400 }
401 }
402 }
404 }
405
406 //convert resulting path from backward-linked list
407 stack_len = 0;
408 idx = 0;
409 for (cb = 1; cb <
CB_TOT; cb++)
410 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
412 ppos = max_sfb;
413 while (ppos > 0) {
414 cb = idx;
415 stackrun[stack_len] = path[ppos][
cb].
run;
416 stackcb [stack_len] =
cb;
418 ppos -= path[ppos][
cb].
run;
419 stack_len++;
420 }
421 //perform actual band info encoding
422 start = 0;
423 for (i = stack_len - 1; i >= 0; i--) {
426 count = stackrun[i];
427 memset(sce->
zeroes + win*16 + start, !cb, count);
428 //XXX: memset when band_type is also uint8_t
429 for (j = 0; j <
count; j++) {
431 start++;
432 }
433 while (count >= run_esc) {
435 count -= run_esc;
436 }
438 }
439 }
440
442 int win, int group_len, const float lambda)
443 {
446 int i, j;
449 const int run_esc = (1 <<
run_bits) - 1;
450 int idx, ppos,
count;
451 int stackrun[120], stackcb[120], stack_len;
453 int next_mincb = 0;
454
456 start = win*128;
457 for (cb = 0; cb <
CB_TOT; cb++) {
458 path[0][
cb].
cost = run_bits+4;
461 }
462 for (swb = 0; swb < max_sfb; swb++) {
464 if (sce->
zeroes[win*16 + swb]) {
465 float cost_stay_here = path[swb][0].
cost;
466 float cost_get_here = next_minbits + run_bits + 4;
470 if (cost_get_here < cost_stay_here) {
471 path[swb+1][0].
prev_idx = next_mincb;
472 path[swb+1][0].
cost = cost_get_here;
473 path[swb+1][0].
run = 1;
474 } else {
476 path[swb+1][0].
cost = cost_stay_here;
477 path[swb+1][0].
run = path[swb][0].
run + 1;
478 }
479 next_minbits = path[swb+1][0].
cost;
480 next_mincb = 0;
481 for (cb = 1; cb <
CB_TOT; cb++) {
482 path[swb+1][
cb].
cost = 61450;
484 path[swb+1][
cb].
run = 0;
485 }
486 } else {
487 float minbits = next_minbits;
488 int mincb = next_mincb;
489 int startcb = sce->
band_type[win*16+swb];
492 next_mincb = 0;
493 for (cb = 0; cb < startcb; cb++) {
494 path[swb+1][
cb].
cost = 61450;
496 path[swb+1][
cb].
run = 0;
497 }
498 for (cb = startcb; cb <
CB_TOT; cb++) {
499 float cost_stay_here, cost_get_here;
502 path[swb+1][
cb].
cost = 61450;
504 path[swb+1][
cb].
run = 0;
505 continue;
506 }
507 for (w = 0; w < group_len; w++) {
509 s->
scoefs + start + w*128, size,
510 sce->
sf_idx[(win+w)*16+swb],
513 }
515 cost_get_here = minbits + bits + run_bits + 4;
519 if (cost_get_here < cost_stay_here) {
521 path[swb+1][
cb].
cost = cost_get_here;
522 path[swb+1][
cb].
run = 1;
523 } else {
525 path[swb+1][
cb].
cost = cost_stay_here;
527 }
528 if (path[swb+1][cb].cost < next_minbits) {
529 next_minbits = path[swb+1][
cb].
cost;
531 }
532 }
533 }
535 }
536
537 //convert resulting path from backward-linked list
538 stack_len = 0;
539 idx = 0;
540 for (cb = 1; cb <
CB_TOT; cb++)
541 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
543 ppos = max_sfb;
544 while (ppos > 0) {
546 cb = idx;
547 stackrun[stack_len] = path[ppos][
cb].
run;
548 stackcb [stack_len] =
cb;
550 ppos -= path[ppos][
cb].
run;
551 stack_len++;
552 }
553 //perform actual band info encoding
554 start = 0;
555 for (i = stack_len - 1; i >= 0; i--) {
558 count = stackrun[i];
559 memset(sce->
zeroes + win*16 + start, !cb, count);
560 //XXX: memset when band_type is also uint8_t
561 for (j = 0; j <
count; j++) {
563 start++;
564 }
565 while (count >= run_esc) {
567 count -= run_esc;
568 }
570 }
571 }
572
573 /** Return the minimum scalefactor where the quantized coef does not clip. */
576 }
577
578 /** Return the maximum scalefactor where the quantized coef is not zero. */
581 }
582
587
588 #define TRELLIS_STAGES 121
589 #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
590
593 const float lambda)
594 {
595 int q, w, w2,
g,
start = 0;
596 int i, j;
597 int idx;
600 int minq;
601 float mincost;
602 float q0f = FLT_MAX, q1f = 0.0f, qnrgf = 0.0f;
603 int q0,
q1, qcnt = 0;
604
605 for (i = 0; i < 1024; i++) {
606 float t = fabsf(sce->
coeffs[i]);
607 if (t > 0.0f) {
610 qnrgf += t*t;
611 qcnt++;
612 }
613 }
614
615 if (!qcnt) {
618 return;
619 }
620
621 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
623 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
625 if (q1 - q0 > 60) {
628 //minimum scalefactor index is when maximum nonzero coefficient after quantizing is not clipped
630 q1 = qnrg + 30;
631 q0 = qnrg - 30;
632 if (q0 < q0low) {
634 q0 = q0low;
635 } else if (q1 > q1high) {
636 q0 -= q1 - q1high;
637 q1 = q1high;
638 }
639 }
640
642 paths[0][i].
cost = 0.0f;
643 paths[0][i].
prev = -1;
644 }
648 paths[j][i].
prev = -2;
649 }
650 }
651 idx = 1;
654 start = w*128;
657 float qmin, qmax;
658 int nz = 0;
659
660 bandaddr[idx] = w * 16 +
g;
661 qmin = INT_MAX;
662 qmax = 0.0f;
666 sce->
zeroes[(w+w2)*16+g] = 1;
667 continue;
668 }
669 sce->
zeroes[(w+w2)*16+g] = 0;
670 nz = 1;
672 float t = fabsf(coefs[w2*128+i]);
673 if (t > 0.0f)
674 qmin =
FFMIN(qmin, t);
675 qmax =
FFMAX(qmax, t);
676 }
677 }
678 if (nz) {
679 int minscale, maxscale;
681 float maxval;
682 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
684 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
686 minscale = av_clip(minscale - q0, 0, TRELLIS_STATES - 1);
687 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES);
689 for (q = minscale; q < maxscale; q++) {
690 float dist = 0;
696 }
697 minrd =
FFMIN(minrd, dist);
698
699 for (i = 0; i < q1 -
q0; i++) {
700 float cost;
701 cost = paths[idx - 1][i].
cost + dist
703 if (cost < paths[idx][q].cost) {
704 paths[idx][q].
cost = cost;
705 paths[idx][q].
prev = i;
706 }
707 }
708 }
709 } else {
710 for (q = 0; q < q1 -
q0; q++) {
711 paths[idx][q].
cost = paths[idx - 1][q].
cost + 1;
712 paths[idx][q].
prev = q;
713 }
714 }
717 idx++;
718 }
719 }
720 idx--;
721 mincost = paths[idx][0].
cost;
722 minq = 0;
724 if (paths[idx][i].cost < mincost) {
725 mincost = paths[idx][i].
cost;
726 minq = i;
727 }
728 }
729 while (idx) {
730 sce->
sf_idx[bandaddr[idx]] = minq +
q0;
731 minq = paths[idx][minq].
prev;
732 idx--;
733 }
734 //set the same quantizers inside window groups
739 }
740
741 /**
742 * two-loop quantizers search taken from ISO 13818-7 Appendix C
743 */
747 const float lambda)
748 {
749 int start = 0, i, w, w2,
g;
752 float dists[128] = { 0 }, uplims[128] = { 0 };
753 float maxvals[128];
754 int noise_sf[128] = { 0 };
755 int fflag, minscaler, minscaler_n;
756 int its = 0;
757 int allz = 0;
759
760 // for values above this the decoder might end up in an endless loop
761 // due to always having more bits than what can be encoded.
762 destbits =
FFMIN(destbits, 5800);
763 //XXX: some heuristic to determine initial quantizers will reduce search time
764 //determine zero bands and upper limits
766 start = 0;
768 int nz = 0;
769 float uplim = 0.0f, energy = 0.0f;
775 sce->
zeroes[(w+w2)*16+g] = 1;
776 continue;
777 }
778 nz = 1;
779 }
780 uplims[w*16+
g] = uplim *512;
782 noise_sf[w*16+
g] = av_clip(4+
FFMIN(
log2f(energy)*2,255), -100, 155);
784 nz= 1;
785 } else { /** Band type will be determined by the twoloop algorithm */
787 }
789 if (nz)
790 minthr =
FFMIN(minthr, uplim);
791 allz |= nz;
793 }
794 }
797 if (sce->
zeroes[w*16+g]) {
799 continue;
800 }
802 }
803 }
804
805 if (!allz)
806 return;
808
810 start = w*128;
815 }
816 }
817
818 //perform two-loop search
819 //outer loop - improve quality
820 do {
821 int tbits, qstep;
822 minscaler = sce->
sf_idx[0];
823 minscaler_n = sce->
sf_idx[0];
824 //inner loop - quantize spectrum to fit into given number of bits
825 qstep = its ? 1 : 32;
826 do {
827 int prev = -1;
828 tbits = 0;
830 start = w*128;
836 float dist = 0.0f;
837
839 minscaler_n =
FFMIN(minscaler_n, noise_sf[w*16+g]);
841 continue;
842 }
else if (sce->
zeroes[w*16+g] || sce->
sf_idx[w*16+g] >= 218) {
844 continue;
845 }
851 scaled + w2*128,
854 cb,
855 1.0f,
857 &b);
859 }
860 dists[w*16+
g] = dist -
bits;
861 if (prev != -1) {
863 }
867 }
868 }
869 if (tbits > destbits) {
870 for (i = 0; i < 128; i++)
871 if (sce->
sf_idx[i] < 218 - qstep)
873 } else {
874 for (i = 0; i < 128; i++)
875 if (sce->
sf_idx[i] > 60 - qstep)
877 }
878 qstep >>= 1;
879 if (!qstep && tbits > destbits*1.02 && sce->
sf_idx[0] < 217)
880 qstep = 1;
881 } while (qstep);
882
883 fflag = 0;
885
890
893 int prevsc = sce->
sf_idx[w*16+
g];
895 continue;
896 if (dists[w*16+g] > uplims[w*16+g] && sce->
sf_idx[w*16+g] > 60) {
899 else //Try to make sure there is some energy in every band
901 }
904 if (sce->
sf_idx[w*16+g] != prevsc)
905 fflag = 1;
907 }
908 }
909 its++;
910 } while (fflag && its < 10);
911 }
912
915 const float lambda)
916 {
917 int start = 0, i, w, w2,
g;
918 float uplim[128], maxq[128];
919 int minq, maxsf;
920 float distfact = ((sce->
ics.
num_windows > 1) ? 85.80 : 147.84) / lambda;
921 int last = 0, lastband = 0, curband = 0;
922 float avg_energy = 0.0;
924 start = 0;
925 for (i = 0; i < 1024; i++) {
928 curband++;
929 }
932 last = i;
933 lastband = curband;
934 }
935 }
936 } else {
937 for (w = 0; w < 8; w++) {
938 const float *coeffs = sce->
coeffs + w*128;
939 curband = start = 0;
940 for (i = 0; i < 128; i++) {
943 curband++;
944 }
945 if (coeffs[i]) {
946 avg_energy += coeffs[i] * coeffs[i];
947 last =
FFMAX(last, i);
948 lastband =
FFMAX(lastband, curband);
949 }
950 }
951 }
952 }
953 last++;
954 avg_energy /= last;
955 if (avg_energy == 0.0f) {
958 return;
959 }
961 start = w*128;
966 float maxval = -1, thr = 0.0f, t;
968 if (g > lastband) {
972 memset(coefs + w2*128, 0,
sizeof(coefs[0])*
size);
973 continue;
974 }
976 for (i = 0; i <
size; i++) {
977 float t = coefs[w2*128+i]*coefs[w2*128+i];
978 maxq[w*16+
g] =
FFMAX(maxq[w*16+g], fabsf(coefs[w2*128 + i]));
979 thr += t;
981 maxval = t;
982 peakpos = start+i;
983 }
984 }
985 }
987 start2 =
FFMAX(peakpos - 2, start2);
988 end2 =
FFMIN(peakpos + 3, end2);
989 } else {
992 }
994 thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband);
995 t = 1.0 - (1.0 * start2 / last);
996 uplim[w*16+
g] = distfact / (1.4 * thr + t*t*t + 0.075);
997 }
998 }
1002 start = w*128;
1007 int scf, prev_scf, step;
1008 int min_scf = -1, max_scf = 256;
1009 float curdiff;
1010 if (maxq[w*16+g] < 21.544) {
1013 continue;
1014 }
1017 for (;;) {
1018 float dist = 0.0f;
1019 int quant_max;
1020
1024 scaled + w2*128,
1026 scf,
1028 lambda,
1030 &b);
1032 }
1033 dist *= 1.0f / 512.0f / lambda;
1035 if (quant_max >= 8191) { // too much, return to the previous quantizer
1036 sce->
sf_idx[w*16+
g] = prev_scf;
1037 break;
1038 }
1039 prev_scf = scf;
1040 curdiff = fabsf(dist - uplim[w*16+g]);
1041 if (curdiff <= 1.0f)
1042 step = 0;
1043 else
1044 step =
log2f(curdiff);
1045 if (dist > uplim[w*16+g])
1046 step = -step;
1047 scf += step;
1048 scf = av_clip_uint8(scf);
1049 step = scf - prev_scf;
1050 if (
FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) {
1051 sce->
sf_idx[w*16+
g] = av_clip(scf, min_scf, max_scf);
1052 break;
1053 }
1054 if (step > 0)
1055 min_scf = prev_scf;
1056 else
1057 max_scf = prev_scf;
1058 }
1060 }
1061 }
1063 for (i = 1; i < 128; i++) {
1066 else
1068 }
1069 if (minq == INT_MAX)
1070 minq = 0;
1073 for (i = 126; i >= 0; i--) {
1077 }
1078 }
1079
1082 const float lambda)
1083 {
1085 int minq = 255;
1086
1093 sce->
sf_idx[(w+w2)*16+g] = 218;
1094 sce->
zeroes[(w+w2)*16+g] = 1;
1095 } else {
1097 sce->
zeroes[(w+w2)*16+g] = 0;
1098 }
1100 }
1101 }
1102 }
1103 for (i = 0; i < 128; i++) {
1105 //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);
1106 }
1107 //set the same quantizers inside window groups
1112 }
1113
1115 const float lambda)
1116 {
1117 int start = 0, i, w, w2,
g;
1118 float M[128],
S[128];
1123 return;
1127 float dist1 = 0.0f, dist2 = 0.0f;
1134 M[i] = (sce0->
pcoeffs[start+w2*128+i]
1135 + sce1->
pcoeffs[start+w2*128+i]) * 0.5;
1136 S[i] = M[i]
1137 - sce1->
pcoeffs[start+w2*128+i];
1138 }
1144 L34,
1146 sce0->
sf_idx[(w+w2)*16+g],
1150 R34,
1152 sce1->
sf_idx[(w+w2)*16+g],
1156 M34,
1158 sce0->
sf_idx[(w+w2)*16+g],
1162 S34,
1164 sce1->
sf_idx[(w+w2)*16+g],
1167 }
1168 cpe->
ms_mask[w*16+
g] = dist2 < dist1;
1169 }
1171 }
1172 }
1173 }
1174
1181 },
1187 },
1193 },
1199 },
1200 };
static const uint8_t run_value_bits_long[64]
bits needed to code codebook run value for long windows
AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB]
static av_always_inline uint8_t coef2maxsf(float coef)
Return the maximum scalefactor where the quantized coef is not zero.
static void encode_window_bands_info(AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
Encode band info for single window group bands.
static void put_sbits(PutBitContext *pb, int n, int32_t value)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
float pcoeffs[1024]
coefficients for IMDCT, pristine
#define SCALE_DIFF_ZERO
codebook index corresponding to zero scalefactor indices difference
FFPsyBand psy_bands[PSY_MAX_BANDS]
channel bands information
static const uint8_t run_value_bits_short[16]
bits needed to code codebook run value for short windows
#define SCALE_MAX_POS
scalefactor index maximum value
static int find_min_book(float maxval, int sf)
#define SCALE_MAX_DIFF
maximum scalefactor difference allowed by standard
static const uint8_t aac_cb_in_map[CB_TOT+1]
Inverse map to convert from codebooks to BandCodingPath indices.
int common_window
Set if channels share a common 'IndividualChannelStream' in bitstream.
#define quantize_and_encode_band_cost(s, pb, in, scaled, size, scale_idx, cb, lambda, uplim, bits)
int prev_idx
pointer to the previous path point
#define FF_ARRAY_ELEMS(a)
uint8_t ms_mask[128]
Set if mid/side stereo is used for each scalefactor window band.
static const uint8_t q1[256]
static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
Spectral data are scaled white noise not coded in the bitstream.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static double cb(void *priv, double x, double y)
AACEncOptions options
encoding options
static void search_for_ms(AACEncContext *s, ChannelElement *cpe, const float lambda)
SingleChannelElement ch[2]
static av_always_inline int quant(float coef, const float Q)
Quantize one coefficient.
const uint8_t ff_aac_scalefactor_bits[121]
int qcoefs[96]
quantized coefficients
static const uint8_t run_bits[7][16]
single band psychoacoustic information
static const uint8_t aac_cb_range[12]
float coeffs[1024]
coefficients for IMDCT, maybe processed
static av_always_inline uint8_t coef2minsf(float coef)
Return the minimum scalefactor where the quantized coef does not clip.
uint8_t max_sfb
number of scalefactor bands per group
int num_swb
number of scalefactor window bands
static void quantize_bands(int *out, const float *in, const float *scaled, int size, float Q34, int is_signed, int maxval)
Libavcodec external API header.
static float quantize_band_cost(struct AACEncContext *s, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits)
const float *const ff_aac_codebook_vectors[]
static const uint8_t q0[256]
#define NOISE_LOW_LIMIT
Frequency in Hz for lower limit of noise substitution.
#define POW_SF2_ZERO
ff_aac_pow2sf_tab index corresponding to pow(2, 0);
#define SCALE_DIV_512
scalefactor difference that corresponds to scale difference in 512 times
static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, int scale_idx, int cb, const float lambda)
int bit_rate
the average bitrate
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
const uint8_t *const ff_aac_spectral_bits[11]
AAC definitions and structures.
static void abs_pow34_v(float *out, const float *in, const int size)
float ff_aac_pow34sf_tab[428]
int sample_rate
samples per second
static void codebook_trellis_rate(AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
main external API structure.
#define CB_TOT
Total number of usable codebooks.
static const uint8_t aac_cb_out_map[CB_TOT]
Map to convert values from BandCodingPath index to a codebook index.
IndividualChannelStream ics
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
static av_always_inline float cbrtf(float x)
structure used in optimal codebook search
Replacements for frequently missing libm functions.
Spectral data are coded with an escape sequence.
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
static float(*const quantize_and_encode_band_cost_arr[])(struct AACEncContext *s, PutBitContext *pb, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits)
uint8_t zeroes[128]
band is not coded (used by encoder)
int sf_idx[128]
scalefactor indices (used by encoder)
#define SCALE_ONE_POS
scalefactor index that corresponds to scale=1.0
static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
static void search_for_quantizers_twoloop(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
two-loop quantizers search taken from ISO 13818-7 Appendix C
Single Channel Element - used for both SCE and LFE elements.
static const uint8_t aac_cb_maxval[12]
static av_always_inline float quantize_and_encode_band_cost_template(struct AACEncContext *s, PutBitContext *pb, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits, int BT_ZERO, int BT_UNSIGNED, int BT_PAIR, int BT_ESC, int BT_NOISE)
Calculate rate distortion cost for quantizing with given codebook.
float ff_aac_pow2sf_tab[428]
static float find_max_val(int group_len, int swb_size, const float *scaled)
channel element - generic struct for SCE/CPE/CCE/LFE
const uint16_t *const ff_aac_spectral_codes[11]
int channels
number of audio channels
FFPsyChannel * ch
single channel information
enum BandType band_type[128]
band types
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> out
static float quantize_and_encode_band_cost_NONE(struct AACEncContext *s, PutBitContext *pb, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits)
static const uint8_t *const run_value_bits[2]
#define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE)
float scoefs[1024]
scaled coefficients