[libav-devel] [PATCH 4/4] opus: Don't invert phase when downmixing to mono (per RFC8251)

Andrew D'Addesio modchipv12 at gmail.com
Sun Dec 3 22:33:32 CET 2017


When downmixing to mono, don't put the channels out of phase, as they
will cancel out and create audible artifacts. (See RFC 8251 sec.10.)

Signed-off-by: Andrew D'Addesio <modchipv12 at gmail.com>
---
 libavcodec/opus_celt.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/libavcodec/opus_celt.c b/libavcodec/opus_celt.c
index 4ba4fde..d58b8e9 100644
--- a/libavcodec/opus_celt.c
+++ b/libavcodec/opus_celt.c
@@ -1445,6 +1445,12 @@ static unsigned int celt_decode_band(CeltContext *s, OpusRangeCoder *rc,
             Let's do that at higher complexity */
         } else if (dualstereo) {
             inv = (b > 2 << 3 && s->remaining2 > 2 << 3) ? opus_rc_p2model(rc, 2) : 0;
+
+            /* Don't put the channels out of phase if we are downmixing to mono
+            as this subjectively sounds bad (RFC 8251 section 10). */
+            if (s->output_channels == 1)
+                inv = 0;
+
             itheta = 0;
         }
         qalloc = opus_rc_tell_frac(rc) - tell;
-- 
2.15.1.windows.2



More information about the libav-devel mailing list