Merge commit 'a7a17e3f1915ce69b787dc58c5d8dba0910fc0a4'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 9 Aug 2014 19:17:14 +0000 (21:17 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 9 Aug 2014 19:29:33 +0000 (21:29 +0200)
* commit 'a7a17e3f1915ce69b787dc58c5d8dba0910fc0a4':
  hevc_filter: move some conditions out of loops

Conflicts:
libavcodec/hevc_filter.c

This is possibly less readable than the variant used before.
Thus please take a look and if people agree its worse, dont
hesitate to revert.

See: 83976e40e89655162e5394cf8915d9b6d89702d9
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/hevc_filter.c

@@@ -579,23 -593,51 +579,27 @@@ void ff_hevc_deblocking_boundary_streng
      int min_pu_width     = s->sps->min_pu_width;
      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)].is_intra;
 +                           (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;
 -
 -        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;
 -            MvField *top  = &tab_mvf[yp_pu * min_pu_width + x_pu];
 -            MvField *curr = &tab_mvf[yq_pu * min_pu_width + x_pu];
 -            uint8_t top_cbf_luma  = s->cbf_luma[yp_tu * min_tu_width + x_tu];
 -            uint8_t curr_cbf_luma = s->cbf_luma[yq_tu * min_tu_width + x_tu];
 +            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 + i, y0 - 1);
 -
 -            bs = boundary_strength(s, curr, curr_cbf_luma,
 -                                   top, top_cbf_luma, top_refPicList, 1);
 -            if (bs)
 -                s->horizontal_bs[((x0 + i) + y0 * s->bs_width) >> 2] = bs;
 -        }
 -    }
 -
 -    // bs for TU internal horizontal PU boundaries
 -    if (log2_trafo_size > s->sps->log2_min_pu_size && !is_intra)
 -        for (j = 8; j < (1 << log2_trafo_size); j += 8) {
 -            int yp_pu = (y0 + j - 1) >> log2_min_pu_size;
 -            int yq_pu = (y0 + j)     >> log2_min_pu_size;
 -            int yp_tu = (y0 + j - 1) >> log2_min_tu_size;
 -            int yq_tu = (y0 + j)     >> log2_min_tu_size;
 -
 +                                                              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;
                  MvField *curr = &tab_mvf[yq_pu * min_pu_width + x_pu];
                  uint8_t top_cbf_luma  = s->cbf_luma[yp_tu * min_tu_width + x_tu];
                  uint8_t curr_cbf_luma = s->cbf_luma[yq_tu * min_tu_width + x_tu];
 -                RefPicList *top_refPicList = ff_hevc_get_ref_list(s, s->ref,
 -                                                                  x0 + i,
 -                                                                  y0 + j - 1);
 -
 -                bs = boundary_strength(s, curr, curr_cbf_luma,
 -                                       top, top_cbf_luma, top_refPicList, 0);
 -                if (bs)
 -                    s->horizontal_bs[((x0 + i) + (y0 + j) * s->bs_width) >> 2] = bs;
 +
 +                if (curr->pred_flag == PF_INTRA || top->pred_flag == PF_INTRA)
 +                    bs = 2;
 +                else if (curr_cbf_luma || top_cbf_luma)
 +                    bs = 1;
 +                else
 +                    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;
 -        int xq_tu =  x0      >> log2_min_tu_size;
 -
 -        for (i = 0; i < (1 << log2_trafo_size); i += 4) {
 -            int y_pu      = (y0 + i) >> log2_min_pu_size;
 -            int y_tu      = (y0 + i) >> log2_min_tu_size;
 -            MvField *left = &tab_mvf[y_pu * min_pu_width + xp_pu];
 -            MvField *curr = &tab_mvf[y_pu * min_pu_width + xq_pu];
 -
 -            uint8_t left_cbf_luma = s->cbf_luma[y_tu * min_tu_width + xp_tu];
 -            uint8_t curr_cbf_luma = s->cbf_luma[y_tu * min_tu_width + xq_tu];
 +            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;
 +            int xq_tu =  x0      >> log2_min_tu_size;
              RefPicList *left_refPicList = ff_hevc_get_ref_list(s, s->ref,
 -                                                               x0 - 1, y0 + i);
 +                                                               x0 - 1, y0);
  
 -            bs = boundary_strength(s, curr, curr_cbf_luma,
 -                                   left, left_cbf_luma, left_refPicList, 1);
 -            if (bs)
 -                s->vertical_bs[(x0 >> 3) + ((y0 + i) >> 2) * s->bs_width] = bs;
 -        }
 +            for (i = 0; i < (1 << log2_trafo_size); i += 4) {
 +                int y_pu      = (y0 + i) >> log2_min_pu_size;
 +                int y_tu      = (y0 + i) >> log2_min_tu_size;
 +                MvField *left = &tab_mvf[y_pu * min_pu_width + xp_pu];
 +                MvField *curr = &tab_mvf[y_pu * min_pu_width + xq_pu];
 +                uint8_t left_cbf_luma = s->cbf_luma[y_tu * min_tu_width + xp_tu];
 +                uint8_t curr_cbf_luma = s->cbf_luma[y_tu * min_tu_width + xq_tu];
 +
 +                if (curr->pred_flag == PF_INTRA || left->pred_flag == PF_INTRA)
 +                    bs = 2;
 +                else if (curr_cbf_luma || left_cbf_luma)
 +                    bs = 1;
 +                else
 +                    bs = boundary_strength(s, curr, left, left_refPicList);
 +                s->vertical_bs[(x0 + (y0 + i) * s->bs_width) >> 2] = bs;
 +            }
-         }
      }
  
 -    // bs for TU internal vertical PU boundaries
 -    if (log2_trafo_size > log2_min_pu_size && !is_intra)
 +    if (log2_trafo_size > log2_min_pu_size && !is_intra) {
 +        RefPicList *refPicList = ff_hevc_get_ref_list(s, s->ref,
 +                                                           x0,
 +                                                           y0);
 +        // bs for TU internal horizontal PU boundaries
 +        for (j = 8; j < (1 << log2_trafo_size); j += 8) {
 +            int yp_pu = (y0 + j - 1) >> log2_min_pu_size;
 +            int yq_pu = (y0 + j)     >> log2_min_pu_size;
 +
 +            for (i = 0; i < (1 << log2_trafo_size); i += 4) {
 +                int x_pu = (x0 + i) >> log2_min_pu_size;
 +                MvField *top  = &tab_mvf[yp_pu * min_pu_width + x_pu];
 +                MvField *curr = &tab_mvf[yq_pu * min_pu_width + x_pu];
 +
 +                bs = boundary_strength(s, curr, top, refPicList);
 +                s->horizontal_bs[((x0 + i) + (y0 + j) * s->bs_width) >> 2] = bs;
 +            }
 +        }
 +
 +        // bs for TU internal vertical PU boundaries
          for (j = 0; j < (1 << log2_trafo_size); j += 4) {
              int y_pu = (y0 + j) >> log2_min_pu_size;
 -            int y_tu = (y0 + j) >> log2_min_tu_size;
  
              for (i = 8; i < (1 << log2_trafo_size); i += 8) {
                  int xp_pu = (x0 + i - 1) >> log2_min_pu_size;