]> granicus.if.org Git - libvpx/commitdiff
vp9-svc: Fix to frames_since_golden update for SVC.
authorMarco Paniconi <marpan@google.com>
Thu, 7 Jun 2018 23:35:44 +0000 (16:35 -0700)
committerMarco Paniconi <marpan@google.com>
Mon, 11 Jun 2018 15:57:20 +0000 (08:57 -0700)
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

vp9/encoder/vp9_ratectrl.c
vp9/encoder/vp9_speed_features.c

index 452e4d3cd5cdc9db955e8550c5c41cd7d8a69477..39dc329e97066bc5a333f6877406fd5f6a1652be 100644 (file)
@@ -1601,12 +1601,22 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
   // 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
       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;
index f7e97cebc74b122c57b86af4be1c34edff1cd489..09d45b769eca1e89ab903a1841f033942f749a08 100644 (file)
@@ -629,6 +629,12 @@ static void set_rt_speed_feature_framesize_independent(
         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) {