Use SILK VBR when using CBR with DRED

DRED will absorb the bitrate variation
This commit is contained in:
Jean-Marc Valin 2023-11-21 01:13:30 -05:00
parent 6f99a3382d
commit c066af1bf1
No known key found for this signature in database
GPG key ID: 531A52533318F00A

View file

@ -1844,7 +1844,14 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
} }
if (st->silk_mode.useCBR) if (st->silk_mode.useCBR)
{ {
/* When we're in CBR mode, but we have non-SILK data to encode, switch SILK to VBR with cap to
save on complexity. Any variations will be absorbed by CELT and/or DRED and we can still
produce a constant bitrate without wasting bits. */
#ifdef ENABLE_DRED
if (st->mode == MODE_HYBRID || dred_bitrate_bps > 0)
#else
if (st->mode == MODE_HYBRID) if (st->mode == MODE_HYBRID)
#endif
{ {
/* Allow SILK to steal up to 25% of the remaining bits */ /* Allow SILK to steal up to 25% of the remaining bits */
opus_int16 other_bits = IMAX(0, st->silk_mode.maxBits - st->silk_mode.bitRate * frame_size / st->Fs); opus_int16 other_bits = IMAX(0, st->silk_mode.maxBits - st->silk_mode.bitRate * frame_size / st->Fs);