Signal CDEF damping in the frame header

Change-Id: I57f232623e647f029b007de8ddb203c47ca3c11c
diff --git a/av1/common/cdef.c b/av1/common/cdef.c
index 4ef52bb..46418ba 100644
--- a/av1/common/cdef.c
+++ b/av1/common/cdef.c
@@ -276,7 +276,8 @@
         uint16_t dst[MAX_SB_SIZE * MAX_SB_SIZE];
         int coffset;
         int rend, cend;
-        int clpf_damping = 3 - (pli != AOM_PLANE_Y) + (cm->base_qindex >> 6);
+        int clpf_damping = cm->cdef_clpf_damping;
+        int dering_damping = cm->cdef_dering_damping;
         int hsize = nhb << mi_wide_l2[pli];
         int vsize = nvb << mi_high_l2[pli];
 
@@ -405,7 +406,8 @@
               xd->plane[pli].dst.stride, dst,
               &src[OD_FILT_VBORDER * OD_FILT_BSTRIDE + OD_FILT_HBORDER],
               xdec[pli], ydec[pli], dir, NULL, var, pli, dlist, dering_count,
-              level, clpf_strength, clpf_damping, coeff_shift, 0, 1);
+              level, clpf_strength, clpf_damping, dering_damping, coeff_shift,
+              0, 1);
         } else {
 #endif
           od_dering(&xd->plane[pli]
@@ -416,7 +418,7 @@
                     &src[OD_FILT_VBORDER * OD_FILT_BSTRIDE + OD_FILT_HBORDER],
                     xdec[pli], ydec[pli], dir, NULL, var, pli, dlist,
                     dering_count, level, clpf_strength, clpf_damping,
-                    coeff_shift, 0, 0);
+                    dering_damping, coeff_shift, 0, 0);
 
 #if CONFIG_HIGHBITDEPTH
         }
diff --git a/av1/common/od_dering.c b/av1/common/od_dering.c
index 1a55393..e9a83fa 100644
--- a/av1/common/od_dering.c
+++ b/av1/common/od_dering.c
@@ -318,22 +318,22 @@
                int ydec, int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
                int *dirinit, int var[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
                int pli, dering_list *dlist, int dering_count, int level,
-               int clpf_strength, int clpf_damping, int coeff_shift,
-               int skip_dering, int hbd) {
+               int clpf_strength, int clpf_damping, int dering_damping,
+               int coeff_shift, int skip_dering, int hbd) {
   int bi;
   int bx;
   int by;
   int bsize, bsizex, bsizey;
 
   int threshold = (level >> 1) << coeff_shift;
-  int dering_damping = 5 + !pli + 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
   };
-  clpf_damping += coeff_shift;
+  clpf_damping += coeff_shift - (pli != AOM_PLANE_Y);
+  dering_damping += coeff_shift - (pli != AOM_PLANE_Y);
   bsize =
       ydec ? (xdec ? BLOCK_4X4 : BLOCK_8X4) : (xdec ? BLOCK_4X8 : BLOCK_8X8);
   bsizex = 3 - xdec;
diff --git a/av1/common/od_dering.h b/av1/common/od_dering.h
index 58003c9..4362001 100644
--- a/av1/common/od_dering.h
+++ b/av1/common/od_dering.h
@@ -49,6 +49,6 @@
                int ydec, int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
                int *dirinit, int var[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS],
                int pli, dering_list *dlist, int dering_count, int level,
-               int clpf_strength, int clpf_damping, int coeff_shift,
-               int skip_dering, int hbd);
+               int clpf_strength, int clpf_damping, int dering_damping,
+               int coeff_shift, int skip_dering, int hbd);
 #endif
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index d598415..6c28678 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -402,6 +402,8 @@
   int mib_size;        // Size of the superblock in units of MI blocks
   int mib_size_log2;   // Log 2 of above.
 #if CONFIG_CDEF
+  int cdef_dering_damping;
+  int cdef_clpf_damping;
   int nb_cdef_strengths;
   int cdef_strengths[CDEF_MAX_STRENGTHS];
   int cdef_uv_strengths[CDEF_MAX_STRENGTHS];
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index d555108..61fc82f 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -2605,6 +2605,8 @@
 #if CONFIG_CDEF
 static void setup_cdef(AV1_COMMON *cm, struct aom_read_bit_buffer *rb) {
   int i;
+  cm->cdef_dering_damping = aom_rb_read_literal(rb, 1) + 5;
+  cm->cdef_clpf_damping = aom_rb_read_literal(rb, 2) + 3;
   cm->cdef_bits = aom_rb_read_literal(rb, 2);
   cm->nb_cdef_strengths = 1 << cm->cdef_bits;
   for (i = 0; i < cm->nb_cdef_strengths; i++) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index cd5c50f..993ac99 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3521,6 +3521,8 @@
 #if CONFIG_CDEF
 static void encode_cdef(const AV1_COMMON *cm, struct aom_write_bit_buffer *wb) {
   int i;
+  aom_wb_write_literal(wb, cm->cdef_dering_damping - 5, 1);
+  aom_wb_write_literal(wb, cm->cdef_clpf_damping - 3, 2);
   aom_wb_write_literal(wb, cm->cdef_bits, 2);
   for (i = 0; i < cm->nb_cdef_strengths; i++) {
     aom_wb_write_literal(wb, cm->cdef_strengths[i], CDEF_STRENGTH_BITS);
diff --git a/av1/encoder/pickcdef.c b/av1/encoder/pickcdef.c
index bca6cdf..bafc554 100644
--- a/av1/encoder/pickcdef.c
+++ b/av1/encoder/pickcdef.c
@@ -295,6 +295,7 @@
   int *selected_strength = aom_malloc(nvsb * nhsb * sizeof(*sb_index));
   uint64_t(*mse[2])[TOTAL_STRENGTHS];
   int clpf_damping = 3 + (cm->base_qindex >> 6);
+  int dering_damping = 6;
   int i;
   int nb_strengths;
   int nb_strength_bits;
@@ -412,7 +413,7 @@
                     tmp_dst, in, xdec[pli], ydec[pli], dir, &dirinit, var, pli,
                     dlist, dering_count, threshold,
                     clpf_strength + (clpf_strength == 3), clpf_damping,
-                    coeff_shift, clpf_strength != 0, 1);
+                    dering_damping, coeff_shift, clpf_strength != 0, 1);
           curr_mse = compute_dering_dist(
               ref_coeff[pli] +
                   (sbr * MAX_MIB_SIZE << mi_high_l2[pli]) * stride[pli] +
@@ -476,6 +477,8 @@
     selected_strength[i] = best_gi;
     cm->mi_grid_visible[sb_index[i]]->mbmi.cdef_strength = best_gi;
   }
+  cm->cdef_dering_damping = dering_damping;
+  cm->cdef_clpf_damping = clpf_damping;
   aom_free(mse[0]);
   aom_free(mse[1]);
   for (pli = 0; pli < nplanes; pli++) {