ref: de0b97754756df349a8dc066816f3075f1afcc0f
parent: 9f555bc4e7c04ce8c2119979e0138a1a7ae9c2c4
author: Gregory Maxwell <[email protected]>
date: Mon Aug 22 22:00:55 EDT 2011
In VBR the MDCT modes rate control could dramatically over/undershoot after a frame size change because the adaptive rate control offset was not being scaled.
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -1382,8 +1382,9 @@
/* The target rate in 8th bits per frame */
opus_int32 target;
opus_int32 min_allowed;
+ int lm_diff = st->mode->maxLM - LM;
- target = vbr_rate + st->vbr_offset - ((40*C+20)<<BITRES);
+ target = vbr_rate + (st->vbr_offset>>lm_diff) - ((40*C+20)<<BITRES);
/* Shortblocks get a large boost in bitrate, but since they
are uncommon long blocks are not greatly affected */
@@ -1437,7 +1438,7 @@
/*printf ("%d\n", st->vbr_reservoir);*/
/* Compute the offset we need to apply in order to reach the target */
- st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,delta-st->vbr_offset-st->vbr_drift);
+ st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta<<lm_diff)-st->vbr_offset-st->vbr_drift);
st->vbr_offset = -st->vbr_drift;
/*printf ("%d\n", st->vbr_drift);*/