Improve q_high adjustment for large overshoot.

In recode loop, when we get a large overshoot:
- Adjust q_high only when current 'q' is already at 'q_high'
- Also, and adaptively adjust q_high only as much as needed, instead of
directly picking the worst quality.

This is a:
- Cherry-pick of VP9 commit:
https://chromium-review.googlesource.com/c/webm/libvpx/+/424299
- And a single line change from:
https://chromium-review.googlesource.com/c/webm/libvpx/+/544870

hdres/mobcal_720p50: -1.948%
Other hdres clips: neutral
lowres,midres,ugc360p: neutral

STATS_CHANGED

Change-Id: I2f3f0e292d0ccf184f36bedd85f7ab1e7de46518
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 707f9ea..4258eec 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4531,8 +4531,16 @@
     // Frame is too large
     if (rc->projected_frame_size > rc->this_frame_target) {
       // Special case if the projected size is > the max allowed.
-      if (rc->projected_frame_size >= rc->max_frame_bandwidth)
-        *q_high = rc->worst_quality;
+      if (*q == *q_high &&
+          rc->projected_frame_size >= rc->max_frame_bandwidth) {
+        const double q_val_high_current =
+            av1_convert_qindex_to_q(*q_high, cm->seq_params.bit_depth);
+        const double q_val_high_new =
+            q_val_high_current *
+            ((double)rc->projected_frame_size / rc->max_frame_bandwidth);
+        *q_high = av1_find_qindex(q_val_high_new, cm->seq_params.bit_depth,
+                                  rc->best_quality, rc->worst_quality);
+      }
 
       // Raise Qlow as to at least the current value
       *q_low = *q < *q_high ? *q + 1 : *q_high;