Merge dering/clpf rdo and filtering
* Dering and clpf were merged into a single pass.
* 32x32 and 128x128 filter block sizes for clpf were removed.
* RDO for dering and clpf merged and improved:
- "0" no longer required to be in the strength selection
- Dering strength can now be 0, 1 or 2 bits per block
LL HL
PSNR: -0.04 -0.01
PSNR HVS: -0.27 -0.18
SSIM: -0.15 +0.01
CIEDE 2000: -0.11 -0.03
APSNR: -0.03 -0.00
MS SSIM: -0.18 -0.11
Change-Id: I9f002a16ad218eab6007f90f1f176232443495f0
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 7ff1e16..587134f 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -24,8 +24,8 @@
#endif // CONFIG_BITSTREAM_DEBUG
#if CONFIG_CDEF
+#include "av1/common/cdef.h"
#include "av1/common/clpf.h"
-#include "av1/common/dering.h"
#endif // CONFIG_CDEF
#include "av1/common/entropy.h"
#include "av1/common/entropymode.h"
@@ -2735,95 +2735,29 @@
#if CONFIG_CDEF
#if CONFIG_EXT_PARTITION
if (cm->sb_size == BLOCK_128X128 && bsize == BLOCK_128X128 &&
- cm->dering_level != 0 && !sb_all_skip(cm, mi_row, mi_col)) {
+ !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);
+ cm->dering_bits);
+ aom_write_literal(w, cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]
+ ->mbmi.clpf_strength,
+ cm->clpf_bits);
} else if (cm->sb_size == BLOCK_64X64 && bsize == BLOCK_64X64 &&
#else
if (bsize == BLOCK_64X64 &&
#endif // CONFIG_EXT_PARTITION
- 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);
+ !sb_all_skip(cm, mi_row, mi_col)) {
+ if (cm->dering_bits)
+ aom_write_literal(w, cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]
+ ->mbmi.dering_gain,
+ cm->dering_bits);
+ if (cm->clpf_bits)
+ aom_write_literal(w, cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col]
+ ->mbmi.clpf_strength,
+ cm->clpf_bits);
}
#endif
-
-#if CONFIG_CDEF
-#if CONFIG_EXT_PARTITION
- if (cm->sb_size == BLOCK_128X128 && bsize == BLOCK_128X128 &&
- cm->clpf_blocks && cm->clpf_strength_y && cm->clpf_size != CLPF_NOSIZE) {
- const int tl = mi_row * MI_SIZE / MIN_FB_SIZE * cm->clpf_stride +
- mi_col * MI_SIZE / MIN_FB_SIZE;
- if (cm->clpf_size == CLPF_128X128 && cm->clpf_blocks[tl] != CLPF_NOFLAG) {
- aom_write_literal(w, cm->clpf_blocks[tl], 1);
- } else if (cm->clpf_size == CLPF_64X64) {
- const int tr = tl + 2;
- const int bl = tl + 2 * cm->clpf_stride;
- const int br = tr + 2 * cm->clpf_stride;
-
- // Up to four bits per SB.
- if (cm->clpf_blocks[tl] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[tl], 1);
-
- if (mi_col + MI_SIZE < cm->mi_cols && cm->clpf_blocks[tr] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[tr], 1);
-
- if (mi_row + MI_SIZE < cm->mi_rows && cm->clpf_blocks[bl] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[bl], 1);
-
- if (mi_row + MI_SIZE < cm->mi_rows && mi_col + MI_SIZE < cm->mi_cols &&
- cm->clpf_blocks[br] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[br], 1);
- } else if (cm->clpf_size == CLPF_32X32) {
- int i, j;
- const int size = 32 / MI_SIZE;
- // Up to sixteen bits per SB.
- for (i = 0; i < 4; ++i)
- for (j = 0; j < 4; ++j) {
- const int index = tl + i * cm->clpf_stride + j;
- if (mi_row + i * size < cm->mi_rows &&
- mi_col + j * size < cm->mi_cols &&
- cm->clpf_blocks[index] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[index], 1);
- }
- }
- } else if (cm->sb_size == BLOCK_64X64 && bsize == BLOCK_64X64 &&
-#else
- if (bsize == BLOCK_64X64 &&
-#endif // CONFIG_EXT_PARTITION
- cm->clpf_blocks && cm->clpf_strength_y &&
- cm->clpf_size != CLPF_NOSIZE) {
- const int tl = mi_row * MI_SIZE / MIN_FB_SIZE * cm->clpf_stride +
- mi_col * MI_SIZE / MIN_FB_SIZE;
- const int tr = tl + 1;
- const int bl = tl + cm->clpf_stride;
- const int br = tr + cm->clpf_stride;
-
- // Up to four bits per SB.
- // When clpf_size indicates a size larger than the SB size
- // (CLPF_128X128), one bit for every fourth SB will be transmitted
- // regardless of skip blocks.
- if (cm->clpf_blocks[tl] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[tl], 1);
-
- if (mi_col + MI_SIZE / 2 < cm->mi_cols &&
- cm->clpf_blocks[tr] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[tr], 1);
-
- if (mi_row + MI_SIZE / 2 < cm->mi_rows &&
- cm->clpf_blocks[bl] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[bl], 1);
-
- if (mi_row + MI_SIZE / 2 < cm->mi_rows &&
- mi_col + MI_SIZE / 2 < cm->mi_cols &&
- cm->clpf_blocks[br] != CLPF_NOFLAG)
- aom_write_literal(w, cm->clpf_blocks[br], 1);
- }
-#endif // CONFIG_CDEF
}
static void write_modes(AV1_COMP *const cpi, const TileInfo *const tile,
@@ -3522,22 +3456,13 @@
}
#if CONFIG_CDEF
-static void encode_clpf(const AV1_COMMON *cm, struct aom_write_bit_buffer *wb) {
- aom_wb_write_literal(wb, cm->clpf_strength_y, 2);
+static void encode_cdef(const AV1_COMMON *cm, struct aom_write_bit_buffer *wb) {
+ aom_wb_write_literal(wb, cm->dering_level, DERING_LEVEL_BITS);
aom_wb_write_literal(wb, cm->clpf_strength_u, 2);
aom_wb_write_literal(wb, cm->clpf_strength_v, 2);
- if (cm->clpf_strength_y) {
- aom_wb_write_literal(wb, cm->clpf_size, 2);
- }
}
#endif
-#if CONFIG_CDEF
-static void encode_dering(int level, struct aom_write_bit_buffer *wb) {
- aom_wb_write_literal(wb, level, DERING_LEVEL_BITS);
-}
-#endif // CONFIG_CDEF
-
static void write_delta_q(struct aom_write_bit_buffer *wb, int delta_q) {
if (delta_q != 0) {
aom_wb_write_bit(wb, 1);
@@ -4481,8 +4406,7 @@
encode_loopfilter(cm, wb);
#if CONFIG_CDEF
- encode_dering(cm->dering_level, wb);
- encode_clpf(cm, wb);
+ encode_cdef(cm, wb);
#endif
#if CONFIG_LOOP_RESTORATION
encode_restoration_mode(cm, wb);