Fix an integer overflow in target bits calculation

BUG=aomedia:503197490

Change-Id: I65eaba5e6d48da47ca0e67854ac0cff843e4ddea
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index dd2bd1b..f68c78f 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -505,10 +505,11 @@
   p_rc->rate_correction_factors[KF_STD] = 1.0;
   p_rc->bits_off_target = p_rc->starting_buffer_level;
 
-  p_rc->rolling_target_bits = AOMMAX(
-      1, (int)(oxcf->rc_cfg.target_bandwidth / oxcf->input_cfg.init_framerate));
-  p_rc->rolling_actual_bits = AOMMAX(
-      1, (int)(oxcf->rc_cfg.target_bandwidth / oxcf->input_cfg.init_framerate));
+  const double bits_per_frame =
+      oxcf->rc_cfg.target_bandwidth / oxcf->input_cfg.init_framerate;
+  p_rc->rolling_target_bits =
+      AOMMAX(1, bits_per_frame > INT_MAX ? INT_MAX : (int)bits_per_frame);
+  p_rc->rolling_actual_bits = p_rc->rolling_target_bits;
 }
 
 void av1_rc_init(const AV1EncoderConfig *oxcf, RATE_CONTROL *rc) {
diff --git a/test/encode_api_test.cc b/test/encode_api_test.cc
index 259fb34..239d29a 100644
--- a/test/encode_api_test.cc
+++ b/test/encode_api_test.cc
@@ -2408,4 +2408,22 @@
   ASSERT_EQ(aom_codec_destroy(&codec), AOM_CODEC_OK);
 }
 
+TEST(EncodeAPI, Buganizer503197490) {
+  aom_codec_iface_t *iface = aom_codec_av1_cx();
+  aom_codec_enc_cfg_t cfg;
+  ASSERT_EQ(aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_REALTIME),
+            AOM_CODEC_OK);
+
+  cfg.g_w = 640;
+  cfg.g_h = 360;
+  cfg.g_timebase.num = 570;
+  cfg.g_timebase.den = 30;
+  cfg.rc_end_usage = AOM_CBR;
+  cfg.rc_target_bitrate = 1728882;  // 1728882000 bits/s
+
+  aom_codec_ctx_t codec;
+  ASSERT_EQ(aom_codec_enc_init(&codec, iface, &cfg, 0), AOM_CODEC_OK);
+  ASSERT_EQ(aom_codec_destroy(&codec), AOM_CODEC_OK);
+}
+
 }  // namespace