From: Sarah Parker Date: Sat, 22 Oct 2016 00:06:37 +0000 (-0700) Subject: Extend warp_frame functions to average compound predictions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=43d56f32e51644a64d0fcbd8e338931aa0980d57;p=libvpx Extend warp_frame functions to average compound predictions Change-Id: I400e95161d576510423880b5b9923a2307b5eb02 --- diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index b07a8bdc5..f80834038 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c @@ -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 diff --git a/av1/common/warped_motion.c b/av1/common/warped_motion.c index fc632c3c7..e5ed39d3e 100644 --- a/av1/common/warped_motion.c +++ b/av1/common/warped_motion.c @@ -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, diff --git a/av1/common/warped_motion.h b/av1/common/warped_motion.h index da925997d..e7b90387b 100644 --- a/av1/common/warped_motion.h +++ b/av1/common/warped_motion.h @@ -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,