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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *  file
  3.  *     report.c
  4.  *  brief
  5.  *     Report related files()
  6.  *  author
  7.  *   Main contributors (see contributors.h for copyright, address and affiliation details)
  8.  *   - Karsten Suehring                <suehring@hhi.de>
  9.  *   - Alexis Michael Tourapis         <alexismt@ieee.org>
  10.  ***********************************************************************
  11.  */
  12. #include "contributors.h"
  13. #include <time.h>
  14. #include <math.h>
  15. #include <sys/timeb.h>
  16. #include "global.h"
  17. #include "context_ini.h"
  18. #include "explicit_gop.h"
  19. #include "filehandle.h"
  20. #include "fmo.h"
  21. #include "image.h"
  22. #include "intrarefresh.h"
  23. #include "leaky_bucket.h"
  24. #include "me_epzs.h"
  25. #include "output.h"
  26. #include "parset.h"
  27. #include "report.h"
  28. StatParameters   statistics,  *stats = &statistics;
  29. DistortionParams distortions, *dist  = &distortions;
  30. static char DistortionType[3][20] = {"SAD", "SSE", "Hadamard SAD"};
  31. extern int frame_statistic_start;
  32. extern ColocatedParams *Co_located;
  33. extern ColocatedParams *Co_located_JV[MAX_PLANE];  //!< Co_located to be used during 4:4:4 independent mode encoding
  34. extern void Clear_Motion_Search_Module (void);
  35. void   report_log_mode(InputParameters *params, StatParameters *stats, int64 bit_use[NUM_SLICE_TYPES][2]);
  36. /*!
  37.  ************************************************************************
  38.  * brief
  39.  *    Reports frame statistical data to a stats file
  40.  ************************************************************************
  41.  */
  42. void report_frame_statistic()
  43. {
  44.   FILE *p_stat_frm = NULL;
  45.   static int64 last_bit_ctr_n = 0;
  46.   int i;
  47.   char name[30];
  48.   int bitcounter;
  49.   StatParameters *cur_stats = &enc_picture->stats;
  50. #ifndef WIN32
  51.   time_t now;
  52.   struct tm *l_time;
  53.   char string[1000];
  54. #else
  55.   char timebuf[128];
  56. #endif
  57.   // write to log file
  58.   if ((p_stat_frm = fopen("stat_frame.dat", "r")) == 0)            // check if file exists
  59.   {
  60.     if ((p_stat_frm = fopen("stat_frame.dat", "a")) == NULL)       // append new statistic at the end
  61.     {
  62.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "stat_frame.dat.dat");
  63.       error(errortext, 500);
  64.     }
  65.     else                                            // Create header for new log file
  66.     {
  67.       fprintf(p_stat_frm, " --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n");
  68.       fprintf(p_stat_frm, "|            Encoder statistics. This file is generated during first encoding session, new sessions will be appended                                                                                                                                                                                                                                                                                                                                                              |n");
  69.       fprintf(p_stat_frm, " --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n");
  70.     }
  71.   }
  72.   else
  73.   {
  74.     fclose (p_stat_frm);
  75.     if ((p_stat_frm = fopen("stat_frame.dat", "a")) == NULL)       // File exists, just open for appending
  76.     {
  77.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "stat_frame.dat.dat");
  78.       error(errortext, 500);
  79.     }
  80.   }
  81.   if (frame_statistic_start)
  82.   {
  83.     fprintf(p_stat_frm, "|     ver     | Date  | Time  |    Sequence                  |Frm | QP |P/MbInt|   Bits   |  SNRY  |  SNRU  |  SNRV  |  I4  |  I8  | I16  | IC0  | IC1  | IC2  | IC3  | PI4  | PI8  | PI16 |  P0  |  P1  |  P2  |  P3  | P1*4*| P1*8*| P2*4*| P2*8*| P3*4*| P3*8*|  P8  | P8:4 | P4*4*| P4*8*| P8:5 | P8:6 | P8:7 | BI4  | BI8  | BI16 |  B0  |  B1  |  B2  |  B3  | B0*4*| B0*8*| B1*4*| B1*8*| B2*4*| B2*8*| B3*4*| B3*8*|  B8  | B8:0 |B80*4*|B80*8*| B8:4 | B4*4*| B4*8*| B8:5 | B8:6 | B8:7 |n");
  84.     fprintf(p_stat_frm, " ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ n");
  85.   }
  86.   //report
  87.   fprintf(p_stat_frm, "|%4s/%s", VERSION, EXT_VERSION);
  88. #ifdef WIN32
  89.   _strdate( timebuf );
  90.   fprintf(p_stat_frm, "| %1.5s |", timebuf);
  91.   _strtime( timebuf);
  92.   fprintf(p_stat_frm, " % 1.5s |", timebuf);
  93. #else
  94.   now = time ((time_t *) NULL); // Get the system time and put it into 'now' as 'calender time'
  95.   time (&now);
  96.   l_time = localtime (&now);
  97.   strftime (string, sizeof string, "%d-%b-%Y", l_time);
  98.   fprintf(p_stat_frm, "| %1.5s |", string );
  99.   strftime (string, sizeof string, "%H:%M:%S", l_time);
  100.   fprintf(p_stat_frm, " %1.5s |", string);
  101. #endif
  102.   for (i=0;i<30;i++)
  103.     name[i]=params->infile[i + imax(0,(int) (strlen(params->infile)- 30))]; // write last part of path, max 30 chars
  104.   fprintf(p_stat_frm, "%30.30s|", name);
  105.   fprintf(p_stat_frm, "%3d |", frame_no);
  106.   fprintf(p_stat_frm, "%3d |", img->qp);
  107.   fprintf(p_stat_frm, "  %d/%d  |", params->PicInterlace, params->MbInterlace);
  108.   if (img->frm_number == 0 && img->frame_num == 0)
  109.   {
  110.     bitcounter = (int) stats->bit_counter[I_SLICE];
  111.   }
  112.   else
  113.   {
  114.     bitcounter = (int) (stats->bit_ctr_n - last_bit_ctr_n);
  115.     last_bit_ctr_n = stats->bit_ctr_n;
  116.   }
  117.   //report bitrate
  118.   fprintf(p_stat_frm, " %9d|", bitcounter);
  119.   //report snr's  
  120.   fprintf(p_stat_frm, " %2.4f| %2.4f| %2.4f|", dist->metric[PSNR].value[0], dist->metric[PSNR].value[1], dist->metric[PSNR].value[2]);
  121.   //report modes
  122.   //I-Modes
  123.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[I_SLICE][I4MB ]);
  124.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[I_SLICE][I8MB ]);
  125.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[I_SLICE][I16MB]);
  126.   //chroma intra mode
  127.   fprintf(p_stat_frm, " %5d|", cur_stats->intra_chroma_mode[0]);
  128.   fprintf(p_stat_frm, " %5d|", cur_stats->intra_chroma_mode[1]);
  129.   fprintf(p_stat_frm, " %5d|", cur_stats->intra_chroma_mode[2]);
  130.   fprintf(p_stat_frm, " %5d|", cur_stats->intra_chroma_mode[3]);
  131.   //P-Modes
  132.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][I4MB ]);
  133.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][I8MB ]);
  134.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][I16MB]);
  135.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][0    ]);
  136.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][1    ]);
  137.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][2    ]);
  138.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][3    ]);
  139.   
  140.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][1][0]);
  141.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][1][1]);
  142.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][2][0]);
  143.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][2][1]);
  144.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][3][0]);
  145.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][3][1]);
  146.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][P8x8 ]);
  147.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][4    ]);
  148.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[P_SLICE][4][0]);
  149.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[P_SLICE][4][1]);
  150.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][5    ]);
  151.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][6    ]);
  152.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[P_SLICE][7    ]);
  153.   //B-Modes
  154.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][I4MB ]);
  155.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][I8MB ]);
  156.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][I16MB]);
  157.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][0    ]);
  158.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][1    ]);
  159.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][2    ]);
  160.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][3    ]);
  161.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][0][0]);
  162.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][0][1]);
  163.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][1][0]);
  164.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][1][1]);
  165.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][2][0]);
  166.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][2][1]);
  167.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][3][0]);
  168.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][3][1]);
  169.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][P8x8]);
  170.   fprintf(p_stat_frm, " %d|", (cur_stats->b8_mode_0_use [B_SLICE][0] + cur_stats->b8_mode_0_use [B_SLICE][1]));
  171.   fprintf(p_stat_frm, " %5d|", cur_stats->b8_mode_0_use [B_SLICE][0]);
  172.   fprintf(p_stat_frm, " %5d|", cur_stats->b8_mode_0_use [B_SLICE][1]);
  173.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][4   ]);
  174.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][4][0]);
  175.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use_transform[B_SLICE][4][1]);
  176.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][5   ]);
  177.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][6   ]);
  178.   fprintf(p_stat_frm, " %5" FORMAT_OFF_T  "|", cur_stats->mode_use[B_SLICE][7   ]);
  179.   fprintf(p_stat_frm, "n");
  180.   //save the last results
  181.   frame_statistic_start = 0;
  182.   fclose(p_stat_frm);
  183. }
  184. double report_slice_pred_stats(FILE *p_stat, StatParameters *stats, int slice_type, double bit_use, char *slice_name)
  185. {
  186.   fprintf(p_stat,"n ---------------------|----------------|-----------------|");
  187.   fprintf(p_stat,"n   %8s           |   Mode used    | MotionInfo bits |", slice_name);
  188.   fprintf(p_stat,"n ---------------------|----------------|-----------------|");
  189.   fprintf(p_stat,"n Mode  0  (copy)      |  %5" FORMAT_OFF_T  "         |    %8.2f     |", stats->mode_use[slice_type][0   ], (double)stats->bit_use_mode[slice_type][0   ] / bit_use);
  190.   fprintf(p_stat,"n Mode  1  (16x16)     |  %5" FORMAT_OFF_T  "         |    %8.2f     |", stats->mode_use[slice_type][1   ], (double)stats->bit_use_mode[slice_type][1   ] / bit_use);
  191.   fprintf(p_stat,"n Mode  2  (16x8)      |  %5" FORMAT_OFF_T  "         |    %8.2f     |", stats->mode_use[slice_type][2   ], (double)stats->bit_use_mode[slice_type][2   ] / bit_use);
  192.   fprintf(p_stat,"n Mode  3  (8x16)      |  %5" FORMAT_OFF_T  "         |    %8.2f     |", stats->mode_use[slice_type][3   ], (double)stats->bit_use_mode[slice_type][3   ] / bit_use);
  193.   fprintf(p_stat,"n Mode  4  (8x8)       |  %5" FORMAT_OFF_T  "         |    %8.2f     |", stats->mode_use[slice_type][P8x8], (double)stats->bit_use_mode[slice_type][P8x8] / bit_use);
  194.   fprintf(p_stat,"n Mode  5  intra 4x4   |  %5" FORMAT_OFF_T  "         |-----------------|", stats->mode_use[slice_type][I4MB]);
  195.   fprintf(p_stat,"n Mode  6  intra 8x8   |  %5" FORMAT_OFF_T  "         |", stats->mode_use[slice_type][I8MB]);
  196.   fprintf(p_stat,"n Mode  7+ intra 16x16 |  %5" FORMAT_OFF_T  "         |", stats->mode_use[slice_type][I16MB]);
  197.   fprintf(p_stat,"n Mode     intra IPCM  |  %5" FORMAT_OFF_T  "         |", stats->mode_use[slice_type][IPCM ]);
  198.   return (double)(stats->bit_use_mode[slice_type][0] + stats->bit_use_mode[slice_type][1] + stats->bit_use_mode[slice_type][2]
  199.   + stats->bit_use_mode[slice_type][3] + stats->bit_use_mode[slice_type][P8x8]) / bit_use;
  200. }
  201. /*!
  202.  ***********************************************************************
  203.  * brief
  204.  *    Terminates and reports statistics on error.
  205.  *
  206.  ***********************************************************************
  207.  */
  208. void report_stats_on_error(void)
  209. {
  210.   params->no_frames = img->frm_number;
  211.   free_encoder_memory(img);
  212.   exit (-1);
  213. }
  214. void report_stats(InputParameters *params, StatParameters *stats, int64 bit_use[NUM_SLICE_TYPES][2], float frame_rate)
  215. {
  216.   FILE *p_stat;                    //!< status file for the last encoding session
  217.   double mean_motion_info_bit_use[NUM_SLICE_TYPES] = {0.0};
  218.   int i;
  219.   if (strlen(params->StatsFile) == 0)
  220.     strcpy (params->StatsFile,"stats.dat");
  221.   if ((p_stat = fopen(params->StatsFile, "wt")) == 0)
  222.   {
  223.     snprintf(errortext, ET_SIZE, "Error open file %s", params->StatsFile);
  224.     error(errortext, 500);
  225.   }
  226.   fprintf(p_stat," -------------------------------------------------------------- n");
  227.   fprintf(p_stat,"  This file contains statistics for the last encoded sequence   n");
  228.   fprintf(p_stat," -------------------------------------------------------------- n");
  229.   fprintf(p_stat,   " Sequence                     : %sn", params->infile);
  230.   fprintf(p_stat,   " No.of coded pictures         : %4dn", stats->frame_counter);
  231.   fprintf(p_stat,   " Freq. for encoded bitstream  : %4.0fn", frame_rate);
  232.   fprintf(p_stat,   " I Slice Bitrate(kb/s)        : %6.2fn", stats->bitrate_st[I_SLICE] / 1000);
  233.   fprintf(p_stat,   " P Slice Bitrate(kb/s)        : %6.2fn", stats->bitrate_st[P_SLICE] / 1000);
  234.   fprintf(p_stat,   " B Slice Bitrate(kb/s)        : %6.2fn", stats->bitrate_st[B_SLICE] / 1000);
  235.   fprintf(p_stat,   " Total Bitrate(kb/s)          : %6.2fn", stats->bitrate / 1000);
  236.   for (i = 0; i < 3; i++)
  237.   {
  238.     fprintf(p_stat," ME Level %1d Metric            : %sn", i, DistortionType[params->MEErrorMetric[i]]);
  239.   }
  240.   fprintf(p_stat," Mode Decision Metric         : %sn", DistortionType[params->ModeDecisionMetric]);
  241.   switch ( params->ChromaMEEnable )
  242.   {
  243.   case 1:
  244.     fprintf(p_stat," ME for components            : YCbCrn");
  245.     break;
  246.   default:
  247.     fprintf(p_stat," ME for components            : Yn");
  248.     break;
  249.   }
  250.   fprintf(p_stat,  " Image format                 : %dx%dn", params->output.width, params->output.height);
  251.   if (params->intra_upd)
  252.     fprintf(p_stat," Error robustness             : Onn");
  253.   else
  254.     fprintf(p_stat," Error robustness             : Offn");
  255.   fprintf(p_stat,  " Search range                 : %dn", params->search_range);
  256.   fprintf(p_stat,   " Total number of references   : %dn", params->num_ref_frames);
  257.   fprintf(p_stat,   " References for P slices      : %dn", params->P_List0_refs ? params->P_List0_refs : params->num_ref_frames);
  258.   if (stats->frame_ctr[B_SLICE]!=0)
  259.   {
  260.     fprintf(p_stat, " List0 refs for B slices      : %dn", params->B_List0_refs ? params->B_List0_refs : params->num_ref_frames);
  261.     fprintf(p_stat, " List1 refs for B slices      : %dn", params->B_List1_refs ? params->B_List1_refs : params->num_ref_frames);
  262.   }
  263.   fprintf(p_stat,   " Profile/Level IDC            : (%d,%d)n", params->ProfileIDC, params->LevelIDC);
  264.   if (params->symbol_mode == CAVLC)
  265.     fprintf(p_stat,   " Entropy coding method        : CAVLCn");
  266.   else
  267.     fprintf(p_stat,   " Entropy coding method        : CABACn");
  268.   if (params->MbInterlace)
  269.     fprintf(p_stat, " MB Field Coding : On n");
  270.   if (params->SearchMode == EPZS)
  271.     EPZSOutputStats(params, p_stat, 1);
  272.   if (params->full_search == 2)
  273.     fprintf(p_stat," Search range restrictions    : nonen");
  274.   else if (params->full_search == 1)
  275.     fprintf(p_stat," Search range restrictions    : older reference framesn");
  276.   else
  277.     fprintf(p_stat," Search range restrictions    : smaller blocks and older reference framesn");
  278.   if (params->rdopt)
  279.     fprintf(p_stat," RD-optimized mode decision   : usedn");
  280.   else
  281.     fprintf(p_stat," RD-optimized mode decision   : not usedn");
  282.   fprintf(p_stat,"n ---------------------|----------------|---------------|");
  283.   fprintf(p_stat,"n     Item             |     Intra      |   All frames  |");
  284.   fprintf(p_stat,"n ---------------------|----------------|---------------|");
  285.   fprintf(p_stat,"n SNR Y(dB)            |");
  286.   fprintf(p_stat," %5.2f          |", dist->metric[PSNR].avslice[I_SLICE][0]);
  287.   fprintf(p_stat," %5.2f         |", dist->metric[PSNR].average[0]);
  288.   fprintf(p_stat,"n SNR U/V (dB)         |");
  289.   fprintf(p_stat," %5.2f/%5.2f    |", dist->metric[PSNR].avslice[I_SLICE][1], dist->metric[PSNR].avslice[I_SLICE][2]);
  290.   fprintf(p_stat," %5.2f/%5.2f   |", dist->metric[PSNR].average[1], dist->metric[PSNR].average[2]);
  291.   fprintf(p_stat,"n ---------------------|----------------|---------------|");
  292.   fprintf(p_stat,"n");
  293.   fprintf(p_stat,"n ---------------------|----------------|---------------|---------------|");
  294.   fprintf(p_stat,"n     SNR              |        I       |       P       |       B       |");
  295.   fprintf(p_stat,"n ---------------------|----------------|---------------|---------------|");
  296.   fprintf(p_stat,"n SNR Y(dB)            |      %5.3f    |     %5.3f    |     %5.3f    |",
  297.     dist->metric[PSNR].avslice[I_SLICE][0], dist->metric[PSNR].avslice[P_SLICE][0], dist->metric[PSNR].avslice[B_SLICE][0]);
  298.   fprintf(p_stat,"n SNR U(dB)            |      %5.3f    |     %5.3f    |     %5.3f    |",
  299.     dist->metric[PSNR].avslice[I_SLICE][1], dist->metric[PSNR].avslice[P_SLICE][1], dist->metric[PSNR].avslice[B_SLICE][1]);
  300.   fprintf(p_stat,"n SNR V(dB)            |      %5.3f    |     %5.3f    |     %5.3f    |",
  301.     dist->metric[PSNR].avslice[I_SLICE][2], dist->metric[PSNR].avslice[P_SLICE][2], dist->metric[PSNR].avslice[B_SLICE][2]);
  302.   fprintf(p_stat,"n ---------------------|----------------|---------------|---------------|");  
  303.   fprintf(p_stat,"n");
  304.   // QUANT.
  305.   fprintf(p_stat,"n ---------------------|----------------|---------------|---------------|");
  306.   fprintf(p_stat,"n     Ave Quant        |        I       |       P       |       B       |");
  307.   fprintf(p_stat,"n ---------------------|----------------|---------------|---------------|");
  308.   fprintf(p_stat,"n        QP            |      %5.3f    |     %5.3f    |     %5.3f    |",
  309.     (float)stats->quant[I_SLICE]/dmax(1.0,(float)stats->num_macroblocks[I_SLICE]),
  310.     (float)stats->quant[P_SLICE]/dmax(1.0,(float)stats->num_macroblocks[P_SLICE]),
  311.     (float)stats->quant[B_SLICE]/dmax(1.0,(float)stats->num_macroblocks[B_SLICE]));
  312.   fprintf(p_stat,"n ---------------------|----------------|---------------|---------------|");  
  313.   fprintf(p_stat,"n");
  314.   // MODE
  315.   fprintf(p_stat,"n ---------------------|----------------|");
  316.   fprintf(p_stat,"n   Intra              |   Mode used    |");
  317.   fprintf(p_stat,"n ---------------------|----------------|");
  318.   fprintf(p_stat,"n Mode 0  intra 4x4    |  %5" FORMAT_OFF_T  "         |", stats->mode_use[I_SLICE][I4MB ]);
  319.   fprintf(p_stat,"n Mode 1  intra 8x8    |  %5" FORMAT_OFF_T  "         |", stats->mode_use[I_SLICE][I8MB ]);
  320.   fprintf(p_stat,"n Mode 2+ intra 16x16  |  %5" FORMAT_OFF_T  "         |", stats->mode_use[I_SLICE][I16MB]);
  321.   fprintf(p_stat,"n Mode    intra IPCM   |  %5" FORMAT_OFF_T  "         |", stats->mode_use[I_SLICE][IPCM ]);
  322.   // P slices
  323.   if (stats->frame_ctr[P_SLICE]!=0)
  324.   {    
  325.     mean_motion_info_bit_use[P_SLICE] = report_slice_pred_stats(p_stat, stats, P_SLICE,(double) bit_use[P_SLICE][0], "P Slice ");
  326.   }
  327.   // B slices
  328.   if (stats->frame_ctr[B_SLICE]!=0)
  329.   {
  330.     mean_motion_info_bit_use[B_SLICE] = report_slice_pred_stats(p_stat, stats, B_SLICE,(double) bit_use[B_SLICE][0], "B Slice ");
  331.   }
  332.   // SP slices
  333.   if (stats->frame_ctr[SP_SLICE]!=0)
  334.   {    
  335.     mean_motion_info_bit_use[SP_SLICE] = report_slice_pred_stats(p_stat, stats, SP_SLICE,(double) bit_use[SP_SLICE][0], "SP Slice");
  336.   }
  337.   fprintf(p_stat,"n ---------------------|----------------|");
  338.   fprintf(p_stat,"n");
  339.   fprintf(p_stat,"n ---------------------|----------------|----------------|----------------|");
  340.   fprintf(p_stat,"n  Bit usage:          |      Intra     |      Inter     |    B frame     |");
  341.   fprintf(p_stat,"n ---------------------|----------------|----------------|----------------|");
  342.   fprintf(p_stat,"n Header               |");
  343.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_header[I_SLICE] / bit_use[I_SLICE][0]);
  344.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_header[P_SLICE] / bit_use[P_SLICE][0]);
  345.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_header[B_SLICE] / bit_use[B_SLICE][0]);
  346.   fprintf(p_stat,"n Mode                 |");
  347.   fprintf(p_stat," %10.2f     |", (float)stats->bit_use_mb_type[I_SLICE] / bit_use[I_SLICE][0]);
  348.   fprintf(p_stat," %10.2f     |", (float)stats->bit_use_mb_type[P_SLICE] / bit_use[P_SLICE][0]);
  349.   fprintf(p_stat," %10.2f     |", (float)stats->bit_use_mb_type[B_SLICE] / bit_use[B_SLICE][0]);
  350.   fprintf(p_stat,"n Motion Info          |");
  351.   fprintf(p_stat,"        ./.     |");
  352.   fprintf(p_stat," %10.2f     |", mean_motion_info_bit_use[P_SLICE]);
  353.   fprintf(p_stat," %10.2f     |", mean_motion_info_bit_use[B_SLICE]);
  354.   fprintf(p_stat,"n CBP Y/C              |");
  355.   fprintf(p_stat," %10.2f     |", (float) stats->tmp_bit_use_cbp[I_SLICE] / bit_use[I_SLICE][0]);
  356.   fprintf(p_stat," %10.2f     |", (float) stats->tmp_bit_use_cbp[P_SLICE] / bit_use[P_SLICE][0]);   
  357.   fprintf(p_stat," %10.2f     |", (float) stats->tmp_bit_use_cbp[B_SLICE] / bit_use[B_SLICE][0]);
  358.   fprintf(p_stat,"n Coeffs. Y            |");
  359.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[0][I_SLICE] / bit_use[I_SLICE][0]);
  360.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[0][P_SLICE] / bit_use[P_SLICE][0]);   
  361.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[0][B_SLICE] / bit_use[B_SLICE][0]);
  362.   fprintf(p_stat,"n Coeffs. C            |");
  363.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeffC[I_SLICE] / bit_use[I_SLICE][0]);
  364.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeffC[P_SLICE] / bit_use[P_SLICE][0]);   
  365.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeffC[B_SLICE] / bit_use[B_SLICE][0]);
  366.   fprintf(p_stat,"n Coeffs. CB           |");
  367.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[1][I_SLICE] / bit_use[I_SLICE][0]);
  368.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[1][P_SLICE] / bit_use[P_SLICE][0]);   
  369.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[1][B_SLICE] / bit_use[B_SLICE][0]);
  370.   fprintf(p_stat,"n Coeffs. CB           |");
  371.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[2][I_SLICE] / bit_use[I_SLICE][0]);
  372.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[2][P_SLICE] / bit_use[P_SLICE][0]);   
  373.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_coeff[2][B_SLICE] / bit_use[B_SLICE][0]);
  374.   fprintf(p_stat,"n Delta quant          |");
  375.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_delta_quant[I_SLICE] / bit_use[I_SLICE][0]);
  376.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_delta_quant[P_SLICE] / bit_use[P_SLICE][0]);   
  377.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_delta_quant[B_SLICE] / bit_use[B_SLICE][0]);
  378.   fprintf(p_stat,"n Stuffing Bits        |");
  379.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_stuffingBits[I_SLICE] / bit_use[I_SLICE][0]);
  380.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_stuffingBits[P_SLICE] / bit_use[P_SLICE][0]);   
  381.   fprintf(p_stat," %10.2f     |", (float) stats->bit_use_stuffingBits[B_SLICE] / bit_use[B_SLICE][0]);
  382.   fprintf(p_stat,"n ---------------------|----------------|----------------|----------------|");
  383.   fprintf(p_stat,"n average bits/frame   |");
  384.   fprintf(p_stat," %10.2f     |", (float) bit_use[I_SLICE][1] / (float) bit_use[I_SLICE][0] );
  385.   fprintf(p_stat," %10.2f     |", (float) bit_use[P_SLICE][1] / (float) bit_use[P_SLICE][0] );
  386.   fprintf(p_stat," %10.2f     |", (float) bit_use[B_SLICE][1] / (float) bit_use[B_SLICE][0] );
  387.   fprintf(p_stat,"n ---------------------|----------------|----------------|----------------|");
  388.   fprintf(p_stat,"n");
  389.   fclose(p_stat);
  390. }
  391. void report_log(InputParameters *params, StatParameters *stats, float frame_rate)
  392. {
  393.   char name[40];
  394.   int i;
  395. #ifndef WIN32
  396.   time_t now;
  397.   struct tm *l_time;
  398.   char string[1000];
  399. #else
  400.   char timebuf[128];
  401. #endif
  402.   if ((p_log = fopen("log.dat", "r")) == 0)         // check if file exists
  403.   {
  404.     if ((p_log = fopen("log.dat", "a")) == NULL)    // append new statistic at the end
  405.     {
  406.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "log.dat");
  407.       error(errortext, 500);
  408.     }
  409.     else                                            // Create header for new log file
  410.     {
  411.       fprintf(p_log," ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ n");
  412.       fprintf(p_log,"|                          Encoder statistics. This file is generated during first encoding session, new sessions will be appended                                                                                                                                                                                 |n");
  413.       fprintf(p_log," ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ n");
  414.       fprintf(p_log,"|     ver     | Date  | Time  |               Sequence                 | #Img |P/MbInt| QPI| QPP| QPB| Format  |Iperiod| #B | FMES | Hdmd | S.R |#Ref | Freq |Coding|RD-opt|Intra upd|8x8Tr| SNRY 1| SNRU 1| SNRV 1| SNRY N| SNRU N| SNRV N|#Bitr I|#Bitr P|#Bitr B|#Bitr IPB|     Total Time   |      Me Time     |n");
  415.       fprintf(p_log," ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ n");
  416.     }
  417.   }
  418.   else
  419.   {
  420.     fclose (p_log);
  421.     if ((p_log = fopen("log.dat", "a")) == NULL)         // File exists, just open for appending
  422.     {
  423.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "log.dat");
  424.       error(errortext, 500);
  425.     }
  426.   }
  427.   fprintf(p_log,"|%5s/%-5s", VERSION, EXT_VERSION);
  428. #ifdef WIN32
  429.   _strdate( timebuf );
  430.   fprintf(p_log,"| %1.5s |", timebuf );
  431.   _strtime( timebuf);
  432.   fprintf(p_log," % 1.5s |", timebuf);
  433. #else
  434.   now = time ((time_t *) NULL); // Get the system time and put it into 'now' as 'calender time'
  435.   time (&now);
  436.   l_time = localtime (&now);
  437.   strftime (string, sizeof string, "%d-%b-%Y", l_time);
  438.   fprintf(p_log,"| %1.5s |", string );
  439.   strftime (string, sizeof string, "%H:%M:%S", l_time);
  440.   fprintf(p_log," %1.5s |", string );
  441. #endif
  442.   for (i=0; i < 40; i++)
  443.     name[i] = params->infile[i + imax(0, ((int) strlen(params->infile)) - 40)]; // write last part of path, max 40 chars
  444.   fprintf(p_log,"%40.40s|",name);
  445.   fprintf(p_log,"%5d |  %d/%d  |", params->no_frames, params->PicInterlace, params->MbInterlace);
  446.   fprintf(p_log," %-3d| %-3d| %-3d|", params->qp0, params->qpN, params->qpB);
  447.   fprintf(p_log,"%4dx%-4d|", params->output.width, params->output.height);
  448.   fprintf(p_log,"  %3d  |%3d |", params->intra_period, stats->successive_Bframe);
  449.   switch( params->SearchMode ) 
  450.   {
  451.   case UM_HEX:
  452.     fprintf(p_log,"  HEX |");
  453.     break;
  454.   case UM_HEX_SIMPLE:
  455.     fprintf(p_log," SHEX |");
  456.     break;
  457.   case EPZS:
  458.     fprintf(p_log," EPZS |");
  459.     break;
  460.   case FAST_FULL_SEARCH:
  461.     fprintf(p_log,"  FFS |");
  462.     break;
  463.   default:
  464.     fprintf(p_log,"  FS  |");
  465.     break;
  466.   }
  467.   fprintf(p_log,"  %1d%1d%1d |", params->MEErrorMetric[F_PEL], params->MEErrorMetric[H_PEL], params->MEErrorMetric[Q_PEL]);
  468.   fprintf(p_log," %3d | %2d  |", params->search_range, params->num_ref_frames );
  469.   fprintf(p_log," %5.2f|", (img->framerate *(float) (stats->successive_Bframe + 1)) / (float)(params->jumpd + 1));
  470.   if (params->symbol_mode == CAVLC)
  471.     fprintf(p_log," CAVLC|");
  472.   else
  473.     fprintf(p_log," CABAC|");
  474.   fprintf(p_log,"   %d  |", params->rdopt);
  475.   if (params->intra_upd == 1)
  476.     fprintf(p_log,"   ON    |");
  477.   else
  478.     fprintf(p_log,"   OFF   |");
  479.   fprintf(p_log,"  %d  |", params->Transform8x8Mode);
  480.   fprintf(p_log,"%7.3f|%7.3f|%7.3f|", 
  481.     dist->metric[PSNR].avslice[I_SLICE][0],
  482.     dist->metric[PSNR].avslice[I_SLICE][1],
  483.     dist->metric[PSNR].avslice[I_SLICE][2]);
  484.   fprintf(p_log,"%7.3f|%7.3f|%7.3f|", dist->metric[PSNR].average[0],dist->metric[PSNR].average[1],dist->metric[PSNR].average[2]);
  485.   /*
  486.   fprintf(p_log,"%-5.3f|%-5.3f|%-5.3f|", dist->metric[PSNR].avslice[I_SLICE][0], dist->metric[PSNR].avslice[I_SLICE][1], dist->metric[PSNR].avslice[I_SLICE][2]);
  487.   fprintf(p_log,"%-5.3f|%-5.3f|%-5.3f|", dist->metric[PSNR].avslice[P_SLICE][0], dist->metric[PSNR].avslice[P_SLICE][1], dist->metric[PSNR].avslice[P_SLICE][2]);
  488.   fprintf(p_log,"%-5.3f|%-5.3f|%-5.3f|", dist->metric[PSNR].avslice[B_SLICE][0], dist->metric[PSNR].avslice[B_SLICE][1], dist->metric[PSNR].avslice[B_SLICE][2]);
  489.   */
  490.   fprintf(p_log,"%7.0f|%7.0f|%7.0f|%9.0f|", stats->bitrate_st[I_SLICE],stats->bitrate_st[P_SLICE],stats->bitrate_st[B_SLICE], stats->bitrate);
  491.   fprintf(p_log,"   %12d   |   %12d   |", (int)tot_time,(int)me_tot_time);
  492.   fprintf(p_log,"n");
  493.   fclose(p_log);
  494.   p_log = fopen("data.txt", "a");
  495.   if ((stats->successive_Bframe != 0) && (stats->frame_ctr[B_SLICE] != 0)) // B picture used
  496.   {
  497.     fprintf(p_log, "%3d %2d %2d %2.2f %2.2f %2.2f %5" FORMAT_OFF_T  " "
  498.       "%2.2f %2.2f %2.2f %5d "
  499.       "%2.2f %2.2f %2.2f %5" FORMAT_OFF_T  " %5" FORMAT_OFF_T  " %.3fn",
  500.       params->no_frames, params->qp0, params->qpN,
  501.       dist->metric[PSNR].avslice[I_SLICE][0],
  502.       dist->metric[PSNR].avslice[I_SLICE][1],
  503.       dist->metric[PSNR].avslice[I_SLICE][2],
  504.       stats->bit_counter[I_SLICE],
  505.       0.0,
  506.       0.0,
  507.       0.0,
  508.       0,
  509.       dist->metric[PSNR].average[0],
  510.       dist->metric[PSNR].average[1],
  511.       dist->metric[PSNR].average[2],
  512.       (stats->bit_counter[I_SLICE] + stats->bit_ctr) / stats->frame_counter,
  513.       stats->bit_counter[B_SLICE] / stats->frame_ctr[B_SLICE],
  514.       (double) 0.001 * tot_time / (stats->frame_counter));
  515.   }
  516.   else
  517.   {
  518.     if (params->no_frames != 0)
  519.       fprintf(p_log, "%3d %2d %2d %2.2f %2.2f %2.2f %5" FORMAT_OFF_T  " "
  520.       "%2.2f %2.2f %2.2f %5d "
  521.       "%2.2f %2.2f %2.2f %5" FORMAT_OFF_T  " %5d %.3fn",
  522.       params->no_frames, params->qp0, params->qpN,
  523.       dist->metric[PSNR].avslice[I_SLICE][0],
  524.       dist->metric[PSNR].avslice[I_SLICE][1],
  525.       dist->metric[PSNR].avslice[I_SLICE][2],
  526.       stats->bit_counter[I_SLICE],
  527.       0.0,
  528.       0.0,
  529.       0.0,
  530.       0,
  531.       dist->metric[PSNR].average[0],
  532.       dist->metric[PSNR].average[1],
  533.       dist->metric[PSNR].average[2],
  534.       (stats->bit_counter[I_SLICE] + stats->bit_ctr)/ stats->frame_counter,
  535.       0,
  536.       (double)0.001*tot_time/params->no_frames);
  537.   }
  538.   fclose(p_log);
  539. }
  540. /*!
  541.  ************************************************************************
  542.  * brief
  543.  *    Reports the gathered information to appropriate outputs
  544.  * par Input:
  545.  *    struct inp_par *inp,                                            n
  546.  *    ImageParameters *img,                                            n
  547.  *    struct stat_par *stats,                                          n
  548.  *
  549.  * par Output:
  550.  *    None
  551.  ************************************************************************
  552.  */
  553. void report( ImageParameters *img, InputParameters *params, StatParameters *stats)
  554. {
  555.   int64 bit_use[NUM_SLICE_TYPES][2];
  556.   int i,j;
  557.   int64 total_bits;
  558.   float frame_rate;
  559.   bit_use[ I_SLICE][0] = stats->frame_ctr[I_SLICE];
  560.   bit_use[ P_SLICE][0] = imax(stats->frame_ctr[P_SLICE ] + stats->frame_ctr[SP_SLICE], 1);
  561.   bit_use[ B_SLICE][0] = imax(stats->frame_ctr[B_SLICE ], 1);
  562.   bit_use[SP_SLICE][0] = imax(stats->frame_ctr[SP_SLICE], 1);
  563.   //  Accumulate bit usage for inter and intra frames
  564.   for (j=0; j < NUM_SLICE_TYPES; j++)
  565.   {
  566.     bit_use[j][1] = 0;
  567.   }
  568.   for (j=0; j < NUM_SLICE_TYPES; j++)
  569.   {
  570.     for(i=0; i < MAXMODE; i++)
  571.       bit_use[j][1] += stats->bit_use_mode[j][i];
  572.     bit_use[j][1] += stats->bit_use_mb_type[j];
  573.     bit_use[j][1] += stats->bit_use_header[j];    
  574.     bit_use[j][1] += stats->tmp_bit_use_cbp[j];
  575.     bit_use[j][1] += stats->bit_use_coeffC[j];
  576.     bit_use[j][1] += stats->bit_use_coeff[0][j];   
  577.     bit_use[j][1] += stats->bit_use_coeff[1][j]; 
  578.     bit_use[j][1] += stats->bit_use_coeff[2][j]; 
  579.     bit_use[j][1] += stats->bit_use_delta_quant[j];
  580.     bit_use[j][1] += stats->bit_use_stuffingBits[j];
  581.   }
  582.   frame_rate = (img->framerate *(float)(stats->successive_Bframe + 1)) / (float) (params->jumpd + 1);
  583.   //! Currently adding NVB bits on P rate. Maybe additional stats info should be created instead and added in log file  
  584.   stats->bitrate_st[ I_SLICE] = (stats->bit_counter[ I_SLICE]) * (frame_rate) / (float) (stats->frame_counter);
  585.   stats->bitrate_st[ P_SLICE] = (stats->bit_counter[ P_SLICE]) * (frame_rate) / (float) (stats->frame_counter);
  586.   stats->bitrate_st[ B_SLICE] = (stats->bit_counter[ B_SLICE]) * (frame_rate) / (float) (stats->frame_counter);
  587.   stats->bitrate_st[SP_SLICE] = (stats->bit_counter[SP_SLICE]) * (frame_rate) / (float) (stats->frame_counter);
  588.   switch (params->Verbose)
  589.   {
  590.   case 0:
  591.   case 1:
  592.   default:
  593.     fprintf(stdout,"------------------ Average data all frames  -----------------------------------nn");
  594.     break;
  595.   case 2:
  596.     fprintf(stdout,"------------------------------------  Average data all frames  ---------------------------------nn");
  597.     break;
  598.   }
  599.   if (params->Verbose != 0)
  600.   {
  601.     DistMetric *snr     = &dist->metric[PSNR    ];
  602.     DistMetric *sse     = &dist->metric[SSE     ];
  603.     DistMetric *snr_rgb = &dist->metric[PSNR_RGB];
  604.     DistMetric *sse_rgb = &dist->metric[SSE_RGB ];
  605.     int  impix    = params->output.size_cmp[0];
  606.     int  impix_cr = params->output.size_cmp[1];
  607.     float csnr_y = psnr(img->max_imgpel_value_comp_sq[0], impix   , sse->average[0]);
  608.     float csnr_u = psnr(img->max_imgpel_value_comp_sq[1], impix_cr, sse->average[1]);
  609.     float csnr_v = psnr(img->max_imgpel_value_comp_sq[2], impix_cr, sse->average[2]);
  610.     fprintf(stdout,  " Total encoding time for the seq.  : %.3f sec (%.2f fps)n", tot_time*0.001, 1000.0 * (stats->frame_counter) / tot_time);
  611.     fprintf(stdout,  " Total ME time for sequence        : %.3f sec nn", me_tot_time*0.001);
  612.     fprintf(stdout," Y { PSNR (dB), cSNR (dB), MSE }   : { %5.2f, %5.2f, %5.2f }n", 
  613.       snr->average[0], csnr_y, sse->average[0]/impix);
  614.     fprintf(stdout," U { PSNR (dB), cSNR (dB), MSE }   : { %5.2f, %5.2f, %5.2f }n",
  615.       snr->average[1], csnr_u, sse->average[1]/impix_cr);
  616.     fprintf(stdout," V { PSNR (dB), cSNR (dB), MSE }   : { %5.2f, %5.2f, %5.2f }n",
  617.       snr->average[2], csnr_v, sse->average[2]/impix_cr);
  618.     if(params->DistortionYUVtoRGB == 1)
  619.     {
  620.       float csnr_r = psnr(img->max_imgpel_value_comp_sq[0], impix, sse_rgb->average[0]);
  621.       float csnr_g = psnr(img->max_imgpel_value_comp_sq[1], impix, sse_rgb->average[1]);
  622.       float csnr_b = psnr(img->max_imgpel_value_comp_sq[2], impix, sse_rgb->average[2]);
  623.       fprintf(stdout," R { PSNR (dB), cSNR (dB), MSE }   : { %5.2f, %5.2f, %5.2f }n", 
  624.         snr_rgb->average[0], csnr_r, sse_rgb->average[0]/impix);
  625.       fprintf(stdout," G { PSNR (dB), cSNR (dB), MSE }   : { %5.2f, %5.2f, %5.2f }n",
  626.         snr_rgb->average[1], csnr_g, sse_rgb->average[1]/impix);
  627.       fprintf(stdout," B { PSNR (dB), cSNR (dB), MSE }   : { %5.2f, %5.2f, %5.2f }n",
  628.         snr_rgb->average[2], csnr_b, sse_rgb->average[2]/impix);
  629.     }
  630.     if (params->Distortion[SSIM] == 1)
  631.     {
  632.       if(params->DistortionYUVtoRGB == 1)
  633.       {
  634.         fprintf(stdout," SSIM {Y, R}                       : { %5.4f, %5.4f }n", dist->metric[SSIM].average[0], dist->metric[SSIM_RGB].average[0]);
  635.         fprintf(stdout," SSIM {U, G}                       : { %5.4f, %5.4f }n", dist->metric[SSIM].average[1], dist->metric[SSIM_RGB].average[1]);
  636.         fprintf(stdout," SSIM {V, B}                       : { %5.4f, %5.4f }n", dist->metric[SSIM].average[2], dist->metric[SSIM_RGB].average[2]);
  637.       }
  638.       else
  639.       {
  640.         fprintf(stdout," Y SSIM                            : %5.4fn", dist->metric[SSIM].average[0]);
  641.         fprintf(stdout," U SSIM                            : %5.4fn", dist->metric[SSIM].average[1]);
  642.         fprintf(stdout," V SSIM                            : %5.4fn", dist->metric[SSIM].average[2]);
  643.       }
  644.     }
  645.     if (params->Distortion[MS_SSIM] == 1)
  646.     {
  647.       if(params->DistortionYUVtoRGB == 1)
  648.       {
  649.         fprintf(stdout," MS-SSIM {Y, R}                    : { %5.4f, %5.4f }n", dist->metric[MS_SSIM].average[0], dist->metric[MS_SSIM_RGB].average[0]);
  650.         fprintf(stdout," MS-SSIM {U, G}                    : { %5.4f, %5.4f }n", dist->metric[MS_SSIM].average[1], dist->metric[MS_SSIM_RGB].average[1]);
  651.         fprintf(stdout," MS-SSIM {V, B}                    : { %5.4f, %5.4f }n", dist->metric[MS_SSIM].average[2], dist->metric[MS_SSIM_RGB].average[2]);
  652.       }
  653.       else
  654.       {
  655.         fprintf(stdout," Y MS-SSIM                         : %5.4fn", dist->metric[MS_SSIM].average[0]);
  656.         fprintf(stdout," U MS-SSIM                         : %5.4fn", dist->metric[MS_SSIM].average[1]);
  657.         fprintf(stdout," V MS-SSIM                         : %5.4fn", dist->metric[MS_SSIM].average[2]);
  658.       }
  659.     }
  660.     fprintf(stdout,"n");
  661.   }
  662.   else
  663.     fprintf(stdout,  " Total encoding time for the seq.  : %.3f sec (%.2f fps)nn", tot_time*0.001, 1000.0 * (stats->frame_counter) / tot_time);
  664.   total_bits = stats->bit_ctr_parametersets;
  665.   for (i = 0; i < NUM_SLICE_TYPES; i++)
  666.     total_bits += stats->bit_counter[i];
  667.   if (stats->frame_ctr[B_SLICE] != 0)
  668.   {
  669.     fprintf(stdout, " Total bits                        : %" FORMAT_OFF_T  " (I %" FORMAT_OFF_T  ", P %" FORMAT_OFF_T  ", B %" FORMAT_OFF_T  " NVB %d) n",
  670.       total_bits,  stats->bit_counter[I_SLICE], stats->bit_counter[P_SLICE], stats->bit_counter[B_SLICE], stats->bit_ctr_parametersets);
  671.   }
  672.   else if (params->sp_periodicity == 0)
  673.   {
  674.     fprintf(stdout, " Total bits                        : %" FORMAT_OFF_T  " (I %" FORMAT_OFF_T  ", P %" FORMAT_OFF_T  ", NVB %d) n",
  675.       total_bits, stats->bit_counter[I_SLICE], stats->bit_counter[P_SLICE], stats->bit_ctr_parametersets);
  676.   }
  677.   else
  678.   {
  679.     fprintf(stdout, " Total bits                        : %" FORMAT_OFF_T  " (I %" FORMAT_OFF_T  ", P %" FORMAT_OFF_T  ", NVB %d) n",
  680.       total_bits, stats->bit_counter[I_SLICE], stats->bit_counter[P_SLICE], stats->bit_ctr_parametersets);
  681.   }
  682.   frame_rate = (img->framerate *(float)(stats->successive_Bframe + 1)) / (float) (params->jumpd + 1);
  683.   stats->bitrate= ((float) total_bits * frame_rate) / ((float) (stats->frame_counter));
  684.   fprintf(stdout, " Bit rate (kbit/s)  @ %2.2f Hz     : %5.2fn", frame_rate, stats->bitrate / 1000);
  685.   
  686.   for (i = 0; i < 5; i++)
  687.     stats->bit_ctr_emulationprevention += stats->bit_use_stuffingBits[i];
  688.   fprintf(stdout, " Bits to avoid Startcode Emulation : %" FORMAT_OFF_T  " n", stats->bit_ctr_emulationprevention);
  689.   fprintf(stdout, " Bits for parameter sets           : %d nn", stats->bit_ctr_parametersets);
  690.   switch (params->Verbose)
  691.   {
  692.   case 0:
  693.   case 1:
  694.   default:
  695.     fprintf(stdout,"-------------------------------------------------------------------------------n");
  696.     break;
  697.   case 2:
  698.     fprintf(stdout,"------------------------------------------------------------------------------------------------n");
  699.     break;
  700.   }  
  701.   fprintf(stdout,"Exit JM %s encoder ver %s ", JM, VERSION);
  702.   fprintf(stdout,"n");
  703.   // status file
  704.   report_stats(params, stats, bit_use, frame_rate);
  705.   // write to log file
  706.   report_log(params, stats, frame_rate);
  707.   if (params->ReportFrameStats)
  708.   {
  709.     if ((p_log = fopen("stat_frame.dat", "a")) == NULL)       // append new statistic at the end
  710.     {
  711.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "stat_frame.dat.dat");
  712.       //    error(errortext, 500);
  713.     }
  714.     else
  715.     {
  716.       fprintf(p_log," --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n");
  717.       fclose(p_log);
  718.     }
  719.     report_log_mode(params, stats, bit_use);
  720.   }
  721. }
  722. /*!
  723.  ************************************************************************
  724.  * brief
  725.  *    Prints the header of the protocol.
  726.  * par Input:
  727.  *    struct inp_par *inp
  728.  * par Output:
  729.  *    none
  730.  ************************************************************************
  731.  */
  732. void information_init ( ImageParameters *img, InputParameters *params, StatParameters *stats)
  733. {
  734.   int i;
  735.   static char yuv_types[4][10] = {"YUV 4:0:0", "YUV 4:2:0", "YUV 4:2:2", "YUV 4:4:4"};
  736.   switch (params->Verbose)
  737.   {
  738.   case 0:
  739.   case 1:
  740.   default:
  741.     printf("------------------------------- JM %4.4s %7.7s -------------------------------n", VERSION, EXT_VERSION);
  742.     break;
  743.   case 2:
  744.     printf("--------------------------------------- JM %4.4s %7.7s ----------------------------------------n", VERSION, EXT_VERSION);
  745.     break;
  746.   }
  747.   fprintf(stdout,  " Input YUV file                    : %s n", params->infile);
  748.   fprintf(stdout,  " Output H.264 bitstream            : %s n", params->outfile);
  749.   if (p_dec != -1)
  750.     fprintf(stdout,  " Output YUV file                   : %s n", params->ReconFile);
  751.   fprintf(stdout,  " YUV Format                        : %s n", &yuv_types[img->yuv_format][0]);//img->yuv_format==YUV422?"YUV 4:2:2":(img->yuv_format==YUV444)?"YUV 4:4:4":"YUV 4:2:0");
  752.   fprintf(stdout,  " Frames to be encoded I-P/B        : %d/%dn", params->no_frames, (params->successive_Bframe*(params->no_frames-1)));
  753.   if (params->Verbose != 0)
  754.   {
  755.     fprintf(stdout,  " Freq. for encoded bitstream       : %1.0fn", img->framerate/(float)(params->jumpd+1));
  756.     fprintf(stdout,  " PicInterlace / MbInterlace        : %d/%dn", params->PicInterlace, params->MbInterlace);
  757.     fprintf(stdout,  " Transform8x8Mode                  : %dn", params->Transform8x8Mode);
  758.     for (i=0; i<3; i++)
  759.     {
  760.       fprintf(stdout," ME Metric for Refinement Level %1d  : %sn", i, DistortionType[params->MEErrorMetric[i]]);
  761.     }
  762.     fprintf(stdout,  " Mode Decision Metric              : %sn", DistortionType[params->ModeDecisionMetric]);
  763.     switch ( params->ChromaMEEnable )
  764.     {
  765.     case 1:
  766.       fprintf(stdout," Motion Estimation for components  : YCbCrn");
  767.       break;
  768.     default:
  769.       fprintf(stdout," Motion Estimation for components  : Yn");
  770.       break;
  771.     }
  772.     fprintf(stdout,  " Image format                      : %dx%d (%dx%d)n", params->output.width, params->output.height, img->width,img->height);
  773.     if (params->intra_upd)
  774.       fprintf(stdout," Error robustness                  : Onn");
  775.     else
  776.       fprintf(stdout," Error robustness                  : Offn");
  777.     fprintf(stdout,  " Search range                      : %dn", params->search_range);
  778.     fprintf(stdout,  " Total number of references        : %dn", params->num_ref_frames);
  779.     fprintf(stdout,  " References for P slices           : %dn", params->P_List0_refs ? params->P_List0_refs : params->num_ref_frames);
  780.     fprintf(stdout,  " List0 references for B slices     : %dn", params->B_List0_refs ? params->B_List0_refs : params->num_ref_frames);
  781.     fprintf(stdout,  " List1 references for B slices     : %dn", params->B_List1_refs ? params->B_List1_refs : params->num_ref_frames);
  782.     // Sequence Type
  783.     fprintf(stdout,  " Sequence type                     :");
  784.     if (stats->successive_Bframe > 0 && params->HierarchicalCoding)
  785.     {
  786.       fprintf(stdout, " Hierarchy (QP: I %d, P %d, B %d) n",
  787.         params->qp0, params->qpN, params->qpB);
  788.     }
  789.     else if (stats->successive_Bframe > 0)
  790.     {
  791.       char seqtype[80];
  792.       int i,j;
  793.       strcpy (seqtype,"I");
  794.       for (j=0; j < 2; j++)
  795.       {
  796.         for (i=0; i < stats->successive_Bframe; i++)
  797.         {
  798.           if (params->BRefPictures)
  799.             strncat(seqtype,"-RB", imax(0, (int) (79 - strlen(seqtype))));
  800.           else
  801.             strncat(seqtype,"-B", imax(0, (int) (79 - strlen(seqtype))));
  802.         }
  803.         strncat(seqtype,"-P", imax(0, (int) (79 - strlen(seqtype))));
  804.       }
  805.       if (params->BRefPictures)
  806.         fprintf(stdout, " %s (QP: I %d, P %d, RB %d) n", seqtype, params->qp0, params->qpN, iClip3(0, 51, params->qpB + params->qpBRSOffset));
  807.       else
  808.         fprintf(stdout, " %s (QP: I %d, P %d, B %d) n", seqtype, params->qp0, params->qpN, params->qpB);
  809.     }
  810.     else if (stats->successive_Bframe == 0 && params->sp_periodicity == 0) 
  811.       fprintf(stdout, " IPPP (QP: I %d, P %d) n", params->qp0, params->qpN);
  812.     else 
  813.       fprintf(stdout, " I-P-P-SP-P (QP: I %d, P %d, SP (%d, %d)) n",  params->qp0, params->qpN, params->qpsp, params->qpsp_pred);
  814.     // report on entropy coding  method
  815.     if (params->symbol_mode == CAVLC)
  816.       fprintf(stdout," Entropy coding method             : CAVLCn");
  817.     else
  818.       fprintf(stdout," Entropy coding method             : CABACn");
  819.     fprintf(stdout,  " Profile/Level IDC                 : (%d,%d)n", params->ProfileIDC, params->LevelIDC);
  820.     if (params->SearchMode == UM_HEX)
  821.       fprintf(stdout,  " Motion Estimation Scheme          : HEXn");
  822.     else if (params->SearchMode == UM_HEX_SIMPLE)
  823.       fprintf(stdout,  " Motion Estimation Scheme          : SHEXn");
  824.     else if (params->SearchMode == EPZS)
  825.     {
  826.       fprintf(stdout,  " Motion Estimation Scheme          : EPZSn");
  827.       EPZSOutputStats(params, stdout, 0);
  828.     }
  829.     else if (params->SearchMode == FAST_FULL_SEARCH)
  830.       fprintf(stdout,  " Motion Estimation Scheme          : Fast Full Searchn");
  831.     else
  832.       fprintf(stdout,  " Motion Estimation Scheme          : Full Searchn");
  833.     if (params->full_search == 2)
  834.       fprintf(stdout," Search range restrictions         : nonen");
  835.     else if (params->full_search == 1)
  836.       fprintf(stdout," Search range restrictions         : older reference framesn");
  837.     else
  838.       fprintf(stdout," Search range restrictions         : smaller blocks and older reference framesn");
  839.     if (params->rdopt)
  840.       fprintf(stdout," RD-optimized mode decision        : usedn");
  841.     else
  842.       fprintf(stdout," RD-optimized mode decision        : not usedn");
  843.     switch(params->partition_mode)
  844.     {
  845.     case PAR_DP_1:
  846.       fprintf(stdout," Data Partitioning Mode            : 1 partition n");
  847.       break;
  848.     case PAR_DP_3:
  849.       fprintf(stdout," Data Partitioning Mode            : 3 partitions n");
  850.       break;
  851.     default:
  852.       fprintf(stdout," Data Partitioning Mode            : not supportedn");
  853.       break;
  854.     }
  855.     switch(params->of_mode)
  856.     {
  857.     case PAR_OF_ANNEXB:
  858.       fprintf(stdout," Output File Format                : H.264/AVC Annex B Byte Stream Format n");
  859.       break;
  860.     case PAR_OF_RTP:
  861.       fprintf(stdout," Output File Format                : RTP Packet File Format n");
  862.       break;
  863.     default:
  864.       fprintf(stdout," Output File Format                : not supportedn");
  865.       break;
  866.     }
  867.   }
  868.   switch (params->Verbose)
  869.   {
  870.   case 0:
  871.   default:
  872.     printf("-------------------------------------------------------------------------------n");
  873.     printf("nEncoding. Please Wait.nn");
  874.     break;    
  875.   case 1:
  876.     printf("-------------------------------------------------------------------------------n");
  877.     printf("  Frame  Bit/pic    QP   SnrY    SnrU    SnrV    Time(ms) MET(ms) Frm/Fld Ref  n");
  878.     printf("-------------------------------------------------------------------------------n");
  879.     break;
  880.   case 2:
  881.     if (params->Distortion[SSIM] == 1)
  882.     {
  883.       printf("------------------------------------------------------------------------------------------------------------------------n");
  884.       printf("  Frame  Bit/pic WP QP QL   SnrY    SnrU    SnrV   SsimY   SsimU   SsimV    Time(ms) MET(ms) Frm/Fld   I D L0 L1 RDP Refn");
  885.       printf("------------------------------------------------------------------------------------------------------------------------n");
  886.     }
  887.     else
  888.     {
  889.       printf("------------------------------------------------------------------------------------------------n");
  890.       printf("  Frame  Bit/pic WP QP QL   SnrY    SnrU    SnrV    Time(ms) MET(ms) Frm/Fld   I D L0 L1 RDP Refn");
  891.       printf("------------------------------------------------------------------------------------------------n");
  892.     }
  893.     break;
  894.    
  895.   }
  896. }
  897. /*!
  898.  ************************************************************************
  899.  * brief
  900.  *    Report mode distribution of the sequence to log_mode.dat
  901.  ************************************************************************
  902.  */
  903. void report_log_mode(InputParameters *params, StatParameters *stats, int64 bit_use[NUM_SLICE_TYPES][2])
  904. {
  905.   FILE *p_stat;                    //!< status file for the last encoding session
  906.   int i;
  907.   char name[40];
  908. #ifndef WIN32
  909.   time_t now;
  910.   struct tm *l_time;
  911.   char string[1000];
  912. #else
  913.   char timebuf[128];
  914. #endif
  915.   if ((p_stat = fopen("log_mode.dat", "r")) == 0)         // check if file exists
  916.   {
  917.     if ((p_stat = fopen("log_mode.dat", "a")) == NULL)    // append new statistic at the end
  918.     {
  919.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "log_mode.dat");
  920.       error(errortext, 500);
  921.     }
  922.     else                                            // Create header for new log file
  923.     {
  924.       fprintf(p_stat, " ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n");
  925.       fprintf(p_stat,"|                          Encoder statistics. This file is generated during first encoding session, new sessions will be appended                                                                                                                                                                                 |n");
  926.       fprintf(p_stat, " ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n");
  927.       fprintf(p_stat, "|     ver     | Date  | Time  |    Sequence                  | QP |  I4  |  I8  | I16  | IC0  | IC1  | IC2  | IC3  | PI4  | PI8  | PI16 |  P0  |  P1  |  P2  |  P3  | P1*4*| P1*8*| P2*4*| P2*8*| P3*4*| P3*8*|  P8  | P8:4 | P4*4*| P4*8*| P8:5 | P8:6 | P8:7 | BI4  | BI8  | BI16 |  B0  |  B1  |  B2  |  B3  | B0*4*| B0*8*| B1*4*| B1*8*| B2*4*| B2*8*| B3*4*| B3*8*|  B8  | B8:0 |B80*4*|B80*8*| B8:4 | B4*4*| B4*8*| B8:5 | B8:6 | B8:7 |n");
  928.       fprintf(p_stat, " ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n");
  929.     }
  930.   }
  931.   else
  932.   {
  933.     fclose (p_stat);
  934.     if ((p_stat = fopen("log_mode.dat", "a")) == NULL)         // File exists, just open for appending
  935.     {
  936.       snprintf(errortext, ET_SIZE, "Error open file %s  n", "log_mode.dat");
  937.       error(errortext, 500);
  938.     }
  939.   }
  940.   //report
  941.   fprintf(p_stat, "|%4s/%s", VERSION, EXT_VERSION);
  942. #ifdef WIN32
  943.   _strdate( timebuf );
  944.   fprintf(p_stat, "| %1.5s |", timebuf);
  945.   _strtime( timebuf);
  946.   fprintf(p_stat, " % 1.5s |", timebuf);
  947. #else
  948.   now = time ((time_t *) NULL); // Get the system time and put it into 'now' as 'calender time'
  949.   time (&now);
  950.   l_time = localtime (&now);
  951.   strftime (string, sizeof string, "%d-%b-%Y", l_time);
  952.   fprintf(p_stat, "| %1.5s |", string );
  953.   strftime (string, sizeof string, "%H:%M:%S", l_time);
  954.   fprintf(p_stat, " %1.5s |", string);
  955. #endif
  956.   for (i=0;i<30;i++)
  957.     name[i]=params->infile[i + imax(0,(int) (strlen(params->infile)- 30))]; // write last part of path, max 30 chars
  958.   fprintf(p_stat, "%30.30s|", name);
  959.   fprintf(p_stat, "%3d |", img->qp);
  960.   //report modes
  961.   //I-Modes
  962.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[I_SLICE][I4MB ]);
  963.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[I_SLICE][I8MB ]);
  964.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[I_SLICE][I16MB]);
  965.   //chroma intra mode
  966.   fprintf(p_stat, " %5d|", stats->intra_chroma_mode[0]);
  967.   fprintf(p_stat, " %5d|", stats->intra_chroma_mode[1]);
  968.   fprintf(p_stat, " %5d|", stats->intra_chroma_mode[2]);
  969.   fprintf(p_stat, " %5d|", stats->intra_chroma_mode[3]);
  970.   //P-Modes
  971.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][I4MB ]);
  972.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][I8MB ]);
  973.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][I16MB]);
  974.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][0    ]);
  975.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][1    ]);
  976.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][2    ]);
  977.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][3    ]);
  978.   
  979.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][1][0]);
  980.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][1][1]);
  981.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][2][0]);
  982.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][2][1]);
  983.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][3][0]);
  984.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][3][1]);
  985.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][P8x8 ]);
  986.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][4    ]);
  987.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][4][0]);
  988.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[P_SLICE][4][1]);
  989.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][5    ]);
  990.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][6    ]);
  991.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[P_SLICE][7    ]);
  992.   //B-Modes
  993.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][I4MB ]);
  994.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][I8MB ]);
  995.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][I16MB]);
  996.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][0    ]);
  997.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][1    ]);
  998.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][2    ]);
  999.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][3    ]);
  1000.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][0][0]);
  1001.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][0][1]);
  1002.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][1][0]);
  1003.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][1][1]);
  1004.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][2][0]);
  1005.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][2][1]);
  1006.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][3][0]);
  1007.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][3][1]);
  1008.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][P8x8]);
  1009.   fprintf(p_stat, " %d|", (stats->b8_mode_0_use [B_SLICE][0]+stats->b8_mode_0_use [B_SLICE][1]));
  1010.   fprintf(p_stat, " %5d|", stats->b8_mode_0_use [B_SLICE][0]);
  1011.   fprintf(p_stat, " %5d|", stats->b8_mode_0_use [B_SLICE][1]);
  1012.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][4   ]);
  1013.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][4][0]);
  1014.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use_transform[B_SLICE][4][1]);
  1015.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][5   ]);
  1016.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][6   ]);
  1017.   fprintf(p_stat, " %5" FORMAT_OFF_T  "|", stats->mode_use[B_SLICE][7   ]);
  1018.   fprintf(p_stat, "n");
  1019.   fclose(p_stat);
  1020. }