2 * AAC coefficients encoder
3 * Copyright (C) 2008-2009 Konstantin Shishkov
5 * This file is part of FFmpeg.
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.
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.
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
23 * @file libavcodec/aaccoder.c
24 * AAC coefficients encoder
27 /***********************************
29 * speedup quantizer selection
30 * add sane pulse detection
31 ***********************************/
39 /** bits needed to code codebook run value for long windows */
40 static const uint8_t run_value_bits_long
[64] = {
41 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
42 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10,
43 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
44 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15
47 /** bits needed to code codebook run value for short windows */
48 static const uint8_t run_value_bits_short
[16] = {
49 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
52 static const uint8_t *run_value_bits
[2] = {
53 run_value_bits_long
, run_value_bits_short
58 * Quantize one coefficient.
59 * @return absolute value of the quantized coefficient
60 * @see 3GPP TS26.403 5.6.2 "Scalefactor determination"
62 static av_always_inline
int quant(float coef
, const float Q
)
65 return sqrtf(a
* sqrtf(a
)) + 0.4054;
68 static void quantize_bands(int (*out
)[2], const float *in
, const float *scaled
,
69 int size
, float Q34
, int is_signed
, int maxval
)
73 for (i
= 0; i
< size
; i
++) {
75 out
[i
][0] = (int)FFMIN(qc
, (double)maxval
);
76 out
[i
][1] = (int)FFMIN(qc
+ 0.4054, (double)maxval
);
77 if (is_signed
&& in
[i
] < 0.0f
) {
78 out
[i
][0] = -out
[i
][0];
79 out
[i
][1] = -out
[i
][1];
84 static void abs_pow34_v(float *out
, const float *in
, const int size
)
86 #ifndef USE_REALLY_FULL_SEARCH
88 for (i
= 0; i
< size
; i
++) {
89 float a
= fabsf(in
[i
]);
90 out
[i
] = sqrtf(a
* sqrtf(a
));
92 #endif /* USE_REALLY_FULL_SEARCH */
95 static const uint8_t aac_cb_range
[12] = {0, 3, 3, 3, 3, 9, 9, 8, 8, 13, 13, 17};
96 static const uint8_t aac_cb_maxval
[12] = {0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, 16};
99 * Calculate rate distortion cost for quantizing with given codebook
101 * @return quantization distortion
103 static float quantize_band_cost(struct AACEncContext
*s
, const float *in
,
104 const float *scaled
, int size
, int scale_idx
,
105 int cb
, const float lambda
, const float uplim
,
108 const float IQ
= ff_aac_pow2sf_tab
[200 + scale_idx
- SCALE_ONE_POS
+ SCALE_DIV_512
];
109 const float Q
= ff_aac_pow2sf_tab
[200 - scale_idx
+ SCALE_ONE_POS
- SCALE_DIV_512
];
110 const float CLIPPED_ESCAPE
= 165140.0f
*IQ
;
113 const int dim
= cb
< FIRST_PAIR_BT
? 4 : 2;
115 #ifndef USE_REALLY_FULL_SEARCH
116 const float Q34
= sqrtf(Q
* sqrtf(Q
));
117 const int range
= aac_cb_range
[cb
];
118 const int maxval
= aac_cb_maxval
[cb
];
120 #endif /* USE_REALLY_FULL_SEARCH */
123 for (i
= 0; i
< size
; i
++)
127 return cost
* lambda
;
129 #ifndef USE_REALLY_FULL_SEARCH
131 for (i
= 1; i
< dim
; i
++)
132 offs
[i
] = offs
[i
-1]*range
;
133 quantize_bands(s
->qcoefs
, in
, scaled
, size
, Q34
, !IS_CODEBOOK_UNSIGNED(cb
), maxval
);
134 #endif /* USE_REALLY_FULL_SEARCH */
135 for (i
= 0; i
< size
; i
+= dim
) {
140 #ifndef USE_REALLY_FULL_SEARCH
141 int (*quants
)[2] = &s
->qcoefs
[i
];
143 for (j
= 0; j
< dim
; j
++)
144 mincost
+= in
[i
+j
]*in
[i
+j
];
145 minidx
= IS_CODEBOOK_UNSIGNED(cb
) ? 0 : 40;
146 minbits
= ff_aac_spectral_bits
[cb
-1][minidx
];
147 mincost
= mincost
* lambda
+ minbits
;
148 for (j
= 0; j
< (1<<dim
); j
++) {
151 int curidx
= IS_CODEBOOK_UNSIGNED(cb
) ? 0 : 40;
153 for (k
= 0; k
< dim
; k
++) {
154 if ((j
& (1 << k
)) && quants
[k
][0] == quants
[k
][1]) {
161 for (k
= 0; k
< dim
; k
++)
162 curidx
+= quants
[k
][!!(j
& (1 << k
))] * offs
[dim
- 1 - k
];
163 curbits
= ff_aac_spectral_bits
[cb
-1][curidx
];
164 vec
= &ff_aac_codebook_vectors
[cb
-1][curidx
*dim
];
167 vec
= ff_aac_codebook_vectors
[cb
-1];
168 for (j
= 0; j
< ff_aac_spectral_sizes
[cb
-1]; j
++, vec
+= dim
) {
170 int curbits
= ff_aac_spectral_bits
[cb
-1][j
];
171 #endif /* USE_REALLY_FULL_SEARCH */
172 if (IS_CODEBOOK_UNSIGNED(cb
)) {
173 for (k
= 0; k
< dim
; k
++) {
174 float t
= fabsf(in
[i
+k
]);
176 if (vec
[k
] == 64.0f
) { //FIXME: slow
177 //do not code with escape sequence small values
182 if (t
>= CLIPPED_ESCAPE
) {
183 di
= t
- CLIPPED_ESCAPE
;
186 int c
= av_clip(quant(t
, Q
), 0, 8191);
187 di
= t
- c
*cbrtf(c
)*IQ
;
188 curbits
+= av_log2(c
)*2 - 4 + 1;
198 for (k
= 0; k
< dim
; k
++) {
199 float di
= in
[i
+k
] - vec
[k
]*IQ
;
203 rd
= rd
* lambda
+ curbits
;
221 static void quantize_and_encode_band(struct AACEncContext
*s
, PutBitContext
*pb
,
222 const float *in
, int size
, int scale_idx
,
223 int cb
, const float lambda
)
225 const float IQ
= ff_aac_pow2sf_tab
[200 + scale_idx
- SCALE_ONE_POS
+ SCALE_DIV_512
];
226 const float Q
= ff_aac_pow2sf_tab
[200 - scale_idx
+ SCALE_ONE_POS
- SCALE_DIV_512
];
227 const float CLIPPED_ESCAPE
= 165140.0f
*IQ
;
228 const int dim
= (cb
< FIRST_PAIR_BT
) ? 4 : 2;
230 #ifndef USE_REALLY_FULL_SEARCH
231 const float Q34
= sqrtf(Q
* sqrtf(Q
));
232 const int range
= aac_cb_range
[cb
];
233 const int maxval
= aac_cb_maxval
[cb
];
235 float *scaled
= s
->scoefs
;
236 #endif /* USE_REALLY_FULL_SEARCH */
242 #ifndef USE_REALLY_FULL_SEARCH
244 for (i
= 1; i
< dim
; i
++)
245 offs
[i
] = offs
[i
-1]*range
;
246 abs_pow34_v(scaled
, in
, size
);
247 quantize_bands(s
->qcoefs
, in
, scaled
, size
, Q34
, !IS_CODEBOOK_UNSIGNED(cb
), maxval
);
248 #endif /* USE_REALLY_FULL_SEARCH */
249 for (i
= 0; i
< size
; i
+= dim
) {
254 #ifndef USE_REALLY_FULL_SEARCH
255 int (*quants
)[2] = &s
->qcoefs
[i
];
257 for (j
= 0; j
< dim
; j
++)
258 mincost
+= in
[i
+j
]*in
[i
+j
];
259 minidx
= IS_CODEBOOK_UNSIGNED(cb
) ? 0 : 40;
260 minbits
= ff_aac_spectral_bits
[cb
-1][minidx
];
261 mincost
= mincost
* lambda
+ minbits
;
262 for (j
= 0; j
< (1<<dim
); j
++) {
265 int curidx
= IS_CODEBOOK_UNSIGNED(cb
) ? 0 : 40;
267 for (k
= 0; k
< dim
; k
++) {
268 if ((j
& (1 << k
)) && quants
[k
][0] == quants
[k
][1]) {
275 for (k
= 0; k
< dim
; k
++)
276 curidx
+= quants
[k
][!!(j
& (1 << k
))] * offs
[dim
- 1 - k
];
277 curbits
= ff_aac_spectral_bits
[cb
-1][curidx
];
278 vec
= &ff_aac_codebook_vectors
[cb
-1][curidx
*dim
];
280 vec
= ff_aac_codebook_vectors
[cb
-1];
282 for (j
= 0; j
< ff_aac_spectral_sizes
[cb
-1]; j
++, vec
+= dim
) {
284 int curbits
= ff_aac_spectral_bits
[cb
-1][j
];
286 #endif /* USE_REALLY_FULL_SEARCH */
287 if (IS_CODEBOOK_UNSIGNED(cb
)) {
288 for (k
= 0; k
< dim
; k
++) {
289 float t
= fabsf(in
[i
+k
]);
291 if (vec
[k
] == 64.0f
) { //FIXME: slow
292 //do not code with escape sequence small values
297 if (t
>= CLIPPED_ESCAPE
) {
298 di
= t
- CLIPPED_ESCAPE
;
301 int c
= av_clip(quant(t
, Q
), 0, 8191);
302 di
= t
- c
*cbrtf(c
)*IQ
;
303 curbits
+= av_log2(c
)*2 - 4 + 1;
313 for (k
= 0; k
< dim
; k
++) {
314 float di
= in
[i
+k
] - vec
[k
]*IQ
;
318 rd
= rd
* lambda
+ curbits
;
325 put_bits(pb
, ff_aac_spectral_bits
[cb
-1][minidx
], ff_aac_spectral_codes
[cb
-1][minidx
]);
326 if (IS_CODEBOOK_UNSIGNED(cb
))
327 for (j
= 0; j
< dim
; j
++)
328 if (ff_aac_codebook_vectors
[cb
-1][minidx
*dim
+j
] != 0.0f
)
329 put_bits(pb
, 1, in
[i
+j
] < 0.0f
);
331 for (j
= 0; j
< 2; j
++) {
332 if (ff_aac_codebook_vectors
[cb
-1][minidx
*2+j
] == 64.0f
) {
333 int coef
= av_clip(quant(fabsf(in
[i
+j
]), Q
), 0, 8191);
334 int len
= av_log2(coef
);
336 put_bits(pb
, len
- 4 + 1, (1 << (len
- 4 + 1)) - 2);
337 put_bits(pb
, len
, coef
& ((1 << len
) - 1));
342 //STOP_TIMER("quantize_and_encode")
346 * structure used in optimal codebook search
348 typedef struct BandCodingPath
{
349 int prev_idx
; ///< pointer to the previous path point
350 float cost
; ///< path cost
355 * Encode band info for single window group bands.
357 static void encode_window_bands_info(AACEncContext
*s
, SingleChannelElement
*sce
,
358 int win
, int group_len
, const float lambda
)
360 BandCodingPath path
[120][12];
361 int w
, swb
, cb
, start
, start2
, size
;
363 const int max_sfb
= sce
->ics
.max_sfb
;
364 const int run_bits
= sce
->ics
.num_windows
== 1 ? 5 : 3;
365 const int run_esc
= (1 << run_bits
) - 1;
366 int idx
, ppos
, count
;
367 int stackrun
[120], stackcb
[120], stack_len
;
368 float next_minrd
= INFINITY
;
371 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
373 for (cb
= 0; cb
< 12; cb
++) {
374 path
[0][cb
].cost
= 0.0f
;
375 path
[0][cb
].prev_idx
= -1;
378 for (swb
= 0; swb
< max_sfb
; swb
++) {
380 size
= sce
->ics
.swb_sizes
[swb
];
381 if (sce
->zeroes
[win
*16 + swb
]) {
382 for (cb
= 0; cb
< 12; cb
++) {
383 path
[swb
+1][cb
].prev_idx
= cb
;
384 path
[swb
+1][cb
].cost
= path
[swb
][cb
].cost
;
385 path
[swb
+1][cb
].run
= path
[swb
][cb
].run
+ 1;
388 float minrd
= next_minrd
;
389 int mincb
= next_mincb
;
390 next_minrd
= INFINITY
;
392 for (cb
= 0; cb
< 12; cb
++) {
393 float cost_stay_here
, cost_get_here
;
395 for (w
= 0; w
< group_len
; w
++) {
396 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(win
+w
)*16+swb
];
397 rd
+= quantize_band_cost(s
, sce
->coeffs
+ start
+ w
*128,
398 s
->scoefs
+ start
+ w
*128, size
,
399 sce
->sf_idx
[(win
+w
)*16+swb
], cb
,
400 lambda
/ band
->threshold
, INFINITY
, NULL
);
402 cost_stay_here
= path
[swb
][cb
].cost
+ rd
;
403 cost_get_here
= minrd
+ rd
+ run_bits
+ 4;
404 if ( run_value_bits
[sce
->ics
.num_windows
== 8][path
[swb
][cb
].run
]
405 != run_value_bits
[sce
->ics
.num_windows
== 8][path
[swb
][cb
].run
+1])
406 cost_stay_here
+= run_bits
;
407 if (cost_get_here
< cost_stay_here
) {
408 path
[swb
+1][cb
].prev_idx
= mincb
;
409 path
[swb
+1][cb
].cost
= cost_get_here
;
410 path
[swb
+1][cb
].run
= 1;
412 path
[swb
+1][cb
].prev_idx
= cb
;
413 path
[swb
+1][cb
].cost
= cost_stay_here
;
414 path
[swb
+1][cb
].run
= path
[swb
][cb
].run
+ 1;
416 if (path
[swb
+1][cb
].cost
< next_minrd
) {
417 next_minrd
= path
[swb
+1][cb
].cost
;
422 start
+= sce
->ics
.swb_sizes
[swb
];
425 //convert resulting path from backward-linked list
428 for (cb
= 1; cb
< 12; cb
++)
429 if (path
[max_sfb
][cb
].cost
< path
[max_sfb
][idx
].cost
)
434 stackrun
[stack_len
] = path
[ppos
][cb
].run
;
435 stackcb
[stack_len
] = cb
;
436 idx
= path
[ppos
-path
[ppos
][cb
].run
+1][cb
].prev_idx
;
437 ppos
-= path
[ppos
][cb
].run
;
440 //perform actual band info encoding
442 for (i
= stack_len
- 1; i
>= 0; i
--) {
443 put_bits(&s
->pb
, 4, stackcb
[i
]);
445 memset(sce
->zeroes
+ win
*16 + start
, !stackcb
[i
], count
);
446 //XXX: memset when band_type is also uint8_t
447 for (j
= 0; j
< count
; j
++) {
448 sce
->band_type
[win
*16 + start
] = stackcb
[i
];
451 while (count
>= run_esc
) {
452 put_bits(&s
->pb
, run_bits
, run_esc
);
455 put_bits(&s
->pb
, run_bits
, count
);
459 typedef struct TrellisPath
{
466 #define TRELLIS_STAGES 121
467 #define TRELLIS_STATES 256
469 static void search_for_quantizers_anmr(AVCodecContext
*avctx
, AACEncContext
*s
,
470 SingleChannelElement
*sce
,
473 int q
, w
, w2
, g
, start
= 0;
476 TrellisPath paths
[TRELLIS_STAGES
][TRELLIS_STATES
];
477 int bandaddr
[TRELLIS_STAGES
];
481 for (i
= 0; i
< TRELLIS_STATES
; i
++) {
482 paths
[0][i
].cost
= 0.0f
;
483 paths
[0][i
].prev
= -1;
484 paths
[0][i
].min_val
= i
;
485 paths
[0][i
].max_val
= i
;
487 for (j
= 1; j
< TRELLIS_STAGES
; j
++) {
488 for (i
= 0; i
< TRELLIS_STATES
; i
++) {
489 paths
[j
][i
].cost
= INFINITY
;
490 paths
[j
][i
].prev
= -2;
491 paths
[j
][i
].min_val
= INT_MAX
;
492 paths
[j
][i
].max_val
= 0;
496 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
497 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
499 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
500 const float *coefs
= sce
->coeffs
+ start
;
504 bandaddr
[idx
] = w
* 16 + g
;
507 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
508 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
509 if (band
->energy
<= band
->threshold
|| band
->threshold
== 0.0f
) {
510 sce
->zeroes
[(w
+w2
)*16+g
] = 1;
513 sce
->zeroes
[(w
+w2
)*16+g
] = 0;
515 for (i
= 0; i
< sce
->ics
.swb_sizes
[g
]; i
++) {
516 float t
= fabsf(coefs
[w2
*128+i
]);
518 qmin
= FFMIN(qmin
, t
);
519 qmax
= FFMAX(qmax
, t
);
523 int minscale
, maxscale
;
524 float minrd
= INFINITY
;
525 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
526 minscale
= av_clip_uint8(log2(qmin
)*4 - 69 + SCALE_ONE_POS
- SCALE_DIV_512
);
527 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
528 maxscale
= av_clip_uint8(log2(qmax
)*4 + 6 + SCALE_ONE_POS
- SCALE_DIV_512
);
529 for (q
= minscale
; q
< maxscale
; q
++) {
530 float dists
[12], dist
;
531 memset(dists
, 0, sizeof(dists
));
532 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
533 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
535 for (cb
= 0; cb
<= ESC_BT
; cb
++)
536 dists
[cb
] += quantize_band_cost(s
, coefs
+ w2
*128, s
->scoefs
+ start
+ w2
*128, sce
->ics
.swb_sizes
[g
],
537 q
, cb
, lambda
/ band
->threshold
, INFINITY
, NULL
);
540 for (i
= 1; i
<= ESC_BT
; i
++)
541 dist
= FFMIN(dist
, dists
[i
]);
542 minrd
= FFMIN(minrd
, dist
);
544 for (i
= FFMAX(q
- SCALE_MAX_DIFF
, 0); i
< FFMIN(q
+ SCALE_MAX_DIFF
, TRELLIS_STATES
); i
++) {
547 if (isinf(paths
[idx
- 1][i
].cost
))
549 cost
= paths
[idx
- 1][i
].cost
+ dist
550 + ff_aac_scalefactor_bits
[q
- i
+ SCALE_DIFF_ZERO
];
551 minv
= FFMIN(paths
[idx
- 1][i
].min_val
, q
);
552 maxv
= FFMAX(paths
[idx
- 1][i
].max_val
, q
);
553 if (cost
< paths
[idx
][q
].cost
&& maxv
-minv
< SCALE_MAX_DIFF
) {
554 paths
[idx
][q
].cost
= cost
;
555 paths
[idx
][q
].prev
= i
;
556 paths
[idx
][q
].min_val
= minv
;
557 paths
[idx
][q
].max_val
= maxv
;
562 for (q
= 0; q
< TRELLIS_STATES
; q
++) {
563 if (!isinf(paths
[idx
- 1][q
].cost
)) {
564 paths
[idx
][q
].cost
= paths
[idx
- 1][q
].cost
+ 1;
565 paths
[idx
][q
].prev
= q
;
566 paths
[idx
][q
].min_val
= FFMIN(paths
[idx
- 1][q
].min_val
, q
);
567 paths
[idx
][q
].max_val
= FFMAX(paths
[idx
- 1][q
].max_val
, q
);
570 for (i
= FFMAX(q
- SCALE_MAX_DIFF
, 0); i
< FFMIN(q
+ SCALE_MAX_DIFF
, TRELLIS_STATES
); i
++) {
573 if (isinf(paths
[idx
- 1][i
].cost
))
575 cost
= paths
[idx
- 1][i
].cost
+ ff_aac_scalefactor_bits
[q
- i
+ SCALE_DIFF_ZERO
];
576 minv
= FFMIN(paths
[idx
- 1][i
].min_val
, q
);
577 maxv
= FFMAX(paths
[idx
- 1][i
].max_val
, q
);
578 if (cost
< paths
[idx
][q
].cost
&& maxv
-minv
< SCALE_MAX_DIFF
) {
579 paths
[idx
][q
].cost
= cost
;
580 paths
[idx
][q
].prev
= i
;
581 paths
[idx
][q
].min_val
= minv
;
582 paths
[idx
][q
].max_val
= maxv
;
587 sce
->zeroes
[w
*16+g
] = !nz
;
588 start
+= sce
->ics
.swb_sizes
[g
];
593 mincost
= paths
[idx
][0].cost
;
595 for (i
= 1; i
< TRELLIS_STATES
; i
++) {
596 if (paths
[idx
][i
].cost
< mincost
) {
597 mincost
= paths
[idx
][i
].cost
;
602 sce
->sf_idx
[bandaddr
[idx
]] = minq
;
603 minq
= paths
[idx
][minq
].prev
;
606 //set the same quantizers inside window groups
607 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
])
608 for (g
= 0; g
< sce
->ics
.num_swb
; g
++)
609 for (w2
= 1; w2
< sce
->ics
.group_len
[w
]; w2
++)
610 sce
->sf_idx
[(w
+w2
)*16+g
] = sce
->sf_idx
[w
*16+g
];
614 * two-loop quantizers search taken from ISO 13818-7 Appendix C
616 static void search_for_quantizers_twoloop(AVCodecContext
*avctx
,
618 SingleChannelElement
*sce
,
621 int start
= 0, i
, w
, w2
, g
;
622 int destbits
= avctx
->bit_rate
* 1024.0 / avctx
->sample_rate
/ avctx
->channels
;
623 float dists
[128], uplims
[128];
624 int fflag
, minscaler
;
627 float minthr
= INFINITY
;
629 //XXX: some heuristic to determine initial quantizers will reduce search time
630 memset(dists
, 0, sizeof(dists
));
631 //determine zero bands and upper limits
632 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
633 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
636 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
637 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
638 uplim
+= band
->threshold
;
639 if (band
->energy
<= band
->threshold
|| band
->threshold
== 0.0f
) {
640 sce
->zeroes
[(w
+w2
)*16+g
] = 1;
645 uplims
[w
*16+g
] = uplim
*512;
646 sce
->zeroes
[w
*16+g
] = !nz
;
648 minthr
= FFMIN(minthr
, uplim
);
649 allz
= FFMAX(allz
, nz
);
652 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
653 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
654 if (sce
->zeroes
[w
*16+g
]) {
655 sce
->sf_idx
[w
*16+g
] = SCALE_ONE_POS
;
658 sce
->sf_idx
[w
*16+g
] = SCALE_ONE_POS
+ FFMIN(log2(uplims
[w
*16+g
]/minthr
)*4,59);
664 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
665 //perform two-loop search
666 //outer loop - improve quality
669 minscaler
= sce
->sf_idx
[0];
670 //inner loop - quantize spectrum to fit into given number of bits
671 qstep
= its
? 1 : 32;
676 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
678 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
679 const float *coefs
= sce
->coeffs
+ start
;
680 const float *scaled
= s
->scoefs
+ start
;
683 float mindist
= INFINITY
;
686 if (sce
->zeroes
[w
*16+g
] || sce
->sf_idx
[w
*16+g
] >= 218) {
687 start
+= sce
->ics
.swb_sizes
[g
];
690 minscaler
= FFMIN(minscaler
, sce
->sf_idx
[w
*16+g
]);
691 for (cb
= 0; cb
<= ESC_BT
; cb
++) {
694 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
696 dist
+= quantize_band_cost(s
, coefs
+ w2
*128,
698 sce
->ics
.swb_sizes
[g
],
706 if (dist
< mindist
) {
711 dists
[w
*16+g
] = (mindist
- minbits
) / lambda
;
714 bits
+= ff_aac_scalefactor_bits
[sce
->sf_idx
[w
*16+g
] - prev
+ SCALE_DIFF_ZERO
];
717 start
+= sce
->ics
.swb_sizes
[g
];
718 prev
= sce
->sf_idx
[w
*16+g
];
721 if (tbits
> destbits
) {
722 for (i
= 0; i
< 128; i
++)
723 if (sce
->sf_idx
[i
] < 218 - qstep
)
724 sce
->sf_idx
[i
] += qstep
;
726 for (i
= 0; i
< 128; i
++)
727 if (sce
->sf_idx
[i
] > 60 - qstep
)
728 sce
->sf_idx
[i
] -= qstep
;
731 if (!qstep
&& tbits
> destbits
*1.02)
733 if (sce
->sf_idx
[0] >= 217)
738 minscaler
= av_clip(minscaler
, 60, 255 - SCALE_MAX_DIFF
);
739 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
741 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
742 int prevsc
= sce
->sf_idx
[w
*16+g
];
743 if (dists
[w
*16+g
] > uplims
[w
*16+g
] && sce
->sf_idx
[w
*16+g
] > 60)
744 sce
->sf_idx
[w
*16+g
]--;
745 sce
->sf_idx
[w
*16+g
] = av_clip(sce
->sf_idx
[w
*16+g
], minscaler
, minscaler
+ SCALE_MAX_DIFF
);
746 sce
->sf_idx
[w
*16+g
] = FFMIN(sce
->sf_idx
[w
*16+g
], 219);
747 if (sce
->sf_idx
[w
*16+g
] != prevsc
)
752 } while (fflag
&& its
< 10);
755 static void search_for_quantizers_faac(AVCodecContext
*avctx
, AACEncContext
*s
,
756 SingleChannelElement
*sce
,
759 int start
= 0, i
, w
, w2
, g
;
760 float uplim
[128], maxq
[128];
762 float distfact
= ((sce
->ics
.num_windows
> 1) ? 85.80 : 147.84) / lambda
;
763 int last
= 0, lastband
= 0, curband
= 0;
764 float avg_energy
= 0.0;
765 if (sce
->ics
.num_windows
== 1) {
767 for (i
= 0; i
< 1024; i
++) {
768 if (i
- start
>= sce
->ics
.swb_sizes
[curband
]) {
769 start
+= sce
->ics
.swb_sizes
[curband
];
772 if (sce
->coeffs
[i
]) {
773 avg_energy
+= sce
->coeffs
[i
] * sce
->coeffs
[i
];
779 for (w
= 0; w
< 8; w
++) {
780 const float *coeffs
= sce
->coeffs
+ w
*128;
782 for (i
= 0; i
< 128; i
++) {
783 if (i
- start
>= sce
->ics
.swb_sizes
[curband
]) {
784 start
+= sce
->ics
.swb_sizes
[curband
];
788 avg_energy
+= coeffs
[i
] * coeffs
[i
];
789 last
= FFMAX(last
, i
);
790 lastband
= FFMAX(lastband
, curband
);
797 if (avg_energy
== 0.0f
) {
798 for (i
= 0; i
< FF_ARRAY_ELEMS(sce
->sf_idx
); i
++)
799 sce
->sf_idx
[i
] = SCALE_ONE_POS
;
802 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
804 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
805 float *coefs
= sce
->coeffs
+ start
;
806 const int size
= sce
->ics
.swb_sizes
[g
];
807 int start2
= start
, end2
= start
+ size
, peakpos
= start
;
808 float maxval
= -1, thr
= 0.0f
, t
;
813 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++)
814 memset(coefs
+ w2
*128, 0, sizeof(coefs
[0])*size
);
817 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
818 for (i
= 0; i
< size
; i
++) {
819 float t
= coefs
[w2
*128+i
]*coefs
[w2
*128+i
];
820 maxq
[w
*16+g
] = FFMAX(maxq
[w
*16+g
], fabsf(coefs
[w2
*128 + i
]));
822 if (sce
->ics
.num_windows
== 1 && maxval
< t
) {
828 if (sce
->ics
.num_windows
== 1) {
829 start2
= FFMAX(peakpos
- 2, start2
);
830 end2
= FFMIN(peakpos
+ 3, end2
);
836 thr
= pow(thr
/ (avg_energy
* (end2
- start2
)), 0.3 + 0.1*(lastband
- g
) / lastband
);
837 t
= 1.0 - (1.0 * start2
/ last
);
838 uplim
[w
*16+g
] = distfact
/ (1.4 * thr
+ t
*t
*t
+ 0.075);
841 memset(sce
->sf_idx
, 0, sizeof(sce
->sf_idx
));
842 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
843 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
845 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
846 const float *coefs
= sce
->coeffs
+ start
;
847 const float *scaled
= s
->scoefs
+ start
;
848 const int size
= sce
->ics
.swb_sizes
[g
];
849 int scf
, prev_scf
, step
;
850 int min_scf
= 0, max_scf
= 255;
852 if (maxq
[w
*16+g
] < 21.544) {
853 sce
->zeroes
[w
*16+g
] = 1;
857 sce
->zeroes
[w
*16+g
] = 0;
858 scf
= prev_scf
= av_clip(SCALE_ONE_POS
- SCALE_DIV_512
- log2(1/maxq
[w
*16+g
])*16/3, 60, 218);
864 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
866 dist
+= quantize_band_cost(s
, coefs
+ w2
*128,
868 sce
->ics
.swb_sizes
[g
],
876 dist
*= 1.0f
/ 512.0f
/ lambda
;
877 quant_max
= quant(maxq
[w
*16+g
], ff_aac_pow2sf_tab
[200 - scf
+ SCALE_ONE_POS
- SCALE_DIV_512
]);
878 if (quant_max
>= 8191) { // too much, return to the previous quantizer
879 sce
->sf_idx
[w
*16+g
] = prev_scf
;
883 curdiff
= fabsf(dist
- uplim
[w
*16+g
]);
887 step
= fabsf(log2(curdiff
));
888 if (dist
> uplim
[w
*16+g
])
890 if (FFABS(step
) <= 1 || (step
> 0 && scf
>= max_scf
) || (step
< 0 && scf
<= min_scf
)) {
891 sce
->sf_idx
[w
*16+g
] = scf
;
903 minq
= sce
->sf_idx
[0] ? sce
->sf_idx
[0] : INT_MAX
;
904 for (i
= 1; i
< 128; i
++) {
906 sce
->sf_idx
[i
] = sce
->sf_idx
[i
-1];
908 minq
= FFMIN(minq
, sce
->sf_idx
[i
]);
912 minq
= FFMIN(minq
, SCALE_MAX_POS
);
913 maxsf
= FFMIN(minq
+ SCALE_MAX_DIFF
, SCALE_MAX_POS
);
914 for (i
= 126; i
>= 0; i
--) {
916 sce
->sf_idx
[i
] = sce
->sf_idx
[i
+1];
917 sce
->sf_idx
[i
] = av_clip(sce
->sf_idx
[i
], minq
, maxsf
);
921 static void search_for_quantizers_fast(AVCodecContext
*avctx
, AACEncContext
*s
,
922 SingleChannelElement
*sce
,
925 int start
= 0, i
, w
, w2
, g
;
928 memset(sce
->sf_idx
, 0, sizeof(sce
->sf_idx
));
929 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
931 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
932 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
933 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
934 if (band
->energy
<= band
->threshold
) {
935 sce
->sf_idx
[(w
+w2
)*16+g
] = 218;
936 sce
->zeroes
[(w
+w2
)*16+g
] = 1;
938 sce
->sf_idx
[(w
+w2
)*16+g
] = av_clip(SCALE_ONE_POS
- SCALE_DIV_512
+ log2(band
->threshold
), 80, 218);
939 sce
->zeroes
[(w
+w2
)*16+g
] = 0;
941 minq
= FFMIN(minq
, sce
->sf_idx
[(w
+w2
)*16+g
]);
945 for (i
= 0; i
< 128; i
++) {
946 sce
->sf_idx
[i
] = 140;
947 //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);
949 //set the same quantizers inside window groups
950 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
])
951 for (g
= 0; g
< sce
->ics
.num_swb
; g
++)
952 for (w2
= 1; w2
< sce
->ics
.group_len
[w
]; w2
++)
953 sce
->sf_idx
[(w
+w2
)*16+g
] = sce
->sf_idx
[w
*16+g
];
956 static void search_for_ms(AACEncContext
*s
, ChannelElement
*cpe
,
959 int start
= 0, i
, w
, w2
, g
;
960 float M
[128], S
[128];
961 float *L34
= s
->scoefs
, *R34
= s
->scoefs
+ 128, *M34
= s
->scoefs
+ 128*2, *S34
= s
->scoefs
+ 128*3;
962 SingleChannelElement
*sce0
= &cpe
->ch
[0];
963 SingleChannelElement
*sce1
= &cpe
->ch
[1];
964 if (!cpe
->common_window
)
966 for (w
= 0; w
< sce0
->ics
.num_windows
; w
+= sce0
->ics
.group_len
[w
]) {
967 for (g
= 0; g
< sce0
->ics
.num_swb
; g
++) {
968 if (!cpe
->ch
[0].zeroes
[w
*16+g
] && !cpe
->ch
[1].zeroes
[w
*16+g
]) {
969 float dist1
= 0.0f
, dist2
= 0.0f
;
970 for (w2
= 0; w2
< sce0
->ics
.group_len
[w
]; w2
++) {
971 FFPsyBand
*band0
= &s
->psy
.psy_bands
[(s
->cur_channel
+0)*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
972 FFPsyBand
*band1
= &s
->psy
.psy_bands
[(s
->cur_channel
+1)*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
973 float minthr
= FFMIN(band0
->threshold
, band1
->threshold
);
974 float maxthr
= FFMAX(band0
->threshold
, band1
->threshold
);
975 for (i
= 0; i
< sce0
->ics
.swb_sizes
[g
]; i
++) {
976 M
[i
] = (sce0
->coeffs
[start
+w2
*128+i
]
977 + sce1
->coeffs
[start
+w2
*128+i
]) * 0.5;
978 S
[i
] = sce0
->coeffs
[start
+w2
*128+i
]
979 - sce1
->coeffs
[start
+w2
*128+i
];
981 abs_pow34_v(L34
, sce0
->coeffs
+start
+w2
*128, sce0
->ics
.swb_sizes
[g
]);
982 abs_pow34_v(R34
, sce1
->coeffs
+start
+w2
*128, sce0
->ics
.swb_sizes
[g
]);
983 abs_pow34_v(M34
, M
, sce0
->ics
.swb_sizes
[g
]);
984 abs_pow34_v(S34
, S
, sce0
->ics
.swb_sizes
[g
]);
985 dist1
+= quantize_band_cost(s
, sce0
->coeffs
+ start
+ w2
*128,
987 sce0
->ics
.swb_sizes
[g
],
988 sce0
->sf_idx
[(w
+w2
)*16+g
],
989 sce0
->band_type
[(w
+w2
)*16+g
],
990 lambda
/ band0
->threshold
, INFINITY
, NULL
);
991 dist1
+= quantize_band_cost(s
, sce1
->coeffs
+ start
+ w2
*128,
993 sce1
->ics
.swb_sizes
[g
],
994 sce1
->sf_idx
[(w
+w2
)*16+g
],
995 sce1
->band_type
[(w
+w2
)*16+g
],
996 lambda
/ band1
->threshold
, INFINITY
, NULL
);
997 dist2
+= quantize_band_cost(s
, M
,
999 sce0
->ics
.swb_sizes
[g
],
1000 sce0
->sf_idx
[(w
+w2
)*16+g
],
1001 sce0
->band_type
[(w
+w2
)*16+g
],
1002 lambda
/ maxthr
, INFINITY
, NULL
);
1003 dist2
+= quantize_band_cost(s
, S
,
1005 sce1
->ics
.swb_sizes
[g
],
1006 sce1
->sf_idx
[(w
+w2
)*16+g
],
1007 sce1
->band_type
[(w
+w2
)*16+g
],
1008 lambda
/ minthr
, INFINITY
, NULL
);
1010 cpe
->ms_mask
[w
*16+g
] = dist2
< dist1
;
1012 start
+= sce0
->ics
.swb_sizes
[g
];
1017 AACCoefficientsEncoder ff_aac_coders
[] = {
1019 search_for_quantizers_faac
,
1020 encode_window_bands_info
,
1021 quantize_and_encode_band
,
1025 search_for_quantizers_anmr
,
1026 encode_window_bands_info
,
1027 quantize_and_encode_band
,
1031 search_for_quantizers_twoloop
,
1032 encode_window_bands_info
,
1033 quantize_and_encode_band
,
1037 search_for_quantizers_fast
,
1038 encode_window_bands_info
,
1039 quantize_and_encode_band
,