--- trunk/xvidcore/examples/xvid_encraw.c 2010/03/09 10:00:30 1883 +++ trunk/xvidcore/examples/xvid_encraw.c 2010/11/28 15:19:07 1909 @@ -22,7 +22,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.39 2010-03-09 10:00:22 Isibaar Exp $ + * $Id: xvid_encraw.c,v 1.45 2010-11-28 15:19:07 Isibaar Exp $ * ****************************************************************************/ @@ -189,6 +189,7 @@ static int ARG_CPU_FLAGS = 0; static int ARG_STATS = 0; static int ARG_SSIM = -1; +static int ARG_PSNRHVSM = 0; static char* ARG_SSIM_PATH = NULL; static int ARG_DUMP = 0; static int ARG_LUMIMASKING = 0; @@ -230,6 +231,7 @@ static int ARG_TURBO = 0; static int ARG_VHQMODE = 1; static int ARG_BVHQ = 0; +static int ARG_QMETRIC = 0; static int ARG_CLOSED_GOP = 1; static int ARG_CHROMAME = 1; static int ARG_PAR = 1; @@ -345,27 +347,6 @@ int use_assembler = 1; int i; -#if defined(XVID_AVI_INPUT) - PAVIFILE avi_in = NULL; - PAVISTREAM avi_in_stream = NULL; - PGETFRAME get_frame = NULL; -#else -#define get_frame NULL -#endif -#if defined(XVID_AVI_OUTPUT) - PAVIFILE myAVIFile = NULL; - PAVISTREAM myAVIStream = NULL; - BITMAPINFOHEADER myBitmapInfoHeader; -#endif -#if defined(XVID_AVI_INPUT) || defined(XVID_AVI_OUTPUT) - AVIFileInit(); -#endif -#ifdef XVID_MKV_OUTPUT - PMKVFILE myMKVFile=NULL; - PMKVSTREAM myMKVStream=NULL; - MKVSTREAMINFO myMKVStreamInfo; -#endif - printf("xvid_encraw - raw mpeg4 bitstream encoder "); printf("written by Christoph Lampert\n\n"); @@ -409,8 +390,8 @@ ARG_BITRATE = atoi(argv[i+1]); if (ARG_BITRATE) { i++; - if (ARG_BITRATE <= 10000) - /* if given parameter is <= 10000, assume it means kbps */ + if (ARG_BITRATE <= 20000) + /* if given parameter is <= 20000, assume it means kbps */ ARG_BITRATE *= 1000; } else @@ -571,6 +552,9 @@ } else if (strcmp("-vhqmode", argv[i]) == 0 && i < argc - 1) { i++; ARG_VHQMODE = atoi(argv[i]); + } else if (strcmp("-metric", argv[i]) == 0 && i < argc - 1) { + i++; + ARG_QMETRIC = atoi(argv[i]); } else if (strcmp("-framerate", argv[i]) == 0 && i < argc - 1) { int exponent; i++; @@ -599,6 +583,8 @@ i++; ARG_SSIM = atoi(argv[i]); } + } else if (strcmp("-psnrhvsm", argv[i]) == 0) { + ARG_PSNRHVSM = 1; } else if (strcmp("-ssim_file", argv[i]) == 0 && i < argc -1) { i++; ARG_SSIM_PATH = argv[i]; @@ -718,7 +704,7 @@ ARG_VBVMAXRATE = atoi(argv[i]); } else if (strcmp("-vbvpeak", argv[i]) == 0 && i < argc -1) { i++; - ARG_VBVPEAKRATE = atoi(argv[i])*3; + ARG_VBVPEAKRATE = atoi(argv[i]); } else if (strcmp("-reaction", argv[i]) == 0 && i < argc -1) { i++; ARG_REACTION = atoi(argv[i]); @@ -834,14 +820,20 @@ } if (ARG_INPUTFILE != NULL) { -#ifdef XVID_AVI_INPUT +#if defined(XVID_AVI_INPUT) if (strcmp(ARG_INPUTFILE+(strlen(ARG_INPUTFILE)-3), "avs")==0 || strcmp(ARG_INPUTFILE+(strlen(ARG_INPUTFILE)-3), "avi")==0 || ARG_INPUTTYPE==2) { + PAVIFILE avi_in = NULL; + PAVISTREAM avi_in_stream = NULL; + PGETFRAME get_frame = NULL; + BITMAPINFOHEADER myBitmapInfoHeader; AVISTREAMINFO avi_info; - FILE *avi_fp = fopen(ARG_INPUTFILE, "rb"); + + AVIFileInit(); + if (avi_fp == NULL) { fprintf(stderr, "Couldn't open file '%s'!\n", ARG_INPUTFILE); return (-1); @@ -934,6 +926,7 @@ if (get_frame) AVIStreamGetFrameClose(get_frame); if (avi_in_stream) AVIStreamRelease(avi_in_stream); + AVIFileExit(); } else #endif @@ -1037,7 +1030,7 @@ sprintf(statsfilename[k], "%s.%03d", ARG_PASS1, k); enc_data[k].statsfilename1 = statsfilename[k]; } - enc_data[k].start_num = (ARG_MAXFRAMENR-ARG_STARTFRAMENR)/ARG_NUM_APP_THREADS; + enc_data[k].start_num = (k*(ARG_MAXFRAMENR-ARG_STARTFRAMENR))/ARG_NUM_APP_THREADS; enc_data[k].stop_num = ((k+1)*(ARG_MAXFRAMENR-ARG_STARTFRAMENR))/ARG_NUM_APP_THREADS; } @@ -1162,12 +1155,7 @@ release_all: -#if defined(XVID_AVI_INPUT) || defined(XVID_AVI_OUTPUT) - AVIFileExit(); -#endif - return (0); - } /***************************************************************************** @@ -1210,19 +1198,29 @@ char filename[256]; +#ifdef XVID_MKV_OUTPUT + PMKVFILE myMKVFile = NULL; + PMKVSTREAM myMKVStream = NULL; + MKVSTREAMINFO myMKVStreamInfo; +#endif #if defined(XVID_AVI_INPUT) PAVIFILE avi_in = NULL; PAVISTREAM avi_in_stream = NULL; PGETFRAME get_frame = NULL; + BITMAPINFOHEADER myBitmapInfoHeader; #else #define get_frame NULL #endif #if defined(XVID_AVI_OUTPUT) int avierr; - PAVIFILE myAVIFile=NULL; - PAVISTREAM myAVIStream=NULL; + PAVIFILE myAVIFile = NULL; + PAVISTREAM myAVIStream = NULL; AVISTREAMINFO myAVIStreamInfo; - BITMAPINFOHEADER myBitmapInfoHeader; +#endif +#if defined(XVID_AVI_INPUT) || defined(XVID_AVI_OUTPUT) + if (ARG_NUM_APP_THREADS > 1) + CoInitializeEx(0, COINIT_MULTITHREADED); + AVIFileInit(); #endif if (ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0) { @@ -1236,9 +1234,6 @@ AVISTREAMINFO avi_info; FILE *avi_fp = fopen(ARG_INPUTFILE, "rb"); - if (ARG_NUM_APP_THREADS > 1) - CoInitializeEx(0, COINIT_MULTITHREADED); - if (avi_fp == NULL) { fprintf(stderr, "Couldn't open file '%s'!\n", ARG_INPUTFILE); return; @@ -1722,6 +1717,9 @@ if (myMKVStream) MKVStreamRelease(myMKVStream); if (myMKVFile) MKVFileRelease(myMKVFile); #endif +#if defined(XVID_AVI_INPUT) || defined(XVID_AVI_OUTPUT) + AVIFileExit(); +#endif free_all_memory: free(out_buffer); @@ -1863,7 +1861,7 @@ fprintf(stderr, "-odegrade integer : max overflow degradation (5)\n"); fprintf(stderr, "-chigh integer : high bitrate scenes degradation (0)\n"); fprintf(stderr, "-clow integer : low bitrate scenes improvement (0)\n"); - fprintf(stderr, "-overhead integer : container frame overhead (24)\n"); + fprintf(stderr, "-overhead integer : container frame overhead (0)\n"); fprintf(stderr, "-vbvsize integer : use vbv buffer size\n"); fprintf(stderr, "-vbvmax integer : vbv max bitrate\n"); fprintf(stderr, "-vbvpeak integer : vbv peak bitrate over 1 second\n"); @@ -1874,6 +1872,7 @@ fprintf(stderr, " -quality integer : quality ([0..%d]) (6)\n", ME_ELEMENTS - 1); fprintf(stderr, " -vhqmode integer : level of R-D optimizations ([0..4]) (1)\n"); fprintf(stderr, " -bvhq : use R-D optimizations for B-frames\n"); + fprintf(stderr, " -metric integer : distortion metric for R-D opt (PSNR:0, PSNRHVSM: 1)\n"); fprintf(stderr, " -qpel : use quarter pixel ME\n"); fprintf(stderr, " -gmc : use global motion compensation\n"); fprintf(stderr, " -qtype integer : quantization type (H263:0, MPEG4:1) (0)\n"); @@ -1885,6 +1884,7 @@ 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, " -psnrhvsm : prints PSNRHVSM metric for every frame\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"); @@ -2121,7 +2121,7 @@ xvid_plugin_2pass1_t rc2pass1; xvid_plugin_2pass2_t rc2pass2; xvid_plugin_ssim_t ssim; - xvid_plugin_lumimasking_t masking; + xvid_plugin_lumimasking_t masking; //xvid_plugin_fixed_t rcfixed; xvid_enc_plugin_t plugins[8]; xvid_enc_create_t xvid_enc_create; @@ -2183,7 +2183,7 @@ rc2pass2.vbv_size = ARG_VBVSIZE; rc2pass2.vbv_initial = (ARG_VBVSIZE*3)/4; rc2pass2.vbv_maxrate = ARG_VBVMAXRATE; - rc2pass2.vbv_peakrate = ARG_VBVPEAKRATE*3; + rc2pass2.vbv_peakrate = ARG_VBVPEAKRATE; plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2; @@ -2250,6 +2250,12 @@ xvid_enc_create.num_plugins++; } + if (ARG_PSNRHVSM>0) { + plugins[xvid_enc_create.num_plugins].func = xvid_plugin_psnrhvsm; + plugins[xvid_enc_create.num_plugins].param = NULL; + xvid_enc_create.num_plugins++; + } + #if 0 if (ARG_DEBUG) { plugins[xvid_enc_create.num_plugins].func = rawenc_debug; @@ -2481,6 +2487,9 @@ if (ARG_BVHQ) xvid_enc_frame.vop_flags |= XVID_VOP_RD_BVOP; + if (ARG_QMETRIC == 1) + xvid_enc_frame.vop_flags |= XVID_VOP_RD_PSNRHVSM; + switch (ARG_VHQMODE) /* this is the same code as for vfw */ { case 1: /* VHQ_MODE_DECISION */