From 9dc0e40475e5326e2b9a1d0e0459f64d1aebb15c Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@jmvalin.ca>
Date: Mon, 24 Oct 2011 20:26:29 -0400
Subject: [PATCH] Disable CELT when FEC is on and we're losing too many packets

---
 src/opus_encoder.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index bb31d682c..a108acde9 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -513,7 +513,7 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size,
     else if (st->application == OPUS_APPLICATION_VOIP)
        voice_est = 115;
     else
-       voice_est = 64;
+       voice_est = 48;
 
     if (st->force_channels!=OPUS_AUTO && st->channels == 2)
     {
@@ -577,6 +577,9 @@ int opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_size,
            threshold += 4000;
 
        st->mode = (equiv_rate >= threshold) ? MODE_CELT_ONLY: MODE_SILK_ONLY;
+
+       if (st->silk_mode.useInBandFEC && st->silk_mode.packetLossPercentage > (128-voice_est)>>4)
+          st->mode = MODE_SILK_ONLY;
 #endif
     } else {
        st->mode = st->user_forced_mode;
-- 
GitLab