/*
 * Copyright (c) 2022, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the
 * Alliance for Open Media Patent License 1.0 was not distributed with this
 * source code in the PATENTS file, you can obtain it at
 * aomedia.org/license/patent-license/.
 */

#include <math.h>

#include "config/aom_config.h"
#include "config/aom_dsp_rtcd.h"
#include "aom_dsp/aom_dsp_common.h"
#include "aom_mem/aom_mem.h"
#include "aom_ports/mem.h"
#include "av1/common/av1_common_int.h"
#include "av1/common/av1_loopfilter.h"
#include "av1/common/reconinter.h"
#include "av1/common/seg_common.h"
#if CONFIG_ALLOW_TIP_DIRECT_WITH_SUPERRES
#include "av1/common/resize.h"
#endif
static const int pef_w_mult[4] = { 85, 51, 37, 28 };
static const int pef_q_mult[4] = { 32, 25, 19, 19 };

void init_pef_parameter(AV1_COMMON *cm, int plane_start, int plane_end) {
  int q_ind[MAX_MB_PLANE], q_ind_r[MAX_MB_PLANE], side_ind[MAX_MB_PLANE],
      side_ind_r[MAX_MB_PLANE];
  PefInfo *const pefi = &cm->pef_info;
  PefParams *const pef = &cm->pef_params;
  const int pef_delta = pef->pef_delta;
  pef->filter_level[0] = 1;
  pef->filter_level[1] = 1;
  pef->filter_level_u = 1;
  pef->filter_level_v = 1;
  pef->delta_q_luma[0] = pef_delta;
  pef->delta_q_luma[1] = pef_delta;
  pef->delta_side_luma[0] = pef_delta;
  pef->delta_side_luma[1] = pef_delta;
  pef->delta_q_u = pef_delta;
  pef->delta_side_u = pef_delta;
  pef->delta_q_v = pef_delta;
  pef->delta_side_v = pef_delta;
  const int base_qindex = cm->quant_params.base_qindex;
  const int u_ac_delta_q = cm->quant_params.u_ac_delta_q;
  const int v_ac_delta_q = cm->quant_params.v_ac_delta_q;

  q_ind[0] = base_qindex + pef->delta_q_luma[0] * PEF_DELTA_SCALE;
  side_ind[0] = base_qindex + pef->delta_side_luma[0] * PEF_DELTA_SCALE;

  q_ind[1] = base_qindex + u_ac_delta_q + pef->delta_q_u * PEF_DELTA_SCALE;
  side_ind[1] =
      base_qindex + u_ac_delta_q + pef->delta_side_u * PEF_DELTA_SCALE;

  q_ind[2] = base_qindex + v_ac_delta_q + pef->delta_q_v * PEF_DELTA_SCALE;
  side_ind[2] =
      base_qindex + v_ac_delta_q + pef->delta_side_v * PEF_DELTA_SCALE;

  q_ind_r[0] = base_qindex + pef->delta_q_luma[1] * PEF_DELTA_SCALE;
  side_ind_r[0] = base_qindex + pef->delta_side_luma[1] * PEF_DELTA_SCALE;

  q_ind_r[1] = base_qindex + u_ac_delta_q + pef->delta_q_u * PEF_DELTA_SCALE;
  side_ind_r[1] =
      base_qindex + u_ac_delta_q + pef->delta_side_u * PEF_DELTA_SCALE;

  q_ind_r[2] = base_qindex + v_ac_delta_q + pef->delta_q_v * PEF_DELTA_SCALE;
  side_ind_r[2] =
      base_qindex + v_ac_delta_q + pef->delta_side_v * PEF_DELTA_SCALE;

  assert(plane_start >= AOM_PLANE_Y);
  assert(plane_end <= MAX_MB_PLANE);
  int plane;
  for (plane = plane_start; plane < plane_end; plane++) {
    if (plane == 0 && !pef->filter_level[0] && !pef->filter_level[1])
      break;
    else if (plane == 1 && !pef->filter_level_u)
      continue;
    else if (plane == 2 && !pef->filter_level_v)
      continue;
    for (int dir = 0; dir < 2; ++dir) {
      const int q_ind_plane = (dir == 0) ? q_ind[plane] : q_ind_r[plane];
      const int side_ind_plane =
          (dir == 0) ? side_ind[plane] : side_ind_r[plane];

      const int q_thr =
          df_quant_from_qindex(q_ind_plane, cm->seq_params.bit_depth);
      const int side_thr =
          df_side_from_qindex(side_ind_plane, cm->seq_params.bit_depth);
      pefi->q_thr[plane][dir] = q_thr >> PEF_THR_SHIFT;
      pefi->side_thr[plane][dir] = side_thr >> PEF_THR_SHIFT;
    }
  }
}

// derive the number of samples to filter
static INLINE int derive_filter_length(uint16_t *s, int pitch,
                                       uint16_t side_thresh, int filt_len) {
  if (filt_len < 1 || filt_len > 3) return 0;
  const int16_t second_deriv_m2 =
      abs(s[-3 * pitch] - (s[-2 * pitch] << 1) + s[-pitch]);
  const int16_t second_deriv_p1 = abs(s[0] - (s[pitch] << 1) + s[2 * pitch]);
  int8_t mask = 0;
  mask |= (second_deriv_m2 > side_thresh);
  mask |= (second_deriv_p1 > side_thresh);
  if (mask)
    return 0;
  else
    return filt_len;
}

// filter vertical prediction samples
static INLINE void filt_vert_pred(int length, uint16_t *s, const int stride,
                                  int bd, uint16_t q_thresh, int q_mult,
                                  int w_mult) {
  if (length < 1) return;
  int delta_m2 = (3 * (s[0] - s[-1]) - (s[stride] - s[-2])) * 4;
  const int q_thresh_clamp = q_thresh * q_mult;
  delta_m2 = clamp(delta_m2, -q_thresh_clamp, q_thresh_clamp);
  delta_m2 *= w_mult;

  for (int i = 0; i < length; i++) {
    const int offset = ROUND_POWER_OF_TWO(delta_m2 * (length - i), PEF_SHIFT);
    s[(-i - 1)] = clip_pixel_highbd(s[(-i - 1)] + offset, bd);
    s[i] = clip_pixel_highbd(s[i] - offset, bd);
  }
}

// filter horizontal prediction samples
static INLINE void filt_horz_pred(int length, uint16_t *s, const int stride,
                                  int bd, uint16_t q_thresh, int q_mult,
                                  int w_mult) {
  if (length < 1) return;
  int delta_m2 =
      (3 * (s[0] - s[-1 * stride]) - (s[stride] - s[-2 * stride])) * 4;
  const int q_thresh_clamp = q_thresh * q_mult;
  delta_m2 = clamp(delta_m2, -q_thresh_clamp, q_thresh_clamp);
  delta_m2 *= w_mult;

  for (int i = 0; i < length; i++) {
    const int offset = ROUND_POWER_OF_TWO(delta_m2 * (length - i), PEF_SHIFT);
    s[(-i - 1) * stride] = clip_pixel_highbd(s[(-i - 1) * stride] + offset, bd);
    s[i * stride] = clip_pixel_highbd(s[i * stride] - offset, bd);
  }
}

// Loop through each sample on the vertical edge
void highbd_filt_vert_pred_c(uint16_t *s, int stride, int bd, uint16_t q_thresh,
                             uint16_t side_thresh, int q_mult, int w_mult,
                             int n, int filt_len) {
  for (int i = 0; i < n; ++i) {
    const int length = derive_filter_length(s, 1, side_thresh, filt_len);
    filt_vert_pred(length, s, 1, bd, q_thresh, q_mult, w_mult);
    s += stride;
  }
}

// Loop through each sample on the horizontal edge
void highbd_filt_horz_pred_c(uint16_t *s, int stride, int bd, uint16_t q_thresh,
                             uint16_t side_thresh, int q_mult, int w_mult,
                             int n, int filt_len) {
  for (int i = 0; i < n; ++i) {
    const int length = derive_filter_length(s, stride, side_thresh, filt_len);
    filt_horz_pred(length, s, stride, bd, q_thresh, q_mult, w_mult);
    ++s;
  }
}

// setup PEF input structure
void setup_pef_input(MACROBLOCKD *xd, int pef_mode, int plane, uint16_t *dst,
                     int dst_stride, int bw, int bh, int_mv *mv_refined,
#if CONFIG_REFINEMV
                     REFINEMV_SUBMB_INFO *refinemv_subinfo,
#endif  // CONFIG_REFINEMV
                     PefFuncInput *pef_input) {
  pef_input->pef_mode = pef_mode;
  pef_input->plane = plane;
  pef_input->bw = bw;
  pef_input->bh = bh;
  pef_input->ss_x = xd->plane[plane].subsampling_x;
  pef_input->ss_y = xd->plane[plane].subsampling_y;
  pef_input->bit_depth = xd->bd;
  pef_input->dst = dst;
  pef_input->dst_stride = dst_stride;
  pef_input->mv_refined = mv_refined;
#if CONFIG_REFINEMV
  pef_input->refinemv_subinfo = refinemv_subinfo;
#endif  // CONFIG_REFINEMV
}

#if CONFIG_OPTFLOW_REFINEMENT
static INLINE int opfl_get_subblock_size(int bw, int bh, int plane) {
  return (plane || (bh <= 8 && bw <= 8)) ? OF_MIN_BSIZE : OF_BSIZE;
}
#endif  // CONFIG_OPTFLOW_REFINEMENT

// check if the neighboring mvs are the same
void check_mv(bool *diff_mv, int pef_mode, int mv_rows, int mv_cols,
              int mvs_stride, const TPL_MV_REF *tpl_mvs, int tip_step,
              int n_blocks, int_mv *mv_refined, int opfl_step
#if CONFIG_REFINEMV
              ,
              REFINEMV_SUBMB_INFO *refinemv_subinfo, int refinemv_step
#endif  // CONFIG_REFINEMV
) {
#if CONFIG_REFINEMV
  if (pef_mode < 0 || pef_mode > 3) return;
#else
  if (pef_mode < 0 || pef_mode > 2) return;
#endif                  // CONFIG_REFINEMV
  if (pef_mode == 0) {  // opfl mv
    const int_mv *cur_mv_refined_ref0 = &mv_refined[n_blocks * 2 + 0];
    const int_mv *cur_mv_refined_ref1 = &mv_refined[n_blocks * 2 + 1];
    *diff_mv =
        cur_mv_refined_ref0[0].as_int != cur_mv_refined_ref0[-opfl_step].as_int;
    *diff_mv |=
        cur_mv_refined_ref1[0].as_int != cur_mv_refined_ref1[-opfl_step].as_int;
#if CONFIG_REFINEMV
  } else if (pef_mode == 3) {  // refinemv mv
    const int_mv *cur_mv_refined_ref0 = &refinemv_subinfo->refinemv[0];
    const int_mv *cur_mv_refined_ref1 = &refinemv_subinfo->refinemv[1];
    const int_mv *prev_mv_refined_ref0 =
        &refinemv_subinfo[-refinemv_step].refinemv[0];
    const int_mv *prev_mv_refined_ref1 =
        &refinemv_subinfo[-refinemv_step].refinemv[1];
    *diff_mv = cur_mv_refined_ref0[0].as_int != prev_mv_refined_ref0[0].as_int;
    *diff_mv |= cur_mv_refined_ref1[0].as_int != prev_mv_refined_ref1[0].as_int;
#endif      // CONFIG_REFINEMV
  } else {  // tip mv
    const TPL_MV_REF *cur_tpl_mv = tpl_mvs + mv_rows * mvs_stride + mv_cols;
    const TPL_MV_REF *prev_tpl_mv = cur_tpl_mv - tip_step;
    *diff_mv = cur_tpl_mv->mfmv0.as_int != prev_tpl_mv->mfmv0.as_int;
  }
  return;
}

// main function for enhancing prediction block boundaries
static INLINE void enhance_sub_prediction_blocks(const AV1_COMMON *cm,
                                                 MACROBLOCKD *xd,
                                                 PefFuncInput *pef_input) {
  const int bw = pef_input->bw;
  const int bh = pef_input->bh;
  const int pef_mode = pef_input->pef_mode;
  if (pef_mode == 1 && (bw < PEF_MCU_SZ || bh < PEF_MCU_SZ)) return;
  const int plane = pef_input->plane;
  const int n =
#if CONFIG_OPTFLOW_REFINEMENT
      pef_mode == 0 ? opfl_get_subblock_size(bw, bh, plane) :
#endif                           // CONFIG_OPTFLOW_REFINEMENT
                    PEF_MCU_SZ;  // n is motion compensation unit size

  const int bit_depth = pef_input->bit_depth;
  const int dst_stride = pef_input->dst_stride;
  const int ss_x = pef_input->ss_x;
  const int ss_y = pef_input->ss_y;
  uint16_t *dst = pef_input->dst;

  // retrieve filter parameters
  const PefInfo *pefi = &cm->pef_info;
  const uint16_t q_horz = pefi->q_thr[plane][HORZ_EDGE];
  const uint16_t side_horz = pefi->side_thr[plane][HORZ_EDGE];
  const uint16_t q_vert = pefi->q_thr[plane][VERT_EDGE];
  const uint16_t side_vert = pefi->side_thr[plane][VERT_EDGE];
  const bool filter_horz = q_horz && side_horz;
  const bool filter_vert = q_vert && side_vert;
  if (!filter_horz && !filter_vert) return;
  const int filt_len = n == PEF_MCU_SZ ? 3 : 1;
  const int q_mult = pef_q_mult[filt_len - 1];
  const int w_mult = pef_w_mult[filt_len - 1];

  // derive blockiness location
  int x_offset = 0;
  int y_offset = 0;
  int max_tpl_row = 0;
  int max_tpl_col = 0;
  int tpl_start_row = 0;
  int tpl_start_col = 0;
  int tpl_offset = 0;
  int mvs_stride = ROUND_POWER_OF_TWO(cm->mi_params.mi_cols, TMVP_SHIFT_BITS);
  const TPL_MV_REF *tpl_mvs_base = cm->tpl_mvs;
#if CONFIG_TIP
  if (pef_mode == 1) {
    const int frame_w = xd->plane[0].dst.width;
    const int frame_h = xd->plane[0].dst.height;
    const int mi_row = xd->mi_row;
    const int mi_col = xd->mi_col;
    const MV *mv = &xd->mi[0]->mv[0].as_mv;
    const FULLPEL_MV start_mv = get_fullmv_from_mv(mv);
    int ref_start_pixel_row = (mi_row << MI_SIZE_LOG2) + start_mv.row;
    int ref_start_pixel_col = (mi_col << MI_SIZE_LOG2) + start_mv.col;
    ref_start_pixel_row = AOMMAX(0, ref_start_pixel_row);
    ref_start_pixel_col = AOMMAX(0, ref_start_pixel_col);
    ref_start_pixel_row = AOMMIN(frame_h, ref_start_pixel_row);
    ref_start_pixel_col = AOMMIN(frame_w, ref_start_pixel_col);
    x_offset = (ref_start_pixel_col >> ss_x) % n;
    y_offset = (ref_start_pixel_row >> ss_y) % n;
    if (x_offset) x_offset = n - x_offset;
    if (y_offset) y_offset = n - y_offset;

    max_tpl_row = frame_h >> TMVP_MI_SZ_LOG2;
    max_tpl_col = frame_w >> TMVP_MI_SZ_LOG2;
    tpl_start_row = ref_start_pixel_row >> TMVP_MI_SZ_LOG2;
    tpl_start_col = ref_start_pixel_col >> TMVP_MI_SZ_LOG2;
    tpl_offset = tpl_start_row * mvs_stride + tpl_start_col;
  }
#endif  // CONFIG_TIP
  const TPL_MV_REF *tpl_mvs = tpl_mvs_base + tpl_offset;

  // initialize x_step and y_step based on blockiness location
  int first_col_x_step = n;
  int last_col_x_step = n;
  int x_step = n;
  if (x_offset) {
    first_col_x_step = x_offset;
    last_col_x_step = n - x_offset;
    x_step = first_col_x_step;
  }

  int first_row_y_step = n;
  int last_row_y_step = n;
  int y_step = n;
  if (y_offset) {
    first_row_y_step = y_offset;
    last_row_y_step = n - y_offset;
    y_step = first_row_y_step;
  }

  // start filtering
  const int wn = bw / n;
  const int h = bh - last_row_y_step;
  const int w = bw - last_col_x_step;
  const int rw = bw - (bw % n);
  int prev_y_step = y_step;
  int prev_x_step = x_step;
  int n_blocks = 0;
  int mv_rows = 0;
  for (int j = 0; j <= h; j += y_step) {
    if (pef_mode == 1) {
      // update y_step based on current j
      prev_y_step = y_step;
      if (j == h)
        y_step = last_row_y_step;
      else if (j > 0)
        y_step = n;
      else  // j == 0
        y_step = first_row_y_step;
    }

    int mv_cols = 0;
    for (int i = 0; i <= w; i += x_step) {
      if (pef_mode == 1) {
        // update x_step based on current i
        prev_x_step = x_step;
        if (i == w)
          x_step = last_col_x_step;
        else if (i > 0)
          x_step = n;
        else  // i == 0
          x_step = first_col_x_step;
      }

      bool within_tpl_boundary = 1;
      if (pef_mode == 1) {
        within_tpl_boundary = (tpl_start_col + mv_cols) < max_tpl_col &&
                              (tpl_start_row + mv_rows) < max_tpl_row;
      }

      // filter vertical boundary
      if (filter_vert && i > 0 && within_tpl_boundary &&
          AOMMIN(prev_x_step, x_step) >= filt_len) {
        bool diff_mv = 0;
        check_mv(&diff_mv, pef_mode, mv_rows, mv_cols, mvs_stride, tpl_mvs, 1,
                 n_blocks, pef_input->mv_refined, 2
#if CONFIG_REFINEMV
                 ,
                 (pef_mode == 3) ? (pef_input->refinemv_subinfo +
                                    (j >> MI_SIZE_LOG2) * MAX_MIB_SIZE +
                                    (i >> MI_SIZE_LOG2))
                                 : NULL,
                 1
#endif  // CONFIG_REFINEMV
        );
        if (diff_mv) {
          filt_func filt_vert_func =
              (y_step == PEF_MCU_SZ && x_step == PEF_MCU_SZ)
                  ? highbd_filt_vert_pred
                  : highbd_filt_vert_pred_c;
          filt_vert_func(dst, dst_stride, bit_depth, q_vert, side_vert, q_mult,
                         w_mult, y_step, filt_len);
        }
      }
      // filter horizontal boundary
      if (filter_horz && j > 0 && within_tpl_boundary &&
          AOMMIN(prev_y_step, y_step) >= filt_len) {
        bool diff_mv = 0;
        check_mv(&diff_mv, pef_mode, mv_rows, mv_cols, mvs_stride, tpl_mvs,
                 mvs_stride, n_blocks, pef_input->mv_refined, wn
#if CONFIG_REFINEMV
                 ,
                 (pef_mode == 3) ? (pef_input->refinemv_subinfo +
                                    (j >> MI_SIZE_LOG2) * MAX_MIB_SIZE +
                                    (i >> MI_SIZE_LOG2))
                                 : NULL,
                 MAX_MIB_SIZE
#endif  // CONFIG_REFINEMV
        );
        if (diff_mv) {
          filt_func filt_horz_func = x_step == PEF_MCU_SZ
                                         ? highbd_filt_horz_pred
                                         : highbd_filt_horz_pred_c;
          filt_horz_func(dst, dst_stride, bit_depth, q_horz, side_horz, q_mult,
                         w_mult, x_step, filt_len);
        }
      }
      n_blocks++;
      mv_cols += (1 << ss_x);
      dst += x_step;
    }
    mv_rows += (1 << ss_y);
    dst -= rw;
    dst += y_step * dst_stride;
  }
}

#if CONFIG_TIP
// setup dst buffer for each color component
static INLINE void pef_setup_pred_plane(struct buf_2d *dst, uint16_t *src,
                                        int width, int height, int stride,
                                        int tpl_row, int tpl_col,
                                        const struct scale_factors *scale,
                                        int subsampling_x, int subsampling_y) {
  const int x = tpl_col >> subsampling_x;
  const int y = tpl_row >> subsampling_y;
  dst->buf = src + scaled_buffer_offset(x, y, stride, scale);
  dst->buf0 = src;
  dst->width = width;
  dst->height = height;
  dst->stride = stride;
}

// setup dst buffer
static AOM_INLINE void pef_component_setup_dst_planes(AV1_COMMON *const cm,
                                                      const int plane,
                                                      const int tpl_row,
                                                      const int tpl_col) {
  const YV12_BUFFER_CONFIG *src = &cm->tip_ref.tip_frame->buf;
  TIP_PLANE *const pd = &cm->tip_ref.tip_plane[plane];
  int is_uv = 0;
  int subsampling_x = 0;
  int subsampling_y = 0;
  if (plane > 0) {
    is_uv = 1;
    subsampling_x = cm->seq_params.subsampling_x;
    subsampling_y = cm->seq_params.subsampling_y;
  }
  pef_setup_pred_plane(&pd->dst, src->buffers[plane], src->crop_widths[is_uv],
                       src->crop_heights[is_uv], src->strides[is_uv], tpl_row,
                       tpl_col, NULL, subsampling_x, subsampling_y);
}

void enhance_tip_frame(AV1_COMMON *cm, MACROBLOCKD *xd) {
  const int num_planes = av1_num_planes(cm);
  for (int plane = 0; plane < num_planes; ++plane) {
    TIP *tip_ref = &cm->tip_ref;
    pef_component_setup_dst_planes(cm, plane, 0, 0);
    TIP_PLANE *const tip = &tip_ref->tip_plane[plane];
    struct buf_2d *const dst_buf = &tip->dst;
    uint16_t *const dst = dst_buf->buf;
    const int dst_stride = dst_buf->stride;
    PefFuncInput pef_input;
    setup_pef_input(xd, 2, plane, dst, dst_stride, dst_buf->width,
                    dst_buf->height, NULL,
#if CONFIG_REFINEMV

                    NULL,
#endif  // CONFIG_REFINEMV
                    &pef_input);
    enhance_sub_prediction_blocks(cm, xd, &pef_input);
  }
#if CONFIG_ALLOW_TIP_DIRECT_WITH_SUPERRES
  if (av1_superres_scaled(cm)) {
    // Upscale tip_frame and store in upsampled_tip_frame_buf
#if CONFIG_2D_SR
    av1_upscale_normative_2d_and_extend_frame(
        cm, &cm->tip_ref.tip_frame->buf, &cm->tip_ref.upscaled_tip_frame_buf);
#else
    av1_upscale_normative_and_extend_frame(cm, &cm->tip_ref.tip_frame->buf,
                                           &cm->tip_ref.upscaled_tip_frame_buf);
#endif  // CONFIG_2D_SR
  }
#endif  // CONFIG_ALLOW_TIP_DIRECT_WITH_SUPERRES
}
#endif  // CONFIG_TIP

void enhance_prediction(const AV1_COMMON *cm, MACROBLOCKD *xd, int plane,
                        uint16_t *dst, int dst_stride, int bw, int bh
#if CONFIG_OPTFLOW_REFINEMENT
                        ,
                        int_mv *const mv_refined, int use_opfl
#endif  // CONFIG_OPTFLOW_REFINEMENT
#if CONFIG_REFINEMV
                        ,
                        int use_refinemv, REFINEMV_SUBMB_INFO *refinemv_subinfo
#endif  // CONFIG_REFINEMV
) {
  if (!cm->seq_params.enable_pef) return;
  if (!cm->features.allow_pef) return;
#if CONFIG_TIP
  MB_MODE_INFO *mbmi = xd->mi[0];
  const int use_tip = is_tip_ref_frame(mbmi->ref_frame[0]);
  if (use_tip) {
    PefFuncInput pef_input;
    setup_pef_input(xd, 1, plane, dst, dst_stride, bw, bh, NULL,
#if CONFIG_REFINEMV
                    NULL,
#endif  // CONFIG_REFINEMV
                    &pef_input);
    enhance_sub_prediction_blocks(cm, xd, &pef_input);
    return;
  }
#endif  // CONFIG_TIP
#if CONFIG_OPTFLOW_REFINEMENT
  use_opfl &= (plane == 0);
  if (use_opfl) {
    PefFuncInput pef_input;
    setup_pef_input(xd, 0, plane, dst, dst_stride, bw, bh, mv_refined,
#if CONFIG_REFINEMV
                    NULL,
#endif  // CONFIG_REFINEMV
                    &pef_input);
    enhance_sub_prediction_blocks(cm, xd, &pef_input);
    return;
  }
#endif  // CONFIG_OPTFLOW_REFINEMENT
#if CONFIG_REFINEMV
  if (use_refinemv) {
    PefFuncInput pef_input;
    setup_pef_input(xd, 3, plane, dst, dst_stride, bw, bh, mv_refined,
                    refinemv_subinfo, &pef_input);
    enhance_sub_prediction_blocks(cm, xd, &pef_input);
    return;
  }
#endif  // CONFIG_REFINEMV
  return;
}
