Fix select filter level Only use cm->mi, instead of cm->mi_grid_visible to get filter level. The latter may not work for shifted grid loop filtering. Change-Id: I55ed6a42f0abb19d6814e8c0cf8d64ce79bf6abc
diff --git a/av1/common/av1_loopfilter.c b/av1/common/av1_loopfilter.c index ae4d435..b5012ff 100644 --- a/av1/common/av1_loopfilter.c +++ b/av1/common/av1_loopfilter.c
@@ -597,9 +597,12 @@ #if CONFIG_LOOPFILTER_LEVEL const int dir_idx, #endif +#if CONFIG_LPF_SB + int mi_row, int mi_col, +#endif const MB_MODE_INFO *mbmi) { #if CONFIG_LPF_SB - return mbmi->filt_lvl; + return cm->mi[mi_row * cm->mi_stride + mi_col].mbmi.filt_lvl; #endif #if CONFIG_SUPERTX @@ -647,10 +650,6 @@ #else static uint8_t get_filter_level(const loop_filter_info_n *lfi_n, const MB_MODE_INFO *mbmi) { -#if CONFIG_LPF_SB - return mbmi->filt_lvl; -#endif - #if CONFIG_SUPERTX const int segment_id = AOMMIN(mbmi->segment_id, mbmi->segment_id_supertx); assert( @@ -1461,7 +1460,11 @@ #if CONFIG_LOOPFILTER_LEVEL const int filter_level = get_filter_level(cm, lfi_n, 0, mbmi); #else +#if CONFIG_LPF_SB + const int filter_level = get_filter_level(cm, lfi_n, 0, 0, mbmi); +#else const int filter_level = get_filter_level(cm, lfi_n, mbmi); +#endif // CONFIG_LPF_SB #endif #else const int filter_level = get_filter_level(lfi_n, mbmi); @@ -1559,7 +1562,11 @@ #if CONFIG_LOOPFILTER_LEVEL const int filter_level = get_filter_level(cm, lfi_n, 0, mbmi); #else +#if CONFIG_LPF_SB + const int filter_level = get_filter_level(cm, lfi_n, 0, 0, mbmi); +#else const int filter_level = get_filter_level(cm, lfi_n, mbmi); +#endif // CONFIG_LPF_SB #endif #else const int filter_level = get_filter_level(lfi_n, mbmi); @@ -2169,7 +2176,13 @@ if (!(lfl_r[c_step] = get_filter_level(cm, &cm->lf_info, 0, mbmi))) continue; #else +#if CONFIG_LPF_SB + if (!(lfl_r[c_step] = + get_filter_level(cm, &cm->lf_info, mi_row, mi_col, mbmi))) + continue; +#else if (!(lfl_r[c_step] = get_filter_level(cm, &cm->lf_info, mbmi))) continue; +#endif // CONFIG_LPF_SB #endif #else if (!(lfl_r[c_step] = get_filter_level(&cm->lf_info, mbmi))) continue; @@ -2867,7 +2880,12 @@ const uint32_t curr_level = get_filter_level(cm, &cm->lf_info, edge_dir, mbmi); #else +#if CONFIG_LPF_SB + const uint32_t curr_level = + get_filter_level(cm, &cm->lf_info, mi_row, mi_col, mbmi); +#else const uint32_t curr_level = get_filter_level(cm, &cm->lf_info, mbmi); +#endif // CONFIG_LPF_SB #endif #else const uint32_t curr_level = get_filter_level(&cm->lf_info, mbmi); @@ -2904,8 +2922,13 @@ const uint32_t pv_lvl = get_filter_level(cm, &cm->lf_info, edge_dir, &mi_prev->mbmi); #else +#if CONFIG_LPF_SB + const uint32_t pv_lvl = get_filter_level(cm, &cm->lf_info, pv_row, + pv_col, &mi_prev->mbmi); +#else const uint32_t pv_lvl = get_filter_level(cm, &cm->lf_info, &mi_prev->mbmi); +#endif // CONFIG_LPF_SB #endif #else const uint32_t pv_lvl =
diff --git a/av1/encoder/picklpf.c b/av1/encoder/picklpf.c index 2869860..d8b6f90 100644 --- a/av1/encoder/picklpf.c +++ b/av1/encoder/picklpf.c
@@ -232,6 +232,10 @@ filt_best = last_lvl; } + // Compute rdcost to determine whether to reuse previous filter lvl + if (filt_best != last_lvl) { + } + if (best_cost_ret) *best_cost_ret = RDCOST_DBL(x->rdmult, 0, best_err); return filt_best; }