Miscellaneous cleaning up for loop-restoration
* Change Wiener filter storage to match the format expected
by the convolve functions
Change-Id: I4d1fb08a13cfc31e69e12c1cb4b2e510c6d8ae30
diff --git a/av1/common/restoration.c b/av1/common/restoration.c
index c061375..285ad09 100644
--- a/av1/common/restoration.c
+++ b/av1/common/restoration.c
@@ -55,6 +55,7 @@
rst_info->wiener_info = (WienerInfo *)aom_realloc(
rst_info->wiener_info, sizeof(*rst_info->wiener_info) * ntiles);
assert(rst_info->wiener_info != NULL);
+ memset(rst_info->wiener_info, 0, sizeof(*rst_info->wiener_info) * ntiles);
rst_info->sgrproj_info = (SgrprojInfo *)aom_realloc(
rst_info->sgrproj_info, sizeof(*rst_info->sgrproj_info) * ntiles);
assert(rst_info->sgrproj_info != NULL);
@@ -143,25 +144,11 @@
const int tile_height = rst->tile_height;
int i, j;
int h_start, h_end, v_start, v_end;
- DECLARE_ALIGNED(16, InterpKernel, hkernel);
- DECLARE_ALIGNED(16, InterpKernel, vkernel);
-
if (rst->rsi->restoration_type[tile_idx] == RESTORE_NONE) {
loop_copy_tile(data, tile_idx, 0, 0, width, height, stride, rst, dst,
dst_stride);
return;
}
- // TODO(david.barker): Store hfilter/vfilter as an InterpKernel
- // instead of the current format. Then this can be removed.
- assert(WIENER_WIN == SUBPEL_TAPS - 1);
- for (i = 0; i < WIENER_WIN; ++i) {
- hkernel[i] = rst->rsi->wiener_info[tile_idx].hfilter[i];
- vkernel[i] = rst->rsi->wiener_info[tile_idx].vfilter[i];
- }
- hkernel[WIENER_WIN] = 0;
- vkernel[WIENER_WIN] = 0;
- hkernel[3] -= 128;
- vkernel[3] -= 128;
av1_get_rest_tile_limits(tile_idx, 0, 0, rst->nhtiles, rst->nvtiles,
tile_width, tile_height, width, height, 0, 0,
&h_start, &h_end, &v_start, &v_end);
@@ -173,8 +160,9 @@
int h = AOMMIN(MAX_SB_SIZE, (v_end - i + 15) & ~15);
const uint8_t *data_p = data + i * stride + j;
uint8_t *dst_p = dst + i * dst_stride + j;
- aom_convolve8_add_src(data_p, stride, dst_p, dst_stride, hkernel, 16,
- vkernel, 16, w, h);
+ aom_convolve8_add_src(data_p, stride, dst_p, dst_stride,
+ rst->rsi->wiener_info[tile_idx].hfilter, 16,
+ rst->rsi->wiener_info[tile_idx].vfilter, 16, w, h);
}
}
@@ -1028,25 +1016,12 @@
const int tile_height = rst->tile_height;
int h_start, h_end, v_start, v_end;
int i, j;
- DECLARE_ALIGNED(16, InterpKernel, hkernel);
- DECLARE_ALIGNED(16, InterpKernel, vkernel);
if (rst->rsi->restoration_type[tile_idx] == RESTORE_NONE) {
loop_copy_tile_highbd(data, tile_idx, 0, 0, width, height, stride, rst, dst,
dst_stride);
return;
}
- // TODO(david.barker): Store hfilter/vfilter as an InterpKernel
- // instead of the current format. Then this can be removed.
- assert(WIENER_WIN == SUBPEL_TAPS - 1);
- for (i = 0; i < WIENER_WIN; ++i) {
- hkernel[i] = rst->rsi->wiener_info[tile_idx].hfilter[i];
- vkernel[i] = rst->rsi->wiener_info[tile_idx].vfilter[i];
- }
- hkernel[WIENER_WIN] = 0;
- vkernel[WIENER_WIN] = 0;
- hkernel[3] -= 128;
- vkernel[3] -= 128;
av1_get_rest_tile_limits(tile_idx, 0, 0, rst->nhtiles, rst->nvtiles,
tile_width, tile_height, width, height, 0, 0,
&h_start, &h_end, &v_start, &v_end);
@@ -1058,9 +1033,10 @@
int h = AOMMIN(MAX_SB_SIZE, (v_end - i + 15) & ~15);
const uint16_t *data_p = data + i * stride + j;
uint16_t *dst_p = dst + i * dst_stride + j;
- aom_highbd_convolve8_add_src(CONVERT_TO_BYTEPTR(data_p), stride,
- CONVERT_TO_BYTEPTR(dst_p), dst_stride,
- hkernel, 16, vkernel, 16, w, h, bit_depth);
+ aom_highbd_convolve8_add_src(
+ CONVERT_TO_BYTEPTR(data_p), stride, CONVERT_TO_BYTEPTR(dst_p),
+ dst_stride, rst->rsi->wiener_info[tile_idx].hfilter, 16,
+ rst->rsi->wiener_info[tile_idx].vfilter, 16, w, h, bit_depth);
}
}
diff --git a/av1/common/restoration.h b/av1/common/restoration.h
index ecc6276..d4319d2 100644
--- a/av1/common/restoration.h
+++ b/av1/common/restoration.h
@@ -114,7 +114,17 @@
// Max of SGRPROJ_EXTBUF_SIZE, DOMAINTXFMRF_EXTBUF_SIZE, WIENER_EXTBUF_SIZE
#define RESTORATION_EXTBUF_SIZE (DOMAINTXFMRF_EXTBUF_SIZE)
-typedef struct { int vfilter[WIENER_WIN], hfilter[WIENER_WIN]; } WienerInfo;
+// Check the assumptions of the existing code
+#if SUBPEL_TAPS != WIENER_WIN + 1
+#error "Wiener filter currently only works if SUBPEL_TAPS == WIENER_WIN + 1"
+#endif
+#if WIENER_FILT_PREC_BITS != 7
+#error "Wiener filter currently only works if WIENER_FILT_PREC_BITS == 7"
+#endif
+typedef struct {
+ DECLARE_ALIGNED(16, InterpKernel, vfilter);
+ DECLARE_ALIGNED(16, InterpKernel, hfilter);
+} WienerInfo;
typedef struct {
int r1;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 9668a3d..b1d09ff 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -2471,10 +2471,11 @@
wiener_info->vfilter[2] = wiener_info->vfilter[WIENER_WIN - 3] =
aom_read_literal(rb, WIENER_FILT_TAP2_BITS, ACCT_STR) +
WIENER_FILT_TAP2_MINV;
+ // The central element has an implicit +WIENER_FILT_STEP
wiener_info->vfilter[WIENER_HALFWIN] =
- WIENER_FILT_STEP -
- 2 * (wiener_info->vfilter[0] + wiener_info->vfilter[1] +
- wiener_info->vfilter[2]);
+ -2 * (wiener_info->vfilter[0] + wiener_info->vfilter[1] +
+ wiener_info->vfilter[2]);
+
wiener_info->hfilter[0] = wiener_info->hfilter[WIENER_WIN - 1] =
aom_read_literal(rb, WIENER_FILT_TAP0_BITS, ACCT_STR) +
WIENER_FILT_TAP0_MINV;
@@ -2484,10 +2485,10 @@
wiener_info->hfilter[2] = wiener_info->hfilter[WIENER_WIN - 3] =
aom_read_literal(rb, WIENER_FILT_TAP2_BITS, ACCT_STR) +
WIENER_FILT_TAP2_MINV;
+ // The central element has an implicit +WIENER_FILT_STEP
wiener_info->hfilter[WIENER_HALFWIN] =
- WIENER_FILT_STEP -
- 2 * (wiener_info->hfilter[0] + wiener_info->hfilter[1] +
- wiener_info->hfilter[2]);
+ -2 * (wiener_info->hfilter[0] + wiener_info->hfilter[1] +
+ wiener_info->hfilter[2]);
}
static void read_sgrproj_filter(SgrprojInfo *sgrproj_info, aom_reader *rb) {
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index cb11e03..f04832c 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -905,7 +905,8 @@
// Computes the function x'*H*x - x'*M for the learned 2D filter x, and compares
// against identity filters; Final score is defined as the difference between
// the function values
-static double compute_score(double *M, double *H, int *vfilt, int *hfilt) {
+static double compute_score(double *M, double *H, InterpKernel vfilt,
+ InterpKernel hfilt) {
double ab[WIENER_WIN * WIENER_WIN];
int i, k, l;
double P = 0, Q = 0;
@@ -936,7 +937,7 @@
return Score - iScore;
}
-static void quantize_sym_filter(double *f, int *fi) {
+static void quantize_sym_filter(double *f, InterpKernel fi) {
int i;
for (i = 0; i < WIENER_HALFWIN; ++i) {
fi[i] = RINT(f[i] * WIENER_FILT_STEP);
@@ -949,7 +950,8 @@
fi[WIENER_WIN - 1] = fi[0];
fi[WIENER_WIN - 2] = fi[1];
fi[WIENER_WIN - 3] = fi[2];
- fi[3] = WIENER_FILT_STEP - 2 * (fi[0] + fi[1] + fi[2]);
+ // The central element has an implicit +WIENER_FILT_STEP
+ fi[3] = -2 * (fi[0] + fi[1] + fi[2]);
}
static double search_wiener_uv(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,