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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file img_distortion.c
  4.  *
  5.  * brief
  6.  *    Compute distortion for encoded image
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *     - Woo-Shik Kim                    <wooshik.kim@usc.edu>
  11.  *     - Alexis Michael Tourapis         <alexismt@ieee.org> 
  12.  *************************************************************************************
  13.  */
  14. #include <math.h>
  15. #include <time.h>
  16. #include <sys/timeb.h>
  17. #include "global.h"
  18. #include "refbuf.h"
  19. #include "mbuffer.h"
  20. #include "img_luma.h"
  21. #include "img_chroma.h"
  22. #include "intrarefresh.h"
  23. #include "fmo.h"
  24. #include "sei.h"
  25. #include "memalloc.h"
  26. #include "nalu.h"
  27. #include "ratectl.h"
  28. #include "mb_access.h"
  29. #include "output.h"
  30. #include "cabac.h"
  31. #include "context_ini.h"
  32. #include "conformance.h"
  33. #include "enc_statistics.h"
  34. #include "q_matrix.h"
  35. #include "q_offsets.h"
  36. #include "quant4x4.h"
  37. #include "quant8x8.h"
  38. #include "wp.h"
  39. #include "input.h"
  40. #include "image.h"
  41. #include "img_distortion.h"
  42. #include "img_dist_snr.h"
  43. #include "img_dist_ssim.h"
  44. #include "img_dist_ms_ssim.h"
  45. #include "cconv_yuv2rgb.h"
  46. // images for distortion calculation
  47. ImageStructure imgSRC, imgREF;
  48. extern ImageStructure imgRGB_src, imgRGB_ref;
  49. /*!
  50.  ************************************************************************
  51.  * brief
  52.  *    Metric accumulator
  53.  ************************************************************************
  54.  */
  55. void accumulate_metric(float *ave_metric, float cur_metric, int frames)
  56. {
  57.   *ave_metric = (float) (*ave_metric * (frames - 1) + cur_metric) / frames;
  58. }
  59. /*!
  60.  ************************************************************************
  61.  * brief
  62.  *    Accumulate distortion for all components
  63.  ************************************************************************
  64.  */
  65. void accumulate_average(DistMetric *metric, int frames)
  66. {
  67.   accumulate_metric(&metric->average[0],  metric->value[0],  frames);
  68.   accumulate_metric(&metric->average[1],  metric->value[1],  frames);
  69.   accumulate_metric(&metric->average[2],  metric->value[2],  frames);
  70. }
  71. /*!
  72.  ************************************************************************
  73.  * brief
  74.  *    Accumulate distortion for all components for slice_type
  75.  ************************************************************************
  76.  */
  77. void accumulate_avslice(DistMetric *metric, int slice_type, int frames)
  78. {
  79.   accumulate_metric(&metric->avslice[slice_type][0], metric->value[0],  frames);
  80.   accumulate_metric(&metric->avslice[slice_type][1], metric->value[1],  frames);
  81.   accumulate_metric(&metric->avslice[slice_type][2], metric->value[2],  frames);
  82. }
  83. /*!
  84.  ************************************************************************
  85.  * brief
  86.  *    Find distortion for all three components
  87.  ************************************************************************
  88.  */
  89. void find_distortion (void)
  90. {
  91.   int64 diff_cmp[3] = {0};
  92.   //  Calculate SSE for Y, U and V.
  93.   if (img->structure!=FRAME)
  94.   {
  95.     // Luma.
  96.     diff_cmp[0] += compute_SSE(pCurImg, imgY_com, 0, 0, params->output.height, params->output.width);
  97.     // Chroma.
  98.     if (img->yuv_format != YUV400)
  99.     {
  100.       diff_cmp[1] += compute_SSE(pImgOrg[1], imgUV_com[0], 0, 0, params->output.height_cr, params->output.width_cr);
  101.       diff_cmp[2] += compute_SSE(pImgOrg[2], imgUV_com[1], 0, 0, params->output.height_cr, params->output.width_cr);
  102.     }
  103.   }
  104.   else
  105.   {
  106.     if( IS_INDEPENDENT(params) )
  107.     {
  108.       enc_picture = enc_frame_picture[0];     
  109.     }
  110.     pCurImg   = img_org_frm[0];
  111.     pImgOrg[0] = img_org_frm[0];
  112.     // Luma.
  113.     diff_cmp[0] += compute_SSE(pImgOrg[0], enc_picture->imgY, 0, 0, params->output.height, params->output.width);
  114.     // Chroma.
  115.     if (img->yuv_format != YUV400)
  116.     {
  117.       pImgOrg[1] = img_org_frm[1];
  118.       pImgOrg[2] = img_org_frm[2]; 
  119.       diff_cmp[1] += compute_SSE(pImgOrg[1], enc_picture->imgUV[0], 0, 0, params->output.height_cr, params->output.width_cr);
  120.       diff_cmp[2] += compute_SSE(pImgOrg[2], enc_picture->imgUV[1], 0, 0, params->output.height_cr, params->output.width_cr);
  121.     }
  122.   }
  123.   // This should be assigned to the SSE structure. Should double check code.
  124.   dist->metric[SSE].value[0] = (float) diff_cmp[0];
  125.   dist->metric[SSE].value[1] = (float) diff_cmp[1];
  126.   dist->metric[SSE].value[2] = (float) diff_cmp[2];
  127. }
  128. void select_img(ImageStructure *imgSRC, ImageStructure *imgREF)
  129. {
  130.   if (img->fld_flag != FALSE)
  131.   {
  132.     imgSRC->format = params->output;
  133.     imgREF->format = params->output;
  134.     imgREF->data[0] = pCurImg;
  135.     imgSRC->data[0] = imgY_com;
  136.     if (img->yuv_format != YUV400)
  137.     {
  138.       imgREF->data[1] = pImgOrg[1];
  139.       imgREF->data[2] = pImgOrg[2];
  140.       imgSRC->data[1] = imgUV_com[0];
  141.       imgSRC->data[2] = imgUV_com[1];
  142.     }
  143.   }
  144.   else
  145.   {
  146.     imgSRC->format = params->output;
  147.     imgREF->format = params->output;
  148.     imgREF->data[0] = img_org_frm[0];
  149.     if ((params->PicInterlace == ADAPTIVE_CODING) || IS_INDEPENDENT(params))
  150.     {
  151.       enc_picture = enc_frame_picture[0];
  152.     }
  153.     imgSRC->data[0] = enc_picture->imgY;
  154.     if (img->yuv_format != YUV400)
  155.     {
  156.       imgREF->data[1] = img_org_frm[1];
  157.       imgREF->data[2] = img_org_frm[2];
  158.       imgSRC->data[1] = enc_picture->imgUV[0];
  159.       imgSRC->data[2] = enc_picture->imgUV[1];
  160.     }
  161.   }
  162. }
  163. void compute_distortion(void)
  164. {
  165.   if (params->Verbose != 0)
  166.   {
  167.     select_img(&imgSRC, &imgREF);
  168.     find_snr (&imgREF, &imgSRC, &dist->metric[SSE], &dist->metric[PSNR]);
  169.     if (params->Distortion[SSIM] == 1)
  170.       find_ssim (&imgREF, &imgSRC, &dist->metric[SSIM]);
  171.     if (params->Distortion[MS_SSIM] == 1)
  172.       find_ms_ssim(&imgREF, &imgSRC, &dist->metric[MS_SSIM]);
  173.     // RGB Distortion
  174.     if(params->DistortionYUVtoRGB == 1)
  175.     {
  176.       YUVtoRGB(&imgREF, &imgRGB_ref);
  177.       YUVtoRGB(&imgSRC, &imgRGB_src);
  178.       find_snr (&imgRGB_ref, &imgRGB_src, &dist->metric[SSE_RGB], &dist->metric[PSNR_RGB]);
  179.       if (params->Distortion[SSIM] == 1)
  180.         find_ssim (&imgRGB_ref, &imgRGB_src, &dist->metric[SSIM_RGB]);
  181.       if (params->Distortion[MS_SSIM] == 1)
  182.         find_ms_ssim(&imgRGB_ref, &imgRGB_src, &dist->metric[MS_SSIM_RGB]);
  183.     }
  184.   }
  185. }