me.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*****************************************************************************
  2. * me.h: motion estimation
  3. *****************************************************************************
  4. * Copyright (C) 2003-2018 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. #ifndef X264_ENCODER_ME_H
  27. #define X264_ENCODER_ME_H
  28. #define COST_MAX (1<<28)
  29. #define COST_MAX64 (1ULL<<60)
  30. typedef struct
  31. {
  32. /* aligning the first member is a gcc hack to force the struct to be aligned,
  33. * as well as force sizeof(struct) to be a multiple of the alignment. */
  34. /* input */
  35. ALIGNED_64( int i_pixel ); /* PIXEL_WxH */
  36. uint16_t *p_cost_mv; /* lambda * nbits for each possible mv */
  37. int i_ref_cost;
  38. int i_ref;
  39. const x264_weight_t *weight;
  40. pixel *p_fref[12];
  41. pixel *p_fref_w;
  42. pixel *p_fenc[3];
  43. uint16_t *integral;
  44. int i_stride[3];
  45. ALIGNED_4( int16_t mvp[2] );
  46. /* output */
  47. int cost_mv; /* lambda * nbits for the chosen mv */
  48. int cost; /* satd + lambda * nbits */
  49. ALIGNED_4( int16_t mv[2] );
  50. } ALIGNED_64( x264_me_t );
  51. #define x264_me_search_ref x264_template(me_search_ref)
  52. void x264_me_search_ref( x264_t *h, x264_me_t *m, int16_t (*mvc)[2], int i_mvc, int *p_fullpel_thresh );
  53. #define x264_me_search( h, m, mvc, i_mvc )\
  54. x264_me_search_ref( h, m, mvc, i_mvc, NULL )
  55. #define x264_me_refine_qpel x264_template(me_refine_qpel)
  56. void x264_me_refine_qpel( x264_t *h, x264_me_t *m );
  57. #define x264_me_refine_qpel_refdupe x264_template(me_refine_qpel_refdupe)
  58. void x264_me_refine_qpel_refdupe( x264_t *h, x264_me_t *m, int *p_halfpel_thresh );
  59. #define x264_me_refine_qpel_rd x264_template(me_refine_qpel_rd)
  60. void x264_me_refine_qpel_rd( x264_t *h, x264_me_t *m, int i_lambda2, int i4, int i_list );
  61. #define x264_me_refine_bidir_rd x264_template(me_refine_bidir_rd)
  62. 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 );
  63. #define x264_me_refine_bidir_satd x264_template(me_refine_bidir_satd)
  64. void x264_me_refine_bidir_satd( x264_t *h, x264_me_t *m0, x264_me_t *m1, int i_weight );
  65. #define x264_rd_cost_part x264_template(rd_cost_part)
  66. uint64_t x264_rd_cost_part( x264_t *h, int i_lambda2, int i8, int i_pixel );
  67. #define COPY1_IF_LT(x,y)\
  68. if( (y) < (x) )\
  69. (x) = (y);
  70. #define COPY2_IF_LT(x,y,a,b)\
  71. if( (y) < (x) )\
  72. {\
  73. (x) = (y);\
  74. (a) = (b);\
  75. }
  76. #define COPY3_IF_LT(x,y,a,b,c,d)\
  77. if( (y) < (x) )\
  78. {\
  79. (x) = (y);\
  80. (a) = (b);\
  81. (c) = (d);\
  82. }
  83. #define COPY4_IF_LT(x,y,a,b,c,d,e,f)\
  84. if( (y) < (x) )\
  85. {\
  86. (x) = (y);\
  87. (a) = (b);\
  88. (c) = (d);\
  89. (e) = (f);\
  90. }
  91. #define COPY2_IF_GT(x,y,a,b)\
  92. if( (y) > (x) )\
  93. {\
  94. (x) = (y);\
  95. (a) = (b);\
  96. }
  97. #endif