Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2016-06-03 00:54:14 +0300
committerJean-Marc Valin <jmvalin@jmvalin.ca>2016-07-08 21:15:43 +0300
commite03da3e5780e25fba451ee55a43f611e173e4032 (patch)
treec80c1c0c000da6ff9ad144d5e33be39a7b681ee0
parent3a6d589b0a11574f0da2888d05fe0caaa0ac7748 (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.c19
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)