Add extra check in vbr_rate_correction.
Check for case that could cause divide by 0 and refactor.
Change-Id: I1f2724e15edaee05c9daf3832d110c2f2ac4476b
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index 8e40e80..754da2b 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -1704,27 +1704,18 @@
static void vbr_rate_correction(AV1_COMP *cpi, int *this_frame_target) {
RATE_CONTROL *const rc = &cpi->rc;
int64_t vbr_bits_off_target = rc->vbr_bits_off_target;
- int max_delta;
- const int frame_window = clamp((int)(cpi->twopass.total_stats.count -
- cpi->common.current_frame.frame_number),
- 1, 16);
+ const int frame_window =
+ AOMMIN(16, (int)(cpi->twopass.total_stats.count -
+ cpi->common.current_frame.frame_number));
- max_delta = (vbr_bits_off_target > 0)
- ? (int)(vbr_bits_off_target / frame_window)
- : (int)(-vbr_bits_off_target / frame_window);
+ if (frame_window > 0) {
+ const int max_delta =
+ AOMMIN(abs((int)(vbr_bits_off_target / frame_window)),
+ (*this_frame_target * VBR_PCT_ADJUSTMENT_LIMIT) / 100);
- max_delta = AOMMIN(max_delta,
- ((*this_frame_target * VBR_PCT_ADJUSTMENT_LIMIT) / 100));
-
- // vbr_bits_off_target > 0 means we have extra bits to spend
- if (vbr_bits_off_target > 0) {
- *this_frame_target += (vbr_bits_off_target > max_delta)
- ? max_delta
- : (int)vbr_bits_off_target;
- } else {
- *this_frame_target -= (vbr_bits_off_target < -max_delta)
- ? max_delta
- : (int)-vbr_bits_off_target;
+ // vbr_bits_off_target > 0 means we have extra bits to spend
+ // vbr_bits_off_target < 0 we are currently overshooting
+ *this_frame_target += (vbr_bits_off_target >= 0) ? max_delta : -max_delta;
}
// Fast redistribution of bits arising from massive local undershoot.