diff --git a/vp9/common/vp9_loopfilter.c b/vp9/common/vp9_loopfilter.c index 4943e42afd647d543f2050536d931cb22b89ec2b..8d8a8df92c61bfd14b0d2032f48cb5f601283ad1 100644 --- a/vp9/common/vp9_loopfilter.c +++ b/vp9/common/vp9_loopfilter.c @@ -281,66 +281,67 @@ static void lpf_sb32(VP9_COMMON *cm, const MODE_INFO *mode_info_context, uint8_t *y_ptr, uint8_t *u_ptr, uint8_t *v_ptr, int y_stride, int uv_stride, int y_only, int dering) { - BLOCK_SIZE_TYPE sb_type = mode_info_context->mbmi.sb_type; - TX_SIZE tx_size = mode_info_context->mbmi.txfm_size; - int do_left_v, do_above_h; - int do_left_v_mbuv, do_above_h_mbuv; - int mis = cm->mode_info_stride; - const MODE_INFO *mi; - - // process 1st MB top-left - mi = mode_info_context; - do_left_v = (mb_col > 0); - do_above_h = (mb_row > 0); - do_left_v_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && + BLOCK_SIZE_TYPE sb_type = mode_info_context->mbmi.sb_type; + const int wbl = b_width_log2(sb_type), hbl = b_height_log2(sb_type); + TX_SIZE tx_size = mode_info_context->mbmi.txfm_size; + int do_left_v, do_above_h; + int do_left_v_mbuv, do_above_h_mbuv; + int mis = cm->mode_info_stride; + const MODE_INFO *mi; + + // process 1st MB top-left + mi = mode_info_context; + do_left_v = (mb_col > 0); + do_above_h = (mb_row > 0); + do_left_v_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && tx_size >= TX_32X32 && (mb_col & 2)); - do_above_h_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && + do_above_h_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && tx_size >= TX_32X32 && (mb_row & 2)); - lpf_mb(cm, mi, do_left_v, do_above_h, + lpf_mb(cm, mi, do_left_v, do_above_h, do_left_v_mbuv, do_above_h_mbuv, y_ptr, y_only? 0 : u_ptr, y_only? 0 : v_ptr, y_stride, uv_stride, dering); - // process 2nd MB top-right - mi = mode_info_context + 1; - do_left_v = !(sb_type && (tx_size >= TX_32X32 || + // process 2nd MB top-right + mi = mode_info_context + 1; + do_left_v = !(wbl >= 3 /* 32x16 or >=32x32 */ && (tx_size >= TX_32X32 || sb_mb_lf_skip(mode_info_context, mi))); - do_above_h = (mb_row > 0); - do_left_v_mbuv = do_left_v; - do_above_h_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && + do_above_h = (mb_row > 0); + do_left_v_mbuv = do_left_v; + do_above_h_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && tx_size >= TX_32X32 && (mb_row & 2)); - lpf_mb(cm, mi, do_left_v, do_above_h, + lpf_mb(cm, mi, do_left_v, do_above_h, do_left_v_mbuv, do_above_h_mbuv, y_ptr + 16, y_only ? 0 : (u_ptr + 8), y_only ? 0 : (v_ptr + 8), y_stride, uv_stride, dering); - // process 3rd MB bottom-left - mi = mode_info_context + mis; - do_left_v = (mb_col > 0); - do_above_h =!(sb_type && (tx_size >= TX_32X32 || + // process 3rd MB bottom-left + mi = mode_info_context + mis; + do_left_v = (mb_col > 0); + do_above_h = !(hbl >= 3 /* 16x32 or >=32x32 */ && (tx_size >= TX_32X32 || sb_mb_lf_skip(mode_info_context, mi))); - do_left_v_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && + do_left_v_mbuv = !(sb_type >= BLOCK_SIZE_SB64X64 && tx_size >= TX_32X32 && (mb_col & 2)); - do_above_h_mbuv = do_above_h; - lpf_mb(cm, mi, do_left_v, do_above_h, + do_above_h_mbuv = do_above_h; + lpf_mb(cm, mi, do_left_v, do_above_h, do_left_v_mbuv, do_above_h_mbuv, y_ptr + 16 * y_stride, y_only ? 0 : (u_ptr + 8 * uv_stride), y_only ? 0 : (v_ptr + 8 * uv_stride), y_stride, uv_stride, dering); - // process 4th MB bottom right - mi = mode_info_context + mis + 1; - do_left_v = !(sb_type && (tx_size >= TX_32X32 || + // process 4th MB bottom right + mi = mode_info_context + mis + 1; + do_left_v = !(wbl >= 3 /* 32x16 or >=32x32 */ && (tx_size >= TX_32X32 || sb_mb_lf_skip(mi - 1, mi))); - do_above_h =!(sb_type && (tx_size >= TX_32X32 || + do_above_h = !(hbl >= 3 /* 16x32 or >=32x32 */ && (tx_size >= TX_32X32 || sb_mb_lf_skip(mode_info_context + 1, mi))); - do_left_v_mbuv = do_left_v; - do_above_h_mbuv = do_above_h; - lpf_mb(cm, mi, do_left_v, do_above_h, + do_left_v_mbuv = do_left_v; + do_above_h_mbuv = do_above_h; + lpf_mb(cm, mi, do_left_v, do_above_h, do_left_v_mbuv, do_above_h_mbuv, y_ptr + 16 * y_stride + 16, y_only ? 0 : (u_ptr + 8 * uv_stride + 8),