Replace bilateral filter with domain transform RF
The main objective is to reduce computational complexity.
The domain transform filter has an effect of edge preserving smoothing
at a lower computational cost than the bilateral filter, and can be
readily paralelized.
A little drop in coding efficiency about 0.06% for lowres, 0.16% for
midres.
Change-Id: Id949406b7e5afe9b64588d130065c63a76e4f3f9
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 72ebc8a..81d8b39 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2991,34 +2991,22 @@
aom_wb_write_bit(wb, 0);
aom_wb_write_bit(wb, 0);
break;
- case RESTORE_SWITCHABLE:
- aom_wb_write_bit(wb, 0);
+ case RESTORE_WIENER:
aom_wb_write_bit(wb, 1);
+ aom_wb_write_bit(wb, 0);
break;
- /*
- case RESTORE_SGRPROJ:
- aom_wb_write_bit(wb, 1);
- aom_wb_write_bit(wb, 0);
- break;
- */
case RESTORE_SGRPROJ:
aom_wb_write_bit(wb, 1);
- aom_wb_write_bit(wb, 0);
+ aom_wb_write_bit(wb, 1);
aom_wb_write_bit(wb, 0);
break;
case RESTORE_DOMAINTXFMRF:
aom_wb_write_bit(wb, 1);
- aom_wb_write_bit(wb, 0);
+ aom_wb_write_bit(wb, 1);
aom_wb_write_bit(wb, 1);
break;
- case RESTORE_BILATERAL:
- aom_wb_write_bit(wb, 1);
- aom_wb_write_bit(wb, 1);
+ case RESTORE_SWITCHABLE:
aom_wb_write_bit(wb, 0);
- break;
- case RESTORE_WIENER:
- aom_wb_write_bit(wb, 1);
- aom_wb_write_bit(wb, 1);
aom_wb_write_bit(wb, 1);
break;
default: assert(0);
@@ -3053,19 +3041,6 @@
aom_write_literal(wb, domaintxfmrf_info->sigma_r, DOMAINTXFMRF_PARAMS_BITS);
}
-static void write_bilateral_filter(const AV1_COMMON *cm,
- BilateralInfo *bilateral_info,
- aom_writer *wb) {
- int s;
- for (s = 0; s < BILATERAL_SUBTILES; ++s) {
- aom_write(wb, bilateral_info->level[s] >= 0, RESTORE_NONE_BILATERAL_PROB);
- if (bilateral_info->level[s] >= 0) {
- aom_write_literal(wb, bilateral_info->level[s],
- av1_bilateral_level_bits(cm));
- }
- }
-}
-
static void encode_restoration(AV1_COMMON *cm, aom_writer *wb) {
int i;
RestorationInfo *rsi = &cm->rst_info;
@@ -3076,14 +3051,7 @@
av1_write_token(
wb, av1_switchable_restore_tree, cm->fc->switchable_restore_prob,
&switchable_restore_encodings[rsi->restoration_type[i]]);
- if (rsi->restoration_type[i] == RESTORE_BILATERAL) {
-#if BILATERAL_SUBTILES == 0
- aom_write_literal(wb, rsi->bilateral_info[i].level[0],
- av1_bilateral_level_bits(cm));
-#else
- write_bilateral_filter(cm, &rsi->bilateral_info[i], wb);
-#endif
- } else if (rsi->restoration_type[i] == RESTORE_WIENER) {
+ if (rsi->restoration_type[i] == RESTORE_WIENER) {
write_wiener_filter(&rsi->wiener_info[i], wb);
} else if (rsi->restoration_type[i] == RESTORE_SGRPROJ) {
write_sgrproj_filter(&rsi->sgrproj_info[i], wb);
@@ -3091,10 +3059,6 @@
write_domaintxfmrf_filter(&rsi->domaintxfmrf_info[i], wb);
}
}
- } else if (rsi->frame_restoration_type == RESTORE_BILATERAL) {
- for (i = 0; i < cm->rst_internal.ntiles; ++i) {
- write_bilateral_filter(cm, &rsi->bilateral_info[i], wb);
- }
} else if (rsi->frame_restoration_type == RESTORE_WIENER) {
for (i = 0; i < cm->rst_internal.ntiles; ++i) {
aom_write(wb, rsi->wiener_info[i].level != 0, RESTORE_NONE_WIENER_PROB);