2 * AAC coefficients encoder
3 * Copyright (C) 2008-2009 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * AAC coefficients encoder
27 /***********************************
29 * speedup quantizer selection
30 * add sane pulse detection
31 ***********************************/
33 #include "libavutil/libm.h" // brought forward to work around cygwin header breakage
42 /** bits needed to code codebook run value for long windows */
43 static const uint8_t run_value_bits_long
[64] = {
44 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
45 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10,
46 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
47 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15
50 /** bits needed to code codebook run value for short windows */
51 static const uint8_t run_value_bits_short
[16] = {
52 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
55 static const uint8_t *run_value_bits
[2] = {
56 run_value_bits_long
, run_value_bits_short
61 * Quantize one coefficient.
62 * @return absolute value of the quantized coefficient
63 * @see 3GPP TS26.403 5.6.2 "Scalefactor determination"
65 static av_always_inline
int quant(float coef
, const float Q
)
68 return sqrtf(a
* sqrtf(a
)) + 0.4054;
71 static void quantize_bands(int *out
, const float *in
, const float *scaled
,
72 int size
, float Q34
, int is_signed
, int maxval
)
76 for (i
= 0; i
< size
; i
++) {
78 out
[i
] = (int)FFMIN(qc
+ 0.4054, (double)maxval
);
79 if (is_signed
&& in
[i
] < 0.0f
) {
85 static void abs_pow34_v(float *out
, const float *in
, const int size
)
87 #ifndef USE_REALLY_FULL_SEARCH
89 for (i
= 0; i
< size
; i
++) {
90 float a
= fabsf(in
[i
]);
91 out
[i
] = sqrtf(a
* sqrtf(a
));
93 #endif /* USE_REALLY_FULL_SEARCH */
96 static const uint8_t aac_cb_range
[12] = {0, 3, 3, 3, 3, 9, 9, 8, 8, 13, 13, 17};
97 static const uint8_t aac_cb_maxval
[12] = {0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, 16};
100 * Calculate rate distortion cost for quantizing with given codebook
102 * @return quantization distortion
104 static av_always_inline
float quantize_and_encode_band_cost_template(
105 struct AACEncContext
*s
,
106 PutBitContext
*pb
, const float *in
,
107 const float *scaled
, int size
, int scale_idx
,
108 int cb
, const float lambda
, const float uplim
,
109 int *bits
, int BT_ZERO
, int BT_UNSIGNED
,
110 int BT_PAIR
, int BT_ESC
)
112 const float IQ
= ff_aac_pow2sf_tab
[POW_SF2_ZERO
+ scale_idx
- SCALE_ONE_POS
+ SCALE_DIV_512
];
113 const float Q
= ff_aac_pow2sf_tab
[POW_SF2_ZERO
- scale_idx
+ SCALE_ONE_POS
- SCALE_DIV_512
];
114 const float CLIPPED_ESCAPE
= 165140.0f
*IQ
;
117 const int dim
= BT_PAIR ?
2 : 4;
119 const float Q34
= sqrtf(Q
* sqrtf(Q
));
120 const int range
= aac_cb_range
[cb
];
121 const int maxval
= aac_cb_maxval
[cb
];
125 for (i
= 0; i
< size
; i
++)
129 return cost
* lambda
;
132 abs_pow34_v(s
->scoefs
, in
, size
);
135 quantize_bands(s
->qcoefs
, in
, scaled
, size
, Q34
, !BT_UNSIGNED
, maxval
);
141 for (i
= 0; i
< size
; i
+= dim
) {
143 int *quants
= s
->qcoefs
+ i
;
147 for (j
= 0; j
< dim
; j
++) {
149 curidx
+= quants
[j
] + off
;
151 curbits
= ff_aac_spectral_bits
[cb
-1][curidx
];
152 vec
= &ff_aac_codebook_vectors
[cb
-1][curidx
*dim
];
154 for (j
= 0; j
< dim
; j
++) {
155 float t
= fabsf(in
[i
+j
]);
157 if (BT_ESC
&& vec
[j
] == 64.0f
) { //FIXME: slow
158 if (t
>= CLIPPED_ESCAPE
) {
159 di
= t
- CLIPPED_ESCAPE
;
162 int c
= av_clip(quant(t
, Q
), 0, 8191);
163 di
= t
- c
*cbrtf(c
)*IQ
;
164 curbits
+= av_log2(c
)*2 - 4 + 1;
174 for (j
= 0; j
< dim
; j
++) {
175 float di
= in
[i
+j
] - vec
[j
]*IQ
;
179 cost
+= rd
* lambda
+ curbits
;
184 put_bits(pb
, ff_aac_spectral_bits
[cb
-1][curidx
], ff_aac_spectral_codes
[cb
-1][curidx
]);
186 for (j
= 0; j
< dim
; j
++)
187 if (ff_aac_codebook_vectors
[cb
-1][curidx
*dim
+j
] != 0.0f
)
188 put_bits(pb
, 1, in
[i
+j
] < 0.0f
);
190 for (j
= 0; j
< 2; j
++) {
191 if (ff_aac_codebook_vectors
[cb
-1][curidx
*2+j
] == 64.0f
) {
192 int coef
= av_clip(quant(fabsf(in
[i
+j
]), Q
), 0, 8191);
193 int len
= av_log2(coef
);
195 put_bits(pb
, len
- 4 + 1, (1 << (len
- 4 + 1)) - 2);
196 put_bits(pb
, len
, coef
& ((1 << len
) - 1));
208 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC) \
209 static float quantize_and_encode_band_cost_ ## NAME( \
210 struct AACEncContext *s, \
211 PutBitContext *pb, const float *in, \
212 const float *scaled, int size, int scale_idx, \
213 int cb, const float lambda, const float uplim, \
215 return quantize_and_encode_band_cost_template( \
216 s, pb, in, scaled, size, scale_idx, \
217 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, \
218 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC); \
221 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO
, 1, 0, 0, 0)
222 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD
, 0, 0, 0, 0)
223 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD
, 0, 1, 0, 0)
224 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR
, 0, 0, 1, 0)
225 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR
, 0, 1, 1, 0)
226 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC
, 0, 1, 1, 1)
228 static float (*const quantize_and_encode_band_cost_arr
[])(
229 struct AACEncContext
*s
,
230 PutBitContext
*pb
, const float *in
,
231 const float *scaled
, int size
, int scale_idx
,
232 int cb
, const float lambda
, const float uplim
,
234 quantize_and_encode_band_cost_ZERO
,
235 quantize_and_encode_band_cost_SQUAD
,
236 quantize_and_encode_band_cost_SQUAD
,
237 quantize_and_encode_band_cost_UQUAD
,
238 quantize_and_encode_band_cost_UQUAD
,
239 quantize_and_encode_band_cost_SPAIR
,
240 quantize_and_encode_band_cost_SPAIR
,
241 quantize_and_encode_band_cost_UPAIR
,
242 quantize_and_encode_band_cost_UPAIR
,
243 quantize_and_encode_band_cost_UPAIR
,
244 quantize_and_encode_band_cost_UPAIR
,
245 quantize_and_encode_band_cost_ESC
,
248 #define quantize_and_encode_band_cost( \
249 s, pb, in, scaled, size, scale_idx, cb, \
250 lambda, uplim, bits) \
251 quantize_and_encode_band_cost_arr[cb]( \
252 s, pb, in, scaled, size, scale_idx, cb, \
255 static float quantize_band_cost(struct AACEncContext
*s
, const float *in
,
256 const float *scaled
, int size
, int scale_idx
,
257 int cb
, const float lambda
, const float uplim
,
260 return quantize_and_encode_band_cost(s
, NULL
, in
, scaled
, size
, scale_idx
,
261 cb
, lambda
, uplim
, bits
);
264 static void quantize_and_encode_band(struct AACEncContext
*s
, PutBitContext
*pb
,
265 const float *in
, int size
, int scale_idx
,
266 int cb
, const float lambda
)
268 quantize_and_encode_band_cost(s
, pb
, in
, NULL
, size
, scale_idx
, cb
, lambda
,
272 static float find_max_val(int group_len
, int swb_size
, const float *scaled
) {
275 for (w2
= 0; w2
< group_len
; w2
++) {
276 for (i
= 0; i
< swb_size
; i
++) {
277 maxval
= FFMAX(maxval
, scaled
[w2
*128+i
]);
283 static int find_min_book(float maxval
, int sf
) {
284 float Q
= ff_aac_pow2sf_tab
[POW_SF2_ZERO
- sf
+ SCALE_ONE_POS
- SCALE_DIV_512
];
285 float Q34
= sqrtf(Q
* sqrtf(Q
));
287 qmaxval
= maxval
* Q34
+ 0.4054f
;
288 if (qmaxval
== 0) cb
= 0;
289 else if (qmaxval
== 1) cb
= 1;
290 else if (qmaxval
== 2) cb
= 3;
291 else if (qmaxval
<= 4) cb
= 5;
292 else if (qmaxval
<= 7) cb
= 7;
293 else if (qmaxval
<= 12) cb
= 9;
299 * structure used in optimal codebook search
301 typedef struct BandCodingPath
{
302 int prev_idx
; ///< pointer to the previous path point
303 float cost
; ///< path cost
308 * Encode band info for single window group bands.
310 static void encode_window_bands_info(AACEncContext
*s
, SingleChannelElement
*sce
,
311 int win
, int group_len
, const float lambda
)
313 BandCodingPath path
[120][12];
314 int w
, swb
, cb
, start
, start2
, size
;
316 const int max_sfb
= sce
->ics
.max_sfb
;
317 const int run_bits
= sce
->ics
.num_windows
== 1 ?
5 : 3;
318 const int run_esc
= (1 << run_bits
) - 1;
319 int idx
, ppos
, count
;
320 int stackrun
[120], stackcb
[120], stack_len
;
321 float next_minrd
= INFINITY
;
324 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
326 for (cb
= 0; cb
< 12; cb
++) {
327 path
[0][cb
].cost
= 0.0f
;
328 path
[0][cb
].prev_idx
= -1;
331 for (swb
= 0; swb
< max_sfb
; swb
++) {
333 size
= sce
->ics
.swb_sizes
[swb
];
334 if (sce
->zeroes
[win
*16 + swb
]) {
335 for (cb
= 0; cb
< 12; cb
++) {
336 path
[swb
+1][cb
].prev_idx
= cb
;
337 path
[swb
+1][cb
].cost
= path
[swb
][cb
].cost
;
338 path
[swb
+1][cb
].run
= path
[swb
][cb
].run
+ 1;
341 float minrd
= next_minrd
;
342 int mincb
= next_mincb
;
343 next_minrd
= INFINITY
;
345 for (cb
= 0; cb
< 12; cb
++) {
346 float cost_stay_here
, cost_get_here
;
348 for (w
= 0; w
< group_len
; w
++) {
349 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(win
+w
)*16+swb
];
350 rd
+= quantize_band_cost(s
, sce
->coeffs
+ start
+ w
*128,
351 s
->scoefs
+ start
+ w
*128, size
,
352 sce
->sf_idx
[(win
+w
)*16+swb
], cb
,
353 lambda
/ band
->threshold
, INFINITY
, NULL
);
355 cost_stay_here
= path
[swb
][cb
].cost
+ rd
;
356 cost_get_here
= minrd
+ rd
+ run_bits
+ 4;
357 if ( run_value_bits
[sce
->ics
.num_windows
== 8][path
[swb
][cb
].run
]
358 != run_value_bits
[sce
->ics
.num_windows
== 8][path
[swb
][cb
].run
+1])
359 cost_stay_here
+= run_bits
;
360 if (cost_get_here
< cost_stay_here
) {
361 path
[swb
+1][cb
].prev_idx
= mincb
;
362 path
[swb
+1][cb
].cost
= cost_get_here
;
363 path
[swb
+1][cb
].run
= 1;
365 path
[swb
+1][cb
].prev_idx
= cb
;
366 path
[swb
+1][cb
].cost
= cost_stay_here
;
367 path
[swb
+1][cb
].run
= path
[swb
][cb
].run
+ 1;
369 if (path
[swb
+1][cb
].cost
< next_minrd
) {
370 next_minrd
= path
[swb
+1][cb
].cost
;
375 start
+= sce
->ics
.swb_sizes
[swb
];
378 //convert resulting path from backward-linked list
381 for (cb
= 1; cb
< 12; cb
++)
382 if (path
[max_sfb
][cb
].cost
< path
[max_sfb
][idx
].cost
)
387 stackrun
[stack_len
] = path
[ppos
][cb
].run
;
388 stackcb
[stack_len
] = cb
;
389 idx
= path
[ppos
-path
[ppos
][cb
].run
+1][cb
].prev_idx
;
390 ppos
-= path
[ppos
][cb
].run
;
393 //perform actual band info encoding
395 for (i
= stack_len
- 1; i
>= 0; i
--) {
396 put_bits(&s
->pb
, 4, stackcb
[i
]);
398 memset(sce
->zeroes
+ win
*16 + start
, !stackcb
[i
], count
);
399 //XXX: memset when band_type is also uint8_t
400 for (j
= 0; j
< count
; j
++) {
401 sce
->band_type
[win
*16 + start
] = stackcb
[i
];
404 while (count
>= run_esc
) {
405 put_bits(&s
->pb
, run_bits
, run_esc
);
408 put_bits(&s
->pb
, run_bits
, count
);
412 static void codebook_trellis_rate(AACEncContext
*s
, SingleChannelElement
*sce
,
413 int win
, int group_len
, const float lambda
)
415 BandCodingPath path
[120][12];
416 int w
, swb
, cb
, start
, start2
, size
;
418 const int max_sfb
= sce
->ics
.max_sfb
;
419 const int run_bits
= sce
->ics
.num_windows
== 1 ?
5 : 3;
420 const int run_esc
= (1 << run_bits
) - 1;
421 int idx
, ppos
, count
;
422 int stackrun
[120], stackcb
[120], stack_len
;
423 float next_minrd
= INFINITY
;
426 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
428 for (cb
= 0; cb
< 12; cb
++) {
429 path
[0][cb
].cost
= run_bits
+4;
430 path
[0][cb
].prev_idx
= -1;
433 for (swb
= 0; swb
< max_sfb
; swb
++) {
435 size
= sce
->ics
.swb_sizes
[swb
];
436 if (sce
->zeroes
[win
*16 + swb
]) {
437 for (cb
= 0; cb
< 12; cb
++) {
438 path
[swb
+1][cb
].prev_idx
= cb
;
439 path
[swb
+1][cb
].cost
= path
[swb
][cb
].cost
;
440 path
[swb
+1][cb
].run
= path
[swb
][cb
].run
+ 1;
443 float minrd
= next_minrd
;
444 int mincb
= next_mincb
;
445 int startcb
= sce
->band_type
[win
*16+swb
];
446 next_minrd
= INFINITY
;
448 for (cb
= 0; cb
< startcb
; cb
++) {
449 path
[swb
+1][cb
].cost
= 61450;
450 path
[swb
+1][cb
].prev_idx
= -1;
451 path
[swb
+1][cb
].run
= 0;
453 for (cb
= startcb
; cb
< 12; cb
++) {
454 float cost_stay_here
, cost_get_here
;
456 for (w
= 0; w
< group_len
; w
++) {
457 rd
+= quantize_band_cost(s
, sce
->coeffs
+ start
+ w
*128,
458 s
->scoefs
+ start
+ w
*128, size
,
459 sce
->sf_idx
[(win
+w
)*16+swb
], cb
,
462 cost_stay_here
= path
[swb
][cb
].cost
+ rd
;
463 cost_get_here
= minrd
+ rd
+ run_bits
+ 4;
464 if ( run_value_bits
[sce
->ics
.num_windows
== 8][path
[swb
][cb
].run
]
465 != run_value_bits
[sce
->ics
.num_windows
== 8][path
[swb
][cb
].run
+1])
466 cost_stay_here
+= run_bits
;
467 if (cost_get_here
< cost_stay_here
) {
468 path
[swb
+1][cb
].prev_idx
= mincb
;
469 path
[swb
+1][cb
].cost
= cost_get_here
;
470 path
[swb
+1][cb
].run
= 1;
472 path
[swb
+1][cb
].prev_idx
= cb
;
473 path
[swb
+1][cb
].cost
= cost_stay_here
;
474 path
[swb
+1][cb
].run
= path
[swb
][cb
].run
+ 1;
476 if (path
[swb
+1][cb
].cost
< next_minrd
) {
477 next_minrd
= path
[swb
+1][cb
].cost
;
482 start
+= sce
->ics
.swb_sizes
[swb
];
485 //convert resulting path from backward-linked list
488 for (cb
= 1; cb
< 12; cb
++)
489 if (path
[max_sfb
][cb
].cost
< path
[max_sfb
][idx
].cost
)
495 stackrun
[stack_len
] = path
[ppos
][cb
].run
;
496 stackcb
[stack_len
] = cb
;
497 idx
= path
[ppos
-path
[ppos
][cb
].run
+1][cb
].prev_idx
;
498 ppos
-= path
[ppos
][cb
].run
;
501 //perform actual band info encoding
503 for (i
= stack_len
- 1; i
>= 0; i
--) {
504 put_bits(&s
->pb
, 4, stackcb
[i
]);
506 memset(sce
->zeroes
+ win
*16 + start
, !stackcb
[i
], count
);
507 //XXX: memset when band_type is also uint8_t
508 for (j
= 0; j
< count
; j
++) {
509 sce
->band_type
[win
*16 + start
] = stackcb
[i
];
512 while (count
>= run_esc
) {
513 put_bits(&s
->pb
, run_bits
, run_esc
);
516 put_bits(&s
->pb
, run_bits
, count
);
520 /** Return the minimum scalefactor where the quantized coef does not clip. */
521 static av_always_inline
uint8_t coef2minsf(float coef
) {
522 return av_clip_uint8(log2f(coef
)*4 - 69 + SCALE_ONE_POS
- SCALE_DIV_512
);
525 /** Return the maximum scalefactor where the quantized coef is not zero. */
526 static av_always_inline
uint8_t coef2maxsf(float coef
) {
527 return av_clip_uint8(log2f(coef
)*4 + 6 + SCALE_ONE_POS
- SCALE_DIV_512
);
530 typedef struct TrellisPath
{
535 #define TRELLIS_STAGES 121
536 #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
538 static void search_for_quantizers_anmr(AVCodecContext
*avctx
, AACEncContext
*s
,
539 SingleChannelElement
*sce
,
542 int q
, w
, w2
, g
, start
= 0;
545 TrellisPath paths
[TRELLIS_STAGES
][TRELLIS_STATES
];
546 int bandaddr
[TRELLIS_STAGES
];
549 float q0f
= FLT_MAX
, q1f
= 0.0f
, qnrgf
= 0.0f
;
550 int q0
, q1
, qcnt
= 0;
552 for (i
= 0; i
< 1024; i
++) {
553 float t
= fabsf(sce
->coeffs
[i
]);
563 memset(sce
->sf_idx
, 0, sizeof(sce
->sf_idx
));
564 memset(sce
->zeroes
, 1, sizeof(sce
->zeroes
));
568 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
569 q0
= coef2minsf(q0f
);
570 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
571 q1
= coef2maxsf(q1f
);
572 //av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
576 //minimum scalefactor index is when maximum nonzero coefficient after quantizing is not clipped
577 int qnrg
= av_clip_uint8(log2f(sqrtf(qnrgf
/qcnt
))*4 - 31 + SCALE_ONE_POS
- SCALE_DIV_512
);
580 //av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
584 } else if (q1
> q1high
) {
589 //av_log(NULL, AV_LOG_ERROR, "q0 %d, q1 %d\n", q0, q1);
591 for (i
= 0; i
< TRELLIS_STATES
; i
++) {
592 paths
[0][i
].cost
= 0.0f
;
593 paths
[0][i
].prev
= -1;
595 for (j
= 1; j
< TRELLIS_STAGES
; j
++) {
596 for (i
= 0; i
< TRELLIS_STATES
; i
++) {
597 paths
[j
][i
].cost
= INFINITY
;
598 paths
[j
][i
].prev
= -2;
602 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
603 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
605 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
606 const float *coefs
= sce
->coeffs
+ start
;
610 bandaddr
[idx
] = w
* 16 + g
;
613 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
614 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
615 if (band
->energy
<= band
->threshold
|| band
->threshold
== 0.0f
) {
616 sce
->zeroes
[(w
+w2
)*16+g
] = 1;
619 sce
->zeroes
[(w
+w2
)*16+g
] = 0;
621 for (i
= 0; i
< sce
->ics
.swb_sizes
[g
]; i
++) {
622 float t
= fabsf(coefs
[w2
*128+i
]);
624 qmin
= FFMIN(qmin
, t
);
625 qmax
= FFMAX(qmax
, t
);
629 int minscale
, maxscale
;
630 float minrd
= INFINITY
;
632 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
633 minscale
= coef2minsf(qmin
);
634 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
635 maxscale
= coef2maxsf(qmax
);
636 minscale
= av_clip(minscale
- q0
, 0, TRELLIS_STATES
- 1);
637 maxscale
= av_clip(maxscale
- q0
, 0, TRELLIS_STATES
);
638 maxval
= find_max_val(sce
->ics
.group_len
[w
], sce
->ics
.swb_sizes
[g
], s
->scoefs
+start
);
639 for (q
= minscale
; q
< maxscale
; q
++) {
641 int cb
= find_min_book(maxval
, sce
->sf_idx
[w
*16+g
]);
642 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
643 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
644 dist
+= quantize_band_cost(s
, coefs
+ w2
*128, s
->scoefs
+ start
+ w2
*128, sce
->ics
.swb_sizes
[g
],
645 q
+ q0
, cb
, lambda
/ band
->threshold
, INFINITY
, NULL
);
647 minrd
= FFMIN(minrd
, dist
);
649 for (i
= 0; i
< q1
- q0
; i
++) {
651 cost
= paths
[idx
- 1][i
].cost
+ dist
652 + ff_aac_scalefactor_bits
[q
- i
+ SCALE_DIFF_ZERO
];
653 if (cost
< paths
[idx
][q
].cost
) {
654 paths
[idx
][q
].cost
= cost
;
655 paths
[idx
][q
].prev
= i
;
660 for (q
= 0; q
< q1
- q0
; q
++) {
661 paths
[idx
][q
].cost
= paths
[idx
- 1][q
].cost
+ 1;
662 paths
[idx
][q
].prev
= q
;
665 sce
->zeroes
[w
*16+g
] = !nz
;
666 start
+= sce
->ics
.swb_sizes
[g
];
671 mincost
= paths
[idx
][0].cost
;
673 for (i
= 1; i
< TRELLIS_STATES
; i
++) {
674 if (paths
[idx
][i
].cost
< mincost
) {
675 mincost
= paths
[idx
][i
].cost
;
680 sce
->sf_idx
[bandaddr
[idx
]] = minq
+ q0
;
681 minq
= paths
[idx
][minq
].prev
;
684 //set the same quantizers inside window groups
685 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
])
686 for (g
= 0; g
< sce
->ics
.num_swb
; g
++)
687 for (w2
= 1; w2
< sce
->ics
.group_len
[w
]; w2
++)
688 sce
->sf_idx
[(w
+w2
)*16+g
] = sce
->sf_idx
[w
*16+g
];
692 * two-loop quantizers search taken from ISO 13818-7 Appendix C
694 static void search_for_quantizers_twoloop(AVCodecContext
*avctx
,
696 SingleChannelElement
*sce
,
699 int start
= 0, i
, w
, w2
, g
;
700 int destbits
= avctx
->bit_rate
* 1024.0 / avctx
->sample_rate
/ avctx
->channels
;
701 float dists
[128], uplims
[128];
703 int fflag
, minscaler
;
706 float minthr
= INFINITY
;
708 //XXX: some heuristic to determine initial quantizers will reduce search time
709 memset(dists
, 0, sizeof(dists
));
710 //determine zero bands and upper limits
711 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
712 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
715 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
716 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
717 uplim
+= band
->threshold
;
718 if (band
->energy
<= band
->threshold
|| band
->threshold
== 0.0f
) {
719 sce
->zeroes
[(w
+w2
)*16+g
] = 1;
724 uplims
[w
*16+g
] = uplim
*512;
725 sce
->zeroes
[w
*16+g
] = !nz
;
727 minthr
= FFMIN(minthr
, uplim
);
731 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
732 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
733 if (sce
->zeroes
[w
*16+g
]) {
734 sce
->sf_idx
[w
*16+g
] = SCALE_ONE_POS
;
737 sce
->sf_idx
[w
*16+g
] = SCALE_ONE_POS
+ FFMIN(log2f(uplims
[w
*16+g
]/minthr
)*4,59);
743 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
745 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
747 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
748 const float *scaled
= s
->scoefs
+ start
;
749 maxvals
[w
*16+g
] = find_max_val(sce
->ics
.group_len
[w
], sce
->ics
.swb_sizes
[g
], scaled
);
750 start
+= sce
->ics
.swb_sizes
[g
];
754 //perform two-loop search
755 //outer loop - improve quality
758 minscaler
= sce
->sf_idx
[0];
759 //inner loop - quantize spectrum to fit into given number of bits
760 qstep
= its ?
1 : 32;
765 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
767 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
768 const float *coefs
= sce
->coeffs
+ start
;
769 const float *scaled
= s
->scoefs
+ start
;
774 if (sce
->zeroes
[w
*16+g
] || sce
->sf_idx
[w
*16+g
] >= 218) {
775 start
+= sce
->ics
.swb_sizes
[g
];
778 minscaler
= FFMIN(minscaler
, sce
->sf_idx
[w
*16+g
]);
779 cb
= find_min_book(maxvals
[w
*16+g
], sce
->sf_idx
[w
*16+g
]);
780 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
782 dist
+= quantize_band_cost(s
, coefs
+ w2
*128,
784 sce
->ics
.swb_sizes
[g
],
792 dists
[w
*16+g
] = dist
- bits
;
794 bits
+= ff_aac_scalefactor_bits
[sce
->sf_idx
[w
*16+g
] - prev
+ SCALE_DIFF_ZERO
];
797 start
+= sce
->ics
.swb_sizes
[g
];
798 prev
= sce
->sf_idx
[w
*16+g
];
801 if (tbits
> destbits
) {
802 for (i
= 0; i
< 128; i
++)
803 if (sce
->sf_idx
[i
] < 218 - qstep
)
804 sce
->sf_idx
[i
] += qstep
;
806 for (i
= 0; i
< 128; i
++)
807 if (sce
->sf_idx
[i
] > 60 - qstep
)
808 sce
->sf_idx
[i
] -= qstep
;
811 if (!qstep
&& tbits
> destbits
*1.02 && sce
->sf_idx
[0] < 217)
816 minscaler
= av_clip(minscaler
, 60, 255 - SCALE_MAX_DIFF
);
817 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
818 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
819 int prevsc
= sce
->sf_idx
[w
*16+g
];
820 if (dists
[w
*16+g
] > uplims
[w
*16+g
] && sce
->sf_idx
[w
*16+g
] > 60) {
821 if (find_min_book(maxvals
[w
*16+g
], sce
->sf_idx
[w
*16+g
]-1))
822 sce
->sf_idx
[w
*16+g
]--;
823 else //Try to make sure there is some energy in every band
824 sce
->sf_idx
[w
*16+g
]-=2;
826 sce
->sf_idx
[w
*16+g
] = av_clip(sce
->sf_idx
[w
*16+g
], minscaler
, minscaler
+ SCALE_MAX_DIFF
);
827 sce
->sf_idx
[w
*16+g
] = FFMIN(sce
->sf_idx
[w
*16+g
], 219);
828 if (sce
->sf_idx
[w
*16+g
] != prevsc
)
830 sce
->band_type
[w
*16+g
] = find_min_book(maxvals
[w
*16+g
], sce
->sf_idx
[w
*16+g
]);
834 } while (fflag
&& its
< 10);
837 static void search_for_quantizers_faac(AVCodecContext
*avctx
, AACEncContext
*s
,
838 SingleChannelElement
*sce
,
841 int start
= 0, i
, w
, w2
, g
;
842 float uplim
[128], maxq
[128];
844 float distfact
= ((sce
->ics
.num_windows
> 1) ?
85.80 : 147.84) / lambda
;
845 int last
= 0, lastband
= 0, curband
= 0;
846 float avg_energy
= 0.0;
847 if (sce
->ics
.num_windows
== 1) {
849 for (i
= 0; i
< 1024; i
++) {
850 if (i
- start
>= sce
->ics
.swb_sizes
[curband
]) {
851 start
+= sce
->ics
.swb_sizes
[curband
];
854 if (sce
->coeffs
[i
]) {
855 avg_energy
+= sce
->coeffs
[i
] * sce
->coeffs
[i
];
861 for (w
= 0; w
< 8; w
++) {
862 const float *coeffs
= sce
->coeffs
+ w
*128;
864 for (i
= 0; i
< 128; i
++) {
865 if (i
- start
>= sce
->ics
.swb_sizes
[curband
]) {
866 start
+= sce
->ics
.swb_sizes
[curband
];
870 avg_energy
+= coeffs
[i
] * coeffs
[i
];
871 last
= FFMAX(last
, i
);
872 lastband
= FFMAX(lastband
, curband
);
879 if (avg_energy
== 0.0f
) {
880 for (i
= 0; i
< FF_ARRAY_ELEMS(sce
->sf_idx
); i
++)
881 sce
->sf_idx
[i
] = SCALE_ONE_POS
;
884 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
886 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
887 float *coefs
= sce
->coeffs
+ start
;
888 const int size
= sce
->ics
.swb_sizes
[g
];
889 int start2
= start
, end2
= start
+ size
, peakpos
= start
;
890 float maxval
= -1, thr
= 0.0f
, t
;
895 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++)
896 memset(coefs
+ w2
*128, 0, sizeof(coefs
[0])*size
);
899 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
900 for (i
= 0; i
< size
; i
++) {
901 float t
= coefs
[w2
*128+i
]*coefs
[w2
*128+i
];
902 maxq
[w
*16+g
] = FFMAX(maxq
[w
*16+g
], fabsf(coefs
[w2
*128 + i
]));
904 if (sce
->ics
.num_windows
== 1 && maxval
< t
) {
910 if (sce
->ics
.num_windows
== 1) {
911 start2
= FFMAX(peakpos
- 2, start2
);
912 end2
= FFMIN(peakpos
+ 3, end2
);
918 thr
= pow(thr
/ (avg_energy
* (end2
- start2
)), 0.3 + 0.1*(lastband
- g
) / lastband
);
919 t
= 1.0 - (1.0 * start2
/ last
);
920 uplim
[w
*16+g
] = distfact
/ (1.4 * thr
+ t
*t
*t
+ 0.075);
923 memset(sce
->sf_idx
, 0, sizeof(sce
->sf_idx
));
924 abs_pow34_v(s
->scoefs
, sce
->coeffs
, 1024);
925 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
927 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
928 const float *coefs
= sce
->coeffs
+ start
;
929 const float *scaled
= s
->scoefs
+ start
;
930 const int size
= sce
->ics
.swb_sizes
[g
];
931 int scf
, prev_scf
, step
;
932 int min_scf
= -1, max_scf
= 256;
934 if (maxq
[w
*16+g
] < 21.544) {
935 sce
->zeroes
[w
*16+g
] = 1;
939 sce
->zeroes
[w
*16+g
] = 0;
940 scf
= prev_scf
= av_clip(SCALE_ONE_POS
- SCALE_DIV_512
- log2f(1/maxq
[w
*16+g
])*16/3, 60, 218);
946 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
948 dist
+= quantize_band_cost(s
, coefs
+ w2
*128,
950 sce
->ics
.swb_sizes
[g
],
958 dist
*= 1.0f
/ 512.0f
/ lambda
;
959 quant_max
= quant(maxq
[w
*16+g
], ff_aac_pow2sf_tab
[POW_SF2_ZERO
- scf
+ SCALE_ONE_POS
- SCALE_DIV_512
]);
960 if (quant_max
>= 8191) { // too much, return to the previous quantizer
961 sce
->sf_idx
[w
*16+g
] = prev_scf
;
965 curdiff
= fabsf(dist
- uplim
[w
*16+g
]);
969 step
= log2f(curdiff
);
970 if (dist
> uplim
[w
*16+g
])
973 scf
= av_clip_uint8(scf
);
974 step
= scf
- prev_scf
;
975 if (FFABS(step
) <= 1 || (step
> 0 && scf
>= max_scf
) || (step
< 0 && scf
<= min_scf
)) {
976 sce
->sf_idx
[w
*16+g
] = av_clip(scf
, min_scf
, max_scf
);
987 minq
= sce
->sf_idx
[0] ? sce
->sf_idx
[0] : INT_MAX
;
988 for (i
= 1; i
< 128; i
++) {
990 sce
->sf_idx
[i
] = sce
->sf_idx
[i
-1];
992 minq
= FFMIN(minq
, sce
->sf_idx
[i
]);
996 minq
= FFMIN(minq
, SCALE_MAX_POS
);
997 maxsf
= FFMIN(minq
+ SCALE_MAX_DIFF
, SCALE_MAX_POS
);
998 for (i
= 126; i
>= 0; i
--) {
1000 sce
->sf_idx
[i
] = sce
->sf_idx
[i
+1];
1001 sce
->sf_idx
[i
] = av_clip(sce
->sf_idx
[i
], minq
, maxsf
);
1005 static void search_for_quantizers_fast(AVCodecContext
*avctx
, AACEncContext
*s
,
1006 SingleChannelElement
*sce
,
1009 int start
= 0, i
, w
, w2
, g
;
1012 memset(sce
->sf_idx
, 0, sizeof(sce
->sf_idx
));
1013 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
]) {
1015 for (g
= 0; g
< sce
->ics
.num_swb
; g
++) {
1016 for (w2
= 0; w2
< sce
->ics
.group_len
[w
]; w2
++) {
1017 FFPsyBand
*band
= &s
->psy
.psy_bands
[s
->cur_channel
*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
1018 if (band
->energy
<= band
->threshold
) {
1019 sce
->sf_idx
[(w
+w2
)*16+g
] = 218;
1020 sce
->zeroes
[(w
+w2
)*16+g
] = 1;
1022 sce
->sf_idx
[(w
+w2
)*16+g
] = av_clip(SCALE_ONE_POS
- SCALE_DIV_512
+ log2f(band
->threshold
), 80, 218);
1023 sce
->zeroes
[(w
+w2
)*16+g
] = 0;
1025 minq
= FFMIN(minq
, sce
->sf_idx
[(w
+w2
)*16+g
]);
1029 for (i
= 0; i
< 128; i
++) {
1030 sce
->sf_idx
[i
] = 140;
1031 //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);
1033 //set the same quantizers inside window groups
1034 for (w
= 0; w
< sce
->ics
.num_windows
; w
+= sce
->ics
.group_len
[w
])
1035 for (g
= 0; g
< sce
->ics
.num_swb
; g
++)
1036 for (w2
= 1; w2
< sce
->ics
.group_len
[w
]; w2
++)
1037 sce
->sf_idx
[(w
+w2
)*16+g
] = sce
->sf_idx
[w
*16+g
];
1040 static void search_for_ms(AACEncContext
*s
, ChannelElement
*cpe
,
1043 int start
= 0, i
, w
, w2
, g
;
1044 float M
[128], S
[128];
1045 float *L34
= s
->scoefs
, *R34
= s
->scoefs
+ 128, *M34
= s
->scoefs
+ 128*2, *S34
= s
->scoefs
+ 128*3;
1046 SingleChannelElement
*sce0
= &cpe
->ch
[0];
1047 SingleChannelElement
*sce1
= &cpe
->ch
[1];
1048 if (!cpe
->common_window
)
1050 for (w
= 0; w
< sce0
->ics
.num_windows
; w
+= sce0
->ics
.group_len
[w
]) {
1051 for (g
= 0; g
< sce0
->ics
.num_swb
; g
++) {
1052 if (!cpe
->ch
[0].zeroes
[w
*16+g
] && !cpe
->ch
[1].zeroes
[w
*16+g
]) {
1053 float dist1
= 0.0f
, dist2
= 0.0f
;
1054 for (w2
= 0; w2
< sce0
->ics
.group_len
[w
]; w2
++) {
1055 FFPsyBand
*band0
= &s
->psy
.psy_bands
[(s
->cur_channel
+0)*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
1056 FFPsyBand
*band1
= &s
->psy
.psy_bands
[(s
->cur_channel
+1)*PSY_MAX_BANDS
+(w
+w2
)*16+g
];
1057 float minthr
= FFMIN(band0
->threshold
, band1
->threshold
);
1058 float maxthr
= FFMAX(band0
->threshold
, band1
->threshold
);
1059 for (i
= 0; i
< sce0
->ics
.swb_sizes
[g
]; i
++) {
1060 M
[i
] = (sce0
->coeffs
[start
+w2
*128+i
]
1061 + sce1
->coeffs
[start
+w2
*128+i
]) * 0.5;
1063 - sce1
->coeffs
[start
+w2
*128+i
];
1065 abs_pow34_v(L34
, sce0
->coeffs
+start
+w2
*128, sce0
->ics
.swb_sizes
[g
]);
1066 abs_pow34_v(R34
, sce1
->coeffs
+start
+w2
*128, sce0
->ics
.swb_sizes
[g
]);
1067 abs_pow34_v(M34
, M
, sce0
->ics
.swb_sizes
[g
]);
1068 abs_pow34_v(S34
, S
, sce0
->ics
.swb_sizes
[g
]);
1069 dist1
+= quantize_band_cost(s
, sce0
->coeffs
+ start
+ w2
*128,
1071 sce0
->ics
.swb_sizes
[g
],
1072 sce0
->sf_idx
[(w
+w2
)*16+g
],
1073 sce0
->band_type
[(w
+w2
)*16+g
],
1074 lambda
/ band0
->threshold
, INFINITY
, NULL
);
1075 dist1
+= quantize_band_cost(s
, sce1
->coeffs
+ start
+ w2
*128,
1077 sce1
->ics
.swb_sizes
[g
],
1078 sce1
->sf_idx
[(w
+w2
)*16+g
],
1079 sce1
->band_type
[(w
+w2
)*16+g
],
1080 lambda
/ band1
->threshold
, INFINITY
, NULL
);
1081 dist2
+= quantize_band_cost(s
, M
,
1083 sce0
->ics
.swb_sizes
[g
],
1084 sce0
->sf_idx
[(w
+w2
)*16+g
],
1085 sce0
->band_type
[(w
+w2
)*16+g
],
1086 lambda
/ maxthr
, INFINITY
, NULL
);
1087 dist2
+= quantize_band_cost(s
, S
,
1089 sce1
->ics
.swb_sizes
[g
],
1090 sce1
->sf_idx
[(w
+w2
)*16+g
],
1091 sce1
->band_type
[(w
+w2
)*16+g
],
1092 lambda
/ minthr
, INFINITY
, NULL
);
1094 cpe
->ms_mask
[w
*16+g
] = dist2
< dist1
;
1096 start
+= sce0
->ics
.swb_sizes
[g
];
1101 AACCoefficientsEncoder ff_aac_coders
[] = {
1103 search_for_quantizers_faac
,
1104 encode_window_bands_info
,
1105 quantize_and_encode_band
,
1109 search_for_quantizers_anmr
,
1110 encode_window_bands_info
,
1111 quantize_and_encode_band
,
1115 search_for_quantizers_twoloop
,
1116 codebook_trellis_rate
,
1117 quantize_and_encode_band
,
1121 search_for_quantizers_fast
,
1122 encode_window_bands_info
,
1123 quantize_and_encode_band
,