diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-06-03 00:54:14 +0300 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-06-29 22:21:31 +0300 |
commit | 4aba3ce8167f41e7019341a93bd5dcecfb20fc5a (patch) | |
tree | 891176760a9d216e9f7ff1c7419aba7ebed1fc22 | |
parent | 9d9c9ccbe2e3ca836674daea342e45444ba8fdd3 (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 b2342a6e..4e1ecd60 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -1786,14 +1786,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) |