RTC: Disable motion search on lower spatial layer altref
Change-Id: Id60dd707c6a4d7ef033769b425ee51137055e9db
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index b7729e9..3006199 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2782,7 +2782,8 @@
force_mv_inter_layer = 0;
if (cpi->ppi->use_svc && svc->spatial_layer_id > 0 &&
((ref_frame == LAST_FRAME && svc->skip_mvsearch_last) ||
- (ref_frame == GOLDEN_FRAME && svc->skip_mvsearch_gf))) {
+ (ref_frame == GOLDEN_FRAME && svc->skip_mvsearch_gf) ||
+ (ref_frame == ALTREF_FRAME && svc->skip_mvsearch_altref))) {
// Only test mode if NEARESTMV/NEARMV is (svc_mv_col, svc_mv_row),
// otherwise set NEWMV to (svc_mv_col, svc_mv_row).
// Skip newmv and filter search.
diff --git a/av1/encoder/svc_layercontext.c b/av1/encoder/svc_layercontext.c
index d0b7d23..3007e5f 100644
--- a/av1/encoder/svc_layercontext.c
+++ b/av1/encoder/svc_layercontext.c
@@ -165,6 +165,13 @@
}
}
+static AOM_INLINE bool check_ref_is_low_spatial_res_super_frame(
+ int ref_frame, const SVC *svc) {
+ int ref_frame_idx = svc->ref_idx[ref_frame - 1];
+ return svc->buffer_time_index[ref_frame_idx] == svc->current_superframe &&
+ svc->buffer_spatial_layer[ref_frame_idx] <= svc->spatial_layer_id - 1;
+}
+
void av1_restore_layer_context(AV1_COMP *const cpi) {
SVC *const svc = &cpi->svc;
const AV1_COMMON *const cm = &cpi->common;
@@ -200,14 +207,15 @@
// refreshed (i.e., buffer slot holding that reference was refreshed) on the
// previous spatial layer(s) at the same time (current_superframe).
if (svc->set_ref_frame_config && svc->force_zero_mode_spatial_ref) {
- int ref_frame_idx = svc->ref_idx[LAST_FRAME - 1];
- if (svc->buffer_time_index[ref_frame_idx] == svc->current_superframe &&
- svc->buffer_spatial_layer[ref_frame_idx] <= svc->spatial_layer_id - 1)
+ if (check_ref_is_low_spatial_res_super_frame(LAST_FRAME, svc)) {
svc->skip_mvsearch_last = 1;
- ref_frame_idx = svc->ref_idx[GOLDEN_FRAME - 1];
- if (svc->buffer_time_index[ref_frame_idx] == svc->current_superframe &&
- svc->buffer_spatial_layer[ref_frame_idx] <= svc->spatial_layer_id - 1)
+ }
+ if (check_ref_is_low_spatial_res_super_frame(GOLDEN_FRAME, svc)) {
svc->skip_mvsearch_gf = 1;
+ }
+ if (check_ref_is_low_spatial_res_super_frame(ALTREF_FRAME, svc)) {
+ svc->skip_mvsearch_altref = 1;
+ }
}
}
diff --git a/av1/encoder/svc_layercontext.h b/av1/encoder/svc_layercontext.h
index dc6906d..e3c2653 100644
--- a/av1/encoder/svc_layercontext.h
+++ b/av1/encoder/svc_layercontext.h
@@ -112,6 +112,7 @@
unsigned char buffer_spatial_layer[REF_FRAMES];
int skip_mvsearch_last;
int skip_mvsearch_gf;
+ int skip_mvsearch_altref;
int spatial_layer_fb[REF_FRAMES];
int temporal_layer_fb[REF_FRAMES];
int num_encoded_top_layer;