shithub: opus

Download patch

ref: fcd513e780dc5b95bc7d7e4d68e33025bc8e58a4
parent: 8bead7488ea4b18749f385141b68febc0726ce2b
author: Jean-Marc Valin <jeanmarcv@google.com>
date: Mon Sep 16 10:50:09 EDT 2024

Fix anti-collapse RESYNTH mismatch for mono

Seems to have been in 682b6cf1. There's nothing wrong with either the
encoder or the decoder. Just about how we resynthesize anti-collapse
for mono in the encoder.

--- a/celt/bands.c
+++ b/celt/bands.c
@@ -267,7 +267,7 @@
 /* This prevents energy collapse for transients with multiple short MDCTs */
 void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
       int start, int end, const opus_val16 *logE, const opus_val16 *prev1logE,
-      const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed, int arch)
+      const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed, int encode, int arch)
 {
    int c, i, j, k;
    for (i=start;i<end;i++)
@@ -310,7 +310,7 @@
          int renormalize=0;
          prev1 = prev1logE[c*m->nbEBands+i];
          prev2 = prev2logE[c*m->nbEBands+i];
-         if (C==1)
+         if (!encode && C==1)
          {
             prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]);
             prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]);
--- a/celt/bands.h
+++ b/celt/bands.h
@@ -114,7 +114,7 @@
       unsigned char *collapse_masks, int LM, int C, int size, int start,
       int end, const opus_val16 *logE, const opus_val16 *prev1logE,
       const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed,
-      int arch);
+      int encode, int arch);
 
 opus_uint32 celt_lcg_rand(opus_uint32 seed);
 
--- a/celt/celt_decoder.c
+++ b/celt/celt_decoder.c
@@ -1286,7 +1286,7 @@
 
    if (anti_collapse_on)
       anti_collapse(mode, X, collapse_masks, LM, C, N,
-            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, st->arch);
+            start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 0, st->arch);
 
    if (silence)
    {
--- a/celt/celt_encoder.c
+++ b/celt/celt_encoder.c
@@ -2272,7 +2272,7 @@
       if (anti_collapse_on)
       {
          anti_collapse(mode, X, collapse_masks, LM, C, N,
-               start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, st->arch);
+               start, end, oldBandE, oldLogE, oldLogE2, pulses, st->rng, 1, st->arch);
       }
 
       c=0; do {
--