diff options
author | Jean-Marc Valin <jmvalin@amazon.com> | 2022-12-21 16:54:50 -0500 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@amazon.com> | 2022-12-21 16:54:50 -0500 |
commit | 57812fa4c728eae3d4a4edc3532c1954fe83264b (patch) | |
tree | d9dc408c86e4fbefd8b3dc523c8eaeba4492bf93 /src | |
parent | 87f8270f7959535c4fb2a2d9c8c6842466e49785 (diff) | |
download | opus-57812fa4c728eae3d4a4edc3532c1954fe83264b.tar.gz |
Don't encode empty DRED packets
Diffstat (limited to 'src')
-rw-r--r-- | src/opus_encoder.c | 22 |
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; |