1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef VP9_COMMON_VP9_RECONINTER_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_COMMON_VP9_RECONINTER_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vp9/common/vp9_filter.h"
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h"
16da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx/vpx_integer.h"
17da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx_dsp/vpx_filter.h"
18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianextern "C" {
212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
23da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianstatic INLINE void inter_predictor(const uint8_t *src, int src_stride,
24da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   uint8_t *dst, int dst_stride,
25da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   const int subpel_x,
26da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   const int subpel_y,
27da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   const struct scale_factors *sf,
28da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   int w, int h, int ref,
29da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   const InterpKernel *kernel,
30da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                   int xs, int ys) {
31da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  sf->predict[subpel_x != 0][subpel_y != 0][ref](
32da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      src, src_stride, dst, dst_stride,
33da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      kernel[subpel_x], xs, kernel[subpel_y], ys, w, h);
34da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
35da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
36da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
37da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid high_inter_predictor(const uint8_t *src, int src_stride,
38da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 uint8_t *dst, int dst_stride,
39da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 const int subpel_x,
40da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 const int subpel_y,
41da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 const struct scale_factors *sf,
42da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 int w, int h, int ref,
43da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 const InterpKernel *kernel,
44da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                 int xs, int ys, int bd);
45da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
46da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
47da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianMV average_split_mvs(const struct macroblockd_plane *pd, const MODE_INFO *mi,
48da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                     int ref, int block);
49da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
50da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianMV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd, const MV *src_mv,
51da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                             int bw, int bh, int ss_x, int ss_y);
52da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
531184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_build_inter_predictors_sby(MACROBLOCKD *xd, int mi_row, int mi_col,
541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                                    BLOCK_SIZE bsize);
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
56da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_build_inter_predictors_sbp(MACROBLOCKD *xd, int mi_row, int mi_col,
57da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                    BLOCK_SIZE bsize, int plane);
58da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
591184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_build_inter_predictors_sbuv(MACROBLOCKD *xd, int mi_row, int mi_col,
601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                                     BLOCK_SIZE bsize);
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
621184aebb761cbeac9124c37189a80a1a58f04b6bhkuangvoid vp9_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col,
631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang                                   BLOCK_SIZE bsize);
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_build_inter_predictor(const uint8_t *src, int src_stride,
66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               uint8_t *dst, int dst_stride,
67f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang                               const MV *mv_q3,
682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                               const struct scale_factors *sf,
69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                               int w, int h, int do_avg,
702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                               const InterpKernel *kernel,
712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                               enum mv_precision precision,
722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                               int x, int y);
732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
74da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
75da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid vp9_highbd_build_inter_predictor(const uint8_t *src, int src_stride,
76da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      uint8_t *dst, int dst_stride,
77da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      const MV *mv_q3,
78da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      const struct scale_factors *sf,
79da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      int w, int h, int do_avg,
80da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      const InterpKernel *kernel,
81da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      enum mv_precision precision,
82da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                      int x, int y, int bd);
83da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
84da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic INLINE int scaled_buffer_offset(int x_offset, int y_offset, int stride,
862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                       const struct scale_factors *sf) {
872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const int x = sf ? sf->scale_value_x(x_offset, sf) : x_offset;
882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  const int y = sf ? sf->scale_value_y(y_offset, sf) : y_offset;
89ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  return y * stride + x;
90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstatic INLINE void setup_pred_plane(struct buf_2d *dst,
932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                    uint8_t *src, int stride,
942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                    int mi_row, int mi_col,
952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                    const struct scale_factors *scale,
962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                    int subsampling_x, int subsampling_y) {
97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int x = (MI_SIZE * mi_col) >> subsampling_x;
98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  const int y = (MI_SIZE * mi_row) >> subsampling_y;
99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  dst->buf = src + scaled_buffer_offset(x, y, stride, scale);
100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  dst->stride = stride;
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}
102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
103ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid vp9_setup_dst_planes(struct macroblockd_plane planes[MAX_MB_PLANE],
104ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                          const YV12_BUFFER_CONFIG *src,
1052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                          int mi_row, int mi_col);
106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vp9_setup_pre_planes(MACROBLOCKD *xd, int idx,
1082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                          const YV12_BUFFER_CONFIG *src, int mi_row, int mi_col,
1092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                          const struct scale_factors *sf);
110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
1122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}  // extern "C"
1132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
114ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_COMMON_VP9_RECONINTER_H_
116