--- trunk/xvidcore/examples/xvid_encraw.c 2010/03/09 14:56:02 1884 +++ trunk/xvidcore/examples/xvid_encraw.c 2014/02/11 14:48:31 2074 @@ -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.40 2010-03-09 14:56:02 Isibaar Exp $ + * $Id$ * ****************************************************************************/ @@ -126,7 +126,13 @@ #define MAX_ZONES 64 #define MAX_ENC_INSTANCES 4 +#define MAX_XDIM 4096 +#define MAX_YDIM 4096 #define DEFAULT_QUANT 400 +#define DEFAULT_BITRATE 700000 /* bitrate expressed in bps, not kbps */ +#define DEFAULT_INTERLACING 1 /* 1:BFF, 2:TFF */ +#define DEFAULT_SSIM 2 +#define DEFAULT_PROGRESS 10 /* show progress every 10 frames by default */ typedef struct { @@ -187,7 +193,6 @@ static int ARG_NUM_APP_THREADS = 1; static int ARG_CPU_FLAGS = 0; -static int ARG_STATS = 0; static int ARG_SSIM = -1; static char* ARG_SSIM_PATH = NULL; static int ARG_DUMP = 0; @@ -199,7 +204,7 @@ static char *ARG_PASS2 = 0; //static int ARG_QUALITY = ME_ELEMENTS - 1; static int ARG_QUALITY = 6; -static float ARG_FRAMERATE = 25.00f; +static float ARG_FRAMERATE = 0.f; static int ARG_DWRATE = 25; static int ARG_DWSCALE = 1; static int ARG_MAXFRAMENR = ABS_MAXFRAMENR; @@ -218,20 +223,12 @@ static int ARG_BQRATIO = 150; static int ARG_BQOFFSET = 100; static int ARG_MAXBFRAMES = 2; -static int ARG_PACKED = 1; static int ARG_DEBUG = 0; -static int ARG_VOPDEBUG = 0; -static int ARG_TRELLIS = 1; static int ARG_QTYPE = 0; static int ARG_QMATRIX = 0; -static int ARG_GMC = 0; static int ARG_INTERLACING = 0; -static int ARG_QPEL = 0; -static int ARG_TURBO = 0; static int ARG_VHQMODE = 1; -static int ARG_BVHQ = 0; -static int ARG_CLOSED_GOP = 1; -static int ARG_CHROMAME = 1; +static int ARG_QMETRIC = 0; static int ARG_PAR = 1; static int ARG_PARHEIGHT; static int ARG_PARWIDTH; @@ -255,12 +252,27 @@ static int ARG_VBVMAXRATE = 0; static int ARG_VBVPEAKRATE = 0; static int ARG_THREADS = 0; +static int ARG_SLICES = 1; static int ARG_VFR = 0; static int ARG_PROGRESS = 0; static int ARG_COLORSPACE = XVID_CSP_YV12; /* the path where to save output */ static char filepath[256] = "./"; +/* on/off options */ +static int ARG_USE_ASSEMBLER = 1; +static int ARG_TURBO = 0; +static int ARG_BVHQ = 0; +static int ARG_QPEL = 0; +static int ARG_GMC = 0; +static int ARG_PACKED = 1; +static int ARG_CLOSED_GOP = 1; +static int ARG_STATS = 0; +static int ARG_PSNRHVSM = 0; +static int ARG_VOPDEBUG = 0; +static int ARG_CHROMAME = 1; +static int ARG_TRELLIS = 1; + static unsigned char qmatrix_intra[64]; static unsigned char qmatrix_inter[64]; @@ -342,36 +354,15 @@ int input_num = 0; int totalsize = 0; - int use_assembler = 1; + int use_assembler = ARG_USE_ASSEMBLER; 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"); /* Is there a dumb Xvid coder ? */ if(ME_ELEMENTS != VOP_ELEMENTS) { - fprintf(stderr, "Presets' arrays should have the same number of elements -- Please fill a bug to xvid-devel@xvid.org\n"); + fprintf(stderr, "Presets' arrays should have the same number of elements -- Please file a bug to xvid-devel@xvid.org\n"); return(-1); } @@ -409,12 +400,12 @@ 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 - ARG_BITRATE = 700000; + ARG_BITRATE = DEFAULT_BITRATE; } else if (strcmp("-size", argv[i]) == 0 && i < argc - 1) { i++; ARG_TARGETSIZE = atoi(argv[i]); @@ -463,9 +454,14 @@ ARG_PACKED = 2; } else if (strcmp("-nochromame", argv[i]) == 0) { ARG_CHROMAME = 0; + } else if (strcmp("-chromame", argv[i]) == 0) { + ARG_CHROMAME = 1; } else if (strcmp("-threads", argv[i]) == 0 && i < argc -1) { i++; ARG_THREADS = atoi(argv[i]); + } else if (strcmp("-slices", argv[i]) == 0 && i < argc -1) { + i++; + ARG_SLICES = atoi(argv[i]); } else if (strcmp("-bquant_ratio", argv[i]) == 0 && i < argc - 1) { i++; ARG_BQRATIO = atoi(argv[i]); @@ -500,7 +496,7 @@ memset(&ZONES[NUM_ZONES], 0, sizeof(zone_t)); ZONES[NUM_ZONES].frame = startframe; - ZONES[NUM_ZONES].modifier = atof(options)*100; + ZONES[NUM_ZONES].modifier = (int)(atof(options)*100); if (toupper(c)=='Q') ZONES[NUM_ZONES].mode = XVID_ZONE_QUANT; else if (toupper(c)=='W') @@ -513,7 +509,7 @@ if ((frameoptions=strchr(options, ','))!=NULL) { int readchar=0, count; frameoptions++; - while (readchar 0) i++; else - ARG_PROGRESS = 10; - } else if (strcmp("-help", argv[i])) { + ARG_PROGRESS = DEFAULT_PROGRESS; + } else if (strcmp("-help", argv[i]) == 0) { usage(); return (0); } else { @@ -777,7 +794,7 @@ * Arguments checking ****************************************************************************/ - if (XDIM <= 0 || XDIM >= 4096 || YDIM <= 0 || YDIM >= 4096) { + if (XDIM <= 0 || XDIM >= MAX_XDIM || YDIM <= 0 || YDIM >= MAX_YDIM) { fprintf(stderr, "Trying to retrieve width and height from input header\n"); if (!ARG_INPUTTYPE) @@ -834,14 +851,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); @@ -904,7 +927,7 @@ temp = (unsigned char*)AVIStreamGetFrame(get_frame, 0); if (temp != NULL) { int i; - for (i = 0; i < ((DWORD*)temp)[0]; i++) { + for (i = 0; i < (int)((DWORD*)temp)[0]; i++) { fprintf(stderr, "%2d ", temp[i]); } fprintf(stderr, "\n"); @@ -920,7 +943,7 @@ if (ARG_MAXFRAMENR<0) ARG_MAXFRAMENR = avi_info.dwLength-ARG_STARTFRAMENR; else - ARG_MAXFRAMENR = min(ARG_MAXFRAMENR, avi_info.dwLength-ARG_STARTFRAMENR); + ARG_MAXFRAMENR = min(ARG_MAXFRAMENR, (int)(avi_info.dwLength-ARG_STARTFRAMENR)); XDIM = avi_info.rcFrame.right - avi_info.rcFrame.left; YDIM = avi_info.rcFrame.bottom - avi_info.rcFrame.top; @@ -934,6 +957,7 @@ if (get_frame) AVIStreamGetFrameClose(get_frame); if (avi_in_stream) AVIStreamRelease(avi_in_stream); + AVIFileExit(); } else #endif @@ -954,8 +978,7 @@ } if (ARG_FRAMERATE <= 0) { - fprintf(stderr, "Wrong Framerate %f\n", ARG_FRAMERATE); - return (-1); + ARG_FRAMERATE = 25.00f; /* default value */ } if (ARG_TARGETSIZE) { @@ -966,7 +989,7 @@ fprintf(stderr, "Parameter conflict: Do not specify both -bitrate and -size\n"); goto release_all; } else - ARG_BITRATE = ((ARG_TARGETSIZE * 8) / (ARG_MAXFRAMENR / ARG_FRAMERATE)) * 1024; + ARG_BITRATE = (int)(((ARG_TARGETSIZE * 8) / (ARG_MAXFRAMENR / ARG_FRAMERATE)) * 1024); } /* Set constant quant to default if no bitrate given for single pass */ @@ -1037,7 +1060,7 @@ sprintf(statsfilename[k], "%s.%03d", ARG_PASS1, k); enc_data[k].statsfilename1 = statsfilename[k]; } - enc_data[k].start_num = k*((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; } @@ -1067,7 +1090,7 @@ totalenctime = MAX(totalenctime, enc_data[k].totalenctime); for (i=0; i < 3; i++) totalPSNR[i] += enc_data[k].totalPSNR[i]; - for (i=0; i < 8; i++) { + for (i=0; i < 7; i++) { int l; framestats[i].count += enc_data[k].framestats[i].count; framestats[i].size += enc_data[k].framestats[i].size; @@ -1162,12 +1185,7 @@ release_all: -#if defined(XVID_AVI_INPUT) || defined(XVID_AVI_OUTPUT) - AVIFileExit(); -#endif - return (0); - } /***************************************************************************** @@ -1210,6 +1228,11 @@ 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; @@ -1219,10 +1242,15 @@ #endif #if defined(XVID_AVI_OUTPUT) int avierr; - PAVIFILE myAVIFile=NULL; - PAVISTREAM myAVIStream=NULL; + PAVIFILE myAVIFile = NULL; + PAVISTREAM myAVIStream = NULL; AVISTREAMINFO myAVIStreamInfo; +#endif +#if defined(XVID_AVI_INPUT) || defined(XVID_AVI_OUTPUT) BITMAPINFOHEADER myBitmapInfoHeader; + if (ARG_NUM_APP_THREADS > 1) + CoInitializeEx(0, COINIT_MULTITHREADED); + AVIFileInit(); #endif if (ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0) { @@ -1236,9 +1264,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; @@ -1301,7 +1326,7 @@ temp = (unsigned char*)AVIStreamGetFrame(get_frame, 0); if (temp != NULL) { int i; - for (i = 0; i < ((DWORD*)temp)[0]; i++) { + for (i = 0; i < (int)((DWORD*)temp)[0]; i++) { fprintf(stderr, "%2d ", temp[i]); } fprintf(stderr, "\n"); @@ -1411,7 +1436,7 @@ myAVIStreamInfo.dwRate = ARG_DWRATE; myAVIStreamInfo.dwLength = ARG_MAXFRAMENR; myAVIStreamInfo.dwQuality = 10000; - SetRect(&myAVIStreamInfo.rcFrame, 0, 0, YDIM, XDIM); + SetRect(&myAVIStreamInfo.rcFrame, 0, 0, XDIM, YDIM); if (avierr=AVIFileOpen(&myAVIFile, ARG_AVIOUTPUTFILE, OF_CREATE|OF_WRITE, NULL)) { fprintf(stderr, "AVIFileOpen failed opening output file %s, error code %d\n", ARG_AVIOUTPUTFILE, avierr); @@ -1528,7 +1553,7 @@ * Encode and decode this frame ****************************************************************************/ - if ((input_num+start_num) >= (unsigned int)(stop_num-1) && ARG_MAXBFRAMES) { + if ((unsigned int)(input_num+start_num) >= (unsigned int)(stop_num-1) && ARG_MAXBFRAMES) { stats_type = XVID_TYPE_PVOP; } else @@ -1722,6 +1747,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); @@ -1811,102 +1839,148 @@ fprintf(stderr, "xvid_encraw built at %s on %s\n", __TIME__, __DATE__); fprintf(stderr, "Usage : xvid_encraw [OPTIONS]\n\n"); fprintf(stderr, "Input options:\n"); - fprintf(stderr, " -i string : input filename (stdin)\n"); + fprintf(stderr, " -i string : input filename (stdin)\n"); #ifdef XVID_AVI_INPUT - fprintf(stderr, " -type integer: input data type (yuv=0, pgm=1, avi/avs=2)\n"); + fprintf(stderr, " -type integer : input data type (yuv=0, pgm=1, avi/avs=2) ("); #else - fprintf(stderr, " -type integer: input data type (yuv=0, pgm=1)\n"); + fprintf(stderr, " -type integer : input data type (yuv=0, pgm=1) ("); #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, "%d)\n", ARG_INPUTTYPE); + fprintf(stderr, " -w integer : frame width ([1.%d])\n", MAX_XDIM); + fprintf(stderr, " -h integer : frame height ([1.%d])\n", MAX_YDIM); + fprintf(stderr, " -csp string : colorspace of raw input file i420%s, yv12%s\n", (ARG_COLORSPACE == XVID_CSP_I420)?" (default)":"", (ARG_COLORSPACE == XVID_CSP_YV12)?" (default)":""); + fprintf(stderr, " -frames integer : number of frames to encode ("); + if (ARG_MAXFRAMENR==-1) + fprintf(stderr, "all)"); + else + fprintf(stderr, "%d)", ARG_MAXFRAMENR); + fprintf(stderr, "\n\n"); fprintf(stderr, "Output options:\n"); - fprintf(stderr, " -dump : save decoder output\n"); - fprintf(stderr, " -save : save an Elementary Stream file per frame\n"); - fprintf(stderr, " -o string : save an Elementary Stream for the complete sequence\n"); + fprintf(stderr, " -dump : save decoder output\n"); + fprintf(stderr, " -save : save an Elementary Stream file per frame\n"); + fprintf(stderr, " -o string : save an Elementary Stream for the complete sequence\n"); #ifdef XVID_AVI_OUTPUT - fprintf(stderr, " -avi string: save an AVI file for the complete sequence\n"); + fprintf(stderr, " -avi string : save an AVI file for the complete sequence\n"); +#endif +#ifdef XVID_MKV_OUTPUT + fprintf(stderr, " -mkv string : save a MKV file for the complete sequence\n"); #endif - fprintf(stderr, " -mkv string: save a MKV file for the complete sequence\n"); - fprintf(stderr, "\n"); - fprintf(stderr, "BFrames options:\n"); - fprintf(stderr, " -max_bframes integer: max bframes (2)\n"); - fprintf(stderr, " -bquant_ratio integer: bframe quantizer ratio (150)\n"); - fprintf(stderr, " -bquant_offset integer: bframe quantizer offset (100)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Rate control options:\n"); - fprintf(stderr, " -framerate float : target framerate (25.0)\n"); - fprintf(stderr, " -bitrate [integer] : target bitrate in kbps (700)\n"); - fprintf(stderr, " -size integer : target size in kilobytes\n"); - fprintf(stderr, " -single : single pass mode (default)\n"); - fprintf(stderr, " -cq float : single pass constant quantizer\n"); - fprintf(stderr, " -pass1 [filename] : twopass mode (first pass)\n"); - fprintf(stderr, " -full1pass : perform full first pass\n"); - fprintf(stderr, " -pass2 [filename] : twopass mode (2nd pass)\n"); - fprintf(stderr, " -zq starting_frame float : bitrate zone; quant\n"); - fprintf(stderr, " -zw starting_frame float : bitrate zone; weight\n"); - fprintf(stderr, " -max_key_interval integer : maximum keyframe interval (300)\n"); - fprintf(stderr, "\n"); + fprintf(stderr, " -framerate float : target framerate (auto)\n"); + fprintf(stderr, " -bitrate [integer] : target bitrate in kbps (%d)\n", DEFAULT_BITRATE/1000); + fprintf(stderr, " -size integer : target size in kilobytes\n"); + fprintf(stderr, " -single : single pass mode%s\n", (ARG_SINGLE)?" (default)":""); + fprintf(stderr, " -cq float : single pass constant quantizer\n"); + fprintf(stderr, " -pass1 [filename] : twopass mode (first pass)\n"); + fprintf(stderr, " -full1pass : perform full quality first pass (disabled)\n"); + fprintf(stderr, " -pass2 [filename] : twopass mode (2nd pass)\n"); + fprintf(stderr, " -max_key_interval integer : maximum keyframe interval (%d)\n", ARG_MAXKEYINTERVAL); + fprintf(stderr, " -zq starting_frame float : bitrate zone; quant\n"); + fprintf(stderr, " -zw starting_frame float : bitrate zone; weight\n"); + fprintf(stderr, "\n"); fprintf(stderr, "Single Pass options:\n"); - fprintf(stderr, "-reaction integer : reaction delay factor (16)\n"); - fprintf(stderr, "-averaging integer : averaging period (100)\n"); - fprintf(stderr, "-smoother integer : smoothing buffer (100)\n"); + fprintf(stderr, " -reaction integer : reaction delay factor (%d)\n", ARG_REACTION); + fprintf(stderr, " -averaging integer : averaging period (%d)\n", ARG_AVERAGING); + fprintf(stderr, " -smoother integer : smoothing buffer (%d)\n", ARG_SMOOTHER); fprintf(stderr, "\n"); fprintf(stderr, "Second Pass options:\n"); - fprintf(stderr, "-kboost integer : I frame boost (10)\n"); - fprintf(stderr, "-kthresh integer : I frame reduction threshold (1)\n"); - fprintf(stderr, "-kreduction integer : I frame reduction amount (20)\n"); - fprintf(stderr, "-ostrength integer : overflow control strength (5)\n"); - fprintf(stderr, "-oimprove integer : max overflow improvement (5)\n"); - 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, "-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"); + fprintf(stderr, " -kboost integer : I frame boost (%d)\n", ARG_KBOOST); + fprintf(stderr, " -kthresh integer : I frame reduction threshold (%d)\n", ARG_KTHRESH); + fprintf(stderr, " -kreduction integer : I frame reduction amount (%d)\n", ARG_KREDUCTION); + fprintf(stderr, " -ostrength integer : overflow control strength (%d)\n", ARG_OVERSTRENGTH); + fprintf(stderr, " -oimprove integer : max overflow improvement (%d)\n", ARG_OVERIMPROVE); + fprintf(stderr, " -odegrade integer : max overflow degradation (%d)\n", ARG_OVERDEGRADE); + fprintf(stderr, " -chigh integer : high bitrate scenes degradation (%d)\n", ARG_CHIGH); + fprintf(stderr, " -clow integer : low bitrate scenes improvement (%d)\n", ARG_CLOW); + fprintf(stderr, " -overhead integer : container frame overhead (%d)\n", ARG_OVERHEAD); + 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"); + fprintf(stderr, "\n"); + fprintf(stderr, "BFrames options:\n"); + fprintf(stderr, " -max_bframes integer : max bframes (%d)\n", ARG_MAXBFRAMES); + fprintf(stderr, " -bquant_ratio integer : bframe quantizer ratio (%d)\n", ARG_BQRATIO); + fprintf(stderr, " -bquant_offset integer : bframe quantizer offset (%d)\n", ARG_BQOFFSET); fprintf(stderr, "\n"); fprintf(stderr, "Other options\n"); - fprintf(stderr, " -noasm : do not use assembly optmized code\n"); - fprintf(stderr, " -turbo : use turbo presets for higher encoding speed\n"); - 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, " -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"); - fprintf(stderr, " -qmatrix filename : use custom MPEG4 quantization matrix\n"); - fprintf(stderr, " -interlaced [integer] : interlaced encoding (BFF:1, TFF:2) (1)\n"); - fprintf(stderr, " -nopacked : Disable packed mode\n"); - fprintf(stderr, " -noclosed_gop : Disable closed GOP mode\n"); - fprintf(stderr, " -masking [integer] : HVS masking mode (None:0, Lumi:1, Variance:2) (0)\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"); - fprintf(stderr, " -notrellis : Disable trellis quantization\n"); - fprintf(stderr, " -imin integer : Minimum I Quantizer (1..31) (2)\n"); - fprintf(stderr, " -imax integer : Maximum I quantizer (1..31) (31)\n"); - fprintf(stderr, " -bmin integer : Minimum B Quantizer (1..31) (2)\n"); - fprintf(stderr, " -bmax integer : Maximum B quantizer (1..31) (31)\n"); - fprintf(stderr, " -pmin integer : Minimum P Quantizer (1..31) (2)\n"); - fprintf(stderr, " -pmax integer : Maximum P quantizer (1..31) (31)\n"); - fprintf(stderr, " -drop integer : Frame Drop Ratio (0..100) (0)\n"); - fprintf(stderr, " -start integer : Starting frame number\n"); - fprintf(stderr, " -threads integer : Number of threads\n"); - fprintf(stderr, " -progress [integer] : Show progress updates every n frames (10)\n"); - fprintf(stderr, " -par integer[:integer] : Set Pixel Aspect Ratio.\n"); - fprintf(stderr, " 1 = 1:1\n"); - fprintf(stderr, " 2 = 12:11 (4:3 PAL)\n"); - fprintf(stderr, " 3 = 10:11 (4:3 NTSC)\n"); - fprintf(stderr, " 4 = 16:11 (16:9 PAL)\n"); - fprintf(stderr, " 5 = 40:33 (16:9 NTSC)\n"); - fprintf(stderr, " other = custom (width:height)\n"); - fprintf(stderr, " -help : prints this help message\n"); + if (ARG_USE_ASSEMBLER) + fprintf(stderr, " -noasm : do not use assembly optimized code (use)\n"); + else + fprintf(stderr, " -asm : use assembly optimized code (don't use)\n"); + if (ARG_TURBO) + fprintf(stderr, " -noturbo : do not use turbo presets for higher encoding speed (use)\n"); + else + fprintf(stderr, " -turbo : use turbo presets for higher encoding speed (don't use)\n"); + fprintf(stderr, " -quality integer : quality ([0..%d]) (%d)\n", ME_ELEMENTS - 1, ARG_QUALITY); + fprintf(stderr, " -vhqmode integer : level of R-D optimizations ([0..4]) (%d)\n", ARG_VHQMODE); + if (ARG_BVHQ) + fprintf(stderr, " -nobvhq : do not use R-D optimizations for B-frames (use)\n"); + else + fprintf(stderr, " -bvhq : use R-D optimizations for B-frames (don't use)\n"); + fprintf(stderr, " -metric integer : distortion metric for R-D opt (PSNR:0, PSNRHVSM:1) (%d)\n", ARG_QMETRIC); + if (ARG_QPEL) + fprintf(stderr, " -noqpel : do not use quarter pixel ME (use)\n"); + else + fprintf(stderr, " -qpel : use quarter pixel ME (don't use)\n"); + if (ARG_GMC) + fprintf(stderr, " -nogmc : do not use global motion compensation (use)\n"); + else + fprintf(stderr, " -gmc : use global motion compensation (don't use)\n"); + fprintf(stderr, " -qtype integer : quantization type (H263:0, MPEG4:1) (%d)\n", ARG_QTYPE); + fprintf(stderr, " -qmatrix filename : use custom MPEG4 quantization matrix\n"); + fprintf(stderr, " -interlaced [integer] : interlaced encoding (BFF:1, TFF:2) (%d)\n", DEFAULT_INTERLACING); + if (ARG_PACKED) + fprintf(stderr, " -nopacked : Disable packed B-frames mode (enabled)\n"); + else + fprintf(stderr, " -packed : Enable packed B-frames mode (disabled)\n"); + if (ARG_CLOSED_GOP) + fprintf(stderr, " -noclosed_gop : Disable closed GOP mode (enabled)\n"); + else + fprintf(stderr, " -closed_gop : Enable closed GOP mode (disabled)\n"); + fprintf(stderr, " -masking [integer] : HVS masking mode (None:0, Lumi:1, Variance:2) (%d)\n", ARG_LUMIMASKING); + if (ARG_STATS) + fprintf(stderr, " -nostats : do not print stats about encoded frames (print)\n"); + else + fprintf(stderr, " -stats : print stats about encoded frames (don't print)\n"); + fprintf(stderr, " -ssim [integer] : prints ssim for every frame (accurate: 0 fast: 4) (%d)\n", DEFAULT_SSIM); + fprintf(stderr, " -ssim_file filename : outputs the ssim stats into a file\n"); + if (ARG_PSNRHVSM) + fprintf(stderr, " -nopsnrhvsm : do not print PSNRHVSM metric for every frame (print)\n"); + else + fprintf(stderr, " -psnrhvsm : print PSNRHVSM metric for every frame (don't print)\n"); + fprintf(stderr, " -debug integer : activates xvidcore internal debugging output (don't activate)\n"); + if (ARG_VOPDEBUG) + fprintf(stderr, " -novop_debug : do not print debug info directly into encoded frames (print)\n"); + else + fprintf(stderr, " -vop_debug : print some info directly into encoded frames (don't print)\n"); + if (ARG_CHROMAME) + fprintf(stderr, " -nochromame : Disable chroma motion estimation (enabled)\n"); + else + fprintf(stderr, " -chromame : Enable chroma motion estimation (disabled)\n"); + if (ARG_TRELLIS) + fprintf(stderr, " -notrellis : Disable trellis quantization (enabled)\n"); + else + fprintf(stderr, " -trellis : Enable trellis quantization (disabled)\n"); + fprintf(stderr, " -imin integer : Minimum I Quantizer (1..31) (%d)\n", ARG_QUANTS[0]); + fprintf(stderr, " -imax integer : Maximum I quantizer (1..31) (%d)\n", ARG_QUANTS[1]); + fprintf(stderr, " -bmin integer : Minimum B Quantizer (1..31) (%d)\n", ARG_QUANTS[4]); + fprintf(stderr, " -bmax integer : Maximum B quantizer (1..31) (%d)\n", ARG_QUANTS[5]); + fprintf(stderr, " -pmin integer : Minimum P Quantizer (1..31) (%d)\n", ARG_QUANTS[2]); + fprintf(stderr, " -pmax integer : Maximum P quantizer (1..31) (%d)\n", ARG_QUANTS[3]); + fprintf(stderr, " -drop integer : Frame Drop Ratio (0..100) (%d)\n", ARG_FRAMEDROP); + fprintf(stderr, " -start integer : Starting frame number (%d)\n", ARG_STARTFRAMENR); + fprintf(stderr, " -threads integer : Number of threads (auto)\n"); + fprintf(stderr, " -slices integer : Number of slices (%d)\n", ARG_SLICES); + fprintf(stderr, " -progress [integer] : Show progress updates every n frames (%d)\n", DEFAULT_PROGRESS); + fprintf(stderr, " -par integer[:integer] : Set Pixel Aspect Ratio (%d)\n", ARG_PAR); + fprintf(stderr, " 1 = 1:1\n"); + fprintf(stderr, " 2 = 12:11 (4:3 PAL)\n"); + fprintf(stderr, " 3 = 10:11 (4:3 NTSC)\n"); + fprintf(stderr, " 4 = 16:11 (16:9 PAL)\n"); + fprintf(stderr, " 5 = 40:33 (16:9 NTSC)\n"); + fprintf(stderr, " other = custom (width:height)\n"); + fprintf(stderr, " -help : prints this help message\n"); fprintf(stderr, "\n"); fprintf(stderr, "NB: You can define %d zones repeating the -z[qw] option as needed.\n", MAX_ZONES); } @@ -1926,12 +2000,13 @@ int bytes, xsize, ysize, depth; char dummy[2]; - bytes = fread(dummy, 1, 2, handle); + bytes = (int) fread(dummy, 1, 2, handle); if ((bytes < 2) || (dummy[0] != 'P') || (dummy[1] != '5')) return (1); fscanf(handle, "%d %d %d", &xsize, &ysize, &depth); + fread(&dummy, 1, 1, handle); if ((xsize > 4096) || (ysize > 4096*3/2) || (depth != 255)) { fprintf(stderr, "%d %d %d\n", xsize, ysize, depth); return (2); @@ -1949,7 +2024,6 @@ unsigned char *image) { int i; - char dummy; unsigned char *y = image; unsigned char *u = image + XDIM * YDIM; @@ -1970,9 +2044,6 @@ v += XDIM / 2; } - /* I don't know why, but this seems needed */ - fread(&dummy, 1, 1, handle); - return (0); } #else @@ -2121,7 +2192,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 +2254,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 +2321,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; @@ -2259,6 +2336,7 @@ #endif xvid_enc_create.num_threads = ARG_THREADS; + xvid_enc_create.num_slices = ARG_SLICES; /* Frame rate */ xvid_enc_create.fincr = ARG_DWSCALE; @@ -2481,6 +2559,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 */ @@ -2576,7 +2657,7 @@ ZONES[NUM_ZONES].frame = 0; ZONES[NUM_ZONES].mode = XVID_ZONE_QUANT; - ZONES[NUM_ZONES].modifier = ARG_CQ; + ZONES[NUM_ZONES].modifier = (int)ARG_CQ; ZONES[NUM_ZONES].type = XVID_TYPE_AUTO; ZONES[NUM_ZONES].greyscale = 0; ZONES[NUM_ZONES].chroma_opt = 0; @@ -2592,7 +2673,7 @@ for(i = 0; i < NUM_ZONES; i++) if (ZONES[i].mode == XVID_ZONE_WEIGHT) { ZONES[i].mode = XVID_ZONE_QUANT; - ZONES[i].modifier = (100*ARG_CQ) / ZONES[i].modifier; + ZONES[i].modifier = (int) ((100*ARG_CQ) / ZONES[i].modifier); } } @@ -2661,7 +2742,7 @@ int i; char* userdata; - for (i=0; i <= (bufsize-sizeof(userdata_start_code)); i++) { + for (i=0; i <= (int)(bufsize-sizeof(userdata_start_code)); i++) { if (memcmp((void*)userdata_start_code, (void*)(buf+i), strlen(userdata_start_code))==0) { if ((userdata = strstr(buf+i+4, "DivX"))!=NULL) { userdata[strlen(userdata)-1] = '\0';