LPF_SB: cleanup unused functions and code path

Since we've decided to use guess filter levels for lpf_sb, I remove
unused searching functions and coding paths to make codebase clean
and easy to manage.

Change-Id: I3497add59fc1eaf36acdd0acb85e3bcb6486d01d
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index ae45300..962982b 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -1746,11 +1746,6 @@
 #if CONFIG_EXT_INTRA_MOD
   AVERAGE_TILE_CDFS(angle_delta_cdf)
 #endif  // CONFIG_EXT_INTRA_MOD
-#if CONFIG_LPF_SB
-  AVERAGE_TILE_CDFS(lpf_reuse_cdf);
-  AVERAGE_TILE_CDFS(lpf_delta_cdf);
-  AVERAGE_TILE_CDFS(lpf_sign_cdf);
-#endif  // CONFIG_LPF_SB
 #if CONFIG_SPATIAL_SEGMENTATION
   int j;
   for (j = 0; j < SPATIAL_PREDICTION_PROBS; j++) {
@@ -1804,11 +1799,6 @@
   AVERAGE_TILE_CDFS(intra_inter_cdf)
   AVERAGE_TILE_CDFS(motion_mode_cdf)
   AVERAGE_TILE_CDFS(obmc_cdf)
-#if CONFIG_LPF_SB
-  AVERAGE_TILE_CDFS(lpf_reuse_cdf);
-  AVERAGE_TILE_CDFS(lpf_delta_cdf);
-  AVERAGE_TILE_CDFS(lpf_sign_cdf);
-#endif  // CONFIG_LPF_SB
 #if CONFIG_JNT_COMP
   AVERAGE_TILE_CDFS(compound_index_cdf);
 #endif  // CONFIG_JNT_COMP
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 1a2328e..29f2239 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -2816,86 +2816,6 @@
     };
 #endif  // CONFIG_KF_CTX
 
-#if CONFIG_LPF_SB
-#if CONFIG_LOOPFILTER_LEVEL
-static const aom_cdf_prob
-    default_lpf_reuse_cdf[4][LPF_REUSE_CONTEXT][CDF_SIZE(2)] = {
-      { { AOM_CDF2(4259) }, { AOM_CDF2(728) } },
-      { { AOM_CDF2(4259) }, { AOM_CDF2(728) } },
-      { { AOM_CDF2(4259) }, { AOM_CDF2(728) } },
-      { { AOM_CDF2(4259) }, { AOM_CDF2(728) } },
-    };
-
-static const aom_cdf_prob
-    default_lpf_delta_cdf[4][LPF_DELTA_CONTEXT][CDF_SIZE(DELTA_RANGE)] = {
-      { { AOM_CDF8(100, 688, 2128, 4642, 7895, 11851, 17050) },
-        { AOM_CDF8(100, 1291, 4358, 7425, 10654, 13559, 18563) },
-        { AOM_CDF8(100, 1086, 4982, 9134, 13031, 16991, 23123) },
-        { AOM_CDF8(100, 1068, 3395, 7973, 12512, 17967, 22812) },
-        { AOM_CDF8(100, 442, 2809, 7178, 12535, 17450, 22417) },
-        { AOM_CDF8(100, 561, 2246, 6050, 11103, 16592, 21353) },
-        { AOM_CDF8(100, 345, 2399, 5559, 9682, 13992, 20126) },
-        { AOM_CDF8(100, 337, 1540, 3573, 6438, 10196, 16320) } },
-      { { AOM_CDF8(100, 688, 2128, 4642, 7895, 11851, 17050) },
-        { AOM_CDF8(100, 1291, 4358, 7425, 10654, 13559, 18563) },
-        { AOM_CDF8(100, 1086, 4982, 9134, 13031, 16991, 23123) },
-        { AOM_CDF8(100, 1068, 3395, 7973, 12512, 17967, 22812) },
-        { AOM_CDF8(100, 442, 2809, 7178, 12535, 17450, 22417) },
-        { AOM_CDF8(100, 561, 2246, 6050, 11103, 16592, 21353) },
-        { AOM_CDF8(100, 345, 2399, 5559, 9682, 13992, 20126) },
-        { AOM_CDF8(100, 337, 1540, 3573, 6438, 10196, 16320) } },
-      { { AOM_CDF8(100, 688, 2128, 4642, 7895, 11851, 17050) },
-        { AOM_CDF8(100, 1291, 4358, 7425, 10654, 13559, 18563) },
-        { AOM_CDF8(100, 1086, 4982, 9134, 13031, 16991, 23123) },
-        { AOM_CDF8(100, 1068, 3395, 7973, 12512, 17967, 22812) },
-        { AOM_CDF8(100, 442, 2809, 7178, 12535, 17450, 22417) },
-        { AOM_CDF8(100, 561, 2246, 6050, 11103, 16592, 21353) },
-        { AOM_CDF8(100, 345, 2399, 5559, 9682, 13992, 20126) },
-        { AOM_CDF8(100, 337, 1540, 3573, 6438, 10196, 16320) } },
-      { { AOM_CDF8(100, 688, 2128, 4642, 7895, 11851, 17050) },
-        { AOM_CDF8(100, 1291, 4358, 7425, 10654, 13559, 18563) },
-        { AOM_CDF8(100, 1086, 4982, 9134, 13031, 16991, 23123) },
-        { AOM_CDF8(100, 1068, 3395, 7973, 12512, 17967, 22812) },
-        { AOM_CDF8(100, 442, 2809, 7178, 12535, 17450, 22417) },
-        { AOM_CDF8(100, 561, 2246, 6050, 11103, 16592, 21353) },
-        { AOM_CDF8(100, 345, 2399, 5559, 9682, 13992, 20126) },
-        { AOM_CDF8(100, 337, 1540, 3573, 6438, 10196, 16320) } },
-    };
-
-static const aom_cdf_prob
-    default_lpf_sign_cdf[4][LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT][CDF_SIZE(2)] =
-        {
-          { { { AOM_CDF2(100) }, { AOM_CDF2(11932) } },
-            { { AOM_CDF2(14785) }, { AOM_CDF2(8145) } } },
-          { { { AOM_CDF2(100) }, { AOM_CDF2(11932) } },
-            { { AOM_CDF2(14785) }, { AOM_CDF2(8145) } } },
-          { { { AOM_CDF2(100) }, { AOM_CDF2(11932) } },
-            { { AOM_CDF2(14785) }, { AOM_CDF2(8145) } } },
-          { { { AOM_CDF2(100) }, { AOM_CDF2(11932) } },
-            { { AOM_CDF2(14785) }, { AOM_CDF2(8145) } } },
-        };
-#else
-static const aom_cdf_prob default_lpf_reuse_cdf[LPF_REUSE_CONTEXT][CDF_SIZE(
-    2)] = { { AOM_CDF2(4259) }, { AOM_CDF2(728) } };
-
-static const aom_cdf_prob default_lpf_delta_cdf[LPF_DELTA_CONTEXT][CDF_SIZE(
-    DELTA_RANGE)] = { { AOM_CDF8(100, 688, 2128, 4642, 7895, 11851, 17050) },
-                      { AOM_CDF8(100, 1291, 4358, 7425, 10654, 13559, 18563) },
-                      { AOM_CDF8(100, 1086, 4982, 9134, 13031, 16991, 23123) },
-                      { AOM_CDF8(100, 1068, 3395, 7973, 12512, 17967, 22812) },
-                      { AOM_CDF8(100, 442, 2809, 7178, 12535, 17450, 22417) },
-                      { AOM_CDF8(100, 561, 2246, 6050, 11103, 16592, 21353) },
-                      { AOM_CDF8(100, 345, 2399, 5559, 9682, 13992, 20126) },
-                      { AOM_CDF8(100, 337, 1540, 3573, 6438, 10196, 16320) } };
-
-static const aom_cdf_prob
-    default_lpf_sign_cdf[LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT][CDF_SIZE(2)] = {
-      { { AOM_CDF2(100) }, { AOM_CDF2(11932) } },
-      { { AOM_CDF2(14785) }, { AOM_CDF2(8145) } }
-    };
-#endif  // CONFIG_LOOPFILTER_LEVEL
-#endif  // CONFIG_LPF_SB
-
 #if CONFIG_EXT_INTRA_MOD
 static const aom_cdf_prob default_angle_delta_cdf[DIRECTIONAL_MODES][CDF_SIZE(
     2 * MAX_ANGLE_DELTA + 1)] = {
@@ -3011,11 +2931,6 @@
 #if CONFIG_INTRABC
   av1_copy(fc->intrabc_cdf, default_intrabc_cdf);
 #endif
-#if CONFIG_LPF_SB
-  av1_copy(fc->lpf_reuse_cdf, default_lpf_reuse_cdf);
-  av1_copy(fc->lpf_delta_cdf, default_lpf_delta_cdf);
-  av1_copy(fc->lpf_sign_cdf, default_lpf_sign_cdf);
-#endif  // CONFIG_LPF_SB
 }
 
 void av1_adapt_inter_frame_probs(AV1_COMMON *cm) {
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index 9b9f156..9fa9609 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -318,18 +318,6 @@
   aom_cdf_prob cfl_sign_cdf[CDF_SIZE(CFL_JOINT_SIGNS)];
   aom_cdf_prob cfl_alpha_cdf[CFL_ALPHA_CONTEXTS][CDF_SIZE(CFL_ALPHABET_SIZE)];
 #endif
-#if CONFIG_LPF_SB
-#if CONFIG_LOOPFILTER_LEVEL
-  aom_cdf_prob lpf_reuse_cdf[4][LPF_REUSE_CONTEXT][CDF_SIZE(2)];
-  aom_cdf_prob lpf_delta_cdf[4][LPF_DELTA_CONTEXT][CDF_SIZE(DELTA_RANGE)];
-  aom_cdf_prob lpf_sign_cdf[4][LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT]
-                           [CDF_SIZE(2)];
-#else
-  aom_cdf_prob lpf_reuse_cdf[LPF_REUSE_CONTEXT][CDF_SIZE(2)];
-  aom_cdf_prob lpf_delta_cdf[LPF_DELTA_CONTEXT][CDF_SIZE(DELTA_RANGE)];
-  aom_cdf_prob lpf_sign_cdf[LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT][CDF_SIZE(2)];
-#endif
-#endif  // CONFIG_LPF_SB
 } FRAME_CONTEXT;
 
 typedef struct FRAME_COUNTS {
@@ -435,17 +423,6 @@
   unsigned int filter_intra_mode_ctx[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS]
                                     [FILTER_INTRA_MODES];
 #endif  // CONFIG_FILTER_INTRA
-#if CONFIG_LPF_SB
-#if CONFIG_LOOPFILTER_LEVEL
-  unsigned int lpf_reuse[4][LPF_REUSE_CONTEXT][2];
-  unsigned int lpf_delta[4][LPF_DELTA_CONTEXT][DELTA_RANGE];
-  unsigned int lpf_sign[4][LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT][2];
-#else
-  unsigned int lpf_reuse[LPF_REUSE_CONTEXT][2];
-  unsigned int lpf_delta[LPF_DELTA_CONTEXT][DELTA_RANGE];
-  unsigned int lpf_sign[LPF_REUSE_CONTEXT][LPF_SIGN_CONTEXT][2];
-#endif  // CONFIG_LOOPFILTER_LEVEL
-#endif  // CONFIG_LPF_SB
 } FRAME_COUNTS;
 
 #if CONFIG_KF_CTX
diff --git a/av1/common/enums.h b/av1/common/enums.h
index 64b8864..04f4b30 100644
--- a/av1/common/enums.h
+++ b/av1/common/enums.h
@@ -93,21 +93,9 @@
 #endif  // CONFIG_LOOPFILTER_LEVEL
 
 #if CONFIG_LPF_SB
-#define LPF_DELTA_BITS 3
-#define LPF_STEP 2
-#define DELTA_RANGE (1 << LPF_DELTA_BITS)
-#define MAX_LPF_OFFSET (LPF_STEP * ((1 << LPF_DELTA_BITS) - 1))
-
-#define LPF_REUSE_CONTEXT 2
-#define LPF_DELTA_CONTEXT DELTA_RANGE
-#define LPF_SIGN_CONTEXT 2
-
 // Half of maximum loop filter length (15-tap)
 #define FILT_BOUNDARY_OFFSET 0
 #define FILT_BOUNDARY_MI_OFFSET (FILT_BOUNDARY_OFFSET >> MI_SIZE_LOG2)
-
-#define USE_GUESS_LEVEL 1
-#define USE_LOOP_FILTER_SUPERBLOCK 1
 #endif  // CONFIG_LPF_SB
 
 #if CONFIG_JNT_COMP
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index cbb2a68..089fd3d 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -566,9 +566,6 @@
 #if CONFIG_LV_MAP
   LV_MAP_CTX_TABLE coeff_ctx_table;
 #endif
-#if CONFIG_LPF_SB
-  int final_lpf_encode;
-#endif
 #if CONFIG_ADAPT_SCAN
   int use_adapt_scan;
 #endif
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 184b361..84dd492 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -767,135 +767,6 @@
     update_partition_context(xd, mi_row, mi_col, subsize, bsize);
 #endif  // CONFIG_EXT_PARTITION_TYPES
 
-#if CONFIG_LPF_SB
-#if CONFIG_LOOPFILTER_LEVEL
-  if (bsize == cm->sb_size && !USE_GUESS_LEVEL) {
-    int lvl_idx;
-    int filt_lvl[4];
-    if (mi_row == 0 && mi_col == 0) {
-      filt_lvl[0] = aom_read_literal(r, 6, ACCT_STR);
-      filt_lvl[1] = aom_read_literal(r, 6, ACCT_STR);
-      if (filt_lvl[0] || filt_lvl[1]) {
-        filt_lvl[2] = aom_read_literal(r, 6, ACCT_STR);
-        filt_lvl[3] = aom_read_literal(r, 6, ACCT_STR);
-      }
-      for (lvl_idx = 0; lvl_idx < 4; ++lvl_idx) {
-        cm->mi_grid_visible[0]->mbmi.reuse_sb_lvl[lvl_idx] = 0;
-        cm->mi_grid_visible[0]->mbmi.delta[lvl_idx] = 0;
-        cm->mi_grid_visible[0]->mbmi.sign[lvl_idx] = 0;
-      }
-    } else {
-      int prev_mi_row, prev_mi_col;
-      if (mi_col - MAX_MIB_SIZE < 0) {
-        prev_mi_row = mi_row - MAX_MIB_SIZE;
-        prev_mi_col = mi_col;
-      } else {
-        prev_mi_row = mi_row;
-        prev_mi_col = mi_col - MAX_MIB_SIZE;
-      }
-
-      MB_MODE_INFO *curr_mbmi =
-          &cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi;
-      MB_MODE_INFO *prev_mbmi =
-          &cm->mi_grid_visible[prev_mi_row * cm->mi_stride + prev_mi_col]->mbmi;
-      for (lvl_idx = 0; lvl_idx < 4; ++lvl_idx) {
-        const uint8_t prev_lvl = prev_mbmi->filt_lvl[lvl_idx];
-
-        const int reuse_ctx = prev_mbmi->reuse_sb_lvl[lvl_idx];
-        const int reuse_prev_lvl = aom_read_symbol(
-            r, xd->tile_ctx->lpf_reuse_cdf[lvl_idx][reuse_ctx], 2, ACCT_STR);
-        curr_mbmi->reuse_sb_lvl[lvl_idx] = reuse_prev_lvl;
-
-        if (reuse_prev_lvl) {
-          filt_lvl[lvl_idx] = prev_lvl;
-          curr_mbmi->delta[lvl_idx] = 0;
-          curr_mbmi->sign[lvl_idx] = 0;
-        } else {
-          const int delta_ctx = prev_mbmi->delta[lvl_idx];
-          unsigned int delta = aom_read_symbol(
-              r, xd->tile_ctx->lpf_delta_cdf[lvl_idx][delta_ctx], DELTA_RANGE,
-              ACCT_STR);
-          curr_mbmi->delta[lvl_idx] = delta;
-          delta *= LPF_STEP;
-
-          if (delta) {
-            const int sign_ctx = prev_mbmi->sign[lvl_idx];
-            const int sign = aom_read_symbol(
-                r, xd->tile_ctx->lpf_sign_cdf[lvl_idx][reuse_ctx][sign_ctx], 2,
-                ACCT_STR);
-            curr_mbmi->sign[lvl_idx] = sign;
-            filt_lvl[lvl_idx] = sign ? prev_lvl + delta : prev_lvl - delta;
-          } else {
-            filt_lvl[lvl_idx] = prev_lvl;
-            curr_mbmi->sign[lvl_idx] = 0;
-          }
-        }
-      }
-    }
-
-    av1_loop_filter_sb_level_init(cm, mi_row, mi_col, 0, 0, filt_lvl[0]);
-    av1_loop_filter_sb_level_init(cm, mi_row, mi_col, 0, 1, filt_lvl[1]);
-    av1_loop_filter_sb_level_init(cm, mi_row, mi_col, 1, 0, filt_lvl[2]);
-    av1_loop_filter_sb_level_init(cm, mi_row, mi_col, 2, 0, filt_lvl[3]);
-  }
-#else
-  if (bsize == cm->sb_size && !USE_GUESS_LEVEL) {
-    int filt_lvl;
-    if (mi_row == 0 && mi_col == 0) {
-      filt_lvl = aom_read_literal(r, 6, ACCT_STR);
-      cm->mi_grid_visible[0]->mbmi.reuse_sb_lvl = 0;
-      cm->mi_grid_visible[0]->mbmi.delta = 0;
-      cm->mi_grid_visible[0]->mbmi.sign = 0;
-    } else {
-      int prev_mi_row, prev_mi_col;
-      if (mi_col - MAX_MIB_SIZE < 0) {
-        prev_mi_row = mi_row - MAX_MIB_SIZE;
-        prev_mi_col = mi_col;
-      } else {
-        prev_mi_row = mi_row;
-        prev_mi_col = mi_col - MAX_MIB_SIZE;
-      }
-
-      MB_MODE_INFO *curr_mbmi =
-          &cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi;
-      MB_MODE_INFO *prev_mbmi =
-          &cm->mi_grid_visible[prev_mi_row * cm->mi_stride + prev_mi_col]->mbmi;
-      const uint8_t prev_lvl = prev_mbmi->filt_lvl;
-
-      const int reuse_ctx = prev_mbmi->reuse_sb_lvl;
-      const int reuse_prev_lvl = aom_read_symbol(
-          r, xd->tile_ctx->lpf_reuse_cdf[reuse_ctx], 2, ACCT_STR);
-      curr_mbmi->reuse_sb_lvl = reuse_prev_lvl;
-
-      if (reuse_prev_lvl) {
-        filt_lvl = prev_lvl;
-        curr_mbmi->delta = 0;
-        curr_mbmi->sign = 0;
-      } else {
-        const int delta_ctx = prev_mbmi->delta;
-        unsigned int delta = aom_read_symbol(
-            r, xd->tile_ctx->lpf_delta_cdf[delta_ctx], DELTA_RANGE, ACCT_STR);
-        curr_mbmi->delta = delta;
-        delta *= LPF_STEP;
-
-        if (delta) {
-          const int sign_ctx = prev_mbmi->sign;
-          const int sign = aom_read_symbol(
-              r, xd->tile_ctx->lpf_sign_cdf[reuse_ctx][sign_ctx], 2, ACCT_STR);
-          curr_mbmi->sign = sign;
-          filt_lvl = sign ? prev_lvl + delta : prev_lvl - delta;
-        } else {
-          filt_lvl = prev_lvl;
-          curr_mbmi->sign = 0;
-        }
-      }
-    }
-
-    av1_loop_filter_sb_level_init(cm, mi_row, mi_col, filt_lvl);
-  }
-#endif  // CONFIG_LOOPFILTER_LEVEL
-#endif  // CONFIG_LPF_SB
-
 #if CONFIG_LOOP_RESTORATION
   for (int plane = 0; plane < av1_num_planes(cm); ++plane) {
     int rcol0, rcol1, rrow0, rrow1, tile_tl_idx;
@@ -1171,26 +1042,16 @@
 #endif  // CONFIG_INTRABC && !CONFIG_LPF_SB
   struct loopfilter *lf = &cm->lf;
 #if CONFIG_LOOPFILTER_LEVEL
-#if CONFIG_LPF_SB
-  if (USE_GUESS_LEVEL) {
-#endif  // CONFIG_LPF_SB
-    lf->filter_level[0] = aom_rb_read_literal(rb, 6);
-    lf->filter_level[1] = aom_rb_read_literal(rb, 6);
-    if (av1_num_planes(cm) > 1) {
-      if (lf->filter_level[0] || lf->filter_level[1]) {
-        lf->filter_level_u = aom_rb_read_literal(rb, 6);
-        lf->filter_level_v = aom_rb_read_literal(rb, 6);
-      }
+  lf->filter_level[0] = aom_rb_read_literal(rb, 6);
+  lf->filter_level[1] = aom_rb_read_literal(rb, 6);
+  if (av1_num_planes(cm) > 1) {
+    if (lf->filter_level[0] || lf->filter_level[1]) {
+      lf->filter_level_u = aom_rb_read_literal(rb, 6);
+      lf->filter_level_v = aom_rb_read_literal(rb, 6);
     }
-#if CONFIG_LPF_SB
   }
-#endif  // CONFIG_LPF_SB
-#else
-#if CONFIG_LPF_SB
-  if (USE_GUESS_LEVEL) lf->filter_level = aom_rb_read_literal(rb, 6);
 #else
   lf->filter_level = aom_rb_read_literal(rb, 6);
-#endif  // CONFIG_LPF_SB
 #endif
   lf->sharpness_level = aom_rb_read_literal(rb, 3);
 
@@ -2280,23 +2141,19 @@
           decode_partition(pbi, &td->xd, mi_row, mi_col, &td->bit_reader,
                            cm->sb_size);
 #if CONFIG_LPF_SB
-          if (USE_LOOP_FILTER_SUPERBLOCK) {
+          if (cm->allow_screen_content_tools) {
 #if CONFIG_LOOPFILTER_LEVEL
-            if (USE_GUESS_LEVEL) {
-              if (cm->lf.filter_level[0] || cm->lf.filter_level[1]) {
-                av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
-                                      cm->lf.filter_level[0],
-                                      cm->lf.filter_level[1], 0, 1, mi_row,
-                                      mi_col);
-                av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
-                                      cm->lf.filter_level_u,
-                                      cm->lf.filter_level_u, 1, 1, mi_row,
-                                      mi_col);
-                av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
-                                      cm->lf.filter_level_v,
-                                      cm->lf.filter_level_v, 2, 1, mi_row,
-                                      mi_col);
-              }
+            if (cm->lf.filter_level[0] || cm->lf.filter_level[1]) {
+              av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
+                                    cm->lf.filter_level[0],
+                                    cm->lf.filter_level[1], 0, 1, mi_row,
+                                    mi_col);
+              av1_loop_filter_frame(
+                  get_frame_new_buffer(cm), cm, &pbi->mb, cm->lf.filter_level_u,
+                  cm->lf.filter_level_u, 1, 1, mi_row, mi_col);
+              av1_loop_filter_frame(
+                  get_frame_new_buffer(cm), cm, &pbi->mb, cm->lf.filter_level_v,
+                  cm->lf.filter_level_v, 2, 1, mi_row, mi_col);
             }
 #else
             // apply deblocking filtering right after each superblock is decoded
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index a39165d..f98ce30 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2269,118 +2269,6 @@
     update_partition_context(xd, mi_row, mi_col, subsize, bsize);
 #endif  // CONFIG_EXT_PARTITION_TYPES
 
-#if CONFIG_LPF_SB
-  // send filter level for each superblock (64x64)
-  if (bsize == cm->sb_size && !USE_GUESS_LEVEL) {
-    int lvl_idx;
-    if (mi_row == 0 && mi_col == 0) {
-#if CONFIG_LOOPFILTER_LEVEL
-      aom_write_literal(w, cm->mi[0].mbmi.filt_lvl[0], 6);
-      aom_write_literal(w, cm->mi[0].mbmi.filt_lvl[1], 6);
-      if (cm->mi[0].mbmi.filt_lvl[0] || cm->mi[0].mbmi.filt_lvl[1]) {
-        aom_write_literal(w, cm->mi[0].mbmi.filt_lvl[2], 6);
-        aom_write_literal(w, cm->mi[0].mbmi.filt_lvl[3], 6);
-      }
-      for (lvl_idx = 0; lvl_idx < 4; ++lvl_idx) {
-        cm->mi_grid_visible[0]->mbmi.reuse_sb_lvl[lvl_idx] = 0;
-        cm->mi_grid_visible[0]->mbmi.delta[lvl_idx] = 0;
-        cm->mi_grid_visible[0]->mbmi.sign[lvl_idx] = 0;
-      }
-#else
-      aom_write_literal(w, cm->mi[0].mbmi.filt_lvl, 6);
-      cm->mi_grid_visible[0]->mbmi.reuse_sb_lvl = 0;
-      cm->mi_grid_visible[0]->mbmi.delta = 0;
-      cm->mi_grid_visible[0]->mbmi.sign = 0;
-#endif
-    } else {
-      int prev_mi_row, prev_mi_col;
-      if (mi_col - MAX_MIB_SIZE < 0) {
-        prev_mi_row = mi_row - MAX_MIB_SIZE;
-        prev_mi_col = mi_col;
-      } else {
-        prev_mi_row = mi_row;
-        prev_mi_col = mi_col - MAX_MIB_SIZE;
-      }
-      MB_MODE_INFO *curr_mbmi =
-          &cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]->mbmi;
-      MB_MODE_INFO *prev_mbmi =
-          &cm->mi_grid_visible[prev_mi_row * cm->mi_stride + prev_mi_col]->mbmi;
-
-#if CONFIG_LOOPFILTER_LEVEL
-      for (lvl_idx = 0; lvl_idx < 4; ++lvl_idx) {
-        const uint8_t curr_lvl = curr_mbmi->filt_lvl[lvl_idx];
-        const uint8_t prev_lvl = prev_mbmi->filt_lvl[lvl_idx];
-
-        const int reuse_prev_lvl = curr_lvl == prev_lvl;
-        const int reuse_ctx = prev_mbmi->reuse_sb_lvl[lvl_idx];
-        curr_mbmi->reuse_sb_lvl[lvl_idx] = reuse_prev_lvl;
-        aom_write_symbol(w, reuse_prev_lvl,
-                         xd->tile_ctx->lpf_reuse_cdf[lvl_idx][reuse_ctx], 2);
-        cpi->td.counts->lpf_reuse[lvl_idx][reuse_ctx][reuse_prev_lvl]++;
-
-        if (reuse_prev_lvl) {
-          curr_mbmi->delta[lvl_idx] = 0;
-          curr_mbmi->sign[lvl_idx] = 0;
-        } else {
-          const unsigned int delta = abs(curr_lvl - prev_lvl) / LPF_STEP;
-          const int delta_ctx = prev_mbmi->delta[lvl_idx];
-          curr_mbmi->delta[lvl_idx] = delta;
-          aom_write_symbol(w, delta,
-                           xd->tile_ctx->lpf_delta_cdf[lvl_idx][delta_ctx],
-                           DELTA_RANGE);
-          cpi->td.counts->lpf_delta[lvl_idx][delta_ctx][delta]++;
-
-          if (delta) {
-            const int sign = curr_lvl > prev_lvl;
-            const int sign_ctx = prev_mbmi->sign[lvl_idx];
-            curr_mbmi->sign[lvl_idx] = sign;
-            aom_write_symbol(
-                w, sign,
-                xd->tile_ctx->lpf_sign_cdf[lvl_idx][reuse_ctx][sign_ctx], 2);
-            cpi->td.counts->lpf_sign[lvl_idx][reuse_ctx][sign_ctx][sign]++;
-          } else {
-            curr_mbmi->sign[lvl_idx] = 0;
-          }
-        }
-      }
-#else
-      const uint8_t curr_lvl = curr_mbmi->filt_lvl;
-      const uint8_t prev_lvl = prev_mbmi->filt_lvl;
-
-      const int reuse_prev_lvl = curr_lvl == prev_lvl;
-      const int reuse_ctx = prev_mbmi->reuse_sb_lvl;
-      curr_mbmi->reuse_sb_lvl = reuse_prev_lvl;
-      aom_write_symbol(w, reuse_prev_lvl,
-                       xd->tile_ctx->lpf_reuse_cdf[reuse_ctx], 2);
-      cpi->td.counts->lpf_reuse[reuse_ctx][reuse_prev_lvl]++;
-
-      if (reuse_prev_lvl) {
-        curr_mbmi->delta = 0;
-        curr_mbmi->sign = 0;
-      } else {
-        const unsigned int delta = abs(curr_lvl - prev_lvl) / LPF_STEP;
-        const int delta_ctx = prev_mbmi->delta;
-        curr_mbmi->delta = delta;
-        aom_write_symbol(w, delta, xd->tile_ctx->lpf_delta_cdf[delta_ctx],
-                         DELTA_RANGE);
-        cpi->td.counts->lpf_delta[delta_ctx][delta]++;
-
-        if (delta) {
-          const int sign = curr_lvl > prev_lvl;
-          const int sign_ctx = prev_mbmi->sign;
-          curr_mbmi->sign = sign;
-          aom_write_symbol(w, sign,
-                           xd->tile_ctx->lpf_sign_cdf[reuse_ctx][sign_ctx], 2);
-          cpi->td.counts->lpf_sign[reuse_ctx][sign_ctx][sign]++;
-        } else {
-          curr_mbmi->sign = 0;
-        }
-      }
-#endif  // CONFIG_LOOPFILTER_LEVEL
-    }
-  }
-#endif
-
 #if CONFIG_LOOP_RESTORATION
   for (int plane = 0; plane < av1_num_planes(cm); ++plane) {
     int rcol0, rcol1, rrow0, rrow1, tile_tl_idx;
@@ -2614,26 +2502,16 @@
 
 // Encode the loop filter level and type
 #if CONFIG_LOOPFILTER_LEVEL
-#if CONFIG_LPF_SB
-  if (USE_GUESS_LEVEL) {
-#endif  // CONFIG_LPF_SB
-    aom_wb_write_literal(wb, lf->filter_level[0], 6);
-    aom_wb_write_literal(wb, lf->filter_level[1], 6);
-    if (av1_num_planes(cm) > 1) {
-      if (lf->filter_level[0] || lf->filter_level[1]) {
-        aom_wb_write_literal(wb, lf->filter_level_u, 6);
-        aom_wb_write_literal(wb, lf->filter_level_v, 6);
-      }
+  aom_wb_write_literal(wb, lf->filter_level[0], 6);
+  aom_wb_write_literal(wb, lf->filter_level[1], 6);
+  if (av1_num_planes(cm) > 1) {
+    if (lf->filter_level[0] || lf->filter_level[1]) {
+      aom_wb_write_literal(wb, lf->filter_level_u, 6);
+      aom_wb_write_literal(wb, lf->filter_level_v, 6);
     }
-#if CONFIG_LPF_SB
   }
-#endif  // CONFIG_LPF_SB
-#else
-#if CONFIG_LPF_SB
-  if (USE_GUESS_LEVEL) aom_wb_write_literal(wb, lf->filter_level, 6);
 #else
   aom_wb_write_literal(wb, lf->filter_level, 6);
-#endif  // CONFIG_LPF_SB
 #endif  // CONFIG_LOOPFILTER_LEVEL
   aom_wb_write_literal(wb, lf->sharpness_level, 3);
 
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index bac57e7..ed8b7d8 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -3223,46 +3223,28 @@
                         &dummy_rdc, INT64_MAX, pc_root, NULL);
     }
 #if CONFIG_LPF_SB
-    if (USE_LOOP_FILTER_SUPERBLOCK) {
+    // TODO(chengchen): change to allow intraBC. It requires to store the
+    // unfiltered frame to a buffer and process later.
+    if (cm->allow_screen_content_tools) {
 #if CONFIG_LOOPFILTER_LEVEL
       int filter_lvl[4];
 
-      if (USE_GUESS_LEVEL) {
-        struct loopfilter *lf = &cpi->common.lf;
-        filter_lvl[0] = lf->filter_level[0];
-        filter_lvl[1] = lf->filter_level[1];
-        filter_lvl[2] = lf->filter_level_u;
-        filter_lvl[3] = lf->filter_level_v;
-        av1_loop_filter_frame(cm->frame_to_show, cm, xd, filter_lvl[0],
-                              filter_lvl[1], 0, 1, mi_row, mi_col);
-        av1_loop_filter_frame(cm->frame_to_show, cm, xd, filter_lvl[2],
-                              filter_lvl[2], 1, 1, mi_row, mi_col);
-        av1_loop_filter_frame(cm->frame_to_show, cm, xd, filter_lvl[3],
-                              filter_lvl[3], 2, 1, mi_row, mi_col);
-      }
+      struct loopfilter *lf = &cpi->common.lf;
+      filter_lvl[0] = lf->filter_level[0];
+      filter_lvl[1] = lf->filter_level[1];
+      filter_lvl[2] = lf->filter_level_u;
+      filter_lvl[3] = lf->filter_level_v;
+      av1_loop_filter_frame(cm->frame_to_show, cm, xd, filter_lvl[0],
+                            filter_lvl[1], 0, 1, mi_row, mi_col);
+      av1_loop_filter_frame(cm->frame_to_show, cm, xd, filter_lvl[2],
+                            filter_lvl[2], 1, 1, mi_row, mi_col);
+      av1_loop_filter_frame(cm->frame_to_show, cm, xd, filter_lvl[3],
+                            filter_lvl[3], 2, 1, mi_row, mi_col);
 #else
       int filter_lvl;
 
-      if (USE_GUESS_LEVEL) {
-        struct loopfilter *lf = &cpi->common.lf;
-        filter_lvl = lf->filter_level;
-      } else {
-        // apply deblocking filtering right after each superblock is encoded.
-        int last_lvl;
-        if (mi_row == 0 && mi_col == 0) {
-          last_lvl = 0;
-        } else {
-          if (mi_col == 0) {
-            last_lvl =
-                cm->mi[(mi_row - MAX_MIB_SIZE) * cm->mi_stride].mbmi.filt_lvl;
-          } else {
-            last_lvl = cm->mi[mi_row * cm->mi_stride + mi_col - MAX_MIB_SIZE]
-                           .mbmi.filt_lvl;
-          }
-        }
-        filter_lvl = av1_search_filter_level(cpi->source, cpi, 1, NULL, mi_row,
-                                             mi_col, last_lvl);
-      }
+      struct loopfilter *lf = &cpi->common.lf;
+      filter_lvl = lf->filter_level;
       av1_loop_filter_frame(get_frame_new_buffer(cm), cm, xd, filter_lvl, 0, 1,
                             mi_row, mi_col);
       // if filter_lvl is 0, we still need to set mi info
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 61b6bc1..86d7093 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4617,7 +4617,7 @@
 #endif  // CONFIG_EXT_TILE
       ) {
 #if CONFIG_LPF_SB
-    if (!USE_LOOP_FILTER_SUPERBLOCK) no_loopfilter = 1;
+    if (!cm->allow_screen_content_tools) no_loopfilter = 1;
 #else
     no_loopfilter = 1;
 #endif  // CONFIG_LPF_SB
diff --git a/av1/encoder/picklpf.c b/av1/encoder/picklpf.c
index 12f07de..557f2ce 100644
--- a/av1/encoder/picklpf.c
+++ b/av1/encoder/picklpf.c
@@ -27,73 +27,6 @@
 #include "av1/encoder/encoder.h"
 #include "av1/encoder/picklpf.h"
 
-#if CONFIG_LPF_SB && !CONFIG_LOOPFILTER_LEVEL
-#if CONFIG_HIGHBITDEPTH
-static int compute_sb_y_sse_highbd(const YV12_BUFFER_CONFIG *src,
-                                   const YV12_BUFFER_CONFIG *frame,
-                                   AV1_COMMON *const cm, int mi_row,
-                                   int mi_col) {
-  int sse = 0;
-  const int mi_row_start = AOMMAX(0, mi_row - FILT_BOUNDARY_MI_OFFSET);
-  const int mi_col_start = AOMMAX(0, mi_col - FILT_BOUNDARY_MI_OFFSET);
-  const int mi_row_range = mi_row - FILT_BOUNDARY_MI_OFFSET + MAX_MIB_SIZE;
-  const int mi_col_range = mi_col - FILT_BOUNDARY_MI_OFFSET + MAX_MIB_SIZE;
-  const int mi_row_end = AOMMIN(mi_row_range, cm->mi_rows);
-  const int mi_col_end = AOMMIN(mi_col_range, cm->mi_cols);
-
-  const int row = mi_row_start * MI_SIZE;
-  const int col = mi_col_start * MI_SIZE;
-  const uint16_t *src_y =
-      CONVERT_TO_SHORTPTR(src->y_buffer) + row * src->y_stride + col;
-  const uint16_t *frame_y =
-      CONVERT_TO_SHORTPTR(frame->y_buffer) + row * frame->y_stride + col;
-  const int row_end = (mi_row_end - mi_row_start) * MI_SIZE;
-  const int col_end = (mi_col_end - mi_col_start) * MI_SIZE;
-
-  int x, y;
-  for (y = 0; y < row_end; ++y) {
-    for (x = 0; x < col_end; ++x) {
-      const int diff = src_y[x] - frame_y[x];
-      sse += diff * diff;
-    }
-    src_y += src->y_stride;
-    frame_y += frame->y_stride;
-  }
-  return sse;
-}
-#endif
-
-static int compute_sb_y_sse(const YV12_BUFFER_CONFIG *src,
-                            const YV12_BUFFER_CONFIG *frame,
-                            AV1_COMMON *const cm, int mi_row, int mi_col) {
-  int sse = 0;
-  const int mi_row_start = AOMMAX(0, mi_row - FILT_BOUNDARY_MI_OFFSET);
-  const int mi_col_start = AOMMAX(0, mi_col - FILT_BOUNDARY_MI_OFFSET);
-  const int mi_row_range = mi_row - FILT_BOUNDARY_MI_OFFSET + MAX_MIB_SIZE;
-  const int mi_col_range = mi_col - FILT_BOUNDARY_MI_OFFSET + MAX_MIB_SIZE;
-  const int mi_row_end = AOMMIN(mi_row_range, cm->mi_rows);
-  const int mi_col_end = AOMMIN(mi_col_range, cm->mi_cols);
-
-  const int row = mi_row_start * MI_SIZE;
-  const int col = mi_col_start * MI_SIZE;
-  const uint8_t *src_y = src->y_buffer + row * src->y_stride + col;
-  const uint8_t *frame_y = frame->y_buffer + row * frame->y_stride + col;
-  const int row_end = (mi_row_end - mi_row_start) * MI_SIZE;
-  const int col_end = (mi_col_end - mi_col_start) * MI_SIZE;
-
-  int x, y;
-  for (y = 0; y < row_end; ++y) {
-    for (x = 0; x < col_end; ++x) {
-      const int diff = src_y[x] - frame_y[x];
-      sse += diff * diff;
-    }
-    src_y += src->y_stride;
-    frame_y += frame->y_stride;
-  }
-  return sse;
-}
-#endif  // CONFIG_LPF_SB
-
 #if !CONFIG_LPF_SB
 static void yv12_copy_plane(const YV12_BUFFER_CONFIG *src_bc,
                             YV12_BUFFER_CONFIG *dst_bc, int plane) {
@@ -115,122 +48,7 @@
   }
 }
 
-#if CONFIG_LPF_SB && !CONFIG_LOOPFILTER_LEVEL
-// TODO(chengchen): reduce memory usage by copy superblock instead of frame
-static int try_filter_superblock(const YV12_BUFFER_CONFIG *sd,
-                                 AV1_COMP *const cpi, int filt_level,
-                                 int partial_frame, int mi_row, int mi_col) {
-  AV1_COMMON *const cm = &cpi->common;
-  int filt_err;
-
-  av1_loop_filter_frame(cm->frame_to_show, cm, &cpi->td.mb.e_mbd, filt_level, 1,
-                        partial_frame, mi_row, mi_col);
-
-#if CONFIG_HIGHBITDEPTH
-  if (cm->use_highbitdepth) {
-    filt_err =
-        compute_sb_y_sse_highbd(sd, cm->frame_to_show, cm, mi_row, mi_col);
-  } else {
-    filt_err = compute_sb_y_sse(sd, cm->frame_to_show, cm, mi_row, mi_col);
-  }
-#else
-  filt_err = compute_sb_y_sse(sd, cm->frame_to_show, cm, mi_row, mi_col);
-#endif  // CONFIG_HIGHBITDEPTH
-
-  // TODO(chengchen): Copy the superblock only
-  // Re-instate the unfiltered frame
-  aom_yv12_copy_y(&cpi->last_frame_uf, cm->frame_to_show);
-
-  return filt_err;
-}
-
-int av1_search_filter_level(const YV12_BUFFER_CONFIG *sd, AV1_COMP *cpi,
-                            int partial_frame, double *best_cost_ret,
-                            int mi_row, int mi_col, int last_lvl) {
-  assert(partial_frame == 1);
-  assert(last_lvl >= 0);
-
-  const AV1_COMMON *const cm = &cpi->common;
-  MACROBLOCK *x = &cpi->td.mb;
-
-  int min_filter_level = AOMMAX(0, last_lvl - MAX_LPF_OFFSET);
-  int max_filter_level =
-      AOMMIN(av1_get_max_filter_level(cpi), last_lvl + MAX_LPF_OFFSET);
-
-  // search a larger range for the start superblock
-  if (mi_row == 0 && mi_col == 0) {
-    min_filter_level = 0;
-    max_filter_level = av1_get_max_filter_level(cpi);
-  }
-
-  // TODO(chengchen): Copy for superblock only
-  // Make a copy of the unfiltered / processed recon buffer
-  aom_yv12_copy_y(cm->frame_to_show, &cpi->last_frame_uf);
-
-  int estimate_err =
-      try_filter_superblock(sd, cpi, last_lvl, partial_frame, mi_row, mi_col);
-
-  int best_err = estimate_err;
-  int filt_best = last_lvl;
-
-  int i;
-  for (i = min_filter_level; i <= max_filter_level; i += LPF_STEP) {
-    if (i == last_lvl) continue;
-
-    int filt_err =
-        try_filter_superblock(sd, cpi, i, partial_frame, mi_row, mi_col);
-
-    if (filt_err < best_err) {
-      best_err = filt_err;
-      filt_best = i;
-    }
-  }
-
-  // If previous sb filter level has similar filtering performance as current
-  // best filter level, use previous level such that we can only send one bit
-  // to indicate current filter level is the same as the previous.
-  int threshold = 400;
-
-  // ratio = the filtering area / a superblock size
-  int ratio = 1;
-  if (mi_row + MAX_MIB_SIZE > cm->mi_rows) {
-    ratio *= (cm->mi_rows - mi_row);
-  } else {
-    if (mi_row == 0) {
-      ratio *= (MAX_MIB_SIZE - FILT_BOUNDARY_MI_OFFSET);
-    } else {
-      ratio *= MAX_MIB_SIZE;
-    }
-  }
-  if (mi_col + MAX_MIB_SIZE > cm->mi_cols) {
-    ratio *= (cm->mi_cols - mi_col);
-  } else {
-    if (mi_col == 0) {
-      ratio *= (MAX_MIB_SIZE - FILT_BOUNDARY_MI_OFFSET);
-    } else {
-      ratio *= MAX_MIB_SIZE;
-    }
-  }
-  threshold = threshold * ratio / (MAX_MIB_SIZE * MAX_MIB_SIZE);
-
-  const int diff = abs(estimate_err - best_err);
-
-  const int percent_thresh = (int)((double)estimate_err * 0.01);
-  threshold = AOMMAX(threshold, percent_thresh);
-  if (diff < threshold) {
-    best_err = estimate_err;
-    filt_best = last_lvl;
-  }
-
-  // Compute rdcost to determine whether to reuse previous filter lvl
-  if (filt_best != last_lvl) {
-  }
-
-  if (best_cost_ret) *best_cost_ret = RDCOST_DBL(x->rdmult, 0, best_err);
-  return filt_best;
-}
-
-#elif !CONFIG_LPF_SB  // CONFIG_LPF_SB
+#if !CONFIG_LPF_SB  // CONFIG_LPF_SB
 static int64_t try_filter_frame(const YV12_BUFFER_CONFIG *sd,
                                 AV1_COMP *const cpi, int filt_level,
                                 int partial_frame
@@ -460,36 +278,7 @@
     lf->filter_level = clamp(filt_guess, min_filter_level, max_filter_level);
 #endif
   } else {
-#if CONFIG_LPF_SB && !CONFIG_LOOPFILTER_LEVEL
-    int mi_row, mi_col;
-    // TODO(chengchen): init last_lvl using previous frame's info?
-    int last_lvl = 0;
-    // TODO(chengchen): if the frame size makes the last superblock very small,
-    // consider merge it to the previous superblock to save bits.
-    // Example, if frame size 1080x720, then in the last row of superblock,
-    // there're (FILT_BOUNDAR_OFFSET + 16) pixels.
-    for (mi_row = 0; mi_row < cm->mi_rows; mi_row += MAX_MIB_SIZE) {
-      for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MAX_MIB_SIZE) {
-#if CONFIG_LPF_SB
-        int lvl =
-            av1_search_filter_level(sd, cpi, 1, NULL, mi_row, mi_col, last_lvl);
-#else
-        int lvl =
-            search_filter_level(sd, cpi, 1, NULL, mi_row, mi_col, last_lvl);
-#endif
-
-        av1_loop_filter_sb_level_init(cm, mi_row, mi_col, lvl);
-
-        // For the superblock at row start, its previous filter level should be
-        // the one above it, not the one at the end of last row
-        if (mi_col + MAX_MIB_SIZE >= cm->mi_cols) {
-          last_lvl = cm->mi_grid_visible[mi_row * cm->mi_stride]->mbmi.filt_lvl;
-        } else {
-          last_lvl = lvl;
-        }
-      }
-    }
-#elif !CONFIG_LPF_SB  // !CONFIG_LPF_SB
+#if !CONFIG_LPF_SB  // !CONFIG_LPF_SB
 #if CONFIG_LOOPFILTER_LEVEL
     lf->filter_level[0] = lf->filter_level[1] = search_filter_level(
         sd, cpi, method == LPF_PICK_FROM_SUBIMAGE, NULL, 0, 2);