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 12 #ifndef VP9_ENCODER_VP9_MCOMP_H_ 13 #define VP9_ENCODER_VP9_MCOMP_H_ 14 15 #include "vp9/encoder/vp9_block.h" 16 #include "vp9/encoder/vp9_variance.h" 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 // The maximum number of steps in a step search given the largest 23 // allowed initial step 24 #define MAX_MVSEARCH_STEPS 11 25 // Max full pel mv specified in the unit of full pixel 26 // Enable the use of motion vector in range [-1023, 1023]. 27 #define MAX_FULL_PEL_VAL ((1 << (MAX_MVSEARCH_STEPS - 1)) - 1) 28 // Maximum size of the first step in full pel units 29 #define MAX_FIRST_STEP (1 << (MAX_MVSEARCH_STEPS-1)) 30 // Allowed motion vector pixel distance outside image border 31 // for Block_16x16 32 #define BORDER_MV_PIXELS_B16 (16 + VP9_INTERP_EXTEND) 33 34 // motion search site 35 typedef struct search_site { 36 MV mv; 37 int offset; 38 } search_site; 39 40 typedef struct search_site_config { 41 search_site ss[8 * MAX_MVSEARCH_STEPS + 1]; 42 int ss_count; 43 int searches_per_step; 44 } search_site_config; 45 46 void vp9_init_dsmotion_compensation(search_site_config *cfg, int stride); 47 void vp9_init3smotion_compensation(search_site_config *cfg, int stride); 48 49 void vp9_set_mv_search_range(MACROBLOCK *x, const MV *mv); 50 int vp9_mv_bit_cost(const MV *mv, const MV *ref, 51 const int *mvjcost, int *mvcost[2], int weight); 52 53 // Utility to compute variance + MV rate cost for a given MV 54 int vp9_get_mvpred_var(const MACROBLOCK *x, 55 const MV *best_mv, const MV *center_mv, 56 const vp9_variance_fn_ptr_t *vfp, 57 int use_mvcost); 58 int vp9_get_mvpred_av_var(const MACROBLOCK *x, 59 const MV *best_mv, const MV *center_mv, 60 const uint8_t *second_pred, 61 const vp9_variance_fn_ptr_t *vfp, 62 int use_mvcost); 63 64 struct VP9_COMP; 65 struct SPEED_FEATURES; 66 67 int vp9_init_search_range(int size); 68 69 // Runs sequence of diamond searches in smaller steps for RD 70 int vp9_full_pixel_diamond(const struct VP9_COMP *cpi, MACROBLOCK *x, 71 MV *mvp_full, int step_param, 72 int sadpb, int further_steps, int do_refine, 73 const vp9_variance_fn_ptr_t *fn_ptr, 74 const MV *ref_mv, MV *dst_mv); 75 76 typedef int (integer_mv_pattern_search_fn) ( 77 const MACROBLOCK *x, 78 MV *ref_mv, 79 int search_param, 80 int error_per_bit, 81 int do_init_search, 82 int *sad_list, 83 const vp9_variance_fn_ptr_t *vf, 84 int use_mvcost, 85 const MV *center_mv, 86 MV *best_mv); 87 88 integer_mv_pattern_search_fn vp9_hex_search; 89 integer_mv_pattern_search_fn vp9_bigdia_search; 90 integer_mv_pattern_search_fn vp9_square_search; 91 integer_mv_pattern_search_fn vp9_fast_hex_search; 92 integer_mv_pattern_search_fn vp9_fast_dia_search; 93 94 typedef int (fractional_mv_step_fp) ( 95 const MACROBLOCK *x, 96 MV *bestmv, const MV *ref_mv, 97 int allow_hp, 98 int error_per_bit, 99 const vp9_variance_fn_ptr_t *vfp, 100 int forced_stop, // 0 - full, 1 - qtr only, 2 - half only 101 int iters_per_step, 102 int *sad_list, 103 int *mvjcost, int *mvcost[2], 104 int *distortion, unsigned int *sse1, 105 const uint8_t *second_pred, 106 int w, int h); 107 108 extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree; 109 extern fractional_mv_step_fp vp9_find_best_sub_pixel_tree_pruned; 110 111 typedef int (*vp9_full_search_fn_t)(const MACROBLOCK *x, 112 const MV *ref_mv, int sad_per_bit, 113 int distance, 114 const vp9_variance_fn_ptr_t *fn_ptr, 115 const MV *center_mv, MV *best_mv); 116 117 typedef int (*vp9_refining_search_fn_t)(const MACROBLOCK *x, 118 MV *ref_mv, int sad_per_bit, 119 int distance, 120 const vp9_variance_fn_ptr_t *fn_ptr, 121 const MV *center_mv); 122 123 typedef int (*vp9_diamond_search_fn_t)(const MACROBLOCK *x, 124 const search_site_config *cfg, 125 MV *ref_mv, MV *best_mv, 126 int search_param, int sad_per_bit, 127 int *num00, 128 const vp9_variance_fn_ptr_t *fn_ptr, 129 const MV *center_mv); 130 131 int vp9_refining_search_8p_c(const MACROBLOCK *x, 132 MV *ref_mv, int error_per_bit, 133 int search_range, 134 const vp9_variance_fn_ptr_t *fn_ptr, 135 const MV *center_mv, const uint8_t *second_pred); 136 137 struct VP9_COMP; 138 139 int vp9_full_pixel_search(struct VP9_COMP *cpi, MACROBLOCK *x, 140 BLOCK_SIZE bsize, MV *mvp_full, 141 int step_param, int error_per_bit, 142 int *sad_list, 143 const MV *ref_mv, MV *tmp_mv, 144 int var_max, int rd); 145 146 #ifdef __cplusplus 147 } // extern "C" 148 #endif 149 150 #endif // VP9_ENCODER_VP9_MCOMP_H_ 151