Fix runtime error in av1_rc_set_frame_target()
Update frame target based on vbr_bits_off_target_fast only when
additional bits are present from local undershoot. Also fixes
the condition for fast redistribution of extra bits in FPMT path.
Change-Id: Ib9fe303ed45a2c8edb161f421a08258bffe778b0
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index 4d239c6..9eb7414 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -2398,26 +2398,30 @@
*this_frame_target += (vbr_bits_off_target >= 0) ? max_delta : -max_delta;
}
+ int64_t vbr_bits_off_target_fast;
+#if CONFIG_FRAME_PARALLEL_ENCODE
+ vbr_bits_off_target_fast =
+ (cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0)
+ ? cpi->ppi->p_rc.temp_vbr_bits_off_target_fast
+ : rc->vbr_bits_off_target_fast;
+#else
+ vbr_bits_off_target_fast = rc->vbr_bits_off_target_fast;
+#endif
// Fast redistribution of bits arising from massive local undershoot.
// Dont do it for kf,arf,gf or overlay frames.
if (!frame_is_kf_gf_arf(cpi) && !rc->is_src_frame_alt_ref &&
- rc->vbr_bits_off_target_fast) {
- int64_t vbr_bits_off_target_fast;
-#if CONFIG_FRAME_PARALLEL_ENCODE
- vbr_bits_off_target_fast =
- (cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0)
- ? cpi->ppi->p_rc.temp_vbr_bits_off_target_fast
- : rc->vbr_bits_off_target_fast;
-#else
- vbr_bits_off_target_fast = rc->vbr_bits_off_target_fast;
-#endif
+ vbr_bits_off_target_fast) {
int one_frame_bits = AOMMAX(rc->avg_frame_bandwidth, *this_frame_target);
int fast_extra_bits;
fast_extra_bits = (int)AOMMIN(vbr_bits_off_target_fast, one_frame_bits);
fast_extra_bits =
(int)AOMMIN(fast_extra_bits,
AOMMAX(one_frame_bits / 8, vbr_bits_off_target_fast / 8));
- *this_frame_target += (int)fast_extra_bits;
+ if (fast_extra_bits > 0) {
+ // Update this_frame_target only if additional bits are available from
+ // local undershoot.
+ *this_frame_target += (int)fast_extra_bits;
+ }
#if CONFIG_FRAME_PARALLEL_ENCODE
rc->frame_level_fast_extra_bits += fast_extra_bits;
if (cpi->do_frame_data_update) {