1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * AAC encoder twoloop coder 3cabdff1aSopenharmony_ci * Copyright (C) 2008-2009 Konstantin Shishkov 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * AAC encoder twoloop coder 25cabdff1aSopenharmony_ci * @author Konstantin Shishkov, Claudio Freire 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci/** 29cabdff1aSopenharmony_ci * This file contains a template for the twoloop coder function. 30cabdff1aSopenharmony_ci * It needs to be provided, externally, as an already included declaration, 31cabdff1aSopenharmony_ci * the following functions from aacenc_quantization/util.h. They're not included 32cabdff1aSopenharmony_ci * explicitly here to make it possible to provide alternative implementations: 33cabdff1aSopenharmony_ci * - quantize_band_cost 34cabdff1aSopenharmony_ci * - abs_pow34_v 35cabdff1aSopenharmony_ci * - find_max_val 36cabdff1aSopenharmony_ci * - find_min_book 37cabdff1aSopenharmony_ci * - find_form_factor 38cabdff1aSopenharmony_ci */ 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci#ifndef AVCODEC_AACCODER_TWOLOOP_H 41cabdff1aSopenharmony_ci#define AVCODEC_AACCODER_TWOLOOP_H 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci#include <float.h> 44cabdff1aSopenharmony_ci#include "libavutil/mathematics.h" 45cabdff1aSopenharmony_ci#include "mathops.h" 46cabdff1aSopenharmony_ci#include "avcodec.h" 47cabdff1aSopenharmony_ci#include "put_bits.h" 48cabdff1aSopenharmony_ci#include "aac.h" 49cabdff1aSopenharmony_ci#include "aacenc.h" 50cabdff1aSopenharmony_ci#include "aactab.h" 51cabdff1aSopenharmony_ci#include "aacenctab.h" 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci/** Frequency in Hz for lower limit of noise substitution **/ 54cabdff1aSopenharmony_ci#define NOISE_LOW_LIMIT 4000 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci#define sclip(x) av_clip(x,60,218) 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci/* Reflects the cost to change codebooks */ 59cabdff1aSopenharmony_cistatic inline int ff_pns_bits(SingleChannelElement *sce, int w, int g) 60cabdff1aSopenharmony_ci{ 61cabdff1aSopenharmony_ci return (!g || !sce->zeroes[w*16+g-1] || !sce->can_pns[w*16+g-1]) ? 9 : 5; 62cabdff1aSopenharmony_ci} 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci/** 65cabdff1aSopenharmony_ci * two-loop quantizers search taken from ISO 13818-7 Appendix C 66cabdff1aSopenharmony_ci */ 67cabdff1aSopenharmony_cistatic void search_for_quantizers_twoloop(AVCodecContext *avctx, 68cabdff1aSopenharmony_ci AACEncContext *s, 69cabdff1aSopenharmony_ci SingleChannelElement *sce, 70cabdff1aSopenharmony_ci const float lambda) 71cabdff1aSopenharmony_ci{ 72cabdff1aSopenharmony_ci int start = 0, i, w, w2, g, recomprd; 73cabdff1aSopenharmony_ci int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate 74cabdff1aSopenharmony_ci / ((avctx->flags & AV_CODEC_FLAG_QSCALE) ? 2.0f : avctx->ch_layout.nb_channels) 75cabdff1aSopenharmony_ci * (lambda / 120.f); 76cabdff1aSopenharmony_ci int refbits = destbits; 77cabdff1aSopenharmony_ci int toomanybits, toofewbits; 78cabdff1aSopenharmony_ci char nzs[128]; 79cabdff1aSopenharmony_ci uint8_t nextband[128]; 80cabdff1aSopenharmony_ci int maxsf[128], minsf[128]; 81cabdff1aSopenharmony_ci float dists[128] = { 0 }, qenergies[128] = { 0 }, uplims[128], euplims[128], energies[128]; 82cabdff1aSopenharmony_ci float maxvals[128], spread_thr_r[128]; 83cabdff1aSopenharmony_ci float min_spread_thr_r, max_spread_thr_r; 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci /** 86cabdff1aSopenharmony_ci * rdlambda controls the maximum tolerated distortion. Twoloop 87cabdff1aSopenharmony_ci * will keep iterating until it fails to lower it or it reaches 88cabdff1aSopenharmony_ci * ulimit * rdlambda. Keeping it low increases quality on difficult 89cabdff1aSopenharmony_ci * signals, but lower it too much, and bits will be taken from weak 90cabdff1aSopenharmony_ci * signals, creating "holes". A balance is necessary. 91cabdff1aSopenharmony_ci * rdmax and rdmin specify the relative deviation from rdlambda 92cabdff1aSopenharmony_ci * allowed for tonality compensation 93cabdff1aSopenharmony_ci */ 94cabdff1aSopenharmony_ci float rdlambda = av_clipf(2.0f * 120.f / lambda, 0.0625f, 16.0f); 95cabdff1aSopenharmony_ci const float nzslope = 1.5f; 96cabdff1aSopenharmony_ci float rdmin = 0.03125f; 97cabdff1aSopenharmony_ci float rdmax = 1.0f; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci /** 100cabdff1aSopenharmony_ci * sfoffs controls an offset of optmium allocation that will be 101cabdff1aSopenharmony_ci * applied based on lambda. Keep it real and modest, the loop 102cabdff1aSopenharmony_ci * will take care of the rest, this just accelerates convergence 103cabdff1aSopenharmony_ci */ 104cabdff1aSopenharmony_ci float sfoffs = av_clipf(log2f(120.0f / lambda) * 4.0f, -5, 10); 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci int fflag, minscaler, maxscaler, nminscaler; 107cabdff1aSopenharmony_ci int its = 0; 108cabdff1aSopenharmony_ci int maxits = 30; 109cabdff1aSopenharmony_ci int allz = 0; 110cabdff1aSopenharmony_ci int tbits; 111cabdff1aSopenharmony_ci int cutoff = 1024; 112cabdff1aSopenharmony_ci int pns_start_pos; 113cabdff1aSopenharmony_ci int prev; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci /** 116cabdff1aSopenharmony_ci * zeroscale controls a multiplier of the threshold, if band energy 117cabdff1aSopenharmony_ci * is below this, a zero is forced. Keep it lower than 1, unless 118cabdff1aSopenharmony_ci * low lambda is used, because energy < threshold doesn't mean there's 119cabdff1aSopenharmony_ci * no audible signal outright, it's just energy. Also make it rise 120cabdff1aSopenharmony_ci * slower than rdlambda, as rdscale has due compensation with 121cabdff1aSopenharmony_ci * noisy band depriorization below, whereas zeroing logic is rather dumb 122cabdff1aSopenharmony_ci */ 123cabdff1aSopenharmony_ci float zeroscale; 124cabdff1aSopenharmony_ci if (lambda > 120.f) { 125cabdff1aSopenharmony_ci zeroscale = av_clipf(powf(120.f / lambda, 0.25f), 0.0625f, 1.0f); 126cabdff1aSopenharmony_ci } else { 127cabdff1aSopenharmony_ci zeroscale = 1.f; 128cabdff1aSopenharmony_ci } 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci if (s->psy.bitres.alloc >= 0) { 131cabdff1aSopenharmony_ci /** 132cabdff1aSopenharmony_ci * Psy granted us extra bits to use, from the reservoire 133cabdff1aSopenharmony_ci * adjust for lambda except what psy already did 134cabdff1aSopenharmony_ci */ 135cabdff1aSopenharmony_ci destbits = s->psy.bitres.alloc 136cabdff1aSopenharmony_ci * (lambda / (avctx->global_quality ? avctx->global_quality : 120)); 137cabdff1aSopenharmony_ci } 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci if (avctx->flags & AV_CODEC_FLAG_QSCALE) { 140cabdff1aSopenharmony_ci /** 141cabdff1aSopenharmony_ci * Constant Q-scale doesn't compensate MS coding on its own 142cabdff1aSopenharmony_ci * No need to be overly precise, this only controls RD 143cabdff1aSopenharmony_ci * adjustment CB limits when going overboard 144cabdff1aSopenharmony_ci */ 145cabdff1aSopenharmony_ci if (s->options.mid_side && s->cur_type == TYPE_CPE) 146cabdff1aSopenharmony_ci destbits *= 2; 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci /** 149cabdff1aSopenharmony_ci * When using a constant Q-scale, don't adjust bits, just use RD 150cabdff1aSopenharmony_ci * Don't let it go overboard, though... 8x psy target is enough 151cabdff1aSopenharmony_ci */ 152cabdff1aSopenharmony_ci toomanybits = 5800; 153cabdff1aSopenharmony_ci toofewbits = destbits / 16; 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci /** Don't offset scalers, just RD */ 156cabdff1aSopenharmony_ci sfoffs = sce->ics.num_windows - 1; 157cabdff1aSopenharmony_ci rdlambda = sqrtf(rdlambda); 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci /** search further */ 160cabdff1aSopenharmony_ci maxits *= 2; 161cabdff1aSopenharmony_ci } else { 162cabdff1aSopenharmony_ci /* When using ABR, be strict, but a reasonable leeway is 163cabdff1aSopenharmony_ci * critical to allow RC to smoothly track desired bitrate 164cabdff1aSopenharmony_ci * without sudden quality drops that cause audible artifacts. 165cabdff1aSopenharmony_ci * Symmetry is also desirable, to avoid systematic bias. 166cabdff1aSopenharmony_ci */ 167cabdff1aSopenharmony_ci toomanybits = destbits + destbits/8; 168cabdff1aSopenharmony_ci toofewbits = destbits - destbits/8; 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci sfoffs = 0; 171cabdff1aSopenharmony_ci rdlambda = sqrtf(rdlambda); 172cabdff1aSopenharmony_ci } 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci /** and zero out above cutoff frequency */ 175cabdff1aSopenharmony_ci { 176cabdff1aSopenharmony_ci int wlen = 1024 / sce->ics.num_windows; 177cabdff1aSopenharmony_ci int bandwidth; 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci /** 180cabdff1aSopenharmony_ci * Scale, psy gives us constant quality, this LP only scales 181cabdff1aSopenharmony_ci * bitrate by lambda, so we save bits on subjectively unimportant HF 182cabdff1aSopenharmony_ci * rather than increase quantization noise. Adjust nominal bitrate 183cabdff1aSopenharmony_ci * to effective bitrate according to encoding parameters, 184cabdff1aSopenharmony_ci * AAC_CUTOFF_FROM_BITRATE is calibrated for effective bitrate. 185cabdff1aSopenharmony_ci */ 186cabdff1aSopenharmony_ci float rate_bandwidth_multiplier = 1.5f; 187cabdff1aSopenharmony_ci int frame_bit_rate = (avctx->flags & AV_CODEC_FLAG_QSCALE) 188cabdff1aSopenharmony_ci ? (refbits * rate_bandwidth_multiplier * avctx->sample_rate / 1024) 189cabdff1aSopenharmony_ci : (avctx->bit_rate / avctx->ch_layout.nb_channels); 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci /** Compensate for extensions that increase efficiency */ 192cabdff1aSopenharmony_ci if (s->options.pns || s->options.intensity_stereo) 193cabdff1aSopenharmony_ci frame_bit_rate *= 1.15f; 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_ci if (avctx->cutoff > 0) { 196cabdff1aSopenharmony_ci bandwidth = avctx->cutoff; 197cabdff1aSopenharmony_ci } else { 198cabdff1aSopenharmony_ci bandwidth = FFMAX(3000, AAC_CUTOFF_FROM_BITRATE(frame_bit_rate, 1, avctx->sample_rate)); 199cabdff1aSopenharmony_ci s->psy.cutoff = bandwidth; 200cabdff1aSopenharmony_ci } 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci cutoff = bandwidth * 2 * wlen / avctx->sample_rate; 203cabdff1aSopenharmony_ci pns_start_pos = NOISE_LOW_LIMIT * 2 * wlen / avctx->sample_rate; 204cabdff1aSopenharmony_ci } 205cabdff1aSopenharmony_ci 206cabdff1aSopenharmony_ci /** 207cabdff1aSopenharmony_ci * for values above this the decoder might end up in an endless loop 208cabdff1aSopenharmony_ci * due to always having more bits than what can be encoded. 209cabdff1aSopenharmony_ci */ 210cabdff1aSopenharmony_ci destbits = FFMIN(destbits, 5800); 211cabdff1aSopenharmony_ci toomanybits = FFMIN(toomanybits, 5800); 212cabdff1aSopenharmony_ci toofewbits = FFMIN(toofewbits, 5800); 213cabdff1aSopenharmony_ci /** 214cabdff1aSopenharmony_ci * XXX: some heuristic to determine initial quantizers will reduce search time 215cabdff1aSopenharmony_ci * determine zero bands and upper distortion limits 216cabdff1aSopenharmony_ci */ 217cabdff1aSopenharmony_ci min_spread_thr_r = -1; 218cabdff1aSopenharmony_ci max_spread_thr_r = -1; 219cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 220cabdff1aSopenharmony_ci for (g = start = 0; g < sce->ics.num_swb; start += sce->ics.swb_sizes[g++]) { 221cabdff1aSopenharmony_ci int nz = 0; 222cabdff1aSopenharmony_ci float uplim = 0.0f, energy = 0.0f, spread = 0.0f; 223cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 224cabdff1aSopenharmony_ci FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; 225cabdff1aSopenharmony_ci if (start >= cutoff || band->energy <= (band->threshold * zeroscale) || band->threshold == 0.0f) { 226cabdff1aSopenharmony_ci sce->zeroes[(w+w2)*16+g] = 1; 227cabdff1aSopenharmony_ci continue; 228cabdff1aSopenharmony_ci } 229cabdff1aSopenharmony_ci nz = 1; 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci if (!nz) { 232cabdff1aSopenharmony_ci uplim = 0.0f; 233cabdff1aSopenharmony_ci } else { 234cabdff1aSopenharmony_ci nz = 0; 235cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 236cabdff1aSopenharmony_ci FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; 237cabdff1aSopenharmony_ci if (band->energy <= (band->threshold * zeroscale) || band->threshold == 0.0f) 238cabdff1aSopenharmony_ci continue; 239cabdff1aSopenharmony_ci uplim += band->threshold; 240cabdff1aSopenharmony_ci energy += band->energy; 241cabdff1aSopenharmony_ci spread += band->spread; 242cabdff1aSopenharmony_ci nz++; 243cabdff1aSopenharmony_ci } 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci uplims[w*16+g] = uplim; 246cabdff1aSopenharmony_ci energies[w*16+g] = energy; 247cabdff1aSopenharmony_ci nzs[w*16+g] = nz; 248cabdff1aSopenharmony_ci sce->zeroes[w*16+g] = !nz; 249cabdff1aSopenharmony_ci allz |= nz; 250cabdff1aSopenharmony_ci if (nz && sce->can_pns[w*16+g]) { 251cabdff1aSopenharmony_ci spread_thr_r[w*16+g] = energy * nz / (uplim * spread); 252cabdff1aSopenharmony_ci if (min_spread_thr_r < 0) { 253cabdff1aSopenharmony_ci min_spread_thr_r = max_spread_thr_r = spread_thr_r[w*16+g]; 254cabdff1aSopenharmony_ci } else { 255cabdff1aSopenharmony_ci min_spread_thr_r = FFMIN(min_spread_thr_r, spread_thr_r[w*16+g]); 256cabdff1aSopenharmony_ci max_spread_thr_r = FFMAX(max_spread_thr_r, spread_thr_r[w*16+g]); 257cabdff1aSopenharmony_ci } 258cabdff1aSopenharmony_ci } 259cabdff1aSopenharmony_ci } 260cabdff1aSopenharmony_ci } 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci /** Compute initial scalers */ 263cabdff1aSopenharmony_ci minscaler = 65535; 264cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 265cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 266cabdff1aSopenharmony_ci if (sce->zeroes[w*16+g]) { 267cabdff1aSopenharmony_ci sce->sf_idx[w*16+g] = SCALE_ONE_POS; 268cabdff1aSopenharmony_ci continue; 269cabdff1aSopenharmony_ci } 270cabdff1aSopenharmony_ci /** 271cabdff1aSopenharmony_ci * log2f-to-distortion ratio is, technically, 2 (1.5db = 4, but it's power vs level so it's 2). 272cabdff1aSopenharmony_ci * But, as offsets are applied, low-frequency signals are too sensitive to the induced distortion, 273cabdff1aSopenharmony_ci * so we make scaling more conservative by choosing a lower log2f-to-distortion ratio, and thus 274cabdff1aSopenharmony_ci * more robust. 275cabdff1aSopenharmony_ci */ 276cabdff1aSopenharmony_ci sce->sf_idx[w*16+g] = av_clip( 277cabdff1aSopenharmony_ci SCALE_ONE_POS 278cabdff1aSopenharmony_ci + 1.75*log2f(FFMAX(0.00125f,uplims[w*16+g]) / sce->ics.swb_sizes[g]) 279cabdff1aSopenharmony_ci + sfoffs, 280cabdff1aSopenharmony_ci 60, SCALE_MAX_POS); 281cabdff1aSopenharmony_ci minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); 282cabdff1aSopenharmony_ci } 283cabdff1aSopenharmony_ci } 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci /** Clip */ 286cabdff1aSopenharmony_ci minscaler = av_clip(minscaler, SCALE_ONE_POS - SCALE_DIV_512, SCALE_MAX_POS - SCALE_DIV_512); 287cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 288cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) 289cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g]) 290cabdff1aSopenharmony_ci sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF - 1); 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci if (!allz) 293cabdff1aSopenharmony_ci return; 294cabdff1aSopenharmony_ci s->abs_pow34(s->scoefs, sce->coeffs, 1024); 295cabdff1aSopenharmony_ci ff_quantize_band_cost_cache_init(s); 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci for (i = 0; i < sizeof(minsf) / sizeof(minsf[0]); ++i) 298cabdff1aSopenharmony_ci minsf[i] = 0; 299cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 300cabdff1aSopenharmony_ci start = w*128; 301cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 302cabdff1aSopenharmony_ci const float *scaled = s->scoefs + start; 303cabdff1aSopenharmony_ci int minsfidx; 304cabdff1aSopenharmony_ci maxvals[w*16+g] = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled); 305cabdff1aSopenharmony_ci if (maxvals[w*16+g] > 0) { 306cabdff1aSopenharmony_ci minsfidx = coef2minsf(maxvals[w*16+g]); 307cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) 308cabdff1aSopenharmony_ci minsf[(w+w2)*16+g] = minsfidx; 309cabdff1aSopenharmony_ci } 310cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 311cabdff1aSopenharmony_ci } 312cabdff1aSopenharmony_ci } 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci /** 315cabdff1aSopenharmony_ci * Scale uplims to match rate distortion to quality 316cabdff1aSopenharmony_ci * bu applying noisy band depriorization and tonal band priorization. 317cabdff1aSopenharmony_ci * Maxval-energy ratio gives us an idea of how noisy/tonal the band is. 318cabdff1aSopenharmony_ci * If maxval^2 ~ energy, then that band is mostly noise, and we can relax 319cabdff1aSopenharmony_ci * rate distortion requirements. 320cabdff1aSopenharmony_ci */ 321cabdff1aSopenharmony_ci memcpy(euplims, uplims, sizeof(euplims)); 322cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 323cabdff1aSopenharmony_ci /** psy already priorizes transients to some extent */ 324cabdff1aSopenharmony_ci float de_psy_factor = (sce->ics.num_windows > 1) ? 8.0f / sce->ics.group_len[w] : 1.0f; 325cabdff1aSopenharmony_ci start = w*128; 326cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 327cabdff1aSopenharmony_ci if (nzs[g] > 0) { 328cabdff1aSopenharmony_ci float cleanup_factor = ff_sqrf(av_clipf(start / (cutoff * 0.75f), 1.0f, 2.0f)); 329cabdff1aSopenharmony_ci float energy2uplim = find_form_factor( 330cabdff1aSopenharmony_ci sce->ics.group_len[w], sce->ics.swb_sizes[g], 331cabdff1aSopenharmony_ci uplims[w*16+g] / (nzs[g] * sce->ics.swb_sizes[w]), 332cabdff1aSopenharmony_ci sce->coeffs + start, 333cabdff1aSopenharmony_ci nzslope * cleanup_factor); 334cabdff1aSopenharmony_ci energy2uplim *= de_psy_factor; 335cabdff1aSopenharmony_ci if (!(avctx->flags & AV_CODEC_FLAG_QSCALE)) { 336cabdff1aSopenharmony_ci /** In ABR, we need to priorize less and let rate control do its thing */ 337cabdff1aSopenharmony_ci energy2uplim = sqrtf(energy2uplim); 338cabdff1aSopenharmony_ci } 339cabdff1aSopenharmony_ci energy2uplim = FFMAX(0.015625f, FFMIN(1.0f, energy2uplim)); 340cabdff1aSopenharmony_ci uplims[w*16+g] *= av_clipf(rdlambda * energy2uplim, rdmin, rdmax) 341cabdff1aSopenharmony_ci * sce->ics.group_len[w]; 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci energy2uplim = find_form_factor( 344cabdff1aSopenharmony_ci sce->ics.group_len[w], sce->ics.swb_sizes[g], 345cabdff1aSopenharmony_ci uplims[w*16+g] / (nzs[g] * sce->ics.swb_sizes[w]), 346cabdff1aSopenharmony_ci sce->coeffs + start, 347cabdff1aSopenharmony_ci 2.0f); 348cabdff1aSopenharmony_ci energy2uplim *= de_psy_factor; 349cabdff1aSopenharmony_ci if (!(avctx->flags & AV_CODEC_FLAG_QSCALE)) { 350cabdff1aSopenharmony_ci /** In ABR, we need to priorize less and let rate control do its thing */ 351cabdff1aSopenharmony_ci energy2uplim = sqrtf(energy2uplim); 352cabdff1aSopenharmony_ci } 353cabdff1aSopenharmony_ci energy2uplim = FFMAX(0.015625f, FFMIN(1.0f, energy2uplim)); 354cabdff1aSopenharmony_ci euplims[w*16+g] *= av_clipf(rdlambda * energy2uplim * sce->ics.group_len[w], 355cabdff1aSopenharmony_ci 0.5f, 1.0f); 356cabdff1aSopenharmony_ci } 357cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 358cabdff1aSopenharmony_ci } 359cabdff1aSopenharmony_ci } 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_ci for (i = 0; i < sizeof(maxsf) / sizeof(maxsf[0]); ++i) 362cabdff1aSopenharmony_ci maxsf[i] = SCALE_MAX_POS; 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci //perform two-loop search 365cabdff1aSopenharmony_ci //outer loop - improve quality 366cabdff1aSopenharmony_ci do { 367cabdff1aSopenharmony_ci //inner loop - quantize spectrum to fit into given number of bits 368cabdff1aSopenharmony_ci int overdist; 369cabdff1aSopenharmony_ci int qstep = its ? 1 : 32; 370cabdff1aSopenharmony_ci do { 371cabdff1aSopenharmony_ci int changed = 0; 372cabdff1aSopenharmony_ci prev = -1; 373cabdff1aSopenharmony_ci recomprd = 0; 374cabdff1aSopenharmony_ci tbits = 0; 375cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 376cabdff1aSopenharmony_ci start = w*128; 377cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 378cabdff1aSopenharmony_ci const float *coefs = &sce->coeffs[start]; 379cabdff1aSopenharmony_ci const float *scaled = &s->scoefs[start]; 380cabdff1aSopenharmony_ci int bits = 0; 381cabdff1aSopenharmony_ci int cb; 382cabdff1aSopenharmony_ci float dist = 0.0f; 383cabdff1aSopenharmony_ci float qenergy = 0.0f; 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) { 386cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 387cabdff1aSopenharmony_ci if (sce->can_pns[w*16+g]) { 388cabdff1aSopenharmony_ci /** PNS isn't free */ 389cabdff1aSopenharmony_ci tbits += ff_pns_bits(sce, w, g); 390cabdff1aSopenharmony_ci } 391cabdff1aSopenharmony_ci continue; 392cabdff1aSopenharmony_ci } 393cabdff1aSopenharmony_ci cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 394cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 395cabdff1aSopenharmony_ci int b; 396cabdff1aSopenharmony_ci float sqenergy; 397cabdff1aSopenharmony_ci dist += quantize_band_cost_cached(s, w + w2, g, coefs + w2*128, 398cabdff1aSopenharmony_ci scaled + w2*128, 399cabdff1aSopenharmony_ci sce->ics.swb_sizes[g], 400cabdff1aSopenharmony_ci sce->sf_idx[w*16+g], 401cabdff1aSopenharmony_ci cb, 402cabdff1aSopenharmony_ci 1.0f, 403cabdff1aSopenharmony_ci INFINITY, 404cabdff1aSopenharmony_ci &b, &sqenergy, 405cabdff1aSopenharmony_ci 0); 406cabdff1aSopenharmony_ci bits += b; 407cabdff1aSopenharmony_ci qenergy += sqenergy; 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci dists[w*16+g] = dist - bits; 410cabdff1aSopenharmony_ci qenergies[w*16+g] = qenergy; 411cabdff1aSopenharmony_ci if (prev != -1) { 412cabdff1aSopenharmony_ci int sfdiff = av_clip(sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO, 0, 2*SCALE_MAX_DIFF); 413cabdff1aSopenharmony_ci bits += ff_aac_scalefactor_bits[sfdiff]; 414cabdff1aSopenharmony_ci } 415cabdff1aSopenharmony_ci tbits += bits; 416cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 417cabdff1aSopenharmony_ci prev = sce->sf_idx[w*16+g]; 418cabdff1aSopenharmony_ci } 419cabdff1aSopenharmony_ci } 420cabdff1aSopenharmony_ci if (tbits > toomanybits) { 421cabdff1aSopenharmony_ci recomprd = 1; 422cabdff1aSopenharmony_ci for (i = 0; i < 128; i++) { 423cabdff1aSopenharmony_ci if (sce->sf_idx[i] < (SCALE_MAX_POS - SCALE_DIV_512)) { 424cabdff1aSopenharmony_ci int maxsf_i = (tbits > 5800) ? SCALE_MAX_POS : maxsf[i]; 425cabdff1aSopenharmony_ci int new_sf = FFMIN(maxsf_i, sce->sf_idx[i] + qstep); 426cabdff1aSopenharmony_ci if (new_sf != sce->sf_idx[i]) { 427cabdff1aSopenharmony_ci sce->sf_idx[i] = new_sf; 428cabdff1aSopenharmony_ci changed = 1; 429cabdff1aSopenharmony_ci } 430cabdff1aSopenharmony_ci } 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci } else if (tbits < toofewbits) { 433cabdff1aSopenharmony_ci recomprd = 1; 434cabdff1aSopenharmony_ci for (i = 0; i < 128; i++) { 435cabdff1aSopenharmony_ci if (sce->sf_idx[i] > SCALE_ONE_POS) { 436cabdff1aSopenharmony_ci int new_sf = FFMAX3(minsf[i], SCALE_ONE_POS, sce->sf_idx[i] - qstep); 437cabdff1aSopenharmony_ci if (new_sf != sce->sf_idx[i]) { 438cabdff1aSopenharmony_ci sce->sf_idx[i] = new_sf; 439cabdff1aSopenharmony_ci changed = 1; 440cabdff1aSopenharmony_ci } 441cabdff1aSopenharmony_ci } 442cabdff1aSopenharmony_ci } 443cabdff1aSopenharmony_ci } 444cabdff1aSopenharmony_ci qstep >>= 1; 445cabdff1aSopenharmony_ci if (!qstep && tbits > toomanybits && sce->sf_idx[0] < 217 && changed) 446cabdff1aSopenharmony_ci qstep = 1; 447cabdff1aSopenharmony_ci } while (qstep); 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci overdist = 1; 450cabdff1aSopenharmony_ci fflag = tbits < toofewbits; 451cabdff1aSopenharmony_ci for (i = 0; i < 2 && (overdist || recomprd); ++i) { 452cabdff1aSopenharmony_ci if (recomprd) { 453cabdff1aSopenharmony_ci /** Must recompute distortion */ 454cabdff1aSopenharmony_ci prev = -1; 455cabdff1aSopenharmony_ci tbits = 0; 456cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 457cabdff1aSopenharmony_ci start = w*128; 458cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 459cabdff1aSopenharmony_ci const float *coefs = sce->coeffs + start; 460cabdff1aSopenharmony_ci const float *scaled = s->scoefs + start; 461cabdff1aSopenharmony_ci int bits = 0; 462cabdff1aSopenharmony_ci int cb; 463cabdff1aSopenharmony_ci float dist = 0.0f; 464cabdff1aSopenharmony_ci float qenergy = 0.0f; 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_ci if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) { 467cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 468cabdff1aSopenharmony_ci if (sce->can_pns[w*16+g]) { 469cabdff1aSopenharmony_ci /** PNS isn't free */ 470cabdff1aSopenharmony_ci tbits += ff_pns_bits(sce, w, g); 471cabdff1aSopenharmony_ci } 472cabdff1aSopenharmony_ci continue; 473cabdff1aSopenharmony_ci } 474cabdff1aSopenharmony_ci cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 475cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 476cabdff1aSopenharmony_ci int b; 477cabdff1aSopenharmony_ci float sqenergy; 478cabdff1aSopenharmony_ci dist += quantize_band_cost_cached(s, w + w2, g, coefs + w2*128, 479cabdff1aSopenharmony_ci scaled + w2*128, 480cabdff1aSopenharmony_ci sce->ics.swb_sizes[g], 481cabdff1aSopenharmony_ci sce->sf_idx[w*16+g], 482cabdff1aSopenharmony_ci cb, 483cabdff1aSopenharmony_ci 1.0f, 484cabdff1aSopenharmony_ci INFINITY, 485cabdff1aSopenharmony_ci &b, &sqenergy, 486cabdff1aSopenharmony_ci 0); 487cabdff1aSopenharmony_ci bits += b; 488cabdff1aSopenharmony_ci qenergy += sqenergy; 489cabdff1aSopenharmony_ci } 490cabdff1aSopenharmony_ci dists[w*16+g] = dist - bits; 491cabdff1aSopenharmony_ci qenergies[w*16+g] = qenergy; 492cabdff1aSopenharmony_ci if (prev != -1) { 493cabdff1aSopenharmony_ci int sfdiff = av_clip(sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO, 0, 2*SCALE_MAX_DIFF); 494cabdff1aSopenharmony_ci bits += ff_aac_scalefactor_bits[sfdiff]; 495cabdff1aSopenharmony_ci } 496cabdff1aSopenharmony_ci tbits += bits; 497cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 498cabdff1aSopenharmony_ci prev = sce->sf_idx[w*16+g]; 499cabdff1aSopenharmony_ci } 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci } 502cabdff1aSopenharmony_ci if (!i && s->options.pns && its > maxits/2 && tbits > toofewbits) { 503cabdff1aSopenharmony_ci float maxoverdist = 0.0f; 504cabdff1aSopenharmony_ci float ovrfactor = 1.f+(maxits-its)*16.f/maxits; 505cabdff1aSopenharmony_ci overdist = recomprd = 0; 506cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 507cabdff1aSopenharmony_ci for (g = start = 0; g < sce->ics.num_swb; start += sce->ics.swb_sizes[g++]) { 508cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g] && sce->sf_idx[w*16+g] > SCALE_ONE_POS && dists[w*16+g] > uplims[w*16+g]*ovrfactor) { 509cabdff1aSopenharmony_ci float ovrdist = dists[w*16+g] / FFMAX(uplims[w*16+g],euplims[w*16+g]); 510cabdff1aSopenharmony_ci maxoverdist = FFMAX(maxoverdist, ovrdist); 511cabdff1aSopenharmony_ci overdist++; 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci } 514cabdff1aSopenharmony_ci } 515cabdff1aSopenharmony_ci if (overdist) { 516cabdff1aSopenharmony_ci /* We have overdistorted bands, trade for zeroes (that can be noise) 517cabdff1aSopenharmony_ci * Zero the bands in the lowest 1.25% spread-energy-threshold ranking 518cabdff1aSopenharmony_ci */ 519cabdff1aSopenharmony_ci float minspread = max_spread_thr_r; 520cabdff1aSopenharmony_ci float maxspread = min_spread_thr_r; 521cabdff1aSopenharmony_ci float zspread; 522cabdff1aSopenharmony_ci int zeroable = 0; 523cabdff1aSopenharmony_ci int zeroed = 0; 524cabdff1aSopenharmony_ci int maxzeroed, zloop; 525cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 526cabdff1aSopenharmony_ci for (g = start = 0; g < sce->ics.num_swb; start += sce->ics.swb_sizes[g++]) { 527cabdff1aSopenharmony_ci if (start >= pns_start_pos && !sce->zeroes[w*16+g] && sce->can_pns[w*16+g]) { 528cabdff1aSopenharmony_ci minspread = FFMIN(minspread, spread_thr_r[w*16+g]); 529cabdff1aSopenharmony_ci maxspread = FFMAX(maxspread, spread_thr_r[w*16+g]); 530cabdff1aSopenharmony_ci zeroable++; 531cabdff1aSopenharmony_ci } 532cabdff1aSopenharmony_ci } 533cabdff1aSopenharmony_ci } 534cabdff1aSopenharmony_ci zspread = (maxspread-minspread) * 0.0125f + minspread; 535cabdff1aSopenharmony_ci /* Don't PNS everything even if allowed. It suppresses bit starvation signals from RC, 536cabdff1aSopenharmony_ci * and forced the hand of the later search_for_pns step. 537cabdff1aSopenharmony_ci * Instead, PNS a fraction of the spread_thr_r range depending on how starved for bits we are, 538cabdff1aSopenharmony_ci * and leave further PNSing to search_for_pns if worthwhile. 539cabdff1aSopenharmony_ci */ 540cabdff1aSopenharmony_ci zspread = FFMIN3(min_spread_thr_r * 8.f, zspread, 541cabdff1aSopenharmony_ci ((toomanybits - tbits) * min_spread_thr_r + (tbits - toofewbits) * max_spread_thr_r) / (toomanybits - toofewbits + 1)); 542cabdff1aSopenharmony_ci maxzeroed = FFMIN(zeroable, FFMAX(1, (zeroable * its + maxits - 1) / (2 * maxits))); 543cabdff1aSopenharmony_ci for (zloop = 0; zloop < 2; zloop++) { 544cabdff1aSopenharmony_ci /* Two passes: first distorted stuff - two birds in one shot and all that, 545cabdff1aSopenharmony_ci * then anything viable. Viable means not zero, but either CB=zero-able 546cabdff1aSopenharmony_ci * (too high SF), not SF <= 1 (that means we'd be operating at very high 547cabdff1aSopenharmony_ci * quality, we don't want PNS when doing VHQ), PNS allowed, and within 548cabdff1aSopenharmony_ci * the lowest ranking percentile. 549cabdff1aSopenharmony_ci */ 550cabdff1aSopenharmony_ci float loopovrfactor = (zloop) ? 1.0f : ovrfactor; 551cabdff1aSopenharmony_ci int loopminsf = (zloop) ? (SCALE_ONE_POS - SCALE_DIV_512) : SCALE_ONE_POS; 552cabdff1aSopenharmony_ci int mcb; 553cabdff1aSopenharmony_ci for (g = sce->ics.num_swb-1; g > 0 && zeroed < maxzeroed; g--) { 554cabdff1aSopenharmony_ci if (sce->ics.swb_offset[g] < pns_start_pos) 555cabdff1aSopenharmony_ci continue; 556cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 557cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g] && sce->can_pns[w*16+g] && spread_thr_r[w*16+g] <= zspread 558cabdff1aSopenharmony_ci && sce->sf_idx[w*16+g] > loopminsf 559cabdff1aSopenharmony_ci && (dists[w*16+g] > loopovrfactor*uplims[w*16+g] || !(mcb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g])) 560cabdff1aSopenharmony_ci || (mcb <= 1 && dists[w*16+g] > FFMIN(uplims[w*16+g], euplims[w*16+g]))) ) { 561cabdff1aSopenharmony_ci sce->zeroes[w*16+g] = 1; 562cabdff1aSopenharmony_ci sce->band_type[w*16+g] = 0; 563cabdff1aSopenharmony_ci zeroed++; 564cabdff1aSopenharmony_ci } 565cabdff1aSopenharmony_ci } 566cabdff1aSopenharmony_ci } 567cabdff1aSopenharmony_ci } 568cabdff1aSopenharmony_ci if (zeroed) 569cabdff1aSopenharmony_ci recomprd = fflag = 1; 570cabdff1aSopenharmony_ci } else { 571cabdff1aSopenharmony_ci overdist = 0; 572cabdff1aSopenharmony_ci } 573cabdff1aSopenharmony_ci } 574cabdff1aSopenharmony_ci } 575cabdff1aSopenharmony_ci 576cabdff1aSopenharmony_ci minscaler = SCALE_MAX_POS; 577cabdff1aSopenharmony_ci maxscaler = 0; 578cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 579cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 580cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g]) { 581cabdff1aSopenharmony_ci minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); 582cabdff1aSopenharmony_ci maxscaler = FFMAX(maxscaler, sce->sf_idx[w*16+g]); 583cabdff1aSopenharmony_ci } 584cabdff1aSopenharmony_ci } 585cabdff1aSopenharmony_ci } 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci minscaler = nminscaler = av_clip(minscaler, SCALE_ONE_POS - SCALE_DIV_512, SCALE_MAX_POS - SCALE_DIV_512); 588cabdff1aSopenharmony_ci prev = -1; 589cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 590cabdff1aSopenharmony_ci /** Start with big steps, end up fine-tunning */ 591cabdff1aSopenharmony_ci int depth = (its > maxits/2) ? ((its > maxits*2/3) ? 1 : 3) : 10; 592cabdff1aSopenharmony_ci int edepth = depth+2; 593cabdff1aSopenharmony_ci float uplmax = its / (maxits*0.25f) + 1.0f; 594cabdff1aSopenharmony_ci uplmax *= (tbits > destbits) ? FFMIN(2.0f, tbits / (float)FFMAX(1,destbits)) : 1.0f; 595cabdff1aSopenharmony_ci start = w * 128; 596cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 597cabdff1aSopenharmony_ci int prevsc = sce->sf_idx[w*16+g]; 598cabdff1aSopenharmony_ci if (prev < 0 && !sce->zeroes[w*16+g]) 599cabdff1aSopenharmony_ci prev = sce->sf_idx[0]; 600cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g]) { 601cabdff1aSopenharmony_ci const float *coefs = sce->coeffs + start; 602cabdff1aSopenharmony_ci const float *scaled = s->scoefs + start; 603cabdff1aSopenharmony_ci int cmb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 604cabdff1aSopenharmony_ci int mindeltasf = FFMAX(0, prev - SCALE_MAX_DIFF); 605cabdff1aSopenharmony_ci int maxdeltasf = FFMIN(SCALE_MAX_POS - SCALE_DIV_512, prev + SCALE_MAX_DIFF); 606cabdff1aSopenharmony_ci if ((!cmb || dists[w*16+g] > uplims[w*16+g]) && sce->sf_idx[w*16+g] > FFMAX(mindeltasf, minsf[w*16+g])) { 607cabdff1aSopenharmony_ci /* Try to make sure there is some energy in every nonzero band 608cabdff1aSopenharmony_ci * NOTE: This algorithm must be forcibly imbalanced, pushing harder 609cabdff1aSopenharmony_ci * on holes or more distorted bands at first, otherwise there's 610cabdff1aSopenharmony_ci * no net gain (since the next iteration will offset all bands 611cabdff1aSopenharmony_ci * on the opposite direction to compensate for extra bits) 612cabdff1aSopenharmony_ci */ 613cabdff1aSopenharmony_ci for (i = 0; i < edepth && sce->sf_idx[w*16+g] > mindeltasf; ++i) { 614cabdff1aSopenharmony_ci int cb, bits; 615cabdff1aSopenharmony_ci float dist, qenergy; 616cabdff1aSopenharmony_ci int mb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1); 617cabdff1aSopenharmony_ci cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 618cabdff1aSopenharmony_ci dist = qenergy = 0.f; 619cabdff1aSopenharmony_ci bits = 0; 620cabdff1aSopenharmony_ci if (!cb) { 621cabdff1aSopenharmony_ci maxsf[w*16+g] = FFMIN(sce->sf_idx[w*16+g]-1, maxsf[w*16+g]); 622cabdff1aSopenharmony_ci } else if (i >= depth && dists[w*16+g] < euplims[w*16+g]) { 623cabdff1aSopenharmony_ci break; 624cabdff1aSopenharmony_ci } 625cabdff1aSopenharmony_ci /* !g is the DC band, it's important, since quantization error here 626cabdff1aSopenharmony_ci * applies to less than a cycle, it creates horrible intermodulation 627cabdff1aSopenharmony_ci * distortion if it doesn't stick to what psy requests 628cabdff1aSopenharmony_ci */ 629cabdff1aSopenharmony_ci if (!g && sce->ics.num_windows > 1 && dists[w*16+g] >= euplims[w*16+g]) 630cabdff1aSopenharmony_ci maxsf[w*16+g] = FFMIN(sce->sf_idx[w*16+g], maxsf[w*16+g]); 631cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 632cabdff1aSopenharmony_ci int b; 633cabdff1aSopenharmony_ci float sqenergy; 634cabdff1aSopenharmony_ci dist += quantize_band_cost_cached(s, w + w2, g, coefs + w2*128, 635cabdff1aSopenharmony_ci scaled + w2*128, 636cabdff1aSopenharmony_ci sce->ics.swb_sizes[g], 637cabdff1aSopenharmony_ci sce->sf_idx[w*16+g]-1, 638cabdff1aSopenharmony_ci cb, 639cabdff1aSopenharmony_ci 1.0f, 640cabdff1aSopenharmony_ci INFINITY, 641cabdff1aSopenharmony_ci &b, &sqenergy, 642cabdff1aSopenharmony_ci 0); 643cabdff1aSopenharmony_ci bits += b; 644cabdff1aSopenharmony_ci qenergy += sqenergy; 645cabdff1aSopenharmony_ci } 646cabdff1aSopenharmony_ci sce->sf_idx[w*16+g]--; 647cabdff1aSopenharmony_ci dists[w*16+g] = dist - bits; 648cabdff1aSopenharmony_ci qenergies[w*16+g] = qenergy; 649cabdff1aSopenharmony_ci if (mb && (sce->sf_idx[w*16+g] < mindeltasf || ( 650cabdff1aSopenharmony_ci (dists[w*16+g] < FFMIN(uplmax*uplims[w*16+g], euplims[w*16+g])) 651cabdff1aSopenharmony_ci && (fabsf(qenergies[w*16+g]-energies[w*16+g]) < euplims[w*16+g]) 652cabdff1aSopenharmony_ci ) )) { 653cabdff1aSopenharmony_ci break; 654cabdff1aSopenharmony_ci } 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci } else if (tbits > toofewbits && sce->sf_idx[w*16+g] < FFMIN(maxdeltasf, maxsf[w*16+g]) 657cabdff1aSopenharmony_ci && (dists[w*16+g] < FFMIN(euplims[w*16+g], uplims[w*16+g])) 658cabdff1aSopenharmony_ci && (fabsf(qenergies[w*16+g]-energies[w*16+g]) < euplims[w*16+g]) 659cabdff1aSopenharmony_ci ) { 660cabdff1aSopenharmony_ci /** Um... over target. Save bits for more important stuff. */ 661cabdff1aSopenharmony_ci for (i = 0; i < depth && sce->sf_idx[w*16+g] < maxdeltasf; ++i) { 662cabdff1aSopenharmony_ci int cb, bits; 663cabdff1aSopenharmony_ci float dist, qenergy; 664cabdff1aSopenharmony_ci cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]+1); 665cabdff1aSopenharmony_ci if (cb > 0) { 666cabdff1aSopenharmony_ci dist = qenergy = 0.f; 667cabdff1aSopenharmony_ci bits = 0; 668cabdff1aSopenharmony_ci for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 669cabdff1aSopenharmony_ci int b; 670cabdff1aSopenharmony_ci float sqenergy; 671cabdff1aSopenharmony_ci dist += quantize_band_cost_cached(s, w + w2, g, coefs + w2*128, 672cabdff1aSopenharmony_ci scaled + w2*128, 673cabdff1aSopenharmony_ci sce->ics.swb_sizes[g], 674cabdff1aSopenharmony_ci sce->sf_idx[w*16+g]+1, 675cabdff1aSopenharmony_ci cb, 676cabdff1aSopenharmony_ci 1.0f, 677cabdff1aSopenharmony_ci INFINITY, 678cabdff1aSopenharmony_ci &b, &sqenergy, 679cabdff1aSopenharmony_ci 0); 680cabdff1aSopenharmony_ci bits += b; 681cabdff1aSopenharmony_ci qenergy += sqenergy; 682cabdff1aSopenharmony_ci } 683cabdff1aSopenharmony_ci dist -= bits; 684cabdff1aSopenharmony_ci if (dist < FFMIN(euplims[w*16+g], uplims[w*16+g])) { 685cabdff1aSopenharmony_ci sce->sf_idx[w*16+g]++; 686cabdff1aSopenharmony_ci dists[w*16+g] = dist; 687cabdff1aSopenharmony_ci qenergies[w*16+g] = qenergy; 688cabdff1aSopenharmony_ci } else { 689cabdff1aSopenharmony_ci break; 690cabdff1aSopenharmony_ci } 691cabdff1aSopenharmony_ci } else { 692cabdff1aSopenharmony_ci maxsf[w*16+g] = FFMIN(sce->sf_idx[w*16+g], maxsf[w*16+g]); 693cabdff1aSopenharmony_ci break; 694cabdff1aSopenharmony_ci } 695cabdff1aSopenharmony_ci } 696cabdff1aSopenharmony_ci } 697cabdff1aSopenharmony_ci prev = sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], mindeltasf, maxdeltasf); 698cabdff1aSopenharmony_ci if (sce->sf_idx[w*16+g] != prevsc) 699cabdff1aSopenharmony_ci fflag = 1; 700cabdff1aSopenharmony_ci nminscaler = FFMIN(nminscaler, sce->sf_idx[w*16+g]); 701cabdff1aSopenharmony_ci sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 702cabdff1aSopenharmony_ci } 703cabdff1aSopenharmony_ci start += sce->ics.swb_sizes[g]; 704cabdff1aSopenharmony_ci } 705cabdff1aSopenharmony_ci } 706cabdff1aSopenharmony_ci 707cabdff1aSopenharmony_ci /** SF difference limit violation risk. Must re-clamp. */ 708cabdff1aSopenharmony_ci prev = -1; 709cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 710cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 711cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g]) { 712cabdff1aSopenharmony_ci int prevsf = sce->sf_idx[w*16+g]; 713cabdff1aSopenharmony_ci if (prev < 0) 714cabdff1aSopenharmony_ci prev = prevsf; 715cabdff1aSopenharmony_ci sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], prev - SCALE_MAX_DIFF, prev + SCALE_MAX_DIFF); 716cabdff1aSopenharmony_ci sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 717cabdff1aSopenharmony_ci prev = sce->sf_idx[w*16+g]; 718cabdff1aSopenharmony_ci if (!fflag && prevsf != sce->sf_idx[w*16+g]) 719cabdff1aSopenharmony_ci fflag = 1; 720cabdff1aSopenharmony_ci } 721cabdff1aSopenharmony_ci } 722cabdff1aSopenharmony_ci } 723cabdff1aSopenharmony_ci 724cabdff1aSopenharmony_ci its++; 725cabdff1aSopenharmony_ci } while (fflag && its < maxits); 726cabdff1aSopenharmony_ci 727cabdff1aSopenharmony_ci /** Scout out next nonzero bands */ 728cabdff1aSopenharmony_ci ff_init_nextband_map(sce, nextband); 729cabdff1aSopenharmony_ci 730cabdff1aSopenharmony_ci prev = -1; 731cabdff1aSopenharmony_ci for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 732cabdff1aSopenharmony_ci /** Make sure proper codebooks are set */ 733cabdff1aSopenharmony_ci for (g = 0; g < sce->ics.num_swb; g++) { 734cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g]) { 735cabdff1aSopenharmony_ci sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 736cabdff1aSopenharmony_ci if (sce->band_type[w*16+g] <= 0) { 737cabdff1aSopenharmony_ci if (!ff_sfdelta_can_remove_band(sce, nextband, prev, w*16+g)) { 738cabdff1aSopenharmony_ci /** Cannot zero out, make sure it's not attempted */ 739cabdff1aSopenharmony_ci sce->band_type[w*16+g] = 1; 740cabdff1aSopenharmony_ci } else { 741cabdff1aSopenharmony_ci sce->zeroes[w*16+g] = 1; 742cabdff1aSopenharmony_ci sce->band_type[w*16+g] = 0; 743cabdff1aSopenharmony_ci } 744cabdff1aSopenharmony_ci } 745cabdff1aSopenharmony_ci } else { 746cabdff1aSopenharmony_ci sce->band_type[w*16+g] = 0; 747cabdff1aSopenharmony_ci } 748cabdff1aSopenharmony_ci /** Check that there's no SF delta range violations */ 749cabdff1aSopenharmony_ci if (!sce->zeroes[w*16+g]) { 750cabdff1aSopenharmony_ci if (prev != -1) { 751cabdff1aSopenharmony_ci av_unused int sfdiff = sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO; 752cabdff1aSopenharmony_ci av_assert1(sfdiff >= 0 && sfdiff <= 2*SCALE_MAX_DIFF); 753cabdff1aSopenharmony_ci } else if (sce->zeroes[0]) { 754cabdff1aSopenharmony_ci /** Set global gain to something useful */ 755cabdff1aSopenharmony_ci sce->sf_idx[0] = sce->sf_idx[w*16+g]; 756cabdff1aSopenharmony_ci } 757cabdff1aSopenharmony_ci prev = sce->sf_idx[w*16+g]; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci } 761cabdff1aSopenharmony_ci} 762cabdff1aSopenharmony_ci 763cabdff1aSopenharmony_ci#endif /* AVCODEC_AACCODER_TWOLOOP_H */ 764