Home | History | Annotate | Download | only in common
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef VP9_COMMON_VP9_RECONINTER_H_
     12 #define VP9_COMMON_VP9_RECONINTER_H_
     13 
     14 #include "vp9/common/vp9_filter.h"
     15 #include "vp9/common/vp9_onyxc_int.h"
     16 #include "vpx/vpx_integer.h"
     17 #include "vpx_dsp/vpx_filter.h"
     18 
     19 #ifdef __cplusplus
     20 extern "C" {
     21 #endif
     22 
     23 static INLINE void inter_predictor(const uint8_t *src, int src_stride,
     24                                    uint8_t *dst, int dst_stride,
     25                                    const int subpel_x, const int subpel_y,
     26                                    const struct scale_factors *sf, int w, int h,
     27                                    int ref, const InterpKernel *kernel, int xs,
     28                                    int ys) {
     29   sf->predict[subpel_x != 0][subpel_y != 0][ref](src, src_stride, dst,
     30                                                  dst_stride, kernel, subpel_x,
     31                                                  xs, subpel_y, ys, w, h);
     32 }
     33 
     34 #if CONFIG_VP9_HIGHBITDEPTH
     35 static INLINE void highbd_inter_predictor(
     36     const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride,
     37     const int subpel_x, const int subpel_y, const struct scale_factors *sf,
     38     int w, int h, int ref, const InterpKernel *kernel, int xs, int ys, int bd) {
     39   sf->highbd_predict[subpel_x != 0][subpel_y != 0][ref](
     40       src, src_stride, dst, dst_stride, kernel, subpel_x, xs, subpel_y, ys, w,
     41       h, bd);
     42 }
     43 #endif  // CONFIG_VP9_HIGHBITDEPTH
     44 
     45 MV average_split_mvs(const struct macroblockd_plane *pd, const MODE_INFO *mi,
     46                      int ref, int block);
     47 
     48 MV clamp_mv_to_umv_border_sb(const MACROBLOCKD *xd, const MV *src_mv, int bw,
     49                              int bh, int ss_x, int ss_y);
     50 
     51 void vp9_build_inter_predictors_sby(MACROBLOCKD *xd, int mi_row, int mi_col,
     52                                     BLOCK_SIZE bsize);
     53 
     54 void vp9_build_inter_predictors_sbp(MACROBLOCKD *xd, int mi_row, int mi_col,
     55                                     BLOCK_SIZE bsize, int plane);
     56 
     57 void vp9_build_inter_predictors_sbuv(MACROBLOCKD *xd, int mi_row, int mi_col,
     58                                      BLOCK_SIZE bsize);
     59 
     60 void vp9_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col,
     61                                    BLOCK_SIZE bsize);
     62 
     63 void vp9_build_inter_predictor(const uint8_t *src, int src_stride, uint8_t *dst,
     64                                int dst_stride, const MV *mv_q3,
     65                                const struct scale_factors *sf, int w, int h,
     66                                int do_avg, const InterpKernel *kernel,
     67                                enum mv_precision precision, int x, int y);
     68 
     69 #if CONFIG_VP9_HIGHBITDEPTH
     70 void vp9_highbd_build_inter_predictor(
     71     const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride,
     72     const MV *mv_q3, const struct scale_factors *sf, int w, int h, int do_avg,
     73     const InterpKernel *kernel, enum mv_precision precision, int x, int y,
     74     int bd);
     75 #endif
     76 
     77 static INLINE int scaled_buffer_offset(int x_offset, int y_offset, int stride,
     78                                        const struct scale_factors *sf) {
     79   const int x = sf ? sf->scale_value_x(x_offset, sf) : x_offset;
     80   const int y = sf ? sf->scale_value_y(y_offset, sf) : y_offset;
     81   return y * stride + x;
     82 }
     83 
     84 static INLINE void setup_pred_plane(struct buf_2d *dst, uint8_t *src,
     85                                     int stride, int mi_row, int mi_col,
     86                                     const struct scale_factors *scale,
     87                                     int subsampling_x, int subsampling_y) {
     88   const int x = (MI_SIZE * mi_col) >> subsampling_x;
     89   const int y = (MI_SIZE * mi_row) >> subsampling_y;
     90   dst->buf = src + scaled_buffer_offset(x, y, stride, scale);
     91   dst->stride = stride;
     92 }
     93 
     94 void vp9_setup_dst_planes(struct macroblockd_plane planes[MAX_MB_PLANE],
     95                           const YV12_BUFFER_CONFIG *src, int mi_row,
     96                           int mi_col);
     97 
     98 void vp9_setup_pre_planes(MACROBLOCKD *xd, int idx,
     99                           const YV12_BUFFER_CONFIG *src, int mi_row, int mi_col,
    100                           const struct scale_factors *sf);
    101 
    102 #ifdef __cplusplus
    103 }  // extern "C"
    104 #endif
    105 
    106 #endif  // VP9_COMMON_VP9_RECONINTER_H_
    107