This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 9d0a4132ff5b53ba2240ed2465f953a0d1a55634
Author:     Lynne <[email protected]>
AuthorDate: Fri Jul 17 14:20:18 2026 +0800
Commit:     Lynne <[email protected]>
CommitDate: Sun Jul 19 20:41:53 2026 +0800

    avcodec/aacenc: rework NMR stereo decisions, retune coded bandwidth
    
    Stereo decisions are made per band before quantization, from the psy
    model's spectra, and carry cross-frame memory (EMA-smoothed statistics,
    per-grid mode banks, leave-hysteresis) so the image holds instead of
    churning:
    
      * M/S adopts content-driven and rate-free (side under half the mid);
        for mid-dominant bands M/S is simply the better coding at every
        rate, and a wandering L/R fraction reads as image instability.
      * I/S competes with M/S above 6.1 kHz instead of only seeing M/S
        rejects (which are exactly the wide bands it cannot render), and
        engages under SUSTAINED strain only: the pressure ramp gated by the
        lambda floor, so pressure spikes at a comfortable operating point
        cannot flood it onto content where coding the side is affordable
        and strictly better. Unengaged candidates fall back to M/S.
      * Pairs whose joint-tool candidacy fraction stays low decouple:
        block switching goes per-channel and M/S stops, matching how
        independent coding wins on diffuse decorrelated content.
      * PNS in a pair is reserved for clearly-wide bands (it renders
        uncorrelated noise per channel).
    
    Block switching for a pair is decided through the psy window_pair()
    hook so common_window survives transients.
    
    The NMR rate-to-bandwidth table is retuned upward at >= 48 kbps/ch to
    track the bandwidth strong encoders deliver; both quality metrics
    improve on a 16-clip battery and wider regresses. Lower rates are
    unchanged.
---
 libavcodec/aacenc.c                                | 239 ++++++++++++++-------
 tests/fate/aac.mak                                 |   6 +-
 tests/ref/fate/id3v2-reenc-delete-metadata         |   4 +-
 tests/ref/fate/id3v2-reenc-delete-metadata-keep    |   4 +-
 .../fate/id3v2-reenc-delete-metadata-keep-format   |   4 +-
 .../fate/id3v2-reenc-delete-metadata-keep-stream   |   4 +-
 .../fate/id3v2-reenc-delete-metadata-map-metadata  |   4 +-
 7 files changed, 170 insertions(+), 95 deletions(-)

diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
index 6fc9254ae8..3ace4067dc 100644
--- a/libavcodec/aacenc.c
+++ b/libavcodec/aacenc.c
@@ -577,36 +577,31 @@ static void apply_intensity_stereo(ChannelElement *cpe)
     }
 }
 
-/* Intensity stereo is only allowed when its irreducible image error */
-#define NMR_IS_IMG_GATE 0.5f
+/* I/S acceptance level for the image-error EMA at full rate pressure */
+#define NMR_IS_IMG_GATE 8000.0f
 
 /* Frequency in Hz for the lower limit of intensity stereo */
 #define NMR_IS_LOW_LIMIT 6100
 
-/* Rate ceiling (bits/sample/channel) above which intensity is skipped, 
~145kbps */
-#define NMR_IS_MAXBPS 1.52f
+/* M/S adoption: es < 0.5*em, content-driven and rate-free */
+#define NMR_MS_EQUIV 0.5f
+#define NMR_MS_MASK  0.0f
 
-/* The rate ceiling is lifted on hard-to-code frames. The signal is the bit
- * reservoir going into deficit: a negative fill means the trellis is spending
- * more than the nominal rate to hold quality (operating lambda has climbed). 
*/
-#define NMR_IS_FILLGAIN 0.27f
-#define NMR_IS_FILLMAX  0.40f
+/* Pair decouple threshold on the joint-tool candidacy fraction EMA: pairs
+ * whose joint tools are mostly dead (diffuse decorrelated content) window
+ * per-channel and skip M/S; recouple above 1.3x. */
+#define NMR_DECORR_LO 0.20f
 
-/* M/S thresholds: a band is recoded as mid+side when the side is negligible */
-#define NMR_MS_EQUIV 0.01f
-#define NMR_MS_MASK  0.0f
+/* Stereo-decision hysteresis: leaving a joint mode costs a margin. */
+#define NMR_STICKY 2.0f
 
-/* PNS-stereo decorrelation gate: a band may be noise-substituted in a CPE 
only if its
- * side energy is at least this fraction of its mid energy, i.e. the image is 
genuinely
- * wide (channels decorrelated). PNS renders uncorrelated noise per channel, 
so it only
- * preserves the image on already-wide bands; a much stricter bar than I/S 
(which can
- * collapse correlated bands). Lower = more PNS / more imaging risk. */
+/* Decision statistics are EMA-smoothed across frames. */
+#define NMR_SDEC_EMA 0.75f
+
+/* PNS-stereo gate: substitute only clearly-decorrelated (wide) bands. */
 #define NMR_PNS_STEREO_DECORR 0.6f
 
-/* Recode one band's window group as mid+side in place, updating the psy band
- * energies/thresholds to the M/S spectra. The threshold is halved as a coarse 
guard
- * against L/R unmasking of the independently-quantized M/S noise (M/S is a 
lossless
- * rotation but lossy coding). Used for the M/S decision and the intensity 
fallback. */
+/* Recode one band's window group as mid+side in place. */
 static void nmr_apply_ms_band(AACEncContext *s, ChannelElement *cpe,
                               int w, int g, int start, int len, int gl)
 {
@@ -624,25 +619,22 @@ static void nmr_apply_ms_band(AACEncContext *s, 
ChannelElement *cpe,
             R[i] = m - R[i]; L[i] = m;
             em += L[i]*L[i]; es += R[i]*R[i];
         }
-        b0->threshold = b1->threshold = FFMIN(b0->threshold, b1->threshold) * 
0.5f;
+        b0->threshold = FFMIN(b0->threshold, b1->threshold) * 0.5f;
+        b1->threshold = b0->threshold;
         b0->energy = em; b1->energy = es;
     }
 }
 
-/* Intensity-stereo perceptual test for one band's window group: collapse the 
pair
- * to a single carrier (L + p*R)*scale that the decoder rescales per channel, 
and
- * check that the irreducible image error, which no bit budget can reduce, is
- * masked in both channels. On success returns 1 and fills the carrier scale, 
the
- * decoder's R/carrier ratio sr_, and the phase p. The caller restricts this 
to HF
- * bands with energy in both channels. */
+/* I/S perceptual test: reconstruction image error vs the pair's masks. */
 static int nmr_is_image_masked(AACEncContext *s, ChannelElement *cpe,
                                int w, int g, int start, int len, int gl,
                                float ener0, float ener1, float dot,
-                               float minthr0, float minthr1,
+                               float minthr0, float minthr1, float *ratio_out,
                                float *scale_out, float *sr_out, int *p_out)
 {
     int p = dot >= 0.0f ? 1 : -1;
     float ener01 = ener0 + ener1 + 2*p*dot;     /* energy of L + p*R */
+    *ratio_out = FLT_MAX;
     if (ener01 <= FLT_MIN)
         return 0;
     float scale = sqrtf(ener0 / ener01);        /* carrier = (L + p*R)*scale */
@@ -657,9 +649,8 @@ static int nmr_is_image_masked(AACEncContext *s, 
ChannelElement *cpe,
             img0 += dl*dl; img1 += dr*dr;
         }
     }
-    if (img0 >= NMR_IS_IMG_GATE * minthr0 * gl ||
-        img1 >= NMR_IS_IMG_GATE * minthr1 * gl)
-        return 0;
+    *ratio_out = FFMAX(img0 / FFMAX(minthr0 * gl, FLT_MIN),
+                       img1 / FFMAX(minthr1 * gl, FLT_MIN));
     *scale_out = scale; *sr_out = sr_; *p_out = p;
     return 1;
 }
@@ -704,31 +695,36 @@ static void nmr_decide_stereo(AACEncContext *s, 
ChannelElement *cpe)
     IndividualChannelStream *ics = &sce0->ics;
     const AVCodecContext *avctx = s->psy.avctx;
     const float freq_mult = avctx->sample_rate / (1024.0f / ics->num_windows) 
/ 2.0f;
-    const float bps = avctx->bit_rate > 0 ?
-                      (float)avctx->bit_rate / avctx->sample_rate / 
avctx->ch_layout.nb_channels : 0.0f;
     int is_count = 0;
 
-    /* Stereo decision, with no bitrate dependence. Start from full L/R and 
depart from
-     * it only where the change is inaudible. M/S and I/S differ in what they 
trade:
-     *   M/S  recodes the pair as mid+side -- an invertible rotation, but the 
M and S
-     *        are quantized independently, so it is lossy coding whose noise 
un-mixes
-     *        back to L/R. Used where it barely changes the result (the side is
-     *        negligible vs the mid, so it is ~equivalent to L/R at the same 
rate) --
-     *        OR where the doubled side energy is masked.
-     *   I/S  drops the side phase and keeps its energy, where the residual 
image error
-     *        is masked. Used for the decorrelated HF that M/S cannot help.
-     * Both tests are content/perceptual and frame-stable, so the image holds. 
*/
-
-    /* I/S rate gate: eligible at/below ~128 kbps, with the ceiling lifted on 
hard
-     * frames (bit reservoir in deficit) so a starved high-rate passage can 
still
-     * call on intensity. Where an I/S candidate is found but IS is not 
eligible, fall
-     * back to M/S: not free, but ~equivalent to L/R there and it lets the 
energy
-     * compact into the mid. */
-    const float rate_frame = avctx->bit_rate * 1024.0f / 
FFMAX(avctx->sample_rate, 1);
-    const float deficit = (s->nmr && rate_frame > 0.0f)
-                          ? FFMAX(0.0f, -(float)s->nmr->rc_fill / rate_frame) 
: 0.0f;
-    const float is_bonus = FFMIN(NMR_IS_FILLMAX, NMR_IS_FILLGAIN * deficit);
-    const int allow_is = s->options.intensity_stereo && bps < NMR_IS_MAXBPS + 
is_bonus;
+    if (s->nmr) {
+        int pi = (s->cur_channel >> 1) & 7;
+        pi = pi * 2 + (ics->num_windows == 8);   /* per-grid state bank */
+        if (!s->nmr->sinit[pi]) {
+            /* one-time init; per-grid banks persist across window switches
+             * (wiping them churned stereo modes audibly) */
+            memset(s->nmr->smode[pi], 0, sizeof(s->nmr->smode[pi]));
+            for (int b = 0; b < 128; b++) {
+                s->nmr->sema_em[pi][b]  = 0.0f;
+                s->nmr->sema_img[pi][b] = -1.0f;
+            }
+            s->nmr->sinit[pi] = 1;
+        }
+    }
+
+    /* Per-band stereo decision (L/R vs M/S vs I/S), made pre-quantization from
+     * the psy model so the trellis allocates on the coded spectra. */
+
+    /* I/S engages under SUSTAINED strain only: rate pressure gated by the
+     * lambda floor (pressure spikes at a comfortable operating point must
+     * not admit it). Unengaged candidates fall back to M/S. */
+    float is_ramp = s->nmr ? s->nmr->press *
+        av_clipf((s->nmr->lam_floor - 40.0f) / (120.0f - 40.0f), 0.0f, 1.0f) : 
0.0f;
+    const int allow_is = s->options.intensity_stereo && is_ramp > 0.0f;
+
+    const int pidx = (s->cur_channel >> 1) & 15;
+    const int decoupled = s->psy.pair_decoupled[pidx];
+    int njoint = 0, nbands = 0;   /* joint-tool candidacy census, decouple 
feed */
 
     for (int w = 0; w < ics->num_windows; w += ics->group_len[w]) {
         int start = 0;
@@ -758,39 +754,97 @@ static void nmr_decide_stereo(AACEncContext *s, 
ChannelElement *cpe)
             }
             float thr_g = FFMIN(minthr0, minthr1) * gl;   /* group masking 
budget */
 
-            /* PNS-stereo reservation. Reserve a band for noise substitution 
only if it
-             * is noise-like in both channels (intersected can_pns) and clearly
-             * decorrelated (wide image). */
-            if (cpe->ch[0].can_pns[w*16+g] && cpe->ch[1].can_pns[w*16+g] &&
-                es_tot > NMR_PNS_STEREO_DECORR * em_tot)
-                continue;
+            /* PNS-stereo reservation: keep clearly-wide noise bands for PNS. 
*/
+            const int sidx = w*16+g;
+            {
+                float es_w = es_tot, em_w = em_tot;
+                if (s->nmr) {
+                    int pi_ = ((s->cur_channel >> 1) & 7) * 2 + 
(cpe->ch[0].ics.num_windows == 8);
+                    float pe = s->nmr->sema_es[pi_][sidx];
+                    float pm = s->nmr->sema_em[pi_][sidx];
+                    if (pm > 0.0f) {
+                        es_w = NMR_SDEC_EMA * pe + (1.0f - NMR_SDEC_EMA) * 
es_tot;
+                        em_w = NMR_SDEC_EMA * pm + (1.0f - NMR_SDEC_EMA) * 
em_tot;
+                    }
+                }
+                if (cpe->ch[0].can_pns[w*16+g] && cpe->ch[1].can_pns[w*16+g] &&
+                    es_w > NMR_PNS_STEREO_DECORR * em_w)
+                    continue;
+            }
             cpe->ch[0].can_pns[w*16+g] = cpe->ch[1].can_pns[w*16+g] = 0;
 
-            int ms_ok = s->options.mid_side &&
-                        (s->options.mid_side == 1 ||
-                         es_tot < NMR_MS_EQUIV * em_tot ||
-                         es_tot < NMR_MS_MASK  * thr_g);
-            float scale, sr_; int p;
-            int is_ok = !ms_ok &&
-                        start * freq_mult > NMR_IS_LOW_LIMIT &&
-                        ener0 > FLT_MIN && ener1 > FLT_MIN &&
-                        nmr_is_image_masked(s, cpe, w, g, start, len, gl,
-                                            ener0, ener1, dot, minthr0, 
minthr1,
-                                            &scale, &sr_, &p);
-
-            if (ms_ok) {
-                nmr_apply_ms_band(s, cpe, w, g, start, len, gl);
-            } else if (is_ok && allow_is) {
+            int pi = ((s->cur_channel >> 1) & 7) * 2 + 
(cpe->ch[0].ics.num_windows == 8);
+            uint8_t *pmode = s->nmr ? s->nmr->smode[pi] : NULL;
+            int prev = pmode ? pmode[sidx] : 0;
+            float eqgate = NMR_MS_EQUIV * (prev == 1 ? 1.5f : 1.0f);   /* 
stay-until es>0.75em */
+            /* I/S = lossy economy: image-error budget scales with pressure */
+            float imgate = NMR_IS_IMG_GATE * is_ramp * (prev == 2 ? NMR_STICKY 
: 1.0f);
+            float es_d = es_tot, em_d = em_tot;
+            if (s->nmr) {
+                float *ees = &s->nmr->sema_es[pi][sidx];
+                float *eem = &s->nmr->sema_em[pi][sidx];
+                if (*eem <= 0.0f) { *ees = es_tot; *eem = em_tot; }
+                else {
+                    *ees = NMR_SDEC_EMA * *ees + (1.0f - NMR_SDEC_EMA) * 
es_tot;
+                    *eem = NMR_SDEC_EMA * *eem + (1.0f - NMR_SDEC_EMA) * 
em_tot;
+                }
+                es_d = *ees; em_d = *eem;
+            }
+            int ms_would = s->options.mid_side &&
+                           (s->options.mid_side == 1 ||
+                            es_d < eqgate * em_d ||
+                            es_tot < NMR_MS_MASK  * thr_g);
+            int ms_ok = ms_would && !decoupled;
+            float scale, sr_, imgratio; int p;
+            /* I/S competes with M/S above the frequency limit (candidacy must
+             * not be gated on !ms_ok - that leaves only unrenderable bands) */
+            int is_cand = start * freq_mult > NMR_IS_LOW_LIMIT &&
+                          ener0 > FLT_MIN && ener1 > FLT_MIN &&
+                          nmr_is_image_masked(s, cpe, w, g, start, len, gl,
+                                              ener0, ener1, dot, minthr0, 
minthr1,
+                                              &imgratio, &scale, &sr_, &p);
+            int is_ok = is_cand;
+            if (s->nmr && start * freq_mult > NMR_IS_LOW_LIMIT) {
+                /* smoothed image-error; updated only while candidate 
(fail-value
+                 * feeding jammed it permanently high) */
+                float *eim = &s->nmr->sema_img[pi][sidx];
+                if (is_cand) {
+                    /* seed from first measurement; freeze when not candidate 
*/
+                    if (*eim < 0.0f) *eim = imgratio;
+                    else *eim = NMR_SDEC_EMA * *eim + (1.0f - NMR_SDEC_EMA) * 
FFMIN(imgratio, 100.0f * NMR_IS_IMG_GATE);
+                }
+                is_ok = is_cand && *eim >= 0.0f && *eim < imgate;
+            }
+
+            njoint += ms_would || is_ok; nbands++;
+            if (pmode) {
+                int m_ = (is_ok && allow_is) ? 2 : ms_ok ? 1 :
+                         (is_ok && s->options.mid_side) ? 1 : 0;
+                pmode[sidx] = m_;
+                s->nmr->smode_band[(s->cur_channel >> 1) & 7][w*16+g] = m_;
+            }
+            if (is_ok && allow_is) {
                 nmr_apply_is_band(s, cpe, w, g, start, len, gl,
                                   scale, sr_, p, ener0, ener1);
                 is_count++;
-            } else if (is_ok && s->options.mid_side) {
+            } else if (ms_ok || (is_ok && s->options.mid_side)) {
                 nmr_apply_ms_band(s, cpe, w, g, start, len, gl);
             }
             /* else: keep full L/R stereo */
         }
     }
     cpe->is_mode = !!is_count;
+
+    if (nbands > 0) {
+        /* Pair joint-tool value, read next frame by the psy pair-synced window
+         * decision and the M/S candidacy above. Measured as CANDIDACY (not
+         * adoption) so decoupling cannot starve its own signal and self-lock. 
*/
+        float r = (float)njoint / nbands;
+        float *pj = &s->psy.pair_joint[pidx];
+        *pj = *pj > 0.0f ? 0.95f * *pj + 0.05f * r : r;
+        s->psy.pair_decoupled[pidx] = *pj <
+            (s->psy.pair_decoupled[pidx] ? 1.3f * NMR_DECORR_LO : 
NMR_DECORR_LO);
+    }
 }
 
 static void apply_mid_side_stereo(ChannelElement *cpe)
@@ -1043,7 +1097,22 @@ static int aac_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
         tag      = s->chan_map[i+1];
         chans    = tag == TYPE_CPE ? 2 : 1;
         cpe      = &s->cpe[i];
-        for (ch = 0; ch < chans; ch++) {
+        {
+            int wi_paired = 0;
+            /* Synced pair windows: decide both channels of a CPE together so
+             * their block switching never diverges (see psy window_pair). */
+            if (chans == 2 && tag != TYPE_LFE && s->psy.model->window_pair && 
frame) {
+                const float *ov0 = &samples[start_ch][0],     *ov1 = 
&samples[start_ch + 1][0];
+                s->psy.model->window_pair(&s->psy,
+                                          ov0 + 1024, ov0 + 1024 + 448 + 64,
+                                          ov1 + 1024, ov1 + 1024 + 448 + 64,
+                                          start_ch, start_ch + 1,
+                                          cpe->ch[0].ics.window_sequence[0],
+                                          cpe->ch[1].ics.window_sequence[0],
+                                          wi);
+                wi_paired = 1;
+            }
+            for (ch = 0; ch < chans; ch++) {
             int k;
             float clip_avoidance_factor;
             sce = &cpe->ch[ch];
@@ -1066,7 +1135,7 @@ static int aac_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
                  * being used for 11.025kHz to 16kHz sample rates.
                  */
                 ics->num_swb = s->samplerate_index >= 8 ? 1 : 3;
-            } else {
+            } else if (!wi_paired) {
                 wi[ch] = s->psy.model->window(&s->psy, samples2, la, 
s->cur_channel,
                                               ics->window_sequence[0]);
             }
@@ -1124,6 +1193,7 @@ static int aac_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
             }
             avoid_clipping(s, sce);
         }
+        }
         start_ch += chans;
     }
     if ((ret = ff_alloc_packet(avctx, avpkt, 8192 * s->channels)) < 0)
@@ -1218,6 +1288,10 @@ static int aac_encode_frame(AVCodecContext *avctx, 
AVPacket *avpkt,
                 s->cur_channel = start_ch;
                 nmr_decide_stereo(s, cpe);
             }
+            /* NMR pools the CPE bit budget: both channels of a pair are solved
+             * jointly under one shared lambda (see aaccoder_nmr.h). */
+            if (s->options.coder == AAC_CODER_NMR && s->nmr)
+                s->nmr->pair = (chans == 2);
             for (ch = 0; ch < chans; ch++) {
                 s->cur_channel = start_ch + ch;
                 /* NMR PNS is mono-only */
@@ -1587,11 +1661,12 @@ static av_cold int aac_encode_init(AVCodecContext 
*avctx)
                        (avctx->bit_rate / 2.0f * (s->lambda / 120.f) * 1.5f) :
                        (avctx->bit_rate / avctx->ch_layout.nb_channels);
 
-        /* For NMR, the rate to bandwidth conversion was tuned to maximize 
metrics
-         * over a variable cutoff x bitrate combo */
+        /* For NMR, the rate to bandwidth conversion was tuned to maximize
+         * metrics over a variable cutoff x bitrate combo (>= 48kbps/ch tracks
+         * the bandwidth the strongest encoders deliver; wider regresses). */
         if (s->options.coder == AAC_CODER_NMR && frame_br >= 32000) {
             static const int rates[] = { 32000, 48000, 64000, 96000, 192000 };
-            static const int bws[]   = { 14000, 15000, 16000, 18000, 20000 };
+            static const int bws[]   = { 14000, 18500, 20000, 21000, 22000 };
             int bw_i = 0;
             for (; bw_i < FF_ARRAY_ELEMS(rates) - 2 && frame_br > rates[bw_i + 
1]; bw_i++);
             s->bandwidth = bws[bw_i] + (int)((int64_t)(bws[bw_i + 1] - 
bws[bw_i]) *
diff --git a/tests/fate/aac.mak b/tests/fate/aac.mak
index ecd2c6b633..0724539c58 100644
--- a/tests/fate/aac.mak
+++ b/tests/fate/aac.mak
@@ -245,14 +245,14 @@ FATE_AAC_ENCODE += fate-aac-is-encode
 fate-aac-is-encode: CMD = enc_dec_pcm mp4 wav s16le 
$(TARGET_SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav -c:a aac 
-aac_coder fast -aac_pns 0 -aac_is 1 -aac_ms 0 -b:a 128k -aac_tns 0 -cutoff 
22050 -fflags +bitexact -flags +bitexact
 fate-aac-is-encode: CMP = stddev
 fate-aac-is-encode: REF = 
$(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav
-fate-aac-is-encode: CMP_TARGET = 543
+fate-aac-is-encode: CMP_TARGET = 517
 fate-aac-is-encode: FUZZ = 10
 
 FATE_AAC_ENCODE += fate-aac-ms-encode
 fate-aac-ms-encode: CMD = enc_dec_pcm mp4 wav s16le 
$(TARGET_SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav -c:a aac 
-aac_coder fast -aac_pns 0 -aac_is 0 -aac_ms 1 -aac_tns 0 -b:a 128k -cutoff 
22050 -fflags +bitexact -flags +bitexact
 fate-aac-ms-encode: CMP = stddev
 fate-aac-ms-encode: REF = 
$(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav
-fate-aac-ms-encode: CMP_TARGET = 575
+fate-aac-ms-encode: CMP_TARGET = 550
 fate-aac-ms-encode: FUZZ = 15
 
 #Ticket1784
@@ -260,7 +260,7 @@ FATE_AAC_ENCODE += fate-aac-yoraw-encode
 fate-aac-yoraw-encode: CMD = enc_dec_pcm mp4 wav s16le 
$(TARGET_SAMPLES)/audio-reference/yo.raw-short.wav -c:a aac -aac_coder fast 
-fflags +bitexact -flags +bitexact
 fate-aac-yoraw-encode: CMP = stddev
 fate-aac-yoraw-encode: REF = $(SAMPLES)/audio-reference/yo.raw-short.wav
-fate-aac-yoraw-encode: CMP_TARGET = 226
+fate-aac-yoraw-encode: CMP_TARGET = 54
 fate-aac-yoraw-encode: FUZZ = 17
 
 FATE_AAC_LATM += fate-aac-latm_000000001180bc60
diff --git a/tests/ref/fate/id3v2-reenc-delete-metadata 
b/tests/ref/fate/id3v2-reenc-delete-metadata
index a9ec6cec02..b04f85ae85 100644
--- a/tests/ref/fate/id3v2-reenc-delete-metadata
+++ b/tests/ref/fate/id3v2-reenc-delete-metadata
@@ -1,5 +1,5 @@
-d870ccc9affa856943d6bce9fec4451f 
*tests/data/fate/id3v2-reenc-delete-metadata.nut
-2956 tests/data/fate/id3v2-reenc-delete-metadata.nut
+d6cf0698e62eb42bf36706b81fd69c1a 
*tests/data/fate/id3v2-reenc-delete-metadata.nut
+1569 tests/data/fate/id3v2-reenc-delete-metadata.nut
 [FORMAT]
 TAG:title=7rk
 [/FORMAT]
diff --git a/tests/ref/fate/id3v2-reenc-delete-metadata-keep 
b/tests/ref/fate/id3v2-reenc-delete-metadata-keep
index 1476c029b2..2ccb64a380 100644
--- a/tests/ref/fate/id3v2-reenc-delete-metadata-keep
+++ b/tests/ref/fate/id3v2-reenc-delete-metadata-keep
@@ -1,5 +1,5 @@
-d3f8b96016d742eece05c82f1dace17d 
*tests/data/fate/id3v2-reenc-delete-metadata-keep.nut
-3084 tests/data/fate/id3v2-reenc-delete-metadata-keep.nut
+db828221356fb78b3fe2990c717672b8 
*tests/data/fate/id3v2-reenc-delete-metadata-keep.nut
+1697 tests/data/fate/id3v2-reenc-delete-metadata-keep.nut
 [FORMAT]
 TAG:title=7rk
 TAG:iTunSMPB= 00000000 00000210 0000086A 0000000000066486 00000000 0002DA9D 
00000000 00000000 00000000 00000000 00000000 00000000
diff --git a/tests/ref/fate/id3v2-reenc-delete-metadata-keep-format 
b/tests/ref/fate/id3v2-reenc-delete-metadata-keep-format
index 92c6fd3548..c96b381876 100644
--- a/tests/ref/fate/id3v2-reenc-delete-metadata-keep-format
+++ b/tests/ref/fate/id3v2-reenc-delete-metadata-keep-format
@@ -1,5 +1,5 @@
-d3f8b96016d742eece05c82f1dace17d 
*tests/data/fate/id3v2-reenc-delete-metadata-keep-format.nut
-3084 tests/data/fate/id3v2-reenc-delete-metadata-keep-format.nut
+db828221356fb78b3fe2990c717672b8 
*tests/data/fate/id3v2-reenc-delete-metadata-keep-format.nut
+1697 tests/data/fate/id3v2-reenc-delete-metadata-keep-format.nut
 [FORMAT]
 TAG:title=7rk
 TAG:iTunSMPB= 00000000 00000210 0000086A 0000000000066486 00000000 0002DA9D 
00000000 00000000 00000000 00000000 00000000 00000000
diff --git a/tests/ref/fate/id3v2-reenc-delete-metadata-keep-stream 
b/tests/ref/fate/id3v2-reenc-delete-metadata-keep-stream
index 1b120f7c58..8c3f209aca 100644
--- a/tests/ref/fate/id3v2-reenc-delete-metadata-keep-stream
+++ b/tests/ref/fate/id3v2-reenc-delete-metadata-keep-stream
@@ -1,5 +1,5 @@
-d870ccc9affa856943d6bce9fec4451f 
*tests/data/fate/id3v2-reenc-delete-metadata-keep-stream.nut
-2956 tests/data/fate/id3v2-reenc-delete-metadata-keep-stream.nut
+d6cf0698e62eb42bf36706b81fd69c1a 
*tests/data/fate/id3v2-reenc-delete-metadata-keep-stream.nut
+1569 tests/data/fate/id3v2-reenc-delete-metadata-keep-stream.nut
 [FORMAT]
 TAG:title=7rk
 [/FORMAT]
diff --git a/tests/ref/fate/id3v2-reenc-delete-metadata-map-metadata 
b/tests/ref/fate/id3v2-reenc-delete-metadata-map-metadata
index bde3194636..3528d2fd51 100644
--- a/tests/ref/fate/id3v2-reenc-delete-metadata-map-metadata
+++ b/tests/ref/fate/id3v2-reenc-delete-metadata-map-metadata
@@ -1,5 +1,5 @@
-d870ccc9affa856943d6bce9fec4451f 
*tests/data/fate/id3v2-reenc-delete-metadata-map-metadata.nut
-2956 tests/data/fate/id3v2-reenc-delete-metadata-map-metadata.nut
+d6cf0698e62eb42bf36706b81fd69c1a 
*tests/data/fate/id3v2-reenc-delete-metadata-map-metadata.nut
+1569 tests/data/fate/id3v2-reenc-delete-metadata-map-metadata.nut
 [FORMAT]
 TAG:title=7rk
 [/FORMAT]

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to