diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c index 4c8642007e..0188680308 100644 --- a/libavcodec/hevc_filter.c +++ b/libavcodec/hevc_filter.c @@ -580,22 +580,26 @@ void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, int min_tu_width = s->sps->min_tb_width; int is_intra = tab_mvf[(y0 >> log2_min_pu_size) * min_pu_width + (x0 >> log2_min_pu_size)].pred_flag == PF_INTRA; + int boundary_upper, boundary_left; int i, j, bs; - if (y0 > 0 && (y0 & 7) == 0) { - int bd_ctby = y0 & ((1 << s->sps->log2_ctb_size) - 1); - int bd_slice = s->sh.slice_loop_filter_across_slices_enabled_flag || - !(lc->boundary_flags & BOUNDARY_UPPER_SLICE); - int bd_tiles = s->pps->loop_filter_across_tiles_enabled_flag || - !(lc->boundary_flags & BOUNDARY_UPPER_TILE); - if (((bd_slice && bd_tiles) || bd_ctby)) { + boundary_upper = y0 > 0 && !(y0 & 7); + if (boundary_upper && + ((!s->sh.slice_loop_filter_across_slices_enabled_flag && + lc->boundary_flags & BOUNDARY_UPPER_SLICE && + (y0 % (1 << s->sps->log2_ctb_size)) == 0) || + (!s->pps->loop_filter_across_tiles_enabled_flag && + lc->boundary_flags & BOUNDARY_UPPER_TILE && + (y0 % (1 << s->sps->log2_ctb_size)) == 0))) + boundary_upper = 0; + + if (boundary_upper) { int yp_pu = (y0 - 1) >> log2_min_pu_size; int yq_pu = y0 >> log2_min_pu_size; int yp_tu = (y0 - 1) >> log2_min_tu_size; int yq_tu = y0 >> log2_min_tu_size; RefPicList *top_refPicList = ff_hevc_get_ref_list(s, s->ref, x0, y0 - 1); - for (i = 0; i < (1 << log2_trafo_size); i += 4) { int x_pu = (x0 + i) >> log2_min_pu_size; int x_tu = (x0 + i) >> log2_min_tu_size; @@ -612,17 +616,20 @@ void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, bs = boundary_strength(s, curr, top, top_refPicList); s->horizontal_bs[((x0 + i) + y0 * s->bs_width) >> 2] = bs; } - } } // bs for vertical TU boundaries - if (x0 > 0 && (x0 & 7) == 0) { - int bd_ctbx = x0 & ((1 << s->sps->log2_ctb_size) - 1); - int bd_slice = s->sh.slice_loop_filter_across_slices_enabled_flag || - !(lc->boundary_flags & BOUNDARY_LEFT_SLICE); - int bd_tiles = s->pps->loop_filter_across_tiles_enabled_flag || - !(lc->boundary_flags & BOUNDARY_LEFT_TILE); - if (((bd_slice && bd_tiles) || bd_ctbx)) { + boundary_left = x0 > 0 && !(x0 & 7); + if (boundary_left && + ((!s->sh.slice_loop_filter_across_slices_enabled_flag && + lc->boundary_flags & BOUNDARY_LEFT_SLICE && + (x0 % (1 << s->sps->log2_ctb_size)) == 0) || + (!s->pps->loop_filter_across_tiles_enabled_flag && + lc->boundary_flags & BOUNDARY_LEFT_TILE && + (x0 % (1 << s->sps->log2_ctb_size)) == 0))) + boundary_left = 0; + + if (boundary_left) { int xp_pu = (x0 - 1) >> log2_min_pu_size; int xq_pu = x0 >> log2_min_pu_size; int xp_tu = (x0 - 1) >> log2_min_tu_size; @@ -646,7 +653,6 @@ void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, bs = boundary_strength(s, curr, left, left_refPicList); s->vertical_bs[(x0 + (y0 + i) * s->bs_width) >> 2] = bs; } - } } if (log2_trafo_size > log2_min_pu_size && !is_intra) {