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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file md_distortion.c
  4.  *
  5.  * brief
  6.  *    Main macroblock mode decision functions and helpers
  7.  *
  8.  **************************************************************************
  9.  */
  10. #include <math.h>
  11. #include <limits.h>
  12. #include <float.h>
  13. #include "global.h"
  14. #include "rdopt_coding_state.h"
  15. #include "mb_access.h"
  16. #include "intrarefresh.h"
  17. #include "image.h"
  18. #include "transform8x8.h"
  19. #include "ratectl.h"
  20. #include "mode_decision.h"
  21. #include "fmo.h"
  22. #include "me_umhex.h"
  23. #include "me_umhexsmp.h"
  24. #include "macroblock.h"
  25. #include "mv-search.h"
  26. int64 compute_SSE(imgpel **imgRef, imgpel **imgSrc, int xRef, int xSrc, int ySize, int xSize)
  27. {
  28.   static int i, j;
  29.   static imgpel *lineRef, *lineSrc;
  30.   int64 distortion = 0;
  31.   
  32.   for (j = 0; j < ySize; j++)
  33.   {
  34.     lineRef = &imgRef[j][xRef];    
  35.     lineSrc = &imgSrc[j][xSrc];
  36.     for (i = 0; i < xSize; i++)
  37.       //distortion += img->quad[( *lineRef++ - *lineSrc++ )];
  38.       distortion += iabs2( *lineRef++ - *lineSrc++ );
  39.   }
  40.   return distortion;
  41. }
  42. /*!
  43. *************************************************************************************
  44. * brief
  45. *    SSE distortion calculation for a macroblock
  46. *************************************************************************************
  47. */
  48. int64 distortionSSE(Macroblock *currMB) 
  49. {
  50.   int64 distortionY = 0;
  51.   int64 distortionCr[2] = {0};
  52.   // LUMA
  53.   distortionY = compute_SSE(&pCurImg[img->opix_y], &enc_picture->p_curr_img[img->pix_y], img->opix_x, img->pix_x, MB_BLOCK_SIZE, MB_BLOCK_SIZE);
  54.   //if (img->yuv_format != YUV400 && )
  55.   if ((img->yuv_format != YUV400) && !IS_INDEPENDENT(params))
  56.   {
  57.     // CHROMA
  58.     distortionCr[0] = compute_SSE(&pImgOrg[1][img->opix_c_y], &enc_picture->imgUV[0][img->pix_c_y], img->opix_c_x, img->pix_c_x, img->mb_cr_size_y, img->mb_cr_size_x);
  59.     distortionCr[1] = compute_SSE(&pImgOrg[2][img->opix_c_y], &enc_picture->imgUV[1][img->pix_c_y], img->opix_c_x, img->pix_c_x, img->mb_cr_size_y, img->mb_cr_size_x);
  60.   }
  61.   return (int64)( distortionY * params->WeightY + distortionCr[0] * params->WeightCb + distortionCr[1] * params->WeightCr );
  62. }