Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * AAC encoder utilities | ||
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 utilities | ||
25 | * @author Rostislav Pehlivanov ( atomnuker gmail com ) | ||
26 | */ | ||
27 | |||
28 | #ifndef AVCODEC_AACENC_UTILS_H | ||
29 | #define AVCODEC_AACENC_UTILS_H | ||
30 | |||
31 | #include "libavutil/ffmath.h" | ||
32 | #include "aacenc.h" | ||
33 | #include "aacenctab.h" | ||
34 | #include "aactab.h" | ||
35 | |||
36 | #define ROUND_STANDARD 0.4054f | ||
37 | #define ROUND_TO_ZERO 0.1054f | ||
38 | #define C_QUANT 0.4054f | ||
39 | |||
40 | 21014 | static inline float pos_pow34(float a) | |
41 | { | ||
42 | 21014 | return sqrtf(a * sqrtf(a)); | |
43 | } | ||
44 | |||
45 | /** | ||
46 | * Quantize one coefficient. | ||
47 | * @return absolute value of the quantized coefficient | ||
48 | * @see 3GPP TS26.403 5.6.2 "Scalefactor determination" | ||
49 | */ | ||
50 | 1750935 | static inline int quant(float coef, const float Q, const float rounding) | |
51 | { | ||
52 | 1750935 | float a = coef * Q; | |
53 | 1750935 | return sqrtf(a * sqrtf(a)) + rounding; | |
54 | } | ||
55 | |||
56 | 562656 | static inline float find_max_val(int group_len, int swb_size, const float *scaled) | |
57 | { | ||
58 | 562656 | float maxval = 0.0f; | |
59 | int w2, i; | ||
60 |
2/2✓ Branch 0 taken 572022 times.
✓ Branch 1 taken 562656 times.
|
1134678 | for (w2 = 0; w2 < group_len; w2++) { |
61 |
2/2✓ Branch 0 taken 11969844 times.
✓ Branch 1 taken 572022 times.
|
12541866 | for (i = 0; i < swb_size; i++) { |
62 |
2/2✓ Branch 0 taken 10055892 times.
✓ Branch 1 taken 1913952 times.
|
11969844 | maxval = FFMAX(maxval, scaled[w2*128+i]); |
63 | } | ||
64 | } | ||
65 | 562656 | return maxval; | |
66 | } | ||
67 | |||
68 | 14873958 | static inline int find_min_book(float maxval, int sf) | |
69 | { | ||
70 | 14873958 | float Q34 = ff_aac_pow34sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512]; | |
71 | int qmaxval, cb; | ||
72 | 14873958 | qmaxval = maxval * Q34 + C_QUANT; | |
73 |
2/2✓ Branch 0 taken 1257690 times.
✓ Branch 1 taken 13616268 times.
|
14873958 | if (qmaxval >= (FF_ARRAY_ELEMS(aac_maxval_cb))) |
74 | 1257690 | cb = 11; | |
75 | else | ||
76 | 13616268 | cb = aac_maxval_cb[qmaxval]; | |
77 | 14873958 | return cb; | |
78 | } | ||
79 | |||
80 | 60486 | static inline float find_form_factor(int group_len, int swb_size, float thresh, | |
81 | const float *scaled, float nzslope) { | ||
82 | 60486 | const float iswb_size = 1.0f / swb_size; | |
83 | 60486 | const float iswb_sizem1 = 1.0f / (swb_size - 1); | |
84 | 60486 | const float ethresh = thresh; | |
85 | 60486 | float form = 0.0f, weight = 0.0f; | |
86 | int w2, i; | ||
87 |
2/2✓ Branch 0 taken 61702 times.
✓ Branch 1 taken 60486 times.
|
122188 | for (w2 = 0; w2 < group_len; w2++) { |
88 | 61702 | float e = 0.0f, e2 = 0.0f, var = 0.0f, maxval = 0.0f; | |
89 | 61702 | float nzl = 0; | |
90 |
2/2✓ Branch 0 taken 1160656 times.
✓ Branch 1 taken 61702 times.
|
1222358 | for (i = 0; i < swb_size; i++) { |
91 | 1160656 | float s = fabsf(scaled[w2*128+i]); | |
92 |
2/2✓ Branch 0 taken 932498 times.
✓ Branch 1 taken 228158 times.
|
1160656 | maxval = FFMAX(maxval, s); |
93 | 1160656 | e += s; | |
94 | 1160656 | e2 += s *= s; | |
95 | /* We really don't want a hard non-zero-line count, since | ||
96 | * even below-threshold lines do add up towards band spectral power. | ||
97 | * So, fall steeply towards zero, but smoothly | ||
98 | */ | ||
99 |
2/2✓ Branch 0 taken 342390 times.
✓ Branch 1 taken 818266 times.
|
1160656 | if (s >= ethresh) { |
100 | 342390 | nzl += 1.0f; | |
101 | } else { | ||
102 |
2/2✓ Branch 0 taken 368121 times.
✓ Branch 1 taken 450145 times.
|
818266 | if (nzslope == 2.f) |
103 | 368121 | nzl += (s / ethresh) * (s / ethresh); | |
104 | else | ||
105 | 450145 | nzl += ff_fast_powf(s / ethresh, nzslope); | |
106 | } | ||
107 | } | ||
108 |
2/2✓ Branch 0 taken 61492 times.
✓ Branch 1 taken 210 times.
|
61702 | if (e2 > thresh) { |
109 | float frm; | ||
110 | 61492 | e *= iswb_size; | |
111 | |||
112 | /** compute variance */ | ||
113 |
2/2✓ Branch 0 taken 1159048 times.
✓ Branch 1 taken 61492 times.
|
1220540 | for (i = 0; i < swb_size; i++) { |
114 | 1159048 | float d = fabsf(scaled[w2*128+i]) - e; | |
115 | 1159048 | var += d*d; | |
116 | } | ||
117 | 61492 | var = sqrtf(var * iswb_sizem1); | |
118 | |||
119 | 61492 | e2 *= iswb_size; | |
120 |
2/2✓ Branch 0 taken 60810 times.
✓ Branch 1 taken 682 times.
|
61492 | frm = e / FFMIN(e+4*var,maxval); |
121 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 61483 times.
|
61492 | form += e2 * sqrtf(frm) / FFMAX(0.5f,nzl); |
122 | 61492 | weight += e2; | |
123 | } | ||
124 | } | ||
125 |
2/2✓ Branch 0 taken 60438 times.
✓ Branch 1 taken 48 times.
|
60486 | if (weight > 0) { |
126 | 60438 | return form / weight; | |
127 | } else { | ||
128 | 48 | return 1.0f; | |
129 | } | ||
130 | } | ||
131 | |||
132 | /** Return the minimum scalefactor where the quantized coef does not clip. */ | ||
133 | 36239 | static inline uint8_t coef2minsf(float coef) | |
134 | { | ||
135 | 36239 | return av_clip_uint8(log2f(coef)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512); | |
136 | } | ||
137 | |||
138 | /** Return the maximum scalefactor where the quantized coef is not zero. */ | ||
139 | ✗ | static inline uint8_t coef2maxsf(float coef) | |
140 | { | ||
141 | ✗ | return av_clip_uint8(log2f(coef)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512); | |
142 | } | ||
143 | |||
144 | /* | ||
145 | * Returns the closest possible index to an array of float values, given a value. | ||
146 | */ | ||
147 | 500 | static inline int quant_array_idx(const float val, const float *arr, const int num) | |
148 | { | ||
149 | 500 | int i, index = 0; | |
150 | 500 | float quant_min_err = INFINITY; | |
151 |
2/2✓ Branch 0 taken 8000 times.
✓ Branch 1 taken 500 times.
|
8500 | for (i = 0; i < num; i++) { |
152 | 8000 | float error = (val - arr[i])*(val - arr[i]); | |
153 |
2/2✓ Branch 0 taken 1009 times.
✓ Branch 1 taken 6991 times.
|
8000 | if (error < quant_min_err) { |
154 | 1009 | quant_min_err = error; | |
155 | 1009 | index = i; | |
156 | } | ||
157 | } | ||
158 | 500 | return index; | |
159 | } | ||
160 | |||
161 | /** | ||
162 | * approximates exp10f(-3.0f*(0.5f + 0.5f * cosf(FFMIN(b,15.5f) / 15.5f))) | ||
163 | */ | ||
164 | 5362 | static av_always_inline float bval2bmax(float b) | |
165 | { | ||
166 | 5362 | return 0.001f + 0.0035f * (b*b*b) / (15.5f*15.5f*15.5f); | |
167 | } | ||
168 | |||
169 | /* | ||
170 | * Compute a nextband map to be used with SF delta constraint utilities. | ||
171 | * The nextband array should contain 128 elements, and positions that don't | ||
172 | * map to valid, nonzero bands of the form w*16+g (with w being the initial | ||
173 | * window of the window group, only) are left indetermined. | ||
174 | */ | ||
175 | 3587 | static inline void ff_init_nextband_map(const SingleChannelElement *sce, uint8_t *nextband) | |
176 | { | ||
177 | 3587 | unsigned char prevband = 0; | |
178 | int w, g; | ||
179 | /** Just a safe default */ | ||
180 |
2/2✓ Branch 0 taken 459136 times.
✓ Branch 1 taken 3587 times.
|
462723 | for (g = 0; g < 128; g++) |
181 | 459136 | nextband[g] = g; | |
182 | |||
183 | /** Now really navigate the nonzero band chain */ | ||
184 |
2/2✓ Branch 0 taken 3811 times.
✓ Branch 1 taken 3587 times.
|
7398 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
185 |
2/2✓ Branch 0 taken 172647 times.
✓ Branch 1 taken 3811 times.
|
176458 | for (g = 0; g < sce->ics.num_swb; g++) { |
186 |
4/4✓ Branch 0 taken 145301 times.
✓ Branch 1 taken 27346 times.
✓ Branch 2 taken 143281 times.
✓ Branch 3 taken 2020 times.
|
172647 | if (!sce->zeroes[w*16+g] && sce->band_type[w*16+g] < RESERVED_BT) |
187 | 143281 | prevband = nextband[prevband] = w*16+g; | |
188 | } | ||
189 | } | ||
190 | 3587 | nextband[prevband] = prevband; /* terminate */ | |
191 | 3587 | } | |
192 | |||
193 | /* | ||
194 | * Updates nextband to reflect a removed band (equivalent to | ||
195 | * calling ff_init_nextband_map after marking a band as zero) | ||
196 | */ | ||
197 | static inline void ff_nextband_remove(uint8_t *nextband, int prevband, int band) | ||
198 | { | ||
199 | nextband[prevband] = nextband[band]; | ||
200 | } | ||
201 | |||
202 | /* | ||
203 | * Checks whether the specified band could be removed without inducing | ||
204 | * scalefactor delta that violates SF delta encoding constraints. | ||
205 | * prev_sf has to be the scalefactor of the previous nonzero, nonspecial | ||
206 | * band, in encoding order, or negative if there was no such band. | ||
207 | */ | ||
208 | 47931 | static inline int ff_sfdelta_can_remove_band(const SingleChannelElement *sce, | |
209 | const uint8_t *nextband, int prev_sf, int band) | ||
210 | { | ||
211 | return prev_sf >= 0 | ||
212 |
2/2✓ Branch 0 taken 47853 times.
✓ Branch 1 taken 10 times.
|
47863 | && sce->sf_idx[nextband[band]] >= (prev_sf - SCALE_MAX_DIFF) |
213 |
4/4✓ Branch 0 taken 47863 times.
✓ Branch 1 taken 68 times.
✓ Branch 2 taken 47837 times.
✓ Branch 3 taken 16 times.
|
95794 | && sce->sf_idx[nextband[band]] <= (prev_sf + SCALE_MAX_DIFF); |
214 | } | ||
215 | |||
216 | /* | ||
217 | * Checks whether the specified band's scalefactor could be replaced | ||
218 | * with another one without violating SF delta encoding constraints. | ||
219 | * prev_sf has to be the scalefactor of the previous nonzero, nonsepcial | ||
220 | * band, in encoding order, or negative if there was no such band. | ||
221 | */ | ||
222 | 6070 | static inline int ff_sfdelta_can_replace(const SingleChannelElement *sce, | |
223 | const uint8_t *nextband, int prev_sf, int new_sf, int band) | ||
224 | { | ||
225 | 6070 | return new_sf >= (prev_sf - SCALE_MAX_DIFF) | |
226 |
1/2✓ Branch 0 taken 6070 times.
✗ Branch 1 not taken.
|
6070 | && new_sf <= (prev_sf + SCALE_MAX_DIFF) |
227 |
1/2✓ Branch 0 taken 6070 times.
✗ Branch 1 not taken.
|
6070 | && sce->sf_idx[nextband[band]] >= (new_sf - SCALE_MAX_DIFF) |
228 |
2/4✓ Branch 0 taken 6070 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6070 times.
✗ Branch 3 not taken.
|
12140 | && sce->sf_idx[nextband[band]] <= (new_sf + SCALE_MAX_DIFF); |
229 | } | ||
230 | |||
231 | /** | ||
232 | * linear congruential pseudorandom number generator | ||
233 | * | ||
234 | * @param previous_val pointer to the current state of the generator | ||
235 | * | ||
236 | * @return Returns a 32-bit pseudorandom integer | ||
237 | */ | ||
238 | 904188 | static av_always_inline int lcg_random(unsigned previous_val) | |
239 | { | ||
240 | 904188 | union { unsigned u; int s; } v = { previous_val * 1664525u + 1013904223 }; | |
241 | 904188 | return v.s; | |
242 | } | ||
243 | |||
244 | #define ERROR_IF(cond, ...) \ | ||
245 | if (cond) { \ | ||
246 | av_log(avctx, AV_LOG_ERROR, __VA_ARGS__); \ | ||
247 | return AVERROR(EINVAL); \ | ||
248 | } | ||
249 | |||
250 | #define WARN_IF(cond, ...) \ | ||
251 | if (cond) { \ | ||
252 | av_log(avctx, AV_LOG_WARNING, __VA_ARGS__); \ | ||
253 | } | ||
254 | |||
255 | #endif /* AVCODEC_AACENC_UTILS_H */ | ||
256 |