LCOV - code coverage report
Current view: top level - libavcodec - aaccoder.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 254 546 46.5 %
Date: 2017-12-18 13:19:42 Functions: 4 7 57.1 %

          Line data    Source code
       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             : #include "aacenc_ltp.h"
      51             : #include "aacenc_pred.h"
      52             : 
      53             : #include "libavcodec/aaccoder_twoloop.h"
      54             : 
      55             : /* Parameter of f(x) = a*(lambda/100), defines the maximum fourier spread
      56             :  * beyond which no PNS is used (since the SFBs contain tone rather than noise) */
      57             : #define NOISE_SPREAD_THRESHOLD 0.9f
      58             : 
      59             : /* Parameter of f(x) = a*(100/lambda), defines how much PNS is allowed to
      60             :  * replace low energy non zero bands */
      61             : #define NOISE_LAMBDA_REPLACE 1.948f
      62             : 
      63             : #include "libavcodec/aaccoder_trellis.h"
      64             : 
      65             : /**
      66             :  * structure used in optimal codebook search
      67             :  */
      68             : typedef struct BandCodingPath {
      69             :     int prev_idx; ///< pointer to the previous path point
      70             :     float cost;   ///< path cost
      71             :     int run;
      72             : } BandCodingPath;
      73             : 
      74             : /**
      75             :  * Encode band info for single window group bands.
      76             :  */
      77           0 : static void encode_window_bands_info(AACEncContext *s, SingleChannelElement *sce,
      78             :                                      int win, int group_len, const float lambda)
      79             : {
      80             :     BandCodingPath path[120][CB_TOT_ALL];
      81             :     int w, swb, cb, start, size;
      82             :     int i, j;
      83           0 :     const int max_sfb  = sce->ics.max_sfb;
      84           0 :     const int run_bits = sce->ics.num_windows == 1 ? 5 : 3;
      85           0 :     const int run_esc  = (1 << run_bits) - 1;
      86             :     int idx, ppos, count;
      87             :     int stackrun[120], stackcb[120], stack_len;
      88           0 :     float next_minrd = INFINITY;
      89           0 :     int next_mincb = 0;
      90             : 
      91           0 :     s->abs_pow34(s->scoefs, sce->coeffs, 1024);
      92           0 :     start = win*128;
      93           0 :     for (cb = 0; cb < CB_TOT_ALL; cb++) {
      94           0 :         path[0][cb].cost     = 0.0f;
      95           0 :         path[0][cb].prev_idx = -1;
      96           0 :         path[0][cb].run      = 0;
      97             :     }
      98           0 :     for (swb = 0; swb < max_sfb; swb++) {
      99           0 :         size = sce->ics.swb_sizes[swb];
     100           0 :         if (sce->zeroes[win*16 + swb]) {
     101           0 :             for (cb = 0; cb < CB_TOT_ALL; cb++) {
     102           0 :                 path[swb+1][cb].prev_idx = cb;
     103           0 :                 path[swb+1][cb].cost     = path[swb][cb].cost;
     104           0 :                 path[swb+1][cb].run      = path[swb][cb].run + 1;
     105             :             }
     106             :         } else {
     107           0 :             float minrd = next_minrd;
     108           0 :             int mincb = next_mincb;
     109           0 :             next_minrd = INFINITY;
     110           0 :             next_mincb = 0;
     111           0 :             for (cb = 0; cb < CB_TOT_ALL; cb++) {
     112             :                 float cost_stay_here, cost_get_here;
     113           0 :                 float rd = 0.0f;
     114           0 :                 if (cb >= 12 && sce->band_type[win*16+swb] < aac_cb_out_map[cb] ||
     115           0 :                     cb  < aac_cb_in_map[sce->band_type[win*16+swb]] && sce->band_type[win*16+swb] > aac_cb_out_map[cb]) {
     116           0 :                     path[swb+1][cb].prev_idx = -1;
     117           0 :                     path[swb+1][cb].cost     = INFINITY;
     118           0 :                     path[swb+1][cb].run      = path[swb][cb].run + 1;
     119           0 :                     continue;
     120             :                 }
     121           0 :                 for (w = 0; w < group_len; w++) {
     122           0 :                     FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(win+w)*16+swb];
     123           0 :                     rd += quantize_band_cost(s, &sce->coeffs[start + w*128],
     124           0 :                                              &s->scoefs[start + w*128], size,
     125           0 :                                              sce->sf_idx[(win+w)*16+swb], aac_cb_out_map[cb],
     126           0 :                                              lambda / band->threshold, INFINITY, NULL, NULL, 0);
     127             :                 }
     128           0 :                 cost_stay_here = path[swb][cb].cost + rd;
     129           0 :                 cost_get_here  = minrd              + rd + run_bits + 4;
     130           0 :                 if (   run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run]
     131           0 :                     != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1])
     132           0 :                     cost_stay_here += run_bits;
     133           0 :                 if (cost_get_here < cost_stay_here) {
     134           0 :                     path[swb+1][cb].prev_idx = mincb;
     135           0 :                     path[swb+1][cb].cost     = cost_get_here;
     136           0 :                     path[swb+1][cb].run      = 1;
     137             :                 } else {
     138           0 :                     path[swb+1][cb].prev_idx = cb;
     139           0 :                     path[swb+1][cb].cost     = cost_stay_here;
     140           0 :                     path[swb+1][cb].run      = path[swb][cb].run + 1;
     141             :                 }
     142           0 :                 if (path[swb+1][cb].cost < next_minrd) {
     143           0 :                     next_minrd = path[swb+1][cb].cost;
     144           0 :                     next_mincb = cb;
     145             :                 }
     146             :             }
     147             :         }
     148           0 :         start += sce->ics.swb_sizes[swb];
     149             :     }
     150             : 
     151             :     //convert resulting path from backward-linked list
     152           0 :     stack_len = 0;
     153           0 :     idx       = 0;
     154           0 :     for (cb = 1; cb < CB_TOT_ALL; cb++)
     155           0 :         if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
     156           0 :             idx = cb;
     157           0 :     ppos = max_sfb;
     158           0 :     while (ppos > 0) {
     159             :         av_assert1(idx >= 0);
     160           0 :         cb = idx;
     161           0 :         stackrun[stack_len] = path[ppos][cb].run;
     162           0 :         stackcb [stack_len] = cb;
     163           0 :         idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx;
     164           0 :         ppos -= path[ppos][cb].run;
     165           0 :         stack_len++;
     166             :     }
     167             :     //perform actual band info encoding
     168           0 :     start = 0;
     169           0 :     for (i = stack_len - 1; i >= 0; i--) {
     170           0 :         cb = aac_cb_out_map[stackcb[i]];
     171           0 :         put_bits(&s->pb, 4, cb);
     172           0 :         count = stackrun[i];
     173           0 :         memset(sce->zeroes + win*16 + start, !cb, count);
     174             :         //XXX: memset when band_type is also uint8_t
     175           0 :         for (j = 0; j < count; j++) {
     176           0 :             sce->band_type[win*16 + start] = cb;
     177           0 :             start++;
     178             :         }
     179           0 :         while (count >= run_esc) {
     180           0 :             put_bits(&s->pb, run_bits, run_esc);
     181           0 :             count -= run_esc;
     182             :         }
     183           0 :         put_bits(&s->pb, run_bits, count);
     184             :     }
     185           0 : }
     186             : 
     187             : 
     188             : typedef struct TrellisPath {
     189             :     float cost;
     190             :     int prev;
     191             : } TrellisPath;
     192             : 
     193             : #define TRELLIS_STAGES 121
     194             : #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
     195             : 
     196       12125 : static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement *sce)
     197             : {
     198             :     int w, g;
     199       12125 :     int prevscaler_n = -255, prevscaler_i = 0;
     200       12125 :     int bands = 0;
     201             : 
     202       25026 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     203      605171 :         for (g = 0; g < sce->ics.num_swb; g++) {
     204      592270 :             if (sce->zeroes[w*16+g])
     205       34153 :                 continue;
     206      558117 :             if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
     207        8320 :                 sce->sf_idx[w*16+g] = av_clip(roundf(log2f(sce->is_ener[w*16+g])*2), -155, 100);
     208        8320 :                 bands++;
     209      549797 :             } else if (sce->band_type[w*16+g] == NOISE_BT) {
     210       15417 :                 sce->sf_idx[w*16+g] = av_clip(3+ceilf(log2f(sce->pns_ener[w*16+g])*2), -100, 155);
     211       15417 :                 if (prevscaler_n == -255)
     212        1199 :                     prevscaler_n = sce->sf_idx[w*16+g];
     213       15417 :                 bands++;
     214             :             }
     215             :         }
     216             :     }
     217             : 
     218       12125 :     if (!bands)
     219       10414 :         return;
     220             : 
     221             :     /* Clip the scalefactor indices */
     222        3526 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     223       85850 :         for (g = 0; g < sce->ics.num_swb; g++) {
     224       84035 :             if (sce->zeroes[w*16+g])
     225        4271 :                 continue;
     226       79764 :             if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
     227        8320 :                 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);
     228       71444 :             } else if (sce->band_type[w*16+g] == NOISE_BT) {
     229       15417 :                 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);
     230             :             }
     231             :         }
     232             :     }
     233             : }
     234             : 
     235           0 : static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s,
     236             :                                        SingleChannelElement *sce,
     237             :                                        const float lambda)
     238             : {
     239           0 :     int q, w, w2, g, start = 0;
     240             :     int i, j;
     241             :     int idx;
     242             :     TrellisPath paths[TRELLIS_STAGES][TRELLIS_STATES];
     243             :     int bandaddr[TRELLIS_STAGES];
     244             :     int minq;
     245             :     float mincost;
     246           0 :     float q0f = FLT_MAX, q1f = 0.0f, qnrgf = 0.0f;
     247           0 :     int q0, q1, qcnt = 0;
     248             : 
     249           0 :     for (i = 0; i < 1024; i++) {
     250           0 :         float t = fabsf(sce->coeffs[i]);
     251           0 :         if (t > 0.0f) {
     252           0 :             q0f = FFMIN(q0f, t);
     253           0 :             q1f = FFMAX(q1f, t);
     254           0 :             qnrgf += t*t;
     255           0 :             qcnt++;
     256             :         }
     257             :     }
     258             : 
     259           0 :     if (!qcnt) {
     260           0 :         memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
     261           0 :         memset(sce->zeroes, 1, sizeof(sce->zeroes));
     262           0 :         return;
     263             :     }
     264             : 
     265             :     //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
     266           0 :     q0 = av_clip(coef2minsf(q0f), 0, SCALE_MAX_POS-1);
     267             :     //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
     268           0 :     q1 = av_clip(coef2maxsf(q1f), 1, SCALE_MAX_POS);
     269           0 :     if (q1 - q0 > 60) {
     270           0 :         int q0low  = q0;
     271           0 :         int q1high = q1;
     272             :         //minimum scalefactor index is when maximum nonzero coefficient after quantizing is not clipped
     273           0 :         int qnrg = av_clip_uint8(log2f(sqrtf(qnrgf/qcnt))*4 - 31 + SCALE_ONE_POS - SCALE_DIV_512);
     274           0 :         q1 = qnrg + 30;
     275           0 :         q0 = qnrg - 30;
     276           0 :         if (q0 < q0low) {
     277           0 :             q1 += q0low - q0;
     278           0 :             q0  = q0low;
     279           0 :         } else if (q1 > q1high) {
     280           0 :             q0 -= q1 - q1high;
     281           0 :             q1  = q1high;
     282             :         }
     283             :     }
     284             :     // q0 == q1 isn't really a legal situation
     285           0 :     if (q0 == q1) {
     286             :         // the following is indirect but guarantees q1 != q0 && q1 near q0
     287           0 :         q1 = av_clip(q0+1, 1, SCALE_MAX_POS);
     288           0 :         q0 = av_clip(q1-1, 0, SCALE_MAX_POS - 1);
     289             :     }
     290             : 
     291           0 :     for (i = 0; i < TRELLIS_STATES; i++) {
     292           0 :         paths[0][i].cost    = 0.0f;
     293           0 :         paths[0][i].prev    = -1;
     294             :     }
     295           0 :     for (j = 1; j < TRELLIS_STAGES; j++) {
     296           0 :         for (i = 0; i < TRELLIS_STATES; i++) {
     297           0 :             paths[j][i].cost    = INFINITY;
     298           0 :             paths[j][i].prev    = -2;
     299             :         }
     300             :     }
     301           0 :     idx = 1;
     302           0 :     s->abs_pow34(s->scoefs, sce->coeffs, 1024);
     303           0 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     304           0 :         start = w*128;
     305           0 :         for (g = 0; g < sce->ics.num_swb; g++) {
     306           0 :             const float *coefs = &sce->coeffs[start];
     307             :             float qmin, qmax;
     308           0 :             int nz = 0;
     309             : 
     310           0 :             bandaddr[idx] = w * 16 + g;
     311           0 :             qmin = INT_MAX;
     312           0 :             qmax = 0.0f;
     313           0 :             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     314           0 :                 FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     315           0 :                 if (band->energy <= band->threshold || band->threshold == 0.0f) {
     316           0 :                     sce->zeroes[(w+w2)*16+g] = 1;
     317           0 :                     continue;
     318             :                 }
     319           0 :                 sce->zeroes[(w+w2)*16+g] = 0;
     320           0 :                 nz = 1;
     321           0 :                 for (i = 0; i < sce->ics.swb_sizes[g]; i++) {
     322           0 :                     float t = fabsf(coefs[w2*128+i]);
     323           0 :                     if (t > 0.0f)
     324           0 :                         qmin = FFMIN(qmin, t);
     325           0 :                     qmax = FFMAX(qmax, t);
     326             :                 }
     327             :             }
     328           0 :             if (nz) {
     329             :                 int minscale, maxscale;
     330           0 :                 float minrd = INFINITY;
     331             :                 float maxval;
     332             :                 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
     333           0 :                 minscale = coef2minsf(qmin);
     334             :                 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
     335           0 :                 maxscale = coef2maxsf(qmax);
     336           0 :                 minscale = av_clip(minscale - q0, 0, TRELLIS_STATES - 1);
     337           0 :                 maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES);
     338           0 :                 if (minscale == maxscale) {
     339           0 :                     maxscale = av_clip(minscale+1, 1, TRELLIS_STATES);
     340           0 :                     minscale = av_clip(maxscale-1, 0, TRELLIS_STATES - 1);
     341             :                 }
     342           0 :                 maxval = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start);
     343           0 :                 for (q = minscale; q < maxscale; q++) {
     344           0 :                     float dist = 0;
     345           0 :                     int cb = find_min_book(maxval, sce->sf_idx[w*16+g]);
     346           0 :                     for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     347           0 :                         FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     348           0 :                         dist += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g],
     349           0 :                                                    q + q0, cb, lambda / band->threshold, INFINITY, NULL, NULL, 0);
     350             :                     }
     351           0 :                     minrd = FFMIN(minrd, dist);
     352             : 
     353           0 :                     for (i = 0; i < q1 - q0; i++) {
     354             :                         float cost;
     355           0 :                         cost = paths[idx - 1][i].cost + dist
     356           0 :                                + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO];
     357           0 :                         if (cost < paths[idx][q].cost) {
     358           0 :                             paths[idx][q].cost    = cost;
     359           0 :                             paths[idx][q].prev    = i;
     360             :                         }
     361             :                     }
     362             :                 }
     363             :             } else {
     364           0 :                 for (q = 0; q < q1 - q0; q++) {
     365           0 :                     paths[idx][q].cost = paths[idx - 1][q].cost + 1;
     366           0 :                     paths[idx][q].prev = q;
     367             :                 }
     368             :             }
     369           0 :             sce->zeroes[w*16+g] = !nz;
     370           0 :             start += sce->ics.swb_sizes[g];
     371           0 :             idx++;
     372             :         }
     373             :     }
     374           0 :     idx--;
     375           0 :     mincost = paths[idx][0].cost;
     376           0 :     minq    = 0;
     377           0 :     for (i = 1; i < TRELLIS_STATES; i++) {
     378           0 :         if (paths[idx][i].cost < mincost) {
     379           0 :             mincost = paths[idx][i].cost;
     380           0 :             minq = i;
     381             :         }
     382             :     }
     383           0 :     while (idx) {
     384           0 :         sce->sf_idx[bandaddr[idx]] = minq + q0;
     385           0 :         minq = FFMAX(paths[idx][minq].prev, 0);
     386           0 :         idx--;
     387             :     }
     388             :     //set the same quantizers inside window groups
     389           0 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
     390           0 :         for (g = 0; g < sce->ics.num_swb; g++)
     391           0 :             for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
     392           0 :                 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
     393             : }
     394             : 
     395           0 : static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s,
     396             :                                        SingleChannelElement *sce,
     397             :                                        const float lambda)
     398             : {
     399           0 :     int start = 0, i, w, w2, g;
     400           0 :     int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels * (lambda / 120.f);
     401           0 :     float dists[128] = { 0 }, uplims[128] = { 0 };
     402             :     float maxvals[128];
     403             :     int fflag, minscaler;
     404           0 :     int its  = 0;
     405           0 :     int allz = 0;
     406           0 :     float minthr = INFINITY;
     407             : 
     408             :     // for values above this the decoder might end up in an endless loop
     409             :     // due to always having more bits than what can be encoded.
     410           0 :     destbits = FFMIN(destbits, 5800);
     411             :     //some heuristic to determine initial quantizers will reduce search time
     412             :     //determine zero bands and upper limits
     413           0 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     414           0 :         start = 0;
     415           0 :         for (g = 0; g < sce->ics.num_swb; g++) {
     416           0 :             int nz = 0;
     417           0 :             float uplim = 0.0f, energy = 0.0f;
     418           0 :             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     419           0 :                 FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     420           0 :                 uplim += band->threshold;
     421           0 :                 energy += band->energy;
     422           0 :                 if (band->energy <= band->threshold || band->threshold == 0.0f) {
     423           0 :                     sce->zeroes[(w+w2)*16+g] = 1;
     424           0 :                     continue;
     425             :                 }
     426           0 :                 nz = 1;
     427             :             }
     428           0 :             uplims[w*16+g] = uplim *512;
     429           0 :             sce->band_type[w*16+g] = 0;
     430           0 :             sce->zeroes[w*16+g] = !nz;
     431           0 :             if (nz)
     432           0 :                 minthr = FFMIN(minthr, uplim);
     433           0 :             allz |= nz;
     434           0 :             start += sce->ics.swb_sizes[g];
     435             :         }
     436             :     }
     437           0 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     438           0 :         for (g = 0; g < sce->ics.num_swb; g++) {
     439           0 :             if (sce->zeroes[w*16+g]) {
     440           0 :                 sce->sf_idx[w*16+g] = SCALE_ONE_POS;
     441           0 :                 continue;
     442             :             }
     443           0 :             sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59);
     444             :         }
     445             :     }
     446             : 
     447           0 :     if (!allz)
     448           0 :         return;
     449           0 :     s->abs_pow34(s->scoefs, sce->coeffs, 1024);
     450           0 :     ff_quantize_band_cost_cache_init(s);
     451             : 
     452           0 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     453           0 :         start = w*128;
     454           0 :         for (g = 0; g < sce->ics.num_swb; g++) {
     455           0 :             const float *scaled = s->scoefs + start;
     456           0 :             maxvals[w*16+g] = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled);
     457           0 :             start += sce->ics.swb_sizes[g];
     458             :         }
     459             :     }
     460             : 
     461             :     //perform two-loop search
     462             :     //outer loop - improve quality
     463             :     do {
     464             :         int tbits, qstep;
     465           0 :         minscaler = sce->sf_idx[0];
     466             :         //inner loop - quantize spectrum to fit into given number of bits
     467           0 :         qstep = its ? 1 : 32;
     468             :         do {
     469           0 :             int prev = -1;
     470           0 :             tbits = 0;
     471           0 :             for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     472           0 :                 start = w*128;
     473           0 :                 for (g = 0; g < sce->ics.num_swb; g++) {
     474           0 :                     const float *coefs = sce->coeffs + start;
     475           0 :                     const float *scaled = s->scoefs + start;
     476           0 :                     int bits = 0;
     477             :                     int cb;
     478           0 :                     float dist = 0.0f;
     479             : 
     480           0 :                     if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) {
     481           0 :                         start += sce->ics.swb_sizes[g];
     482           0 :                         continue;
     483             :                     }
     484           0 :                     minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
     485           0 :                     cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
     486           0 :                     for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     487             :                         int b;
     488           0 :                         dist += quantize_band_cost_cached(s, w + w2, g,
     489             :                                                           coefs + w2*128,
     490             :                                                           scaled + w2*128,
     491           0 :                                                           sce->ics.swb_sizes[g],
     492           0 :                                                           sce->sf_idx[w*16+g],
     493             :                                                           cb, 1.0f, INFINITY,
     494             :                                                           &b, NULL, 0);
     495           0 :                         bits += b;
     496             :                     }
     497           0 :                     dists[w*16+g] = dist - bits;
     498           0 :                     if (prev != -1) {
     499           0 :                         bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO];
     500             :                     }
     501           0 :                     tbits += bits;
     502           0 :                     start += sce->ics.swb_sizes[g];
     503           0 :                     prev = sce->sf_idx[w*16+g];
     504             :                 }
     505             :             }
     506           0 :             if (tbits > destbits) {
     507           0 :                 for (i = 0; i < 128; i++)
     508           0 :                     if (sce->sf_idx[i] < 218 - qstep)
     509           0 :                         sce->sf_idx[i] += qstep;
     510             :             } else {
     511           0 :                 for (i = 0; i < 128; i++)
     512           0 :                     if (sce->sf_idx[i] > 60 - qstep)
     513           0 :                         sce->sf_idx[i] -= qstep;
     514             :             }
     515           0 :             qstep >>= 1;
     516           0 :             if (!qstep && tbits > destbits*1.02 && sce->sf_idx[0] < 217)
     517           0 :                 qstep = 1;
     518           0 :         } while (qstep);
     519             : 
     520           0 :         fflag = 0;
     521           0 :         minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF);
     522             : 
     523           0 :         for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     524           0 :             for (g = 0; g < sce->ics.num_swb; g++) {
     525           0 :                 int prevsc = sce->sf_idx[w*16+g];
     526           0 :                 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) {
     527           0 :                     if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1))
     528           0 :                         sce->sf_idx[w*16+g]--;
     529             :                     else //Try to make sure there is some energy in every band
     530           0 :                         sce->sf_idx[w*16+g]-=2;
     531             :                 }
     532           0 :                 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF);
     533           0 :                 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219);
     534           0 :                 if (sce->sf_idx[w*16+g] != prevsc)
     535           0 :                     fflag = 1;
     536           0 :                 sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
     537             :             }
     538             :         }
     539           0 :         its++;
     540           0 :     } while (fflag && its < 10);
     541             : }
     542             : 
     543        1869 : static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
     544             : {
     545             :     FFPsyBand *band;
     546             :     int w, g, w2, i;
     547        1869 :     int wlen = 1024 / sce->ics.num_windows;
     548             :     int bandwidth, cutoff;
     549        1869 :     float *PNS = &s->scoefs[0*128], *PNS34 = &s->scoefs[1*128];
     550        1869 :     float *NOR34 = &s->scoefs[3*128];
     551             :     uint8_t nextband[128];
     552        1869 :     const float lambda = s->lambda;
     553        1869 :     const float freq_mult = avctx->sample_rate*0.5f/wlen;
     554        1869 :     const float thr_mult = NOISE_LAMBDA_REPLACE*(100.0f/lambda);
     555        1869 :     const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f));
     556        1869 :     const float dist_bias = av_clipf(4.f * 120 / lambda, 0.25f, 4.0f);
     557        1869 :     const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f);
     558             : 
     559        3738 :     int refbits = avctx->bit_rate * 1024.0 / avctx->sample_rate
     560        1869 :         / ((avctx->flags & AV_CODEC_FLAG_QSCALE) ? 2.0f : avctx->channels)
     561        1869 :         * (lambda / 120.f);
     562             : 
     563             :     /** Keep this in sync with twoloop's cutoff selection */
     564        1869 :     float rate_bandwidth_multiplier = 1.5f;
     565        1869 :     int prev = -1000, prev_sf = -1;
     566        3738 :     int frame_bit_rate = (avctx->flags & AV_CODEC_FLAG_QSCALE)
     567           0 :         ? (refbits * rate_bandwidth_multiplier * avctx->sample_rate / 1024)
     568        1869 :         : (avctx->bit_rate / avctx->channels);
     569             : 
     570        1869 :     frame_bit_rate *= 1.15f;
     571             : 
     572        1869 :     if (avctx->cutoff > 0) {
     573         836 :         bandwidth = avctx->cutoff;
     574             :     } else {
     575        1033 :         bandwidth = FFMAX(3000, AAC_CUTOFF_FROM_BITRATE(frame_bit_rate, 1, avctx->sample_rate));
     576             :     }
     577             : 
     578        1869 :     cutoff = bandwidth * 2 * wlen / avctx->sample_rate;
     579             : 
     580        1869 :     memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type));
     581        1869 :     ff_init_nextband_map(sce, nextband);
     582        3860 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     583        1991 :         int wstart = w*128;
     584       91416 :         for (g = 0; g < sce->ics.num_swb; g++) {
     585             :             int noise_sfi;
     586       89425 :             float dist1 = 0.0f, dist2 = 0.0f, noise_amp;
     587       89425 :             float pns_energy = 0.0f, pns_tgt_energy, energy_ratio, dist_thresh;
     588       89425 :             float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f;
     589       89425 :             float min_energy = -1.0f, max_energy = 0.0f;
     590       89425 :             const int start = wstart+sce->ics.swb_offset[g];
     591       89425 :             const float freq = (start-wstart)*freq_mult;
     592       89425 :             const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f);
     593       89425 :             if (freq < NOISE_LOW_LIMIT || (start-wstart) >= cutoff) {
     594       49168 :                 if (!sce->zeroes[w*16+g])
     595       40894 :                     prev_sf = sce->sf_idx[w*16+g];
     596       49168 :                 continue;
     597             :             }
     598       81998 :             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     599       41741 :                 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     600       41741 :                 sfb_energy += band->energy;
     601       41741 :                 spread     = FFMIN(spread, band->spread);
     602       41741 :                 threshold  += band->threshold;
     603       41741 :                 if (!w2) {
     604       40257 :                     min_energy = max_energy = band->energy;
     605             :                 } else {
     606        1484 :                     min_energy = FFMIN(min_energy, band->energy);
     607        1484 :                     max_energy = FFMAX(max_energy, band->energy);
     608             :                 }
     609             :             }
     610             : 
     611             :             /* Ramps down at ~8000Hz and loosens the dist threshold */
     612       40257 :             dist_thresh = av_clipf(2.5f*NOISE_LOW_LIMIT/freq, 0.5f, 2.5f) * dist_bias;
     613             : 
     614             :             /* PNS is acceptable when all of these are true:
     615             :              * 1. high spread energy (noise-like band)
     616             :              * 2. near-threshold energy (high PE means the random nature of PNS content will be noticed)
     617             :              * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS)
     618             :              *
     619             :              * At this stage, point 2 is relaxed for zeroed bands near the noise threshold (hole avoidance is more important)
     620             :              */
     621       80488 :             if ((!sce->zeroes[w*16+g] && !ff_sfdelta_can_remove_band(sce, nextband, prev_sf, w*16+g)) ||
     622      104233 :                 ((sce->zeroes[w*16+g] || !sce->band_alt[w*16+g]) && sfb_energy < threshold*sqrtf(1.0f/freq_boost)) || spread < spread_threshold ||
     623       88089 :                 (!sce->zeroes[w*16+g] && sce->band_alt[w*16+g] && sfb_energy > threshold*thr_mult*freq_boost) ||
     624       24400 :                 min_energy < pns_transient_energy_r * max_energy ) {
     625       15865 :                 sce->pns_ener[w*16+g] = sfb_energy;
     626       15865 :                 if (!sce->zeroes[w*16+g])
     627       15500 :                     prev_sf = sce->sf_idx[w*16+g];
     628       15865 :                 continue;
     629             :             }
     630             : 
     631       24392 :             pns_tgt_energy = sfb_energy*FFMIN(1.0f, spread*spread);
     632       24392 :             noise_sfi = av_clip(roundf(log2f(pns_tgt_energy)*2), -100, 155); /* Quantize */
     633       24392 :             noise_amp = -ff_aac_pow2sf_tab[noise_sfi + POW_SF2_ZERO];    /* Dequantize */
     634       24392 :             if (prev != -1000) {
     635       17810 :                 int noise_sfdiff = noise_sfi - prev + SCALE_DIFF_ZERO;
     636       17810 :                 if (noise_sfdiff < 0 || noise_sfdiff > 2*SCALE_MAX_DIFF) {
     637           0 :                     if (!sce->zeroes[w*16+g])
     638           0 :                         prev_sf = sce->sf_idx[w*16+g];
     639           0 :                     continue;
     640             :                 }
     641             :             }
     642       48847 :             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     643             :                 float band_energy, scale, pns_senergy;
     644       24455 :                 const int start_c = (w+w2)*128+sce->ics.swb_offset[g];
     645       24455 :                 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     646      832779 :                 for (i = 0; i < sce->ics.swb_sizes[g]; i++) {
     647      808324 :                     s->random_state  = lcg_random(s->random_state);
     648      808324 :                     PNS[i] = s->random_state;
     649             :                 }
     650       24455 :                 band_energy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
     651       24455 :                 scale = noise_amp/sqrtf(band_energy);
     652       24455 :                 s->fdsp->vector_fmul_scalar(PNS, PNS, scale, sce->ics.swb_sizes[g]);
     653       24455 :                 pns_senergy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]);
     654       24455 :                 pns_energy += pns_senergy;
     655       24455 :                 s->abs_pow34(NOR34, &sce->coeffs[start_c], sce->ics.swb_sizes[g]);
     656       24455 :                 s->abs_pow34(PNS34, PNS, sce->ics.swb_sizes[g]);
     657       97820 :                 dist1 += quantize_band_cost(s, &sce->coeffs[start_c],
     658             :                                             NOR34,
     659       24455 :                                             sce->ics.swb_sizes[g],
     660       24455 :                                             sce->sf_idx[(w+w2)*16+g],
     661       24455 :                                             sce->band_alt[(w+w2)*16+g],
     662       24455 :                                             lambda/band->threshold, INFINITY, NULL, NULL, 0);
     663             :                 /* Estimate rd on average as 5 bits for SF, 4 for the CB, plus spread energy * lambda/thr */
     664       24455 :                 dist2 += band->energy/(band->spread*band->spread)*lambda*dist_thresh/band->threshold;
     665             :             }
     666       24392 :             if (g && sce->band_type[w*16+g-1] == NOISE_BT) {
     667       13375 :                 dist2 += 5;
     668             :             } else {
     669       11017 :                 dist2 += 9;
     670             :             }
     671       24392 :             energy_ratio = pns_tgt_energy/pns_energy; /* Compensates for quantization error */
     672       24392 :             sce->pns_ener[w*16+g] = energy_ratio*pns_tgt_energy;
     673       24392 :             if (sce->zeroes[w*16+g] || !sce->band_alt[w*16+g] || (energy_ratio > 0.85f && energy_ratio < 1.25f && dist2 < dist1)) {
     674       15417 :                 sce->band_type[w*16+g] = NOISE_BT;
     675       15417 :                 sce->zeroes[w*16+g] = 0;
     676       15417 :                 prev = noise_sfi;
     677             :             } else {
     678        8975 :                 if (!sce->zeroes[w*16+g])
     679        8975 :                     prev_sf = sce->sf_idx[w*16+g];
     680             :             }
     681             :         }
     682             :     }
     683        1869 : }
     684             : 
     685        1869 : static void mark_pns(AACEncContext *s, AVCodecContext *avctx, SingleChannelElement *sce)
     686             : {
     687             :     FFPsyBand *band;
     688             :     int w, g, w2;
     689        1869 :     int wlen = 1024 / sce->ics.num_windows;
     690             :     int bandwidth, cutoff;
     691        1869 :     const float lambda = s->lambda;
     692        1869 :     const float freq_mult = avctx->sample_rate*0.5f/wlen;
     693        1869 :     const float spread_threshold = FFMIN(0.75f, NOISE_SPREAD_THRESHOLD*FFMAX(0.5f, lambda/100.f));
     694        1869 :     const float pns_transient_energy_r = FFMIN(0.7f, lambda / 140.f);
     695             : 
     696        3738 :     int refbits = avctx->bit_rate * 1024.0 / avctx->sample_rate
     697        1869 :         / ((avctx->flags & AV_CODEC_FLAG_QSCALE) ? 2.0f : avctx->channels)
     698        1869 :         * (lambda / 120.f);
     699             : 
     700             :     /** Keep this in sync with twoloop's cutoff selection */
     701        1869 :     float rate_bandwidth_multiplier = 1.5f;
     702        3738 :     int frame_bit_rate = (avctx->flags & AV_CODEC_FLAG_QSCALE)
     703           0 :         ? (refbits * rate_bandwidth_multiplier * avctx->sample_rate / 1024)
     704        1869 :         : (avctx->bit_rate / avctx->channels);
     705             : 
     706        1869 :     frame_bit_rate *= 1.15f;
     707             : 
     708        1869 :     if (avctx->cutoff > 0) {
     709         836 :         bandwidth = avctx->cutoff;
     710             :     } else {
     711        1033 :         bandwidth = FFMAX(3000, AAC_CUTOFF_FROM_BITRATE(frame_bit_rate, 1, avctx->sample_rate));
     712             :     }
     713             : 
     714        1869 :     cutoff = bandwidth * 2 * wlen / avctx->sample_rate;
     715             : 
     716        1869 :     memcpy(sce->band_alt, sce->band_type, sizeof(sce->band_type));
     717        3860 :     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     718       91416 :         for (g = 0; g < sce->ics.num_swb; g++) {
     719       89425 :             float sfb_energy = 0.0f, threshold = 0.0f, spread = 2.0f;
     720       89425 :             float min_energy = -1.0f, max_energy = 0.0f;
     721       89425 :             const int start = sce->ics.swb_offset[g];
     722       89425 :             const float freq = start*freq_mult;
     723       89425 :             const float freq_boost = FFMAX(0.88f*freq/NOISE_LOW_LIMIT, 1.0f);
     724       89425 :             if (freq < NOISE_LOW_LIMIT || start >= cutoff) {
     725       49168 :                 sce->can_pns[w*16+g] = 0;
     726       49168 :                 continue;
     727             :             }
     728       81998 :             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     729       41741 :                 band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     730       41741 :                 sfb_energy += band->energy;
     731       41741 :                 spread     = FFMIN(spread, band->spread);
     732       41741 :                 threshold  += band->threshold;
     733       41741 :                 if (!w2) {
     734       40257 :                     min_energy = max_energy = band->energy;
     735             :                 } else {
     736        1484 :                     min_energy = FFMIN(min_energy, band->energy);
     737        1484 :                     max_energy = FFMAX(max_energy, band->energy);
     738             :                 }
     739             :             }
     740             : 
     741             :             /* PNS is acceptable when all of these are true:
     742             :              * 1. high spread energy (noise-like band)
     743             :              * 2. near-threshold energy (high PE means the random nature of PNS content will be noticed)
     744             :              * 3. on short window groups, all windows have similar energy (variations in energy would be destroyed by PNS)
     745             :              */
     746       40257 :             sce->pns_ener[w*16+g] = sfb_energy;
     747       40257 :             if (sfb_energy < threshold*sqrtf(1.5f/freq_boost) || spread < spread_threshold || min_energy < pns_transient_energy_r * max_energy) {
     748        1073 :                 sce->can_pns[w*16+g] = 0;
     749             :             } else {
     750       39184 :                 sce->can_pns[w*16+g] = 1;
     751             :             }
     752             :         }
     753             :     }
     754        1869 : }
     755             : 
     756         630 : static void search_for_ms(AACEncContext *s, ChannelElement *cpe)
     757             : {
     758         630 :     int start = 0, i, w, w2, g, sid_sf_boost, prev_mid, prev_side;
     759             :     uint8_t nextband0[128], nextband1[128];
     760         630 :     float *M   = s->scoefs + 128*0, *S   = s->scoefs + 128*1;
     761         630 :     float *L34 = s->scoefs + 128*2, *R34 = s->scoefs + 128*3;
     762         630 :     float *M34 = s->scoefs + 128*4, *S34 = s->scoefs + 128*5;
     763         630 :     const float lambda = s->lambda;
     764         630 :     const float mslambda = FFMIN(1.0f, lambda / 120.f);
     765         630 :     SingleChannelElement *sce0 = &cpe->ch[0];
     766         630 :     SingleChannelElement *sce1 = &cpe->ch[1];
     767         630 :     if (!cpe->common_window)
     768         521 :         return;
     769             : 
     770             :     /** Scout out next nonzero bands */
     771         109 :     ff_init_nextband_map(sce0, nextband0);
     772         109 :     ff_init_nextband_map(sce1, nextband1);
     773             : 
     774         109 :     prev_mid = sce0->sf_idx[0];
     775         109 :     prev_side = sce1->sf_idx[0];
     776         232 :     for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
     777         123 :         start = 0;
     778        5485 :         for (g = 0; g < sce0->ics.num_swb; g++) {
     779        5362 :             float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f;
     780        5362 :             if (!cpe->is_mask[w*16+g])
     781        4904 :                 cpe->ms_mask[w*16+g] = 0;
     782        5362 :             if (!sce0->zeroes[w*16+g] && !sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g]) {
     783        3183 :                 float Mmax = 0.0f, Smax = 0.0f;
     784             : 
     785             :                 /* Must compute mid/side SF and book for the whole window group */
     786        6578 :                 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
     787       70239 :                     for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
     788      133688 :                         M[i] = (sce0->coeffs[start+(w+w2)*128+i]
     789       66844 :                               + sce1->coeffs[start+(w+w2)*128+i]) * 0.5;
     790      200532 :                         S[i] =  M[i]
     791      133688 :                               - sce1->coeffs[start+(w+w2)*128+i];
     792             :                     }
     793        3395 :                     s->abs_pow34(M34, M, sce0->ics.swb_sizes[g]);
     794        3395 :                     s->abs_pow34(S34, S, sce0->ics.swb_sizes[g]);
     795       70239 :                     for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) {
     796       66844 :                         Mmax = FFMAX(Mmax, M34[i]);
     797       66844 :                         Smax = FFMAX(Smax, S34[i]);
     798             :                     }
     799             :                 }
     800             : 
     801        3331 :                 for (sid_sf_boost = 0; sid_sf_boost < 4; sid_sf_boost++) {
     802        3294 :                     float dist1 = 0.0f, dist2 = 0.0f;
     803        3294 :                     int B0 = 0, B1 = 0;
     804             :                     int minidx;
     805             :                     int mididx, sididx;
     806             :                     int midcb, sidcb;
     807             : 
     808        3294 :                     minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]);
     809        3294 :                     mididx = av_clip(minidx, 0, SCALE_MAX_POS - SCALE_DIV_512);
     810        3294 :                     sididx = av_clip(minidx - sid_sf_boost * 3, 0, SCALE_MAX_POS - SCALE_DIV_512);
     811        3294 :                     if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT
     812        3035 :                         && (   !ff_sfdelta_can_replace(sce0, nextband0, prev_mid, mididx, w*16+g)
     813        3035 :                             || !ff_sfdelta_can_replace(sce1, nextband1, prev_side, sididx, w*16+g))) {
     814             :                         /* scalefactor range violation, bad stuff, will decrease quality unacceptably */
     815           0 :                         continue;
     816             :                     }
     817             : 
     818        3294 :                     midcb = find_min_book(Mmax, mididx);
     819        3294 :                     sidcb = find_min_book(Smax, sididx);
     820             : 
     821             :                     /* No CB can be zero */
     822        3294 :                     midcb = FFMAX(1,midcb);
     823        3294 :                     sidcb = FFMAX(1,sidcb);
     824             : 
     825        6800 :                     for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
     826        3506 :                         FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
     827        3506 :                         FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
     828        3506 :                         float minthr = FFMIN(band0->threshold, band1->threshold);
     829             :                         int b1,b2,b3,b4;
     830       71238 :                         for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
     831      135464 :                             M[i] = (sce0->coeffs[start+(w+w2)*128+i]
     832       67732 :                                   + sce1->coeffs[start+(w+w2)*128+i]) * 0.5;
     833      203196 :                             S[i] =  M[i]
     834      135464 :                                   - sce1->coeffs[start+(w+w2)*128+i];
     835             :                         }
     836             : 
     837        3506 :                         s->abs_pow34(L34, sce0->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]);
     838        3506 :                         s->abs_pow34(R34, sce1->coeffs+start+(w+w2)*128, sce0->ics.swb_sizes[g]);
     839        3506 :                         s->abs_pow34(M34, M,                         sce0->ics.swb_sizes[g]);
     840        3506 :                         s->abs_pow34(S34, S,                         sce0->ics.swb_sizes[g]);
     841       14024 :                         dist1 += quantize_band_cost(s, &sce0->coeffs[start + (w+w2)*128],
     842             :                                                     L34,
     843        3506 :                                                     sce0->ics.swb_sizes[g],
     844        3506 :                                                     sce0->sf_idx[w*16+g],
     845        3506 :                                                     sce0->band_type[w*16+g],
     846        3506 :                                                     lambda / band0->threshold, INFINITY, &b1, NULL, 0);
     847       14024 :                         dist1 += quantize_band_cost(s, &sce1->coeffs[start + (w+w2)*128],
     848             :                                                     R34,
     849        3506 :                                                     sce1->ics.swb_sizes[g],
     850        3506 :                                                     sce1->sf_idx[w*16+g],
     851        3506 :                                                     sce1->band_type[w*16+g],
     852        3506 :                                                     lambda / band1->threshold, INFINITY, &b2, NULL, 0);
     853        7012 :                         dist2 += quantize_band_cost(s, M,
     854             :                                                     M34,
     855        3506 :                                                     sce0->ics.swb_sizes[g],
     856             :                                                     mididx,
     857             :                                                     midcb,
     858             :                                                     lambda / minthr, INFINITY, &b3, NULL, 0);
     859        7012 :                         dist2 += quantize_band_cost(s, S,
     860             :                                                     S34,
     861        3506 :                                                     sce1->ics.swb_sizes[g],
     862             :                                                     sididx,
     863             :                                                     sidcb,
     864        3506 :                                                     mslambda / (minthr * bmax), INFINITY, &b4, NULL, 0);
     865        3506 :                         B0 += b1+b2;
     866        3506 :                         B1 += b3+b4;
     867        3506 :                         dist1 -= b1+b2;
     868        3506 :                         dist2 -= b3+b4;
     869             :                     }
     870        3294 :                     cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0;
     871        3294 :                     if (cpe->ms_mask[w*16+g]) {
     872        2887 :                         if (sce0->band_type[w*16+g] != NOISE_BT && sce1->band_type[w*16+g] != NOISE_BT) {
     873        2887 :                             sce0->sf_idx[w*16+g] = mididx;
     874        2887 :                             sce1->sf_idx[w*16+g] = sididx;
     875        2887 :                             sce0->band_type[w*16+g] = midcb;
     876        2887 :                             sce1->band_type[w*16+g] = sidcb;
     877           0 :                         } else if ((sce0->band_type[w*16+g] != NOISE_BT) ^ (sce1->band_type[w*16+g] != NOISE_BT)) {
     878             :                             /* ms_mask unneeded, and it confuses some decoders */
     879           0 :                             cpe->ms_mask[w*16+g] = 0;
     880             :                         }
     881        2887 :                         break;
     882         407 :                     } else if (B1 > B0) {
     883             :                         /* More boost won't fix this */
     884         259 :                         break;
     885             :                     }
     886             :                 }
     887             :             }
     888        5362 :             if (!sce0->zeroes[w*16+g] && sce0->band_type[w*16+g] < RESERVED_BT)
     889        3410 :                 prev_mid = sce0->sf_idx[w*16+g];
     890        5362 :             if (!sce1->zeroes[w*16+g] && !cpe->is_mask[w*16+g] && sce1->band_type[w*16+g] < RESERVED_BT)
     891        2950 :                 prev_side = sce1->sf_idx[w*16+g];
     892        5362 :             start += sce0->ics.swb_sizes[g];
     893             :         }
     894             :     }
     895             : }
     896             : 
     897             : const AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB] = {
     898             :     [AAC_CODER_ANMR] = {
     899             :         search_for_quantizers_anmr,
     900             :         encode_window_bands_info,
     901             :         quantize_and_encode_band,
     902             :         ff_aac_encode_tns_info,
     903             :         ff_aac_encode_ltp_info,
     904             :         ff_aac_encode_main_pred,
     905             :         ff_aac_adjust_common_pred,
     906             :         ff_aac_adjust_common_ltp,
     907             :         ff_aac_apply_main_pred,
     908             :         ff_aac_apply_tns,
     909             :         ff_aac_update_ltp,
     910             :         ff_aac_ltp_insert_new_frame,
     911             :         set_special_band_scalefactors,
     912             :         search_for_pns,
     913             :         mark_pns,
     914             :         ff_aac_search_for_tns,
     915             :         ff_aac_search_for_ltp,
     916             :         search_for_ms,
     917             :         ff_aac_search_for_is,
     918             :         ff_aac_search_for_pred,
     919             :     },
     920             :     [AAC_CODER_TWOLOOP] = {
     921             :         search_for_quantizers_twoloop,
     922             :         codebook_trellis_rate,
     923             :         quantize_and_encode_band,
     924             :         ff_aac_encode_tns_info,
     925             :         ff_aac_encode_ltp_info,
     926             :         ff_aac_encode_main_pred,
     927             :         ff_aac_adjust_common_pred,
     928             :         ff_aac_adjust_common_ltp,
     929             :         ff_aac_apply_main_pred,
     930             :         ff_aac_apply_tns,
     931             :         ff_aac_update_ltp,
     932             :         ff_aac_ltp_insert_new_frame,
     933             :         set_special_band_scalefactors,
     934             :         search_for_pns,
     935             :         mark_pns,
     936             :         ff_aac_search_for_tns,
     937             :         ff_aac_search_for_ltp,
     938             :         search_for_ms,
     939             :         ff_aac_search_for_is,
     940             :         ff_aac_search_for_pred,
     941             :     },
     942             :     [AAC_CODER_FAST] = {
     943             :         search_for_quantizers_fast,
     944             :         codebook_trellis_rate,
     945             :         quantize_and_encode_band,
     946             :         ff_aac_encode_tns_info,
     947             :         ff_aac_encode_ltp_info,
     948             :         ff_aac_encode_main_pred,
     949             :         ff_aac_adjust_common_pred,
     950             :         ff_aac_adjust_common_ltp,
     951             :         ff_aac_apply_main_pred,
     952             :         ff_aac_apply_tns,
     953             :         ff_aac_update_ltp,
     954             :         ff_aac_ltp_insert_new_frame,
     955             :         set_special_band_scalefactors,
     956             :         search_for_pns,
     957             :         mark_pns,
     958             :         ff_aac_search_for_tns,
     959             :         ff_aac_search_for_ltp,
     960             :         search_for_ms,
     961             :         ff_aac_search_for_is,
     962             :         ff_aac_search_for_pred,
     963             :     },
     964             : };

Generated by: LCOV version 1.13