From d7ce091b1c459eafcbbb43a3e15c2590f5657b24 Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@amazon.com>
Date: Fri, 19 May 2023 14:14:40 -0400
Subject: [PATCH] Don't run the DRED encoder unless DRED is enabled

---
 silk/control.h     | 3 +++
 silk/enc_API.c     | 8 ++++++--
 src/opus_encoder.c | 2 ++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/silk/control.h b/silk/control.h
index b76ec33cd..8d2392d33 100644
--- a/silk/control.h
+++ b/silk/control.h
@@ -77,6 +77,9 @@ typedef struct {
     /* I:   Flag to enable in-band Forward Error Correction (FEC); 0/1                      */
     opus_int useInBandFEC;
 
+    /* I:   Flag to enable in-band Deep REDundancy (DRED); 0/1                              */
+    opus_int useDRED;
+
     /* I:   Flag to actually code in-band Forward Error Correction (FEC) in the current packet; 0/1 */
     opus_int LBRR_coded;
 
diff --git a/silk/enc_API.c b/silk/enc_API.c
index 45d67877b..bdb858afc 100644
--- a/silk/enc_API.c
+++ b/silk/enc_API.c
@@ -469,8 +469,12 @@ opus_int silk_Encode(                                   /* O    Returns error co
             silk_encode_do_VAD_Fxx( &psEnc->state_Fxx[ 0 ], activity );
 
 #ifdef ENABLE_NEURAL_FEC
-            /* DRED Encoder */
-            dred_process_silk_frame( &psEnc->state_Fxx[ 0 ].sCmn.dred_encoder, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[0] );
+            if ( encControl->useDRED ) {
+                /* DRED Encoder */
+                dred_process_silk_frame( &psEnc->state_Fxx[ 0 ].sCmn.dred_encoder, &psEnc->state_Fxx[ 0 ].sCmn.inputBuf[0] );
+            } else {
+                psEnc->state_Fxx[ 0 ].sCmn.dred_encoder.latents_buffer_fill = 0;
+            }
 #endif
 
             /* Encode */
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index c6675a617..3764b373c 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -227,6 +227,7 @@ int opus_encoder_init(OpusEncoder* st, opus_int32 Fs, int channels, int applicat
     st->silk_mode.packetLossPercentage      = 0;
     st->silk_mode.complexity                = 9;
     st->silk_mode.useInBandFEC              = 0;
+    st->silk_mode.useDRED                   = 0;
     st->silk_mode.useDTX                    = 0;
     st->silk_mode.useCBR                    = 0;
     st->silk_mode.reducedDependency         = 0;
@@ -2733,6 +2734,7 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
                goto bad_arg;
             }
             st->dred_duration = value;
+            st->silk_mode.useDRED = !!value;
         }
         break;
         case OPUS_GET_DRED_DURATION_REQUEST:
-- 
GitLab