intrabc: use its own mv cost table To faciliate using intrabc on interframes. Change-Id: Ibfe376190adf24d15198c5fb548e1050e191a3d6
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index dfb0b2e..2f72a28 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h
@@ -615,6 +615,9 @@ #if CONFIG_INTRABC // A flag to indicate if intrabc is ever used in current frame. int intrabc_used; + int dv_cost[2][MV_VALS]; + // TODO(huisu@google.com): we can update dv_joint_cost per SB. + int dv_joint_cost[MV_JOINTS]; #endif // CONFIG_INTRABC } AV1_COMP;
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c index 4173020..f2daad7 100644 --- a/av1/encoder/rd.c +++ b/av1/encoder/rd.c
@@ -715,10 +715,9 @@ #if CONFIG_INTRABC if (frame_is_intra_only(cm) && cm->allow_screen_content_tools && cpi->oxcf.pass != 1) { - av1_build_nmv_cost_table( - x->nmv_vec_cost[0], - cm->allow_high_precision_mv ? x->nmvcost_hp[0] : x->nmvcost[0], - &cm->fc->ndvc, MV_SUBPEL_NONE); + int *dvcost[2] = { &cpi->dv_cost[0][MV_MAX], &cpi->dv_cost[1][MV_MAX] }; + av1_build_nmv_cost_table(cpi->dv_joint_cost, dvcost, &cm->fc->ndvc, + MV_SUBPEL_NONE); } #endif
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 4954c8f..b86c8d8 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -8873,11 +8873,12 @@ x->skip = 0; av1_build_inter_predictors_sb(cm, xd, mi_row, mi_col, NULL, bsize); - assert(x->mvcost == x->mv_cost_stack[0]); + int *dvcost[2] = { (int *)&cpi->dv_cost[0][MV_MAX], + (int *)&cpi->dv_cost[1][MV_MAX] }; // TODO(aconverse@google.com): The full motion field defining discount // in MV_COST_WEIGHT is too large. Explore other values. - int rate_mv = av1_mv_bit_cost(&dv, &dv_ref.as_mv, x->nmvjointcost, - x->mvcost, MV_COST_WEIGHT_SUB); + int rate_mv = av1_mv_bit_cost(&dv, &dv_ref.as_mv, cpi->dv_joint_cost, + dvcost, MV_COST_WEIGHT_SUB); const int rate_mode = x->intrabc_cost[1]; RD_STATS rd_stats, rd_stats_uv; av1_subtract_plane(x, bsize, 0);