ref: 7d97790438b796620a48dd2cfa6f2c6fe1f16871
parent: 3ac2b57015000dde5731ceb9fc824e86747c5945
author: Marco Paniconi <marpan@google.com>
date: Thu Jun 7 12:35:44 EDT 2018
vp9-svc: Fix to frames_since_golden update for SVC. When the second (gf) temporal reference is used in SVC: the reference is refreshed on base TL superframes, and so the rc->frames_since_golden counter was also only updated on base TL frames. But this was disabling the golden reference from being used as a temporal reference for TL > 0 frames (since frames_since_golden was 0/not updated on TL > 0 frames). Fix is to copy the update of rc->frames_since_golden to all upper temporal layers. This allows TL > 0 frames to test the golden inter mode. Gain on RTC set: ~2%, ~8% on desktop_vga clip. Encode time increase ~5-8% on linux, 3SL-3TL run with 1 thread. For now keep this off for TL > 0 frames in speed features, so this change does not change current behavior for speed >= 7. Change-Id: I405708f3f80039ae47bd64ec53e66f92160acd9e
--- a/vp9/encoder/vp9_ratectrl.c
+++ b/vp9/encoder/vp9_ratectrl.c
@@ -1601,6 +1601,8 @@
// update the golden frame counter, only for base temporal layer.
if (cpi->use_svc && cpi->svc.use_gf_temporal_ref_current_layer &&
cpi->svc.temporal_layer_id == 0) {
+ int i = 0;
+ SVC *const svc = &cpi->svc;
if (cpi->refresh_golden_frame)
rc->frames_since_golden = 0;
else
@@ -1607,6 +1609,14 @@
rc->frames_since_golden++;
// Decrement count down till next gf
if (rc->frames_till_gf_update_due > 0) rc->frames_till_gf_update_due--;
+ // Update the frames_since_golden for all upper temporal layers.
+ for (i = 1; i < svc->number_temporal_layers; ++i) {
+ const int layer = LAYER_IDS_TO_IDX(svc->spatial_layer_id, i,
+ svc->number_temporal_layers);
+ LAYER_CONTEXT *const lc = &svc->layer_context[layer];
+ RATE_CONTROL *const lrc = &lc->rc;
+ lrc->frames_since_golden = rc->frames_since_golden;
+ }
}
if (cm->frame_type == KEY_FRAME) rc->frames_since_key = 0;
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -629,6 +629,12 @@
cpi->svc.number_spatial_layers == 3 && cpi->svc.temporal_layer_id > 0 &&
cpi->oxcf.width * cpi->oxcf.height > 640 * 480)
sf->svc_use_lowres_part = 1;
+ // For SVC when golden is used as second temporal reference: to avoid
+ // encode time increase only use this feature on base temporal layer.
+ // (i.e remove golden flag from frame_flags for temporal_layer_id > 0).
+ if (cpi->use_svc && cpi->svc.use_gf_temporal_ref_current_layer &&
+ cpi->svc.temporal_layer_id > 0)
+ cpi->ref_frame_flags &= (~VP9_GOLD_FLAG);
}
if (speed >= 8) {