1 /***************************************************************************** 2 * me.h: motion estimation 3 ***************************************************************************** 4 * Copyright (C) 2003-2014 x264 project 5 * 6 * Authors: Loren Merritt <lorenm@u.washington.edu> 7 * Laurent Aimar <fenrir@via.ecp.fr> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. 22 * 23 * This program is also available under a commercial proprietary license. 24 * For more information, contact us at licensing@x264.com. 25 *****************************************************************************/ 26 27 #ifndef X264_ME_H 28 #define X264_ME_H 29 30 #define COST_MAX (1<<28) 31 #define COST_MAX64 (ULLN(1)<<60) 32 33 typedef struct 34 { 35 /* aligning the first member is a gcc hack to force the struct to be 36 * 16 byte aligned, as well as force sizeof(struct) to be a multiple of 16 */ 37 /* input */ 38 ALIGNED_16( int i_pixel ); /* PIXEL_WxH */ 39 uint16_t *p_cost_mv; /* lambda * nbits for each possible mv */ 40 int i_ref_cost; 41 int i_ref; 42 const x264_weight_t *weight; 43 44 pixel *p_fref[12]; 45 pixel *p_fref_w; 46 pixel *p_fenc[3]; 47 uint16_t *integral; 48 int i_stride[3]; 49 50 ALIGNED_4( int16_t mvp[2] ); 51 52 /* output */ 53 int cost_mv; /* lambda * nbits for the chosen mv */ 54 int cost; /* satd + lambda * nbits */ 55 ALIGNED_4( int16_t mv[2] ); 56 } ALIGNED_16( x264_me_t ); 57 58 typedef struct 59 { 60 int sad; 61 int16_t mv[2]; 62 } mvsad_t; 63 64 void x264_me_search_ref( x264_t *h, x264_me_t *m, int16_t (*mvc)[2], int i_mvc, int *p_fullpel_thresh ); 65 #define x264_me_search( h, m, mvc, i_mvc )\ 66 x264_me_search_ref( h, m, mvc, i_mvc, NULL ) 67 68 void x264_me_refine_qpel( x264_t *h, x264_me_t *m ); 69 void x264_me_refine_qpel_refdupe( x264_t *h, x264_me_t *m, int *p_halfpel_thresh ); 70 void x264_me_refine_qpel_rd( x264_t *h, x264_me_t *m, int i_lambda2, int i4, int i_list ); 71 void x264_me_refine_bidir_rd( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight, int i8, int i_lambda2 ); 72 void x264_me_refine_bidir_satd( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight ); 73 uint64_t x264_rd_cost_part( x264_t *h, int i_lambda2, int i8, int i_pixel ); 74 75 extern uint16_t *x264_cost_mv_fpel[QP_MAX+1][4]; 76 77 #define COPY1_IF_LT(x,y)\ 78 if((y)<(x))\ 79 (x)=(y); 80 81 #define COPY2_IF_LT(x,y,a,b)\ 82 if((y)<(x))\ 83 {\ 84 (x)=(y);\ 85 (a)=(b);\ 86 } 87 88 #define COPY3_IF_LT(x,y,a,b,c,d)\ 89 if((y)<(x))\ 90 {\ 91 (x)=(y);\ 92 (a)=(b);\ 93 (c)=(d);\ 94 } 95 96 #define COPY4_IF_LT(x,y,a,b,c,d,e,f)\ 97 if((y)<(x))\ 98 {\ 99 (x)=(y);\ 100 (a)=(b);\ 101 (c)=(d);\ 102 (e)=(f);\ 103 } 104 105 #define COPY2_IF_GT(x,y,a,b)\ 106 if((y)>(x))\ 107 {\ 108 (x)=(y);\ 109 (a)=(b);\ 110 } 111 112 #endif 113