Only filter the blocks we need to filter (rather than use threshold=0)

Change-Id: Iddb2103452817e9624a28794cab923f00c3e9924
diff --git a/av1/common/cdef.c b/av1/common/cdef.c
index 8875ca3..d7fcc48 100644
--- a/av1/common/cdef.c
+++ b/av1/common/cdef.c
@@ -55,7 +55,7 @@
 }
 
 int sb_compute_dering_list(const AV1_COMMON *const cm, int mi_row, int mi_col,
-                           dering_list *dlist) {
+                           dering_list *dlist, int filter_skip) {
   int r, c;
   int maxc, maxr;
   MODE_INFO **grid;
@@ -75,22 +75,33 @@
   const int c_step = mi_size_wide[BLOCK_8X8];
   const int r_shift = (r_step == 2);
   const int c_shift = (c_step == 2);
-  int all_skip = 1;
 
   assert(r_step == 1 || r_step == 2);
   assert(c_step == 1 || c_step == 2);
 
-  for (r = 0; r < maxr; r += r_step) {
-    for (c = 0; c < maxc; c += c_step) {
-      dlist[count].by = r >> r_shift;
-      dlist[count].bx = c >> c_shift;
-      dlist[count].skip =
-          is_8x8_block_skip(grid, mi_row + r, mi_col + c, cm->mi_stride);
-      all_skip &= dlist[count].skip;
-      count++;
+  if (filter_skip) {
+    for (r = 0; r < maxr; r += r_step) {
+      for (c = 0; c < maxc; c += c_step) {
+        dlist[count].by = r >> r_shift;
+        dlist[count].bx = c >> c_shift;
+        dlist[count].skip =
+            is_8x8_block_skip(grid, mi_row + r, mi_col + c, cm->mi_stride);
+        count++;
+      }
+    }
+  } else {
+    for (r = 0; r < maxr; r += r_step) {
+      for (c = 0; c < maxc; c += c_step) {
+        if (!is_8x8_block_skip(grid, mi_row + r, mi_col + c, cm->mi_stride)) {
+          dlist[count].by = r >> r_shift;
+          dlist[count].bx = c >> c_shift;
+          dlist[count].skip = 0;
+          count++;
+        }
+      }
     }
   }
-  return all_skip ? 0 : count;
+  return count;
 }
 
 void copy_rect8_8bit_to_16bit_c(uint16_t *dst, int dstride, const uint8_t *src,
@@ -275,7 +286,8 @@
       if ((level == 0 && clpf_strength == 0 && uv_level == 0 &&
            uv_clpf_strength == 0) ||
           (dering_count = sb_compute_dering_list(
-               cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE, dlist)) == 0) {
+               cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE, dlist,
+               get_filter_skip(level) || get_filter_skip(uv_level))) == 0) {
         dering_left = 0;
         continue;
       }
diff --git a/av1/common/cdef.h b/av1/common/cdef.h
index ca7b89c..08c438d 100644
--- a/av1/common/cdef.h
+++ b/av1/common/cdef.h
@@ -41,7 +41,7 @@
 
 int sb_all_skip(const AV1_COMMON *const cm, int mi_row, int mi_col);
 int sb_compute_dering_list(const AV1_COMMON *const cm, int mi_row, int mi_col,
-                           dering_list *dlist);
+                           dering_list *dlist, int filter_skip);
 void av1_cdef_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm, MACROBLOCKD *xd);
 
 void av1_cdef_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
diff --git a/av1/common/od_dering.c b/av1/common/od_dering.c
index 36dfe01..1a55393 100644
--- a/av1/common/od_dering.c
+++ b/av1/common/od_dering.c
@@ -308,6 +308,12 @@
   }
 }
 
+int get_filter_skip(int level) {
+  int filter_skip = level & 1;
+  if (level == 1) filter_skip = 0;
+  return filter_skip;
+}
+
 void od_dering(uint8_t *dst, int dstride, uint16_t *y, uint16_t *in, int xdec,
                int ydec, int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
                int *dirinit, int var[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
@@ -321,11 +327,8 @@
 
   int threshold = (level >> 1) << coeff_shift;
   int dering_damping = 5 + !pli + coeff_shift;
-  int filter_skip = level & 1;
-  if (level == 1) {
-    filter_skip = 0;
-    threshold = 31 << coeff_shift;
-  }
+  int filter_skip = get_filter_skip(level);
+  if (level == 1) threshold = 31 << coeff_shift;
 
   od_filter_dering_direction_func filter_dering_direction[] = {
     od_filter_dering_direction_4x4, od_filter_dering_direction_8x8
diff --git a/av1/common/od_dering.h b/av1/common/od_dering.h
index 912c40d..58003c9 100644
--- a/av1/common/od_dering.h
+++ b/av1/common/od_dering.h
@@ -43,6 +43,8 @@
                                 dering_list *dlist, int dering_count,
                                 int bsize);
 
+int get_filter_skip(int level);
+
 void od_dering(uint8_t *dst, int dstride, uint16_t *y, uint16_t *in, int xdec,
                int ydec, int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
                int *dirinit, int var[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],