diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-06-03 00:54:14 +0300 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-07-08 21:15:43 +0300 |
commit | e03da3e5780e25fba451ee55a43f611e173e4032 (patch) | |
tree | c80c1c0c000da6ff9ad144d5e33be39a7b681ee0 | |
parent | 3a6d589b0a11574f0da2888d05fe0caaa0ac7748 (diff) |
Improving CBR for hybrid mode
Hybrid CBR now simply forces the SILK CBR rate to the "target" value. Also,
we're getting rid of the -2 kb/s offset for CBR, which appeared to be harmful.
In the case of hybrid constrained VBR, the cap is computed in the same way
as the target.
-rw-r--r-- | src/opus_encoder.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/opus_encoder.c b/src/opus_encoder.c index c13b1da1..ef6fc590 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -1792,14 +1792,21 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ nBytes = IMIN(1275, max_data_bytes-1-redundancy_bytes); st->silk_mode.maxBits = nBytes*8; - /* Only allow up to 90% of the bits for hybrid mode*/ - if (st->mode == MODE_HYBRID) - st->silk_mode.maxBits = (opus_int32)st->silk_mode.maxBits*9/10; if (st->silk_mode.useCBR) { - st->silk_mode.maxBits = (st->silk_mode.bitRate * frame_size / (st->Fs * 8))*8; - /* Reduce the initial target to make it easier to reach the CBR rate */ - st->silk_mode.bitRate = IMAX(1, st->silk_mode.bitRate-2000); + if (st->mode == MODE_HYBRID) + { + st->silk_mode.maxBits = st->silk_mode.bitRate * frame_size / st->Fs; + } + } else { + /* Constrained VBR. */ + if (st->mode == MODE_HYBRID) + { + /* Compute SILK bitrate corresponding to the max total bits available */ + opus_int32 maxBitRate = compute_silk_rate_for_hybrid(nBytes*8*st->Fs / frame_size, + curr_bandwidth, st->Fs == 50 * frame_size, st->use_vbr); + st->silk_mode.maxBits = maxBitRate * frame_size / st->Fs; + } } if (prefill) |