shithub: opus

Download patch

ref: 8bead7488ea4b18749f385141b68febc0726ce2b
parent: 8e6e049f28e96096908eb1d7304498e9167cd8ea
author: Jean-Marc Valin <jeanmarcv@google.com>
date: Tue Sep 24 06:17:48 EDT 2024

Don't crash OpusCustom when neural PLC is enabled

--- a/celt/celt_decoder.c
+++ b/celt/celt_decoder.c
@@ -641,10 +641,10 @@
    loss_duration = st->loss_duration;
    start = st->start;
 #ifdef ENABLE_DEEP_PLC
-   noise_based = start != 0 || (lpcnet->fec_fill_pos == 0 && (st->skip_plc || loss_duration >= 80));
-#else
-   noise_based = loss_duration >= 40 || start != 0 || st->skip_plc;
+   if (lpcnet != NULL) noise_based = start != 0 || (lpcnet->fec_fill_pos == 0 && (st->skip_plc || loss_duration >= 80));
+   else
 #endif
+   noise_based = loss_duration >= 40 || start != 0 || st->skip_plc;
    if (noise_based)
    {
       /* Noise-based PLC/CNG */
@@ -710,7 +710,7 @@
       if (loss_duration == 0)
       {
 #ifdef ENABLE_DEEP_PLC
-        if (lpcnet->loaded) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
+        if (lpcnet != NULL && lpcnet->loaded) update_plc_state(lpcnet, decode_mem, &st->plc_preemphasis_mem, C);
 #endif
          st->last_pitch_index = pitch_index = celt_plc_pitch_search(decode_mem, C, st->arch);
       } else {
@@ -903,7 +903,7 @@
       } while (++c<C);
 
 #ifdef ENABLE_DEEP_PLC
-      if (lpcnet->loaded && (st->complexity >= 5 || lpcnet->fec_fill_pos > 0)) {
+      if (lpcnet != NULL && lpcnet->loaded && (st->complexity >= 5 || lpcnet->fec_fill_pos > 0)) {
          float overlap_mem;
          int samples_needed16k;
          celt_sig *buf;
--