From: Jingning Han Date: Fri, 4 Dec 2015 23:18:17 +0000 (-0800) Subject: Allow precise classification for refmv mode context X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0d65cae63883edeeb98f88c357262361c68c48ed;p=libvpx Allow precise classification for refmv mode context Combine the nearest ref mv count and the total ref mv count for mode context. Change-Id: I342a2b126bf7d2d30c344911260d9769a923026b --- diff --git a/vp10/common/entropymode.c b/vp10/common/entropymode.c index 9f2c1108f..9dec0ba07 100644 --- a/vp10/common/entropymode.c +++ b/vp10/common/entropymode.c @@ -173,7 +173,7 @@ static const vpx_prob default_partition_probs[PARTITION_CONTEXTS] #if CONFIG_REF_MV static const vpx_prob default_newmv_prob[NEWMV_MODE_CONTEXTS] = { - 230, 190, 150, 110, 70, 30, + 200, 180, 150, 150, 110, 70, 60, }; static const vpx_prob default_zeromv_prob[ZEROMV_MODE_CONTEXTS] = { @@ -181,7 +181,7 @@ static const vpx_prob default_zeromv_prob[ZEROMV_MODE_CONTEXTS] = { }; static const vpx_prob default_refmv_prob[REFMV_MODE_CONTEXTS] = { - 180, 230, 128 + 220, 220, 200, 200, 180, 128, }; #endif diff --git a/vp10/common/enums.h b/vp10/common/enums.h index b59531e4d..cde29458e 100644 --- a/vp10/common/enums.h +++ b/vp10/common/enums.h @@ -204,9 +204,9 @@ typedef enum { #define SKIP_CONTEXTS 3 #if CONFIG_REF_MV -#define NEWMV_MODE_CONTEXTS 6 +#define NEWMV_MODE_CONTEXTS 7 #define ZEROMV_MODE_CONTEXTS 2 -#define REFMV_MODE_CONTEXTS 3 +#define REFMV_MODE_CONTEXTS 6 #define ZEROMV_OFFSET 3 #define REFMV_OFFSET 4 diff --git a/vp10/common/mvref_common.c b/vp10/common/mvref_common.c index 074bc1600..86bb980d7 100644 --- a/vp10/common/mvref_common.c +++ b/vp10/common/mvref_common.c @@ -242,7 +242,7 @@ static void setup_ref_mv_list(const VP10_COMMON *cm, const MACROBLOCKD *xd, int bs = VPXMAX(xd->n8_w, xd->n8_h); int has_tr = has_top_right(xd, mi_row, mi_col, bs); - + mode_context[ref_frame] = 0; *refmv_count = 0; // Scan the first above row mode info. @@ -259,29 +259,6 @@ static void setup_ref_mv_list(const VP10_COMMON *cm, const MACROBLOCKD *xd, nearest_refmv_count = *refmv_count; - mode_context[ref_frame] = 0; - switch (nearest_refmv_count) { - case 0: - mode_context[ref_frame] = 0; - break; - - case 1: - mode_context[ref_frame] = (newmv_count > 0) ? 1 : 2; - mode_context[ref_frame] += (1 << REFMV_OFFSET); - break; - - case 2: - default: - if (newmv_count >= 2) - mode_context[ref_frame] = 3; - else if (newmv_count == 1) - mode_context[ref_frame] = 4; - else - mode_context[ref_frame] = 5; - mode_context[ref_frame] += (2 << REFMV_OFFSET); - break; - } - if (prev_frame_mvs_base && cm->show_frame && cm->last_show_frame) { int ref; int blk_row, blk_col; @@ -350,6 +327,39 @@ static void setup_ref_mv_list(const VP10_COMMON *cm, const MACROBLOCKD *xd, scan_col_mbmi(cm, xd, mi_row, mi_col, block, ref_frame, -4, ref_mv_stack, refmv_count); + switch (nearest_refmv_count) { + case 0: + mode_context[ref_frame] |= 0; + if (*refmv_count >= 1) + mode_context[ref_frame] |= 1; + + if (*refmv_count == 1) + mode_context[ref_frame] |= (1 << REFMV_OFFSET); + else if (*refmv_count >= 2) + mode_context[ref_frame] |= (2 << REFMV_OFFSET); + break; + case 1: + mode_context[ref_frame] |= (newmv_count > 0) ? 2 : 3; + + if (*refmv_count == 1) + mode_context[ref_frame] |= (3 << REFMV_OFFSET); + else if (*refmv_count >= 2) + mode_context[ref_frame] |= (4 << REFMV_OFFSET); + break; + + case 2: + default: + if (newmv_count >= 2) + mode_context[ref_frame] |= 4; + else if (newmv_count == 1) + mode_context[ref_frame] |= 5; + else + mode_context[ref_frame] |= 6; + + mode_context[ref_frame] |= (5 << REFMV_OFFSET); + break; + } + // Rank the likelihood and assign nearest and near mvs. len = nearest_refmv_count; while (len > 0) {