ref: f780b16bb881c9df9ea89d057d068756ced3ec60
parent: d3a7e677e64f0b8a99b30b522005d7fd657fc257
author: Minghai Shang <[email protected]>
date: Fri Sep 12 09:07:47 EDT 2014
[spatial svc] Use same golden frame for all temporal layers Overhead goes down from 8% to 3% for 1080 60p Change-Id: Idf3e5ca8712402a914a8cb79df17d3cdab63b163
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -2152,6 +2152,10 @@
break;
}
if (is_two_pass_svc(cpi)) {
+ if (cpi->svc.temporal_layer_id > 0) {
+ cpi->refresh_last_frame = 0;
+ cpi->refresh_golden_frame = 0;
+ }
if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].gold_ref_idx < 0)
cpi->refresh_golden_frame = 0;
if (cpi->alt_ref_source == NULL)
--- a/vp9/encoder/vp9_svc_layercontext.c
+++ b/vp9/encoder/vp9_svc_layercontext.c
@@ -19,7 +19,7 @@
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
int layer;
int layer_end;
- int alt_ref_idx = svc->number_spatial_layers * svc->number_temporal_layers;
+ int alt_ref_idx = svc->number_spatial_layers;
svc->spatial_layer_id = 0;
svc->temporal_layer_id = 0;
@@ -286,30 +286,17 @@
count >>= 1;
}
- cpi->lst_fb_idx =
- cpi->svc.spatial_layer_id * cpi->svc.number_temporal_layers +
- cpi->svc.temporal_layer_id;
- if (lc->frames_from_key_frame < cpi->svc.number_temporal_layers)
- cpi->ref_frame_flags &= ~VP9_LAST_FLAG;
+ cpi->lst_fb_idx = cpi->svc.spatial_layer_id;
- if (cpi->svc.spatial_layer_id == 0) {
- if (cpi->svc.temporal_layer_id == 0)
- cpi->gld_fb_idx = lc->gold_ref_idx >= 0 ?
- lc->gold_ref_idx : cpi->lst_fb_idx;
- else
- cpi->gld_fb_idx = cpi->lst_fb_idx - 1;
- } else {
- if (cpi->svc.temporal_layer_id == 0)
- cpi->gld_fb_idx = cpi->svc.spatial_layer_id -
- cpi->svc.number_temporal_layers;
- else
- cpi->gld_fb_idx = cpi->lst_fb_idx - 1;
- }
+ if (cpi->svc.spatial_layer_id == 0)
+ cpi->gld_fb_idx = (lc->gold_ref_idx >= 0) ?
+ lc->gold_ref_idx : cpi->lst_fb_idx;
+ else
+ cpi->gld_fb_idx = cpi->svc.spatial_layer_id - 1;
if (lc->current_video_frame_in_layer == 0) {
if (cpi->svc.spatial_layer_id >= 2) {
- cpi->alt_fb_idx =
- cpi->svc.spatial_layer_id - 2 * cpi->svc.number_temporal_layers;
+ cpi->alt_fb_idx = cpi->svc.spatial_layer_id - 2;
} else {
cpi->alt_fb_idx = cpi->lst_fb_idx;
cpi->ref_frame_flags &= (~VP9_LAST_FLAG & ~VP9_ALT_FLAG);
@@ -331,8 +318,7 @@
lc_lower->alt_ref_source != NULL)
cpi->alt_fb_idx = lc_lower->alt_ref_idx;
else if (cpi->svc.spatial_layer_id >= 2)
- cpi->alt_fb_idx =
- cpi->svc.spatial_layer_id - 2 * cpi->svc.number_temporal_layers;
+ cpi->alt_fb_idx = cpi->svc.spatial_layer_id - 2;
else
cpi->alt_fb_idx = cpi->lst_fb_idx;
}
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -178,8 +178,6 @@
}
#if CONFIG_SPATIAL_SVC
- if (cfg->ss_number_layers * cfg->ts_number_layers > REF_FRAMES)
- ERROR("Too many layers. Maximum 8 layers could be set");
if ((cfg->ss_number_layers > 1 || cfg->ts_number_layers > 1) &&
cfg->g_pass == VPX_RC_LAST_PASS) {
@@ -188,8 +186,7 @@
if (cfg->ss_enable_auto_alt_ref[i])
++alt_ref_sum;
}
- if (alt_ref_sum >
- REF_FRAMES - cfg->ss_number_layers * cfg->ts_number_layers)
+ if (alt_ref_sum > REF_FRAMES - cfg->ss_number_layers)
ERROR("Not enough ref buffers for svc alt ref frames");
if ((cfg->ss_number_layers > 3 ||
cfg->ss_number_layers * cfg->ts_number_layers > 4) &&