From 2b5ab8095e43ec53adb8a0c002883c711a8557fe Mon Sep 17 00:00:00 2001 From: Marco Date: Mon, 7 Mar 2016 09:50:36 -0800 Subject: [PATCH] vp9-svc: Non-rd pickmode, fix condition for testing zeromv for spatial ref. Change-Id: I75bad321d5814a6df6735a8ead7700ab93b50763 --- vp9/encoder/vp9_pickmode.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index d861f8096..e53917f6c 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -1279,14 +1279,21 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, usable_ref_frame = GOLDEN_FRAME; } - // If the reference is temporally aligned with current superframe - // (e.g., spatial reference within superframe), constrain the inter mode: - // for now only test zero motion. - if (cpi->use_svc && svc ->force_zero_mode_spatial_ref) { - if (svc->ref_frame_index[cpi->lst_fb_idx] == svc->current_superframe) - svc_force_zero_mode[LAST_FRAME - 1] = 1; - if (svc->ref_frame_index[cpi->gld_fb_idx] == svc->current_superframe) - svc_force_zero_mode[GOLDEN_FRAME - 1] = 1; + // For svc mode, on spatial_layer_id > 0: if the reference has different scale + // constrain the inter mode to only test zero motion. + if (cpi->use_svc && + svc ->force_zero_mode_spatial_ref && + cpi->svc.spatial_layer_id > 0) { + if (cpi->ref_frame_flags & flag_list[LAST_FRAME]) { + struct scale_factors *const sf = &cm->frame_refs[LAST_FRAME - 1].sf; + if (vp9_is_scaled(sf)) + svc_force_zero_mode[LAST_FRAME - 1] = 1; + } + if (cpi->ref_frame_flags & flag_list[GOLDEN_FRAME]) { + struct scale_factors *const sf = &cm->frame_refs[GOLDEN_FRAME - 1].sf; + if (vp9_is_scaled(sf)) + svc_force_zero_mode[GOLDEN_FRAME - 1] = 1; + } } for (ref_frame = LAST_FRAME; ref_frame <= usable_ref_frame; ++ref_frame) {