Refactor UV restoration to use same tilesize as Y
Change-Id: I56e741551f74624a84250d7565520db9c5127d1b
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 5cf6244..ae2c36e 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3086,11 +3086,13 @@
static void encode_restoration(AV1_COMMON *cm, aom_writer *wb) {
int i, p;
+ const int ntiles =
+ av1_get_rest_ntiles(cm->width, cm->height, NULL, NULL, NULL, NULL);
RestorationInfo *rsi = &cm->rst_info[0];
if (rsi->frame_restoration_type != RESTORE_NONE) {
if (rsi->frame_restoration_type == RESTORE_SWITCHABLE) {
// RESTORE_SWITCHABLE
- for (i = 0; i < cm->rst_internal.ntiles; ++i) {
+ for (i = 0; i < ntiles; ++i) {
av1_write_token(
wb, av1_switchable_restore_tree, cm->fc->switchable_restore_prob,
&switchable_restore_encodings[rsi->restoration_type[i]]);
@@ -3103,14 +3105,14 @@
}
}
} else if (rsi->frame_restoration_type == RESTORE_WIENER) {
- for (i = 0; i < cm->rst_internal.ntiles; ++i) {
+ for (i = 0; i < ntiles; ++i) {
aom_write(wb, rsi->wiener_info[i].level != 0, RESTORE_NONE_WIENER_PROB);
if (rsi->wiener_info[i].level) {
write_wiener_filter(&rsi->wiener_info[i], wb);
}
}
} else if (rsi->frame_restoration_type == RESTORE_SGRPROJ) {
- for (i = 0; i < cm->rst_internal.ntiles; ++i) {
+ for (i = 0; i < ntiles; ++i) {
aom_write(wb, rsi->sgrproj_info[i].level != 0,
RESTORE_NONE_SGRPROJ_PROB);
if (rsi->sgrproj_info[i].level) {
@@ -3118,7 +3120,7 @@
}
}
} else if (rsi->frame_restoration_type == RESTORE_DOMAINTXFMRF) {
- for (i = 0; i < cm->rst_internal.ntiles; ++i) {
+ for (i = 0; i < ntiles; ++i) {
aom_write(wb, rsi->domaintxfmrf_info[i].level != 0,
RESTORE_NONE_DOMAINTXFMRF_PROB);
if (rsi->domaintxfmrf_info[i].level) {
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index 0fa07c8..f8a374e 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -44,6 +44,10 @@
int width, int v_start, int height,
int components_pattern) {
int64_t filt_err = 0;
+ (void)cm;
+ // Y and UV components cannot be mixed
+ assert(components_pattern == 1 || components_pattern == 2 ||
+ components_pattern == 4 || components_pattern == 6);
#if CONFIG_AOM_HIGHBITDEPTH
if (cm->use_highbitdepth) {
if ((components_pattern >> AOM_PLANE_Y) & 1) {
@@ -51,14 +55,12 @@
aom_highbd_get_y_sse_part(src, dst, h_start, width, v_start, height);
}
if ((components_pattern >> AOM_PLANE_U) & 1) {
- filt_err += aom_highbd_get_u_sse_part(
- src, dst, h_start >> cm->subsampling_x, width >> cm->subsampling_x,
- v_start >> cm->subsampling_y, height >> cm->subsampling_y);
+ filt_err +=
+ aom_highbd_get_u_sse_part(src, dst, h_start, width, v_start, height);
}
if ((components_pattern >> AOM_PLANE_V) & 1) {
- filt_err += aom_highbd_get_v_sse_part(
- src, dst, h_start >> cm->subsampling_x, width >> cm->subsampling_x,
- v_start >> cm->subsampling_y, height >> cm->subsampling_y);
+ filt_err +=
+ aom_highbd_get_v_sse_part(src, dst, h_start, width, v_start, height);
}
return filt_err;
}
@@ -67,14 +69,10 @@
filt_err += aom_get_y_sse_part(src, dst, h_start, width, v_start, height);
}
if ((components_pattern >> AOM_PLANE_U) & 1) {
- filt_err += aom_get_u_sse_part(
- src, dst, h_start >> cm->subsampling_x, width >> cm->subsampling_x,
- v_start >> cm->subsampling_y, height >> cm->subsampling_y);
+ filt_err += aom_get_u_sse_part(src, dst, h_start, width, v_start, height);
}
if ((components_pattern >> AOM_PLANE_V) & 1) {
- filt_err += aom_get_u_sse_part(
- src, dst, h_start >> cm->subsampling_x, width >> cm->subsampling_x,
- v_start >> cm->subsampling_y, height >> cm->subsampling_y);
+ filt_err += aom_get_v_sse_part(src, dst, h_start, width, v_start, height);
}
return filt_err;
}
@@ -119,16 +117,28 @@
int64_t filt_err;
int tile_width, tile_height, nhtiles, nvtiles;
int h_start, h_end, v_start, v_end;
- const int ntiles = av1_get_rest_ntiles(cm->width, cm->height, &tile_width,
- &tile_height, &nhtiles, &nvtiles);
+ int ntiles, width, height;
+
+ // Y and UV components cannot be mixed
+ assert(components_pattern == 1 || components_pattern == 2 ||
+ components_pattern == 4 || components_pattern == 6);
+
+ if (components_pattern == 1) { // Y only
+ width = src->y_crop_width;
+ height = src->y_crop_height;
+ } else { // Color
+ width = src->uv_crop_width;
+ height = src->uv_crop_height;
+ }
+ ntiles = av1_get_rest_ntiles(width, height, &tile_width, &tile_height,
+ &nhtiles, &nvtiles);
(void)ntiles;
av1_loop_restoration_frame(cm->frame_to_show, cm, rsi, components_pattern,
partial_frame, dst_frame);
av1_get_rest_tile_limits(tile_idx, subtile_idx, subtile_bits, nhtiles,
- nvtiles, tile_width, tile_height, cm->width,
- cm->height, 0, 0, &h_start, &h_end, &v_start,
- &v_end);
+ nvtiles, tile_width, tile_height, width, height, 0,
+ 0, &h_start, &h_end, &v_start, &v_end);
filt_err = sse_restoration_tile(src, dst_frame, cm, h_start, h_end - h_start,
v_start, v_end - v_start, components_pattern);
@@ -951,7 +961,7 @@
const int dgd_stride = dgd->uv_stride;
double score;
int tile_idx, tile_width, tile_height, nhtiles, nvtiles;
- const int ntiles = av1_get_rest_ntiles(cm->width, cm->height, &tile_width,
+ const int ntiles = av1_get_rest_ntiles(width, height, &tile_width,
&tile_height, &nhtiles, &nvtiles);
assert(width == dgd->uv_crop_width);
@@ -1361,6 +1371,8 @@
cm->rst_info[0].frame_restoration_type,
cm->rst_info[1].frame_restoration_type,
cm->rst_info[2].frame_restoration_type);
+ */
+ /*
printf("Frame %d/%d frame_restore_type %d : %f %f %f %f %f\n",
cm->current_video_frame, cm->show_frame,
cm->rst_info[0].frame_restoration_type, cost_restore[0],