00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "contributors.h"
00014
00015 #include <time.h>
00016 #include <math.h>
00017 #include <sys/timeb.h>
00018 #include "global.h"
00019
00020 #include "context_ini.h"
00021 #include "explicit_gop.h"
00022 #include "filehandle.h"
00023 #include "fmo.h"
00024 #include "image.h"
00025 #include "intrarefresh.h"
00026 #include "leaky_bucket.h"
00027 #include "me_epzs.h"
00028 #include "output.h"
00029 #include "parset.h"
00030 #include "report.h"
00031
00032
00033 StatParameters statistics, *stats = &statistics;
00034 DistortionParams distortions, *dist = &distortions;
00035 static char DistortionType[3][20] = {"SAD", "SSE", "Hadamard SAD"};
00036
00037 extern int frame_statistic_start;
00038 extern ColocatedParams *Co_located;
00039 extern ColocatedParams *Co_located_JV[MAX_PLANE];
00040 extern void Clear_Motion_Search_Module (void);
00041 void report_log_mode(InputParameters *params, StatParameters *stats, int64 bit_use[NUM_SLICE_TYPES][2]);
00042
00043
00044
00045
00046
00047
00048 void report_frame_statistic()
00049 {
00050 FILE *p_stat_frm = NULL;
00051 static int64 last_bit_ctr_n = 0;
00052 int i;
00053 char name[30];
00054 int bitcounter;
00055 StatParameters *cur_stats = &enc_picture->stats;
00056
00057 #ifndef WIN32
00058 time_t now;
00059 struct tm *l_time;
00060 char string[1000];
00061 #else
00062 char timebuf[128];
00063 #endif
00064
00065
00066 if ((p_stat_frm = fopen("stat_frame.dat", "r")) == 0)
00067 {
00068 if ((p_stat_frm = fopen("stat_frame.dat", "a")) == NULL)
00069 {
00070 snprintf(errortext, ET_SIZE, "Error open file %s \n", "stat_frame.dat.dat");
00071 error(errortext, 500);
00072 }
00073 else
00074 {
00075 fprintf(p_stat_frm, " --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \n");
00076 fprintf(p_stat_frm, "| Encoder statistics. This file is generated during first encoding session, new sessions will be appended |\n");
00077 fprintf(p_stat_frm, " --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \n");
00078 }
00079 }
00080 else
00081 {
00082 fclose (p_stat_frm);
00083 if ((p_stat_frm = fopen("stat_frame.dat", "a")) == NULL)
00084 {
00085 snprintf(errortext, ET_SIZE, "Error open file %s \n", "stat_frame.dat.dat");
00086 error(errortext, 500);
00087 }
00088 }
00089
00090 if (frame_statistic_start)
00091 {
00092 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");
00093 fprintf(p_stat_frm, " ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ \n");
00094 }
00095
00096
00097 fprintf(p_stat_frm, "|%4s/%s", VERSION, EXT_VERSION);
00098
00099 #ifdef WIN32
00100 _strdate( timebuf );
00101 fprintf(p_stat_frm, "| %1.5s |", timebuf);
00102
00103 _strtime( timebuf);
00104 fprintf(p_stat_frm, " % 1.5s |", timebuf);
00105 #else
00106 now = time ((time_t *) NULL);
00107 time (&now);
00108 l_time = localtime (&now);
00109 strftime (string, sizeof string, "%d-%b-%Y", l_time);
00110 fprintf(p_stat_frm, "| %1.5s |", string );
00111
00112 strftime (string, sizeof string, "%H:%M:%S", l_time);
00113 fprintf(p_stat_frm, " %1.5s |", string);
00114 #endif
00115
00116 for (i=0;i<30;i++)
00117 name[i]=params->input_file1.fname[i + imax(0,(int) (strlen(params->input_file1.fname)- 30))];
00118
00119 fprintf(p_stat_frm, "%30.30s|", name);
00120 fprintf(p_stat_frm, "%3d |", img->frame_no);
00121 fprintf(p_stat_frm, "%3d |", img->qp);
00122 fprintf(p_stat_frm, " %d/%d |", params->PicInterlace, params->MbInterlace);
00123
00124
00125 if (img->frm_number == 0 && img->frame_num == 0)
00126 {
00127 bitcounter = (int) stats->bit_counter[I_SLICE];
00128 }
00129 else
00130 {
00131 bitcounter = (int) (stats->bit_ctr_n - last_bit_ctr_n);
00132 last_bit_ctr_n = stats->bit_ctr_n;
00133 }
00134
00135
00136 fprintf(p_stat_frm, " %9d|", bitcounter);
00137
00138
00139 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]);
00140
00141
00142
00143 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[I_SLICE][I4MB ]);
00144 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[I_SLICE][I8MB ]);
00145 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[I_SLICE][I16MB]);
00146
00147
00148 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->intra_chroma_mode[0]);
00149 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->intra_chroma_mode[1]);
00150 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->intra_chroma_mode[2]);
00151 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->intra_chroma_mode[3]);
00152
00153
00154 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][I4MB ]);
00155 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][I8MB ]);
00156 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][I16MB]);
00157 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][0 ]);
00158
00159 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][1 ]);
00160 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][2 ]);
00161 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][3 ]);
00162
00163 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][1][0]);
00164 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][1][1]);
00165 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][2][0]);
00166 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][2][1]);
00167 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][3][0]);
00168 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][3][1]);
00169
00170 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][P8x8 ]);
00171 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][4 ]);
00172 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[P_SLICE][4][0]);
00173 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[P_SLICE][4][1]);
00174 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][5 ]);
00175 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][6 ]);
00176 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[P_SLICE][7 ]);
00177
00178
00179 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][I4MB ]);
00180 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][I8MB ]);
00181 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][I16MB]);
00182 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][0 ]);
00183 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][1 ]);
00184 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][2 ]);
00185 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][3 ]);
00186 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][0][0]);
00187 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][0][1]);
00188 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][1][0]);
00189 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][1][1]);
00190 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][2][0]);
00191 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][2][1]);
00192 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][3][0]);
00193 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][3][1]);
00194
00195 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][P8x8]);
00196 fprintf(p_stat_frm, " %d|", (cur_stats->b8_mode_0_use [B_SLICE][0] + cur_stats->b8_mode_0_use [B_SLICE][1]));
00197 fprintf(p_stat_frm, " %5d|", cur_stats->b8_mode_0_use [B_SLICE][0]);
00198 fprintf(p_stat_frm, " %5d|", cur_stats->b8_mode_0_use [B_SLICE][1]);
00199 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][4 ]);
00200 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][4][0]);
00201 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use_transform[B_SLICE][4][1]);
00202 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][5 ]);
00203 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][6 ]);
00204 fprintf(p_stat_frm, " %5" FORMAT_OFF_T "|", cur_stats->mode_use[B_SLICE][7 ]);
00205
00206 fprintf(p_stat_frm, "\n");
00207
00208
00209 frame_statistic_start = 0;
00210 fclose(p_stat_frm);
00211 }
00212
00213
00214 double report_slice_pred_stats(FILE *p_stat, StatParameters *stats, int slice_type, double bit_use, char *slice_name)
00215 {
00216 fprintf(p_stat,"\n ---------------------|----------------|-----------------|");
00217 fprintf(p_stat,"\n %8s | Mode used | MotionInfo bits |", slice_name);
00218 fprintf(p_stat,"\n ---------------------|----------------|-----------------|");
00219 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);
00220 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);
00221 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);
00222 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);
00223 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);
00224 fprintf(p_stat,"\n Mode 5 intra 4x4 | %5" FORMAT_OFF_T " |-----------------|", stats->mode_use[slice_type][I4MB]);
00225 fprintf(p_stat,"\n Mode 6 intra 8x8 | %5" FORMAT_OFF_T " |", stats->mode_use[slice_type][I8MB]);
00226 fprintf(p_stat,"\n Mode 7+ intra 16x16 | %5" FORMAT_OFF_T " |", stats->mode_use[slice_type][I16MB]);
00227 fprintf(p_stat,"\n Mode intra IPCM | %5" FORMAT_OFF_T " |", stats->mode_use[slice_type][IPCM ]);
00228
00229 return (double)(stats->bit_use_mode[slice_type][0] + stats->bit_use_mode[slice_type][1] + stats->bit_use_mode[slice_type][2]
00230 + stats->bit_use_mode[slice_type][3] + stats->bit_use_mode[slice_type][P8x8]) / bit_use;
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240 void report_stats_on_error(void)
00241 {
00242 params->no_frm_base = img->frm_number;
00243 free_encoder_memory(img);
00244 exit (-1);
00245 }
00246
00247
00248 void report_stats(InputParameters *params, StatParameters *stats, int64 bit_use[NUM_SLICE_TYPES][2])
00249 {
00250 FILE *p_stat;
00251 double mean_motion_info_bit_use[NUM_SLICE_TYPES] = {0.0};
00252 int i;
00253
00254 if (strlen(params->StatsFile) == 0)
00255 strcpy (params->StatsFile,"stats.dat");
00256
00257 if ((p_stat = fopen(params->StatsFile, "wt")) == 0)
00258 {
00259 snprintf(errortext, ET_SIZE, "Error open file %s", params->StatsFile);
00260 error(errortext, 500);
00261 }
00262
00263 fprintf(p_stat," -------------------------------------------------------------- \n");
00264 fprintf(p_stat," This file contains statistics for the last encoded sequence \n");
00265 fprintf(p_stat," -------------------------------------------------------------- \n");
00266 fprintf(p_stat, " Sequence : %s\n", params->input_file1.fname);
00267
00268 fprintf(p_stat, " No.of coded pictures : %4d\n", stats->frame_counter);
00269 fprintf(p_stat, " Freq. for encoded bitstream : %4.0f\n", params->output.frame_rate);
00270
00271 fprintf(p_stat, " I Slice Bitrate(kb/s) : %6.2f\n", stats->bitrate_st[I_SLICE] / 1000.0);
00272 fprintf(p_stat, " P Slice Bitrate(kb/s) : %6.2f\n", stats->bitrate_st[P_SLICE] / 1000.0);
00273 fprintf(p_stat, " B Slice Bitrate(kb/s) : %6.2f\n", stats->bitrate_st[B_SLICE] / 1000.0);
00274 fprintf(p_stat, " Total Bitrate(kb/s) : %6.2f\n", stats->bitrate / 1000.0);
00275
00276 for (i = 0; i < 3; i++)
00277 {
00278 fprintf(p_stat," ME Level %1d Metric : %s\n", i, DistortionType[params->MEErrorMetric[i]]);
00279 }
00280 fprintf(p_stat," Mode Decision Metric : %s\n", DistortionType[params->ModeDecisionMetric]);
00281
00282 switch ( params->ChromaMEEnable )
00283 {
00284 case 1:
00285 fprintf(p_stat," ME for components : YCbCr\n");
00286 break;
00287 default:
00288 fprintf(p_stat," ME for components : Y\n");
00289 break;
00290 }
00291
00292 fprintf(p_stat, " Image format : %dx%d\n", params->output.width, params->output.height);
00293
00294 if (params->intra_upd)
00295 fprintf(p_stat," Error robustness : On\n");
00296 else
00297 fprintf(p_stat," Error robustness : Off\n");
00298
00299 fprintf(p_stat, " Search range : %d\n", params->search_range);
00300
00301 fprintf(p_stat, " Total number of references : %d\n", params->num_ref_frames);
00302 fprintf(p_stat, " References for P slices : %d\n", params->P_List0_refs ? params->P_List0_refs : params->num_ref_frames);
00303
00304 if (stats->frame_ctr[B_SLICE]!=0)
00305 {
00306 fprintf(p_stat, " List0 refs for B slices : %d\n", params->B_List0_refs ? params->B_List0_refs : params->num_ref_frames);
00307 fprintf(p_stat, " List1 refs for B slices : %d\n", params->B_List1_refs ? params->B_List1_refs : params->num_ref_frames);
00308 }
00309
00310 fprintf(p_stat, " Profile/Level IDC : (%d,%d)\n", params->ProfileIDC, params->LevelIDC);
00311 if (params->symbol_mode == CAVLC)
00312 fprintf(p_stat, " Entropy coding method : CAVLC\n");
00313 else
00314 fprintf(p_stat, " Entropy coding method : CABAC\n");
00315
00316 if (params->MbInterlace)
00317 fprintf(p_stat, " MB Field Coding : On \n");
00318
00319 if (params->SearchMode == EPZS)
00320 EPZSOutputStats(params, p_stat, 1);
00321
00322 if (params->full_search == 2)
00323 fprintf(p_stat," Search range restrictions : none\n");
00324 else if (params->full_search == 1)
00325 fprintf(p_stat," Search range restrictions : older reference frames\n");
00326 else
00327 fprintf(p_stat," Search range restrictions : smaller blocks and older reference frames\n");
00328
00329 if (params->rdopt)
00330 fprintf(p_stat," RD-optimized mode decision : used\n");
00331 else
00332 fprintf(p_stat," RD-optimized mode decision : not used\n");
00333
00334 fprintf(p_stat,"\n ---------------------|----------------|---------------|");
00335 fprintf(p_stat,"\n Item | Intra | All frames |");
00336 fprintf(p_stat,"\n ---------------------|----------------|---------------|");
00337 fprintf(p_stat,"\n SNR Y(dB) |");
00338 fprintf(p_stat," %5.2f |", dist->metric[PSNR].avslice[I_SLICE][0]);
00339 fprintf(p_stat," %5.2f |", dist->metric[PSNR].average[0]);
00340 fprintf(p_stat,"\n SNR U/V (dB) |");
00341 fprintf(p_stat," %5.2f/%5.2f |", dist->metric[PSNR].avslice[I_SLICE][1], dist->metric[PSNR].avslice[I_SLICE][2]);
00342 fprintf(p_stat," %5.2f/%5.2f |", dist->metric[PSNR].average[1], dist->metric[PSNR].average[2]);
00343 fprintf(p_stat,"\n ---------------------|----------------|---------------|");
00344 fprintf(p_stat,"\n");
00345
00346 fprintf(p_stat,"\n ---------------------|----------------|---------------|---------------|");
00347 fprintf(p_stat,"\n SNR | I | P | B |");
00348 fprintf(p_stat,"\n ---------------------|----------------|---------------|---------------|");
00349 fprintf(p_stat,"\n SNR Y(dB) | %5.3f | %5.3f | %5.3f |",
00350 dist->metric[PSNR].avslice[I_SLICE][0], dist->metric[PSNR].avslice[P_SLICE][0], dist->metric[PSNR].avslice[B_SLICE][0]);
00351 fprintf(p_stat,"\n SNR U(dB) | %5.3f | %5.3f | %5.3f |",
00352 dist->metric[PSNR].avslice[I_SLICE][1], dist->metric[PSNR].avslice[P_SLICE][1], dist->metric[PSNR].avslice[B_SLICE][1]);
00353 fprintf(p_stat,"\n SNR V(dB) | %5.3f | %5.3f | %5.3f |",
00354 dist->metric[PSNR].avslice[I_SLICE][2], dist->metric[PSNR].avslice[P_SLICE][2], dist->metric[PSNR].avslice[B_SLICE][2]);
00355 fprintf(p_stat,"\n ---------------------|----------------|---------------|---------------|");
00356 fprintf(p_stat,"\n");
00357
00358
00359 fprintf(p_stat,"\n ---------------------|----------------|---------------|---------------|");
00360 fprintf(p_stat,"\n Ave Quant | I | P | B |");
00361 fprintf(p_stat,"\n ---------------------|----------------|---------------|---------------|");
00362 fprintf(p_stat,"\n QP | %5.3f | %5.3f | %5.3f |",
00363 (float)stats->quant[I_SLICE]/dmax(1.0,(float)stats->num_macroblocks[I_SLICE]),
00364 (float)stats->quant[P_SLICE]/dmax(1.0,(float)stats->num_macroblocks[P_SLICE]),
00365 (float)stats->quant[B_SLICE]/dmax(1.0,(float)stats->num_macroblocks[B_SLICE]));
00366 fprintf(p_stat,"\n ---------------------|----------------|---------------|---------------|");
00367 fprintf(p_stat,"\n");
00368
00369
00370 fprintf(p_stat,"\n ---------------------|----------------|");
00371 fprintf(p_stat,"\n Intra | Mode used |");
00372 fprintf(p_stat,"\n ---------------------|----------------|");
00373 fprintf(p_stat,"\n Mode 0 intra 4x4 | %5" FORMAT_OFF_T " |", stats->mode_use[I_SLICE][I4MB ]);
00374 fprintf(p_stat,"\n Mode 1 intra 8x8 | %5" FORMAT_OFF_T " |", stats->mode_use[I_SLICE][I8MB ]);
00375 fprintf(p_stat,"\n Mode 2+ intra 16x16 | %5" FORMAT_OFF_T " |", stats->mode_use[I_SLICE][I16MB]);
00376 fprintf(p_stat,"\n Mode intra IPCM | %5" FORMAT_OFF_T " |", stats->mode_use[I_SLICE][IPCM ]);
00377
00378
00379 if (stats->frame_ctr[P_SLICE]!=0)
00380 {
00381 mean_motion_info_bit_use[P_SLICE] = report_slice_pred_stats(p_stat, stats, P_SLICE,(double) bit_use[P_SLICE][0], "P Slice ");
00382 }
00383
00384 if (stats->frame_ctr[B_SLICE]!=0)
00385 {
00386 mean_motion_info_bit_use[B_SLICE] = report_slice_pred_stats(p_stat, stats, B_SLICE,(double) bit_use[B_SLICE][0], "B Slice ");
00387 }
00388
00389 if (stats->frame_ctr[SP_SLICE]!=0)
00390 {
00391 mean_motion_info_bit_use[SP_SLICE] = report_slice_pred_stats(p_stat, stats, SP_SLICE,(double) bit_use[SP_SLICE][0], "SP Slice");
00392 }
00393
00394
00395 fprintf(p_stat,"\n ---------------------|----------------|");
00396 fprintf(p_stat,"\n");
00397
00398 fprintf(p_stat,"\n ---------------------|----------------|----------------|----------------|");
00399 fprintf(p_stat,"\n Bit usage: | Intra | Inter | B frame |");
00400 fprintf(p_stat,"\n ---------------------|----------------|----------------|----------------|");
00401
00402 fprintf(p_stat,"\n Header |");
00403 fprintf(p_stat," %10.2f |", (float) stats->bit_use_header[I_SLICE] / bit_use[I_SLICE][0]);
00404 fprintf(p_stat," %10.2f |", (float) stats->bit_use_header[P_SLICE] / bit_use[P_SLICE][0]);
00405 fprintf(p_stat," %10.2f |", (float) stats->bit_use_header[B_SLICE] / bit_use[B_SLICE][0]);
00406
00407 fprintf(p_stat,"\n Mode |");
00408 fprintf(p_stat," %10.2f |", (float)stats->bit_use_mb_type[I_SLICE] / bit_use[I_SLICE][0]);
00409 fprintf(p_stat," %10.2f |", (float)stats->bit_use_mb_type[P_SLICE] / bit_use[P_SLICE][0]);
00410 fprintf(p_stat," %10.2f |", (float)stats->bit_use_mb_type[B_SLICE] / bit_use[B_SLICE][0]);
00411
00412 fprintf(p_stat,"\n Motion Info |");
00413 fprintf(p_stat," ./. |");
00414 fprintf(p_stat," %10.2f |", mean_motion_info_bit_use[P_SLICE]);
00415 fprintf(p_stat," %10.2f |", mean_motion_info_bit_use[B_SLICE]);
00416
00417 fprintf(p_stat,"\n CBP Y/C |");
00418 fprintf(p_stat," %10.2f |", (float) stats->tmp_bit_use_cbp[I_SLICE] / bit_use[I_SLICE][0]);
00419 fprintf(p_stat," %10.2f |", (float) stats->tmp_bit_use_cbp[P_SLICE] / bit_use[P_SLICE][0]);
00420 fprintf(p_stat," %10.2f |", (float) stats->tmp_bit_use_cbp[B_SLICE] / bit_use[B_SLICE][0]);
00421
00422 fprintf(p_stat,"\n Coeffs. Y |");
00423 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[0][I_SLICE] / bit_use[I_SLICE][0]);
00424 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[0][P_SLICE] / bit_use[P_SLICE][0]);
00425 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[0][B_SLICE] / bit_use[B_SLICE][0]);
00426
00427 fprintf(p_stat,"\n Coeffs. C |");
00428 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeffC[I_SLICE] / bit_use[I_SLICE][0]);
00429 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeffC[P_SLICE] / bit_use[P_SLICE][0]);
00430 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeffC[B_SLICE] / bit_use[B_SLICE][0]);
00431
00432 fprintf(p_stat,"\n Coeffs. CB |");
00433 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[1][I_SLICE] / bit_use[I_SLICE][0]);
00434 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[1][P_SLICE] / bit_use[P_SLICE][0]);
00435 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[1][B_SLICE] / bit_use[B_SLICE][0]);
00436
00437 fprintf(p_stat,"\n Coeffs. CB |");
00438 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[2][I_SLICE] / bit_use[I_SLICE][0]);
00439 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[2][P_SLICE] / bit_use[P_SLICE][0]);
00440 fprintf(p_stat," %10.2f |", (float) stats->bit_use_coeff[2][B_SLICE] / bit_use[B_SLICE][0]);
00441
00442 fprintf(p_stat,"\n Delta quant |");
00443 fprintf(p_stat," %10.2f |", (float) stats->bit_use_delta_quant[I_SLICE] / bit_use[I_SLICE][0]);
00444 fprintf(p_stat," %10.2f |", (float) stats->bit_use_delta_quant[P_SLICE] / bit_use[P_SLICE][0]);
00445 fprintf(p_stat," %10.2f |", (float) stats->bit_use_delta_quant[B_SLICE] / bit_use[B_SLICE][0]);
00446
00447 fprintf(p_stat,"\n Stuffing Bits |");
00448 fprintf(p_stat," %10.2f |", (float) stats->bit_use_stuffingBits[I_SLICE] / bit_use[I_SLICE][0]);
00449 fprintf(p_stat," %10.2f |", (float) stats->bit_use_stuffingBits[P_SLICE] / bit_use[P_SLICE][0]);
00450 fprintf(p_stat," %10.2f |", (float) stats->bit_use_stuffingBits[B_SLICE] / bit_use[B_SLICE][0]);
00451
00452 fprintf(p_stat,"\n ---------------------|----------------|----------------|----------------|");
00453 fprintf(p_stat,"\n average bits/frame |");
00454 fprintf(p_stat," %10.2f |", (float) bit_use[I_SLICE][1] / (float) bit_use[I_SLICE][0] );
00455 fprintf(p_stat," %10.2f |", (float) bit_use[P_SLICE][1] / (float) bit_use[P_SLICE][0] );
00456 fprintf(p_stat," %10.2f |", (float) bit_use[B_SLICE][1] / (float) bit_use[B_SLICE][0] );
00457 fprintf(p_stat,"\n ---------------------|----------------|----------------|----------------|");
00458 fprintf(p_stat,"\n");
00459
00460 fclose(p_stat);
00461 }
00462
00463
00464 void report_log(InputParameters *params, StatParameters *stats)
00465 {
00466 char name[40];
00467 int i;
00468 #ifndef WIN32
00469 time_t now;
00470 struct tm *l_time;
00471 char string[1000];
00472 #else
00473 char timebuf[128];
00474 #endif
00475
00476 if ((p_log = fopen("log.dat", "r")) == 0)
00477 {
00478 if ((p_log = fopen("log.dat", "a")) == NULL)
00479 {
00480 snprintf(errortext, ET_SIZE, "Error open file %s \n", "log.dat");
00481 error(errortext, 500);
00482 }
00483 else
00484 {
00485 fprintf(p_log," ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ \n");
00486 fprintf(p_log,"| Encoder statistics. This file is generated during first encoding session, new sessions will be appended |\n");
00487 fprintf(p_log," ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ \n");
00488 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");
00489 fprintf(p_log," ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ \n");
00490
00491 }
00492 }
00493 else
00494 {
00495 fclose (p_log);
00496 if ((p_log = fopen("log.dat", "a")) == NULL)
00497 {
00498 snprintf(errortext, ET_SIZE, "Error open file %s \n", "log.dat");
00499 error(errortext, 500);
00500 }
00501 }
00502 fprintf(p_log,"|%5s/%-5s", VERSION, EXT_VERSION);
00503
00504 #ifdef WIN32
00505 _strdate( timebuf );
00506 fprintf(p_log,"| %1.5s |", timebuf );
00507
00508 _strtime( timebuf);
00509 fprintf(p_log," % 1.5s |", timebuf);
00510 #else
00511 now = time ((time_t *) NULL);
00512 time (&now);
00513 l_time = localtime (&now);
00514 strftime (string, sizeof string, "%d-%b-%Y", l_time);
00515 fprintf(p_log,"| %1.5s |", string );
00516
00517 strftime (string, sizeof string, "%H:%M:%S", l_time);
00518 fprintf(p_log," %1.5s |", string );
00519 #endif
00520
00521 for (i=0; i < 40; i++)
00522 name[i] = params->input_file1.fname[i + imax(0, ((int) strlen(params->input_file1.fname)) - 40)];
00523 fprintf(p_log,"%40.40s|",name);
00524
00525 fprintf(p_log,"%5d | %d/%d |", params->no_frames, params->PicInterlace, params->MbInterlace);
00526 fprintf(p_log," %-3d| %-3d| %-3d|", params->qp[0][I_SLICE], params->qp[0][P_SLICE], params->qp[0][B_SLICE]);
00527
00528 fprintf(p_log,"%4dx%-4d|", params->output.width, params->output.height);
00529 fprintf(p_log," %3d |%3d |", params->intra_period, stats->NumberBFrames);
00530
00531
00532 switch( params->SearchMode )
00533 {
00534 case UM_HEX:
00535 fprintf(p_log," HEX |");
00536 break;
00537 case UM_HEX_SIMPLE:
00538 fprintf(p_log," SHEX |");
00539 break;
00540 case EPZS:
00541 fprintf(p_log," EPZS |");
00542 break;
00543 case FAST_FULL_SEARCH:
00544 fprintf(p_log," FFS |");
00545 break;
00546 default:
00547 fprintf(p_log," FS |");
00548 break;
00549 }
00550
00551 fprintf(p_log," %1d%1d%1d |", params->MEErrorMetric[F_PEL], params->MEErrorMetric[H_PEL], params->MEErrorMetric[Q_PEL]);
00552
00553 fprintf(p_log," %3d | %2d |", params->search_range, params->num_ref_frames );
00554
00555 fprintf(p_log," %5.2f|", img->framerate);
00556
00557 if (params->symbol_mode == CAVLC)
00558 fprintf(p_log," CAVLC|");
00559 else
00560 fprintf(p_log," CABAC|");
00561
00562 fprintf(p_log," %d |", params->rdopt);
00563
00564 if (params->intra_upd == 1)
00565 fprintf(p_log," ON |");
00566 else
00567 fprintf(p_log," OFF |");
00568
00569 fprintf(p_log," %d |", params->Transform8x8Mode);
00570
00571 fprintf(p_log,"%7.3f|%7.3f|%7.3f|",
00572 dist->metric[PSNR].avslice[I_SLICE][0],
00573 dist->metric[PSNR].avslice[I_SLICE][1],
00574 dist->metric[PSNR].avslice[I_SLICE][2]);
00575 fprintf(p_log,"%7.3f|%7.3f|%7.3f|", dist->metric[PSNR].average[0],dist->metric[PSNR].average[1],dist->metric[PSNR].average[2]);
00576
00577
00578
00579
00580
00581 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);
00582 fprintf(p_log," %12d | %12d |", (int)tot_time,(int)me_tot_time);
00583
00584
00585 fprintf(p_log,"\n");
00586
00587 fclose(p_log);
00588
00589 p_log = fopen("data.txt", "a");
00590
00591 if ((stats->NumberBFrames != 0) && (stats->frame_ctr[B_SLICE] != 0))
00592 {
00593 fprintf(p_log, "%3d %2d %2d %2.2f %2.2f %2.2f %5" FORMAT_OFF_T " "
00594 "%2.2f %2.2f %2.2f %5d "
00595 "%2.2f %2.2f %2.2f %5" FORMAT_OFF_T " %5" FORMAT_OFF_T " %.3f\n",
00596 stats->frame_counter, params->qp[0][I_SLICE], params->qp[0][P_SLICE],
00597 dist->metric[PSNR].avslice[I_SLICE][0],
00598 dist->metric[PSNR].avslice[I_SLICE][1],
00599 dist->metric[PSNR].avslice[I_SLICE][2],
00600 stats->bit_counter[I_SLICE],
00601 0.0,
00602 0.0,
00603 0.0,
00604 0,
00605 dist->metric[PSNR].average[0],
00606 dist->metric[PSNR].average[1],
00607 dist->metric[PSNR].average[2],
00608 (stats->bit_counter[I_SLICE] + stats->bit_ctr) / stats->frame_counter,
00609 stats->bit_counter[B_SLICE] / stats->frame_ctr[B_SLICE],
00610 (double) 0.001 * tot_time / (stats->frame_counter));
00611 }
00612 else
00613 {
00614 if (params->no_frames != 0)
00615 fprintf(p_log, "%3d %2d %2d %2.2f %2.2f %2.2f %5" FORMAT_OFF_T " "
00616 "%2.2f %2.2f %2.2f %5d "
00617 "%2.2f %2.2f %2.2f %5" FORMAT_OFF_T " %5d %.3f\n",
00618 stats->frame_counter, params->qp[0][I_SLICE], params->qp[0][P_SLICE],
00619 dist->metric[PSNR].avslice[I_SLICE][0],
00620 dist->metric[PSNR].avslice[I_SLICE][1],
00621 dist->metric[PSNR].avslice[I_SLICE][2],
00622 stats->bit_counter[I_SLICE],
00623 0.0,
00624 0.0,
00625 0.0,
00626 0,
00627 dist->metric[PSNR].average[0],
00628 dist->metric[PSNR].average[1],
00629 dist->metric[PSNR].average[2],
00630 (stats->bit_counter[I_SLICE] + stats->bit_ctr)/ stats->frame_counter,
00631 0,
00632 (double)0.001 * tot_time / stats->frame_counter);
00633 }
00634
00635 fclose(p_log);
00636 }
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651 void report( ImageParameters *img, InputParameters *params, StatParameters *stats)
00652 {
00653 int64 bit_use[NUM_SLICE_TYPES][2];
00654 int i,j;
00655 int64 total_bits;
00656
00657 bit_use[ I_SLICE][0] = stats->frame_ctr[I_SLICE];
00658 bit_use[ P_SLICE][0] = imax(stats->frame_ctr[P_SLICE ] + stats->frame_ctr[SP_SLICE], 1);
00659 bit_use[ B_SLICE][0] = imax(stats->frame_ctr[B_SLICE ], 1);
00660 bit_use[SP_SLICE][0] = imax(stats->frame_ctr[SP_SLICE], 1);
00661
00662
00663 tot_time = timenorm(tot_time);
00664 me_tot_time = timenorm(me_tot_time);
00665
00666
00667
00668 for (j=0; j < NUM_SLICE_TYPES; j++)
00669 {
00670 bit_use[j][1] = 0;
00671 }
00672
00673 for (j=0; j < NUM_SLICE_TYPES; j++)
00674 {
00675 for(i=0; i < MAXMODE; i++)
00676 bit_use[j][1] += stats->bit_use_mode[j][i];
00677
00678 bit_use[j][1] += stats->bit_use_mb_type[j];
00679 bit_use[j][1] += stats->bit_use_header[j];
00680 bit_use[j][1] += stats->tmp_bit_use_cbp[j];
00681 bit_use[j][1] += stats->bit_use_coeffC[j];
00682 bit_use[j][1] += stats->bit_use_coeff[0][j];
00683 bit_use[j][1] += stats->bit_use_coeff[1][j];
00684 bit_use[j][1] += stats->bit_use_coeff[2][j];
00685 bit_use[j][1] += stats->bit_use_delta_quant[j];
00686 bit_use[j][1] += stats->bit_use_stuffingBits[j];
00687 }
00688
00689
00690 stats->bitrate_st[ I_SLICE] = (stats->bit_counter[ I_SLICE]) * (float) (params->output.frame_rate) / (float) (stats->frame_counter);
00691 stats->bitrate_st[ P_SLICE] = (stats->bit_counter[ P_SLICE]) * (float) (params->output.frame_rate) / (float) (stats->frame_counter);
00692 stats->bitrate_st[ B_SLICE] = (stats->bit_counter[ B_SLICE]) * (float) (params->output.frame_rate) / (float) (stats->frame_counter);
00693 stats->bitrate_st[SP_SLICE] = (stats->bit_counter[SP_SLICE]) * (float) (params->output.frame_rate) / (float) (stats->frame_counter);
00694
00695 switch (params->Verbose)
00696 {
00697 case 0:
00698 case 1:
00699 default:
00700 fprintf(stdout,"------------------ Average data all frames -----------------------------------\n\n");
00701 break;
00702 case 2:
00703 fprintf(stdout,"------------------------------------ Average data all frames ---------------------------------\n\n");
00704 break;
00705 case 3:
00706 fprintf(stdout,"--------------------------------------- Average data all frames -------------------------------------\n\n");
00707 break;
00708 }
00709
00710 if (params->Verbose != 0)
00711 {
00712 DistMetric *snr = &dist->metric[PSNR ];
00713 DistMetric *sse = &dist->metric[SSE ];
00714 DistMetric *snr_rgb = &dist->metric[PSNR_RGB];
00715 DistMetric *sse_rgb = &dist->metric[SSE_RGB ];
00716
00717 int impix = params->output.size_cmp[0];
00718 int impix_cr = params->output.size_cmp[1];
00719
00720 float csnr_y = psnr(img->max_imgpel_value_comp_sq[0], impix , sse->average[0]);
00721 float csnr_u = psnr(img->max_imgpel_value_comp_sq[1], impix_cr, sse->average[1]);
00722 float csnr_v = psnr(img->max_imgpel_value_comp_sq[2], impix_cr, sse->average[2]);
00723
00724 fprintf(stdout, " Total encoding time for the seq. : %7.3f sec (%3.2f fps)\n", (float) tot_time * 0.001, 1000.0 * (float) (stats->frame_counter) / (float)tot_time);
00725 fprintf(stdout, " Total ME time for sequence : %7.3f sec \n\n", (float)me_tot_time * 0.001);
00726
00727 fprintf(stdout," Y { PSNR (dB), cSNR (dB), MSE } : { %5.2f, %5.2f, %5.2f }\n",
00728 snr->average[0], csnr_y, sse->average[0]/(float)impix);
00729 fprintf(stdout," U { PSNR (dB), cSNR (dB), MSE } : { %5.2f, %5.2f, %5.2f }\n",
00730 snr->average[1], csnr_u, sse->average[1]/(float)impix_cr);
00731 fprintf(stdout," V { PSNR (dB), cSNR (dB), MSE } : { %5.2f, %5.2f, %5.2f }\n",
00732 snr->average[2], csnr_v, sse->average[2]/(float)impix_cr);
00733
00734 if(params->DistortionYUVtoRGB == 1)
00735 {
00736 float csnr_r = psnr(img->max_imgpel_value_comp_sq[0], impix, sse_rgb->average[0]);
00737 float csnr_g = psnr(img->max_imgpel_value_comp_sq[1], impix, sse_rgb->average[1]);
00738 float csnr_b = psnr(img->max_imgpel_value_comp_sq[2], impix, sse_rgb->average[2]);
00739
00740 fprintf(stdout," R { PSNR (dB), cSNR (dB), MSE } : { %5.2f, %5.2f, %5.2f }\n",
00741 snr_rgb->average[0], csnr_r, sse_rgb->average[0] / (float) impix);
00742 fprintf(stdout," G { PSNR (dB), cSNR (dB), MSE } : { %5.2f, %5.2f, %5.2f }\n",
00743 snr_rgb->average[1], csnr_g, sse_rgb->average[1] / (float) impix);
00744 fprintf(stdout," B { PSNR (dB), cSNR (dB), MSE } : { %5.2f, %5.2f, %5.2f }\n",
00745 snr_rgb->average[2], csnr_b, sse_rgb->average[2] / (float) impix);
00746 }
00747
00748 if (params->Distortion[SSIM] == 1)
00749 {
00750 if(params->DistortionYUVtoRGB == 1)
00751 {
00752 fprintf(stdout," SSIM {Y, R} : { %5.4f, %5.4f }\n", dist->metric[SSIM].average[0], dist->metric[SSIM_RGB].average[0]);
00753 fprintf(stdout," SSIM {U, G} : { %5.4f, %5.4f }\n", dist->metric[SSIM].average[1], dist->metric[SSIM_RGB].average[1]);
00754 fprintf(stdout," SSIM {V, B} : { %5.4f, %5.4f }\n", dist->metric[SSIM].average[2], dist->metric[SSIM_RGB].average[2]);
00755 }
00756 else
00757 {
00758 fprintf(stdout," Y SSIM : %5.4f\n", dist->metric[SSIM].average[0]);
00759 fprintf(stdout," U SSIM : %5.4f\n", dist->metric[SSIM].average[1]);
00760 fprintf(stdout," V SSIM : %5.4f\n", dist->metric[SSIM].average[2]);
00761 }
00762 }
00763 if (params->Distortion[MS_SSIM] == 1)
00764 {
00765 if(params->DistortionYUVtoRGB == 1)
00766 {
00767 fprintf(stdout," MS-SSIM {Y, R} : { %5.4f, %5.4f }\n", dist->metric[MS_SSIM].average[0], dist->metric[MS_SSIM_RGB].average[0]);
00768 fprintf(stdout," MS-SSIM {U, G} : { %5.4f, %5.4f }\n", dist->metric[MS_SSIM].average[1], dist->metric[MS_SSIM_RGB].average[1]);
00769 fprintf(stdout," MS-SSIM {V, B} : { %5.4f, %5.4f }\n", dist->metric[MS_SSIM].average[2], dist->metric[MS_SSIM_RGB].average[2]);
00770 }
00771 else
00772 {
00773 fprintf(stdout," Y MS-SSIM : %5.4f\n", dist->metric[MS_SSIM].average[0]);
00774 fprintf(stdout," U MS-SSIM : %5.4f\n", dist->metric[MS_SSIM].average[1]);
00775 fprintf(stdout," V MS-SSIM : %5.4f\n", dist->metric[MS_SSIM].average[2]);
00776 }
00777 }
00778 fprintf(stdout,"\n");
00779 }
00780 else
00781 fprintf(stdout, " Total encoding time for the seq. : %5.3f sec (%5.2f fps)\n\n", tot_time*0.001, 1000.0 * (stats->frame_counter) / tot_time);
00782
00783 total_bits = stats->bit_ctr_parametersets;
00784 for (i = 0; i < NUM_SLICE_TYPES; i++)
00785 total_bits += stats->bit_counter[i];
00786
00787 if (stats->frame_ctr[B_SLICE] != 0)
00788 {
00789 fprintf(stdout, " Total bits : %" FORMAT_OFF_T " (I %" FORMAT_OFF_T ", P %" FORMAT_OFF_T ", B %" FORMAT_OFF_T " NVB %d) \n",
00790 total_bits, stats->bit_counter[I_SLICE], stats->bit_counter[P_SLICE], stats->bit_counter[B_SLICE], stats->bit_ctr_parametersets);
00791 }
00792 else if (params->sp_periodicity == 0)
00793 {
00794 fprintf(stdout, " Total bits : %" FORMAT_OFF_T " (I %" FORMAT_OFF_T ", P %" FORMAT_OFF_T ", NVB %d) \n",
00795 total_bits, stats->bit_counter[I_SLICE], stats->bit_counter[P_SLICE], stats->bit_ctr_parametersets);
00796 }
00797 else
00798 {
00799 fprintf(stdout, " Total bits : %" FORMAT_OFF_T " (I %" FORMAT_OFF_T ", P %" FORMAT_OFF_T ", NVB %d) \n",
00800 total_bits, stats->bit_counter[I_SLICE], stats->bit_counter[P_SLICE], stats->bit_ctr_parametersets);
00801 }
00802
00803
00804 stats->bitrate= ((float) total_bits * (float) params->output.frame_rate) / ((float) (stats->frame_counter));
00805 fprintf(stdout, " Bit rate (kbit/s) @ %2.2f Hz : %5.2f\n", params->output.frame_rate, stats->bitrate / 1000.0);
00806
00807 for (i = 0; i < 5; i++)
00808 stats->bit_ctr_emulationprevention += stats->bit_use_stuffingBits[i];
00809
00810 fprintf(stdout, " Bits to avoid Startcode Emulation : %" FORMAT_OFF_T " \n", stats->bit_ctr_emulationprevention);
00811 fprintf(stdout, " Bits for parameter sets : %d \n\n", stats->bit_ctr_parametersets);
00812
00813 switch (params->Verbose)
00814 {
00815 case 0:
00816 case 1:
00817 default:
00818 fprintf(stdout,"-------------------------------------------------------------------------------\n");
00819 break;
00820 case 2:
00821 fprintf(stdout,"------------------------------------------------------------------------------------------------\n");
00822 break;
00823 case 3:
00824 fprintf(stdout,"-------------------------------------------------------------------------------------------------------\n");
00825 break;
00826 }
00827 fprintf(stdout,"Exit JM %s encoder ver %s ", JM, VERSION);
00828 fprintf(stdout,"\n");
00829
00830
00831 report_stats(params, stats, bit_use);
00832
00833
00834 report_log(params, stats);
00835
00836 if (params->ReportFrameStats)
00837 {
00838 if ((p_log = fopen("stat_frame.dat", "a")) == NULL)
00839 {
00840 snprintf(errortext, ET_SIZE, "Error open file %s \n", "stat_frame.dat.dat");
00841
00842 }
00843 else
00844 {
00845 fprintf(p_log," --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \n");
00846 fclose(p_log);
00847 }
00848 report_log_mode(params, stats, bit_use);
00849 }
00850 }
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863 void information_init ( ImageParameters *img, InputParameters *params, StatParameters *stats)
00864 {
00865 int i;
00866 static char yuv_types[4][10] = {"YUV 4:0:0", "YUV 4:2:0", "YUV 4:2:2", "YUV 4:4:4"};
00867 switch (params->Verbose)
00868 {
00869 case 0:
00870 case 1:
00871 default:
00872 printf("------------------------------- JM %4.4s %7.7s -------------------------------\n", VERSION, EXT_VERSION);
00873 break;
00874 case 2:
00875 printf("--------------------------------------- JM %4.4s %7.7s ----------------------------------------\n", VERSION, EXT_VERSION);
00876 break;
00877 case 3:
00878 printf("------------------------------------------ JM %4.4s %7.7s ------------------------------------------\n", VERSION, EXT_VERSION);
00879 break;
00880 }
00881
00882 fprintf(stdout, " Input YUV file : %s \n", params->input_file1.fname);
00883 fprintf(stdout, " Output H.264 bitstream : %s \n", params->outfile);
00884 if (p_dec != -1)
00885 fprintf(stdout, " Output YUV file : %s \n", params->ReconFile);
00886 fprintf(stdout, " YUV Format : %s \n", &yuv_types[img->yuv_format][0]);
00887 fprintf(stdout, " Frames to be encoded I-P/B : %d/%d\n", params->no_frm_base, (params->NumberBFrames * (params->no_frm_base - 1)));
00888 if (params->Verbose != 0)
00889 {
00890 fprintf(stdout, " Freq. for encoded bitstream : %3.2f\n", params->output.frame_rate);
00891 fprintf(stdout, " PicInterlace / MbInterlace : %d/%d\n", params->PicInterlace, params->MbInterlace);
00892 fprintf(stdout, " Transform8x8Mode : %d\n", params->Transform8x8Mode);
00893
00894 for (i=0; i<3; i++)
00895 {
00896 fprintf(stdout," ME Metric for Refinement Level %1d : %s\n", i, DistortionType[params->MEErrorMetric[i]]);
00897 }
00898 fprintf(stdout, " Mode Decision Metric : %s\n", DistortionType[params->ModeDecisionMetric]);
00899
00900 switch ( params->ChromaMEEnable )
00901 {
00902 case 1:
00903 fprintf(stdout," Motion Estimation for components : YCbCr\n");
00904 break;
00905 default:
00906 fprintf(stdout," Motion Estimation for components : Y\n");
00907 break;
00908 }
00909
00910 fprintf(stdout, " Image format : %dx%d (%dx%d)\n", params->output.width, params->output.height, img->width,img->height);
00911
00912 if (params->intra_upd)
00913 fprintf(stdout," Error robustness : On\n");
00914 else
00915 fprintf(stdout," Error robustness : Off\n");
00916 fprintf(stdout, " Search range : %d\n", params->search_range);
00917
00918 fprintf(stdout, " Total number of references : %d\n", params->num_ref_frames);
00919 fprintf(stdout, " References for P slices : %d\n", params->P_List0_refs ? params->P_List0_refs : params->num_ref_frames);
00920 fprintf(stdout, " References for B slices (L0, L1) : %d\n", params->B_List0_refs ? params->B_List0_refs : params->num_ref_frames);
00921 fprintf(stdout, " List1 references for B slices : %d\n", params->B_List1_refs ? params->B_List1_refs : params->num_ref_frames);
00922
00923
00924 fprintf(stdout, " Sequence type :");
00925 if (stats->NumberBFrames > 0 && params->HierarchicalCoding)
00926 {
00927 fprintf(stdout, " Hierarchy (QP: I %d, P %d, B %d) \n",
00928 params->qp[0][I_SLICE], params->qp[0][P_SLICE], params->qp[0][B_SLICE]);
00929 }
00930 else if (stats->NumberBFrames > 0)
00931 {
00932 char seqtype[80];
00933 int i,j;
00934
00935 strcpy (seqtype,"I");
00936
00937 for (j=0; j < 2; j++)
00938 {
00939 for (i=0; i < stats->NumberBFrames; i++)
00940 {
00941 if (params->BRefPictures)
00942 strncat(seqtype,"-RB", imax(0, (int) (79 - strlen(seqtype))));
00943 else
00944 strncat(seqtype,"-B", imax(0, (int) (79 - strlen(seqtype))));
00945 }
00946 strncat(seqtype,"-P", imax(0, (int) (79 - strlen(seqtype))));
00947 }
00948 if (params->BRefPictures)
00949 fprintf(stdout, " %s (QP: I %d, P %d, RB %d) \n", seqtype, params->qp[0][I_SLICE], params->qp[0][P_SLICE], iClip3(0, 51, params->qp[0][B_SLICE] + params->qpBRSOffset[0]));
00950 else
00951 fprintf(stdout, " %s (QP: I %d, P %d, B %d) \n", seqtype, params->qp[0][I_SLICE], params->qp[0][P_SLICE], params->qp[0][B_SLICE]);
00952 }
00953 else if (stats->NumberBFrames == 0 && params->sp_periodicity == 0)
00954 fprintf(stdout, " IPPP (QP: I %d, P %d) \n", params->qp[0][I_SLICE], params->qp[0][P_SLICE]);
00955 else
00956 fprintf(stdout, " I-P-P-SP-P (QP: I %d, P %d, SP (%d, %d)) \n", params->qp[0][I_SLICE], params->qp[0][P_SLICE], params->qp[0][SP_SLICE], params->qpsp[0]);
00957
00958
00959 if (params->symbol_mode == CAVLC)
00960 fprintf(stdout," Entropy coding method : CAVLC\n");
00961 else
00962 fprintf(stdout," Entropy coding method : CABAC\n");
00963
00964 fprintf(stdout, " Profile/Level IDC : (%d,%d)\n", params->ProfileIDC, params->LevelIDC);
00965
00966 if (params->SearchMode == UM_HEX)
00967 fprintf(stdout, " Motion Estimation Scheme : HEX\n");
00968 else if (params->SearchMode == UM_HEX_SIMPLE)
00969 fprintf(stdout, " Motion Estimation Scheme : SHEX\n");
00970 else if (params->SearchMode == EPZS)
00971 {
00972 fprintf(stdout, " Motion Estimation Scheme : EPZS\n");
00973 EPZSOutputStats(params, stdout, 0);
00974 }
00975 else if (params->SearchMode == FAST_FULL_SEARCH)
00976 fprintf(stdout, " Motion Estimation Scheme : Fast Full Search\n");
00977 else
00978 fprintf(stdout, " Motion Estimation Scheme : Full Search\n");
00979
00980 if (params->full_search == 2)
00981 fprintf(stdout," Search range restrictions : none\n");
00982 else if (params->full_search == 1)
00983 fprintf(stdout," Search range restrictions : older reference frames\n");
00984 else
00985 fprintf(stdout," Search range restrictions : smaller blocks and older reference frames\n");
00986
00987 if (params->rdopt)
00988 fprintf(stdout," RD-optimized mode decision : used\n");
00989 else
00990 fprintf(stdout," RD-optimized mode decision : not used\n");
00991
00992 switch(params->partition_mode)
00993 {
00994 case PAR_DP_1:
00995 fprintf(stdout," Data Partitioning Mode : 1 partition \n");
00996 break;
00997 case PAR_DP_3:
00998 fprintf(stdout," Data Partitioning Mode : 3 partitions \n");
00999 break;
01000 default:
01001 fprintf(stdout," Data Partitioning Mode : not supported\n");
01002 break;
01003 }
01004
01005 switch(params->of_mode)
01006 {
01007 case PAR_OF_ANNEXB:
01008 fprintf(stdout," Output File Format : H.264/AVC Annex B Byte Stream Format \n");
01009 break;
01010 case PAR_OF_RTP:
01011 fprintf(stdout," Output File Format : RTP Packet File Format \n");
01012 break;
01013 default:
01014 fprintf(stdout," Output File Format : not supported\n");
01015 break;
01016 }
01017 }
01018
01019
01020 switch (params->Verbose)
01021 {
01022 case 0:
01023 default:
01024 printf("-------------------------------------------------------------------------------\n");
01025 printf("\nEncoding. Please Wait.\n\n");
01026 break;
01027 case 1:
01028 printf("-------------------------------------------------------------------------------\n");
01029 printf("Frame Bit/pic QP SnrY SnrU SnrV Time(ms) MET(ms) Frm/Fld Ref \n");
01030 printf("-------------------------------------------------------------------------------\n");
01031 break;
01032 case 2:
01033 if (params->Distortion[SSIM] == 1)
01034 {
01035 printf("------------------------------------------------------------------------------------------------------------------------\n");
01036 printf("Frame Bit/pic WP QP QL SnrY SnrU SnrV SsimY SsimU SsimV Time(ms) MET(ms) Frm/Fld I D L0 L1 RDP Ref\n");
01037 printf("------------------------------------------------------------------------------------------------------------------------\n");
01038 }
01039 else
01040 {
01041 printf("------------------------------------------------------------------------------------------------\n");
01042 printf("Frame Bit/pic WP QP QL SnrY SnrU SnrV Time(ms) MET(ms) Frm/Fld I D L0 L1 RDP Ref\n");
01043 printf("------------------------------------------------------------------------------------------------\n");
01044 }
01045 break;
01046 case 3:
01047 if (params->Distortion[SSIM] == 1)
01048 {
01049 printf("-----------------------------------------------------------------------------------------------------------------------------\n");
01050 printf("Frame Bit/pic NVB WP QP QL SnrY SnrU SnrV SsimY SsimU SsimV Time(ms) MET(ms) Frm/Fld I D L0 L1 RDP Ref\n");
01051 printf("-----------------------------------------------------------------------------------------------------------------------------\n");
01052 }
01053 else
01054 {
01055 printf("-----------------------------------------------------------------------------------------------------\n");
01056 printf("Frame Bit/pic NVB WP QP QL SnrY SnrU SnrV Time(ms) MET(ms) Frm/Fld I D L0 L1 RDP Ref\n");
01057 printf("-----------------------------------------------------------------------------------------------------\n");
01058 }
01059 break;
01060 }
01061 }
01062
01063
01064
01065
01066
01067
01068
01069 void report_log_mode(InputParameters *params, StatParameters *stats, int64 bit_use[NUM_SLICE_TYPES][2])
01070 {
01071 FILE *p_stat;
01072 int i;
01073 char name[40];
01074 #ifndef WIN32
01075 time_t now;
01076 struct tm *l_time;
01077 char string[1000];
01078 #else
01079 char timebuf[128];
01080 #endif
01081
01082 if ((p_stat = fopen("log_mode.dat", "r")) == 0)
01083 {
01084 if ((p_stat = fopen("log_mode.dat", "a")) == NULL)
01085 {
01086 snprintf(errortext, ET_SIZE, "Error open file %s \n", "log_mode.dat");
01087 error(errortext, 500);
01088 }
01089 else
01090 {
01091 fprintf(p_stat, " ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \n");
01092 fprintf(p_stat,"| Encoder statistics. This file is generated during first encoding session, new sessions will be appended |\n");
01093 fprintf(p_stat, " ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \n");
01094 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");
01095 fprintf(p_stat, " ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \n");
01096 }
01097 }
01098 else
01099 {
01100 fclose (p_stat);
01101 if ((p_stat = fopen("log_mode.dat", "a")) == NULL)
01102 {
01103 snprintf(errortext, ET_SIZE, "Error open file %s \n", "log_mode.dat");
01104 error(errortext, 500);
01105 }
01106 }
01107
01108
01109 fprintf(p_stat, "|%4s/%s", VERSION, EXT_VERSION);
01110
01111 #ifdef WIN32
01112 _strdate( timebuf );
01113 fprintf(p_stat, "| %1.5s |", timebuf);
01114
01115 _strtime( timebuf);
01116 fprintf(p_stat, " % 1.5s |", timebuf);
01117 #else
01118 now = time ((time_t *) NULL);
01119 time (&now);
01120 l_time = localtime (&now);
01121 strftime (string, sizeof string, "%d-%b-%Y", l_time);
01122 fprintf(p_stat, "| %1.5s |", string );
01123
01124 strftime (string, sizeof string, "%H:%M:%S", l_time);
01125 fprintf(p_stat, " %1.5s |", string);
01126 #endif
01127
01128 for (i=0;i<30;i++)
01129 name[i]=params->input_file1.fname[i + imax(0,(int) (strlen(params->input_file1.fname)- 30))];
01130
01131 fprintf(p_stat, "%30.30s|", name);
01132 fprintf(p_stat, "%3d |", img->qp);
01133
01134
01135
01136 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[I_SLICE][I4MB ]);
01137 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[I_SLICE][I8MB ]);
01138 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[I_SLICE][I16MB]);
01139
01140
01141 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->intra_chroma_mode[0]);
01142 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->intra_chroma_mode[1]);
01143 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->intra_chroma_mode[2]);
01144 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->intra_chroma_mode[3]);
01145
01146
01147 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][I4MB ]);
01148 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][I8MB ]);
01149 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][I16MB]);
01150 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][0 ]);
01151
01152 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][1 ]);
01153 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][2 ]);
01154 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][3 ]);
01155
01156 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][1][0]);
01157 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][1][1]);
01158 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][2][0]);
01159 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][2][1]);
01160 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][3][0]);
01161 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][3][1]);
01162
01163 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][P8x8 ]);
01164 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][4 ]);
01165 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][4][0]);
01166 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[P_SLICE][4][1]);
01167 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][5 ]);
01168 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][6 ]);
01169 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[P_SLICE][7 ]);
01170
01171
01172 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][I4MB ]);
01173 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][I8MB ]);
01174 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][I16MB]);
01175 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][0 ]);
01176 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][1 ]);
01177 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][2 ]);
01178 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][3 ]);
01179 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][0][0]);
01180 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][0][1]);
01181 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][1][0]);
01182 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][1][1]);
01183 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][2][0]);
01184 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][2][1]);
01185 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][3][0]);
01186 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][3][1]);
01187
01188 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][P8x8]);
01189 fprintf(p_stat, " %d|", (stats->b8_mode_0_use [B_SLICE][0]+stats->b8_mode_0_use [B_SLICE][1]));
01190 fprintf(p_stat, " %5d|", stats->b8_mode_0_use [B_SLICE][0]);
01191 fprintf(p_stat, " %5d|", stats->b8_mode_0_use [B_SLICE][1]);
01192 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][4 ]);
01193 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][4][0]);
01194 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use_transform[B_SLICE][4][1]);
01195 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][5 ]);
01196 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][6 ]);
01197 fprintf(p_stat, " %5" FORMAT_OFF_T "|", stats->mode_use[B_SLICE][7 ]);
01198
01199 fprintf(p_stat, "\n");
01200 fclose(p_stat);
01201 }
01202
01203