FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aaccoder.c
Date: 2026-10-06 13:53:57
Exec Total Coverage
Lines: 338 447 75.6%
Functions: 16 18 88.9%
Branches: 263 366 71.9%

Line Branch Exec Source
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 <math.h> // brought forward to work around cygwin header breakage
34
35 #include <float.h>
36
37 #include "libavutil/mathematics.h"
38 #include "mathops.h"
39 #include "avcodec.h"
40 #include "put_bits.h"
41 #include "aac.h"
42 #include "aacenc.h"
43 #include "aactab.h"
44 #include "aacenctab.h"
45 #include "aacenc_utils.h"
46 #include "aacenc_quantization.h"
47
48 #include "aacenc_is.h"
49 #include "aacenc_tns.h"
50
51 #include "libavcodec/aaccoder_twoloop.h"
52
53 /* Parameter of f(x) = a*(lambda/100), defines the maximum fourier spread
54 * beyond which no PNS is used (since the SFBs contain tone rather than noise) */
55 #define NOISE_SPREAD_THRESHOLD 0.9f
56
57 /* Parameter of f(x) = a*(100/lambda), defines how much PNS is allowed to
58 * replace low energy non zero bands */
59 #define NOISE_LAMBDA_REPLACE 1.948f
60
61 #include "libavcodec/aaccoder_trellis.h"
62 #include "libavcodec/aaccoder_nmr.h"
63
64 typedef float (*quantize_and_encode_band_func)(struct AACEncContext *s, PutBitContext *pb,
65 const float *in, float *quant, const float *scaled,
66 int size, int scale_idx, int cb,
67 const float lambda, const float uplim,
68 int *bits, float *energy);
69
70 /**
71 * Calculate rate distortion cost for quantizing with given codebook
72 *
73 * @return quantization distortion
74 */
75 11763085 static av_always_inline float quantize_and_encode_band_cost_template(
76 struct AACEncContext *s,
77 PutBitContext *pb, const float *in, float *out,
78 const float *scaled, int size, int scale_idx,
79 int cb, const float lambda, const float uplim,
80 int *bits, float *energy, int BT_ZERO, int BT_UNSIGNED,
81 int BT_PAIR, int BT_ESC, int BT_NOISE, int BT_STEREO,
82 const float ROUNDING)
83 {
84 11763085 const int q_idx = POW_SF2_ZERO - scale_idx + SCALE_ONE_POS - SCALE_DIV_512;
85 11763085 const float Q = ff_aac_pow2sf_tab [q_idx];
86 11763085 const float Q34 = ff_aac_pow34sf_tab[q_idx];
87 11763085 const float IQ = ff_aac_pow2sf_tab [POW_SF2_ZERO + scale_idx - SCALE_ONE_POS + SCALE_DIV_512];
88 11763085 const float CLIPPED_ESCAPE = 165140.0f*IQ;
89 11763085 float cost = 0;
90 11763085 float qenergy = 0;
91
2/2
✓ Branch 0 taken 6798084 times.
✓ Branch 1 taken 4965001 times.
11763085 const int dim = BT_PAIR ? 2 : 4;
92 11763085 int resbits = 0;
93 int off;
94
95
6/6
✓ Branch 0 taken 10585936 times.
✓ Branch 1 taken 1177149 times.
✓ Branch 2 taken 10578986 times.
✓ Branch 3 taken 6950 times.
✓ Branch 4 taken 47228 times.
✓ Branch 5 taken 10531758 times.
11763085 if (BT_ZERO || BT_NOISE || BT_STEREO) {
96
2/2
✓ Branch 0 taken 25646100 times.
✓ Branch 1 taken 1231327 times.
26877427 for (int i = 0; i < size; i++)
97 25646100 cost += in[i]*in[i];
98
2/2
✓ Branch 0 taken 1198901 times.
✓ Branch 1 taken 32426 times.
1231327 if (bits)
99 1198901 *bits = 0;
100
2/2
✓ Branch 0 taken 1159697 times.
✓ Branch 1 taken 71630 times.
1231327 if (energy)
101 1159697 *energy = qenergy;
102
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1231327 times.
1231327 if (out) {
103 ✗ for (int i = 0; i < size; i += dim)
104 ✗ for (int j = 0; j < dim; j++)
105 ✗ out[i+j] = 0.0f;
106 }
107 1231327 return cost * lambda;
108 }
109
2/2
✓ Branch 0 taken 519170 times.
✓ Branch 1 taken 10012588 times.
10531758 if (!scaled) {
110 519170 s->aacdsp.abs_pow34(s->scoefs, in, size);
111 519170 scaled = s->scoefs;
112 }
113 10531758 s->aacdsp.quant_bands(s->qcoefs, in, scaled, size, !BT_UNSIGNED, aac_cb_maxval[cb], Q34, ROUNDING);
114
2/2
✓ Branch 0 taken 6864499 times.
✓ Branch 1 taken 3667259 times.
10531758 if (BT_UNSIGNED) {
115 6864499 off = 0;
116 } else {
117 3667259 off = aac_cb_maxval[cb];
118 }
119
2/2
✓ Branch 0 taken 77476221 times.
✓ Branch 1 taken 10531758 times.
88007979 for (int i = 0; i < size; i += dim) {
120 const float *vec;
121 77476221 int *quants = s->qcoefs + i;
122 77476221 int curidx = 0;
123 int curbits;
124 77476221 float quantized, rd = 0.0f;
125
2/2
✓ Branch 0 taken 193891332 times.
✓ Branch 1 taken 77476221 times.
271367553 for (int j = 0; j < dim; j++) {
126 193891332 curidx *= aac_cb_range[cb];
127 193891332 curidx += quants[j] + off;
128 }
129 77476221 curbits = ff_aac_spectral_bits[cb-1][curidx];
130 77476221 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim];
131
2/2
✓ Branch 0 taken 51790259 times.
✓ Branch 1 taken 25685962 times.
77476221 if (BT_UNSIGNED) {
132
2/2
✓ Branch 0 taken 120077444 times.
✓ Branch 1 taken 51790259 times.
171867703 for (int j = 0; j < dim; j++) {
133 120077444 float t = fabsf(in[i+j]);
134 float di;
135
4/4
✓ Branch 0 taken 41286660 times.
✓ Branch 1 taken 78790784 times.
✓ Branch 2 taken 20113827 times.
✓ Branch 3 taken 21172833 times.
120077444 if (BT_ESC && vec[j] == 64.0f) { //FIXME: slow
136
2/2
✓ Branch 0 taken 2092313 times.
✓ Branch 1 taken 18021514 times.
20113827 if (t >= CLIPPED_ESCAPE) {
137 2092313 quantized = CLIPPED_ESCAPE;
138 2092313 curbits += 21;
139 } else {
140 18021514 int c = av_clip_uintp2(quant(t, Q, ROUNDING), 13);
141 18021514 quantized = c*cbrtf(c)*IQ;
142 18021514 curbits += av_log2(c)*2 - 4 + 1;
143 }
144 } else {
145 99963617 quantized = vec[j]*IQ;
146 }
147 120077444 di = t - quantized;
148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 120077444 times.
120077444 if (out)
149 ✗ out[i+j] = in[i+j] >= 0 ? quantized : -quantized;
150
2/2
✓ Branch 0 taken 81753851 times.
✓ Branch 1 taken 38323593 times.
120077444 if (vec[j] != 0.0f)
151 81753851 curbits++;
152 120077444 qenergy += quantized*quantized;
153 120077444 rd += di*di;
154 }
155 } else {
156
2/2
✓ Branch 0 taken 73813888 times.
✓ Branch 1 taken 25685962 times.
99499850 for (int j = 0; j < dim; j++) {
157 73813888 quantized = vec[j]*IQ;
158 73813888 qenergy += quantized*quantized;
159
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 73813888 times.
73813888 if (out)
160 ✗ out[i+j] = quantized;
161 73813888 rd += (in[i+j] - quantized)*(in[i+j] - quantized);
162 }
163 }
164 77476221 cost += rd * lambda + curbits;
165 77476221 resbits += curbits;
166
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 77476221 times.
77476221 if (cost >= uplim)
167 ✗ return uplim;
168
2/2
✓ Branch 0 taken 3521406 times.
✓ Branch 1 taken 73954815 times.
77476221 if (pb) {
169 3521406 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]);
170
2/2
✓ Branch 0 taken 1781153 times.
✓ Branch 1 taken 1740253 times.
3521406 if (BT_UNSIGNED)
171
2/2
✓ Branch 0 taken 4875576 times.
✓ Branch 1 taken 1781153 times.
6656729 for (int j = 0; j < dim; j++)
172
2/2
✓ Branch 0 taken 3336259 times.
✓ Branch 1 taken 1539317 times.
4875576 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f)
173 3336259 put_bits(pb, 1, in[i+j] < 0.0f);
174
2/2
✓ Branch 0 taken 681990 times.
✓ Branch 1 taken 2839416 times.
3521406 if (BT_ESC) {
175
2/2
✓ Branch 0 taken 1363980 times.
✓ Branch 1 taken 681990 times.
2045970 for (int j = 0; j < 2; j++) {
176
2/2
✓ Branch 0 taken 196902 times.
✓ Branch 1 taken 1167078 times.
1363980 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) {
177 196902 int coef = av_clip(quant(fabsf(in[i+j]), Q, ROUNDING), 16, (1 << 13) - 1);
178 196902 int len = av_log2(coef);
179
180 196902 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2);
181 196902 put_sbits(pb, len, coef);
182 }
183 }
184 }
185 }
186 }
187
188
2/2
✓ Branch 0 taken 9944537 times.
✓ Branch 1 taken 587221 times.
10531758 if (bits)
189 9944537 *bits = resbits;
190
2/2
✓ Branch 0 taken 6003127 times.
✓ Branch 1 taken 4528631 times.
10531758 if (energy)
191 6003127 *energy = qenergy;
192 10531758 return cost;
193 }
194
195 ✗ static inline float quantize_and_encode_band_cost_NONE(struct AACEncContext *s, PutBitContext *pb,
196 const float *in, float *quant, const float *scaled,
197 int size, int scale_idx, int cb,
198 const float lambda, const float uplim,
199 int *bits, float *energy) {
200 ✗ av_assert0(0);
201 return 0.0f;
202 }
203
204 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE, BT_STEREO, ROUNDING) \
205 static float quantize_and_encode_band_cost_ ## NAME( \
206 struct AACEncContext *s, \
207 PutBitContext *pb, const float *in, float *quant, \
208 const float *scaled, int size, int scale_idx, \
209 int cb, const float lambda, const float uplim, \
210 int *bits, float *energy) { \
211 return quantize_and_encode_band_cost_template( \
212 s, pb, in, quant, scaled, size, scale_idx, \
213 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, energy, \
214 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE, BT_STEREO, \
215 ROUNDING); \
216 }
217
218 1177149 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO, 1, 0, 0, 0, 0, 0, ROUND_STANDARD)
219 2146224 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0, 0, 0, ROUND_STANDARD)
220 1587450 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0, 0, 0, ROUND_STANDARD)
221 1521035 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0, 0, 0, ROUND_STANDARD)
222 2513870 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0, 0, 0, ROUND_STANDARD)
223 2760691 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1, 0, 0, ROUND_STANDARD)
224 2488 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC_RTZ, 0, 1, 1, 1, 0, 0, ROUND_TO_ZERO)
225 6950 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NOISE, 0, 0, 0, 0, 1, 0, ROUND_STANDARD)
226 47228 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(STEREO,0, 0, 0, 0, 0, 1, ROUND_STANDARD)
227
228 static const quantize_and_encode_band_func quantize_and_encode_band_cost_arr[] =
229 {
230 quantize_and_encode_band_cost_ZERO,
231 quantize_and_encode_band_cost_SQUAD,
232 quantize_and_encode_band_cost_SQUAD,
233 quantize_and_encode_band_cost_UQUAD,
234 quantize_and_encode_band_cost_UQUAD,
235 quantize_and_encode_band_cost_SPAIR,
236 quantize_and_encode_band_cost_SPAIR,
237 quantize_and_encode_band_cost_UPAIR,
238 quantize_and_encode_band_cost_UPAIR,
239 quantize_and_encode_band_cost_UPAIR,
240 quantize_and_encode_band_cost_UPAIR,
241 quantize_and_encode_band_cost_ESC,
242 quantize_and_encode_band_cost_NONE, /* CB 12 doesn't exist */
243 quantize_and_encode_band_cost_NOISE,
244 quantize_and_encode_band_cost_STEREO,
245 quantize_and_encode_band_cost_STEREO,
246 };
247
248 static const quantize_and_encode_band_func quantize_and_encode_band_cost_rtz_arr[] =
249 {
250 quantize_and_encode_band_cost_ZERO,
251 quantize_and_encode_band_cost_SQUAD,
252 quantize_and_encode_band_cost_SQUAD,
253 quantize_and_encode_band_cost_UQUAD,
254 quantize_and_encode_band_cost_UQUAD,
255 quantize_and_encode_band_cost_SPAIR,
256 quantize_and_encode_band_cost_SPAIR,
257 quantize_and_encode_band_cost_UPAIR,
258 quantize_and_encode_band_cost_UPAIR,
259 quantize_and_encode_band_cost_UPAIR,
260 quantize_and_encode_band_cost_UPAIR,
261 quantize_and_encode_band_cost_ESC_RTZ,
262 quantize_and_encode_band_cost_NONE, /* CB 12 doesn't exist */
263 quantize_and_encode_band_cost_NOISE,
264 quantize_and_encode_band_cost_STEREO,
265 quantize_and_encode_band_cost_STEREO,
266 };
267
268 11216826 float ff_quantize_and_encode_band_cost(struct AACEncContext *s, PutBitContext *pb,
269 const float *in, float *quant, const float *scaled,
270 int size, int scale_idx, int cb,
271 const float lambda, const float uplim,
272 int *bits, float *energy)
273 {
274 11216826 return quantize_and_encode_band_cost_arr[cb](s, pb, in, quant, scaled, size,
275 scale_idx, cb, lambda, uplim,
276 bits, energy);
277 }
278
279 546259 static inline void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb,
280 const float *in, float *out, int size, int scale_idx,
281 int cb, const float lambda, int rtz)
282 {
283
2/2
✓ Branch 0 taken 5350 times.
✓ Branch 1 taken 540909 times.
546259 (rtz ? quantize_and_encode_band_cost_rtz_arr : quantize_and_encode_band_cost_arr)[cb](s, pb, in, out, NULL, size, scale_idx, cb,
284 lambda, INFINITY, NULL, NULL);
285 546259 }
286
287 /**
288 * structure used in optimal codebook search
289 */
290 typedef struct BandCodingPath {
291 int prev_idx; ///< pointer to the previous path point
292 float cost; ///< path cost
293 int run;
294 } BandCodingPath;
295
296 typedef struct TrellisPath {
297 float cost;
298 int prev;
299 } TrellisPath;
300
301 #define TRELLIS_STAGES 121
302 #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
303
304 11374 static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement *sce)
305 {
306 int w, g;
307 11374 int prevscaler_n = -255, prevscaler_i = 0;
308 11374 int bands = 0;
309
310
2/2
✓ Branch 0 taken 12089 times.
✓ Branch 1 taken 11374 times.
23463 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
311
2/2
✓ Branch 0 taken 541693 times.
✓ Branch 1 taken 12089 times.
553782 for (g = 0; g < sce->ics.num_swb; g++) {
312
2/2
✓ Branch 0 taken 23663 times.
✓ Branch 1 taken 518030 times.
541693 if (sce->zeroes[w*16+g])
313 23663 continue;
314
4/4
✓ Branch 0 taken 497634 times.
✓ Branch 1 taken 20396 times.
✓ Branch 2 taken 2390 times.
✓ Branch 3 taken 495244 times.
518030 if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
315 22786 sce->sf_idx[w*16+g] = av_clip(roundf(log2f(sce->is_ener[w*16+g])*2), -155, 100);
316 22786 bands++;
317
2/2
✓ Branch 0 taken 3416 times.
✓ Branch 1 taken 491828 times.
495244 } else if (sce->band_type[w*16+g] == NOISE_BT) {
318 3416 sce->sf_idx[w*16+g] = av_clip(3+ceilf(log2f(sce->pns_ener[w*16+g])*2), -100, 155);
319
2/2
✓ Branch 0 taken 842 times.
✓ Branch 1 taken 2574 times.
3416 if (prevscaler_n == -255)
320 842 prevscaler_n = sce->sf_idx[w*16+g];
321 3416 bands++;
322 }
323 }
324 }
325
326
2/2
✓ Branch 0 taken 9033 times.
✓ Branch 1 taken 2341 times.
11374 if (!bands)
327 9033 return;
328
329 /* Clip the scalefactor indices */
330
2/2
✓ Branch 0 taken 2414 times.
✓ Branch 1 taken 2341 times.
4755 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
331
2/2
✓ Branch 0 taken 114156 times.
✓ Branch 1 taken 2414 times.
116570 for (g = 0; g < sce->ics.num_swb; g++) {
332
2/2
✓ Branch 0 taken 6892 times.
✓ Branch 1 taken 107264 times.
114156 if (sce->zeroes[w*16+g])
333 6892 continue;
334
4/4
✓ Branch 0 taken 86868 times.
✓ Branch 1 taken 20396 times.
✓ Branch 2 taken 2390 times.
✓ Branch 3 taken 84478 times.
107264 if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
335 22786 sce->sf_idx[w*16+g] = prevscaler_i = av_clip(sce->sf_idx[w*16+g], prevscaler_i - SCALE_MAX_DIFF, prevscaler_i + SCALE_MAX_DIFF);
336
2/2
✓ Branch 0 taken 3416 times.
✓ Branch 1 taken 81062 times.
84478 } else if (sce->band_type[w*16+g] == NOISE_BT) {
337 3416 sce->sf_idx[w*16+g] = prevscaler_n = av_clip(sce->sf_idx[w*16+g], prevscaler_n - SCALE_MAX_DIFF, prevscaler_n + SCALE_MAX_DIFF);
338 }
339 }
340 }
341 }
342
343 7966 static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s,
344 SingleChannelElement *sce,
345 const float lambda)
346 {
347 7966 int start = 0, i, w, w2, g;
348 7966 int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->ch_layout.nb_channels * (lambda / 120.f);
349 7966 float dists[128] = { 0 }, uplims[128] = { 0 };
350 float maxvals[128];
351 int fflag, minscaler;
352 7966 int its = 0;
353 7966 int allz = 0;
354 7966 float minthr = INFINITY;
355
356 // for values above this the decoder might end up in an endless loop
357 // due to always having more bits than what can be encoded.
358 7966 destbits = FFMIN(destbits, 5800);
359 //some heuristic to determine initial quantizers will reduce search time
360 //determine zero bands and upper limits
361
2/2
✓ Branch 0 taken 8418 times.
✓ Branch 1 taken 7966 times.
16384 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
362 8418 start = 0;
363
2/2
✓ Branch 0 taken 382684 times.
✓ Branch 1 taken 8418 times.
391102 for (g = 0; g < sce->ics.num_swb; g++) {
364 382684 int nz = 0;
365 382684 float uplim = 0.0f;
366
2/2
✓ Branch 0 taken 406736 times.
✓ Branch 1 taken 382684 times.
789420 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
367 406736 FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
368 406736 uplim += band->threshold;
369
3/4
✓ Branch 0 taken 403343 times.
✓ Branch 1 taken 3393 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 403343 times.
406736 if (band->energy <= band->threshold || band->threshold == 0.0f) {
370 3393 sce->zeroes[(w+w2)*16+g] = 1;
371 3393 continue;
372 }
373 403343 nz = 1;
374 }
375 382684 uplims[w*16+g] = uplim *512;
376 382684 sce->band_type[w*16+g] = 0;
377 382684 sce->zeroes[w*16+g] = !nz;
378
2/2
✓ Branch 0 taken 379311 times.
✓ Branch 1 taken 3373 times.
382684 if (nz)
379
2/2
✓ Branch 0 taken 94427 times.
✓ Branch 1 taken 284884 times.
379311 minthr = FFMIN(minthr, uplim);
380 382684 allz |= nz;
381 382684 start += sce->ics.swb_sizes[g];
382 }
383 }
384
2/2
✓ Branch 0 taken 8418 times.
✓ Branch 1 taken 7966 times.
16384 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
385
2/2
✓ Branch 0 taken 382684 times.
✓ Branch 1 taken 8418 times.
391102 for (g = 0; g < sce->ics.num_swb; g++) {
386
2/2
✓ Branch 0 taken 3373 times.
✓ Branch 1 taken 379311 times.
382684 if (sce->zeroes[w*16+g]) {
387 3373 sce->sf_idx[w*16+g] = SCALE_ONE_POS;
388 3373 continue;
389 }
390
2/2
✓ Branch 0 taken 188225 times.
✓ Branch 1 taken 191086 times.
379311 sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59);
391 }
392 }
393
394
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 7954 times.
7966 if (!allz)
395 12 return;
396 7954 s->aacdsp.abs_pow34(s->scoefs, sce->coeffs, 1024);
397 7954 ff_quantize_band_cost_cache_init(s);
398
399
2/2
✓ Branch 0 taken 8406 times.
✓ Branch 1 taken 7954 times.
16360 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
400 8406 start = w*128;
401
2/2
✓ Branch 0 taken 382096 times.
✓ Branch 1 taken 8406 times.
390502 for (g = 0; g < sce->ics.num_swb; g++) {
402 382096 const float *scaled = s->scoefs + start;
403 382096 maxvals[w*16+g] = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled);
404 382096 start += sce->ics.swb_sizes[g];
405 }
406 }
407
408 //perform two-loop search
409 //outer loop - improve quality
410 do {
411 int tbits, qstep;
412 34641 minscaler = sce->sf_idx[0];
413 //inner loop - quantize spectrum to fit into given number of bits
414
2/2
✓ Branch 0 taken 26687 times.
✓ Branch 1 taken 7954 times.
34641 qstep = its ? 1 : 32;
415 do {
416 78062 int prev = -1;
417 78062 tbits = 0;
418
2/2
✓ Branch 0 taken 82834 times.
✓ Branch 1 taken 78062 times.
160896 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
419 82834 start = w*128;
420
2/2
✓ Branch 0 taken 3733941 times.
✓ Branch 1 taken 82834 times.
3816775 for (g = 0; g < sce->ics.num_swb; g++) {
421 3733941 const float *coefs = sce->coeffs + start;
422 3733941 const float *scaled = s->scoefs + start;
423 3733941 int bits = 0;
424 int cb;
425 3733941 float dist = 0.0f;
426
427
3/4
✓ Branch 0 taken 3693559 times.
✓ Branch 1 taken 40382 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3693559 times.
3733941 if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) {
428 40382 start += sce->ics.swb_sizes[g];
429 40382 continue;
430 }
431 3693559 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
432 3693559 cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
433
2/2
✓ Branch 0 taken 3937209 times.
✓ Branch 1 taken 3693559 times.
7630768 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
434 int b;
435 7874418 dist += quantize_band_cost_cached(s, w + w2, g,
436 3937209 coefs + w2*128,
437 3937209 scaled + w2*128,
438 3937209 sce->ics.swb_sizes[g],
439 3937209 sce->sf_idx[w*16+g],
440 cb, 1.0f, INFINITY,
441 &b, NULL, 0);
442 3937209 bits += b;
443 }
444 3693559 dists[w*16+g] = dist - bits;
445
2/2
✓ Branch 0 taken 3615497 times.
✓ Branch 1 taken 78062 times.
3693559 if (prev != -1) {
446 3615497 bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO];
447 }
448 3693559 tbits += bits;
449 3693559 start += sce->ics.swb_sizes[g];
450 3693559 prev = sce->sf_idx[w*16+g];
451 }
452 }
453
2/2
✓ Branch 0 taken 14509 times.
✓ Branch 1 taken 63553 times.
78062 if (tbits > destbits) {
454
2/2
✓ Branch 0 taken 1857152 times.
✓ Branch 1 taken 14509 times.
1871661 for (i = 0; i < 128; i++)
455
1/2
✓ Branch 0 taken 1857152 times.
✗ Branch 1 not taken.
1857152 if (sce->sf_idx[i] < 218 - qstep)
456 1857152 sce->sf_idx[i] += qstep;
457 } else {
458
2/2
✓ Branch 0 taken 8134784 times.
✓ Branch 1 taken 63553 times.
8198337 for (i = 0; i < 128; i++)
459
2/2
✓ Branch 0 taken 3283891 times.
✓ Branch 1 taken 4850893 times.
8134784 if (sce->sf_idx[i] > 60 - qstep)
460 3283891 sce->sf_idx[i] -= qstep;
461 }
462 78062 qstep >>= 1;
463
5/6
✓ Branch 0 taken 38292 times.
✓ Branch 1 taken 39770 times.
✓ Branch 2 taken 3651 times.
✓ Branch 3 taken 34641 times.
✓ Branch 4 taken 3651 times.
✗ Branch 5 not taken.
78062 if (!qstep && tbits > destbits*1.02 && sce->sf_idx[0] < 217)
464 3651 qstep = 1;
465
2/2
✓ Branch 0 taken 43421 times.
✓ Branch 1 taken 34641 times.
78062 } while (qstep);
466
467 34641 fflag = 0;
468 34641 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF);
469
470
2/2
✓ Branch 0 taken 36113 times.
✓ Branch 1 taken 34641 times.
70754 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
471
2/2
✓ Branch 0 taken 1653032 times.
✓ Branch 1 taken 36113 times.
1689145 for (g = 0; g < sce->ics.num_swb; g++) {
472 1653032 int prevsc = sce->sf_idx[w*16+g];
473
3/4
✓ Branch 0 taken 5417 times.
✓ Branch 1 taken 1647615 times.
✓ Branch 2 taken 5417 times.
✗ Branch 3 not taken.
1653032 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) {
474
2/2
✓ Branch 1 taken 5239 times.
✓ Branch 2 taken 178 times.
5417 if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1))
475 5239 sce->sf_idx[w*16+g]--;
476 else //Try to make sure there is some energy in every band
477 178 sce->sf_idx[w*16+g]-=2;
478 }
479 1653032 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF);
480 1653032 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219);
481
2/2
✓ Branch 0 taken 388376 times.
✓ Branch 1 taken 1264656 times.
1653032 if (sce->sf_idx[w*16+g] != prevsc)
482 388376 fflag = 1;
483 1653032 sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
484 }
485 }
486 34641 its++;
487
4/4
✓ Branch 0 taken 29596 times.
✓ Branch 1 taken 5045 times.
✓ Branch 2 taken 26687 times.
✓ Branch 3 taken 2909 times.
34641 } while (fflag && its < 10);
488 }
489
490 1230 static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
491 {
492 FFPsyBand *band;
493 int w, g, w2, i;
494 1230 int wlen = 1024 / sce->ics.num_windows;
495 int bandwidth, cutoff;
496 1230 float *PNS = &s->scoefs[0*128], *PNS34 = &s->scoefs[1*128];
497 1230 float *NOR34 = &s->scoefs[3*128];
498 uint8_t nextband[128];
499 1230 const float lambda = s->lambda;
500 1230 const float freq_mult = avctx->sample_rate*0.5f/wlen;
501 1230 const float thr_mult = NOISE_LAMBDA_REPLACE*(100.0f/lambda);
502
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1230 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1230 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1230 const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f));
503 1230 const float dist_bias = av_clipf(4.f * 120 / lambda, 0.25f, 4.0f);
504
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1230 times.
1230 const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f);
505
506 1230 int prev = -1000, prev_sf = -1;
507
508 /* PNS candidacy must use the coder's actual coding bandwidth (s->bandwidth,
509 * fixed at init), not a separate heuristic, or it evaluates a different band
510 * range than the coder later codes. */
511 1230 bandwidth = s->bandwidth;
512 1230 cutoff = bandwidth * 2 * wlen / avctx->sample_rate;
513
514 1230 memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type));
515 1230 ff_init_nextband_map(sce, nextband);
516
2/2
✓ Branch 0 taken 1304 times.
✓ Branch 1 taken 1230 times.
2534 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
517 1304 int wstart = w*128;
518
2/2
✓ Branch 0 taken 56428 times.
✓ Branch 1 taken 1304 times.
57732 for (g = 0; g < sce->ics.num_swb; g++) {
519 int noise_sfi;
520 56428 float dist1 = 0.0f, dist2 = 0.0f, noise_amp;
521 56428 float pns_energy = 0.0f, pns_tgt_energy, energy_ratio, dist_thresh;
522 56428 float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f;
523 56428 float min_energy = -1.0f, max_energy = 0.0f;
524 56428 const int start = wstart+sce->ics.swb_offset[g];
525 56428 const float freq = (start-wstart)*freq_mult;
526
2/2
✓ Branch 0 taken 28018 times.
✓ Branch 1 taken 28410 times.
56428 const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f);
527
4/4
✓ Branch 0 taken 29130 times.
✓ Branch 1 taken 27298 times.
✓ Branch 2 taken 2716 times.
✓ Branch 3 taken 26414 times.
56428 if (freq < NOISE_LOW_LIMIT || (start-wstart) >= cutoff) {
528
2/2
✓ Branch 0 taken 26973 times.
✓ Branch 1 taken 3041 times.
30014 if (!sce->zeroes[w*16+g])
529 26973 prev_sf = sce->sf_idx[w*16+g];
530 30014 continue;
531 }
532
2/2
✓ Branch 0 taken 28602 times.
✓ Branch 1 taken 26414 times.
55016 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
533 28602 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
534 28602 sfb_energy += band->energy;
535
2/2
✓ Branch 0 taken 27004 times.
✓ Branch 1 taken 1598 times.
28602 spread = FFMIN(spread, band->spread);
536 28602 threshold += band->threshold;
537
2/2
✓ Branch 0 taken 26414 times.
✓ Branch 1 taken 2188 times.
28602 if (!w2) {
538 26414 min_energy = max_energy = band->energy;
539 } else {
540
2/2
✓ Branch 0 taken 779 times.
✓ Branch 1 taken 1409 times.
2188 min_energy = FFMIN(min_energy, band->energy);
541
2/2
✓ Branch 0 taken 1278 times.
✓ Branch 1 taken 910 times.
2188 max_energy = FFMAX(max_energy, band->energy);
542 }
543 }
544
545 /* Ramps down at ~8000Hz and loosens the dist threshold */
546 26414 dist_thresh = av_clipf(2.5f*NOISE_LOW_LIMIT/freq, 0.5f, 2.5f) * dist_bias;
547
548 /* PNS is acceptable when all of these are true:
549 * 1. high spread energy (noise-like band)
550 * 2. near-threshold energy (high PE means the random nature of PNS content will be noticed)
551 * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS)
552 *
553 * At this stage, point 2 is relaxed for zeroed bands near the noise threshold (hole avoidance is more important)
554 */
555
3/4
✓ Branch 0 taken 26186 times.
✓ Branch 1 taken 228 times.
✓ Branch 3 taken 26186 times.
✗ Branch 4 not taken.
26414 if ((!sce->zeroes[w*16+g] && !ff_sfdelta_can_remove_band(sce, nextband, prev_sf, w*16+g)) ||
556
8/8
✓ Branch 0 taken 26186 times.
✓ Branch 1 taken 228 times.
✓ Branch 2 taken 3583 times.
✓ Branch 3 taken 22603 times.
✓ Branch 4 taken 3725 times.
✓ Branch 5 taken 86 times.
✓ Branch 6 taken 25978 times.
✓ Branch 7 taken 350 times.
26414 ((sce->zeroes[w*16+g] || !sce->band_alt[w*16+g]) && sfb_energy < threshold*sqrtf(1.0f/freq_boost)) || spread < spread_threshold ||
557
5/6
✓ Branch 0 taken 25978 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22397 times.
✓ Branch 3 taken 3581 times.
✓ Branch 4 taken 12888 times.
✓ Branch 5 taken 9509 times.
25978 (!sce->zeroes[w*16+g] && sce->band_alt[w*16+g] && sfb_energy > threshold*thr_mult*freq_boost) ||
558
2/2
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 16262 times.
16469 min_energy < pns_transient_energy_r * max_energy ) {
559 10152 sce->pns_ener[w*16+g] = sfb_energy;
560
2/2
✓ Branch 0 taken 9924 times.
✓ Branch 1 taken 228 times.
10152 if (!sce->zeroes[w*16+g])
561 9924 prev_sf = sce->sf_idx[w*16+g];
562 10152 continue;
563 }
564
565
2/2
✓ Branch 0 taken 15627 times.
✓ Branch 1 taken 635 times.
16262 pns_tgt_energy = sfb_energy*FFMIN(1.0f, spread*spread);
566 16262 noise_sfi = av_clip(roundf(log2f(pns_tgt_energy)*2), -100, 155); /* Quantize */
567 16262 noise_amp = -ff_aac_pow2sf_tab[noise_sfi + POW_SF2_ZERO]; /* Dequantize */
568
2/2
✓ Branch 0 taken 10793 times.
✓ Branch 1 taken 5469 times.
16262 if (prev != -1000) {
569 10793 int noise_sfdiff = noise_sfi - prev + SCALE_DIFF_ZERO;
570
2/4
✓ Branch 0 taken 10793 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10793 times.
10793 if (noise_sfdiff < 0 || noise_sfdiff > 2*SCALE_MAX_DIFF) {
571 ✗ if (!sce->zeroes[w*16+g])
572 ✗ prev_sf = sce->sf_idx[w*16+g];
573 ✗ continue;
574 }
575 }
576
2/2
✓ Branch 0 taken 16322 times.
✓ Branch 1 taken 16262 times.
32584 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
577 float band_energy, scale, pns_senergy;
578 16322 const int start_c = (w+w2)*128+sce->ics.swb_offset[g];
579 16322 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
580
2/2
✓ Branch 0 taken 536788 times.
✓ Branch 1 taken 16322 times.
553110 for (i = 0; i < sce->ics.swb_sizes[g]; i++) {
581 536788 s->random_state = lcg_random(s->random_state);
582 536788 PNS[i] = s->random_state;
583 }
584 16322 band_energy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
585 16322 scale = noise_amp/sqrtf(band_energy);
586 16322 s->fdsp->vector_fmul_scalar(PNS, PNS, scale, sce->ics.swb_sizes[g]);
587 16322 pns_senergy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
588 16322 pns_energy += pns_senergy;
589 16322 s->aacdsp.abs_pow34(NOR34, &sce->coeffs[start_c], sce->ics.swb_sizes[g]);
590 16322 s->aacdsp.abs_pow34(PNS34, PNS, sce->ics.swb_sizes[g]);
591 32644 dist1 += quantize_band_cost(s, &sce->coeffs[start_c],
592 NOR34,
593 16322 sce->ics.swb_sizes[g],
594 16322 sce->sf_idx[(w+w2)*16+g],
595 16322 sce->band_alt[(w+w2)*16+g],
596 16322 lambda/band->threshold, INFINITY, NULL, NULL);
597 /* Estimate rd on average as 5 bits for SF, 4 for the CB, plus spread energy * lambda/thr */
598 16322 dist2 += band->energy/(band->spread*band->spread)*lambda*dist_thresh/band->threshold;
599 }
600
3/4
✓ Branch 0 taken 16262 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2682 times.
✓ Branch 3 taken 13580 times.
16262 if (g && sce->band_type[w*16+g-1] == NOISE_BT) {
601 2682 dist2 += 5;
602 } else {
603 13580 dist2 += 9;
604 }
605 16262 energy_ratio = pns_tgt_energy/pns_energy; /* Compensates for quantization error */
606 16262 sce->pns_ener[w*16+g] = energy_ratio*pns_tgt_energy;
607
7/10
✓ Branch 0 taken 16262 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12874 times.
✓ Branch 3 taken 3388 times.
✓ Branch 4 taken 12502 times.
✓ Branch 5 taken 372 times.
✓ Branch 6 taken 12502 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 12502 times.
16262 if (sce->zeroes[w*16+g] || !sce->band_alt[w*16+g] || (energy_ratio > 0.85f && energy_ratio < 1.25f && dist2 < dist1)) {
608 3388 sce->band_type[w*16+g] = NOISE_BT;
609 3388 sce->zeroes[w*16+g] = 0;
610 3388 prev = noise_sfi;
611 } else {
612
1/2
✓ Branch 0 taken 12874 times.
✗ Branch 1 not taken.
12874 if (!sce->zeroes[w*16+g])
613 12874 prev_sf = sce->sf_idx[w*16+g];
614 }
615 }
616 }
617 1230 }
618
619 4638 static void mark_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
620 {
621 FFPsyBand *band;
622 int w, g, w2;
623 4638 int wlen = 1024 / sce->ics.num_windows;
624 int bandwidth, cutoff;
625 4638 const float lambda = s->lambda;
626 4638 const float freq_mult = avctx->sample_rate*0.5f/wlen;
627
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4638 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4638 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4638 const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f));
628
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4638 times.
4638 const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f);
629
630 /* PNS candidacy must use the coder's actual coding bandwidth (s->bandwidth,
631 * fixed at init), not a separate heuristic, or it evaluates a different band
632 * range than the coder later codes (NMR relies on this output directly). */
633 4638 bandwidth = s->bandwidth;
634 4638 cutoff = bandwidth * 2 * wlen / avctx->sample_rate;
635
636 4638 memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type));
637
2/2
✓ Branch 0 taken 4975 times.
✓ Branch 1 taken 4638 times.
9613 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
638
2/2
✓ Branch 0 taken 215437 times.
✓ Branch 1 taken 4975 times.
220412 for (g = 0; g < sce->ics.num_swb; g++) {
639 215437 float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f;
640 215437 float min_energy = -1.0f, max_energy = 0.0f;
641 215437 const int start = sce->ics.swb_offset[g];
642 215437 const float freq = start*freq_mult;
643
2/2
✓ Branch 0 taken 106314 times.
✓ Branch 1 taken 109123 times.
215437 const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f);
644
4/4
✓ Branch 0 taken 110529 times.
✓ Branch 1 taken 104908 times.
✓ Branch 2 taken 19738 times.
✓ Branch 3 taken 90791 times.
215437 if (freq < NOISE_LOW_LIMIT || start >= cutoff) {
645 124646 sce->can_pns[w*16+g] = 0;
646 124646 continue;
647 }
648
2/2
✓ Branch 0 taken 101055 times.
✓ Branch 1 taken 90791 times.
191846 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
649 101055 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
650 101055 sfb_energy += band->energy;
651
2/2
✓ Branch 0 taken 93715 times.
✓ Branch 1 taken 7340 times.
101055 spread = FFMIN(spread, band->spread);
652 101055 threshold += band->threshold;
653
2/2
✓ Branch 0 taken 90791 times.
✓ Branch 1 taken 10264 times.
101055 if (!w2) {
654 90791 min_energy = max_energy = band->energy;
655 } else {
656
2/2
✓ Branch 0 taken 3630 times.
✓ Branch 1 taken 6634 times.
10264 min_energy = FFMIN(min_energy, band->energy);
657
2/2
✓ Branch 0 taken 5743 times.
✓ Branch 1 taken 4521 times.
10264 max_energy = FFMAX(max_energy, band->energy);
658 }
659 }
660
661 /* PNS is acceptable when all of these are true:
662 * 1. high spread energy (noise-like band)
663 * 2. near-threshold energy (high PE means the random nature of PNS content will be noticed)
664 * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS)
665 */
666 90791 sce->pns_ener[w*16+g] = sfb_energy;
667 {
668 /* near-mask PNS class (E in [thr/4, 2*thr]): deletion
669 * candidates go to noise, not silence (AAC_PNSHOLE) */
670
2/2
✓ Branch 0 taken 10050 times.
✓ Branch 1 taken 80741 times.
100841 int near = sfb_energy < 2.0f * threshold &&
671
2/2
✓ Branch 0 taken 9880 times.
✓ Branch 1 taken 170 times.
10050 sfb_energy > threshold * 0.25f;
672
2/2
✓ Branch 0 taken 9880 times.
✓ Branch 1 taken 80911 times.
90791 if (near) {
673 /* deletion candidate: noise beats the ~silent rendition */
674
2/2
✓ Branch 0 taken 9748 times.
✓ Branch 1 taken 132 times.
19628 sce->can_pns[w*16+g] = spread >= spread_threshold &&
675
1/2
✓ Branch 0 taken 9748 times.
✗ Branch 1 not taken.
9748 min_energy >= 0.2f * max_energy;
676
6/6
✓ Branch 0 taken 80741 times.
✓ Branch 1 taken 170 times.
✓ Branch 2 taken 80034 times.
✓ Branch 3 taken 707 times.
✓ Branch 4 taken 3489 times.
✓ Branch 5 taken 76545 times.
80911 } else if (sfb_energy < threshold*sqrtf(1.5f/freq_boost) || spread < spread_threshold || min_energy < pns_transient_energy_r * max_energy) {
677 4366 sce->can_pns[w*16+g] = 0;
678 } else {
679 76545 sce->can_pns[w*16+g] = 1;
680 }
681 }
682 }
683 }
684 4638 }
685
686 ✗ static void search_for_ms(AACEncContext *s, ChannelElement *cpe)
687 {
688 ✗ int start = 0, i, w, w2, g, sid_sf_boost, prev_mid, prev_side;
689 uint8_t nextband0[128], nextband1[128];
690 ✗ float *M = s->scoefs + 128*0, *S = s->scoefs + 128*1;
691 ✗ float *L34 = s->scoefs + 128*2, *R34 = s->scoefs + 128*3;
692 ✗ float *M34 = s->scoefs + 128*4, *S34 = s->scoefs + 128*5;
693 ✗ const float lambda = s->lambda;
694 ✗ const float mslambda = FFMIN(1.0f, lambda / 120.f);
695 ✗ SingleChannelElement *sce0 = &cpe->ch[0];
696 ✗ SingleChannelElement *sce1 = &cpe->ch[1];
697 ✗ if (!cpe->common_window)
698 ✗ return;
699
700 /** Scout out next nonzero bands */
701 ✗ ff_init_nextband_map(sce0, nextband0);
702 ✗ ff_init_nextband_map(sce1, nextband1);
703
704 ✗ prev_mid = sce0->sf_idx[0];
705 ✗ prev_side = sce1->sf_idx[0];
706 ✗ for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
707 ✗ start = 0;
708 ✗ for (g = 0; g < sce0->ics.num_swb; g++) {
709 ✗ float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f;
710 ✗ if (!cpe->is_mask[w*16+g])
711 ✗ cpe->ms_mask[w*16+g] = 0;
712 ✗ if (!sce0->zeroes[w*16+g] && !sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g]) {
713 ✗ float Mmax = 0.0f, Smax = 0.0f;
714
715 /* Must compute mid/side SF and book for the whole window group */
716 ✗ for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
717 ✗ for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
718 ✗ M[i] = (sce0->coeffs[start+(w+w2)*128+i]
719 ✗ + sce1->coeffs[start+(w+w2)*128+i]) * 0.5;
720 ✗ S[i] = M[i]
721 ✗ - sce1->coeffs[start+(w+w2)*128+i];
722 }
723 ✗ s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]);
724 ✗ s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]);
725 ✗ for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) {
726 ✗ Mmax = FFMAX(Mmax, M34[i]);
727 ✗ Smax = FFMAX(Smax, S34[i]);
728 }
729 }
730
731 ✗ for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) {
732 ✗ float dist1 = 0.0f, dist2 = 0.0f;
733 ✗ int B0 = 0, B1 = 0;
734 int minidx;
735 int mididx, sididx;
736 int midcb, sidcb;
737
738 ✗ minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]);
739 ✗ mididx = av_clip(minidx, 0, SCALE_MAX_POS - SCALE_DIV_512);
740 ✗ sididx = av_clip(minidx - sid_sf_boost * 3, 0, SCALE_MAX_POS - SCALE_DIV_512);
741 ✗ if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT
742 ✗ && ( !ff_sfdelta_can_replace(sce0, nextband0, prev_mid, mididx, w*16+g)
743 ✗ || !ff_sfdelta_can_replace(sce1, nextband1, prev_side, sididx, w*16+g))) {
744 /* scalefactor range violation, bad stuff, will decrease quality unacceptably */
745 ✗ continue;
746 }
747
748 ✗ midcb = find_min_book(Mmax, mididx);
749 ✗ sidcb = find_min_book(Smax, sididx);
750
751 /* No CB can be zero */
752 ✗ midcb = FFMAX(1,midcb);
753 ✗ sidcb = FFMAX(1,sidcb);
754
755 ✗ for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
756 ✗ FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
757 ✗ FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
758 ✗ float minthr = FFMIN(band0->threshold, band1->threshold);
759 int b1,b2,b3,b4;
760 ✗ for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
761 ✗ M[i] = (sce0->coeffs[start+(w+w2)*128+i]
762 ✗ + sce1->coeffs[start+(w+w2)*128+i]) * 0.5;
763 ✗ S[i] = M[i]
764 ✗ - sce1->coeffs[start+(w+w2)*128+i];
765 }
766
767 ✗ s->aacdsp.abs_pow34(L34, sce0->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]);
768 ✗ s->aacdsp.abs_pow34(R34, sce1->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]);
769 ✗ s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]);
770 ✗ s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]);
771 ✗ dist1 += quantize_band_cost(s, &sce0->coeffs[start + (w+w2)*128],
772 L34,
773 ✗ sce0->ics.swb_sizes[g],
774 ✗ sce0->sf_idx[w*16+g],
775 ✗ sce0->band_type[w*16+g],
776 ✗ lambda / (band0->threshold + FLT_MIN), INFINITY, &b1, NULL);
777 ✗ dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128],
778 R34,
779 ✗ sce1->ics.swb_sizes[g],
780 ✗ sce1->sf_idx[w*16+g],
781 ✗ sce1->band_type[w*16+g],
782 ✗ lambda / (band1->threshold + FLT_MIN), INFINITY, &b2, NULL);
783 ✗ dist2 += quantize_band_cost(s, M,
784 M34,
785 ✗ sce0->ics.swb_sizes[g],
786 mididx,
787 midcb,
788 ✗ lambda / (minthr + FLT_MIN), INFINITY, &b3, NULL);
789 ✗ dist2 += quantize_band_cost(s, S,
790 S34,
791 ✗ sce1->ics.swb_sizes[g],
792 sididx,
793 sidcb,
794 ✗ mslambda / (minthr * bmax + FLT_MIN), INFINITY, &b4, NULL);
795 ✗ B0 += b1+b2;
796 ✗ B1 += b3+b4;
797 ✗ dist1 -= b1+b2;
798 ✗ dist2 -= b3+b4;
799 }
800 ✗ cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0;
801 ✗ if (cpe->ms_mask[w*16+g]) {
802 ✗ if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT) {
803 ✗ sce0->sf_idx[w*16+g] = mididx;
804 ✗ sce1->sf_idx[w*16+g] = sididx;
805 ✗ sce0->band_type[w*16+g] = midcb;
806 ✗ sce1->band_type[w*16+g] = sidcb;
807 ✗ } else if ((sce0->band_type[w*16+g] != NOISE_BT) ^ (sce1->band_type[w*16+g] != NOISE_BT)) {
808 /* ms_mask unneeded, and it confuses some decoders */
809 ✗ cpe->ms_mask[w*16+g] = 0;
810 }
811 ✗ break;
812 ✗ } else if (B1 > B0) {
813 /* More boost won't fix this */
814 ✗ break;
815 }
816 }
817 }
818 ✗ if (!sce0->zeroes[w*16+g] && sce0->band_type[w*16+g] < RESERVED_BT)
819 ✗ prev_mid = sce0->sf_idx[w*16+g];
820 ✗ if (!sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g] && sce1->band_type[w*16+g] < RESERVED_BT)
821 ✗ prev_side = sce1->sf_idx[w*16+g];
822 ✗ start += sce0->ics.swb_sizes[g];
823 }
824 }
825 }
826
827 const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = {
828 [AAC_CODER_TWOLOOP] = {
829 search_for_quantizers_twoloop,
830 codebook_trellis_rate,
831 quantize_and_encode_band,
832 ff_aac_encode_tns_info,
833 ff_aac_apply_tns,
834 set_special_band_scalefactors,
835 search_for_pns,
836 mark_pns,
837 ff_aac_search_for_tns,
838 search_for_ms,
839 ff_aac_search_for_is,
840 },
841 [AAC_CODER_FAST] = {
842 search_for_quantizers_fast,
843 codebook_trellis_rate,
844 quantize_and_encode_band,
845 ff_aac_encode_tns_info,
846 ff_aac_apply_tns,
847 set_special_band_scalefactors,
848 search_for_pns,
849 mark_pns,
850 ff_aac_search_for_tns,
851 search_for_ms,
852 ff_aac_search_for_is,
853 },
854 [AAC_CODER_NMR] = {
855 search_for_quantizers_nmr,
856 codebook_trellis_rate,
857 quantize_and_encode_band,
858 ff_aac_encode_tns_info,
859 ff_aac_apply_tns,
860 set_special_band_scalefactors,
861 NULL, /* PNS decided in the trellis (search_for_quantizers_nmr) */
862 mark_pns,
863 ff_aac_search_for_tns,
864 NULL,
865 NULL,
866 },
867 };
868