computePSNR.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: computePSNR.cpp,v 1.2 2001/04/19 18:32:09 wmay Exp $ */
  2. /****************************************************************************/
  3. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  4. /*                                                                          */
  5. /*   This software was developed by                                         */
  6. /*   Sarnoff Corporation                   and    Texas Instruments         */
  7. /*   Iraj Sodagar   (iraj@sarnoff.com)           Jie Liang (liang@ti.com)   */
  8. /*   Hung-Ju Lee    (hjlee@sarnoff.com)                                     */
  9. /*   Paul Hatrack   (hatrack@sarnoff.com)                                   */
  10. /*   Shipeng Li     (shipeng@sarnoff.com)                                   */
  11. /*   Bing-Bing Chai (bchai@sarnoff.com)                                     */
  12. /*                                                                          */
  13. /* In the course of development of the MPEG-4 standard. This software       */
  14. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  15. /* specified by the MPEG-4 standard.                                        */
  16. /*                                                                          */
  17. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  18. /* of the MPEG-4 standard free license to use this  software module or      */
  19. /* modifications thereof for hardware or software products claiming         */
  20. /* conformance to the MPEG-4 standard.                                      */
  21. /*                                                                          */
  22. /* Those Intending to use this software module in hardware or software      */
  23. /* products are advised that use may infringe existing  patents. The        */
  24. /* original developers of this software module and their companies, the     */
  25. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  26. /* and ISO/IEC have no liability for use of this software module or         */
  27. /* modification thereof in an implementation.                               */
  28. /*                                                                          */
  29. /* Permission is granted to MPEG memebers to use, copy, modify,             */
  30. /* and distribute the software modules ( or portions thereof )              */
  31. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  32. /*                                                                          */
  33. /* Copyright (C) 1998  Sarnoff Corporation and Texas Instruments            */ 
  34. /****************************************************************************/
  35. /************************************************************/
  36. /*     Sarnoff Very Low Bit Rate Still Image Coder          */
  37. /*     Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
  38. /************************************************************/
  39. /****************************************************************************/
  40. /*     Texas Instruments Predictive Embedded Zerotree (PEZW) Image Codec    */
  41. /*     Copyright 1996, 1997, 1998 Texas Instruments            */
  42. /****************************************************************************/
  43. #include <stdio.h>
  44. #include <math.h>
  45. #include "dataStruct.hpp"
  46. #include "dwt.h"
  47. #include "states.hpp"
  48. Void CVTCCommon::ComputePSNR(UChar *orgY, UChar *recY, 
  49.  UChar *maskY,
  50.  UChar *orgU, UChar *recU, 
  51.  UChar *maskU,
  52.  UChar *orgV, UChar *recV, 
  53.  UChar *maskV,
  54.  Int width, Int height, Int stat)
  55. {
  56.     Int i;
  57.     Double quad, quad_Cr, quad_Cb, diff;
  58.     Double SNR_l, SNR_Cb=0, SNR_Cr=0;
  59.     Int  num,colors;
  60.     Int peakvalue = 255;
  61.     Int infSNR_l, infSNR_Cb=0, infSNR_Cr=0;
  62.     quad  = quad_Cr = quad_Cb = 0.0;
  63.     
  64.     if (orgU==NULL || recU==NULL || orgV==NULL || recV==NULL)
  65.       colors=1;
  66.     else
  67.       colors=3;
  68.     /* Calculate luminance PSNR */
  69.     num = 0;
  70.     for (i=0; i<width*height; i++) {
  71.       if (maskY[i] == DWT_IN) {
  72. diff = (Int)((UChar *)orgY)[i] -
  73.   (Int)((UChar *)recY)[i];
  74. quad += diff * diff;
  75. num ++;
  76.       }
  77.     }
  78.     
  79.     /* SNR_l = quad/(pels*lines); */
  80.     SNR_l = quad/num;
  81.     if (SNR_l) 
  82.     {
  83.       SNR_l = (peakvalue*peakvalue) / SNR_l;
  84.       SNR_l = 10 * log10(SNR_l);
  85.       infSNR_l = 0;
  86.     }
  87.     else
  88.     {
  89.       infSNR_l = 1;
  90.     }
  91.     /* Calculate chroma PSNRs */
  92.     if (colors==3) {
  93.       num = 0;
  94.       for (i=0; i<width*height/4; i++) {
  95. if (maskU[i] == DWT_IN) {
  96.   diff = (Int)((UChar *)orgU)[i] -
  97.     (Int)((UChar *)recU)[i]; 
  98.   quad_Cb += diff * diff;
  99.   num ++;
  100. }
  101.       }
  102.       SNR_Cb = quad_Cb/num;
  103.       /* SNR_Cb = quad_Cb/(pels*lines/4.0); */
  104.       if (orgV != NULL && recV != NULL) {
  105. SNR_Cb = quad_Cb/num;
  106. if (SNR_Cb) 
  107. {
  108.   SNR_Cb = (peakvalue*peakvalue) / SNR_Cb;
  109.   SNR_Cb = 10 * log10(SNR_Cb);
  110.   infSNR_Cb = 0;
  111. }
  112. else 
  113. {
  114.   infSNR_Cb = 1;
  115. }
  116.       }
  117.       num = 0;
  118.       for (i=0; i<width*height/4; i++) {
  119. if (maskV[i] == DWT_IN) {
  120.   diff = (Int)((UChar *)orgV)[i] -
  121.     (Int)((UChar *)recV)[i];
  122.   quad_Cr += diff * diff;
  123.   num ++;
  124. }
  125.       }
  126.       
  127.       SNR_Cr = quad_Cr/num;
  128.       
  129.       if (SNR_Cr) 
  130.       {
  131. SNR_Cr = (peakvalue*peakvalue) / SNR_Cr;
  132. SNR_Cr = 10 * log10(SNR_Cr);
  133. infSNR_Cr = 0;
  134.       }
  135.       else
  136.       {
  137. infSNR_Cr = 1;
  138.       }
  139.     }
  140.     
  141.     /* Display PSNRs */
  142.     if (stat)
  143.     {
  144.       if (infSNR_l==0)
  145. noteStat("nPSNR_Y: %.4f dBn",SNR_l);
  146.       else
  147. noteStat("nPSNR_Y: +INF dBn");
  148.       
  149.       if (colors == 3) {
  150. if (infSNR_Cb==0)
  151.   noteStat("PSNR_U: %.4f dBn",SNR_Cb);
  152. else
  153.   noteStat("PSNR_U: +INF dBn");
  154. if (infSNR_Cr==0)
  155.   noteStat("PSNR_V: %.4f dBn",SNR_Cr);
  156. else
  157.   noteStat("PSNR_V: +INF dBn");
  158.       }
  159.     }
  160.     else
  161.     {
  162.       if (infSNR_l==0)
  163. noteProgress("nPSNR_Y: %.4f dB",SNR_l);
  164.       else
  165. noteProgress("nPSNR_Y: +INF dB");
  166.       
  167.       if (colors == 3) {
  168. if (infSNR_Cb==0)
  169.   noteProgress("PSNR_U: %.4f dB",SNR_Cb);
  170. else
  171.   noteProgress("PSNR_U: +INF dB");
  172. if (infSNR_Cr==0)
  173.   noteProgress("PSNR_V: %.4f dB",SNR_Cr);
  174. else
  175.   noteProgress("PSNR_V: +INF dB");
  176.       }
  177.     }
  178. }