summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Paniconi <marpan@google.com>2020-06-17 10:27:39 -0700
committerJerome Jiang <jianj@google.com>2020-06-22 14:17:52 -0700
commitb30184a6821e1d36db8294574022ff9c207acacc (patch)
tree7debc015c4c4c1e195730a22e1fed956e290f3d4
parent03a8bb26de4b8c4d9ae59b36e1fa728e59f1f232 (diff)
downloadlibvpx-m84-4147.tar.gz
vp9-rtc: Fixes to resizer for real-timem84-4147
Reduce the time before sampling begins (after key) and reduce averaging window, to make resize act faster. Reset RC paramaters for temporal layers on resize. Add per-frame-bandwidth thresholds to force downsize for extreme case, for HD input. Bug: 1097494 Change-Id: I8e08580b2216a2e6981502552025370703cd206c (cherry picked from commit e9c6cb64744f6df31ba52501d4759b50ba832df2)
-rw-r--r--test/resize_test.cc8
-rw-r--r--vp9/encoder/vp9_ratectrl.c31
2 files changed, 33 insertions, 6 deletions
diff --git a/test/resize_test.cc b/test/resize_test.cc
index d996cbe1b..a2dc5d7a7 100644
--- a/test/resize_test.cc
+++ b/test/resize_test.cc
@@ -672,11 +672,11 @@ TEST_P(ResizeRealtimeTest, TestInternalResizeDownUpChangeBitRate) {
ASSERT_EQ(info->h, GetFrameHeight(idx));
if (info->w != last_w || info->h != last_h) {
resize_count++;
- if (resize_count == 1) {
+ if (resize_count <= 2) {
// Verify that resize down occurs.
ASSERT_LT(info->w, last_w);
ASSERT_LT(info->h, last_h);
- } else if (resize_count == 2) {
+ } else if (resize_count > 2) {
// Verify that resize up occurs.
ASSERT_GT(info->w, last_w);
ASSERT_GT(info->h, last_h);
@@ -687,8 +687,8 @@ TEST_P(ResizeRealtimeTest, TestInternalResizeDownUpChangeBitRate) {
}
#if CONFIG_VP9_DECODER
- // Verify that we get 2 resize events in this test.
- ASSERT_EQ(resize_count, 2) << "Resizing should occur twice.";
+ // Verify that we get 4 resize events in this test.
+ ASSERT_EQ(resize_count, 4) << "Resizing should occur twice.";
EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames());
#else
printf("Warning: VP9 decoder unavailable, unable to check resize count!\n");
diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c
index 5dd745f3a..9debc01ef 100644
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -2385,6 +2385,11 @@ void vp9_rc_get_svc_params(VP9_COMP *cpi) {
cpi->resize_scale_num * lc->scaling_factor_num;
lc->scaling_factor_den_resize =
cpi->resize_scale_den * lc->scaling_factor_den;
+ // Reset rate control for all temporal layers.
+ lc->rc.buffer_level = lc->rc.optimal_buffer_level;
+ lc->rc.bits_off_target = lc->rc.optimal_buffer_level;
+ lc->rc.rate_correction_factors[INTER_FRAME] =
+ rc->rate_correction_factors[INTER_FRAME];
}
// Set the size for this current temporal layer.
lc = &svc->layer_context[svc->spatial_layer_id *
@@ -2657,6 +2662,7 @@ int vp9_resize_one_pass_cbr(VP9_COMP *cpi) {
int min_width = (320 * 4) / 3;
int min_height = (180 * 4) / 3;
int down_size_on = 1;
+ int force_downsize_rate = 0;
cpi->resize_scale_num = 1;
cpi->resize_scale_den = 1;
// Don't resize on key frame; reset the counters on key frame.
@@ -2677,10 +2683,31 @@ int vp9_resize_one_pass_cbr(VP9_COMP *cpi) {
}
#endif
+ // Force downsize based on per-frame-bandwidth, for extreme case,
+ // for HD input.
+ if (cpi->resize_state == ORIG && cm->width * cm->height >= 1280 * 720) {
+ if (rc->avg_frame_bandwidth < (int)(300000 / 30)) {
+ resize_action = DOWN_ONEHALF;
+ cpi->resize_state = ONE_HALF;
+ force_downsize_rate = 1;
+ } else if (rc->avg_frame_bandwidth < (int)(400000 / 30)) {
+ resize_action = ONEHALFONLY_RESIZE ? DOWN_ONEHALF : DOWN_THREEFOUR;
+ cpi->resize_state = ONEHALFONLY_RESIZE ? ONE_HALF : THREE_QUARTER;
+ force_downsize_rate = 1;
+ }
+ } else if (cpi->resize_state == THREE_QUARTER &&
+ cm->width * cm->height >= 960 * 540) {
+ if (rc->avg_frame_bandwidth < (int)(300000 / 30)) {
+ resize_action = DOWN_ONEHALF;
+ cpi->resize_state = ONE_HALF;
+ force_downsize_rate = 1;
+ }
+ }
+
// Resize based on average buffer underflow and QP over some window.
// Ignore samples close to key frame, since QP is usually high after key.
- if (cpi->rc.frames_since_key > 2 * cpi->framerate) {
- const int window = (int)(4 * cpi->framerate);
+ if (!force_downsize_rate && cpi->rc.frames_since_key > cpi->framerate) {
+ const int window = VPXMIN(30, (int)(2 * cpi->framerate));
cpi->resize_avg_qp += cm->base_qindex;
if (cpi->rc.buffer_level < (int)(30 * rc->optimal_buffer_level / 100))
++cpi->resize_buffer_underflow;