rtc: Allow for compound predicton for svc
Add flag to SVC_REF_FRAME_CONFIG to pass in option
for compound prediction in non_rd (speed >= 7).
Add some logic to nonrd_pickmode for more testing of
comp_pred on base temporal layers.
Change-Id: If5d6bf03c2feccbc836e88e8fac2436bba5f3c11
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 621835a..e7ea71f 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -1502,7 +1502,8 @@
int reference[7]; /**< Reference flag for each of the 7 references. */
/*! Buffer slot index for each of 7 references. */
int ref_idx[7];
- int refresh[8]; /**< Refresh flag for each of the 8 slots. */
+ int refresh[8]; /**< Refresh flag for each of the 8 slots. */
+ int use_comp_pred; /**< Use compound prediction. */
} aom_svc_ref_frame_config_t;
/*!\cond */
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index e0f3ef5..3f67e46 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -3151,6 +3151,7 @@
}
for (unsigned int i = 0; i < REF_FRAMES; ++i)
cpi->svc.refresh[i] = data->refresh[i];
+ cpi->svc.use_comp_pred = data->use_comp_pred;
cpi->svc.use_flexible_mode = 1;
cpi->svc.ksvc_fixed_mode = 0;
return AOM_CODEC_OK;
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index b42ff27..86c186d 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2480,10 +2480,15 @@
use_ref_frame_mask, &force_skip_low_temp_var);
// Test compound modes: LAST_GOLDEN for 0/NEARESST/NEAR.
- // For now to reduce slowdowm, uses only 0/0 for blocks above 16x16.
- if (cpi->sf.rt_sf.use_comp_ref_nonrd && is_comp_ref_allowed(bsize) &&
- bsize > BLOCK_16X16)
- num_comp_modes = 1;
+ // For now to reduce slowdowm, use only 0/0 for blocks above 16x16
+ // for non-svc case or on enhancement layers for svc.
+ if (cpi->sf.rt_sf.use_comp_ref_nonrd && is_comp_ref_allowed(bsize)) {
+ if (cpi->ppi->use_svc && cpi->svc.use_comp_pred &&
+ cpi->svc.temporal_layer_id == 0)
+ num_comp_modes = 3;
+ else if (bsize > BLOCK_16X16)
+ num_comp_modes = 1;
+ }
for (MV_REFERENCE_FRAME ref_frame_iter = LAST_FRAME;
ref_frame_iter <= ALTREF_FRAME; ++ref_frame_iter) {
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8d8c270..b989c05 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1212,6 +1212,13 @@
sf->rt_sf.estimate_motion_for_var_based_partition = 0;
}
}
+ if (cpi->ppi->use_svc && cpi->svc.use_comp_pred &&
+ (cpi->svc.reference[GOLDEN_FRAME - 1] == 1 ||
+ cpi->svc.reference[LAST2_FRAME - 1] == 1)) {
+ sf->rt_sf.use_comp_ref_nonrd = 1;
+ sf->rt_sf.ref_frame_comp_nonrd =
+ (cpi->svc.reference[GOLDEN_FRAME - 1] == 1) ? 0 : 1;
+ }
}
// TODO(kyslov): now this is very similar to
diff --git a/av1/encoder/svc_layercontext.h b/av1/encoder/svc_layercontext.h
index 817e362..bda7be9 100644
--- a/av1/encoder/svc_layercontext.h
+++ b/av1/encoder/svc_layercontext.h
@@ -99,6 +99,7 @@
int non_reference_frame;
int use_flexible_mode;
int ksvc_fixed_mode;
+ int use_comp_pred;
/*!\endcond */
/*!
diff --git a/examples/svc_encoder_rtc.c b/examples/svc_encoder_rtc.c
index 44bed38..35a1bd4 100644
--- a/examples/svc_encoder_rtc.c
+++ b/examples/svc_encoder_rtc.c
@@ -571,6 +571,7 @@
layer_id->spatial_layer_id = spatial_layer_id;
int lag_index = 0;
int base_count = superframe_cnt >> 2;
+ ref_frame_config->use_comp_pred = 0;
// Set the reference map buffer idx for the 7 references:
// LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
// BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).