shithub: libvpx

Download patch

ref: 740083a97bb3ef0a11e45977611402a047099cfb
parent: b0688880281eb4015a00eb854fb0d6a352b35bdb
author: Jingning Han <jingning@google.com>
date: Fri Sep 7 12:37:42 EDT 2018

Separate frame context index for GOP layers

Use separate frame context index to code frames at different layers.
The maximum index cap is set as 3. This improves the compression
performance of multi-layer ARF by 0.15% across the test sets.

The overall coding gains from multi-layer ARF are

         avg PSNR       ovarall PSNR        SSIM
lowres   -3.9%            -3.7%            -3.2%
midres   -3.5%            -3.2%            -2.3%
nflx2k   -4.3%            -4.6%            -3.0%

Change-Id: I8a0b345fdd47823c018544a6b4748753faf89dc1

--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -780,6 +780,7 @@
 
 static void setup_frame(VP9_COMP *cpi) {
   VP9_COMMON *const cm = &cpi->common;
+  GF_GROUP *const gf_group = &cpi->twopass.gf_group;
   // Set up entropy context depending on frame type. The decoder mandates
   // the use of the default context, index 0, for keyframes and inter
   // frames where the error_resilient_mode or intra_only flag is set. For
@@ -790,6 +791,13 @@
   } else {
     if (!cpi->use_svc) cm->frame_context_idx = cpi->refresh_alt_ref_frame;
   }
+
+  // TODO(jingning): Overwrite the frame_context_idx index in multi-layer ARF
+  // case. Need some further investigation on if we could apply this to single
+  // layer ARF case as well.
+  if (cpi->multi_layer_arf && !cpi->use_svc)
+    cm->frame_context_idx = clamp(gf_group->layer_depth[gf_group->index] - 1, 0,
+                                  FRAME_CONTEXTS - 1);
 
   if (cm->frame_type == KEY_FRAME) {
     cpi->refresh_golden_frame = 1;
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2413,6 +2413,7 @@
     }
     gf_group->arf_update_idx[frame_index] = arf_buffer_indices[0];
     gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0];
+    gf_group->layer_depth[frame_index] = MAX_ARF_LAYERS - 1;
   }
 
   ++frame_index;