summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@amazon.com>2022-12-21 16:54:50 -0500
committerJean-Marc Valin <jmvalin@amazon.com>2022-12-21 16:54:50 -0500
commit57812fa4c728eae3d4a4edc3532c1954fe83264b (patch)
treed9dc408c86e4fbefd8b3dc523c8eaeba4492bf93
parent87f8270f7959535c4fb2a2d9c8c6842466e49785 (diff)
downloadopus-57812fa4c728eae3d4a4edc3532c1954fe83264b.tar.gz
Don't encode empty DRED packets
-rw-r--r--src/opus_encoder.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index 4d571c28..f05b3829 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -1883,6 +1883,11 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
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 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
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;