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_ENCODER_VP9_MCOMP_H_
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define VP9_ENCODER_VP9_MCOMP_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/encoder/vp9_block.h"
157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_dsp/variance.h"
16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianextern "C" {
192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// The maximum number of steps in a step search given the largest
22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// allowed initial step
23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAX_MVSEARCH_STEPS 11
242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Max full pel mv specified in the unit of full pixel
252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Enable the use of motion vector in range [-1023, 1023].
262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define MAX_FULL_PEL_VAL ((1 << (MAX_MVSEARCH_STEPS - 1)) - 1)
27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang// Maximum size of the first step in full pel units
287bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define MAX_FIRST_STEP (1 << (MAX_MVSEARCH_STEPS - 1))
295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Allowed motion vector pixel distance outside image border
305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for Block_16x16
315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define BORDER_MV_PIXELS_B16 (16 + VP9_INTERP_EXTEND)
325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef struct search_site_config {
3468e1c830ade592be74773e249bf94e2bbfb50de7Johann  // motion search sites
357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  MV ss_mv[8 * MAX_MVSEARCH_STEPS];        // Motion vector
367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  intptr_t ss_os[8 * MAX_MVSEARCH_STEPS];  // Offset
37ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  int searches_per_step;
3868e1c830ade592be74773e249bf94e2bbfb50de7Johann  int total_steps;
39ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} search_site_config;
40ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid vp9_init_dsmotion_compensation(search_site_config *cfg, int stride);
427bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp9_init3smotion_compensation(search_site_config *cfg, int stride);
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
447bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp9_set_mv_search_range(MvLimits *mv_limits, const MV *mv);
457bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_mv_bit_cost(const MV *mv, const MV *ref, const int *mvjcost,
467bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    int *mvcost[2], int weight);
472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// Utility to compute variance + MV rate cost for a given MV
497bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_get_mvpred_var(const MACROBLOCK *x, const MV *best_mv,
507bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       const MV *center_mv, const vp9_variance_fn_ptr_t *vfp,
512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                       int use_mvcost);
527bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_get_mvpred_av_var(const MACROBLOCK *x, const MV *best_mv,
537bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          const MV *center_mv, const uint8_t *second_pred,
547bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          const vp9_variance_fn_ptr_t *vfp, int use_mvcost);
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct VP9_COMP;
57ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstruct SPEED_FEATURES;
58ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
59ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianint vp9_init_search_range(int size);
6091037db265ecdd914a26e056cf69207b4f50924ehkuang
617bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_refining_search_sad(const struct macroblock *x, struct mv *ref_mv,
627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            int sad_per_bit, int distance,
637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            const struct vp9_variance_vtable *fn_ptr,
647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                            const struct mv *center_mv);
657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// Perform integral projection based motion estimation.
677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianunsigned int vp9_int_pro_motion_estimation(const struct VP9_COMP *cpi,
687bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                           MACROBLOCK *x, BLOCK_SIZE bsize,
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                           int mi_row, int mi_col);
707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
717bc9febe8749e98a3812a0dc4380ceae75c29450Johanntypedef uint32_t(fractional_mv_step_fp)(
727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    const MACROBLOCK *x, MV *bestmv, const MV *ref_mv, int allow_hp,
737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int error_per_bit, const vp9_variance_fn_ptr_t *vfp,
741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang    int forced_stop,  // 0 - full, 1 - qtr only, 2 - half only
757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int iters_per_step, int *cost_list, int *mvjcost, int *mvcost[2],
767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    uint32_t *distortion, uint32_t *sse1, const uint8_t *second_pred, int w,
777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int h);
782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
79ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianextern fractional_mv_step_fp vp9_find_best_sub_pixel_tree;
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianextern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned;
817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianextern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_more;
827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianextern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned_evenmore;
8368e1c830ade592be74773e249bf94e2bbfb50de7Johannextern fractional_mv_step_fp vp9_skip_sub_pixel_tree;
840a39d0a697ff3603e8c100300fda363658e10b23James Zernextern fractional_mv_step_fp vp9_return_max_sub_pixel_mv;
850a39d0a697ff3603e8c100300fda363658e10b23James Zernextern fractional_mv_step_fp vp9_return_min_sub_pixel_mv;
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
877bc9febe8749e98a3812a0dc4380ceae75c29450Johanntypedef int (*vp9_full_search_fn_t)(const MACROBLOCK *x, const MV *ref_mv,
887bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                    int sad_per_bit, int distance,
892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                    const vp9_variance_fn_ptr_t *fn_ptr,
902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                    const MV *center_mv, MV *best_mv);
91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
927bc9febe8749e98a3812a0dc4380ceae75c29450Johanntypedef int (*vp9_refining_search_fn_t)(const MACROBLOCK *x, MV *ref_mv,
937bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        int sad_per_bit, int distance,
942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                        const vp9_variance_fn_ptr_t *fn_ptr,
952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                                        const MV *center_mv);
96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
977bc9febe8749e98a3812a0dc4380ceae75c29450Johanntypedef int (*vp9_diamond_search_fn_t)(
987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    const MACROBLOCK *x, const search_site_config *cfg, MV *ref_mv, MV *best_mv,
997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int search_param, int sad_per_bit, int *num00,
1007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    const vp9_variance_fn_ptr_t *fn_ptr, const MV *center_mv);
101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1027bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_refining_search_8p_c(const MACROBLOCK *x, MV *ref_mv, int error_per_bit,
1032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                             int search_range,
1042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian                             const vp9_variance_fn_ptr_t *fn_ptr,
105ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                             const MV *center_mv, const uint8_t *second_pred);
106ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
107ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianstruct VP9_COMP;
108ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
1097bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp9_full_pixel_search(struct VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bsize,
1100a39d0a697ff3603e8c100300fda363658e10b23James Zern                          MV *mvp_full, int step_param, int search_method,
1110a39d0a697ff3603e8c100300fda363658e10b23James Zern                          int error_per_bit, int *cost_list, const MV *ref_mv,
1120a39d0a697ff3603e8c100300fda363658e10b23James Zern                          MV *tmp_mv, int var_max, int rd);
1130a39d0a697ff3603e8c100300fda363658e10b23James Zern
1140a39d0a697ff3603e8c100300fda363658e10b23James Zernvoid vp9_set_subpel_mv_search_range(MvLimits *subpel_mv_limits,
1150a39d0a697ff3603e8c100300fda363658e10b23James Zern                                    const MvLimits *umv_window_limits,
1160a39d0a697ff3603e8c100300fda363658e10b23James Zern                                    const MV *ref_mv);
1177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus
1192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}  // extern "C"
1202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif
1212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // VP9_ENCODER_VP9_MCOMP_H_
123