| 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 "libavutil/libm.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 | |||
| 63 | typedef float (*quantize_and_encode_band_func)(struct AACEncContext *s, PutBitContext *pb, | ||
| 64 | const float *in, float *quant, const float *scaled, | ||
| 65 | int size, int scale_idx, int cb, | ||
| 66 | const float lambda, const float uplim, | ||
| 67 | int *bits, float *energy); | ||
| 68 | |||
| 69 | /** | ||
| 70 | * Calculate rate distortion cost for quantizing with given codebook | ||
| 71 | * | ||
| 72 | * @return quantization distortion | ||
| 73 | */ | ||
| 74 | 8428927 | static av_always_inline float quantize_and_encode_band_cost_template( | |
| 75 | struct AACEncContext *s, | ||
| 76 | PutBitContext *pb, const float *in, float *out, | ||
| 77 | const float *scaled, int size, int scale_idx, | ||
| 78 | int cb, const float lambda, const float uplim, | ||
| 79 | int *bits, float *energy, int BT_ZERO, int BT_UNSIGNED, | ||
| 80 | int BT_PAIR, int BT_ESC, int BT_NOISE, int BT_STEREO, | ||
| 81 | const float ROUNDING) | ||
| 82 | { | ||
| 83 | 8428927 | const int q_idx = POW_SF2_ZERO - scale_idx + SCALE_ONE_POS - SCALE_DIV_512; | |
| 84 | 8428927 | const float Q = ff_aac_pow2sf_tab [q_idx]; | |
| 85 | 8428927 | const float Q34 = ff_aac_pow34sf_tab[q_idx]; | |
| 86 | 8428927 | const float IQ = ff_aac_pow2sf_tab [POW_SF2_ZERO + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; | |
| 87 | 8428927 | const float CLIPPED_ESCAPE = 165140.0f*IQ; | |
| 88 | 8428927 | float cost = 0; | |
| 89 | 8428927 | float qenergy = 0; | |
| 90 |
2/2✓ Branch 0 taken 4183269 times.
✓ Branch 1 taken 4245658 times.
|
8428927 | const int dim = BT_PAIR ? 2 : 4; |
| 91 | 8428927 | int resbits = 0; | |
| 92 | int off; | ||
| 93 | |||
| 94 |
6/6✓ Branch 0 taken 6902766 times.
✓ Branch 1 taken 1526161 times.
✓ Branch 2 taken 6888841 times.
✓ Branch 3 taken 13925 times.
✓ Branch 4 taken 17594 times.
✓ Branch 5 taken 6871247 times.
|
8428927 | if (BT_ZERO || BT_NOISE || BT_STEREO) { |
| 95 |
2/2✓ Branch 0 taken 35041484 times.
✓ Branch 1 taken 1557680 times.
|
36599164 | for (int i = 0; i < size; i++) |
| 96 | 35041484 | cost += in[i]*in[i]; | |
| 97 |
2/2✓ Branch 0 taken 1534270 times.
✓ Branch 1 taken 23410 times.
|
1557680 | if (bits) |
| 98 | 1534270 | *bits = 0; | |
| 99 |
2/2✓ Branch 0 taken 1506341 times.
✓ Branch 1 taken 51339 times.
|
1557680 | if (energy) |
| 100 | 1506341 | *energy = qenergy; | |
| 101 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1557680 times.
|
1557680 | if (out) { |
| 102 | ✗ | for (int i = 0; i < size; i += dim) | |
| 103 | ✗ | for (int j = 0; j < dim; j++) | |
| 104 | ✗ | out[i+j] = 0.0f; | |
| 105 | } | ||
| 106 | 1557680 | return cost * lambda; | |
| 107 | } | ||
| 108 |
2/2✓ Branch 0 taken 427598 times.
✓ Branch 1 taken 6443649 times.
|
6871247 | if (!scaled) { |
| 109 | 427598 | s->aacdsp.abs_pow34(s->scoefs, in, size); | |
| 110 | 427598 | scaled = s->scoefs; | |
| 111 | } | ||
| 112 | 6871247 | s->aacdsp.quant_bands(s->qcoefs, in, scaled, size, !BT_UNSIGNED, aac_cb_maxval[cb], Q34, ROUNDING); | |
| 113 |
2/2✓ Branch 0 taken 4257903 times.
✓ Branch 1 taken 2613344 times.
|
6871247 | if (BT_UNSIGNED) { |
| 114 | 4257903 | off = 0; | |
| 115 | } else { | ||
| 116 | 2613344 | off = aac_cb_maxval[cb]; | |
| 117 | } | ||
| 118 |
2/2✓ Branch 0 taken 54772873 times.
✓ Branch 1 taken 6871247 times.
|
61644120 | for (int i = 0; i < size; i += dim) { |
| 119 | const float *vec; | ||
| 120 | 54772873 | int *quants = s->qcoefs + i; | |
| 121 | 54772873 | int curidx = 0; | |
| 122 | int curbits; | ||
| 123 | 54772873 | float quantized, rd = 0.0f; | |
| 124 |
2/2✓ Branch 0 taken 140781936 times.
✓ Branch 1 taken 54772873 times.
|
195554809 | for (int j = 0; j < dim; j++) { |
| 125 | 140781936 | curidx *= aac_cb_range[cb]; | |
| 126 | 140781936 | curidx += quants[j] + off; | |
| 127 | } | ||
| 128 | 54772873 | curbits = ff_aac_spectral_bits[cb-1][curidx]; | |
| 129 | 54772873 | vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | |
| 130 |
2/2✓ Branch 0 taken 34737395 times.
✓ Branch 1 taken 20035478 times.
|
54772873 | if (BT_UNSIGNED) { |
| 131 |
2/2✓ Branch 0 taken 82861080 times.
✓ Branch 1 taken 34737395 times.
|
117598475 | for (int j = 0; j < dim; j++) { |
| 132 | 82861080 | float t = fabsf(in[i+j]); | |
| 133 | float di; | ||
| 134 |
4/4✓ Branch 0 taken 14839016 times.
✓ Branch 1 taken 68022064 times.
✓ Branch 2 taken 1594046 times.
✓ Branch 3 taken 13244970 times.
|
82861080 | if (BT_ESC && vec[j] == 64.0f) { //FIXME: slow |
| 135 |
2/2✓ Branch 0 taken 113 times.
✓ Branch 1 taken 1593933 times.
|
1594046 | if (t >= CLIPPED_ESCAPE) { |
| 136 | 113 | quantized = CLIPPED_ESCAPE; | |
| 137 | 113 | curbits += 21; | |
| 138 | } else { | ||
| 139 | 1593933 | int c = av_clip_uintp2(quant(t, Q, ROUNDING), 13); | |
| 140 | 1593933 | quantized = c*cbrtf(c)*IQ; | |
| 141 | 1593933 | curbits += av_log2(c)*2 - 4 + 1; | |
| 142 | } | ||
| 143 | } else { | ||
| 144 | 81267034 | quantized = vec[j]*IQ; | |
| 145 | } | ||
| 146 | 82861080 | di = t - quantized; | |
| 147 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 82861080 times.
|
82861080 | if (out) |
| 148 | ✗ | out[i+j] = in[i+j] >= 0 ? quantized : -quantized; | |
| 149 |
2/2✓ Branch 0 taken 49512054 times.
✓ Branch 1 taken 33349026 times.
|
82861080 | if (vec[j] != 0.0f) |
| 150 | 49512054 | curbits++; | |
| 151 | 82861080 | qenergy += quantized*quantized; | |
| 152 | 82861080 | rd += di*di; | |
| 153 | } | ||
| 154 | } else { | ||
| 155 |
2/2✓ Branch 0 taken 57920856 times.
✓ Branch 1 taken 20035478 times.
|
77956334 | for (int j = 0; j < dim; j++) { |
| 156 | 57920856 | quantized = vec[j]*IQ; | |
| 157 | 57920856 | qenergy += quantized*quantized; | |
| 158 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 57920856 times.
|
57920856 | if (out) |
| 159 | ✗ | out[i+j] = quantized; | |
| 160 | 57920856 | rd += (in[i+j] - quantized)*(in[i+j] - quantized); | |
| 161 | } | ||
| 162 | } | ||
| 163 | 54772873 | cost += rd * lambda + curbits; | |
| 164 | 54772873 | resbits += curbits; | |
| 165 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 54772873 times.
|
54772873 | if (cost >= uplim) |
| 166 | ✗ | return uplim; | |
| 167 |
2/2✓ Branch 0 taken 3138950 times.
✓ Branch 1 taken 51633923 times.
|
54772873 | if (pb) { |
| 168 | 3138950 | put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]); | |
| 169 |
2/2✓ Branch 0 taken 1674942 times.
✓ Branch 1 taken 1464008 times.
|
3138950 | if (BT_UNSIGNED) |
| 170 |
2/2✓ Branch 0 taken 4375000 times.
✓ Branch 1 taken 1674942 times.
|
6049942 | for (int j = 0; j < dim; j++) |
| 171 |
2/2✓ Branch 0 taken 3087084 times.
✓ Branch 1 taken 1287916 times.
|
4375000 | if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f) |
| 172 | 3087084 | put_bits(pb, 1, in[i+j] < 0.0f); | |
| 173 |
2/2✓ Branch 0 taken 443948 times.
✓ Branch 1 taken 2695002 times.
|
3138950 | if (BT_ESC) { |
| 174 |
2/2✓ Branch 0 taken 887896 times.
✓ Branch 1 taken 443948 times.
|
1331844 | for (int j = 0; j < 2; j++) { |
| 175 |
2/2✓ Branch 0 taken 128743 times.
✓ Branch 1 taken 759153 times.
|
887896 | if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) { |
| 176 | 128743 | int coef = av_clip(quant(fabsf(in[i+j]), Q, ROUNDING), 16, (1 << 13) - 1); | |
| 177 | 128743 | int len = av_log2(coef); | |
| 178 | |||
| 179 | 128743 | put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); | |
| 180 | 128743 | put_sbits(pb, len, coef); | |
| 181 | } | ||
| 182 | } | ||
| 183 | } | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 |
2/2✓ Branch 0 taken 6372095 times.
✓ Branch 1 taken 499152 times.
|
6871247 | if (bits) |
| 188 | 6372095 | *bits = resbits; | |
| 189 |
2/2✓ Branch 0 taken 3176539 times.
✓ Branch 1 taken 3694708 times.
|
6871247 | if (energy) |
| 190 | 3176539 | *energy = qenergy; | |
| 191 | 6871247 | return cost; | |
| 192 | } | ||
| 193 | |||
| 194 | ✗ | static inline float quantize_and_encode_band_cost_NONE(struct AACEncContext *s, PutBitContext *pb, | |
| 195 | const float *in, float *quant, const float *scaled, | ||
| 196 | int size, int scale_idx, int cb, | ||
| 197 | const float lambda, const float uplim, | ||
| 198 | int *bits, float *energy) { | ||
| 199 | ✗ | av_assert0(0); | |
| 200 | return 0.0f; | ||
| 201 | } | ||
| 202 | |||
| 203 | #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE, BT_STEREO, ROUNDING) \ | ||
| 204 | static float quantize_and_encode_band_cost_ ## NAME( \ | ||
| 205 | struct AACEncContext *s, \ | ||
| 206 | PutBitContext *pb, const float *in, float *quant, \ | ||
| 207 | const float *scaled, int size, int scale_idx, \ | ||
| 208 | int cb, const float lambda, const float uplim, \ | ||
| 209 | int *bits, float *energy) { \ | ||
| 210 | return quantize_and_encode_band_cost_template( \ | ||
| 211 | s, pb, in, quant, scaled, size, scale_idx, \ | ||
| 212 | BT_ESC ? ESC_BT : cb, lambda, uplim, bits, energy, \ | ||
| 213 | BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC, BT_NOISE, BT_STEREO, \ | ||
| 214 | ROUNDING); \ | ||
| 215 | } | ||
| 216 | |||
| 217 | 1526161 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO, 1, 0, 0, 0, 0, 0, ROUND_STANDARD) | |
| 218 | 1489780 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0, 0, 0, ROUND_STANDARD) | |
| 219 | 1198198 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0, 0, 0, ROUND_STANDARD) | |
| 220 | 1123564 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0, 0, 0, ROUND_STANDARD) | |
| 221 | 2105364 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0, 0, 0, ROUND_STANDARD) | |
| 222 | 949423 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1, 0, 0, ROUND_STANDARD) | |
| 223 | 4918 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC_RTZ, 0, 1, 1, 1, 0, 0, ROUND_TO_ZERO) | |
| 224 | 13925 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NOISE, 0, 0, 0, 0, 1, 0, ROUND_STANDARD) | |
| 225 | 17594 | QUANTIZE_AND_ENCODE_BAND_COST_FUNC(STEREO,0, 0, 0, 0, 0, 1, ROUND_STANDARD) | |
| 226 | |||
| 227 | static const quantize_and_encode_band_func quantize_and_encode_band_cost_arr[] = | ||
| 228 | { | ||
| 229 | quantize_and_encode_band_cost_ZERO, | ||
| 230 | quantize_and_encode_band_cost_SQUAD, | ||
| 231 | quantize_and_encode_band_cost_SQUAD, | ||
| 232 | quantize_and_encode_band_cost_UQUAD, | ||
| 233 | quantize_and_encode_band_cost_UQUAD, | ||
| 234 | quantize_and_encode_band_cost_SPAIR, | ||
| 235 | quantize_and_encode_band_cost_SPAIR, | ||
| 236 | quantize_and_encode_band_cost_UPAIR, | ||
| 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_ESC, | ||
| 241 | quantize_and_encode_band_cost_NONE, /* CB 12 doesn't exist */ | ||
| 242 | quantize_and_encode_band_cost_NOISE, | ||
| 243 | quantize_and_encode_band_cost_STEREO, | ||
| 244 | quantize_and_encode_band_cost_STEREO, | ||
| 245 | }; | ||
| 246 | |||
| 247 | static const quantize_and_encode_band_func quantize_and_encode_band_cost_rtz_arr[] = | ||
| 248 | { | ||
| 249 | quantize_and_encode_band_cost_ZERO, | ||
| 250 | quantize_and_encode_band_cost_SQUAD, | ||
| 251 | quantize_and_encode_band_cost_SQUAD, | ||
| 252 | quantize_and_encode_band_cost_UQUAD, | ||
| 253 | quantize_and_encode_band_cost_UQUAD, | ||
| 254 | quantize_and_encode_band_cost_SPAIR, | ||
| 255 | quantize_and_encode_band_cost_SPAIR, | ||
| 256 | quantize_and_encode_band_cost_UPAIR, | ||
| 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_ESC_RTZ, | ||
| 261 | quantize_and_encode_band_cost_NONE, /* CB 12 doesn't exist */ | ||
| 262 | quantize_and_encode_band_cost_NOISE, | ||
| 263 | quantize_and_encode_band_cost_STEREO, | ||
| 264 | quantize_and_encode_band_cost_STEREO, | ||
| 265 | }; | ||
| 266 | |||
| 267 | 7985929 | float ff_quantize_and_encode_band_cost(struct AACEncContext *s, PutBitContext *pb, | |
| 268 | const float *in, float *quant, const float *scaled, | ||
| 269 | int size, int scale_idx, int cb, | ||
| 270 | const float lambda, const float uplim, | ||
| 271 | int *bits, float *energy) | ||
| 272 | { | ||
| 273 | 7985929 | return quantize_and_encode_band_cost_arr[cb](s, pb, in, quant, scaled, size, | |
| 274 | scale_idx, cb, lambda, uplim, | ||
| 275 | bits, energy); | ||
| 276 | } | ||
| 277 | |||
| 278 | 442998 | static inline void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, | |
| 279 | const float *in, float *out, int size, int scale_idx, | ||
| 280 | int cb, const float lambda, int rtz) | ||
| 281 | { | ||
| 282 |
2/2✓ Branch 0 taken 15864 times.
✓ Branch 1 taken 427134 times.
|
442998 | (rtz ? quantize_and_encode_band_cost_rtz_arr : quantize_and_encode_band_cost_arr)[cb](s, pb, in, out, NULL, size, scale_idx, cb, |
| 283 | lambda, INFINITY, NULL, NULL); | ||
| 284 | 442998 | } | |
| 285 | |||
| 286 | /** | ||
| 287 | * structure used in optimal codebook search | ||
| 288 | */ | ||
| 289 | typedef struct BandCodingPath { | ||
| 290 | int prev_idx; ///< pointer to the previous path point | ||
| 291 | float cost; ///< path cost | ||
| 292 | int run; | ||
| 293 | } BandCodingPath; | ||
| 294 | |||
| 295 | typedef struct TrellisPath { | ||
| 296 | float cost; | ||
| 297 | int prev; | ||
| 298 | } TrellisPath; | ||
| 299 | |||
| 300 | #define TRELLIS_STAGES 121 | ||
| 301 | #define TRELLIS_STATES (SCALE_MAX_DIFF+1) | ||
| 302 | |||
| 303 | 9375 | static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement *sce) | |
| 304 | { | ||
| 305 | int w, g; | ||
| 306 | 9375 | int prevscaler_n = -255, prevscaler_i = 0; | |
| 307 | 9375 | int bands = 0; | |
| 308 | |||
| 309 |
2/2✓ Branch 0 taken 9860 times.
✓ Branch 1 taken 9375 times.
|
19235 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 310 |
2/2✓ Branch 0 taken 456188 times.
✓ Branch 1 taken 9860 times.
|
466048 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 311 |
2/2✓ Branch 0 taken 12895 times.
✓ Branch 1 taken 443293 times.
|
456188 | if (sce->zeroes[w*16+g]) |
| 312 | 12895 | continue; | |
| 313 |
4/4✓ Branch 0 taken 436806 times.
✓ Branch 1 taken 6487 times.
✓ Branch 2 taken 2198 times.
✓ Branch 3 taken 434608 times.
|
443293 | if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) { |
| 314 | 8685 | sce->sf_idx[w*16+g] = av_clip(roundf(log2f(sce->is_ener[w*16+g])*2), -155, 100); | |
| 315 | 8685 | bands++; | |
| 316 |
2/2✓ Branch 0 taken 6576 times.
✓ Branch 1 taken 428032 times.
|
434608 | } else if (sce->band_type[w*16+g] == NOISE_BT) { |
| 317 | 6576 | sce->sf_idx[w*16+g] = av_clip(3+ceilf(log2f(sce->pns_ener[w*16+g])*2), -100, 155); | |
| 318 |
2/2✓ Branch 0 taken 1151 times.
✓ Branch 1 taken 5425 times.
|
6576 | if (prevscaler_n == -255) |
| 319 | 1151 | prevscaler_n = sce->sf_idx[w*16+g]; | |
| 320 | 6576 | bands++; | |
| 321 | } | ||
| 322 | } | ||
| 323 | } | ||
| 324 | |||
| 325 |
2/2✓ Branch 0 taken 7774 times.
✓ Branch 1 taken 1601 times.
|
9375 | if (!bands) |
| 326 | 7774 | return; | |
| 327 | |||
| 328 | /* Clip the scalefactor indices */ | ||
| 329 |
2/2✓ Branch 0 taken 1662 times.
✓ Branch 1 taken 1601 times.
|
3263 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 330 |
2/2✓ Branch 0 taken 78568 times.
✓ Branch 1 taken 1662 times.
|
80230 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 331 |
2/2✓ Branch 0 taken 5315 times.
✓ Branch 1 taken 73253 times.
|
78568 | if (sce->zeroes[w*16+g]) |
| 332 | 5315 | continue; | |
| 333 |
4/4✓ Branch 0 taken 66766 times.
✓ Branch 1 taken 6487 times.
✓ Branch 2 taken 2198 times.
✓ Branch 3 taken 64568 times.
|
73253 | if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) { |
| 334 | 8685 | 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); | |
| 335 |
2/2✓ Branch 0 taken 6576 times.
✓ Branch 1 taken 57992 times.
|
64568 | } else if (sce->band_type[w*16+g] == NOISE_BT) { |
| 336 | 6576 | 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); | |
| 337 | } | ||
| 338 | } | ||
| 339 | } | ||
| 340 | } | ||
| 341 | |||
| 342 | 8638 | static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, | |
| 343 | SingleChannelElement *sce, | ||
| 344 | const float lambda) | ||
| 345 | { | ||
| 346 | 8638 | int start = 0, i, w, w2, g; | |
| 347 | 8638 | int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->ch_layout.nb_channels * (lambda / 120.f); | |
| 348 | 8638 | float dists[128] = { 0 }, uplims[128] = { 0 }; | |
| 349 | float maxvals[128]; | ||
| 350 | int fflag, minscaler; | ||
| 351 | 8638 | int its = 0; | |
| 352 | 8638 | int allz = 0; | |
| 353 | 8638 | float minthr = INFINITY; | |
| 354 | |||
| 355 | // for values above this the decoder might end up in an endless loop | ||
| 356 | // due to always having more bits than what can be encoded. | ||
| 357 | 8638 | destbits = FFMIN(destbits, 5800); | |
| 358 | //some heuristic to determine initial quantizers will reduce search time | ||
| 359 | //determine zero bands and upper limits | ||
| 360 |
2/2✓ Branch 0 taken 9089 times.
✓ Branch 1 taken 8638 times.
|
17727 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 361 | 9089 | start = 0; | |
| 362 |
2/2✓ Branch 0 taken 420019 times.
✓ Branch 1 taken 9089 times.
|
429108 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 363 | 420019 | int nz = 0; | |
| 364 | 420019 | float uplim = 0.0f; | |
| 365 |
2/2✓ Branch 0 taken 431835 times.
✓ Branch 1 taken 420019 times.
|
851854 | for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 366 | 431835 | FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; | |
| 367 | 431835 | uplim += band->threshold; | |
| 368 |
3/4✓ Branch 0 taken 419688 times.
✓ Branch 1 taken 12147 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 419688 times.
|
431835 | if (band->energy <= band->threshold || band->threshold == 0.0f) { |
| 369 | 12147 | sce->zeroes[(w+w2)*16+g] = 1; | |
| 370 | 12147 | continue; | |
| 371 | } | ||
| 372 | 419688 | nz = 1; | |
| 373 | } | ||
| 374 | 420019 | uplims[w*16+g] = uplim *512; | |
| 375 | 420019 | sce->band_type[w*16+g] = 0; | |
| 376 | 420019 | sce->zeroes[w*16+g] = !nz; | |
| 377 |
2/2✓ Branch 0 taken 413140 times.
✓ Branch 1 taken 6879 times.
|
420019 | if (nz) |
| 378 |
2/2✓ Branch 0 taken 92639 times.
✓ Branch 1 taken 320501 times.
|
413140 | minthr = FFMIN(minthr, uplim); |
| 379 | 420019 | allz |= nz; | |
| 380 | 420019 | start += sce->ics.swb_sizes[g]; | |
| 381 | } | ||
| 382 | } | ||
| 383 |
2/2✓ Branch 0 taken 9089 times.
✓ Branch 1 taken 8638 times.
|
17727 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 384 |
2/2✓ Branch 0 taken 420019 times.
✓ Branch 1 taken 9089 times.
|
429108 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 385 |
2/2✓ Branch 0 taken 6879 times.
✓ Branch 1 taken 413140 times.
|
420019 | if (sce->zeroes[w*16+g]) { |
| 386 | 6879 | sce->sf_idx[w*16+g] = SCALE_ONE_POS; | |
| 387 | 6879 | continue; | |
| 388 | } | ||
| 389 |
2/2✓ Branch 0 taken 178843 times.
✓ Branch 1 taken 234297 times.
|
413140 | sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59); |
| 390 | } | ||
| 391 | } | ||
| 392 | |||
| 393 |
2/2✓ Branch 0 taken 78 times.
✓ Branch 1 taken 8560 times.
|
8638 | if (!allz) |
| 394 | 78 | return; | |
| 395 | 8560 | s->aacdsp.abs_pow34(s->scoefs, sce->coeffs, 1024); | |
| 396 | 8560 | ff_quantize_band_cost_cache_init(s); | |
| 397 | |||
| 398 |
2/2✓ Branch 0 taken 8867 times.
✓ Branch 1 taken 8560 times.
|
17427 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 399 | 8867 | start = w*128; | |
| 400 |
2/2✓ Branch 0 taken 416701 times.
✓ Branch 1 taken 8867 times.
|
425568 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 401 | 416701 | const float *scaled = s->scoefs + start; | |
| 402 | 416701 | maxvals[w*16+g] = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled); | |
| 403 | 416701 | start += sce->ics.swb_sizes[g]; | |
| 404 | } | ||
| 405 | } | ||
| 406 | |||
| 407 | //perform two-loop search | ||
| 408 | //outer loop - improve quality | ||
| 409 | do { | ||
| 410 | int tbits, qstep; | ||
| 411 | 36215 | minscaler = sce->sf_idx[0]; | |
| 412 | //inner loop - quantize spectrum to fit into given number of bits | ||
| 413 |
2/2✓ Branch 0 taken 27655 times.
✓ Branch 1 taken 8560 times.
|
36215 | qstep = its ? 1 : 32; |
| 414 | do { | ||
| 415 | 82989 | int prev = -1; | |
| 416 | 82989 | tbits = 0; | |
| 417 |
2/2✓ Branch 0 taken 88155 times.
✓ Branch 1 taken 82989 times.
|
171144 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 418 | 88155 | start = w*128; | |
| 419 |
2/2✓ Branch 0 taken 4026265 times.
✓ Branch 1 taken 88155 times.
|
4114420 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 420 | 4026265 | const float *coefs = sce->coeffs + start; | |
| 421 | 4026265 | const float *scaled = s->scoefs + start; | |
| 422 | 4026265 | int bits = 0; | |
| 423 | int cb; | ||
| 424 | 4026265 | float dist = 0.0f; | |
| 425 | |||
| 426 |
3/4✓ Branch 0 taken 3973707 times.
✓ Branch 1 taken 52558 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3973707 times.
|
4026265 | if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) { |
| 427 | 52558 | start += sce->ics.swb_sizes[g]; | |
| 428 | 52558 | continue; | |
| 429 | } | ||
| 430 | 3973707 | minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); | |
| 431 | 3973707 | cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); | |
| 432 |
2/2✓ Branch 0 taken 4084455 times.
✓ Branch 1 taken 3973707 times.
|
8058162 | for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 433 | int b; | ||
| 434 | 8168910 | dist += quantize_band_cost_cached(s, w + w2, g, | |
| 435 | 4084455 | coefs + w2*128, | |
| 436 | 4084455 | scaled + w2*128, | |
| 437 | 4084455 | sce->ics.swb_sizes[g], | |
| 438 | 4084455 | sce->sf_idx[w*16+g], | |
| 439 | cb, 1.0f, INFINITY, | ||
| 440 | &b, NULL, 0); | ||
| 441 | 4084455 | bits += b; | |
| 442 | } | ||
| 443 | 3973707 | dists[w*16+g] = dist - bits; | |
| 444 |
2/2✓ Branch 0 taken 3890718 times.
✓ Branch 1 taken 82989 times.
|
3973707 | if (prev != -1) { |
| 445 | 3890718 | bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO]; | |
| 446 | } | ||
| 447 | 3973707 | tbits += bits; | |
| 448 | 3973707 | start += sce->ics.swb_sizes[g]; | |
| 449 | 3973707 | prev = sce->sf_idx[w*16+g]; | |
| 450 | } | ||
| 451 | } | ||
| 452 |
2/2✓ Branch 0 taken 16093 times.
✓ Branch 1 taken 66896 times.
|
82989 | if (tbits > destbits) { |
| 453 |
2/2✓ Branch 0 taken 2059904 times.
✓ Branch 1 taken 16093 times.
|
2075997 | for (i = 0; i < 128; i++) |
| 454 |
1/2✓ Branch 0 taken 2059904 times.
✗ Branch 1 not taken.
|
2059904 | if (sce->sf_idx[i] < 218 - qstep) |
| 455 | 2059904 | sce->sf_idx[i] += qstep; | |
| 456 | } else { | ||
| 457 |
2/2✓ Branch 0 taken 8562688 times.
✓ Branch 1 taken 66896 times.
|
8629584 | for (i = 0; i < 128; i++) |
| 458 |
2/2✓ Branch 0 taken 3451723 times.
✓ Branch 1 taken 5110965 times.
|
8562688 | if (sce->sf_idx[i] > 60 - qstep) |
| 459 | 3451723 | sce->sf_idx[i] -= qstep; | |
| 460 | } | ||
| 461 | 82989 | qstep >>= 1; | |
| 462 |
5/6✓ Branch 0 taken 40189 times.
✓ Branch 1 taken 42800 times.
✓ Branch 2 taken 3974 times.
✓ Branch 3 taken 36215 times.
✓ Branch 4 taken 3974 times.
✗ Branch 5 not taken.
|
82989 | if (!qstep && tbits > destbits*1.02 && sce->sf_idx[0] < 217) |
| 463 | 3974 | qstep = 1; | |
| 464 |
2/2✓ Branch 0 taken 46774 times.
✓ Branch 1 taken 36215 times.
|
82989 | } while (qstep); |
| 465 | |||
| 466 | 36215 | fflag = 0; | |
| 467 | 36215 | minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); | |
| 468 | |||
| 469 |
2/2✓ Branch 0 taken 38321 times.
✓ Branch 1 taken 36215 times.
|
74536 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 470 |
2/2✓ Branch 0 taken 1746179 times.
✓ Branch 1 taken 38321 times.
|
1784500 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 471 | 1746179 | int prevsc = sce->sf_idx[w*16+g]; | |
| 472 |
3/4✓ Branch 0 taken 11507 times.
✓ Branch 1 taken 1734672 times.
✓ Branch 2 taken 11507 times.
✗ Branch 3 not taken.
|
1746179 | if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) { |
| 473 |
2/2✓ Branch 1 taken 10953 times.
✓ Branch 2 taken 554 times.
|
11507 | if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1)) |
| 474 | 10953 | sce->sf_idx[w*16+g]--; | |
| 475 | else //Try to make sure there is some energy in every band | ||
| 476 | 554 | sce->sf_idx[w*16+g]-=2; | |
| 477 | } | ||
| 478 | 1746179 | sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF); | |
| 479 | 1746179 | sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219); | |
| 480 |
2/2✓ Branch 0 taken 507224 times.
✓ Branch 1 taken 1238955 times.
|
1746179 | if (sce->sf_idx[w*16+g] != prevsc) |
| 481 | 507224 | fflag = 1; | |
| 482 | 1746179 | sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); | |
| 483 | } | ||
| 484 | } | ||
| 485 | 36215 | its++; | |
| 486 |
4/4✓ Branch 0 taken 30625 times.
✓ Branch 1 taken 5590 times.
✓ Branch 2 taken 27655 times.
✓ Branch 3 taken 2970 times.
|
36215 | } while (fflag && its < 10); |
| 487 | } | ||
| 488 | |||
| 489 | 1971 | static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce) | |
| 490 | { | ||
| 491 | FFPsyBand *band; | ||
| 492 | int w, g, w2, i; | ||
| 493 | 1971 | int wlen = 1024 / sce->ics.num_windows; | |
| 494 | int bandwidth, cutoff; | ||
| 495 | 1971 | float *PNS = &s->scoefs[0*128], *PNS34 = &s->scoefs[1*128]; | |
| 496 | 1971 | float *NOR34 = &s->scoefs[3*128]; | |
| 497 | uint8_t nextband[128]; | ||
| 498 | 1971 | const float lambda = s->lambda; | |
| 499 | 1971 | const float freq_mult = avctx->sample_rate*0.5f/wlen; | |
| 500 | 1971 | const float thr_mult = NOISE_LAMBDA_REPLACE*(100.0f/lambda); | |
| 501 |
2/6✗ Branch 0 not taken.
✓ Branch 1 taken 1971 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1971 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1971 | const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f)); |
| 502 | 1971 | const float dist_bias = av_clipf(4.f * 120 / lambda, 0.25f, 4.0f); | |
| 503 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1971 times.
|
1971 | const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f); |
| 504 | |||
| 505 | 3942 | int refbits = avctx->bit_rate * 1024.0 / avctx->sample_rate | |
| 506 |
1/2✓ Branch 0 taken 1971 times.
✗ Branch 1 not taken.
|
1971 | / ((avctx->flags & AV_CODEC_FLAG_QSCALE) ? 2.0f : avctx->ch_layout.nb_channels) |
| 507 | 1971 | * (lambda / 120.f); | |
| 508 | |||
| 509 | /** Keep this in sync with twoloop's cutoff selection */ | ||
| 510 | 1971 | float rate_bandwidth_multiplier = 1.5f; | |
| 511 | 1971 | int prev = -1000, prev_sf = -1; | |
| 512 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1971 times.
|
1971 | int frame_bit_rate = (avctx->flags & AV_CODEC_FLAG_QSCALE) |
| 513 | ✗ | ? (refbits * rate_bandwidth_multiplier * avctx->sample_rate / 1024) | |
| 514 | 1971 | : (avctx->bit_rate / avctx->ch_layout.nb_channels); | |
| 515 | |||
| 516 | 1971 | frame_bit_rate *= 1.15f; | |
| 517 | |||
| 518 |
2/2✓ Branch 0 taken 832 times.
✓ Branch 1 taken 1139 times.
|
1971 | if (avctx->cutoff > 0) { |
| 519 | 832 | bandwidth = avctx->cutoff; | |
| 520 | } else { | ||
| 521 |
5/10✓ Branch 0 taken 1139 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1139 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1139 times.
✓ Branch 6 taken 1139 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1139 times.
|
1139 | bandwidth = FFMAX(3000, AAC_CUTOFF_FROM_BITRATE(frame_bit_rate, 1, avctx->sample_rate)); |
| 522 | } | ||
| 523 | |||
| 524 | 1971 | cutoff = bandwidth * 2 * wlen / avctx->sample_rate; | |
| 525 | |||
| 526 | 1971 | memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type)); | |
| 527 | 1971 | ff_init_nextband_map(sce, nextband); | |
| 528 |
2/2✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 1971 times.
|
4059 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 529 | 2088 | int wstart = w*128; | |
| 530 |
2/2✓ Branch 0 taken 93560 times.
✓ Branch 1 taken 2088 times.
|
95648 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 531 | int noise_sfi; | ||
| 532 | 93560 | float dist1 = 0.0f, dist2 = 0.0f, noise_amp; | |
| 533 | 93560 | float pns_energy = 0.0f, pns_tgt_energy, energy_ratio, dist_thresh; | |
| 534 | 93560 | float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f; | |
| 535 | 93560 | float min_energy = -1.0f, max_energy = 0.0f; | |
| 536 | 93560 | const int start = wstart+sce->ics.swb_offset[g]; | |
| 537 | 93560 | const float freq = (start-wstart)*freq_mult; | |
| 538 |
2/2✓ Branch 0 taken 46241 times.
✓ Branch 1 taken 47319 times.
|
93560 | const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f); |
| 539 |
4/4✓ Branch 0 taken 48100 times.
✓ Branch 1 taken 45460 times.
✓ Branch 2 taken 6389 times.
✓ Branch 3 taken 41711 times.
|
93560 | if (freq < NOISE_LOW_LIMIT || (start-wstart) >= cutoff) { |
| 540 |
2/2✓ Branch 0 taken 42612 times.
✓ Branch 1 taken 9237 times.
|
51849 | if (!sce->zeroes[w*16+g]) |
| 541 | 42612 | prev_sf = sce->sf_idx[w*16+g]; | |
| 542 | 51849 | continue; | |
| 543 | } | ||
| 544 |
2/2✓ Branch 0 taken 43155 times.
✓ Branch 1 taken 41711 times.
|
84866 | for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 545 | 43155 | band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; | |
| 546 | 43155 | sfb_energy += band->energy; | |
| 547 |
2/2✓ Branch 0 taken 42042 times.
✓ Branch 1 taken 1113 times.
|
43155 | spread = FFMIN(spread, band->spread); |
| 548 | 43155 | threshold += band->threshold; | |
| 549 |
2/2✓ Branch 0 taken 41711 times.
✓ Branch 1 taken 1444 times.
|
43155 | if (!w2) { |
| 550 | 41711 | min_energy = max_energy = band->energy; | |
| 551 | } else { | ||
| 552 |
2/2✓ Branch 0 taken 486 times.
✓ Branch 1 taken 958 times.
|
1444 | min_energy = FFMIN(min_energy, band->energy); |
| 553 |
2/2✓ Branch 0 taken 629 times.
✓ Branch 1 taken 815 times.
|
1444 | max_energy = FFMAX(max_energy, band->energy); |
| 554 | } | ||
| 555 | } | ||
| 556 | |||
| 557 | /* Ramps down at ~8000Hz and loosens the dist threshold */ | ||
| 558 | 41711 | dist_thresh = av_clipf(2.5f*NOISE_LOW_LIMIT/freq, 0.5f, 2.5f) * dist_bias; | |
| 559 | |||
| 560 | /* PNS is acceptable when all of these are true: | ||
| 561 | * 1. high spread energy (noise-like band) | ||
| 562 | * 2. near-threshold energy (high PE means the random nature of PNS content will be noticed) | ||
| 563 | * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS) | ||
| 564 | * | ||
| 565 | * At this stage, point 2 is relaxed for zeroed bands near the noise threshold (hole avoidance is more important) | ||
| 566 | */ | ||
| 567 |
4/4✓ Branch 0 taken 38477 times.
✓ Branch 1 taken 3234 times.
✓ Branch 3 taken 38420 times.
✓ Branch 4 taken 57 times.
|
41711 | if ((!sce->zeroes[w*16+g] && !ff_sfdelta_can_remove_band(sce, nextband, prev_sf, w*16+g)) || |
| 568 |
8/8✓ Branch 0 taken 38420 times.
✓ Branch 1 taken 3234 times.
✓ Branch 2 taken 4229 times.
✓ Branch 3 taken 34191 times.
✓ Branch 4 taken 6663 times.
✓ Branch 5 taken 800 times.
✓ Branch 6 taken 40375 times.
✓ Branch 7 taken 479 times.
|
41654 | ((sce->zeroes[w*16+g] || !sce->band_alt[w*16+g]) && sfb_energy < threshold*sqrtf(1.0f/freq_boost)) || spread < spread_threshold || |
| 569 |
6/6✓ Branch 0 taken 37967 times.
✓ Branch 1 taken 2408 times.
✓ Branch 2 taken 33739 times.
✓ Branch 3 taken 4228 times.
✓ Branch 4 taken 21095 times.
✓ Branch 5 taken 12644 times.
|
40375 | (!sce->zeroes[w*16+g] && sce->band_alt[w*16+g] && sfb_energy > threshold*thr_mult*freq_boost) || |
| 570 |
2/2✓ Branch 0 taken 61 times.
✓ Branch 1 taken 27670 times.
|
27731 | min_energy < pns_transient_energy_r * max_energy ) { |
| 571 | 14041 | sce->pns_ener[w*16+g] = sfb_energy; | |
| 572 |
2/2✓ Branch 0 taken 13215 times.
✓ Branch 1 taken 826 times.
|
14041 | if (!sce->zeroes[w*16+g]) |
| 573 | 13215 | prev_sf = sce->sf_idx[w*16+g]; | |
| 574 | 14041 | continue; | |
| 575 | } | ||
| 576 | |||
| 577 |
2/2✓ Branch 0 taken 26743 times.
✓ Branch 1 taken 927 times.
|
27670 | pns_tgt_energy = sfb_energy*FFMIN(1.0f, spread*spread); |
| 578 | 27670 | noise_sfi = av_clip(roundf(log2f(pns_tgt_energy)*2), -100, 155); /* Quantize */ | |
| 579 | 27670 | noise_amp = -ff_aac_pow2sf_tab[noise_sfi + POW_SF2_ZERO]; /* Dequantize */ | |
| 580 |
2/2✓ Branch 0 taken 15099 times.
✓ Branch 1 taken 12571 times.
|
27670 | if (prev != -1000) { |
| 581 | 15099 | int noise_sfdiff = noise_sfi - prev + SCALE_DIFF_ZERO; | |
| 582 |
2/4✓ Branch 0 taken 15099 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15099 times.
|
15099 | if (noise_sfdiff < 0 || noise_sfdiff > 2*SCALE_MAX_DIFF) { |
| 583 | ✗ | if (!sce->zeroes[w*16+g]) | |
| 584 | ✗ | prev_sf = sce->sf_idx[w*16+g]; | |
| 585 | ✗ | continue; | |
| 586 | } | ||
| 587 | } | ||
| 588 |
2/2✓ Branch 0 taken 27697 times.
✓ Branch 1 taken 27670 times.
|
55367 | for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 589 | float band_energy, scale, pns_senergy; | ||
| 590 | 27697 | const int start_c = (w+w2)*128+sce->ics.swb_offset[g]; | |
| 591 | 27697 | band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; | |
| 592 |
2/2✓ Branch 0 taken 904920 times.
✓ Branch 1 taken 27697 times.
|
932617 | for (i = 0; i < sce->ics.swb_sizes[g]; i++) { |
| 593 | 904920 | s->random_state = lcg_random(s->random_state); | |
| 594 | 904920 | PNS[i] = s->random_state; | |
| 595 | } | ||
| 596 | 27697 | band_energy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]); | |
| 597 | 27697 | scale = noise_amp/sqrtf(band_energy); | |
| 598 | 27697 | s->fdsp->vector_fmul_scalar(PNS, PNS, scale, sce->ics.swb_sizes[g]); | |
| 599 | 27697 | pns_senergy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]); | |
| 600 | 27697 | pns_energy += pns_senergy; | |
| 601 | 27697 | s->aacdsp.abs_pow34(NOR34, &sce->coeffs[start_c], sce->ics.swb_sizes[g]); | |
| 602 | 27697 | s->aacdsp.abs_pow34(PNS34, PNS, sce->ics.swb_sizes[g]); | |
| 603 | 55394 | dist1 += quantize_band_cost(s, &sce->coeffs[start_c], | |
| 604 | NOR34, | ||
| 605 | 27697 | sce->ics.swb_sizes[g], | |
| 606 | 27697 | sce->sf_idx[(w+w2)*16+g], | |
| 607 | 27697 | sce->band_alt[(w+w2)*16+g], | |
| 608 | 27697 | lambda/band->threshold, INFINITY, NULL, NULL); | |
| 609 | /* Estimate rd on average as 5 bits for SF, 4 for the CB, plus spread energy * lambda/thr */ | ||
| 610 | 27697 | dist2 += band->energy/(band->spread*band->spread)*lambda*dist_thresh/band->threshold; | |
| 611 | } | ||
| 612 |
3/4✓ Branch 0 taken 27670 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5737 times.
✓ Branch 3 taken 21933 times.
|
27670 | if (g && sce->band_type[w*16+g-1] == NOISE_BT) { |
| 613 | 5737 | dist2 += 5; | |
| 614 | } else { | ||
| 615 | 21933 | dist2 += 9; | |
| 616 | } | ||
| 617 | 27670 | energy_ratio = pns_tgt_energy/pns_energy; /* Compensates for quantization error */ | |
| 618 | 27670 | sce->pns_ener[w*16+g] = energy_ratio*pns_tgt_energy; | |
| 619 |
8/10✓ Branch 0 taken 25262 times.
✓ Branch 1 taken 2408 times.
✓ Branch 2 taken 21094 times.
✓ Branch 3 taken 4168 times.
✓ Branch 4 taken 20445 times.
✓ Branch 5 taken 649 times.
✓ Branch 6 taken 20445 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 20445 times.
|
27670 | if (sce->zeroes[w*16+g] || !sce->band_alt[w*16+g] || (energy_ratio > 0.85f && energy_ratio < 1.25f && dist2 < dist1)) { |
| 620 | 6576 | sce->band_type[w*16+g] = NOISE_BT; | |
| 621 | 6576 | sce->zeroes[w*16+g] = 0; | |
| 622 | 6576 | prev = noise_sfi; | |
| 623 | } else { | ||
| 624 |
1/2✓ Branch 0 taken 21094 times.
✗ Branch 1 not taken.
|
21094 | if (!sce->zeroes[w*16+g]) |
| 625 | 21094 | prev_sf = sce->sf_idx[w*16+g]; | |
| 626 | } | ||
| 627 | } | ||
| 628 | } | ||
| 629 | 1971 | } | |
| 630 | |||
| 631 | 1971 | static void mark_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce) | |
| 632 | { | ||
| 633 | FFPsyBand *band; | ||
| 634 | int w, g, w2; | ||
| 635 | 1971 | int wlen = 1024 / sce->ics.num_windows; | |
| 636 | int bandwidth, cutoff; | ||
| 637 | 1971 | const float lambda = s->lambda; | |
| 638 | 1971 | const float freq_mult = avctx->sample_rate*0.5f/wlen; | |
| 639 |
2/6✗ Branch 0 not taken.
✓ Branch 1 taken 1971 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1971 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1971 | const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f)); |
| 640 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1971 times.
|
1971 | const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f); |
| 641 | |||
| 642 | 3942 | int refbits = avctx->bit_rate * 1024.0 / avctx->sample_rate | |
| 643 |
1/2✓ Branch 0 taken 1971 times.
✗ Branch 1 not taken.
|
1971 | / ((avctx->flags & AV_CODEC_FLAG_QSCALE) ? 2.0f : avctx->ch_layout.nb_channels) |
| 644 | 1971 | * (lambda / 120.f); | |
| 645 | |||
| 646 | /** Keep this in sync with twoloop's cutoff selection */ | ||
| 647 | 1971 | float rate_bandwidth_multiplier = 1.5f; | |
| 648 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1971 times.
|
1971 | int frame_bit_rate = (avctx->flags & AV_CODEC_FLAG_QSCALE) |
| 649 | ✗ | ? (refbits * rate_bandwidth_multiplier * avctx->sample_rate / 1024) | |
| 650 | 1971 | : (avctx->bit_rate / avctx->ch_layout.nb_channels); | |
| 651 | |||
| 652 | 1971 | frame_bit_rate *= 1.15f; | |
| 653 | |||
| 654 |
2/2✓ Branch 0 taken 832 times.
✓ Branch 1 taken 1139 times.
|
1971 | if (avctx->cutoff > 0) { |
| 655 | 832 | bandwidth = avctx->cutoff; | |
| 656 | } else { | ||
| 657 |
5/10✓ Branch 0 taken 1139 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1139 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1139 times.
✓ Branch 6 taken 1139 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1139 times.
|
1139 | bandwidth = FFMAX(3000, AAC_CUTOFF_FROM_BITRATE(frame_bit_rate, 1, avctx->sample_rate)); |
| 658 | } | ||
| 659 | |||
| 660 | 1971 | cutoff = bandwidth * 2 * wlen / avctx->sample_rate; | |
| 661 | |||
| 662 | 1971 | memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type)); | |
| 663 |
2/2✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 1971 times.
|
4059 | for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 664 |
2/2✓ Branch 0 taken 93560 times.
✓ Branch 1 taken 2088 times.
|
95648 | for (g = 0; g < sce->ics.num_swb; g++) { |
| 665 | 93560 | float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f; | |
| 666 | 93560 | float min_energy = -1.0f, max_energy = 0.0f; | |
| 667 | 93560 | const int start = sce->ics.swb_offset[g]; | |
| 668 | 93560 | const float freq = start*freq_mult; | |
| 669 |
2/2✓ Branch 0 taken 46241 times.
✓ Branch 1 taken 47319 times.
|
93560 | const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f); |
| 670 |
4/4✓ Branch 0 taken 48100 times.
✓ Branch 1 taken 45460 times.
✓ Branch 2 taken 6389 times.
✓ Branch 3 taken 41711 times.
|
93560 | if (freq < NOISE_LOW_LIMIT || start >= cutoff) { |
| 671 | 51849 | sce->can_pns[w*16+g] = 0; | |
| 672 | 51849 | continue; | |
| 673 | } | ||
| 674 |
2/2✓ Branch 0 taken 43155 times.
✓ Branch 1 taken 41711 times.
|
84866 | for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 675 | 43155 | band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; | |
| 676 | 43155 | sfb_energy += band->energy; | |
| 677 |
2/2✓ Branch 0 taken 42042 times.
✓ Branch 1 taken 1113 times.
|
43155 | spread = FFMIN(spread, band->spread); |
| 678 | 43155 | threshold += band->threshold; | |
| 679 |
2/2✓ Branch 0 taken 41711 times.
✓ Branch 1 taken 1444 times.
|
43155 | if (!w2) { |
| 680 | 41711 | min_energy = max_energy = band->energy; | |
| 681 | } else { | ||
| 682 |
2/2✓ Branch 0 taken 486 times.
✓ Branch 1 taken 958 times.
|
1444 | min_energy = FFMIN(min_energy, band->energy); |
| 683 |
2/2✓ Branch 0 taken 629 times.
✓ Branch 1 taken 815 times.
|
1444 | max_energy = FFMAX(max_energy, band->energy); |
| 684 | } | ||
| 685 | } | ||
| 686 | |||
| 687 | /* PNS is acceptable when all of these are true: | ||
| 688 | * 1. high spread energy (noise-like band) | ||
| 689 | * 2. near-threshold energy (high PE means the random nature of PNS content will be noticed) | ||
| 690 | * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS) | ||
| 691 | */ | ||
| 692 | 41711 | sce->pns_ener[w*16+g] = sfb_energy; | |
| 693 |
6/6✓ Branch 0 taken 40901 times.
✓ Branch 1 taken 810 times.
✓ Branch 2 taken 40432 times.
✓ Branch 3 taken 469 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 40045 times.
|
41711 | if (sfb_energy < threshold*sqrtf(1.5f/freq_boost) || spread < spread_threshold || min_energy < pns_transient_energy_r * max_energy) { |
| 694 | 1666 | sce->can_pns[w*16+g] = 0; | |
| 695 | } else { | ||
| 696 | 40045 | sce->can_pns[w*16+g] = 1; | |
| 697 | } | ||
| 698 | } | ||
| 699 | } | ||
| 700 | 1971 | } | |
| 701 | |||
| 702 | 629 | static void search_for_ms(AACEncContext *s, ChannelElement *cpe) | |
| 703 | { | ||
| 704 | 629 | int start = 0, i, w, w2, g, sid_sf_boost, prev_mid, prev_side; | |
| 705 | uint8_t nextband0[128], nextband1[128]; | ||
| 706 | 629 | float *M = s->scoefs + 128*0, *S = s->scoefs + 128*1; | |
| 707 | 629 | float *L34 = s->scoefs + 128*2, *R34 = s->scoefs + 128*3; | |
| 708 | 629 | float *M34 = s->scoefs + 128*4, *S34 = s->scoefs + 128*5; | |
| 709 | 629 | const float lambda = s->lambda; | |
| 710 |
2/2✓ Branch 0 taken 95 times.
✓ Branch 1 taken 534 times.
|
629 | const float mslambda = FFMIN(1.0f, lambda / 120.f); |
| 711 | 629 | SingleChannelElement *sce0 = &cpe->ch[0]; | |
| 712 | 629 | SingleChannelElement *sce1 = &cpe->ch[1]; | |
| 713 |
2/2✓ Branch 0 taken 521 times.
✓ Branch 1 taken 108 times.
|
629 | if (!cpe->common_window) |
| 714 | 521 | return; | |
| 715 | |||
| 716 | /** Scout out next nonzero bands */ | ||
| 717 | 108 | ff_init_nextband_map(sce0, nextband0); | |
| 718 | 108 | ff_init_nextband_map(sce1, nextband1); | |
| 719 | |||
| 720 | 108 | prev_mid = sce0->sf_idx[0]; | |
| 721 | 108 | prev_side = sce1->sf_idx[0]; | |
| 722 |
2/2✓ Branch 0 taken 122 times.
✓ Branch 1 taken 108 times.
|
230 | for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { |
| 723 | 122 | start = 0; | |
| 724 |
2/2✓ Branch 0 taken 5313 times.
✓ Branch 1 taken 122 times.
|
5435 | for (g = 0; g < sce0->ics.num_swb; g++) { |
| 725 | 5313 | float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f; | |
| 726 |
2/2✓ Branch 0 taken 4874 times.
✓ Branch 1 taken 439 times.
|
5313 | if (!cpe->is_mask[w*16+g]) |
| 727 | 4874 | cpe->ms_mask[w*16+g] = 0; | |
| 728 |
5/6✓ Branch 0 taken 3608 times.
✓ Branch 1 taken 1705 times.
✓ Branch 2 taken 3608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3169 times.
✓ Branch 5 taken 439 times.
|
5313 | if (!sce0->zeroes[w*16+g] && !sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g]) { |
| 729 | 3169 | float Mmax = 0.0f, Smax = 0.0f; | |
| 730 | |||
| 731 | /* Must compute mid/side SF and book for the whole window group */ | ||
| 732 |
2/2✓ Branch 0 taken 3381 times.
✓ Branch 1 taken 3169 times.
|
6550 | for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { |
| 733 |
2/2✓ Branch 0 taken 66700 times.
✓ Branch 1 taken 3381 times.
|
70081 | for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { |
| 734 | 66700 | M[i] = (sce0->coeffs[start+(w+w2)*128+i] | |
| 735 | 66700 | + sce1->coeffs[start+(w+w2)*128+i]) * 0.5; | |
| 736 | 66700 | S[i] = M[i] | |
| 737 | 66700 | - sce1->coeffs[start+(w+w2)*128+i]; | |
| 738 | } | ||
| 739 | 3381 | s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]); | |
| 740 | 3381 | s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]); | |
| 741 |
2/2✓ Branch 0 taken 66700 times.
✓ Branch 1 taken 3381 times.
|
70081 | for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) { |
| 742 |
2/2✓ Branch 0 taken 50122 times.
✓ Branch 1 taken 16578 times.
|
66700 | Mmax = FFMAX(Mmax, M34[i]); |
| 743 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66700 times.
|
66700 | Smax = FFMAX(Smax, S34[i]); |
| 744 | } | ||
| 745 | } | ||
| 746 | |||
| 747 |
2/2✓ Branch 0 taken 3439 times.
✓ Branch 1 taken 90 times.
|
3529 | for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) { |
| 748 | 3439 | float dist1 = 0.0f, dist2 = 0.0f; | |
| 749 | 3439 | int B0 = 0, B1 = 0; | |
| 750 | int minidx; | ||
| 751 | int mididx, sididx; | ||
| 752 | int midcb, sidcb; | ||
| 753 | |||
| 754 | 3439 | minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]); | |
| 755 | 3439 | mididx = av_clip(minidx, 0, SCALE_MAX_POS - SCALE_DIV_512); | |
| 756 | 3439 | sididx = av_clip(minidx - sid_sf_boost * 3, 0, SCALE_MAX_POS - SCALE_DIV_512); | |
| 757 |
4/4✓ Branch 0 taken 3104 times.
✓ Branch 1 taken 335 times.
✓ Branch 2 taken 3027 times.
✓ Branch 3 taken 77 times.
|
3439 | if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT |
| 758 |
1/2✓ Branch 1 taken 3027 times.
✗ Branch 2 not taken.
|
3027 | && ( !ff_sfdelta_can_replace(sce0, nextband0, prev_mid, mididx, w*16+g) |
| 759 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3027 times.
|
3027 | || !ff_sfdelta_can_replace(sce1, nextband1, prev_side, sididx, w*16+g))) { |
| 760 | /* scalefactor range violation, bad stuff, will decrease quality unacceptably */ | ||
| 761 | ✗ | continue; | |
| 762 | } | ||
| 763 | |||
| 764 | 3439 | midcb = find_min_book(Mmax, mididx); | |
| 765 | 3439 | sidcb = find_min_book(Smax, sididx); | |
| 766 | |||
| 767 | /* No CB can be zero */ | ||
| 768 | 3439 | midcb = FFMAX(1,midcb); | |
| 769 | 3439 | sidcb = FFMAX(1,sidcb); | |
| 770 | |||
| 771 |
2/2✓ Branch 0 taken 3651 times.
✓ Branch 1 taken 3439 times.
|
7090 | for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { |
| 772 | 3651 | FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g]; | |
| 773 | 3651 | FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g]; | |
| 774 |
2/2✓ Branch 0 taken 1416 times.
✓ Branch 1 taken 2235 times.
|
3651 | float minthr = FFMIN(band0->threshold, band1->threshold); |
| 775 | int b1,b2,b3,b4; | ||
| 776 |
2/2✓ Branch 0 taken 68860 times.
✓ Branch 1 taken 3651 times.
|
72511 | for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { |
| 777 | 68860 | M[i] = (sce0->coeffs[start+(w+w2)*128+i] | |
| 778 | 68860 | + sce1->coeffs[start+(w+w2)*128+i]) * 0.5; | |
| 779 | 68860 | S[i] = M[i] | |
| 780 | 68860 | - sce1->coeffs[start+(w+w2)*128+i]; | |
| 781 | } | ||
| 782 | |||
| 783 | 3651 | s->aacdsp.abs_pow34(L34, sce0->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]); | |
| 784 | 3651 | s->aacdsp.abs_pow34(R34, sce1->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]); | |
| 785 | 3651 | s->aacdsp.abs_pow34(M34, M, sce0->ics.swb_sizes[g]); | |
| 786 | 3651 | s->aacdsp.abs_pow34(S34, S, sce0->ics.swb_sizes[g]); | |
| 787 | 7302 | dist1 += quantize_band_cost(s, &sce0->coeffs[start + (w+w2)*128], | |
| 788 | L34, | ||
| 789 | 3651 | sce0->ics.swb_sizes[g], | |
| 790 | 3651 | sce0->sf_idx[w*16+g], | |
| 791 | 3651 | sce0->band_type[w*16+g], | |
| 792 | 3651 | lambda / (band0->threshold + FLT_MIN), INFINITY, &b1, NULL); | |
| 793 | 7302 | dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128], | |
| 794 | R34, | ||
| 795 | 3651 | sce1->ics.swb_sizes[g], | |
| 796 | 3651 | sce1->sf_idx[w*16+g], | |
| 797 | 3651 | sce1->band_type[w*16+g], | |
| 798 | 3651 | lambda / (band1->threshold + FLT_MIN), INFINITY, &b2, NULL); | |
| 799 | 7302 | dist2 += quantize_band_cost(s, M, | |
| 800 | M34, | ||
| 801 | 3651 | sce0->ics.swb_sizes[g], | |
| 802 | mididx, | ||
| 803 | midcb, | ||
| 804 | 3651 | lambda / (minthr + FLT_MIN), INFINITY, &b3, NULL); | |
| 805 | 7302 | dist2 += quantize_band_cost(s, S, | |
| 806 | S34, | ||
| 807 | 3651 | sce1->ics.swb_sizes[g], | |
| 808 | sididx, | ||
| 809 | sidcb, | ||
| 810 | 3651 | mslambda / (minthr * bmax + FLT_MIN), INFINITY, &b4, NULL); | |
| 811 | 3651 | B0 += b1+b2; | |
| 812 | 3651 | B1 += b3+b4; | |
| 813 | 3651 | dist1 -= b1+b2; | |
| 814 | 3651 | dist2 -= b3+b4; | |
| 815 | } | ||
| 816 |
3/4✓ Branch 0 taken 3439 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2667 times.
✓ Branch 3 taken 772 times.
|
3439 | cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0; |
| 817 |
2/2✓ Branch 0 taken 2667 times.
✓ Branch 1 taken 772 times.
|
3439 | if (cpe->ms_mask[w*16+g]) { |
| 818 |
2/4✓ Branch 0 taken 2667 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2667 times.
✗ Branch 3 not taken.
|
2667 | if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT) { |
| 819 | 2667 | sce0->sf_idx[w*16+g] = mididx; | |
| 820 | 2667 | sce1->sf_idx[w*16+g] = sididx; | |
| 821 | 2667 | sce0->band_type[w*16+g] = midcb; | |
| 822 | 2667 | sce1->band_type[w*16+g] = sidcb; | |
| 823 | ✗ | } else if ((sce0->band_type[w*16+g] != NOISE_BT) ^ (sce1->band_type[w*16+g] != NOISE_BT)) { | |
| 824 | /* ms_mask unneeded, and it confuses some decoders */ | ||
| 825 | ✗ | cpe->ms_mask[w*16+g] = 0; | |
| 826 | } | ||
| 827 | 2667 | break; | |
| 828 |
2/2✓ Branch 0 taken 412 times.
✓ Branch 1 taken 360 times.
|
772 | } else if (B1 > B0) { |
| 829 | /* More boost won't fix this */ | ||
| 830 | 412 | break; | |
| 831 | } | ||
| 832 | } | ||
| 833 | } | ||
| 834 |
4/4✓ Branch 0 taken 3608 times.
✓ Branch 1 taken 1705 times.
✓ Branch 2 taken 3273 times.
✓ Branch 3 taken 335 times.
|
5313 | if (!sce0->zeroes[w*16+g] && sce0->band_type[w*16+g] < RESERVED_BT) |
| 835 | 3273 | prev_mid = sce0->sf_idx[w*16+g]; | |
| 836 |
6/6✓ Branch 0 taken 3608 times.
✓ Branch 1 taken 1705 times.
✓ Branch 2 taken 3169 times.
✓ Branch 3 taken 439 times.
✓ Branch 4 taken 2801 times.
✓ Branch 5 taken 368 times.
|
5313 | if (!sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g] && sce1->band_type[w*16+g] < RESERVED_BT) |
| 837 | 2801 | prev_side = sce1->sf_idx[w*16+g]; | |
| 838 | 5313 | start += sce0->ics.swb_sizes[g]; | |
| 839 | } | ||
| 840 | } | ||
| 841 | } | ||
| 842 | |||
| 843 | const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = { | ||
| 844 | [AAC_CODER_TWOLOOP] = { | ||
| 845 | search_for_quantizers_twoloop, | ||
| 846 | codebook_trellis_rate, | ||
| 847 | quantize_and_encode_band, | ||
| 848 | ff_aac_encode_tns_info, | ||
| 849 | ff_aac_apply_tns, | ||
| 850 | set_special_band_scalefactors, | ||
| 851 | search_for_pns, | ||
| 852 | mark_pns, | ||
| 853 | ff_aac_search_for_tns, | ||
| 854 | search_for_ms, | ||
| 855 | ff_aac_search_for_is, | ||
| 856 | }, | ||
| 857 | [AAC_CODER_FAST] = { | ||
| 858 | search_for_quantizers_fast, | ||
| 859 | codebook_trellis_rate, | ||
| 860 | quantize_and_encode_band, | ||
| 861 | ff_aac_encode_tns_info, | ||
| 862 | ff_aac_apply_tns, | ||
| 863 | set_special_band_scalefactors, | ||
| 864 | search_for_pns, | ||
| 865 | mark_pns, | ||
| 866 | ff_aac_search_for_tns, | ||
| 867 | search_for_ms, | ||
| 868 | ff_aac_search_for_is, | ||
| 869 | }, | ||
| 870 | }; | ||
| 871 |