40 #ifndef AVCODEC_AACCODER_TWOLOOP_H
41 #define AVCODEC_AACCODER_TWOLOOP_H
54 #define NOISE_LOW_LIMIT 4000
70 int start = 0,
i,
w, w2,
g, recomprd;
74 int toomanybits, toofewbits;
76 uint8_t nextband[128];
77 int maxsf[128], minsf[128];
78 float dists[128] = { 0 }, qenergies[128] = { 0 }, uplims[128], euplims[128], energies[128];
79 float maxvals[128], spread_thr_r[128];
80 float min_spread_thr_r, max_spread_thr_r;
91 float rdlambda =
av_clipf(2.0
f * 120.
f / lambda, 0.0625
f, 16.0
f);
92 const float nzslope = 1.5f;
93 float rdmin = 0.03125f;
103 int fflag, minscaler, nminscaler;
121 if (lambda > 120.
f) {
127 if (
s->psy.bitres.alloc >= 0) {
132 destbits =
s->psy.bitres.alloc
142 if (
s->options.mid_side &&
s->cur_type ==
TYPE_CPE)
150 toofewbits = destbits / 16;
154 rdlambda =
sqrtf(rdlambda);
164 toomanybits = destbits + destbits/8;
165 toofewbits = destbits - destbits/8;
168 rdlambda =
sqrtf(rdlambda);
183 destbits =
FFMIN(destbits, 5800);
184 toomanybits =
FFMIN(toomanybits, 5800);
185 toofewbits =
FFMIN(toofewbits, 5800);
190 min_spread_thr_r = -1;
191 max_spread_thr_r = -1;
195 float uplim = 0.0f, energy = 0.0f, spread = 0.0f;
197 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
209 FFPsyBand *band = &
s->psy.ch[
s->cur_channel].psy_bands[(
w+w2)*16+
g];
218 uplims[
w*16+
g] = uplim;
219 energies[
w*16+
g] = energy;
224 spread_thr_r[
w*16+
g] = energy * nz / (uplim * spread);
225 if (min_spread_thr_r < 0) {
226 min_spread_thr_r = max_spread_thr_r = spread_thr_r[
w*16+
g];
228 min_spread_thr_r =
FFMIN(min_spread_thr_r, spread_thr_r[
w*16+
g]);
229 max_spread_thr_r =
FFMAX(max_spread_thr_r, spread_thr_r[
w*16+
g]);
267 s->aacdsp.abs_pow34(
s->scoefs, sce->
coeffs, 1024);
270 for (
i = 0;
i <
sizeof(minsf) /
sizeof(minsf[0]); ++
i)
275 const float *scaled =
s->scoefs + start;
278 if (maxvals[
w*16+
g] > 0) {
281 minsf[(
w+w2)*16+
g] = minsfidx;
294 memcpy(euplims, uplims,
sizeof(euplims));
306 nzslope * cleanup_factor);
307 energy2uplim *= de_psy_factor;
310 energy2uplim =
sqrtf(energy2uplim);
312 energy2uplim =
FFMAX(0.015625
f,
FFMIN(1.0
f, energy2uplim));
313 uplims[
w*16+
g] *=
av_clipf(rdlambda * energy2uplim, rdmin, rdmax)
321 energy2uplim *= de_psy_factor;
324 energy2uplim =
sqrtf(energy2uplim);
326 energy2uplim =
FFMAX(0.015625
f,
FFMIN(1.0
f, energy2uplim));
334 for (
i = 0;
i <
sizeof(maxsf) /
sizeof(maxsf[0]); ++
i)
342 int qstep = its ? 1 : 32;
351 const float *coefs = &sce->
coeffs[start];
352 const float *scaled = &
s->scoefs[start];
356 float qenergy = 0.0f;
382 dists[
w*16+
g] = dist -
bits;
383 qenergies[
w*16+
g] = qenergy;
393 if (tbits > toomanybits) {
395 for (
i = 0;
i < 128;
i++) {
399 if (new_sf != sce->
sf_idx[
i]) {
405 }
else if (tbits < toofewbits) {
407 for (
i = 0;
i < 128;
i++) {
410 if (new_sf != sce->
sf_idx[
i]) {
418 if (!qstep && tbits > toomanybits && sce->
sf_idx[0] < 217 && changed)
423 fflag = tbits < toofewbits;
424 for (
i = 0;
i < 2 && (overdist || recomprd); ++
i) {
432 const float *coefs = sce->
coeffs + start;
433 const float *scaled =
s->scoefs + start;
437 float qenergy = 0.0f;
463 dists[
w*16+
g] = dist -
bits;
464 qenergies[
w*16+
g] = qenergy;
475 if (!
i &&
s->options.pns && its > maxits/2 && tbits > toofewbits) {
476 float maxoverdist = 0.0f;
477 float ovrfactor = 1.f+(maxits-its)*16.
f/maxits;
478 overdist = recomprd = 0;
482 float ovrdist = dists[
w*16+
g] /
FFMAX(uplims[
w*16+
g],euplims[
w*16+
g]);
483 maxoverdist =
FFMAX(maxoverdist, ovrdist);
492 float minspread = max_spread_thr_r;
493 float maxspread = min_spread_thr_r;
497 int maxzeroed, zloop;
501 minspread =
FFMIN(minspread, spread_thr_r[
w*16+
g]);
502 maxspread =
FFMAX(maxspread, spread_thr_r[
w*16+
g]);
507 zspread = (maxspread-minspread) * 0.0125
f + minspread;
513 zspread =
FFMIN3(min_spread_thr_r * 8.
f, zspread,
514 ((toomanybits - tbits) * min_spread_thr_r + (tbits - toofewbits) * max_spread_thr_r) / (toomanybits - toofewbits + 1));
515 maxzeroed =
FFMIN(zeroable,
FFMAX(1, (zeroable * its + maxits - 1) / (2 * maxits)));
516 for (zloop = 0; zloop < 2; zloop++) {
523 float loopovrfactor = (zloop) ? 1.0
f : ovrfactor;
526 for (
g = sce->
ics.
num_swb-1;
g > 0 && zeroed < maxzeroed;
g--) {
533 || (mcb <= 1 && dists[w*16+g] >
FFMIN(uplims[
w*16+
g], euplims[
w*16+
g]))) ) {
542 recomprd = fflag = 1;
562 int depth = (its > maxits/2) ? ((its > maxits*2/3) ? 1 : 3) : 10;
563 int edepth = depth+2;
564 float uplmax = its / (maxits*0.25f) + 1.0
f;
565 uplmax *= (tbits > destbits) ?
FFMIN(2.0
f, tbits / (
float)
FFMAX(1,destbits)) : 1.0
f;
569 if (prev < 0 && !sce->zeroes[
w*16+
g])
572 const float *coefs = sce->
coeffs + start;
573 const float *scaled =
s->scoefs + start;
577 if ((!cmb || dists[
w*16+
g] > uplims[
w*16+
g]) && sce->
sf_idx[
w*16+
g] >
FFMAX(mindeltasf, minsf[
w*16+
g])) {
584 for (
i = 0;
i < edepth && sce->
sf_idx[
w*16+
g] > mindeltasf; ++
i) {
589 dist = qenergy = 0.f;
593 }
else if (
i >= depth && dists[
w*16+
g] < euplims[
w*16+
g]) {
618 dists[
w*16+
g] = dist -
bits;
619 qenergies[
w*16+
g] = qenergy;
620 if (
mb && (sce->
sf_idx[
w*16+
g] < mindeltasf || (
621 (dists[
w*16+
g] <
FFMIN(uplmax*uplims[
w*16+
g], euplims[
w*16+
g]))
622 && (
fabsf(qenergies[
w*16+
g]-energies[
w*16+
g]) < euplims[
w*16+
g])
627 }
else if (tbits > toofewbits && sce->
sf_idx[
w*16+
g] <
FFMIN(maxdeltasf, maxsf[
w*16+
g])
628 && (dists[
w*16+
g] <
FFMIN(euplims[
w*16+
g], uplims[
w*16+
g]))
629 && (
fabsf(qenergies[
w*16+
g]-energies[
w*16+
g]) < euplims[
w*16+
g])
632 for (
i = 0;
i < depth && sce->
sf_idx[
w*16+
g] < maxdeltasf; ++
i) {
637 dist = qenergy = 0.f;
655 if (dist <
FFMIN(euplims[
w*16+
g], uplims[
w*16+
g])) {
657 dists[
w*16+
g] = dist;
658 qenergies[
w*16+
g] = qenergy;
689 if (!fflag && prevsf != sce->
sf_idx[
w*16+
g])
696 }
while (fflag && its < maxits);
724 }
else if (sce->
zeroes[0]) {