Commit a3d4fe50 authored by Debargha Mukherjee's avatar Debargha Mukherjee

Enable switchable restoration for chroma

Change-Id: I78a8a1749cd4449c61a106f413c697e4a2df0475
parent 9ac7a0f3
......@@ -708,7 +708,7 @@ typedef enum {
RESTORE_SGRPROJ,
RESTORE_SWITCHABLE,
RESTORE_SWITCHABLE_TYPES = RESTORE_SWITCHABLE,
RESTORE_TYPES,
RESTORE_TYPES = 4,
} RestorationType;
#endif // CONFIG_LOOP_RESTORATION
......
......@@ -1669,7 +1669,9 @@ static void setup_segmentation(AV1_COMMON *const cm,
static void decode_restoration_mode(AV1_COMMON *cm,
struct aom_read_bit_buffer *rb) {
int p;
RestorationInfo *rsi = &cm->rst_info[0];
RestorationInfo *rsi;
for (p = 0; p < MAX_MB_PLANE; ++p) {
rsi = &cm->rst_info[p];
if (aom_rb_read_bit(rb)) {
rsi->frame_restoration_type =
aom_rb_read_bit(rb) ? RESTORE_SGRPROJ : RESTORE_WIENER;
......@@ -1677,26 +1679,20 @@ static void decode_restoration_mode(AV1_COMMON *cm,
rsi->frame_restoration_type =
aom_rb_read_bit(rb) ? RESTORE_SWITCHABLE : RESTORE_NONE;
}
for (p = 1; p < MAX_MB_PLANE; ++p) {
rsi = &cm->rst_info[p];
if (aom_rb_read_bit(rb)) {
rsi->frame_restoration_type =
aom_rb_read_bit(rb) ? RESTORE_SGRPROJ : RESTORE_WIENER;
} else {
rsi->frame_restoration_type = RESTORE_NONE;
}
}
cm->rst_info[0].restoration_tilesize = RESTORATION_TILESIZE_MAX;
cm->rst_info[1].restoration_tilesize = RESTORATION_TILESIZE_MAX;
cm->rst_info[2].restoration_tilesize = RESTORATION_TILESIZE_MAX;
if (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) {
cm->rst_info[0].restoration_tilesize = RESTORATION_TILESIZE_MAX >> 2;
cm->rst_info[1].restoration_tilesize = RESTORATION_TILESIZE_MAX >> 2;
cm->rst_info[2].restoration_tilesize = RESTORATION_TILESIZE_MAX >> 2;
rsi = &cm->rst_info[0];
rsi->restoration_tilesize >>= aom_rb_read_bit(rb);
if (rsi->restoration_tilesize != RESTORATION_TILESIZE_MAX) {
rsi->restoration_tilesize >>= aom_rb_read_bit(rb);
rsi->restoration_tilesize <<= aom_rb_read_bit(rb);
if (rsi->restoration_tilesize != (RESTORATION_TILESIZE_MAX >> 2)) {
rsi->restoration_tilesize <<= aom_rb_read_bit(rb);
}
}
int s = AOMMIN(cm->subsampling_x, cm->subsampling_y);
......@@ -1801,7 +1797,6 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
SgrprojInfo *sgrproj_info = xd->sgrproj_info + plane;
if (rsi->frame_restoration_type == RESTORE_SWITCHABLE) {
assert(plane == 0);
rsi->restoration_type[rtile_idx] =
aom_read_symbol(r, xd->tile_ctx->switchable_restore_cdf,
RESTORE_SWITCHABLE_TYPES, ACCT_STR);
......
......@@ -3084,7 +3084,9 @@ static void write_modes(AV1_COMP *const cpi, const TileInfo *const tile,
static void encode_restoration_mode(AV1_COMMON *cm,
struct aom_write_bit_buffer *wb) {
int p;
RestorationInfo *rsi = &cm->rst_info[0];
RestorationInfo *rsi;
for (p = 0; p < MAX_MB_PLANE; ++p) {
rsi = &cm->rst_info[p];
switch (rsi->frame_restoration_type) {
case RESTORE_NONE:
aom_wb_write_bit(wb, 0);
......@@ -3104,27 +3106,13 @@ static void encode_restoration_mode(AV1_COMMON *cm,
break;
default: assert(0);
}
for (p = 1; p < MAX_MB_PLANE; ++p) {
rsi = &cm->rst_info[p];
switch (rsi->frame_restoration_type) {
case RESTORE_NONE: aom_wb_write_bit(wb, 0); break;
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, 1);
break;
default: assert(0);
}
}
if (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) {
rsi = &cm->rst_info[0];
aom_wb_write_bit(wb, rsi->restoration_tilesize != RESTORATION_TILESIZE_MAX);
if (rsi->restoration_tilesize != RESTORATION_TILESIZE_MAX) {
aom_wb_write_bit(
wb, rsi->restoration_tilesize != (RESTORATION_TILESIZE_MAX >> 2));
if (rsi->restoration_tilesize != (RESTORATION_TILESIZE_MAX >> 2)) {
aom_wb_write_bit(
wb, rsi->restoration_tilesize != (RESTORATION_TILESIZE_MAX >> 1));
}
......@@ -3219,7 +3207,6 @@ static void loop_restoration_write_sb_coeffs(const AV1_COMMON *const cm,
SgrprojInfo *sgrproj_info = xd->sgrproj_info + plane;
if (rsi->frame_restoration_type == RESTORE_SWITCHABLE) {
assert(plane == 0);
aom_write_symbol(w, rsi->restoration_type[rtile_idx],
xd->tile_ctx->switchable_restore_cdf,
RESTORE_SWITCHABLE_TYPES);
......
......@@ -1435,6 +1435,7 @@ void av1_pick_filter_restoration(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi) {
}
for (int plane = AOM_PLANE_Y; plane <= AOM_PLANE_V; ++plane) {
const int ntiles = (plane == AOM_PLANE_Y ? ntiles_y : ntiles_uv);
for (r = 0; r < RESTORE_SWITCHABLE_TYPES; ++r) {
cost_restore[r] = DBL_MAX;
if (force_restore_type != RESTORE_TYPES)
......@@ -1443,7 +1444,7 @@ void av1_pick_filter_restoration(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi) {
src, cpi, plane, &cm->rst_info[plane], restore_types[r], tile_cost[r],
&cpi->trial_frame_rst);
}
if (plane == AOM_PLANE_Y)
if (ntiles > 1)
cost_restore[RESTORE_SWITCHABLE] = search_switchable_restoration(
src, cpi, plane, restore_types, tile_cost, &cm->rst_info[plane]);
else
......@@ -1463,9 +1464,8 @@ void av1_pick_filter_restoration(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi) {
assert(best_restore == force_restore_type ||
best_restore == RESTORE_NONE);
if (best_restore != RESTORE_SWITCHABLE) {
const int nt = (plane == AOM_PLANE_Y ? ntiles_y : ntiles_uv);
memcpy(cm->rst_info[plane].restoration_type, restore_types[best_restore],
nt * sizeof(restore_types[best_restore][0]));
ntiles * sizeof(restore_types[best_restore][0]));
}
}
/*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment