From 740083a97bb3ef0a11e45977611402a047099cfb Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Fri, 7 Sep 2018 16:37:42 -0700 Subject: [PATCH] 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 --- vp9/encoder/vp9_encoder.c | 8 ++++++++ vp9/encoder/vp9_firstpass.c | 1 + 2 files changed, 9 insertions(+) diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 6cece62b4..69ab0445c 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -780,6 +780,7 @@ void vp9_set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) { 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 @@ -791,6 +792,13 @@ static void setup_frame(VP9_COMP *cpi) { 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; cpi->refresh_alt_ref_frame = 1; diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 1f95bc6d5..87ab8eb84 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -2413,6 +2413,7 @@ static int define_gf_group_structure(VP9_COMP *cpi) { } 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; -- 2.40.0