stats.c
上传用户:ma_junhua
上传日期:2008-04-11
资源大小:2752k
文件大小:11k
开发平台:

C/C++

  1. /* stats.c, coding statistics                                               */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #include <math.h>
  29. #include "config.h"
  30. #include "global.h"
  31. /* private prototypes */
  32. static void calcSNR1 _ANSI_ARGS_((unsigned char *org, unsigned char *rec,
  33.   int lx, int w, int h, double *pv, double *pe));
  34. void calcSNR(org,rec)
  35. unsigned char *org[3];
  36. unsigned char *rec[3];
  37. {
  38.   int w,h,offs;
  39.   double v,e;
  40.   w = horizontal_size;
  41.   h = (pict_struct==FRAME_PICTURE) ? vertical_size : (vertical_size>>1);
  42.   offs = (pict_struct==BOTTOM_FIELD) ? width : 0;
  43.   calcSNR1(org[0]+offs,rec[0]+offs,width2,w,h,&v,&e);
  44.   fprintf(statfile,"Y: variance=%4.4g, MSE=%3.3g (%3.3g dB), SNR=%3.3g dBn",
  45.     v, e, 10.0*log10(255.0*255.0/e), 10.0*log10(v/e));
  46.   if (chroma_format!=CHROMA444)
  47.   {
  48.     w >>= 1;
  49.     offs >>= 1;
  50.   }
  51.   if (chroma_format==CHROMA420)
  52.     h >>= 1;
  53.   calcSNR1(org[1]+offs,rec[1]+offs,chrom_width2,w,h,&v,&e);
  54.   fprintf(statfile,"U: variance=%4.4g, MSE=%3.3g (%3.3g dB), SNR=%3.3g dBn",
  55.     v, e, 10.0*log10(255.0*255.0/e), 10.0*log10(v/e));
  56.   calcSNR1(org[2]+offs,rec[2]+offs,chrom_width2,w,h,&v,&e);
  57.   fprintf(statfile,"V: variance=%4.4g, MSE=%3.3g (%3.3g dB), SNR=%3.3g dBn",
  58.     v, e, 10.0*log10(255.0*255.0/e), 10.0*log10(v/e));
  59. }
  60. static void calcSNR1(org,rec,lx,w,h,pv,pe)
  61. unsigned char *org;
  62. unsigned char *rec;
  63. int lx,w,h;
  64. double *pv,*pe;
  65. {
  66.   int i, j;
  67.   double v1, s1, s2, e2;
  68.   s1 = s2 = e2 = 0.0;
  69.   for (j=0; j<h; j++)
  70.   {
  71.     for (i=0; i<w; i++)
  72.     {
  73.       v1 = org[i];
  74.       s1+= v1;
  75.       s2+= v1*v1;
  76.       v1-= rec[i];
  77.       e2+= v1*v1;
  78.     }
  79.     org += lx;
  80.     rec += lx;
  81.   }
  82.   s1 /= w*h;
  83.   s2 /= w*h;
  84.   e2 /= w*h;
  85.   /* prevent division by zero in calcSNR() */
  86.   if(e2==0.0)
  87.     e2 = 0.00001;
  88.   *pv = s2 - s1*s1; /* variance */
  89.   *pe = e2;         /* MSE */
  90. }
  91. void stats()
  92. {
  93.   int i, j, k, nmb, mb_type;
  94.   int n_skipped, n_intra, n_ncoded, n_blocks, n_interp, n_forward, n_backward;
  95.   struct mbinfo *mbi;
  96.   nmb = mb_width*mb_height2;
  97.   n_skipped=n_intra=n_ncoded=n_blocks=n_interp=n_forward=n_backward=0;
  98.   for (k=0; k<nmb; k++)
  99.   {
  100.     mbi = mbinfo+k;
  101.     if (mbi->skipped)
  102.       n_skipped++;
  103.     else if (mbi->mb_type & MB_INTRA)
  104.       n_intra++;
  105.     else if (!(mbi->mb_type & MB_PATTERN))
  106.       n_ncoded++;
  107.     for (i=0; i<block_count; i++)
  108.       if (mbi->cbp & (1<<i))
  109.         n_blocks++;
  110.     if (mbi->mb_type & MB_FORWARD)
  111.     {
  112.       if (mbi->mb_type & MB_BACKWARD)
  113.         n_interp++;
  114.       else
  115.         n_forward++;
  116.     }
  117.     else if (mbi->mb_type & MB_BACKWARD)
  118.       n_backward++;
  119.   }
  120.   fprintf(statfile,"npicture statistics:n");
  121.   fprintf(statfile," # of intra coded macroblocks:  %4d (%.1f%%)n",
  122.     n_intra,100.0*(double)n_intra/nmb);
  123.   fprintf(statfile," # of coded blocks:             %4d (%.1f%%)n",
  124.     n_blocks,100.0*(double)n_blocks/(block_count*nmb));
  125.   fprintf(statfile," # of not coded macroblocks:    %4d (%.1f%%)n",
  126.     n_ncoded,100.0*(double)n_ncoded/nmb);
  127.   fprintf(statfile," # of skipped macroblocks:      %4d (%.1f%%)n",
  128.     n_skipped,100.0*(double)n_skipped/nmb);
  129.   fprintf(statfile," # of forw. pred. macroblocks:  %4d (%.1f%%)n",
  130.     n_forward,100.0*(double)n_forward/nmb);
  131.   fprintf(statfile," # of backw. pred. macroblocks: %4d (%.1f%%)n",
  132.     n_backward,100.0*(double)n_backward/nmb);
  133.   fprintf(statfile," # of interpolated macroblocks: %4d (%.1f%%)n",
  134.     n_interp,100.0*(double)n_interp/nmb);
  135.   fprintf(statfile,"nmacroblock_type map:n");
  136.   k = 0;
  137.   for (j=0; j<mb_height2; j++)
  138.   {
  139.     for (i=0; i<mb_width; i++)
  140.     {
  141.       mbi = mbinfo + k;
  142.       mb_type = mbi->mb_type;
  143.       if (mbi->skipped)
  144.         putc('S',statfile);
  145.       else if (mb_type & MB_INTRA)
  146.         putc('I',statfile);
  147.       else switch (mb_type & (MB_FORWARD|MB_BACKWARD))
  148.       {
  149.       case MB_FORWARD:
  150.         putc(mbi->motion_type==MC_FIELD ? 'f' :
  151.              mbi->motion_type==MC_DMV   ? 'p' :
  152.                                           'F',statfile); break;
  153.       case MB_BACKWARD:
  154.         putc(mbi->motion_type==MC_FIELD ? 'b' :
  155.                                           'B',statfile); break;
  156.       case MB_FORWARD|MB_BACKWARD:
  157.         putc(mbi->motion_type==MC_FIELD ? 'd' :
  158.                                           'D',statfile); break;
  159.       default:
  160.         putc('0',statfile); break;
  161.       }
  162.       if (mb_type & MB_QUANT)
  163.         putc('Q',statfile);
  164.       else if (mb_type & (MB_PATTERN|MB_INTRA))
  165.         putc(' ',statfile);
  166.       else
  167.         putc('N',statfile);
  168.       putc(' ',statfile);
  169.       k++;
  170.     }
  171.     putc('n',statfile);
  172.   }
  173.   fprintf(statfile,"nmquant map:n");
  174.   k=0;
  175.   for (j=0; j<mb_height2; j++)
  176.   {
  177.     for (i=0; i<mb_width; i++)
  178.     {
  179.       if (i==0 || mbinfo[k].mquant!=mbinfo[k-1].mquant)
  180.         fprintf(statfile,"%3d",mbinfo[k].mquant);
  181.       else
  182.         fprintf(statfile,"   ");
  183.       k++;
  184.     }
  185.     putc('n',statfile);
  186.   }
  187. #if 0
  188.   fprintf(statfile,"ncbp map:n");
  189.   k=0;
  190.   for (j=0; j<mb_height2; j++)
  191.   {
  192.     for (i=0; i<mb_width; i++)
  193.     {
  194.       fprintf(statfile,"%02x ",mbinfo[k].cbp);
  195.       k++;
  196.     }
  197.     putc('n',statfile);
  198.   }
  199.   if (pict_struct==FRAME_PICTURE && !frame_pred_dct)
  200.   {
  201.     fprintf(statfile,"ndct_type map:n");
  202.     k=0;
  203.     for (j=0; j<mb_height2; j++)
  204.     {
  205.       for (i=0; i<mb_width; i++)
  206.       {
  207.         if (mbinfo[k].mb_type & (MB_PATTERN|MB_INTRA))
  208.           fprintf(statfile,"%d  ",mbinfo[k].dct_type);
  209.         else
  210.           fprintf(statfile,"   ");
  211.   
  212.         k++;
  213.       }
  214.       putc('n',statfile);
  215.     }
  216.   }
  217.   if (pict_type!=I_TYPE)
  218.   {
  219.     fprintf(statfile,"nforward motion vectors (first vector, horizontal):n");
  220.     k=0;
  221.     for (j=0; j<mb_height2; j++)
  222.     {
  223.       for (i=0; i<mb_width; i++)
  224.       {
  225.         if (mbinfo[k].mb_type & MB_FORWARD)
  226.           fprintf(statfile,"%4d",mbinfo[k].MV[0][0][0]);
  227.         else
  228.           fprintf(statfile,"   .");
  229.   
  230.         k++;
  231.       }
  232.       putc('n',statfile);
  233.     }
  234.     fprintf(statfile,"nforward motion vectors (first vector, vertical):n");
  235.     k=0;
  236.     for (j=0; j<mb_height2; j++)
  237.     {
  238.       for (i=0; i<mb_width; i++)
  239.       {
  240.         if (mbinfo[k].mb_type & MB_FORWARD)
  241.           fprintf(statfile,"%4d",mbinfo[k].MV[0][0][1]);
  242.         else
  243.           fprintf(statfile,"   .");
  244.   
  245.         k++;
  246.       }
  247.       putc('n',statfile);
  248.     }
  249.     fprintf(statfile,"nforward motion vectors (second vector, horizontal):n");
  250.     k=0;
  251.     for (j=0; j<mb_height2; j++)
  252.     {
  253.       for (i=0; i<mb_width; i++)
  254.       {
  255.         if (mbinfo[k].mb_type & MB_FORWARD
  256.             && ((pict_struct==FRAME_PICTURE && mbinfo[k].motion_type==MC_FIELD) ||
  257.                 (pict_struct!=FRAME_PICTURE && mbinfo[k].motion_type==MC_16X8)))
  258.           fprintf(statfile,"%4d",mbinfo[k].MV[1][0][0]);
  259.         else
  260.           fprintf(statfile,"   .");
  261.   
  262.         k++;
  263.       }
  264.       putc('n',statfile);
  265.     }
  266.     fprintf(statfile,"nforward motion vectors (second vector, vertical):n");
  267.     k=0;
  268.     for (j=0; j<mb_height2; j++)
  269.     {
  270.       for (i=0; i<mb_width; i++)
  271.       {
  272.         if (mbinfo[k].mb_type & MB_FORWARD
  273.             && ((pict_struct==FRAME_PICTURE && mbinfo[k].motion_type==MC_FIELD) ||
  274.                 (pict_struct!=FRAME_PICTURE && mbinfo[k].motion_type==MC_16X8)))
  275.           fprintf(statfile,"%4d",mbinfo[k].MV[1][0][1]);
  276.         else
  277.           fprintf(statfile,"   .");
  278.   
  279.         k++;
  280.       }
  281.       putc('n',statfile);
  282.     }
  283.   }
  284.     
  285.   if (pict_type==B_TYPE)
  286.   {
  287.     fprintf(statfile,"nbackward motion vectors (first vector, horizontal):n");
  288.     k=0;
  289.     for (j=0; j<mb_height2; j++)
  290.     {
  291.       for (i=0; i<mb_width; i++)
  292.       {
  293.         if (mbinfo[k].mb_type & MB_BACKWARD)
  294.           fprintf(statfile,"%4d",mbinfo[k].MV[0][1][0]);
  295.         else
  296.           fprintf(statfile,"   .");
  297.   
  298.         k++;
  299.       }
  300.       putc('n',statfile);
  301.     }
  302.     fprintf(statfile,"nbackward motion vectors (first vector, vertical):n");
  303.     k=0;
  304.     for (j=0; j<mb_height2; j++)
  305.     {
  306.       for (i=0; i<mb_width; i++)
  307.       {
  308.         if (mbinfo[k].mb_type & MB_BACKWARD)
  309.           fprintf(statfile,"%4d",mbinfo[k].MV[0][1][1]);
  310.         else
  311.           fprintf(statfile,"   .");
  312.   
  313.         k++;
  314.       }
  315.       putc('n',statfile);
  316.     }
  317.     fprintf(statfile,"nbackward motion vectors (second vector, horizontal):n");
  318.     k=0;
  319.     for (j=0; j<mb_height2; j++)
  320.     {
  321.       for (i=0; i<mb_width; i++)
  322.       {
  323.         if (mbinfo[k].mb_type & MB_BACKWARD
  324.             && ((pict_struct==FRAME_PICTURE && mbinfo[k].motion_type==MC_FIELD) ||
  325.                 (pict_struct!=FRAME_PICTURE && mbinfo[k].motion_type==MC_16X8)))
  326.           fprintf(statfile,"%4d",mbinfo[k].MV[1][1][0]);
  327.         else
  328.           fprintf(statfile,"   .");
  329.   
  330.         k++;
  331.       }
  332.       putc('n',statfile);
  333.     }
  334.     fprintf(statfile,"nbackward motion vectors (second vector, vertical):n");
  335.     k=0;
  336.     for (j=0; j<mb_height2; j++)
  337.     {
  338.       for (i=0; i<mb_width; i++)
  339.       {
  340.         if (mbinfo[k].mb_type & MB_BACKWARD
  341.             && ((pict_struct==FRAME_PICTURE && mbinfo[k].motion_type==MC_FIELD) ||
  342.                 (pict_struct!=FRAME_PICTURE && mbinfo[k].motion_type==MC_16X8)))
  343.           fprintf(statfile,"%4d",mbinfo[k].MV[1][1][1]);
  344.         else
  345.           fprintf(statfile,"   .");
  346.   
  347.         k++;
  348.       }
  349.       putc('n',statfile);
  350.     }
  351.   }
  352. #endif
  353.     
  354. #if 0
  355.   /* useful for debugging */
  356.   fprintf(statfile,"nmacroblock info dump:n");
  357.   k=0;
  358.   for (j=0; j<mb_height2; j++)
  359.   {
  360.     for (i=0; i<mb_width; i++)
  361.     {
  362.       fprintf(statfile,"%d: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %dn",
  363.       k,
  364.       mbinfo[k].mb_type,
  365.       mbinfo[k].motion_type,
  366.       mbinfo[k].dct_type,
  367.       mbinfo[k].mquant,
  368.       mbinfo[k].cbp,
  369.       mbinfo[k].skipped,
  370.       mbinfo[k].MV[0][0][0],
  371.       mbinfo[k].MV[0][0][1],
  372.       mbinfo[k].MV[0][1][0],
  373.       mbinfo[k].MV[0][1][1],
  374.       mbinfo[k].MV[1][0][0],
  375.       mbinfo[k].MV[1][0][1],
  376.       mbinfo[k].MV[1][1][0],
  377.       mbinfo[k].MV[1][1][1],
  378.       mbinfo[k].mv_field_sel[0][0],
  379.       mbinfo[k].mv_field_sel[0][1],
  380.       mbinfo[k].mv_field_sel[1][0],
  381.       mbinfo[k].mv_field_sel[1][1]);
  382.       k++;
  383.     }
  384.   }
  385. #endif
  386. }