diff --git a/silk/dred_encoder.c b/silk/dred_encoder.c index 7b34cefeade9138d6f6a5fb226f47c2986d0a2b9..41228334e4242ce335a7c0c223f681acae86f6b8 100644 --- a/silk/dred_encoder.c +++ b/silk/dred_encoder.c @@ -238,6 +238,9 @@ int dred_encode_silk_frame(const DREDEnc *enc, unsigned char *buf, int max_chunk dead_zone + state_qoffset, r + state_qoffset, p0 + state_qoffset); + if (ec_tell(&ec_encoder) > 8*max_bytes) { + return 0; + } for (i = 0; i < IMIN(2*max_chunks, enc->latents_buffer_fill-enc->latent_offset-1); i += 2) { ec_enc ec_bak; @@ -256,6 +259,8 @@ int dred_encode_silk_frame(const DREDEnc *enc, unsigned char *buf, int max_chunk ); if (ec_tell(&ec_encoder) > 8*max_bytes) { ec_encoder = ec_bak; + /* If we haven't been able to code one chunk, give up on DRED completely. */ + if (i==0) return 0; break; } } diff --git a/src/opus_encoder.c b/src/opus_encoder.c index cb03a1e5a849096f7fefd43a34127c62f894f5e3..7291c8143dda06d0f9abff9f19f3e64a095e4bd0 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -1122,6 +1122,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ int analysis_read_subframe_bak=-1; int is_silence = 0; #endif + int apply_padding; #ifdef ENABLE_NEURAL_FEC opus_int32 dred_bitrate_bps; #endif @@ -2252,6 +2253,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ } /* Count ToC and redundancy */ ret += 1+redundancy_bytes; + apply_padding = !st->use_vbr; #ifdef ENABLE_NEURAL_FEC if (st->dred_duration > 0) { opus_extension_data extension; @@ -2271,26 +2273,25 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ buf[1] = DRED_EXPERIMENTAL_VERSION; #endif dred_bytes = dred_encode_silk_frame(&st->dred_encoder, buf+DRED_EXPERIMENTAL_BYTES, dred_chunks, dred_bytes_left-DRED_EXPERIMENTAL_BYTES); - dred_bytes += DRED_EXPERIMENTAL_BYTES; - celt_assert(dred_bytes <= dred_bytes_left); - extension.id = DRED_EXTENSION_ID; - 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 == OPUS_OK) - ret = max_data_bytes; - } - if (ret < 0) - { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; + if (dred_bytes > 0) { + dred_bytes += DRED_EXPERIMENTAL_BYTES; + celt_assert(dred_bytes <= dred_bytes_left); + extension.id = DRED_EXTENSION_ID; + 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); + if (ret < 0) + { + RESTORE_STACK; + return OPUS_INTERNAL_ERROR; + } + apply_padding = 0; + } } - } else + } #endif - if (!st->use_vbr) + if (apply_padding) { if (opus_packet_pad(data, ret, max_data_bytes) != OPUS_OK) {