Reverse order of CLPF and dering

Low latency:
PSNR YCbCr:     -0.15%      0.11%      0.12%
   PSNRHVS:     -0.25%
      SSIM:     -0.26%
    MSSSIM:     -0.26%
 CIEDE2000:     -0.03%

High latency:
PSNR YCbCr:     -0.18%      0.18%      0.07%
   PSNRHVS:     -0.20%
      SSIM:     -0.21%
    MSSSIM:     -0.21%
 CIEDE2000:     -0.03%

Change-Id: Ieb86d9ba353220de6454bdc15cea825944b6385b
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 8bdd15e..5726896 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -684,6 +684,18 @@
       (bsize == BLOCK_8X8 || partition != PARTITION_SPLIT))
     dec_update_partition_context(xd, mi_row, mi_col, subsize, num_8x8_wh);
 
+#if CONFIG_DERING
+  if (bsize == BLOCK_64X64) {
+    if (cm->dering_level != 0 && !sb_all_skip(cm, mi_row, mi_col)) {
+      cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi.dering_gain =
+          aom_read_literal(r, DERING_REFINEMENT_BITS, ACCT_STR);
+    } else {
+      cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi.dering_gain =
+          0;
+    }
+  }
+#endif
+
 #if CONFIG_CLPF
   if (bsize == BLOCK_64X64 && cm->clpf_strength_y &&
       cm->clpf_size != CLPF_NOSIZE) {
@@ -720,18 +732,6 @@
     }
   }
 #endif
-
-#if CONFIG_DERING
-  if (bsize == BLOCK_64X64) {
-    if (cm->dering_level != 0 && !sb_all_skip(cm, mi_row, mi_col)) {
-      cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi.dering_gain =
-          aom_read_literal(r, DERING_REFINEMENT_BITS, ACCT_STR);
-    } else {
-      cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi.dering_gain =
-          0;
-    }
-  }
-#endif
 }
 
 static void setup_token_decoder(const uint8_t *data, const uint8_t *data_end,
@@ -1989,12 +1989,12 @@
     av1_setup_past_independence(cm);
 
   setup_loopfilter(&cm->lf, rb);
-#if CONFIG_CLPF
-  setup_clpf(pbi, rb);
-#endif
 #if CONFIG_DERING
   setup_dering(cm, rb);
 #endif
+#if CONFIG_CLPF
+  setup_clpf(pbi, rb);
+#endif
   setup_quantization(cm, rb);
 #if CONFIG_AOM_HIGHBITDEPTH
   xd->bd = (int)cm->bit_depth;
@@ -2405,6 +2405,12 @@
     *p_data_end = decode_tiles(pbi, data, data_end);
   }
 
+#if CONFIG_DERING
+  if (cm->dering_level && !cm->skip_loop_filter) {
+    av1_dering_frame(&pbi->cur_buf->buf, cm, &pbi->mb, cm->dering_level);
+  }
+#endif  // CONFIG_DERING
+
 #if CONFIG_CLPF
   if (!cm->skip_loop_filter) {
     const YV12_BUFFER_CONFIG *const frame = &pbi->cur_buf->buf;
@@ -2426,11 +2432,6 @@
   }
   if (cm->clpf_blocks) aom_free(cm->clpf_blocks);
 #endif
-#if CONFIG_DERING
-  if (cm->dering_level && !cm->skip_loop_filter) {
-    av1_dering_frame(&pbi->cur_buf->buf, cm, &pbi->mb, cm->dering_level);
-  }
-#endif  // CONFIG_DERING
 
   if (!xd->corrupted) {
     if (cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 2734a5d..0c6e57a 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1195,6 +1195,16 @@
       (bsize == BLOCK_8X8 || partition != PARTITION_SPLIT))
     update_partition_context(xd, mi_row, mi_col, subsize, bsize);
 
+#if CONFIG_DERING
+  if (bsize == BLOCK_64X64 && cm->dering_level != 0 &&
+      !sb_all_skip(cm, mi_row, mi_col)) {
+    aom_write_literal(
+        w,
+        cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi.dering_gain,
+        DERING_REFINEMENT_BITS);
+  }
+#endif
+
 #if CONFIG_CLPF
   if (bsize == BLOCK_64X64 && cm->clpf_blocks && cm->clpf_strength_y &&
       cm->clpf_size != CLPF_NOSIZE) {
@@ -1225,16 +1235,6 @@
       aom_write_literal(w, cm->clpf_blocks[br], 1);
   }
 #endif
-
-#if CONFIG_DERING
-  if (bsize == BLOCK_64X64 && cm->dering_level != 0 &&
-      !sb_all_skip(cm, mi_row, mi_col)) {
-    aom_write_literal(
-        w,
-        cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi.dering_gain,
-        DERING_REFINEMENT_BITS);
-  }
-#endif
 }
 
 static void write_modes(AV1_COMP *cpi, const TileInfo *const tile,
@@ -2111,12 +2111,12 @@
   aom_wb_write_literal(wb, cm->frame_context_idx, FRAME_CONTEXTS_LOG2);
 
   encode_loopfilter(&cm->lf, wb);
-#if CONFIG_CLPF
-  encode_clpf(cm, wb);
-#endif
 #if CONFIG_DERING
   encode_dering(cm->dering_level, wb);
 #endif  // CONFIG_DERING
+#if CONFIG_CLPF
+  encode_clpf(cm, wb);
+#endif
   encode_quantization(cm, wb);
   encode_segmentation(cm, xd, wb);
 #if CONFIG_DELTA_Q
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index b4e22ea..34ca12f 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2619,6 +2619,16 @@
       av1_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
   }
 
+#if CONFIG_DERING
+  if (is_lossless_requested(&cpi->oxcf)) {
+    cm->dering_level = 0;
+  } else {
+    cm->dering_level =
+        av1_dering_search(cm->frame_to_show, cpi->Source, cm, xd);
+    av1_dering_frame(cm->frame_to_show, cm, xd, cm->dering_level);
+  }
+#endif  // CONFIG_DERING
+
 #if CONFIG_CLPF
   cm->clpf_strength_y = cm->clpf_strength_u = cm->clpf_strength_v = 0;
   cm->clpf_size = CLPF_64X64;
@@ -2667,15 +2677,6 @@
     }
   }
 #endif
-#if CONFIG_DERING
-  if (is_lossless_requested(&cpi->oxcf)) {
-    cm->dering_level = 0;
-  } else {
-    cm->dering_level =
-        av1_dering_search(cm->frame_to_show, cpi->Source, cm, xd);
-    av1_dering_frame(cm->frame_to_show, cm, xd, cm->dering_level);
-  }
-#endif  // CONFIG_DERING
 
   aom_extend_frame_inner_borders(cm->frame_to_show);
 }