FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/aacenc_pred.c
Date: 2024-04-26 14:42:52
Exec Total Coverage
Lines: 196 201 97.5%
Functions: 13 13 100.0%
Branches: 103 118 87.3%

Line Branch Exec Source
1 /*
2 * AAC encoder main-type prediction
3 * Copyright (C) 2015 Rostislav Pehlivanov
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 encoder main-type prediction
25 * @author Rostislav Pehlivanov ( atomnuker gmail com )
26 */
27
28 #include "aactab.h"
29 #include "aacenc_pred.h"
30 #include "aacenc_utils.h"
31 #include "aacenc_is.h" /* <- Needed for common window distortions */
32 #include "aacenc_quantization.h"
33
34 #define RESTORE_PRED(sce, sfb) \
35 if (sce->ics.prediction_used[sfb]) {\
36 sce->ics.prediction_used[sfb] = 0;\
37 sce->band_type[sfb] = sce->band_alt[sfb];\
38 }
39
40 531072 static inline float flt16_round(float pf)
41 {
42 union av_intfloat32 tmp;
43 531072 tmp.f = pf;
44 531072 tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U;
45 531072 return tmp.f;
46 }
47
48 1062136 static inline float flt16_even(float pf)
49 {
50 union av_intfloat32 tmp;
51 1062136 tmp.f = pf;
52 1062136 tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U;
53 1062136 return tmp.f;
54 }
55
56 3186432 static inline float flt16_trunc(float pf)
57 {
58 union av_intfloat32 pun;
59 3186432 pun.f = pf;
60 3186432 pun.i &= 0xFFFF0000U;
61 3186432 return pun.f;
62 }
63
64 531072 static inline void predict(PredictorState *ps, float *coef, float *rcoef, int set)
65 {
66 float k2;
67 531072 const float a = 0.953125; // 61.0 / 64
68 531072 const float alpha = 0.90625; // 29.0 / 32
69 531072 const float k1 = ps->k1;
70 531072 const float r0 = ps->r0, r1 = ps->r1;
71 531072 const float cor0 = ps->cor0, cor1 = ps->cor1;
72 531072 const float var0 = ps->var0, var1 = ps->var1;
73 531072 const float e0 = *coef - ps->x_est;
74 531072 const float e1 = e0 - k1 * r0;
75
76
2/2
✓ Branch 0 taken 90572 times.
✓ Branch 1 taken 440500 times.
531072 if (set)
77 90572 *coef = e0;
78
79 531072 ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1);
80 531072 ps->var1 = flt16_trunc(alpha * var1 + 0.5f * (r1 * r1 + e1 * e1));
81 531072 ps->cor0 = flt16_trunc(alpha * cor0 + r0 * e0);
82 531072 ps->var0 = flt16_trunc(alpha * var0 + 0.5f * (r0 * r0 + e0 * e0));
83 531072 ps->r1 = flt16_trunc(a * (r0 - k1 * e0));
84 531072 ps->r0 = flt16_trunc(a * e0);
85
86 /* Prediction for next frame */
87
2/2
✓ Branch 0 taken 531068 times.
✓ Branch 1 taken 4 times.
531072 ps->k1 = ps->var0 > 1 ? ps->cor0 * flt16_even(a / ps->var0) : 0;
88
2/2
✓ Branch 0 taken 531068 times.
✓ Branch 1 taken 4 times.
531072 k2 = ps->var1 > 1 ? ps->cor1 * flt16_even(a / ps->var1) : 0;
89 531072 *rcoef = ps->x_est = flt16_round(ps->k1*ps->r0 + k2*ps->r1);
90 531072 }
91
92 37349 static inline void reset_predict_state(PredictorState *ps)
93 {
94 37349 ps->r0 = 0.0f;
95 37349 ps->r1 = 0.0f;
96 37349 ps->k1 = 0.0f;
97 37349 ps->cor0 = 0.0f;
98 37349 ps->cor1 = 0.0f;
99 37349 ps->var0 = 1.0f;
100 37349 ps->var1 = 1.0f;
101 37349 ps->x_est = 0.0f;
102 37349 }
103
104 31 static inline void reset_all_predictors(PredictorState *ps)
105 {
106 int i;
107
2/2
✓ Branch 0 taken 20832 times.
✓ Branch 1 taken 31 times.
20863 for (i = 0; i < MAX_PREDICTORS; i++)
108 20832 reset_predict_state(&ps[i]);
109 31 }
110
111 735 static inline void reset_predictor_group(SingleChannelElement *sce, int group_num)
112 {
113 int i;
114 735 PredictorState *ps = sce->predictor_state;
115
2/2
✓ Branch 0 taken 16517 times.
✓ Branch 1 taken 735 times.
17252 for (i = group_num - 1; i < MAX_PREDICTORS; i += 30)
116 16517 reset_predict_state(&ps[i]);
117 735 }
118
119 832 void ff_aac_apply_main_pred(AACEncContext *s, SingleChannelElement *sce)
120 {
121 int sfb, k;
122 832 const int pmax = FFMIN(sce->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]);
123
124
2/2
✓ Branch 0 taken 803 times.
✓ Branch 1 taken 29 times.
832 if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
125
2/2
✓ Branch 0 taken 31728 times.
✓ Branch 1 taken 803 times.
32531 for (sfb = 0; sfb < pmax; sfb++) {
126
2/2
✓ Branch 0 taken 531072 times.
✓ Branch 1 taken 31728 times.
562800 for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) {
127 531072 predict(&sce->predictor_state[k], &sce->coeffs[k], &sce->prcoeffs[k],
128
4/4
✓ Branch 0 taken 185976 times.
✓ Branch 1 taken 345096 times.
✓ Branch 2 taken 90572 times.
✓ Branch 3 taken 95404 times.
531072 sce->ics.predictor_present && sce->ics.prediction_used[sfb]);
129 }
130 }
131
2/2
✓ Branch 0 taken 735 times.
✓ Branch 1 taken 68 times.
803 if (sce->ics.predictor_reset_group) {
132 735 reset_predictor_group(sce, sce->ics.predictor_reset_group);
133 }
134 } else {
135 29 reset_all_predictors(sce->predictor_state);
136 }
137 832 }
138
139 /* If inc = 0 you can check if this returns 0 to see if you can reset freely */
140 803 static inline int update_counters(IndividualChannelStream *ics, int inc)
141 {
142 int i;
143
2/2
✓ Branch 0 taken 13853 times.
✓ Branch 1 taken 420 times.
14273 for (i = 1; i < 31; i++) {
144 13853 ics->predictor_reset_count[i] += inc;
145
2/2
✓ Branch 0 taken 383 times.
✓ Branch 1 taken 13470 times.
13853 if (ics->predictor_reset_count[i] > PRED_RESET_FRAME_MIN)
146 383 return i; /* Reset this immediately */
147 }
148 420 return 0;
149 }
150
151 416 void ff_aac_adjust_common_pred(AACEncContext *s, ChannelElement *cpe)
152 {
153 416 int start, w, w2, g, i, count = 0;
154 416 SingleChannelElement *sce0 = &cpe->ch[0];
155 416 SingleChannelElement *sce1 = &cpe->ch[1];
156 416 const int pmax0 = FFMIN(sce0->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]);
157 416 const int pmax1 = FFMIN(sce1->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]);
158 416 const int pmax = FFMIN(pmax0, pmax1);
159
160
2/2
✓ Branch 0 taken 390 times.
✓ Branch 1 taken 26 times.
416 if (!cpe->common_window ||
161
2/2
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 9 times.
390 sce0->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE ||
162
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 381 times.
381 sce1->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE)
163 35 return;
164
165
2/2
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 381 times.
762 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
166 381 start = 0;
167
2/2
✓ Branch 0 taken 18669 times.
✓ Branch 1 taken 381 times.
19050 for (g = 0; g < sce0->ics.num_swb; g++) {
168 18669 int sfb = w*16+g;
169 18669 int sum = sce0->ics.prediction_used[sfb] + sce1->ics.prediction_used[sfb];
170 18669 float ener0 = 0.0f, ener1 = 0.0f, ener01 = 0.0f;
171 struct AACISError ph_err1, ph_err2, *erf;
172
6/6
✓ Branch 0 taken 14859 times.
✓ Branch 1 taken 3810 times.
✓ Branch 2 taken 11759 times.
✓ Branch 3 taken 3100 times.
✓ Branch 4 taken 9766 times.
✓ Branch 5 taken 1993 times.
18669 if (sfb < PRED_SFB_START || sfb > pmax || sum != 2) {
173
2/2
✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 14588 times.
16676 RESTORE_PRED(sce0, sfb);
174
2/2
✓ Branch 0 taken 2078 times.
✓ Branch 1 taken 14598 times.
16676 RESTORE_PRED(sce1, sfb);
175 16676 start += sce0->ics.swb_sizes[g];
176 16676 continue;
177 }
178
2/2
✓ Branch 0 taken 1993 times.
✓ Branch 1 taken 1993 times.
3986 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
179
2/2
✓ Branch 0 taken 41964 times.
✓ Branch 1 taken 1993 times.
43957 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
180 41964 float coef0 = sce0->pcoeffs[start+(w+w2)*128+i];
181 41964 float coef1 = sce1->pcoeffs[start+(w+w2)*128+i];
182 41964 ener0 += coef0*coef0;
183 41964 ener1 += coef1*coef1;
184 41964 ener01 += (coef0 + coef1)*(coef0 + coef1);
185 }
186 }
187 1993 ph_err1 = ff_aac_is_encoding_err(s, cpe, start, w, g,
188 ener0, ener1, ener01, 1, -1);
189 1993 ph_err2 = ff_aac_is_encoding_err(s, cpe, start, w, g,
190 ener0, ener1, ener01, 1, +1);
191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1993 times.
1993 erf = ph_err1.error < ph_err2.error ? &ph_err1 : &ph_err2;
192
1/2
✓ Branch 0 taken 1993 times.
✗ Branch 1 not taken.
1993 if (erf->pass) {
193 1993 sce0->ics.prediction_used[sfb] = 1;
194 1993 sce1->ics.prediction_used[sfb] = 1;
195 1993 count++;
196 } else {
197 RESTORE_PRED(sce0, sfb);
198 RESTORE_PRED(sce1, sfb);
199 }
200 1993 start += sce0->ics.swb_sizes[g];
201 }
202 }
203
204 381 sce1->ics.predictor_present = sce0->ics.predictor_present = !!count;
205 }
206
207 803 static void update_pred_resets(SingleChannelElement *sce)
208 {
209 803 int i, max_group_id_c, max_frame = 0;
210 803 float avg_frame = 0.0f;
211 803 IndividualChannelStream *ics = &sce->ics;
212
213 /* Update the counters and immediately update any frame behind schedule */
214
2/2
✓ Branch 1 taken 383 times.
✓ Branch 2 taken 420 times.
803 if ((ics->predictor_reset_group = update_counters(&sce->ics, 1)))
215 383 return;
216
217
2/2
✓ Branch 0 taken 12600 times.
✓ Branch 1 taken 420 times.
13020 for (i = 1; i < 31; i++) {
218 /* Count-based */
219
1/2
✓ Branch 0 taken 12600 times.
✗ Branch 1 not taken.
12600 if (ics->predictor_reset_count[i] > max_frame) {
220 12600 max_group_id_c = i;
221 12600 max_frame = ics->predictor_reset_count[i];
222 }
223 12600 avg_frame = (ics->predictor_reset_count[i] + avg_frame)/2;
224 }
225
226
2/2
✓ Branch 0 taken 352 times.
✓ Branch 1 taken 68 times.
420 if (max_frame > PRED_RESET_MIN) {
227 352 ics->predictor_reset_group = max_group_id_c;
228 } else {
229 68 ics->predictor_reset_group = 0;
230 }
231 }
232
233 832 void ff_aac_search_for_pred(AACEncContext *s, SingleChannelElement *sce)
234 {
235 832 int sfb, i, count = 0, cost_coeffs = 0, cost_pred = 0;
236 832 const int pmax = FFMIN(sce->ics.max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]);
237 832 float *O34 = &s->scoefs[128*0], *P34 = &s->scoefs[128*1];
238 832 float *SENT = &s->scoefs[128*2], *S34 = &s->scoefs[128*3];
239 832 float *QERR = &s->scoefs[128*4];
240
241
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 803 times.
832 if (sce->ics.window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
242 29 sce->ics.predictor_present = 0;
243 29 return;
244 }
245
246
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 801 times.
803 if (!sce->ics.predictor_initialized) {
247 2 reset_all_predictors(sce->predictor_state);
248 2 sce->ics.predictor_initialized = 1;
249 2 memcpy(sce->prcoeffs, sce->coeffs, 1024*sizeof(float));
250
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 2 times.
62 for (i = 1; i < 31; i++)
251 60 sce->ics.predictor_reset_count[i] = i;
252 }
253
254 803 update_pred_resets(sce);
255 803 memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type));
256
257
2/2
✓ Branch 0 taken 23718 times.
✓ Branch 1 taken 803 times.
24521 for (sfb = PRED_SFB_START; sfb < pmax; sfb++) {
258 int cost1, cost2, cb_p;
259 23718 float dist1, dist2, dist_spec_err = 0.0f;
260
1/2
✓ Branch 0 taken 23718 times.
✗ Branch 1 not taken.
23718 const int cb_n = sce->zeroes[sfb] ? 0 : sce->band_type[sfb];
261 23718 const int cb_min = sce->zeroes[sfb] ? 0 : 1;
262
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 23718 times.
23718 const int cb_max = sce->zeroes[sfb] ? 0 : RESERVED_BT;
263 23718 const int start_coef = sce->ics.swb_offset[sfb];
264 23718 const int num_coeffs = sce->ics.swb_offset[sfb + 1] - start_coef;
265 23718 const FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[sfb];
266
267
1/2
✓ Branch 0 taken 23718 times.
✗ Branch 1 not taken.
23718 if (start_coef + num_coeffs > MAX_PREDICTORS ||
268
3/4
✓ Branch 0 taken 11874 times.
✓ Branch 1 taken 11844 times.
✓ Branch 2 taken 11874 times.
✗ Branch 3 not taken.
23718 (s->cur_channel && sce->band_type[sfb] >= INTENSITY_BT2) ||
269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 23718 times.
23718 sce->band_type[sfb] == NOISE_BT)
270 continue;
271
272 /* Normal coefficients */
273 23718 s->aacdsp.abs_pow34(O34, &sce->coeffs[start_coef], num_coeffs);
274 23718 dist1 = ff_quantize_and_encode_band_cost(s, NULL, &sce->coeffs[start_coef], NULL,
275 O34, num_coeffs, sce->sf_idx[sfb],
276 23718 cb_n, s->lambda / band->threshold, INFINITY, &cost1, NULL);
277 23718 cost_coeffs += cost1;
278
279 /* Encoded coefficients - needed for #bits, band type and quant. error */
280
2/2
✓ Branch 0 taken 499032 times.
✓ Branch 1 taken 23718 times.
522750 for (i = 0; i < num_coeffs; i++)
281 499032 SENT[i] = sce->coeffs[start_coef + i] - sce->prcoeffs[start_coef + i];
282 23718 s->aacdsp.abs_pow34(S34, SENT, num_coeffs);
283
1/2
✓ Branch 0 taken 23718 times.
✗ Branch 1 not taken.
23718 if (cb_n < RESERVED_BT)
284 23718 cb_p = av_clip(find_min_book(find_max_val(1, num_coeffs, S34), sce->sf_idx[sfb]), cb_min, cb_max);
285 else
286 cb_p = cb_n;
287 23718 ff_quantize_and_encode_band_cost(s, NULL, SENT, QERR, S34, num_coeffs,
288 23718 sce->sf_idx[sfb], cb_p, s->lambda / band->threshold, INFINITY,
289 &cost2, NULL);
290
291 /* Reconstructed coefficients - needed for distortion measurements */
292
2/2
✓ Branch 0 taken 499032 times.
✓ Branch 1 taken 23718 times.
522750 for (i = 0; i < num_coeffs; i++)
293
2/2
✓ Branch 0 taken 121254 times.
✓ Branch 1 taken 377778 times.
499032 sce->prcoeffs[start_coef + i] += QERR[i] != 0.0f ? (sce->prcoeffs[start_coef + i] - QERR[i]) : 0.0f;
294 23718 s->aacdsp.abs_pow34(P34, &sce->prcoeffs[start_coef], num_coeffs);
295
1/2
✓ Branch 0 taken 23718 times.
✗ Branch 1 not taken.
23718 if (cb_n < RESERVED_BT)
296 23718 cb_p = av_clip(find_min_book(find_max_val(1, num_coeffs, P34), sce->sf_idx[sfb]), cb_min, cb_max);
297 else
298 cb_p = cb_n;
299 23718 dist2 = ff_quantize_and_encode_band_cost(s, NULL, &sce->prcoeffs[start_coef], NULL,
300 P34, num_coeffs, sce->sf_idx[sfb],
301 23718 cb_p, s->lambda / band->threshold, INFINITY, NULL, NULL);
302
2/2
✓ Branch 0 taken 499032 times.
✓ Branch 1 taken 23718 times.
522750 for (i = 0; i < num_coeffs; i++)
303 499032 dist_spec_err += (O34[i] - P34[i])*(O34[i] - P34[i]);
304 23718 dist_spec_err *= s->lambda / band->threshold;
305 23718 dist2 += dist_spec_err;
306
307
4/4
✓ Branch 0 taken 19383 times.
✓ Branch 1 taken 4335 times.
✓ Branch 2 taken 15236 times.
✓ Branch 3 taken 4147 times.
23718 if (dist2 <= dist1 && cb_p <= cb_n) {
308 15236 cost_pred += cost2;
309 15236 sce->ics.prediction_used[sfb] = 1;
310 15236 sce->band_alt[sfb] = cb_n;
311 15236 sce->band_type[sfb] = cb_p;
312 15236 count++;
313 } else {
314 8482 cost_pred += cost1;
315 8482 sce->band_alt[sfb] = cb_p;
316 }
317 }
318
319
4/4
✓ Branch 0 taken 796 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 356 times.
✓ Branch 3 taken 440 times.
803 if (count && cost_coeffs < cost_pred) {
320 356 count = 0;
321
2/2
✓ Branch 0 taken 10654 times.
✓ Branch 1 taken 356 times.
11010 for (sfb = PRED_SFB_START; sfb < pmax; sfb++)
322
2/2
✓ Branch 0 taken 6764 times.
✓ Branch 1 taken 3890 times.
10654 RESTORE_PRED(sce, sfb);
323 356 memset(&sce->ics.prediction_used, 0, sizeof(sce->ics.prediction_used));
324 }
325
326 803 sce->ics.predictor_present = !!count;
327 }
328
329 /**
330 * Encoder predictors data.
331 */
332 5693 void ff_aac_encode_main_pred(AACEncContext *s, SingleChannelElement *sce)
333 {
334 int sfb;
335 5693 IndividualChannelStream *ics = &sce->ics;
336 5693 const int pmax = FFMIN(ics->max_sfb, ff_aac_pred_sfb_max[s->samplerate_index]);
337
338
2/2
✓ Branch 0 taken 442 times.
✓ Branch 1 taken 5251 times.
5693 if (s->profile != AV_PROFILE_AAC_MAIN ||
339
2/2
✓ Branch 0 taken 289 times.
✓ Branch 1 taken 153 times.
442 !ics->predictor_present)
340 5540 return;
341
342 153 put_bits(&s->pb, 1, !!ics->predictor_reset_group);
343
2/2
✓ Branch 0 taken 147 times.
✓ Branch 1 taken 6 times.
153 if (ics->predictor_reset_group)
344 147 put_bits(&s->pb, 5, ics->predictor_reset_group);
345
2/2
✓ Branch 0 taken 6120 times.
✓ Branch 1 taken 153 times.
6273 for (sfb = 0; sfb < pmax; sfb++)
346 6120 put_bits(&s->pb, 1, ics->prediction_used[sfb]);
347 }
348