me_distortion.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:46k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2. *************************************************************************************
  3. * file me_distortion.c
  4. *
  5. * brief
  6. *    Motion estimation error calculation functions
  7. *
  8. * author
  9. *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10. *      - Alexis Michael Tourapis <alexis.tourapis@dolby.com>
  11. *      - Athanasios Leontaris    <aleon@dolby.com>
  12. *
  13. *************************************************************************************
  14. */
  15. #include "contributors.h"
  16. #include <limits.h>
  17. #include "global.h"
  18. #include "image.h"
  19. #include "memalloc.h"
  20. #include "mb_access.h"
  21. #include "refbuf.h"
  22. #include "mv-search.h"
  23. #include "me_distortion.h"
  24. // Define Global Parameters
  25. // Luma
  26. imgpel *(*get_line[2]) (imgpel****, int, int);
  27. imgpel *(*get_line1[2]) (imgpel****, int, int);
  28. imgpel *(*get_line2[2]) (imgpel****, int, int);
  29. // Chroma
  30. imgpel *(*get_crline[2]) (imgpel****, int, int);
  31. imgpel *(*get_crline1[2]) (imgpel****, int, int);
  32. imgpel *(*get_crline2[2]) (imgpel****, int, int);
  33. // Access method (fast/safe or unconstrained)
  34. int ref_access_method;
  35. int bipred1_access_method;
  36. int bipred2_access_method;
  37. SubImageContainer ref_pic_sub;
  38. SubImageContainer ref_pic1_sub;
  39. SubImageContainer ref_pic2_sub;
  40. short weight1, weight2, offsetBi;
  41. short weight1_cr[2], weight2_cr[2], offsetBi_cr[2];
  42. int weight_luma, weight_cr[2], offset_luma, offset_cr[2];
  43. short img_width, img_height;
  44. int test8x8transform;
  45. int ChromaMEEnable;
  46. // temp storage of pixel difference values prior to applying Hadamard Transform (4x4 or 8x8)
  47. static int diff[MB_PIXELS];
  48. // Hadamard related arrays
  49. static int m[16], d[16];
  50. static int m1[8][8], m2[8][8], m3[8][8];
  51. static imgpel *src_line, *ref_line, *ref1_line, *ref2_line;
  52. int (*computeUniPred[6])(imgpel* , int , int , int , int , int);
  53. int (*computeBiPred) (imgpel* , int , int , int , int , int, int , int);
  54. int (*computeBiPred1[3])(imgpel* , int , int , int , int , int, int , int);
  55. int (*computeBiPred2[3])(imgpel* , int , int , int , int , int, int , int);
  56. /*!
  57.  ***********************************************************************
  58.  * brief
  59.  *    Calculate SA(T)D
  60.  ***********************************************************************
  61.  */
  62. int distortion4x4(int* diff)
  63. {
  64.   int distortion = 0, k, *byte_sse;
  65.   switch(params->ModeDecisionMetric)
  66.   {
  67.   case ERROR_SAD:
  68.     for (k = 0; k < 16; k++)
  69.     {
  70.       distortion += byte_abs [diff [k]];
  71.     }
  72.     break;
  73.   case ERROR_SSE:
  74.     byte_sse = img->quad;
  75.     for (k = 0; k < 16; k++)
  76.     {
  77.       distortion += byte_sse [diff [k]];
  78.     }
  79.     break;
  80.   case ERROR_SATD :
  81.   default:
  82.     distortion = HadamardSAD4x4( diff );
  83.     break;
  84.   }
  85.   return distortion;
  86. }
  87. /*!
  88.  ***********************************************************************
  89.  * brief
  90.  *    Calculate SA(T)D for 8x8
  91.  ***********************************************************************
  92.  */
  93. int distortion8x8(int* diff)
  94. {
  95.   int distortion = 0, k, *byte_sse;
  96.   switch(params->ModeDecisionMetric)
  97.   {
  98.   case ERROR_SAD:
  99.     for (k = 0; k < 64; k++)
  100.     {
  101.       distortion += byte_abs [diff [k]];
  102.     }
  103.     break;
  104.   case ERROR_SSE:
  105.     byte_sse = img->quad;
  106.     for (k = 0; k < 64; k++)
  107.     {
  108.       distortion += byte_sse [diff [k]];
  109.     }
  110.     break;
  111.   case ERROR_SATD :
  112.   default:
  113.     distortion = HadamardSAD8x8( diff );
  114.     break;
  115.   }
  116.   return distortion;
  117. }
  118. /*!
  119.  ***********************************************************************
  120.  * brief
  121.  *    Calculate SA(T)D for 8x8
  122.  ***********************************************************************
  123.  */
  124. int HadamardMB (int c_diff[MB_PIXELS], int blocktype)
  125. {
  126.   int sad=0;
  127.   switch(blocktype)
  128.   {
  129.     //16x16
  130.   case 1:
  131.     sad  = HadamardSAD8x8( c_diff     );
  132.     sad += HadamardSAD8x8(&c_diff[ 64]);
  133.     sad += HadamardSAD8x8(&c_diff[128]);
  134.     sad += HadamardSAD8x8(&c_diff[192]);
  135.     break;
  136.     //16x8 8x16
  137.   case 2:
  138.   case 3:
  139.     sad  = HadamardSAD8x8( c_diff    );
  140.     sad += HadamardSAD8x8(&c_diff[64]);
  141.     break;
  142.     //8x8
  143.   case 4:
  144.     sad  = HadamardSAD8x8(c_diff);
  145.     break;
  146.     //8x4 4x8
  147.   default:
  148.     sad=-1;
  149.     break;
  150.   }
  151.   return sad;
  152. }
  153. /*!
  154. ***********************************************************************
  155. * brief
  156. *    Calculate 4x4 Hadamard-Transformed SAD
  157. ***********************************************************************
  158. */
  159. int HadamardSAD4x4 (int* diff)
  160. {
  161.   int k, satd = 0;
  162.   /*===== hadamard transform =====*/
  163.   m[ 0] = diff[ 0] + diff[12];
  164.   m[ 1] = diff[ 1] + diff[13];
  165.   m[ 2] = diff[ 2] + diff[14];
  166.   m[ 3] = diff[ 3] + diff[15];
  167.   m[ 4] = diff[ 4] + diff[ 8];
  168.   m[ 5] = diff[ 5] + diff[ 9];
  169.   m[ 6] = diff[ 6] + diff[10];
  170.   m[ 7] = diff[ 7] + diff[11];
  171.   m[ 8] = diff[ 4] - diff[ 8];
  172.   m[ 9] = diff[ 5] - diff[ 9];
  173.   m[10] = diff[ 6] - diff[10];
  174.   m[11] = diff[ 7] - diff[11];
  175.   m[12] = diff[ 0] - diff[12];
  176.   m[13] = diff[ 1] - diff[13];
  177.   m[14] = diff[ 2] - diff[14];
  178.   m[15] = diff[ 3] - diff[15];
  179.   d[ 0] = m[ 0] + m[ 4];
  180.   d[ 1] = m[ 1] + m[ 5];
  181.   d[ 2] = m[ 2] + m[ 6];
  182.   d[ 3] = m[ 3] + m[ 7];
  183.   d[ 4] = m[ 8] + m[12];
  184.   d[ 5] = m[ 9] + m[13];
  185.   d[ 6] = m[10] + m[14];
  186.   d[ 7] = m[11] + m[15];
  187.   d[ 8] = m[ 0] - m[ 4];
  188.   d[ 9] = m[ 1] - m[ 5];
  189.   d[10] = m[ 2] - m[ 6];
  190.   d[11] = m[ 3] - m[ 7];
  191.   d[12] = m[12] - m[ 8];
  192.   d[13] = m[13] - m[ 9];
  193.   d[14] = m[14] - m[10];
  194.   d[15] = m[15] - m[11];
  195.   m[ 0] = d[ 0] + d[ 3];
  196.   m[ 1] = d[ 1] + d[ 2];
  197.   m[ 2] = d[ 1] - d[ 2];
  198.   m[ 3] = d[ 0] - d[ 3];
  199.   m[ 4] = d[ 4] + d[ 7];
  200.   m[ 5] = d[ 5] + d[ 6];
  201.   m[ 6] = d[ 5] - d[ 6];
  202.   m[ 7] = d[ 4] - d[ 7];
  203.   m[ 8] = d[ 8] + d[11];
  204.   m[ 9] = d[ 9] + d[10];
  205.   m[10] = d[ 9] - d[10];
  206.   m[11] = d[ 8] - d[11];
  207.   m[12] = d[12] + d[15];
  208.   m[13] = d[13] + d[14];
  209.   m[14] = d[13] - d[14];
  210.   m[15] = d[12] - d[15];
  211.   d[ 0] = m[ 0] + m[ 1];
  212.   d[ 1] = m[ 0] - m[ 1];
  213.   d[ 2] = m[ 2] + m[ 3];
  214.   d[ 3] = m[ 3] - m[ 2];
  215.   d[ 4] = m[ 4] + m[ 5];
  216.   d[ 5] = m[ 4] - m[ 5];
  217.   d[ 6] = m[ 6] + m[ 7];
  218.   d[ 7] = m[ 7] - m[ 6];
  219.   d[ 8] = m[ 8] + m[ 9];
  220.   d[ 9] = m[ 8] - m[ 9];
  221.   d[10] = m[10] + m[11];
  222.   d[11] = m[11] - m[10];
  223.   d[12] = m[12] + m[13];
  224.   d[13] = m[12] - m[13];
  225.   d[14] = m[14] + m[15];
  226.   d[15] = m[15] - m[14];
  227.   //===== sum up =====
  228.   // Table lookup is faster than abs macro
  229.   for (k=0; k<16; ++k)
  230.   {
  231.     satd += byte_abs [d [k]];
  232.   }
  233.   return ((satd+1)>>1);
  234. }
  235. /*!
  236. ***********************************************************************
  237. * brief
  238. *    Calculate 8x8 Hadamard-Transformed SAD
  239. ***********************************************************************
  240. */
  241. int HadamardSAD8x8 (int* diff)
  242. {
  243.   int i, j, jj, sad=0;
  244.   //horizontal
  245.   for (j=0; j < 8; j++)
  246.   {
  247.     jj = j << 3;
  248.     m2[j][0] = diff[jj  ] + diff[jj+4];
  249.     m2[j][1] = diff[jj+1] + diff[jj+5];
  250.     m2[j][2] = diff[jj+2] + diff[jj+6];
  251.     m2[j][3] = diff[jj+3] + diff[jj+7];
  252.     m2[j][4] = diff[jj  ] - diff[jj+4];
  253.     m2[j][5] = diff[jj+1] - diff[jj+5];
  254.     m2[j][6] = diff[jj+2] - diff[jj+6];
  255.     m2[j][7] = diff[jj+3] - diff[jj+7];
  256.     m1[j][0] = m2[j][0] + m2[j][2];
  257.     m1[j][1] = m2[j][1] + m2[j][3];
  258.     m1[j][2] = m2[j][0] - m2[j][2];
  259.     m1[j][3] = m2[j][1] - m2[j][3];
  260.     m1[j][4] = m2[j][4] + m2[j][6];
  261.     m1[j][5] = m2[j][5] + m2[j][7];
  262.     m1[j][6] = m2[j][4] - m2[j][6];
  263.     m1[j][7] = m2[j][5] - m2[j][7];
  264.     m2[j][0] = m1[j][0] + m1[j][1];
  265.     m2[j][1] = m1[j][0] - m1[j][1];
  266.     m2[j][2] = m1[j][2] + m1[j][3];
  267.     m2[j][3] = m1[j][2] - m1[j][3];
  268.     m2[j][4] = m1[j][4] + m1[j][5];
  269.     m2[j][5] = m1[j][4] - m1[j][5];
  270.     m2[j][6] = m1[j][6] + m1[j][7];
  271.     m2[j][7] = m1[j][6] - m1[j][7];
  272.   }
  273.   //vertical
  274.   for (i=0; i < 8; i++)
  275.   {
  276.     m3[0][i] = m2[0][i] + m2[4][i];
  277.     m3[1][i] = m2[1][i] + m2[5][i];
  278.     m3[2][i] = m2[2][i] + m2[6][i];
  279.     m3[3][i] = m2[3][i] + m2[7][i];
  280.     m3[4][i] = m2[0][i] - m2[4][i];
  281.     m3[5][i] = m2[1][i] - m2[5][i];
  282.     m3[6][i] = m2[2][i] - m2[6][i];
  283.     m3[7][i] = m2[3][i] - m2[7][i];
  284.     m1[0][i] = m3[0][i] + m3[2][i];
  285.     m1[1][i] = m3[1][i] + m3[3][i];
  286.     m1[2][i] = m3[0][i] - m3[2][i];
  287.     m1[3][i] = m3[1][i] - m3[3][i];
  288.     m1[4][i] = m3[4][i] + m3[6][i];
  289.     m1[5][i] = m3[5][i] + m3[7][i];
  290.     m1[6][i] = m3[4][i] - m3[6][i];
  291.     m1[7][i] = m3[5][i] - m3[7][i];
  292.     m2[0][i] = m1[0][i] + m1[1][i];
  293.     m2[1][i] = m1[0][i] - m1[1][i];
  294.     m2[2][i] = m1[2][i] + m1[3][i];
  295.     m2[3][i] = m1[2][i] - m1[3][i];
  296.     m2[4][i] = m1[4][i] + m1[5][i];
  297.     m2[5][i] = m1[4][i] - m1[5][i];
  298.     m2[6][i] = m1[6][i] + m1[7][i];
  299.     m2[7][i] = m1[6][i] - m1[7][i];
  300.   }
  301.   for (j=0; j < 8; j++)
  302.     for (i=0; i < 8; i++) 
  303.       sad += iabs (m2[j][i]);
  304.   return ((sad+2)>>2);
  305. }
  306. /*!
  307. ************************************************************************
  308. * brief
  309. *    SAD computation
  310. ************************************************************************
  311. */
  312. int computeSAD(imgpel* src_pic,
  313.                int blocksize_y,
  314.                int blocksize_x,
  315.                int min_mcost,
  316.                int cand_x,
  317.                int cand_y)
  318. {
  319.   int mcost = 0;
  320.   int y,x;
  321.   int pad_size_x = img_padded_size_x - blocksize_x;
  322.   src_line = src_pic;
  323.   ref_line = get_line[ref_access_method] (ref_pic_sub.luma, cand_y, cand_x);
  324.   for (y=0; y<blocksize_y; y++)
  325.   {
  326.     for (x = 0; x < blocksize_x; x+=4)
  327.     {
  328.       mcost += byte_abs[ *src_line++ - *ref_line++ ];
  329.       mcost += byte_abs[ *src_line++ - *ref_line++ ];
  330.       mcost += byte_abs[ *src_line++ - *ref_line++ ];
  331.       mcost += byte_abs[ *src_line++ - *ref_line++ ];
  332.     }
  333.     if (mcost >= min_mcost) return mcost;
  334.     ref_line += pad_size_x;
  335.   }
  336.   if ( ChromaMEEnable ) 
  337.   {
  338.     // calculate chroma conribution to motion compensation error
  339.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  340.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  341.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  342.     int k;
  343.     int mcr_cost = 0; // chroma me cost
  344.     for (k=0; k < 2; k++)
  345.     {
  346.       src_line = src_pic + (256 << k);
  347.       ref_line = get_crline[ref_access_method] ( ref_pic_sub.crcb[k], cand_y, cand_x);
  348.       mcr_cost = 0;
  349.       for (y=0; y<blocksize_y_cr; y++)
  350.       {
  351.         for (x = 0; x < blocksize_x_cr; x += 2)
  352.         {
  353.           mcr_cost += byte_abs[ *src_line++ - *ref_line++ ];
  354.           mcr_cost += byte_abs[ *src_line++ - *ref_line++ ];
  355.         }
  356.         ref_line += cr_pad_size_x;
  357.       }
  358.       mcost += params->ChromaMEWeight * mcr_cost;
  359.       if (mcost >= min_mcost) return mcost;
  360.     }
  361.   }
  362.   return mcost;
  363. }
  364. /*!
  365. ************************************************************************
  366. * brief
  367. *    SAD computation for weighted samples
  368. ************************************************************************
  369. */
  370. int computeSADWP(imgpel* src_pic,
  371.                int blocksize_y,
  372.                int blocksize_x,
  373.                int min_mcost,
  374.                int cand_x,
  375.                int cand_y)
  376. {
  377.   int mcost = 0;
  378.   int y, x;
  379.   int weighted_pel;
  380.   int pad_size_x = img_padded_size_x - blocksize_x;
  381.   src_line = src_pic;
  382.   ref_line = get_line[ref_access_method] (ref_pic_sub.luma, cand_y, cand_x);
  383.   for (y=0; y<blocksize_y; y++)
  384.   {
  385.     for (x = 0; x < blocksize_x; x+=4)
  386.     {
  387.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  388.       mcost += byte_abs[ *src_line++ -  weighted_pel ];
  389.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  390.       mcost += byte_abs[ *src_line++ -  weighted_pel ];
  391.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  392.       mcost += byte_abs[ *src_line++ -  weighted_pel ];
  393.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  394.       mcost += byte_abs[ *src_line++ -  weighted_pel ];
  395.     }
  396.     if (mcost >= min_mcost) return mcost;
  397.     ref_line += pad_size_x;
  398.   }
  399.   if ( ChromaMEEnable ) 
  400.   {
  401.     // calculate chroma conribution to motion compensation error
  402.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  403.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  404.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  405.     int k;
  406.     int mcr_cost = 0;
  407.     int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
  408.     for (k=0; k < 2; k++)
  409.     {
  410.       mcr_cost = 0;
  411.       src_line = src_pic + (256 << k);
  412.       ref_line = get_crline[ref_access_method] ( ref_pic_sub.crcb[k], cand_y, cand_x);
  413.       for (y=0; y<blocksize_y_cr; y++)
  414.       {
  415.         for (x = 0; x < blocksize_x_cr; x+=2)
  416.         {
  417.           weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++  + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
  418.           mcr_cost += byte_abs[ *src_line++ -  weighted_pel ];
  419.           weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++  + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
  420.           mcr_cost += byte_abs[ *src_line++ -  weighted_pel ];
  421.         }
  422.         ref_line += cr_pad_size_x;
  423.       }
  424.       mcost += params->ChromaMEWeight * mcr_cost;
  425.       if (mcost >= min_mcost) return mcost;
  426.     }
  427.   }
  428.   return mcost;
  429. }
  430. /*!
  431. ************************************************************************
  432. * brief
  433. *    BiPred SAD computation (no weights)
  434. ************************************************************************
  435. */
  436. int computeBiPredSAD1(imgpel* src_pic,
  437.                       int blocksize_y,
  438.                       int blocksize_x,
  439.                       int min_mcost,
  440.                       int cand_x1, int cand_y1,
  441.                       int cand_x2, int cand_y2)
  442. {
  443.   int mcost = 0;
  444.   int bi_diff;
  445.   int y,x;
  446.   int pad_size_x = img_padded_size_x - blocksize_x;
  447.   src_line   = src_pic;
  448.   ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, cand_y2, cand_x2);
  449.   ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, cand_y1, cand_x1);
  450.   for (y = 0; y < blocksize_y; y++)
  451.   {
  452.     for (x = 0; x < blocksize_x; x+=4)
  453.     {
  454.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  455.       mcost += byte_abs[bi_diff];
  456.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  457.       mcost += byte_abs[bi_diff];
  458.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  459.       mcost += byte_abs[bi_diff];
  460.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  461.       mcost += byte_abs[bi_diff];
  462.     }
  463.     if (mcost >= min_mcost) return mcost;
  464.     ref2_line += pad_size_x;
  465.     ref1_line += pad_size_x;
  466.   }
  467.   if ( ChromaMEEnable ) 
  468.   {
  469.     // calculate chroma conribution to motion compensation error
  470.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  471.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  472.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  473.     int k;
  474.     int mcr_cost = 0;
  475.     for (k=0; k<2; k++)
  476.     {
  477.       mcr_cost = 0;
  478.       src_line = src_pic + (256 << k);
  479.       ref2_line = get_crline[bipred2_access_method] ( ref_pic2_sub.crcb[k], cand_y2, cand_x2);
  480.       ref1_line = get_crline[bipred1_access_method] ( ref_pic1_sub.crcb[k], cand_y1, cand_x1);      
  481.       for (y=0; y<blocksize_y_cr; y++)
  482.       {
  483.         for (x = 0; x < blocksize_x_cr; x+=2)
  484.         {
  485.           bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  486.           mcr_cost += byte_abs[bi_diff];
  487.           bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  488.           mcr_cost += byte_abs[bi_diff];
  489.         }        
  490.         ref2_line += cr_pad_size_x;
  491.         ref1_line += cr_pad_size_x;
  492.       }
  493.       mcost += params->ChromaMEWeight * mcr_cost;
  494.       if (mcost >= min_mcost) return mcost;
  495.     }
  496.   }
  497.   return mcost;
  498. }
  499. /*!
  500. ************************************************************************
  501. * brief
  502. *    BiPred SAD computation (with weights)
  503. ************************************************************************
  504. */
  505. int computeBiPredSAD2(imgpel* src_pic,
  506.                       int blocksize_y,
  507.                       int blocksize_x,
  508.                       int min_mcost,
  509.                       int cand_x1, int cand_y1,
  510.                       int cand_x2, int cand_y2)
  511. {
  512.   int mcost = 0;
  513.   int bi_diff;
  514.   int denom = luma_log_weight_denom + 1;
  515.   int lround = 2 * wp_luma_round;
  516.   int y,x;
  517.   int weighted_pel, pixel1, pixel2;
  518.   int pad_size_x = img_padded_size_x - blocksize_x;
  519.   src_line   = src_pic;
  520.   ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, cand_y2, cand_x2);
  521.   ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, cand_y1, cand_x1);
  522.   for (y=0; y<blocksize_y; y++)
  523.   {
  524.     for (x = 0; x < blocksize_x; x+=4)
  525.     {
  526.       pixel1 = weight1 * (*ref1_line++);
  527.       pixel2 = weight2 * (*ref2_line++);
  528.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  529.       bi_diff = (*src_line++) - weighted_pel;
  530.       mcost += byte_abs[bi_diff];
  531.       pixel1 = weight1 * (*ref1_line++);
  532.       pixel2 = weight2 * (*ref2_line++);
  533.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  534.       bi_diff = (*src_line++) - weighted_pel;
  535.       mcost += byte_abs[bi_diff];
  536.       pixel1 = weight1 * (*ref1_line++);
  537.       pixel2 = weight2 * (*ref2_line++);
  538.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  539.       bi_diff = (*src_line++) - weighted_pel;
  540.       mcost += byte_abs[bi_diff];
  541.       pixel1 = weight1 * (*ref1_line++);
  542.       pixel2 = weight2 * (*ref2_line++);
  543.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  544.       bi_diff = (*src_line++) - weighted_pel;
  545.       mcost += byte_abs[bi_diff];
  546.     }
  547.     if (mcost >= min_mcost) return mcost;
  548.     ref2_line += pad_size_x;
  549.     ref1_line += pad_size_x;
  550.   }
  551.   if ( ChromaMEEnable ) 
  552.   {
  553.     // calculate chroma conribution to motion compensation error
  554.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  555.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  556.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  557.     int k;
  558.     int mcr_cost = 0;
  559.     int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
  560.     for (k=0; k<2; k++)
  561.     {
  562.       mcr_cost = 0;
  563.       src_line = src_pic + (256 << k);
  564.       ref2_line = get_crline[bipred2_access_method] ( ref_pic2_sub.crcb[k], cand_y2, cand_x2);
  565.       ref1_line = get_crline[bipred1_access_method] ( ref_pic1_sub.crcb[k], cand_y1, cand_x1);
  566.       for (y=0; y<blocksize_y_cr; y++)
  567.       {
  568.         for (x = 0; x < blocksize_x_cr; x+=2)
  569.         {
  570.           pixel1 = weight1_cr[k] * (*ref1_line++);
  571.           pixel2 = weight2_cr[k] * (*ref2_line++);
  572.           weighted_pel =  iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
  573.           bi_diff = (*src_line++) - weighted_pel;
  574.           mcr_cost += byte_abs[bi_diff];
  575.           pixel1 = weight1_cr[k] * (*ref1_line++);
  576.           pixel2 = weight2_cr[k] * (*ref2_line++);
  577.           weighted_pel =  iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
  578.           bi_diff = (*src_line++) - weighted_pel;
  579.           mcr_cost += byte_abs[bi_diff];
  580.         }
  581.         ref2_line += cr_pad_size_x;
  582.         ref1_line += cr_pad_size_x;
  583.       }
  584.       mcost += params->ChromaMEWeight * mcr_cost;
  585.       if (mcost >= min_mcost) return mcost;
  586.       
  587.     }
  588.   }
  589.   return mcost;
  590. }
  591. /*!
  592.  ************************************************************************
  593.  * brief
  594.  *    SAD computation _with_ Hadamard Transform
  595.  ************************************************************************
  596. */
  597. int computeSATD(imgpel* src_pic,
  598.                 int blocksize_y,
  599.                 int blocksize_x,
  600.                 int min_mcost,
  601.                 int cand_x,
  602.                 int cand_y)
  603. {
  604.   int mcost = 0;
  605.   int y, x, y4, *d;
  606.   int src_size_x, src_size_mul;
  607.   imgpel *src_tmp = src_pic;
  608.   if ( !test8x8transform )
  609.   { // 4x4 TRANSFORM
  610.     src_size_x = blocksize_x - BLOCK_SIZE;
  611.     src_size_mul = blocksize_x * BLOCK_SIZE;
  612.     for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_SP))
  613.     {
  614.       for (x=0; x<blocksize_x; x += BLOCK_SIZE)
  615.       {
  616.         d    = diff;
  617.         ref_line = get_line[ref_access_method] (ref_pic_sub.luma, y, cand_x + (x<<2));
  618.         src_line = src_tmp + x;
  619.         for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
  620.         {
  621.           *d++ = *src_line++ - *ref_line++ ;
  622.           *d++ = *src_line++ - *ref_line++ ;
  623.           *d++ = *src_line++ - *ref_line++ ;
  624.           *d++ = *src_line++ - *ref_line++ ;
  625.           ref_line += img_padded_size_x_m4x4;
  626.           src_line += src_size_x;
  627.         }
  628.         if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
  629.       }
  630.       src_tmp += src_size_mul;
  631.     }
  632.   }
  633.   else
  634.   { // 8x8 TRANSFORM
  635.     src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
  636.     src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
  637.     for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_8x8_SP) )
  638.     {
  639.       for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
  640.       {
  641.         d = diff;
  642.         ref_line  = get_line[ref_access_method] (ref_pic_sub.luma, y, cand_x + (x<<2));
  643.         src_line = src_tmp + x;
  644.         for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
  645.         {
  646.           *d++ = *src_line++ - *ref_line++ ;
  647.           *d++ = *src_line++ - *ref_line++ ;
  648.           *d++ = *src_line++ - *ref_line++ ;
  649.           *d++ = *src_line++ - *ref_line++ ;
  650.           *d++ = *src_line++ - *ref_line++ ;
  651.           *d++ = *src_line++ - *ref_line++ ;
  652.           *d++ = *src_line++ - *ref_line++ ;
  653.           *d++ = *src_line++ - *ref_line++ ;
  654.           ref_line += img_padded_size_x_m8x8;
  655.           src_line += src_size_x;
  656.         }
  657.         if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
  658.       }
  659.       src_tmp += src_size_mul;
  660.     }
  661.   }
  662.   return mcost;
  663. }
  664. /*!
  665.  ************************************************************************
  666.  * brief
  667.  *    SAD computation of weighted samples _with_ Hadamard Transform
  668.  ************************************************************************
  669. */
  670. int computeSATDWP(imgpel* src_pic,
  671.                 int blocksize_y,
  672.                 int blocksize_x,
  673.                 int min_mcost,
  674.                 int cand_x,
  675.                 int cand_y)
  676. {
  677.   int mcost = 0;
  678.   int y, x, y4, *d;
  679.   int weighted_pel;
  680.   int src_size_x, src_size_mul;
  681.   imgpel *src_tmp = src_pic;
  682.   if ( !test8x8transform )
  683.   { // 4x4 TRANSFORM
  684.     src_size_x = (blocksize_x - BLOCK_SIZE);
  685.     src_size_mul = blocksize_x * BLOCK_SIZE;
  686.     for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_SP))
  687.     {
  688.       for (x=0; x<blocksize_x; x += BLOCK_SIZE)
  689.       {
  690.         d    = diff;
  691.         ref_line = get_line[ref_access_method] (ref_pic_sub.luma, y, cand_x + (x<<2));
  692.         src_line = src_tmp + x;
  693.         for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
  694.         {
  695.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  696.           *d++ = *src_line++ - weighted_pel;
  697.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  698.           *d++ = *src_line++ - weighted_pel;
  699.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  700.           *d++ = *src_line++ - weighted_pel;
  701.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  702.           *d++ = *src_line++ - weighted_pel;
  703.           ref_line += img_padded_size_x_m4x4;
  704.           src_line += src_size_x;
  705.         }
  706.         if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
  707.       }
  708.       src_tmp += src_size_mul;
  709.     }
  710.   }
  711.   else
  712.   { // 8x8 TRANSFORM
  713.     src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
  714.     src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
  715.     for (y = cand_y; y < cand_y + (blocksize_y<<2); y += (BLOCK_SIZE_8x8_SP) )
  716.     {
  717.       for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
  718.       {
  719.         d = diff;
  720.         ref_line  = get_line[ref_access_method] (ref_pic_sub.luma, y, cand_x + (x<<2));
  721.         src_line = src_tmp + x;
  722.         for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
  723.         {
  724.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  725.           *d++ = *src_line++ - weighted_pel;
  726.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  727.           *d++ = *src_line++ - weighted_pel;
  728.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  729.           *d++ = *src_line++ - weighted_pel;
  730.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  731.           *d++ = *src_line++ - weighted_pel;
  732.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  733.           *d++ = *src_line++ - weighted_pel;
  734.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  735.           *d++ = *src_line++ - weighted_pel;
  736.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  737.           *d++ = *src_line++ - weighted_pel;
  738.           weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  739.           *d++ = *src_line++ - weighted_pel;
  740.           ref_line += img_padded_size_x_m8x8;
  741.           src_line += src_size_x;
  742.         }
  743.         if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
  744.       }
  745.       src_tmp += src_size_mul;
  746.     }
  747.   }
  748.   return mcost;
  749. }
  750. /*!
  751.  ************************************************************************
  752.  * brief
  753.  *    BiPred (w/o weights) SATD computation
  754.  ************************************************************************
  755. */
  756. int computeBiPredSATD1(imgpel* src_pic,
  757.                        int blocksize_y,
  758.                        int blocksize_x,
  759.                        int min_mcost,
  760.                        int cand_x1, int cand_y1,
  761.                        int cand_x2, int cand_y2)
  762. {
  763.   int mcost = 0;
  764.   int y, x, y4, *d;
  765.   int src_size_x, src_size_mul;
  766.   imgpel *src_tmp = src_pic;
  767.   if ( !test8x8transform )
  768.   { // 4x4 TRANSFORM
  769.     src_size_x = (blocksize_x - BLOCK_SIZE);
  770.     src_size_mul = blocksize_x * BLOCK_SIZE;
  771.     for (y=0; y<(blocksize_y<<2); y += (BLOCK_SIZE_SP))
  772.     {
  773.       for (x=0; x<blocksize_x; x += BLOCK_SIZE)
  774.       {
  775.         d    = diff;
  776.         src_line   = src_tmp + x;
  777.         ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, cand_y2 + y, cand_x2 + (x<<2));
  778.         ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, cand_y1 + y, cand_x1 + (x<<2));
  779.         for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
  780.         {
  781.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  782.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  783.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  784.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  785.           ref1_line += img_padded_size_x_m4x4;
  786.           ref2_line += img_padded_size_x_m4x4;
  787.           src_line  += src_size_x;
  788.         }
  789.         if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
  790.       }
  791.       src_tmp += src_size_mul;
  792.     }
  793.   }
  794.   else
  795.   { // 8x8 TRANSFORM
  796.     src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
  797.     src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
  798.     for (y=0; y<blocksize_y; y += BLOCK_SIZE_8x8 )
  799.     {
  800.       int y_pos2 = cand_y2 + (y<<2);
  801.       int y_pos1 = cand_y1 + (y<<2);
  802.       for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
  803.       {
  804.         d = diff;
  805.         src_line   = src_tmp + x;
  806.         ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, y_pos2, cand_x2 + (x<<2));
  807.         ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, y_pos1, cand_x1 + (x<<2));
  808.         for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
  809.         {
  810.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  811.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  812.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  813.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  814.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  815.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  816.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  817.           *d++ = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  818.           ref1_line += img_padded_size_x_m8x8;
  819.           ref2_line += img_padded_size_x_m8x8;
  820.           src_line += src_size_x;
  821.         }
  822.         if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
  823.       }
  824.       src_tmp += src_size_mul;
  825.     }
  826.   }
  827.   return mcost;
  828. }
  829. /*!
  830. ************************************************************************
  831. * brief
  832. *    BiPred (w/ weights) SATD computation
  833. ************************************************************************
  834. */
  835. int computeBiPredSATD2(imgpel* src_pic,
  836.                        int blocksize_y,
  837.                        int blocksize_x,
  838.                        int min_mcost,
  839.                        int cand_x1, int cand_y1,
  840.                        int cand_x2, int cand_y2)
  841. {
  842.   int mcost = 0;
  843.   int y, x, y4, *d;
  844.   int weighted_pel, pixel1, pixel2;
  845.   int denom = luma_log_weight_denom + 1;
  846.   int lround = 2 * wp_luma_round;
  847.   int src_size_x, src_size_mul;
  848.   imgpel *src_tmp = src_pic;
  849.   if ( !test8x8transform )
  850.   { // 4x4 TRANSFORM
  851.     src_size_x = (blocksize_x - BLOCK_SIZE);
  852.     src_size_mul = blocksize_x * BLOCK_SIZE;
  853.     for (y=0; y<(blocksize_y<<2); y += BLOCK_SIZE_SP)
  854.     {
  855.       for (x=0; x<blocksize_x; x += BLOCK_SIZE)
  856.       {
  857.         d    = diff;
  858.         src_line   = src_tmp + x;
  859.         ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, cand_y2 + y, cand_x2 + (x<<2));
  860.         ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, cand_y1 + y, cand_x1 + (x<<2));
  861.         for (y4 = 0; y4 < BLOCK_SIZE; y4++ )
  862.         {
  863.           // 0
  864.           pixel1 = weight1 * (*ref1_line++);
  865.           pixel2 = weight2 * (*ref2_line++);
  866.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  867.           *d++ =  (*src_line++) - weighted_pel;
  868.           // 1
  869.           pixel1 = weight1 * (*ref1_line++);
  870.           pixel2 = weight2 * (*ref2_line++);
  871.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  872.           *d++ =  (*src_line++) - weighted_pel;
  873.           // 2
  874.           pixel1 = weight1 * (*ref1_line++);
  875.           pixel2 = weight2 * (*ref2_line++);
  876.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  877.           *d++ =  (*src_line++) - weighted_pel;
  878.           // 3
  879.           pixel1 = weight1 * (*ref1_line++);
  880.           pixel2 = weight2 * (*ref2_line++);
  881.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  882.           *d++ =  (*src_line++) - weighted_pel;
  883.           ref1_line += img_padded_size_x_m4x4;
  884.           ref2_line += img_padded_size_x_m4x4;
  885.           src_line  += src_size_x;
  886.         }
  887.         if ((mcost += HadamardSAD4x4 (diff)) > min_mcost) return mcost;
  888.       }
  889.       src_tmp += src_size_mul;
  890.     }
  891.   }
  892.   else
  893.   { // 8x8 TRANSFORM
  894.     src_size_x = (blocksize_x - BLOCK_SIZE_8x8);
  895.     src_size_mul = blocksize_x * BLOCK_SIZE_8x8;
  896.     for (y=0; y<blocksize_y; y += BLOCK_SIZE_8x8 )
  897.     {
  898.       int y_pos2 = cand_y2 + (y<<2);
  899.       int y_pos1 = cand_y1 + (y<<2);
  900.       for (x=0; x<blocksize_x; x += BLOCK_SIZE_8x8 )
  901.       {
  902.         d = diff;
  903.         src_line   = src_tmp + x;
  904.         ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, y_pos2, cand_x2 + (x<<2));
  905.         ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, y_pos1, cand_x1 + (x<<2));
  906.         for (y4 = 0; y4 < BLOCK_SIZE_8x8; y4++ )
  907.         {
  908.           // 0
  909.           pixel1 = weight1 * (*ref1_line++);
  910.           pixel2 = weight2 * (*ref2_line++);
  911.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  912.           *d++ =  (*src_line++) - weighted_pel;
  913.           // 1
  914.           pixel1 = weight1 * (*ref1_line++);
  915.           pixel2 = weight2 * (*ref2_line++);
  916.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  917.           *d++ =  (*src_line++) - weighted_pel;
  918.           // 2
  919.           pixel1 = weight1 * (*ref1_line++);
  920.           pixel2 = weight2 * (*ref2_line++);
  921.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  922.           *d++ =  (*src_line++) - weighted_pel;
  923.           // 3
  924.           pixel1 = weight1 * (*ref1_line++);
  925.           pixel2 = weight2 * (*ref2_line++);
  926.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  927.           *d++ =  (*src_line++) - weighted_pel;
  928.           // 4
  929.           pixel1 = weight1 * (*ref1_line++);
  930.           pixel2 = weight2 * (*ref2_line++);
  931.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  932.           *d++ =  (*src_line++) - weighted_pel;
  933.           // 5
  934.           pixel1 = weight1 * (*ref1_line++);
  935.           pixel2 = weight2 * (*ref2_line++);
  936.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  937.           *d++ =  (*src_line++) - weighted_pel;
  938.           // 6
  939.           pixel1 = weight1 * (*ref1_line++);
  940.           pixel2 = weight2 * (*ref2_line++);
  941.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  942.           *d++ =  (*src_line++) - weighted_pel;
  943.           // 7
  944.           pixel1 = weight1 * (*ref1_line++);
  945.           pixel2 = weight2 * (*ref2_line++);
  946.           weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  947.           *d++ =  (*src_line) - weighted_pel;
  948.           ref1_line += img_padded_size_x_m8x8;
  949.           ref2_line += img_padded_size_x_m8x8;
  950.           src_line  += src_size_x;
  951.         }
  952.         if ((mcost += HadamardSAD8x8 (diff)) > min_mcost) return mcost;
  953.       }
  954.       src_tmp += src_size_mul;
  955.     }
  956.   }
  957.   return mcost;
  958. }
  959. /*!
  960. ************************************************************************
  961. * brief
  962. *    SSE computation
  963. ************************************************************************
  964. */
  965. int computeSSE(imgpel* src_pic,
  966.                int blocksize_y,
  967.                int blocksize_x,
  968.                int min_mcost,
  969.                int cand_x,
  970.                int cand_y)
  971. {
  972.   int mcost = 0;
  973.   int y,x;
  974.   int *byte_sse = img->quad;
  975.   int pad_size_x = img_padded_size_x - blocksize_x;
  976.   src_line = src_pic;
  977.   ref_line = get_line[ref_access_method] (ref_pic_sub.luma, cand_y, cand_x);
  978.   for (y=0; y<blocksize_y; y++)
  979.   {
  980.     for (x = 0; x < blocksize_x; x+=4)
  981.     {
  982.       mcost += byte_sse[ *src_line++ - *ref_line++ ];
  983.       mcost += byte_sse[ *src_line++ - *ref_line++ ];
  984.       mcost += byte_sse[ *src_line++ - *ref_line++ ];
  985.       mcost += byte_sse[ *src_line++ - *ref_line++ ];
  986.     }
  987.     if (mcost >= min_mcost) return mcost;
  988.     ref_line += pad_size_x;
  989.   }
  990.   if ( ChromaMEEnable ) 
  991.   {
  992.     // calculate chroma conribution to motion compensation error
  993.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  994.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  995.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  996.     int k;
  997.     int mcr_cost = 0;
  998.     for (k=0; k<2; k++)
  999.     {
  1000.       mcr_cost = 0;
  1001.       src_line = src_pic + (256 << k);
  1002.       ref_line = get_crline[ref_access_method] ( ref_pic_sub.crcb[k], cand_y, cand_x);
  1003.       for (y=0; y<blocksize_y_cr; y++)
  1004.       {
  1005.         for (x = 0; x < blocksize_x_cr; x+=2)
  1006.         {
  1007.           mcr_cost += byte_sse[ *src_line++ - *ref_line++ ];
  1008.           mcr_cost += byte_sse[ *src_line++ - *ref_line++ ];
  1009.         }
  1010.         ref_line += cr_pad_size_x;
  1011.       }
  1012.       mcost += params->ChromaMEWeight * mcr_cost;
  1013.       if (mcost >= min_mcost) return mcost;
  1014.     }
  1015.   }
  1016.   return mcost;
  1017. }
  1018. /*!
  1019. ************************************************************************
  1020. * brief
  1021. *    SSE computation of weighted samples
  1022. ************************************************************************
  1023. */
  1024. int computeSSEWP(imgpel* src_pic,
  1025.                int blocksize_y,
  1026.                int blocksize_x,
  1027.                int min_mcost,
  1028.                int cand_x,
  1029.                int cand_y)
  1030. {
  1031.   int mcost = 0;
  1032.   int y,x;
  1033.   int weighted_pel;
  1034.   int *byte_sse = img->quad;
  1035.   int pad_size_x = img_padded_size_x - blocksize_x;
  1036.   src_line = src_pic;
  1037.   ref_line = get_line[ref_access_method] (ref_pic_sub.luma, cand_y, cand_x);
  1038.   for (y=0; y<blocksize_y; y++)
  1039.   {
  1040.     for (x = 0; x < blocksize_x; x+=4)
  1041.     {
  1042.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  1043.       mcost += byte_sse[ *src_line++ - weighted_pel ];
  1044.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  1045.       mcost += byte_sse[ *src_line++ - weighted_pel ];
  1046.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  1047.       mcost += byte_sse[ *src_line++ - weighted_pel ];
  1048.       weighted_pel = iClip1( img->max_imgpel_value, ((weight_luma * *ref_line++  + wp_luma_round) >> luma_log_weight_denom) + offset_luma);
  1049.       mcost += byte_sse[ *src_line++ - weighted_pel ];
  1050.     }
  1051.     if (mcost >= min_mcost) return mcost;
  1052.     ref_line += pad_size_x;
  1053.   }
  1054.   if ( ChromaMEEnable ) 
  1055.   {
  1056.     // calculate chroma conribution to motion compensation error
  1057.     // These could be made global to reduce computations
  1058.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  1059.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  1060.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  1061.     int k;
  1062.     int mcr_cost = 0;
  1063.     int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
  1064.     for (k=0; k<2; k++)
  1065.     {
  1066.       mcr_cost = 0;
  1067.       src_line = src_pic + (256 << k);
  1068.       ref_line = get_crline[ref_access_method] ( ref_pic_sub.crcb[k], cand_y, cand_x);
  1069.       for (y=0; y<blocksize_y_cr; y++)
  1070.       {
  1071.         for (x = 0; x < blocksize_x_cr; x+=2)
  1072.         {
  1073.           weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++  + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
  1074.           mcr_cost += byte_sse[ *src_line++ - weighted_pel ];
  1075.           weighted_pel = iClip1( max_imgpel_value_uv, ((weight_cr[k] * *ref_line++  + wp_chroma_round) >> chroma_log_weight_denom) + offset_cr[k]);
  1076.           mcr_cost += byte_sse[ *src_line++ - weighted_pel ];
  1077.         }        
  1078.         ref_line += cr_pad_size_x;
  1079.       }
  1080.       mcost += params->ChromaMEWeight * mcr_cost;
  1081.       if (mcost >= min_mcost) return mcost;
  1082.     }
  1083.   }
  1084.   return mcost;
  1085. }
  1086. /*!
  1087. ************************************************************************
  1088. * brief
  1089. *    BiPred SSE computation (no weights)
  1090. ************************************************************************
  1091. */
  1092. int computeBiPredSSE1(imgpel* src_pic,
  1093.                       int blocksize_y,
  1094.                       int blocksize_x,
  1095.                       int min_mcost,
  1096.                       int cand_x1, int cand_y1,
  1097.                       int cand_x2, int cand_y2)
  1098. {
  1099.   int mcost = 0;
  1100.   int bi_diff;
  1101.   int y,x;
  1102.   int *byte_sse = img->quad;
  1103.   int pad_size_x = img_padded_size_x - blocksize_x;
  1104.   src_line   = src_pic;
  1105.   ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, cand_y2, cand_x2);
  1106.   ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, cand_y1, cand_x1);
  1107.   for (y = 0; y < blocksize_y; y++)
  1108.   {
  1109.     for (x = 0; x < blocksize_x; x+=4)
  1110.     {
  1111.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  1112.       mcost += byte_sse[bi_diff];
  1113.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  1114.       mcost += byte_sse[bi_diff];
  1115.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  1116.       mcost += byte_sse[bi_diff];
  1117.       bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  1118.       mcost += byte_sse[bi_diff];
  1119.     }
  1120.     if (mcost >= min_mcost) return mcost;
  1121.     ref2_line += pad_size_x;
  1122.     ref1_line += pad_size_x;
  1123.   }
  1124.   if ( ChromaMEEnable ) 
  1125.   {
  1126.     // calculate chroma conribution to motion compensation error
  1127.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  1128.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  1129.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  1130.     int k;
  1131.     int mcr_cost = 0;
  1132.     for (k=0; k<2; k++)
  1133.     {
  1134.       mcr_cost = 0;
  1135.       src_line = src_pic + (256 << k);
  1136.       ref2_line = get_crline[bipred2_access_method] ( ref_pic2_sub.crcb[k], cand_y2, cand_x2);
  1137.       ref1_line = get_crline[bipred1_access_method] ( ref_pic1_sub.crcb[k], cand_y1, cand_x1);
  1138.       for (y=0; y<blocksize_y_cr; y++)
  1139.       {
  1140.         for (x = 0; x < blocksize_x_cr; x+=2)
  1141.         {
  1142.           bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  1143.           mcr_cost += byte_sse[bi_diff];
  1144.           bi_diff = (*src_line++) - ((*ref1_line++ + *ref2_line++ + 1)>>1);
  1145.           mcr_cost += byte_sse[bi_diff];
  1146.         }        
  1147.         ref2_line += cr_pad_size_x;
  1148.         ref1_line += cr_pad_size_x;
  1149.       }
  1150.       mcost += params->ChromaMEWeight * mcr_cost;
  1151.       if (mcost >= min_mcost) return mcost;
  1152.     }
  1153.   }
  1154.   return mcost;
  1155. }
  1156. /*!
  1157. ************************************************************************
  1158. * brief
  1159. *    BiPred SSE computation (with weights)
  1160. ************************************************************************
  1161. */
  1162. int computeBiPredSSE2(imgpel* src_pic,
  1163.                       int blocksize_y,
  1164.                       int blocksize_x,
  1165.                       int min_mcost,
  1166.                       int cand_x1, int cand_y1,
  1167.                       int cand_x2, int cand_y2)
  1168. {
  1169.   int mcost = 0;
  1170.   int bi_diff;
  1171.   int denom = luma_log_weight_denom + 1;
  1172.   int lround = 2 * wp_luma_round;
  1173.   int y,x;
  1174.   int weighted_pel, pixel1, pixel2;
  1175.   int pad_size_x = img_padded_size_x - blocksize_x;
  1176.   src_line   = src_pic;
  1177.   ref2_line  = get_line[bipred2_access_method] (ref_pic2_sub.luma, cand_y2, cand_x2);
  1178.   ref1_line  = get_line[bipred1_access_method] (ref_pic1_sub.luma, cand_y1, cand_x1);
  1179.   for (y=0; y<blocksize_y; y++)
  1180.   {
  1181.     for (x = 0; x < blocksize_x; x+=4)
  1182.     {
  1183.       pixel1 = weight1 * (*ref1_line++);
  1184.       pixel2 = weight2 * (*ref2_line++);
  1185.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  1186.       bi_diff = (*src_line++) - weighted_pel;
  1187.       mcost += bi_diff * bi_diff;
  1188.       pixel1 = weight1 * (*ref1_line++);
  1189.       pixel2 = weight2 * (*ref2_line++);
  1190.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  1191.       bi_diff = (*src_line++) - weighted_pel;
  1192.       mcost += bi_diff * bi_diff;
  1193.       pixel1 = weight1 * (*ref1_line++);
  1194.       pixel2 = weight2 * (*ref2_line++);
  1195.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  1196.       bi_diff = (*src_line++) - weighted_pel;
  1197.       mcost += bi_diff * bi_diff;
  1198.       pixel1 = weight1 * (*ref1_line++);
  1199.       pixel2 = weight2 * (*ref2_line++);
  1200.       weighted_pel =  iClip1( img->max_imgpel_value, ((pixel1 + pixel2 + lround) >> denom) + offsetBi);
  1201.       bi_diff = (*src_line++) - weighted_pel;
  1202.       mcost += bi_diff * bi_diff;
  1203.     }
  1204.     if (mcost >= min_mcost) return mcost;
  1205.     ref2_line += pad_size_x;
  1206.     ref1_line += pad_size_x;
  1207.   }
  1208.   if ( ChromaMEEnable ) 
  1209.   {
  1210.     // calculate chroma conribution to motion compensation error
  1211.     int blocksize_x_cr = blocksize_x >> shift_cr_x;
  1212.     int blocksize_y_cr = blocksize_y >> shift_cr_y;
  1213.     int cr_pad_size_x = img_cr_padded_size_x - blocksize_x_cr;
  1214.     int k;
  1215.     int mcr_cost = 0;
  1216.     int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
  1217.     for (k=0; k<2; k++)
  1218.     {
  1219.       mcr_cost = 0;
  1220.       src_line = src_pic + (256 << k);
  1221.       ref2_line = get_crline[bipred2_access_method] ( ref_pic2_sub.crcb[k], cand_y2, cand_x2);
  1222.       ref1_line = get_crline[bipred1_access_method] ( ref_pic1_sub.crcb[k], cand_y1, cand_x1);
  1223.       for (y=0; y<blocksize_y_cr; y++)
  1224.       {
  1225.         for (x = 0; x < blocksize_x_cr; x+=2)
  1226.         {
  1227.           pixel1 = weight1_cr[k] * (*ref1_line++);
  1228.           pixel2 = weight2_cr[k] * (*ref2_line++);
  1229.           weighted_pel =  iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
  1230.           bi_diff = (*src_line++) - weighted_pel;
  1231.           mcr_cost += bi_diff * bi_diff;
  1232.           pixel1 = weight1_cr[k] * (*ref1_line++);
  1233.           pixel2 = weight2_cr[k] * (*ref2_line++);
  1234.           weighted_pel =  iClip1( max_imgpel_value_uv, ((pixel1 + pixel2 + lround) >> denom) + offsetBi_cr[k]);
  1235.           bi_diff = (*src_line++) - weighted_pel;
  1236.           mcr_cost += bi_diff * bi_diff;
  1237.         }        
  1238.         ref2_line += cr_pad_size_x;
  1239.         ref1_line += cr_pad_size_x;
  1240.       }
  1241.       mcost += params->ChromaMEWeight * mcr_cost;
  1242.       if (mcost >= min_mcost) return mcost;
  1243.     }
  1244.   }
  1245.   return mcost;
  1246. }