--- trunk/xvidcore/examples/xvid_encraw.c 2006/07/08 14:19:04 1712 +++ trunk/xvidcore/examples/xvid_encraw.c 2008/11/14 15:43:28 1794 @@ -21,7 +21,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: xvid_encraw.c,v 1.26 2006-07-08 14:19:04 Skal Exp $ + * $Id: xvid_encraw.c,v 1.35 2008-11-14 15:43:27 Isibaar Exp $ * ****************************************************************************/ @@ -165,6 +165,8 @@ static frame_stats_t framestats[7]; static int ARG_STATS = 0; +static int ARG_SSIM = -1; +static char* ARG_SSIM_PATH = NULL; static int ARG_DUMP = 0; static int ARG_LUMIMASKING = 0; static int ARG_BITRATE = 0; @@ -174,7 +176,7 @@ static char *ARG_PASS2 = 0; //static int ARG_QUALITY = ME_ELEMENTS - 1; static int ARG_QUALITY = 6; -static float ARG_FRAMERATE = 0.00f; +static float ARG_FRAMERATE = 25.00f; static int ARG_DWRATE = 25; static int ARG_DWSCALE = 1; static int ARG_MAXFRAMENR = ABS_MAXFRAMENR; @@ -389,7 +391,17 @@ } else if (strcmp("-h", argv[i]) == 0 && i < argc - 1) { i++; YDIM = atoi(argv[i]); - } else if (strcmp("-bitrate", argv[i]) == 0) { + } else if (strcmp("-csp",argv[i]) == 0 && i < argc - 1) { + i++; + if (strcmp(argv[i],"i420") == 0){ + ARG_COLORSPACE = XVID_CSP_I420; + } else if(strcmp(argv[i],"yv12") == 0){ + ARG_COLORSPACE = XVID_CSP_YV12; + } else { + printf("Invalid colorspace\n"); + return 0; + } + } else if (strcmp("-bitrate", argv[i]) == 0) { if (i < argc - 1) ARG_BITRATE = atoi(argv[i+1]); if (ARG_BITRATE) { @@ -578,6 +590,15 @@ ARG_INPUTFILE = argv[i]; } else if (strcmp("-stats", argv[i]) == 0) { ARG_STATS = 1; + } else if (strcmp("-ssim", argv[i]) == 0) { + ARG_SSIM = 2; + if ((i < argc - 1) && (*argv[i+1] != '-')) { + i++; + ARG_SSIM = atoi(argv[i]); + } + } else if (strcmp("-ssim_file", argv[i]) == 0 && i < argc -1) { + i++; + ARG_SSIM_PATH = argv[i]; } else if (strcmp("-timecode", argv[i]) == 0 && i < argc -1) { i++; ARG_TIMECODEFILE = argv[i]; @@ -1190,6 +1211,7 @@ framestats[5].size += stats_length; } +#define SSE2PSNR(sse, width, height) ((!(sse))?0.0f : 48.131f - 10*(float)log10((float)(sse)/((float)((width)*(height))))) if (ARG_PROGRESS == 0) { printf("%5d: key=%i, time= %6.0f, len= %7d", !result ? input_num : -1, @@ -1197,17 +1219,11 @@ printf(" | type=%s, quant= %2d, len= %7d", type, stats_quant, stats_length); -#define SSE2PSNR(sse, width, height) ((!(sse))?0.0f : 48.131f - 10*(float)log10((float)(sse)/((float)((width)*(height))))) if (ARG_STATS) { printf(", psnr y = %2.2f, psnr u = %2.2f, psnr v = %2.2f", - SSE2PSNR(sse[0], XDIM, YDIM), SSE2PSNR(sse[1], XDIM / 2, - YDIM / 2), + SSE2PSNR(sse[0], XDIM, YDIM), SSE2PSNR(sse[1], XDIM / 2, YDIM / 2), SSE2PSNR(sse[2], XDIM / 2, YDIM / 2)); - - totalPSNR[0] += SSE2PSNR(sse[0], XDIM, YDIM); - totalPSNR[1] += SSE2PSNR(sse[1], XDIM/2, YDIM/2); - totalPSNR[2] += SSE2PSNR(sse[2], XDIM/2, YDIM/2); } printf("\n"); } else { @@ -1224,8 +1240,13 @@ } } - } + if (ARG_STATS) { + totalPSNR[0] += SSE2PSNR(sse[0], XDIM, YDIM); + totalPSNR[1] += SSE2PSNR(sse[1], XDIM/2, YDIM/2); + totalPSNR[2] += SSE2PSNR(sse[2], XDIM/2, YDIM/2); + } #undef SSE2PSNR + } if (m4v_size < 0) break; @@ -1498,6 +1519,7 @@ #endif fprintf(stderr, " -w integer: frame width ([1.2048])\n"); fprintf(stderr, " -h integer: frame height ([1.2048])\n"); + fprintf(stderr, " -csp string : colorspace of raw input file i420, yv12 (default)\n"); fprintf(stderr, " -frames integer: number of frames to encode\n"); fprintf(stderr, "\n"); fprintf(stderr, "Output options:\n"); @@ -1561,6 +1583,8 @@ fprintf(stderr, " -noclosed_gop : Disable closed GOP mode\n"); fprintf(stderr, " -lumimasking : use lumimasking algorithm\n"); fprintf(stderr, " -stats : print stats about encoded frames\n"); + fprintf(stderr, " -ssim [integer] : prints ssim for every frame (accurate: 0 fast: 4) (2)\n"); + fprintf(stderr, " -ssim_file filename : outputs the ssim stats into a file\n"); fprintf(stderr, " -debug : activates xvidcore internal debugging output\n"); fprintf(stderr, " -vop_debug : print some info directly into encoded frames\n"); fprintf(stderr, " -nochromame : Disable chroma motion estimation\n"); @@ -1763,8 +1787,9 @@ xvid_plugin_single_t single; xvid_plugin_2pass1_t rc2pass1; xvid_plugin_2pass2_t rc2pass2; + xvid_plugin_ssim_t ssim; //xvid_plugin_fixed_t rcfixed; - xvid_enc_plugin_t plugins[7]; + xvid_enc_plugin_t plugins[8]; xvid_gbl_init_t xvid_gbl_init; xvid_enc_create_t xvid_enc_create; int i; @@ -1893,6 +1918,26 @@ xvid_enc_create.num_plugins++; } + if (ARG_SSIM>=0 || ARG_SSIM_PATH != NULL) { + plugins[xvid_enc_create.num_plugins].func = xvid_plugin_ssim; + + if( ARG_SSIM >=0){ + ssim.b_printstat = 1; + ssim.acc = ARG_SSIM; + } else { + ssim.b_printstat = 0; + ssim.acc = 2; + } + + if(ARG_SSIM_PATH != NULL){ + ssim.stat_path = ARG_SSIM_PATH; + } + + ssim.b_visualize = 0; + plugins[xvid_enc_create.num_plugins].param = &ssim; + xvid_enc_create.num_plugins++; + } + #if 0 if (ARG_DEBUG) { plugins[xvid_enc_create.num_plugins].func = rawenc_debug; @@ -1976,7 +2021,11 @@ fprintf(stderr, "SSE "); if (xvid_gbl_info.cpu_flags & XVID_CPU_SSE2) fprintf(stderr, "SSE2 "); - if (xvid_gbl_info.cpu_flags & XVID_CPU_3DNOW) + if (xvid_gbl_info.cpu_flags & XVID_CPU_SSE3) + fprintf(stderr, "SSE3 "); + if (xvid_gbl_info.cpu_flags & XVID_CPU_SSE41) + fprintf(stderr, "SSE41 "); + if (xvid_gbl_info.cpu_flags & XVID_CPU_3DNOW) fprintf(stderr, "3DNOW "); if (xvid_gbl_info.cpu_flags & XVID_CPU_3DNOWEXT) fprintf(stderr, "3DNOWEXT "); @@ -2031,10 +2080,7 @@ if (image) { xvid_enc_frame.input.plane[0] = image; #ifndef READ_PNM - if (ARG_INPUTTYPE==2) - xvid_enc_frame.input.csp = ARG_COLORSPACE; - else - xvid_enc_frame.input.csp = XVID_CSP_I420; + xvid_enc_frame.input.csp = ARG_COLORSPACE; xvid_enc_frame.input.stride[0] = XDIM; #else xvid_enc_frame.input.csp = XVID_CSP_BGR;