shithub: opus

Download patch

ref: d0e7a7af0c926d32c1c6f11c83fbc383dac721e6
parent: 8bbfb2ec479624f80c60a3fc1b0180f0bf36a922
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Wed Dec 21 11:54:50 EST 2022

Don't encode empty DRED packets

--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -1883,6 +1883,11 @@
            celt_to_silk = 0;
            st->silk_bw_switch = 1;
         }
+    } else {
+        /* If we're not in SILK mode, delete all the processed DRED.
+           TODO: Remove this if/when DRED gets encoded for CELT. */
+        DREDEnc *dred = &((silk_encoder*)silk_enc)->state_Fxx[0].sCmn.dred_encoder;
+        dred->latents_buffer_fill = 0;
     }
 
     /* CELT processing */
@@ -2191,12 +2196,17 @@
        DREDEnc *dred = &((silk_encoder*)silk_enc)->state_Fxx[0].sCmn.dred_encoder;
        dred_chunks = IMIN(st->dred_duration/4, DRED_NUM_REDUNDANCY_FRAMES/2);
        dred_bytes = IMIN(DRED_MAX_DATA_SIZE, max_data_bytes-ret-2);
-       dred_bytes = dred_encode_silk_frame(dred, buf, dred_chunks, dred_bytes);
-       extension.id = 127;
-       extension.frame = 0;
-       extension.data = buf;
-       extension.len = dred_bytes;
-       ret = opus_packet_pad_impl(data, ret, max_data_bytes, !st->use_vbr, &extension, 1);
+       /* Check whether we actually have something to encode. */
+       if (dred_chunks >= 1 && dred_bytes >= 3) {
+           dred_bytes = dred_encode_silk_frame(dred, buf, dred_chunks, dred_bytes);
+           extension.id = 127;
+           extension.frame = 0;
+           extension.data = buf;
+           extension.len = dred_bytes;
+           ret = opus_packet_pad_impl(data, ret, max_data_bytes, !st->use_vbr, &extension, 1);
+       } else if (!st->use_vbr) {
+           ret = opus_packet_pad(data, ret, max_data_bytes);
+       }
        if (ret < 0)
        {
           RESTORE_STACK;
--