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;