Get rid of RestorationInfo::procunit_height and width
These are just RESTORATION_PROC_UNIT_SIZE shifted right by the
vertical or horizontal subsampling for this plane and it's easier not
to have to pass them around.
Change-Id: I86441d6cd86bb146f3e5dcdf2c89e34dd9fed0e1
diff --git a/av1/common/restoration.c b/av1/common/restoration.c
index 268be7f..2c5b89f 100644
--- a/av1/common/restoration.c
+++ b/av1/common/restoration.c
@@ -254,18 +254,19 @@
//
// limits gives the rectangular limits of the remaining stripes for the current
// restoration unit. rsb is the stored stripe boundaries (the saved output from
-// the deblocker). stripe_height is the height of each stripe. ss_y is true if
-// we're on a chroma plane with vertical subsampling. use_highbd is true if the
-// data has 2 bytes per pixel. rlbs contain scratch buffers to hold the CDEF
-// data (written back to the frame by restore_processing_stripe_boundary)
+// the deblocker). ss_y is true if we're on a chroma plane with vertical
+// subsampling. use_highbd is true if the data has 2 bytes per pixel. rlbs
+// contain scratch buffers to hold the CDEF data (written back to the frame by
+// restore_processing_stripe_boundary)
static int setup_processing_stripe_boundary(
const RestorationTileLimits *limits, const RestorationStripeBoundaries *rsb,
- int stripe_height, int ss_y, int use_highbd, uint8_t *data8, int stride,
+ int ss_y, int use_highbd, uint8_t *data8, int stride,
RestorationLineBuffers *rlbs) {
// Which stripe is this? limits->v_start is the top of the stripe in pixel
// units, but we add tile_offset to get the number of pixels from the top of
// the first stripe, which lies off the image.
const int tile_offset = RESTORATION_TILE_OFFSET >> ss_y;
+ const int stripe_height = RESTORATION_PROC_UNIT_SIZE >> ss_y;
const int stripe_index = (limits->v_start + tile_offset) / stripe_height;
// Horizontal offsets within the line buffers. The buffer logically starts at
@@ -335,8 +336,9 @@
// setup_processing_stripe_boundary.
static void restore_processing_stripe_boundary(
const RestorationTileLimits *limits, const RestorationLineBuffers *rlbs,
- int stripe_height, int ss_y, int use_highbd, uint8_t *data8, int stride) {
+ int ss_y, int use_highbd, uint8_t *data8, int stride) {
const int tile_offset = RESTORATION_TILE_OFFSET >> ss_y;
+ const int stripe_height = RESTORATION_PROC_UNIT_SIZE >> ss_y;
const int stripe_index = (limits->v_start + tile_offset) / stripe_height;
const int line_width =
@@ -1344,16 +1346,13 @@
#endif // CONFIG_HIGHBITDEPTH
};
-void av1_loop_restoration_filter_unit(const RestorationTileLimits *limits,
- const RestorationUnitInfo *rui,
+void av1_loop_restoration_filter_unit(
+ const RestorationTileLimits *limits, const RestorationUnitInfo *rui,
#if CONFIG_STRIPED_LOOP_RESTORATION
- const RestorationStripeBoundaries *rsb,
- RestorationLineBuffers *rlbs, int ss_y,
+ const RestorationStripeBoundaries *rsb, RestorationLineBuffers *rlbs,
#endif
- int procunit_width, int procunit_height,
- int highbd, int bit_depth, uint8_t *data8,
- int stride, uint8_t *dst8, int dst_stride,
- int32_t *tmpbuf) {
+ int ss_x, int ss_y, int highbd, int bit_depth, uint8_t *data8, int stride,
+ uint8_t *dst8, int dst_stride, int32_t *tmpbuf) {
RestorationType unit_rtype = rui->restoration_type;
int unit_h = limits->v_end - limits->v_start;
@@ -1370,6 +1369,8 @@
assert(filter_idx < NUM_STRIPE_FILTERS);
const stripe_filter_fun stripe_filter = stripe_filters[filter_idx];
+ const int procunit_width = RESTORATION_PROC_UNIT_SIZE >> ss_x;
+
// Convolve the whole tile one stripe at a time
#if CONFIG_STRIPED_LOOP_RESTORATION
RestorationTileLimits remaining_stripes = *limits;
@@ -1378,19 +1379,19 @@
while (i < unit_h) {
#if CONFIG_STRIPED_LOOP_RESTORATION
remaining_stripes.v_start = limits->v_start + i;
- int h = setup_processing_stripe_boundary(&remaining_stripes, rsb,
- procunit_height, ss_y, highbd,
- data8, stride, rlbs);
+ int h = setup_processing_stripe_boundary(&remaining_stripes, rsb, ss_y,
+ highbd, data8, stride, rlbs);
#else
- const int h = AOMMIN(procunit_height, (unit_h - i + 15) & ~15);
+ const int h =
+ AOMMIN(RESTORATION_PROC_UNIT_SIZE >> ss_y, (unit_h - i + 15) & ~15);
#endif
stripe_filter(rui, unit_w, h, procunit_width, data8_tl + i * stride, stride,
dst8_tl + i * dst_stride, dst_stride, tmpbuf, bit_depth);
#if CONFIG_STRIPED_LOOP_RESTORATION
- restore_processing_stripe_boundary(
- &remaining_stripes, rlbs, procunit_height, ss_y, highbd, data8, stride);
+ restore_processing_stripe_boundary(&remaining_stripes, rlbs, ss_y, highbd,
+ data8, stride);
#endif
i += h;
@@ -1401,8 +1402,8 @@
const RestorationInfo *rsi;
#if CONFIG_STRIPED_LOOP_RESTORATION
RestorationLineBuffers *rlbs;
- int ss_y;
#endif
+ int ss_x, ss_y;
int highbd, bit_depth;
uint8_t *data8, *dst8;
int data_stride, dst_stride;
@@ -1414,14 +1415,13 @@
FilterFrameCtxt *ctxt = (FilterFrameCtxt *)priv;
const RestorationInfo *rsi = ctxt->rsi;
- av1_loop_restoration_filter_unit(limits, &rsi->unit_info[rest_unit_idx],
+ av1_loop_restoration_filter_unit(
+ limits, &rsi->unit_info[rest_unit_idx],
#if CONFIG_STRIPED_LOOP_RESTORATION
- &rsi->boundaries, ctxt->rlbs, ctxt->ss_y,
+ &rsi->boundaries, ctxt->rlbs,
#endif
- rsi->procunit_width, rsi->procunit_height,
- ctxt->highbd, ctxt->bit_depth, ctxt->data8,
- ctxt->data_stride, ctxt->dst8,
- ctxt->dst_stride, ctxt->tmpbuf);
+ ctxt->ss_x, ctxt->ss_y, ctxt->highbd, ctxt->bit_depth, ctxt->data8,
+ ctxt->data_stride, ctxt->dst8, ctxt->dst_stride, ctxt->tmpbuf);
}
void av1_loop_restoration_filter_frame(YV12_BUFFER_CONFIG *frame,
@@ -1498,10 +1498,10 @@
FilterFrameCtxt ctxt;
ctxt.rsi = prsi;
#if CONFIG_STRIPED_LOOP_RESTORATION
- const int ss_y = is_uv && cm->subsampling_y;
ctxt.rlbs = &rlbs;
- ctxt.ss_y = ss_y;
#endif
+ ctxt.ss_x = is_uv && cm->subsampling_x;
+ ctxt.ss_y = is_uv && cm->subsampling_y;
ctxt.highbd = highbd;
ctxt.bit_depth = bit_depth;
ctxt.data8 = frame->buffers[plane];
diff --git a/av1/common/restoration.h b/av1/common/restoration.h
index 4ecb7cb..39451ff 100644
--- a/av1/common/restoration.h
+++ b/av1/common/restoration.h
@@ -242,7 +242,6 @@
typedef struct {
RestorationType frame_restoration_type;
int restoration_unit_size;
- int procunit_width, procunit_height;
// Fields below here are allocated and initialised by
// av1_alloc_restoration_struct. (horz_)units_per_tile give the number of
@@ -297,12 +296,11 @@
// limits is the limits of the unit. rui gives the mode to use for this unit
// and its coefficients. If striped loop restoration is enabled, rsb contains
// deblocked pixels to use for stripe boundaries; rlbs is just some space to
-// use as a scratch buffer. ss_y is a flag which should be 1 if this is a plane
-// with vertical subsampling.
+// use as a scratch buffer.
//
-// procunit_width and procunit_height are the width and height in which to
-// process the data. highbd is a flag which should be 1 in high bit depth mode,
-// in which case bit_depth is the bit depth.
+// ss_x and ss_y are flags which should be 1 if this is a plane with
+// horizontal/vertical subsampling, respectively. highbd is a flag which should
+// be 1 in high bit depth mode, in which case bit_depth is the bit depth.
//
// data8 is the frame data (pointing at the top-left corner of the frame, not
// the restoration unit) and stride is its stride. dst8 is the buffer where the
@@ -311,16 +309,13 @@
//
// Finally tmpbuf is a scratch buffer used by the sgrproj filter which should
// be at least SGRPROJ_TMPBUF_SIZE big.
-void av1_loop_restoration_filter_unit(const RestorationTileLimits *limits,
- const RestorationUnitInfo *rui,
+void av1_loop_restoration_filter_unit(
+ const RestorationTileLimits *limits, const RestorationUnitInfo *rui,
#if CONFIG_STRIPED_LOOP_RESTORATION
- const RestorationStripeBoundaries *rsb,
- RestorationLineBuffers *rlbs, int ss_y,
+ const RestorationStripeBoundaries *rsb, RestorationLineBuffers *rlbs,
#endif
- int procunit_height, int procunit_width,
- int highbd, int bit_depth, uint8_t *data8,
- int stride, uint8_t *dst8, int dst_stride,
- int32_t *tmpbuf);
+ int ss_x, int ss_y, int highbd, int bit_depth, uint8_t *data8, int stride,
+ uint8_t *dst8, int dst_stride, int32_t *tmpbuf);
void av1_loop_restoration_filter_frame(YV12_BUFFER_CONFIG *frame,
struct AV1Common *cm,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 6b2742d..53cb21b 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -1246,13 +1246,6 @@
cm->rst_info[0].restoration_unit_size;
}
cm->rst_info[2].restoration_unit_size = cm->rst_info[1].restoration_unit_size;
-
- cm->rst_info[0].procunit_width = cm->rst_info[0].procunit_height =
- RESTORATION_PROC_UNIT_SIZE;
- cm->rst_info[1].procunit_width = cm->rst_info[2].procunit_width =
- RESTORATION_PROC_UNIT_SIZE >> cm->subsampling_x;
- cm->rst_info[1].procunit_height = cm->rst_info[2].procunit_height =
- RESTORATION_PROC_UNIT_SIZE >> cm->subsampling_y;
}
static void read_wiener_filter(int wiener_win, WienerInfo *wiener_info,
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index b65392d..7f23a3b 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4171,12 +4171,6 @@
rst[0].restoration_unit_size = (RESTORATION_TILESIZE_MAX >> 1);
rst[1].restoration_unit_size = rst[0].restoration_unit_size >> s;
rst[2].restoration_unit_size = rst[1].restoration_unit_size;
-
- rst[0].procunit_width = rst[0].procunit_height = RESTORATION_PROC_UNIT_SIZE;
- rst[1].procunit_width = rst[2].procunit_width =
- RESTORATION_PROC_UNIT_SIZE >> sx;
- rst[1].procunit_height = rst[2].procunit_height =
- RESTORATION_PROC_UNIT_SIZE >> sy;
}
#endif // CONFIG_LOOP_RESTORATION
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index 5e310b2..18e03a8 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -75,11 +75,10 @@
const RestorationTileLimits *limits,
const RestorationUnitInfo *rui,
YV12_BUFFER_CONFIG *dst, int plane) {
- const RestorationInfo *rsi = &cm->rst_info[plane];
const int is_uv = plane > 0;
#if CONFIG_STRIPED_LOOP_RESTORATION
+ const RestorationInfo *rsi = &cm->rst_info[plane];
RestorationLineBuffers rlbs;
- const int ss_y = is_uv && cm->subsampling_y;
#endif
#if CONFIG_HIGHBITDEPTH
const int bit_depth = cm->bit_depth;
@@ -91,14 +90,14 @@
const YV12_BUFFER_CONFIG *fts = cm->frame_to_show;
- av1_loop_restoration_filter_unit(limits, rui,
+ av1_loop_restoration_filter_unit(
+ limits, rui,
#if CONFIG_STRIPED_LOOP_RESTORATION
- &rsi->boundaries, &rlbs, ss_y,
+ &rsi->boundaries, &rlbs,
#endif
- rsi->procunit_width, rsi->procunit_height,
- highbd, bit_depth, fts->buffers[plane],
- fts->strides[is_uv], dst->buffers[plane],
- dst->strides[is_uv], cm->rst_tmpbuf);
+ is_uv && cm->subsampling_x, is_uv && cm->subsampling_y, highbd, bit_depth,
+ fts->buffers[plane], fts->strides[is_uv], dst->buffers[plane],
+ dst->strides[is_uv], cm->rst_tmpbuf);
return sse_restoration_tile(limits, src, dst, plane, highbd);
}
@@ -472,8 +471,6 @@
const MACROBLOCK *const x = rsc->x;
const AV1_COMMON *const cm = rsc->cm;
- const RestorationInfo *rsi = &cm->rst_info[rsc->plane];
-
#if CONFIG_HIGHBITDEPTH
const int highbd = cm->use_highbitdepth;
const int bit_depth = cm->bit_depth;
@@ -487,11 +484,17 @@
const uint8_t *src_start =
rsc->src_buffer + limits->v_start * rsc->src_stride + limits->h_start;
+ const int is_uv = rsc->plane > 0;
+ const int ss_x = is_uv && cm->subsampling_x;
+ const int ss_y = is_uv && cm->subsampling_y;
+ const int procunit_width = RESTORATION_PROC_UNIT_SIZE >> ss_x;
+ const int procunit_height = RESTORATION_PROC_UNIT_SIZE >> ss_y;
+
rusi->sgrproj = search_selfguided_restoration(
dgd_start, limits->h_end - limits->h_start,
limits->v_end - limits->v_start, rsc->dgd_stride, src_start,
- rsc->src_stride, highbd, bit_depth, rsi->procunit_width,
- rsi->procunit_height, cm->rst_tmpbuf);
+ rsc->src_stride, highbd, bit_depth, procunit_width, procunit_height,
+ cm->rst_tmpbuf);
RestorationUnitInfo rui;
rui.restoration_type = RESTORE_SGRPROJ;