Ticket #2686: aac-improvements-wip-v6.patch

File aac-improvements-wip-v6.patch, 42.3 KB (added by klaussfreire, 13 years ago)

Improved (mostly constrained) VBR, fixed RC bug from v5. There's some dead code that begs to be removed, but it's better to start testing before cleaning.

  • libavcodec/aaccoder.c

    diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c
    index 50a246f..4ff20e3 100644
    a b static const uint8_t *run_value_bits[2] = {  
    5757    run_value_bits_long, run_value_bits_short
    5858};
    5959
    60 
    6160/**
    6261 * Quantize one coefficient.
    6362 * @return absolute value of the quantized coefficient
    static const uint8_t *run_value_bits[2] = {  
    6665static av_always_inline int quant(float coef, const float Q)
    6766{
    6867    float a = coef * Q;
    69     return sqrtf(a * sqrtf(a)) + 0.4054;
     68    return sqrtf(a * sqrtf(a)) + 0.4054f;
    7069}
    7170
    7271static void quantize_bands(int *out, const float *in, const float *scaled,
    static void quantize_bands(int *out, const float *in, const float *scaled,  
    7675    double qc;
    7776    for (i = 0; i < size; i++) {
    7877        qc = scaled[i] * Q34;
    79         out[i] = (int)FFMIN(qc + 0.4054, (double)maxval);
     78        out[i] = (int)FFMIN(qc + 0.4054f, (double)maxval);
    8079        if (is_signed && in[i] < 0.0f) {
    8180            out[i] = -out[i];
    8281        }
    static float find_max_val(int group_len, int swb_size, const float *scaled) {  
    282281    return maxval;
    283282}
    284283
     284static float find_max_absval(int group_len, int swb_size, const float *scaled) {
     285    float maxval = 0.0f;
     286    int w2, i;
     287    for (w2 = 0; w2 < group_len; w2++) {
     288        for (i = 0; i < swb_size; i++) {
     289            maxval = FFMAX(maxval, fabs(scaled[w2*128+i]));
     290        }
     291    }
     292    return maxval;
     293}
     294
    285295static int find_min_book(float maxval, int sf) {
    286296    float Q = ff_aac_pow2sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512];
    287297    float Q34 = sqrtf(Q * sqrtf(Q));
    static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s,  
    701711                sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
    702712}
    703713
     714#define sclip(x) av_clip(x,60,218)
     715
    704716/**
    705717 * two-loop quantizers search taken from ISO 13818-7 Appendix C
    706718 */
    707719static void search_for_quantizers_twoloop(AVCodecContext *avctx,
    708720                                          AACEncContext *s,
    709721                                          SingleChannelElement *sce,
    710                                           const float lambda)
     722                                          float lambda)
    711723{
    712724    int start = 0, i, w, w2, g;
    713     int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels * (lambda / 120.f);
    714     float dists[128] = { 0 }, uplims[128];
     725    int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate
     726        / ((avctx->flags & CODEC_FLAG_QSCALE) ? 2.0f : avctx->channels)
     727        * (lambda / 120.f);
     728    int refbits = destbits;
     729    int toomanybits, toofewbits;
     730    float dists[128] = { 0 }, uplims[128], energies[128];
    715731    float maxvals[128];
    716     int fflag, minscaler;
     732   
     733    /* rdlambda controls the maximum tolerated distortion. Twoloop
     734     * will keep iterating until it fails to lower it or it reaches
     735     * ulimit * rdlambda. Keeping it low increases quality on difficult
     736     * signals, but lower it too much, and bits will be taken from weak
     737     * signals, creating "holes". A balance is necesary.
     738     * rdmax and rdmin specify the relative deviation from rdlambda
     739     * allowed for tonality compensation
     740     */
     741    float rdlambda = av_clipf(2 * 120.f / lambda, 0.0625f, 16.0f);
     742    float rdmin = 0.03125f;
     743    float rdmax = 1.0f;
     744   
     745    /* sfoffs controls an offset of optmium allocation that will be
     746     * applied based on lambda. Keep it real and modest, the loop
     747     * will take care of the rest, this just accelerates convergence
     748     */
     749    float sfoffs = av_clipf(log2f(120.0f / lambda) * 4.0f, -5, 10);
     750   
     751    int fflag, minscaler, nminscaler, minrdsf;
    717752    int its  = 0;
     753    int maxits = 20;
    718754    int allz = 0;
    719     float minthr = INFINITY;
     755    int tbits;
     756    int cutoff = 1024;
     757   
     758    /* zeroscale controls a multiplier of the threshold, if band energy
     759     * is below this, a zero is forced. Keep it lower than 1, unless
     760     * low lambda is used, because energy < threshold doesn't mean there's
     761     * no audible signal outright, it's just energy. Also make it rise
     762     * slower than rdlambda, as rdscale has due compensation with
     763     * noisy band depriorization below, whereas zeroing logic is rather dumb
     764     */
     765    float zeroscale;
     766    if (lambda > 120.f)
     767        zeroscale = av_clipf(powf(120.f / lambda, 0.25f), 0.0625f, 1.0f);
     768    else
     769        zeroscale = 1.f;
     770   
     771    if (s->psy.bitres.alloc >= 0) {
     772        // Psy granted us extra bits to use, from the reservoire
     773        // adjust for lambda except what psy already did
     774        destbits = s->psy.bitres.alloc
     775            * (lambda / (avctx->global_quality ? avctx->global_quality : 120));
     776    }
     777   
     778    if (avctx->flags & CODEC_FLAG_QSCALE) {
     779        // When using a constant Q-scale, don't adjust bits, just use RD
     780        // Don't let it go overboard, though... 8x psy target is enough
     781        toomanybits = av_clip(destbits * 8, 768, 5800);
     782        toofewbits = 0;
     783       
     784        // Don't offset scalers, just RD
     785        sfoffs = 0;
     786        rdlambda = sqrtf(rdlambda);
     787       
     788        // search further
     789        maxits = 40;
     790    } else {
     791        // When using ABR, be strict
     792        toomanybits = destbits + destbits/16;
     793        toofewbits = destbits - destbits/16;
     794       
     795        sfoffs = 0;
     796        rdlambda = sqrtf(rdlambda);
     797    }
     798
     799    // and zero out above cutoff frequency
     800    {
     801        int wlen = 1024 / sce->ics.num_windows;
     802        int bandwidth;
     803        if (avctx->cutoff > 0) {
     804            bandwidth = avctx->cutoff;
     805        } else {
     806            /* Scale by 2.4x, psy gives us constant quality, this LP only scales
     807             * bitrate by lambda, so we save bits on subjectively unimportant HF
     808             * rather than increase quantization noise
     809             */
     810            int frame_bit_rate = (avctx->flags & CODEC_FLAG_QSCALE)
     811                ? (refbits * 1.4f * avctx->sample_rate / 1024)
     812                : (avctx->bit_rate / avctx->channels);
     813           
     814            bandwidth = FFMAX(3000, _AAC_CUTOFF(frame_bit_rate, 1, avctx->sample_rate));
     815        }
     816        cutoff = bandwidth * 2 * wlen / avctx->sample_rate;
     817    }
    720818
    721819    // for values above this the decoder might end up in an endless loop
    722820    // due to always having more bits than what can be encoded.
    723821    destbits = FFMIN(destbits, 5800);
     822    toomanybits = FFMIN(toomanybits, 5800);
     823    toofewbits = FFMIN(toofewbits, 5800);
    724824    //XXX: some heuristic to determine initial quantizers will reduce search time
    725825    //determine zero bands and upper limits
    726826    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
    727         for (g = 0;  g < sce->ics.num_swb; g++) {
     827        for (g = start = 0;  g < sce->ics.num_swb; start += sce->ics.swb_sizes[g++]) {
    728828            int nz = 0;
    729             float uplim = 0.0f;
     829            float uplim = INFINITY;
     830            float energy = 0.0f;
     831           
    730832            for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
    731833                FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
    732                 uplim += band->threshold;
    733                 if (band->energy <= band->threshold || band->threshold == 0.0f) {
     834                if (start >= cutoff || band->energy <= (band->threshold * zeroscale) || band->threshold == 0.0) {
    734835                    sce->zeroes[(w+w2)*16+g] = 1;
    735836                    continue;
    736837                }
    737838                nz = 1;
    738839            }
    739             uplims[w*16+g] = uplim *512;
     840            if (!nz) {
     841                uplim = 0.0f;
     842            } else {
     843                for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
     844                    FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
     845                    if (band->energy <= (band->threshold * zeroscale) || band->threshold == 0.0f)
     846                        continue;
     847                    if (uplim > band->threshold) {
     848                        uplim = band->threshold;
     849                        energy = band->energy;
     850                    }
     851                }
     852            }
     853            uplims[w*16+g] = uplim;
     854            energies[w*16+g] = energy;
    740855            sce->zeroes[w*16+g] = !nz;
    741             if (nz)
    742                 minthr = FFMIN(minthr, uplim);
    743856            allz |= nz;
    744857        }
    745858    }
     859   
     860    /* Compute initial scalers */
     861    minscaler = 65535;
    746862    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
    747863        for (g = 0;  g < sce->ics.num_swb; g++) {
    748864            if (sce->zeroes[w*16+g]) {
    749865                sce->sf_idx[w*16+g] = SCALE_ONE_POS;
    750866                continue;
    751867            }
    752             sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59);
     868            /* log2f-to-distortion ratio is, technically, 2 (1.5db = 4, but it's power vs level so it's 2).
     869             * But, as offsets are applied, low-frequency signals are too sensitive to the induced distortion,
     870             * so we make scaling more conservative by choosing a lower log2f-to-distortion ratio, and thus
     871             * more robust.
     872             */
     873            sce->sf_idx[w*16+g] = av_clip(
     874                SCALE_ONE_POS
     875                    + 1.75*log2f(FFMAX(0.00125f,uplims[w*16+g]) / sce->ics.swb_sizes[g])
     876                    + sfoffs,
     877                60, SCALE_MAX_POS);
     878            //fprintf(stderr, "%02x ", sce->sf_idx[w*16+g]);
     879            minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
    753880        }
     881        //fprintf(stderr, "|\n");
    754882    }
    755 
     883    //fprintf(stderr, "\n");
     884   
     885    /* Clip */
     886    minscaler = av_clip(minscaler, SCALE_ONE_POS - SCALE_DIV_512, SCALE_MAX_POS - SCALE_DIV_512);
     887    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
     888        for (g = 0;  g < sce->ics.num_swb; g++)
     889            if (!sce->zeroes[w*16+g])
     890                sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF - 1);
     891   
    756892    if (!allz)
    757893        return;
    758894    abs_pow34_v(s->scoefs, sce->coeffs, 1024);
    static void search_for_quantizers_twoloop(AVCodecContext *avctx,  
    766902        }
    767903    }
    768904
     905    /* Scale uplims to match rate distortion to quality
     906     * and apply noisy band depriorization and tonal band priorization.
     907     * Maxval-energy ratio gives us an idea of how noisy/tonal the band is.
     908     * If maxval^2 ~ energy, then that band is mostly noise, and we can relax
     909     * rate distortion requirements.
     910     */
     911    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     912        start = w*128;
     913        for (g = 0;  g < sce->ics.num_swb; g++) {
     914            float max = find_max_absval(sce->ics.group_len[w], sce->ics.swb_sizes[g], sce->coeffs + start);
     915            if (max > 0) {
     916                float energy2uplim = energies[w*16+g] / (max*max*sce->ics.swb_sizes[g]);
     917                energy2uplim = FFMAX(0.03125f, FFMIN(1.0f,energy2uplim));
     918                uplims[w*16+g] *= av_clipf(rdlambda * rdlambda * energy2uplim, rdmin, rdmax);
     919                start += sce->ics.swb_sizes[g];
     920            }
     921        }
     922    }
     923
    769924    //perform two-loop search
    770925    //outer loop - improve quality
    771926    do {
    772         int tbits, qstep;
    773         minscaler = sce->sf_idx[0];
     927        int qstep;
    774928        //inner loop - quantize spectrum to fit into given number of bits
    775929        qstep = its ? 1 : 32;
    776930        do {
    static void search_for_quantizers_twoloop(AVCodecContext *avctx,  
    790944                        start += sce->ics.swb_sizes[g];
    791945                        continue;
    792946                    }
    793                     minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
    794947                    cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
    795948                    for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
    796949                        int b;
    static void search_for_quantizers_twoloop(AVCodecContext *avctx,  
    813966                    prev = sce->sf_idx[w*16+g];
    814967                }
    815968            }
    816             if (tbits > destbits) {
     969            if (tbits > toomanybits) {
    817970                for (i = 0; i < 128; i++)
    818                     if (sce->sf_idx[i] < 218 - qstep)
    819                         sce->sf_idx[i] += qstep;
    820             } else {
     971                    if (sce->sf_idx[i] < (SCALE_MAX_POS - SCALE_DIV_512))
     972                        sce->sf_idx[i] = FFMIN(SCALE_MAX_POS, sce->sf_idx[i] + qstep);
     973            } else if (tbits < toofewbits) {
    821974                for (i = 0; i < 128; i++)
    822                     if (sce->sf_idx[i] > 60 - qstep)
    823                         sce->sf_idx[i] -= qstep;
     975                    if (sce->sf_idx[i] > SCALE_ONE_POS)
     976                        sce->sf_idx[i] = FFMAX(SCALE_ONE_POS, sce->sf_idx[i] - qstep);
    824977            }
    825978            qstep >>= 1;
    826             if (!qstep && tbits > destbits*1.02 && sce->sf_idx[0] < 217)
     979            if (!qstep && tbits > toomanybits && sce->sf_idx[0] < 217)
    827980                qstep = 1;
    828981        } while (qstep);
    829982
     983        minscaler = SCALE_MAX_POS;
     984        for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
     985            for (g = 0;  g < sce->ics.num_swb; g++)
     986                if (!sce->zeroes[w*16+g])
     987                    minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
     988
     989        //NOTE: Emulate v4 patch with n = 0, uncommenting if (mb >= ESC_BT) break,
     990        //  and replacing minscaler-1 with minscaler
    830991        fflag = 0;
    831         minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF);
     992        minscaler = nminscaler = av_clip(minscaler, SCALE_ONE_POS - SCALE_DIV_512, SCALE_MAX_POS - SCALE_DIV_512);
     993        minrdsf = (avctx->flags & CODEC_FLAG_QSCALE) ? 60 : FFMAX(60, minscaler-1);
    832994        for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     995            int depth = (avctx->flags & CODEC_FLAG_QSCALE) ? 4 : 2;
    833996            for (g = 0; g < sce->ics.num_swb; g++) {
    834997                int prevsc = sce->sf_idx[w*16+g];
    835                 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) {
    836                     if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1))
     998                if (!sce->zeroes[w*16+g] && dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > minrdsf) {
     999                    //Try to make sure there is some energy in every nonzero band
     1000                    //NOTE: This algorithm must be forcibly imbalanced, pushing harder
     1001                    //  on holes or more distorted bands at first, otherwise there's
     1002                    //  no net gain (since the next iteration will offset all bands
     1003                    //  on the opposite direction to compensate for extra bits)
     1004                    int n = (its > 4 && g > sce->ics.num_swb/4) ? 0 : (depth/2);
     1005                    for (i = 0; i < depth; ++i) {
     1006                        int mb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1);
     1007                        //if (mb >= ESC_BT) break;
    8371008                        sce->sf_idx[w*16+g]--;
    838                     else //Try to make sure there is some energy in every band
    839                         sce->sf_idx[w*16+g]-=2;
     1009                        dists[w*16+g] *= 0.5f;
     1010                        if (mb && (i >= n || dists[w*16+g] < uplims[w*16+g])) break;
     1011                    }
    8401012                }
    841                 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF);
    842                 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219);
     1013                sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minrdsf, minscaler + SCALE_MAX_DIFF);
     1014                sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], SCALE_MAX_POS - SCALE_DIV_512);
    8431015                if (sce->sf_idx[w*16+g] != prevsc)
    8441016                    fflag = 1;
     1017                nminscaler = FFMIN(nminscaler, sce->sf_idx[w*16+g]);
    8451018                sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
    8461019            }
    8471020        }
     1021        if (nminscaler < minscaler) {
     1022            // Drecreased some scalers below minscaler. Must re-clamp.
     1023            minscaler = nminscaler;
     1024            for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
     1025                for (g = 0; g < sce->ics.num_swb; g++)
     1026                    sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF);
     1027        }
    8481028        its++;
    849     } while (fflag && its < 10);
     1029    } while (fflag && its < maxits);
     1030   
     1031    /* Fill implicit zeroes */
     1032    //fprintf(stderr, "its:%d %d/%d: ", its, tbits, destbits);
     1033    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     1034        /* No lowly codebooks beyond cutoff zone, to clean up noisy coefs */
     1035        int scutoff = cutoff + cutoff/5;
     1036        for (g = start = 0; g < sce->ics.num_swb; start += sce->ics.swb_sizes[g++]) {
     1037            int minbt = (start < scutoff) ? 0 : 3;
     1038            //fprintf(stderr, "%02x ", sce->sf_idx[w*16+g]);
     1039            if (sce->band_type[w*16+g] <= minbt) {
     1040                sce->zeroes[w*16+g] = 1;
     1041                sce->band_type[w*16+g] = 0;
     1042            }
     1043        }
     1044        //fprintf(stderr, "|");
     1045    }
     1046    //fprintf(stderr, "\n");
     1047    //fprintf(stderr, "ba:%d br:%d  \t\r", s->psy.bitres.alloc, tbits);
    8501048}
    8511049
    8521050static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s,
    static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s,  
    10211219                                       SingleChannelElement *sce,
    10221220                                       const float lambda)
    10231221{
    1024     int i, w, w2, g;
    1025     int minq = 255;
     1222    int w, w2, g;
     1223    float lowlambda = av_clipf(120.f / lambda, 0.85f, 1.f);
     1224    float rlambda = av_clipf(120.f / lambda, 0.75f, 10.f);
     1225    const int minq = av_clip(2 * log2f(120.f / lambda) + 150, 100, 218 - SCALE_MAX_DIFF);
     1226    const int maxq = minq + SCALE_MAX_DIFF - 1;
    10261227
    10271228    memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
    10281229    for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
    10291230        for (g = 0; g < sce->ics.num_swb; g++) {
    10301231            for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
    10311232                FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
    1032                 if (band->energy <= band->threshold) {
    1033                     sce->sf_idx[(w+w2)*16+g] = 218;
     1233                if (band->energy <= 0.05 * lowlambda * band->threshold) {
     1234                    sce->sf_idx[(w+w2)*16+g] = maxq;
    10341235                    sce->zeroes[(w+w2)*16+g] = 1;
    10351236                } else {
    1036                     sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2f(band->threshold), 80, 218);
     1237                    sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + 1.414*log2f(band->threshold * rlambda), minq, maxq);
    10371238                    sce->zeroes[(w+w2)*16+g] = 0;
    10381239                }
    1039                 minq = FFMIN(minq, sce->sf_idx[(w+w2)*16+g]);
    10401240            }
    10411241        }
    10421242    }
    1043     for (i = 0; i < 128; i++) {
    1044         sce->sf_idx[i] = 140;
    1045         //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);
    1046     }
    10471243    //set the same quantizers inside window groups
    1048     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
    1049         for (g = 0;  g < sce->ics.num_swb; g++)
    1050             for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
    1051                 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
     1244    if (sce->ics.num_windows > 1) {
     1245        for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
     1246            for (g = 0;  g < sce->ics.num_swb; g++) {
     1247                if (sce->ics.group_len[w] > 1) {
     1248                    int avg_sf_idx = 0;
     1249                    for (w2 = 0; w2 < sce->ics.group_len[w]; w2++)
     1250                        avg_sf_idx += sce->sf_idx[w*16+g];
     1251                    avg_sf_idx /= sce->ics.group_len[w];
     1252                    for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
     1253                        sce->sf_idx[(w+w2)*16+g] = avg_sf_idx;
     1254                }
     1255            }
     1256        }
     1257    }
     1258}
     1259
     1260static float bval2bmax(float b)
     1261{
     1262    /* approximates exp10f(-3.0f*(0.5f + 0.5f * cosf(FFMIN(b,15.5f) / 15.5f))) */
     1263    return 0.001f + 0.0035f * (b*b*b) / (15.5f*15.5f*15.5f);
    10521264}
    10531265
    10541266static void search_for_ms(AACEncContext *s, ChannelElement *cpe,
    static void search_for_ms(AACEncContext *s, ChannelElement *cpe,  
    10591271    float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3;
    10601272    SingleChannelElement *sce0 = &cpe->ch[0];
    10611273    SingleChannelElement *sce1 = &cpe->ch[1];
     1274   
    10621275    if (!cpe->common_window)
    10631276        return;
     1277   
    10641278    for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
     1279        int min_sf_idx_mid = SCALE_MAX_POS;
     1280        int min_sf_idx_side = SCALE_MAX_POS;
     1281        for (g = 0; g < sce0->ics.num_swb; g++) {
     1282            if (!sce0->zeroes[w*16+g])
     1283                min_sf_idx_mid = FFMIN(min_sf_idx_mid, sce0->sf_idx[w*16+g]);
     1284            if (!sce1->zeroes[w*16+g])
     1285                min_sf_idx_side = FFMIN(min_sf_idx_side, sce1->sf_idx[w*16+g]);
     1286        }
     1287       
    10651288        for (g = 0;  g < sce0->ics.num_swb; g++) {
     1289            float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f;
    10661290            if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) {
    10671291                float dist1 = 0.0f, dist2 = 0.0f;
     1292                int B0 = 0, B1 = 0;
     1293                int minidx;
     1294                int mididx, sididx;
     1295                float Mmax = 0.0f, Smax = 0.0f;
     1296                int midcb, sidcb;
     1297               
     1298                /* Must compute mid/side SF and book for the whole window group */
     1299                minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]);
     1300                for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
     1301                    for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
     1302                        M[i] = (sce0->coeffs[start+w2*128+i]
     1303                              + sce1->coeffs[start+w2*128+i]) * 0.5;
     1304                        S[i] =  M[i]
     1305                              - sce1->coeffs[start+w2*128+i];
     1306                    }
     1307                    abs_pow34_v(M34, M, sce0->ics.swb_sizes[g]);
     1308                    abs_pow34_v(S34, S, sce0->ics.swb_sizes[g]);
     1309                    for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) {
     1310                        Mmax = FFMAX(Mmax, M34[i]);
     1311                        Smax = FFMAX(Smax, S34[i]);
     1312                    }
     1313                }
     1314                mididx = av_clip(minidx, min_sf_idx_mid, min_sf_idx_mid + SCALE_MAX_DIFF);
     1315                sididx = av_clip(minidx, min_sf_idx_side, min_sf_idx_side + SCALE_MAX_DIFF);
     1316                midcb = find_min_book(Mmax, mididx);
     1317                sidcb = find_min_book(Smax, sididx);
     1318               
    10681319                for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
    10691320                    FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
    10701321                    FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
    10711322                    float minthr = FFMIN(band0->threshold, band1->threshold);
    1072                     float maxthr = FFMAX(band0->threshold, band1->threshold);
     1323                    int b1,b2,b3,b4;
    10731324                    for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
    10741325                        M[i] = (sce0->coeffs[start+w2*128+i]
    10751326                              + sce1->coeffs[start+w2*128+i]) * 0.5;
    static void search_for_ms(AACEncContext *s, ChannelElement *cpe,  
    10851336                                                sce0->ics.swb_sizes[g],
    10861337                                                sce0->sf_idx[(w+w2)*16+g],
    10871338                                                sce0->band_type[(w+w2)*16+g],
    1088                                                 lambda / band0->threshold, INFINITY, NULL);
     1339                                                lambda / band0->threshold, INFINITY, &b1);
    10891340                    dist1 += quantize_band_cost(s, sce1->coeffs + start + w2*128,
    10901341                                                R34,
    10911342                                                sce1->ics.swb_sizes[g],
    10921343                                                sce1->sf_idx[(w+w2)*16+g],
    10931344                                                sce1->band_type[(w+w2)*16+g],
    1094                                                 lambda / band1->threshold, INFINITY, NULL);
     1345                                                lambda / band1->threshold, INFINITY, &b2);
    10951346                    dist2 += quantize_band_cost(s, M,
    10961347                                                M34,
    10971348                                                sce0->ics.swb_sizes[g],
    1098                                                 sce0->sf_idx[(w+w2)*16+g],
    1099                                                 sce0->band_type[(w+w2)*16+g],
    1100                                                 lambda / maxthr, INFINITY, NULL);
     1349                                                mididx,
     1350                                                midcb,
     1351                                                lambda / minthr, INFINITY, &b3);
    11011352                    dist2 += quantize_band_cost(s, S,
    11021353                                                S34,
    11031354                                                sce1->ics.swb_sizes[g],
    1104                                                 sce1->sf_idx[(w+w2)*16+g],
    1105                                                 sce1->band_type[(w+w2)*16+g],
    1106                                                 lambda / minthr, INFINITY, NULL);
     1355                                                sididx,
     1356                                                sidcb,
     1357                                                lambda * (lambda / 120.0f) / (minthr * bmax), INFINITY, &b4);
     1358                    B0 += b1+b2;
     1359                    B1 += b3+b4;
     1360                    dist1 -= B0;
     1361                    dist2 -= B1;
     1362                }
     1363                cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0;
     1364                if (cpe->ms_mask[w*16+g]) {
     1365                    for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
     1366                        sce0->sf_idx[(w+w2)*16+g] = mididx;
     1367                        sce0->band_type[(w+w2)*16+g] = midcb;
     1368                        sce1->sf_idx[(w+w2)*16+g] = sididx;
     1369                        sce1->band_type[(w+w2)*16+g] = sidcb;
     1370                    }
    11071371                }
    1108                 cpe->ms_mask[w*16+g] = dist2 < dist1;
     1372            } else {
     1373                cpe->ms_mask[w*16+g] = 0;
    11091374            }
    11101375            start += sce0->ics.swb_sizes[g];
    11111376        }
  • libavcodec/aacenc.c

    diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
    index 3227edb..397c4c3 100644
    a b  
    5353        return AVERROR(EINVAL); \
    5454    }
    5555
     56#define WARN_IF(cond, ...) \
     57    if (cond) { \
     58        av_log(avctx, AV_LOG_WARNING, __VA_ARGS__); \
     59    }
     60
    5661float ff_aac_pow34sf_tab[428];
    5762
    5863static const uint8_t swb_size_1024_96[] = {
    static void adjust_frame_information(ChannelElement *cpe, int chans)  
    317322                if (cpe->common_window && !ch && cpe->ms_mask[w + g]) {
    318323                    for (i = 0; i < ics->swb_sizes[g]; i++) {
    319324                        cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0;
    320                         cpe->ch[1].coeffs[start+i] =  cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
     325                        cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
    321326                    }
    322327                }
    323328                start += ics->swb_sizes[g];
    static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,  
    507512    AACEncContext *s = avctx->priv_data;
    508513    float **samples = s->planar_samples, *samples2, *la, *overlap;
    509514    ChannelElement *cpe;
    510     int i, ch, w, g, chans, tag, start_ch, ret;
     515    int i, ch, w, g, chans, tag, start_ch, ret, frame_bits, its;
    511516    int chan_el_counter[4];
    512517    FFPsyWindowInfo windows[AAC_MAX_CHANNELS];
    513518
    static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,  
    572577    }
    573578    if ((ret = ff_alloc_packet2(avctx, avpkt, 8192 * s->channels)) < 0)
    574579        return ret;
     580   
     581    frame_bits = 0;
     582    its = 0;
    575583    do {
    576         int frame_bits;
    577 
     584        int target_bits, too_many_bits, too_few_bits;
     585       
    578586        init_put_bits(&s->pb, avpkt->data, avpkt->size);
    579587
    580588        if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT))
    581589            put_bitstream_info(s, LIBAVCODEC_IDENT);
    582590        start_ch = 0;
     591        target_bits = 0;
    583592        memset(chan_el_counter, 0, sizeof(chan_el_counter));
    584593        for (i = 0; i < s->chan_map[0]; i++) {
    585594            FFPsyWindowInfo* wi = windows + start_ch;
    static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,  
    591600            put_bits(&s->pb, 4, chan_el_counter[tag]++);
    592601            for (ch = 0; ch < chans; ch++)
    593602                coeffs[ch] = cpe->ch[ch].coeffs;
     603            s->psy.bitres.alloc = -1;
     604            s->psy.bitres.bits = avctx->frame_bits / s->channels;
    594605            s->psy.model->analyze(&s->psy, start_ch, coeffs, wi);
     606            if (s->psy.bitres.alloc > 0) {
     607                /* Lambda unused here on purpose, we need to take psy's unscaled allocation */
     608                target_bits += s->psy.bitres.alloc;
     609                s->psy.bitres.alloc /= chans;
     610            }
    595611            for (ch = 0; ch < chans; ch++) {
    596612                s->cur_channel = start_ch + ch;
    597613                s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda);
    static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,  
    635651            start_ch += chans;
    636652        }
    637653
     654        if (avctx->flags & CODEC_FLAG_QSCALE) {
     655            // When using a constant Q-scale, don't mess with lambda
     656            break;
     657        }
     658       
     659        // rate control stuff
     660        // target either the nominal bitrate, or what psy's bit reservoir says to target
     661        // whichever is greatest
    638662        frame_bits = put_bits_count(&s->pb);
    639         if (frame_bits <= 6144 * s->channels - 3) {
    640             s->psy.bitres.bits = frame_bits / s->channels;
     663        target_bits = FFMAX(target_bits, avctx->bit_rate * 1024 / avctx->sample_rate);
     664        target_bits = FFMIN(target_bits, 6144 * s->channels - 3);
     665       
     666        // When using ABR, be strict (but only for increasing)
     667        too_many_bits = target_bits + target_bits/2;
     668        too_few_bits = target_bits - target_bits/8;
     669        //fprintf(stderr, "l:%f\t%d\t%d\t%d\t%d\n", s->lambda, too_few_bits, frame_bits, target_bits, too_many_bits);
     670       
     671        if (   its == 0 /* for steady-state Q-scale tracking */
     672            || (its < 5 && (frame_bits < too_few_bits || frame_bits > too_many_bits))
     673            || frame_bits >= 6144 * s->channels - 3  )
     674        {
     675            float ratio = ((float)target_bits) / frame_bits;
     676           
     677            if (frame_bits >= too_few_bits && frame_bits <= too_many_bits) {
     678                /*
     679                This path is for steady-state Q-scale tracking
     680                When frame bits fall within the stable range, we still need to adjust
     681                lambda to maintain it like so in a stable fashion (large jumps in lambda
     682                create artifacts and shoulda be avoided), but slowly
     683                */
     684                ratio = sqrtf(sqrtf(ratio));
     685                ratio = av_clipf(ratio, 0.9f, 1.1f);
     686            } else {
     687                /* Not so fast though */
     688                ratio = sqrtf(ratio);
     689            }
     690            s->lambda = FFMIN(s->lambda * ratio, 65536.f);
     691           
     692            // Keep iterating if we must reduce and lambda is in the sky
     693            if (s->lambda < 300.f || ratio > 0.9f)
     694                break;
     695            else
     696                its++;
     697        } else {
    641698            break;
    642699        }
    643 
    644         s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;
    645 
    646700    } while (1);
    647701
    648702    put_bits(&s->pb, 3, TYPE_END);
    649703    flush_put_bits(&s->pb);
    650704    avctx->frame_bits = put_bits_count(&s->pb);
    651705
    652     // rate control stuff
    653     if (!(avctx->flags & CODEC_FLAG_QSCALE)) {
    654         float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits;
    655         s->lambda *= ratio;
    656         s->lambda = FFMIN(s->lambda, 65536.f);
    657     }
    658 
    659706    if (!frame)
    660707        s->last_frame++;
    661708
    static av_cold int aac_encode_init(AVCodecContext *avctx)  
    739786             "Unsupported number of channels: %d\n", s->channels);
    740787    ERROR_IF(avctx->profile != FF_PROFILE_UNKNOWN && avctx->profile != FF_PROFILE_AAC_LOW,
    741788             "Unsupported profile %d\n", avctx->profile);
    742     ERROR_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
    743              "Too many bits per frame requested\n");
     789    WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
     790             "Too many bits per frame requested, clamping to max\n");
     791   
     792    avctx->bit_rate = (int)FFMIN(
     793        6144 * s->channels / 1024.0 * avctx->sample_rate,
     794        avctx->bit_rate);
    744795
    745796    s->samplerate_index = i;
    746797
  • libavcodec/aacpsy.c

    diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c
    index d2a782e..95110fd 100644
    a b enum {  
    8787};
    8888
    8989#define PSY_3GPP_BITS_TO_PE(bits) ((bits) * 1.18f)
     90#define PSY_3GPP_PE_TO_BITS(bits) ((bits) / 1.18f)
    9091
    9192/* LAME psy model constants */
    9293#define PSY_LAME_FIR_LEN 21         ///< LAME psy model FIR order
    static float lame_calc_attack_threshold(int bitrate)  
    255256/**
    256257 * LAME psy model specific initialization
    257258 */
    258 static av_cold void lame_window_init(AacPsyContext *ctx, AVCodecContext *avctx)
    259 {
     259static void lame_window_init(AacPsyContext *ctx, AVCodecContext *avctx) {
    260260    int i, j;
    261261
    262262    for (i = 0; i < avctx->channels; i++) {
    static av_cold int psy_3gpp_init(FFPsyContext *ctx) {  
    299299    float bark;
    300300    int i, j, g, start;
    301301    float prev, minscale, minath, minsnr, pe_min;
    302     const int chan_bitrate = ctx->avctx->bit_rate / ctx->avctx->channels;
     302    int chan_bitrate = ctx->avctx->bit_rate / ((ctx->avctx->flags & CODEC_FLAG_QSCALE) ? 2.0f : ctx->avctx->channels);
    303303    const int bandwidth    = ctx->avctx->cutoff ? ctx->avctx->cutoff : AAC_CUTOFF(ctx->avctx);
    304304    const float num_bark   = calc_bark((float)bandwidth);
    305305
    306306    ctx->model_priv_data = av_mallocz(sizeof(AacPsyContext));
    307307    pctx = (AacPsyContext*) ctx->model_priv_data;
    308308
     309    if (ctx->avctx->flags & CODEC_FLAG_QSCALE) {
     310        /* Use the target average bitrate to compute spread parameters */
     311        chan_bitrate = (int)(chan_bitrate / 120.0 * (ctx->avctx->global_quality ? ctx->avctx->global_quality : 120));
     312    }
     313   
    309314    pctx->chan_bitrate = chan_bitrate;
    310     pctx->frame_bits   = chan_bitrate * AAC_BLOCK_SIZE_LONG / ctx->avctx->sample_rate;
     315    pctx->frame_bits   = FFMIN(2560, chan_bitrate * AAC_BLOCK_SIZE_LONG / ctx->avctx->sample_rate);
    311316    pctx->pe.min       =  8.0f * AAC_BLOCK_SIZE_LONG * bandwidth / (ctx->avctx->sample_rate * 2.0f);
    312317    pctx->pe.max       = 12.0f * AAC_BLOCK_SIZE_LONG * bandwidth / (ctx->avctx->sample_rate * 2.0f);
    313318    ctx->bitres.size   = 6144 - pctx->frame_bits;
    314319    ctx->bitres.size  -= ctx->bitres.size % 8;
    315320    pctx->fill_level   = ctx->bitres.size;
    316321    minath = ath(3410, ATH_ADD);
     322   
    317323    for (j = 0; j < 2; j++) {
    318324        AacPsyCoeffs *coeffs = pctx->psy_coef[j];
    319325        const uint8_t *band_sizes = ctx->bands[j];
    static av_unused FFPsyWindowInfo psy_3gpp_window(FFPsyContext *ctx,  
    391397                                                 int channel, int prev_type)
    392398{
    393399    int i, j;
    394     int br               = ctx->avctx->bit_rate / ctx->avctx->channels;
     400    int br               = ((AacPsyContext*)ctx->model_priv_data)->chan_bitrate;
    395401    int attack_ratio     = br <= 16000 ? 18 : 10;
    396402    AacPsyContext *pctx = (AacPsyContext*) ctx->model_priv_data;
    397403    AacPsyChannel *pch  = &pctx->ch[channel];
    static int calc_bit_demand(AacPsyContext *ctx, float pe, int bits, int size,  
    501507    ctx->pe.max = FFMAX(pe, ctx->pe.max);
    502508    ctx->pe.min = FFMIN(pe, ctx->pe.min);
    503509
    504     return FFMIN(ctx->frame_bits * bit_factor, ctx->frame_bits + size - bits);
     510    /* NOTE: allocate a minimum of 1/8th average frame bits, to avoid
     511     *   reservoir starvation from producing zero-bit frames
     512     */
     513    return FFMIN(
     514        ctx->frame_bits * bit_factor,
     515        FFMAX(ctx->frame_bits + size - bits, ctx->frame_bits / 8));
    505516}
    506517
    507518static float calc_pe_3gpp(AacPsyBand *band)
    static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel,  
    628639    const uint8_t *band_sizes  = ctx->bands[wi->num_windows == 8];
    629640    AacPsyCoeffs  *coeffs      = pctx->psy_coef[wi->num_windows == 8];
    630641    const float avoid_hole_thr = wi->num_windows == 8 ? PSY_3GPP_AH_THR_SHORT : PSY_3GPP_AH_THR_LONG;
    631 
     642   
    632643    //calculate energies, initial thresholds and related values - 5.4.2 "Threshold Calculation"
    633644    calc_thr_3gpp(wi, num_bands, pch, band_sizes, coefs);
    634645
    static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel,  
    671682
    672683    /* 5.6.1.3.2 "Calculation of the desired perceptual entropy" */
    673684    ctx->ch[channel].entropy = pe;
    674     desired_bits = calc_bit_demand(pctx, pe, ctx->bitres.bits, ctx->bitres.size, wi->num_windows == 8);
    675     desired_pe = PSY_3GPP_BITS_TO_PE(desired_bits);
    676     /* NOTE: PE correction is kept simple. During initial testing it had very
    677      *       little effect on the final bitrate. Probably a good idea to come
    678      *       back and do more testing later.
    679      */
    680     if (ctx->bitres.bits > 0)
    681         desired_pe *= av_clipf(pctx->pe.previous / PSY_3GPP_BITS_TO_PE(ctx->bitres.bits),
    682                                0.85f, 1.15f);
     685    if (ctx->avctx->flags & CODEC_FLAG_QSCALE) {
     686        /* (2.5 * 120) achieves almost transparent rate, and we want to give
     687         * ample room downwards, so we make that equivalent to QSCALE=2.4
     688         */
     689        desired_pe = pe * (ctx->avctx->global_quality ? ctx->avctx->global_quality : 120) / (2 * 2.5f * 120.0f);
     690        desired_bits = FFMIN(2560, PSY_3GPP_PE_TO_BITS(desired_pe));
     691        desired_pe = PSY_3GPP_BITS_TO_PE(desired_bits); // reflect clipping
     692       
     693        pctx->pe.max = FFMAX(pe, pctx->pe.max);
     694        pctx->pe.min = FFMIN(pe, pctx->pe.min);
     695    } else {
     696        desired_bits = calc_bit_demand(pctx, pe, ctx->bitres.bits, ctx->bitres.size, wi->num_windows == 8);
     697        desired_pe = PSY_3GPP_BITS_TO_PE(desired_bits);
     698   
     699        /* NOTE: PE correction is kept simple. During initial testing it had very
     700         *       little effect on the final bitrate. Probably a good idea to come
     701         *       back and do more testing later.
     702         */
     703        if (ctx->bitres.bits > 0)
     704            desired_pe *= av_clipf(pctx->pe.previous / PSY_3GPP_BITS_TO_PE(ctx->bitres.bits),
     705                                   0.85f, 1.15f);
     706    }
    683707    pctx->pe.previous = PSY_3GPP_BITS_TO_PE(desired_bits);
    684 
     708    ctx->bitres.alloc = desired_bits;
     709   
    685710    if (desired_pe < pe) {
    686711        /* 5.6.1.3.4 "First Estimation of the reduction value" */
    687712        for (w = 0; w < wi->num_windows*16; w += 16) {
    static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel,  
    717742            }
    718743            desired_pe_no_ah = FFMAX(desired_pe - (pe - pe_no_ah), 0.0f);
    719744            if (active_lines > 0.0f)
    720                 reduction += calc_reduction_3gpp(a, desired_pe_no_ah, pe_no_ah, active_lines);
     745                reduction = calc_reduction_3gpp(a, desired_pe_no_ah, pe_no_ah, active_lines);
    721746
    722747            pe = 0.0f;
    723748            for (w = 0; w < wi->num_windows*16; w += 16) {
  • libavcodec/psymodel.c

    diff --git a/libavcodec/psymodel.c b/libavcodec/psymodel.c
    index bfc85b3..cc25fca 100644
    a b av_cold struct FFPsyPreprocessContext* ff_psy_preprocess_init(AVCodecContext *av  
    101101    ctx        = av_mallocz(sizeof(FFPsyPreprocessContext));
    102102    ctx->avctx = avctx;
    103103
    104     if (avctx->cutoff > 0)
    105         cutoff_coeff = 2.0 * avctx->cutoff / avctx->sample_rate;
    106 
    107     if (!cutoff_coeff && avctx->codec_id == AV_CODEC_ID_AAC)
    108         cutoff_coeff = 2.0 * AAC_CUTOFF(avctx) / avctx->sample_rate;
    109 
    110     if (cutoff_coeff && cutoff_coeff < 0.98)
    111     ctx->fcoeffs = ff_iir_filter_init_coeffs(avctx, FF_FILTER_TYPE_BUTTERWORTH,
    112                                              FF_FILTER_MODE_LOWPASS, FILT_ORDER,
    113                                              cutoff_coeff, 0.0, 0.0);
    114     if (ctx->fcoeffs) {
    115         ctx->fstate = av_mallocz(sizeof(ctx->fstate[0]) * avctx->channels);
    116         for (i = 0; i < avctx->channels; i++)
    117             ctx->fstate[i] = ff_iir_filter_init_state(FILT_ORDER);
     104    /* AAC has its own LP method */
     105    if (avctx->codec_id != AV_CODEC_ID_AAC) {
     106        if (avctx->cutoff > 0)
     107            cutoff_coeff = 2.0 * avctx->cutoff / avctx->sample_rate;
     108
     109        if (cutoff_coeff && cutoff_coeff < 0.98)
     110        ctx->fcoeffs = ff_iir_filter_init_coeffs(avctx, FF_FILTER_TYPE_BUTTERWORTH,
     111                                                 FF_FILTER_MODE_LOWPASS, FILT_ORDER,
     112                                                 cutoff_coeff, 0.0, 0.0);
     113        if (ctx->fcoeffs) {
     114            ctx->fstate = av_mallocz(sizeof(ctx->fstate[0]) * avctx->channels);
     115            for (i = 0; i < avctx->channels; i++)
     116                ctx->fstate[i] = ff_iir_filter_init_state(FILT_ORDER);
     117        }
    118118    }
    119119
    120120    ff_iir_filter_init(&ctx->fiir);
  • libavcodec/psymodel.h

    diff --git a/libavcodec/psymodel.h b/libavcodec/psymodel.h
    index d1a126a..5ebd44f 100644
    a b  
    2727/** maximum possible number of bands */
    2828#define PSY_MAX_BANDS 128
    2929/** maximum number of channels */
    30 #define PSY_MAX_CHANS 20
     30#define PSY_MAX_CHANS 24
    3131
    32 #define AAC_CUTOFF(s) (s->bit_rate ? FFMIN3(4000 + s->bit_rate/8, 12000 + s->bit_rate/32, s->sample_rate / 2) : (s->sample_rate / 2))
     32/* cutoff for VBR is purposedly increased, since LP filtering actually
     33 * hinders VBR performance rather than the opposite
     34 */
     35#define _AAC_CUTOFF(bit_rate,channels,sample_rate) (bit_rate ? FFMIN3(FFMIN3( \
     36    bit_rate/channels/2, \
     37    3000 + bit_rate/channels/4, \
     38    12000 + bit_rate/channels/16), \
     39    20000, \
     40    sample_rate / 2): (sample_rate / 2))
     41#define AAC_CUTOFF(s) ( \
     42    (s->flags & CODEC_FLAG_QSCALE) \
     43    ? /*_AAC_CUTOFF(((int)(480000.0f*(s->global_quality ? s->global_quality/120.0f : 1.0f))), 1, s->sample_rate)*/s->sample_rate / 2 \
     44    : _AAC_CUTOFF(s->bit_rate, s->channels, s->sample_rate) \
     45)
    3346
    3447/**
    3548 * single band psychoacoustic information
    typedef struct FFPsyContext {  
    88101    struct {
    89102        int size;                     ///< size of the bitresevoir in bits
    90103        int bits;                     ///< number of bits used in the bitresevoir
     104        int alloc;                    ///< number of bits allocated by the psy, or -1 if no allocation was done
    91105    } bitres;
    92106
    93107    void* model_priv_data;            ///< psychoacoustic model implementation private data