]> granicus.if.org Git - libvpx/commitdiff
Extend warp_frame functions to average compound predictions
authorSarah Parker <sarahparker@google.com>
Sat, 22 Oct 2016 00:06:37 +0000 (17:06 -0700)
committerSarah Parker <sarahparker@google.com>
Sat, 22 Oct 2016 00:18:48 +0000 (17:18 -0700)
Change-Id: I400e95161d576510423880b5b9923a2307b5eb02

av1/common/reconinter.c
av1/common/warped_motion.c
av1/common/warped_motion.h

index b07a8bdc51f35adb29d9ace2c0397242cfa189db..f80834038aeea0ed63e0d126c99e0e8a0c255df8 100644 (file)
@@ -788,7 +788,7 @@ void build_inter_predictors(MACROBLOCKD *xd, int plane,
                      pre_buf->buf0, pre_buf->width, pre_buf->height,
                      pre_buf->stride, dst, (mi_x >> pd->subsampling_x) + x,
                      (mi_y >> pd->subsampling_y) + y, w, h, dst_buf->stride,
-                     pd->subsampling_x, pd->subsampling_y, xs, ys);
+                     pd->subsampling_x, pd->subsampling_y, xs, ys, ref);
     else
 #endif  // CONFIG_GLOBAL_MOTION
 #endif  // CONFIG_EXT_INTER
index fc632c3c730cb194cf2d3d74cb0419db99c422f8..e5ed39d3e6561b28de01d5934688d2fa09fd17f1 100644 (file)
@@ -487,7 +487,7 @@ static void highbd_warp_plane(WarpedMotionParams *wm, uint8_t *ref8, int width,
                               int p_row, int p_width, int p_height,
                               int p_stride, int subsampling_x,
                               int subsampling_y, int x_scale, int y_scale,
-                              int bd) {
+                              int bd, int ref_frm) {
   int i, j;
   ProjectPointsFunc projectpoints = get_project_points_type(wm->wmtype);
   uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
@@ -502,8 +502,15 @@ static void highbd_warp_plane(WarpedMotionParams *wm, uint8_t *ref8, int width,
                     subsampling_y);
       out[0] = ROUND_POWER_OF_TWO_SIGNED(out[0] * x_scale, 4);
       out[1] = ROUND_POWER_OF_TWO_SIGNED(out[1] * y_scale, 4);
-      pred[(j - p_col) + (i - p_row) * p_stride] = highbd_warp_interpolate(
-          ref, out[0], out[1], width, height, stride, bd);
+      if (ref_frm)
+        pred[(j - p_col) + (i - p_row) * p_stride] = ROUND_POWER_OF_TWO(
+            pred[(j - p_col) + (i - p_row) * p_stride] +
+                highbd_warp_interpolate(ref, out[0], out[1], width, height,
+                                        stride, bd),
+            1);
+      else
+        pred[(j - p_col) + (i - p_row) * p_stride] = highbd_warp_interpolate(
+            ref, out[0], out[1], width, height, stride, bd);
     }
   }
 }
@@ -542,7 +549,7 @@ static void warp_plane(WarpedMotionParams *wm, uint8_t *ref, int width,
                        int height, int stride, uint8_t *pred, int p_col,
                        int p_row, int p_width, int p_height, int p_stride,
                        int subsampling_x, int subsampling_y, int x_scale,
-                       int y_scale) {
+                       int y_scale, int ref_frm) {
   int i, j;
   ProjectPointsFunc projectpoints = get_project_points_type(wm->wmtype);
   if (projectpoints == NULL) return;
@@ -555,8 +562,14 @@ static void warp_plane(WarpedMotionParams *wm, uint8_t *ref, int width,
                     subsampling_y);
       out[0] = ROUND_POWER_OF_TWO_SIGNED(out[0] * x_scale, 4);
       out[1] = ROUND_POWER_OF_TWO_SIGNED(out[1] * y_scale, 4);
-      pred[(j - p_col) + (i - p_row) * p_stride] =
-          warp_interpolate(ref, out[0], out[1], width, height, stride);
+      if (ref_frm)
+        pred[(j - p_col) + (i - p_row) * p_stride] = ROUND_POWER_OF_TWO(
+            pred[(j - p_col) + (i - p_row) * p_stride] +
+                warp_interpolate(ref, out[0], out[1], width, height, stride),
+            1);
+      else
+        pred[(j - p_col) + (i - p_row) * p_stride] =
+            warp_interpolate(ref, out[0], out[1], width, height, stride);
     }
   }
 }
@@ -587,17 +600,17 @@ void av1_warp_plane(WarpedMotionParams *wm,
                     uint8_t *ref, int width, int height, int stride,
                     uint8_t *pred, int p_col, int p_row, int p_width,
                     int p_height, int p_stride, int subsampling_x,
-                    int subsampling_y, int x_scale, int y_scale) {
+                    int subsampling_y, int x_scale, int y_scale, int ref_frm) {
 #if CONFIG_AOM_HIGHBITDEPTH
   if (use_hbd)
     highbd_warp_plane(wm, ref, width, height, stride, pred, p_col, p_row,
                       p_width, p_height, p_stride, subsampling_x, subsampling_y,
-                      x_scale, y_scale, bd);
+                      x_scale, y_scale, bd, ref_frm);
   else
 #endif  // CONFIG_AOM_HIGHBITDEPTH
     warp_plane(wm, ref, width, height, stride, pred, p_col, p_row, p_width,
                p_height, p_stride, subsampling_x, subsampling_y, x_scale,
-               y_scale);
+               y_scale, ref_frm);
 }
 
 void av1_integerize_model(const double *model, TransformationType wmtype,
index da925997d27c26931b777f33ab188b4129373fb3..e7b90387bbfc4baa4fda2c1c0ecae515ab1b4a1c 100644 (file)
@@ -64,7 +64,7 @@ void av1_warp_plane(WarpedMotionParams *wm,
                     uint8_t *ref, int width, int height, int stride,
                     uint8_t *pred, int p_col, int p_row, int p_width,
                     int p_height, int p_stride, int subsampling_x,
-                    int subsampling_y, int x_scale, int y_scale);
+                    int subsampling_y, int x_scale, int y_scale, int ref_frm);
 
 // Integerize model into the WarpedMotionParams structure
 void av1_integerize_model(const double *model, TransformationType wmtype,