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;
--
⑨