Disable in-loop filters for frames with intrabc enabled
Change-Id: Ia47101de22091a60d7931890f00a4a3a527f5bd4
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 013172f..0cfbece 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -405,6 +405,8 @@
} MODE_INFO;
#if CONFIG_INTRABC
+#define NO_FILTER_FOR_IBC 1 // Disable in-loop filters for frame with intrabc
+
static INLINE int is_intrabc_block(const MB_MODE_INFO *mbmi) {
return mbmi->use_intrabc;
}
diff --git a/av1/common/restoration.c b/av1/common/restoration.c
index 921e6c2..7f15a82 100644
--- a/av1/common/restoration.c
+++ b/av1/common/restoration.c
@@ -1683,6 +1683,7 @@
assert(rcol0 && rcol1 && rrow0 && rrow1);
if (bsize != cm->sb_size) return 0;
+ if (cm->rst_info[plane].frame_restoration_type == RESTORE_NONE) return 0;
const int is_uv = plane > 0;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index ecc0baf..e8734c1 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -1142,6 +1142,9 @@
#if CONFIG_LOOP_RESTORATION
static void decode_restoration_mode(AV1_COMMON *cm,
struct aom_read_bit_buffer *rb) {
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) return;
+#endif // CONFIG_INTRABC
for (int p = 0; p < MAX_MB_PLANE; ++p) {
RestorationInfo *rsi = &cm->rst_info[p];
if (aom_rb_read_bit(rb)) {
@@ -1309,6 +1312,9 @@
#endif // CONFIG_LOOP_RESTORATION
static void setup_loopfilter(AV1_COMMON *cm, struct aom_read_bit_buffer *rb) {
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) return;
+#endif // CONFIG_INTRABC
struct loopfilter *lf = &cm->lf;
#if !CONFIG_LPF_SB
#if CONFIG_LOOPFILTER_LEVEL
@@ -1347,6 +1353,9 @@
#if CONFIG_CDEF
static void setup_cdef(AV1_COMMON *cm, struct aom_read_bit_buffer *rb) {
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) return;
+#endif // CONFIG_INTRABC
int i;
#if CONFIG_CDEF_SINGLEPASS
cm->cdef_pri_damping = cm->cdef_sec_damping = aom_rb_read_literal(rb, 2) + 3;
@@ -2423,34 +2432,35 @@
}
#if CONFIG_INTRABC
-// When intraBC is on, do loop filtering per superblock,
-// instead of do it after the whole frame has been encoded,
-// as is in the else branch
-#else
+ if (!(cm->allow_intrabc && NO_FILTER_FOR_IBC))
+#endif // CONFIG_INTRABC
+ {
// Loopfilter the whole frame.
#if CONFIG_LPF_SB
- av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
- cm->lf.filter_level, 0, 0, 0, 0);
+ av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
+ cm->lf.filter_level, 0, 0, 0, 0);
#else
#if CONFIG_OBU
- if (endTile == cm->tile_rows * cm->tile_cols - 1)
+ if (endTile == cm->tile_rows * cm->tile_cols - 1)
#endif
#if CONFIG_LOOPFILTER_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,
- 0);
- av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
- cm->lf.filter_level_u, cm->lf.filter_level_u, 1, 0);
- av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
- cm->lf.filter_level_v, cm->lf.filter_level_v, 2, 0);
- }
+ 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,
+ 0);
+ av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
+ cm->lf.filter_level_u, cm->lf.filter_level_u, 1,
+ 0);
+ av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
+ cm->lf.filter_level_v, cm->lf.filter_level_v, 2,
+ 0);
+ }
#else
- av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
- cm->lf.filter_level, 0, 0);
+ av1_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
+ cm->lf.filter_level, 0, 0);
#endif // CONFIG_LOOPFILTER_LEVEL
#endif // CONFIG_LPF_SB
-#endif // CONFIG_INTRABC
+ }
if (cm->frame_parallel_decode)
av1_frameworker_broadcast(pbi->cur_buf, INT_MAX);
@@ -3182,6 +3192,29 @@
if (frame_is_intra_only(cm) || cm->error_resilient_mode)
av1_setup_past_independence(cm);
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) {
+ // Set parameters corresponding to no filtering.
+ struct loopfilter *lf = &cm->lf;
+#if CONFIG_LOOPFILTER_LEVEL
+ lf->filter_level[0] = 0;
+ lf->filter_level[1] = 0;
+#else
+ lf->filter_level = 0;
+#endif
+#if CONFIG_CDEF
+ cm->cdef_bits = 0;
+ cm->cdef_strengths[0] = 0;
+ cm->nb_cdef_strengths = 1;
+#endif // CONFIG_CDEF
+#if CONFIG_LOOP_RESTORATION
+ cm->rst_info[0].frame_restoration_type = RESTORE_NONE;
+ cm->rst_info[1].frame_restoration_type = RESTORE_NONE;
+ cm->rst_info[2].frame_restoration_type = RESTORE_NONE;
+#endif // CONFIG_LOOP_RESTORATION
+ }
+#endif // CONFIG_INTRABC
+
setup_loopfilter(cm, rb);
setup_quantization(cm, rb);
xd->bd = (int)cm->bit_depth;
@@ -3810,7 +3843,11 @@
#endif
#if CONFIG_CDEF
- if (!cm->skip_loop_filter && !cm->all_lossless) {
+ if (!cm->skip_loop_filter &&
+#if CONFIG_INTRABC
+ !(cm->allow_intrabc && NO_FILTER_FOR_IBC) &&
+#endif // CONFIG_INTRABC
+ !cm->all_lossless) {
av1_cdef_frame(&pbi->cur_buf->buf, cm, &pbi->mb);
}
#endif // CONFIG_CDEF
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 0798cfb..8d8a664 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2532,6 +2532,9 @@
#if CONFIG_LOOP_RESTORATION
static void encode_restoration_mode(AV1_COMMON *cm,
struct aom_write_bit_buffer *wb) {
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) return;
+#endif // CONFIG_INTRABC
for (int p = 0; p < MAX_MB_PLANE; ++p) {
RestorationInfo *rsi = &cm->rst_info[p];
switch (rsi->frame_restoration_type) {
@@ -2693,6 +2696,9 @@
#endif // CONFIG_LOOP_RESTORATION
static void encode_loopfilter(AV1_COMMON *cm, struct aom_write_bit_buffer *wb) {
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) return;
+#endif // CONFIG_INTRABC
int i;
struct loopfilter *lf = &cm->lf;
@@ -2743,6 +2749,9 @@
#if CONFIG_CDEF
static void encode_cdef(const AV1_COMMON *cm, struct aom_write_bit_buffer *wb) {
+#if CONFIG_INTRABC
+ if (cm->allow_intrabc && NO_FILTER_FOR_IBC) return;
+#endif // CONFIG_INTRABC
int i;
#if CONFIG_CDEF_SINGLEPASS
aom_wb_write_literal(wb, cm->cdef_pri_damping - 3, 2);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 7a33add..807b706 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4616,9 +4616,12 @@
#if CONFIG_LOOP_RESTORATION
int no_restoration = 0;
if (is_lossless_requested(&cpi->oxcf)
+#if CONFIG_INTRABC
+ || (cm->allow_intrabc && NO_FILTER_FOR_IBC)
+#endif // CONFIG_INTRABC
#if CONFIG_EXT_TILE
|| cm->single_tile_decoding
-#endif
+#endif // CONFIG_EXT_TILE
) {
no_loopfilter = 1;
no_restoration = 1;
@@ -4655,11 +4658,6 @@
cpi->time_pick_lpf += aom_usec_timer_elapsed(&timer);
}
-#if CONFIG_INTRABC
-// When intraBC is on, do loop filtering per superblock,
-// instead of do it after the whole frame has been encoded,
-// as is in the else branch
-#else
#if !CONFIG_LPF_SB
#if CONFIG_LOOPFILTER_LEVEL
if (lf->filter_level[0] || lf->filter_level[1])
@@ -4685,7 +4683,6 @@
#endif // CONFIG_LOOPFILTER_LEVEL
#endif // CONFIG_LPF_SB
}
-#endif // CONFIG_INTRABC
#if CONFIG_STRIPED_LOOP_RESTORATION
#if CONFIG_FRAME_SUPERRES && CONFIG_HORZONLY_FRAME_SUPERRES