summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@amazon.com>2023-05-08 19:04:08 -0400
committerJean-Marc Valin <jmvalin@amazon.com>2023-05-08 19:04:08 -0400
commit27d2731b045b88c82131076ff2a1145e175db918 (patch)
treeb442d6a73b3175f3d82d86b05aed128787f89bc9
parent4f206c7347937fe43e7f8f91616e1f35b83b7aa4 (diff)
downloadopus-27d2731b045b88c82131076ff2a1145e175db918.tar.gz
Properly check to see if there's room for DRED
-rw-r--r--silk/dred_config.h1
-rw-r--r--src/opus_encoder.c10
2 files changed, 7 insertions, 4 deletions
diff --git a/silk/dred_config.h b/silk/dred_config.h
index 6d7c95bf..34352536 100644
--- a/silk/dred_config.h
+++ b/silk/dred_config.h
@@ -26,6 +26,7 @@
*/
#define DRED_VERSION 0
+#define DRED_MIN_BYTES 16
/* these are inpart duplicates to the values defined in dred_rdovae_constants.h */
#define DRED_NUM_FEATURES 20
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index e05a65ab..c6675a61 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -2194,18 +2194,20 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
opus_extension_data extension;
unsigned char buf[DRED_MAX_DATA_SIZE];
int dred_chunks;
- int dred_bytes;
+ int dred_bytes_left;
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_left = IMIN(DRED_MAX_DATA_SIZE, max_data_bytes-ret-2);
/* Check whether we actually have something to encode. */
- if (dred_chunks >= 1 && dred_bytes >= 5) {
+ if (dred_chunks >= 1 && dred_bytes_left >= DRED_MIN_BYTES+2) {
+ int dred_bytes;
/* Add temporary extension type and version.
These bytes will be removed once extension is finalized. */
buf[0] = 'D';
buf[1] = DRED_VERSION;
- dred_bytes = dred_encode_silk_frame(dred, buf+2, dred_chunks, dred_bytes-2);
+ dred_bytes = dred_encode_silk_frame(dred, buf+2, dred_chunks, dred_bytes_left-2);
dred_bytes += 2;
+ celt_assert(dred_bytes <= dred_bytes_left);
extension.id = 127;
extension.frame = 0;
extension.data = buf;