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