Fix obmc + ext-interp interference
With ext-interp, a switchable interpolation filter is coded iff the motion vector uses fractional pixel movement (ie, true subpixel movement). With ext-interp and obmc enabled at the same time, the RD search proceeds as: 1. Do motion search 2. Do interpolation filter search iff subpixel motion, otherwise use EIGHTTAP_REGULAR 3. Evaluate obmc=0 4. Evaluete obmc=1 - This involves another motion search If the motion search in step 4 yields an integer motion vector, while the search in step 1 did not, then an interp_filter value other than EIGHTTAP_REGULAR is invalid, and will cause an assertion failure at output time, or a mismatch if not using --enable-debug. The fix sets the interp_filter to EIGHTTAP_REGULAR if obmc=1 is picked with an integer motion vector. Change-Id: I4685d1ad537f41d833dc9eb64845956b67886cca
This commit is contained in:
@@ -7619,6 +7619,19 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
|
|||||||
#else
|
#else
|
||||||
int tmp_rate2 = rate2_nocoeff;
|
int tmp_rate2 = rate2_nocoeff;
|
||||||
#endif // CONFIG_EXT_INTER
|
#endif // CONFIG_EXT_INTER
|
||||||
|
#if CONFIG_EXT_INTERP
|
||||||
|
#if CONFIG_DUAL_FILTER
|
||||||
|
INTERP_FILTER obmc_interp_filter[2][2] = {
|
||||||
|
{mbmi->interp_filter[0], mbmi->interp_filter[1]}, // obmc == 0
|
||||||
|
{mbmi->interp_filter[0], mbmi->interp_filter[1]} // obmc == 1
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
INTERP_FILTER obmc_interp_filter[2] = {
|
||||||
|
mbmi->interp_filter, // obmc == 0
|
||||||
|
mbmi->interp_filter // obmc == 1
|
||||||
|
};
|
||||||
|
#endif // CONFIG_DUAL_FILTER
|
||||||
|
#endif // CONFIG_EXT_INTERP
|
||||||
|
|
||||||
if (mbmi->obmc) {
|
if (mbmi->obmc) {
|
||||||
#if CONFIG_EXT_INTER
|
#if CONFIG_EXT_INTER
|
||||||
@@ -7647,6 +7660,21 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
|
|||||||
#else
|
#else
|
||||||
tmp_rate2 = rate2_nocoeff - rate_mv + tmp_rate_mv;
|
tmp_rate2 = rate2_nocoeff - rate_mv + tmp_rate_mv;
|
||||||
#endif // CONFIG_EXT_INTER
|
#endif // CONFIG_EXT_INTER
|
||||||
|
#if CONFIG_EXT_INTERP
|
||||||
|
#if CONFIG_DUAL_FILTER
|
||||||
|
if (!has_subpel_mv_component(xd, 0))
|
||||||
|
obmc_interp_filter[1][0] = mbmi->interp_filter[0] = EIGHTTAP_REGULAR;
|
||||||
|
if (!has_subpel_mv_component(xd, 1))
|
||||||
|
obmc_interp_filter[1][1] = mbmi->interp_filter[1] = EIGHTTAP_REGULAR;
|
||||||
|
#else
|
||||||
|
if (!vp10_is_interp_needed(xd))
|
||||||
|
obmc_interp_filter[1] = mbmi->interp_filter = EIGHTTAP_REGULAR;
|
||||||
|
#endif // CONFIG_DUAL_FILTER
|
||||||
|
// This is not quite correct with CONFIG_DUAL_FILTER when a filter
|
||||||
|
// is needed in only one direction
|
||||||
|
if (!vp10_is_interp_needed(xd))
|
||||||
|
tmp_rate2 -= rs;
|
||||||
|
#endif // CONFIG_EXT_INTERP
|
||||||
vp10_build_inter_predictors_sb(xd, mi_row, mi_col, bsize);
|
vp10_build_inter_predictors_sb(xd, mi_row, mi_col, bsize);
|
||||||
#if CONFIG_EXT_INTER
|
#if CONFIG_EXT_INTER
|
||||||
} else {
|
} else {
|
||||||
@@ -7787,6 +7815,14 @@ static int64_t handle_inter_mode(VP10_COMP *cpi, MACROBLOCK *x,
|
|||||||
#if CONFIG_OBMC
|
#if CONFIG_OBMC
|
||||||
tmp_rd = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion);
|
tmp_rd = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion);
|
||||||
if (mbmi->obmc == 0 || (tmp_rd < best_rd)) {
|
if (mbmi->obmc == 0 || (tmp_rd < best_rd)) {
|
||||||
|
#if CONFIG_EXT_INTERP
|
||||||
|
#if CONFIG_DUAL_FILTER
|
||||||
|
mbmi->interp_filter[0] = obmc_interp_filter[mbmi->obmc][0];
|
||||||
|
mbmi->interp_filter[1] = obmc_interp_filter[mbmi->obmc][1];
|
||||||
|
#else
|
||||||
|
mbmi->interp_filter = obmc_interp_filter[mbmi->obmc];
|
||||||
|
#endif // CONFIG_DUAL_FILTER
|
||||||
|
#endif // CONFIG_EXT_INTERP
|
||||||
best_mbmi = *mbmi;
|
best_mbmi = *mbmi;
|
||||||
best_rd = tmp_rd;
|
best_rd = tmp_rd;
|
||||||
best_rate2 = *rate2;
|
best_rate2 = *rate2;
|
||||||
|
Reference in New Issue
Block a user