From bbdd24fc3fb4716b08d5ac9125347265ff8c3cce Mon Sep 17 00:00:00 2001 From: masternobody Date: Sat, 1 Nov 2008 19:30:29 +0000 Subject: [PATCH] Release of new configuration GUI git-svn-id: svn+ssh://svn.code.sf.net/p/x264vfw/code/trunk@14 20192f6c-ba0a-41c8-b3a9-3ed24a2bdf33 --- Makefile | 30 +- codec.c | 210 +++-- config.c | 1860 +++++++++++++++++++++++++++++++------------- csp.c | 20 +- csp.h | 5 +- driverproc.c | 60 +- ffmpeg.bmp | Bin 0 -> 35454 bytes resource.h | 212 +++-- resource.rc | 514 ++++++------ x264vfw.h | 218 ++++-- x264vfw_config.h | 16 + x264vfw_config.mak | 2 + 12 files changed, 2120 insertions(+), 1027 deletions(-) create mode 100644 ffmpeg.bmp create mode 100644 x264vfw_config.h create mode 100644 x264vfw_config.mak diff --git a/Makefile b/Makefile index 16d09c2..4301261 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ ############################################################################## include config.mak +include x264vfw_config.mak # Dll to build DLL = x264vfw.dll @@ -24,13 +25,11 @@ DIR_CUR = $(shell pwd) # Path to include filen library and src DIR_SRC = $(DIR_CUR) -X264_INC = $(DIR_CUR)/../x264 -X264_LIB = $(DIR_CUR)/../x264 -FF_INC = $(DIR_CUR)/../ffmpeg -FF_LIB = $(DIR_CUR)/../ffmpeg +X264_DIR = $(DIR_CUR)/../x264 +FFMPEG_DIR = $(DIR_CUR)/../ffmpeg # Sources -SRC_C = codec.c config.c driverproc.c csp.c +SRC_C = codec.c config.c csp.c driverproc.c SRC_RES = resource.rc # Alias @@ -43,23 +42,28 @@ WINDRES = windres # Constants which should not be modified # The `mingw-runtime` package is required when building with -mno-cygwin -CFLAGS += -I$(DIR_SRC)/w32api -I$(X264_INC) -I$(FF_INC) -I$(FF_INC)/libavcodec -I$(FF_INC)/libavutil -CFLAGS += -D_WIN32_IE=0x0500 CFLAGS += -mno-cygwin +CFLAGS += -D_WIN32_IE=0x0500 +CFLAGS += -I$(DIR_SRC)/w32api -I$(X264_DIR) ############################################################################## # Compiler flags for linking stage ############################################################################## -LDFLAGS += -L$(X264_LIB) -lx264 -L$(FF_LIB)/libavcodec -lavcodec -L$(FF_LIB)/libavutil -lavutil +VFW_LDFLAGS = -L$(X264_DIR) -lx264 ############################################################################## # Conditional options ############################################################################## +ifeq ($(HAVE_FFMPEG),yes) +CFLAGS += -I$(FFMPEG_DIR) -I$(FFMPEG_DIR)/libavcodec -I$(FFMPEG_DIR)/libavutil +VFW_LDFLAGS += -L$(FFMPEG_DIR)/libavcodec -lavcodec -L$(FFMPEG_DIR)/libavutil -lavutil + +CFLAGS += -I$(FFMPEG_DIR)/libswscale ifeq ($(HAVE_SWSCALE),yes) -CFLAGS += -I$(FF_INC)/libswscale -DHAVE_SWSCALE -LDFLAGS += -L$(FF_LIB)/libswscale -lswscale +VFW_LDFLAGS += -L$(FFMPEG_DIR)/libswscale -lswscale +endif endif ############################################################################## @@ -76,6 +80,10 @@ VPATH = $(DIR_SRC):$(DIR_BUILD) all: $(DLL) +config.mak: + @echo " Copy config.mak from $(X264_DIR)" + @cp $(X264_DIR)/config.mak $(DIR_SRC)/config.mak + $(DIR_BUILD): @echo " D: $(DIR_BUILD)" @mkdir -p $(DIR_BUILD) @@ -102,7 +110,7 @@ $(DLL): $(DIR_BUILD) $(OBJECTS) -mno-cygwin -shared -Wl,-dll,--out-implib,$@.a,--enable-stdcall-fixup \ -o $@ \ $(OBJECTS) driverproc.def \ - -lgdi32 -lwinmm -lcomdlg32 -lcomctl32 $(LDFLAGS) + $(VFW_LDFLAGS) $(LDFLAGS) -lgdi32 -lwinmm -lcomdlg32 -lcomctl32 clean: @echo " Cl: Object files and target lib" diff --git a/codec.c b/codec.c index 3a40389..4b07663 100644 --- a/codec.c +++ b/codec.c @@ -26,8 +26,9 @@ #include "x264vfw.h" #include -#include #include +#include + #define _GNU_SOURCE #include @@ -65,6 +66,7 @@ static int get_csp(BITMAPINFOHEADER *hdr) } } +#if X264VFW_USE_DECODER static enum PixelFormat csp_to_pix_fmt(int i_csp) { switch (i_csp) @@ -86,6 +88,7 @@ static enum PixelFormat csp_to_pix_fmt(int i_csp) return PIX_FMT_NONE; } } +#endif static int supported_fourcc(DWORD fourcc) { @@ -233,7 +236,7 @@ static void x264_log_vfw(void *p_private, int i_level, const char *psz_fmt, va_l ShowWindow(codec->hCons, SW_SHOW); codec->b_visible = TRUE; } - h_console = GetDlgItem(codec->hCons, IDC_CONSOLE); + h_console = GetDlgItem(codec->hCons, IDC_ERRCONSOLE_CONSOLE); idx = SendMessage(h_console, LB_ADDSTRING, 0, (LPARAM)&error_msg); /* Make sure that the last item added is visible (autoscroll) */ @@ -398,7 +401,9 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) #define OPT_VISUALIZE 262 #define OPT_LONGHELP 263 #define OPT_FPS 264 +#if X264VFW_USE_VIRTUALDUB_HACK #define OPT_VD_HACK 265 +#endif #define OPT_NO_OUTPUT 266 static struct option long_options[] = @@ -408,6 +413,7 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) { "version", no_argument, NULL, 'V' }, { "bitrate", required_argument, NULL, 'B' }, { "bframes", required_argument, NULL, 'b' }, + { "b-adapt", required_argument, NULL, 0 }, { "no-b-adapt", no_argument, NULL, 0 }, { "b-bias", required_argument, NULL, 0 }, { "b-pyramid", no_argument, NULL, 0 }, @@ -420,6 +426,10 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) { "filter", required_argument, NULL, 0 }, { "deblock", required_argument, NULL, 'f' }, { "interlaced", no_argument, NULL, 0 }, +#if X264_PATCH_HDR + { "tff", no_argument, NULL, 0 }, + { "bff", no_argument, NULL, 0 }, +#endif { "no-cabac", no_argument, NULL, 0 }, { "qp", required_argument, NULL, 'q' }, { "qpmin", required_argument, NULL, 0 }, @@ -444,19 +454,19 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) { "mvrange", required_argument, NULL, 0 }, { "mvrange-thread", required_argument, NULL, 0 }, { "subme", required_argument, NULL, 'm' }, - { "b-rdo", no_argument, NULL, 0 }, + { "psy-rd", required_argument, NULL, 0 }, { "mixed-refs", no_argument, NULL, 0 }, { "no-chroma-me", no_argument, NULL, 0 }, - { "bime", no_argument, NULL, 0 }, { "8x8dct", no_argument, NULL, '8' }, { "trellis", required_argument, NULL, 't' }, { "no-fast-pskip", no_argument, NULL, 0 }, { "no-dct-decimate", no_argument, NULL, 0 }, { "aq-strength", required_argument, NULL, 0 }, - { "aq-sensitivity", required_argument, NULL, 0 }, { "aq-mode", required_argument, NULL, 0 }, +#if X264_PATCH_VAQ_MOD { "aq-metric", required_argument, NULL, 0 }, - { "fgo", required_argument, NULL, 0 }, + { "aq-sensitivity", required_argument, NULL, 0 }, +#endif { "deadzone-inter", required_argument, NULL, 0 }, { "deadzone-intra", required_argument, NULL, 0 }, { "level", required_argument, NULL, 0 }, @@ -469,14 +479,15 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) { "chroma-qp-offset", required_argument, NULL, 0 }, { "pass", required_argument, NULL, 'p' }, { "stats", required_argument, NULL, 0 }, - { "rceq", required_argument, NULL, 0 }, { "qcomp", required_argument, NULL, 0 }, { "qblur", required_argument, NULL, 0 }, { "cplxblur", required_argument, NULL, 0 }, { "zones", required_argument, NULL, 0 }, { "qpfile", required_argument, NULL, OPT_QPFILE }, { "threads", required_argument, NULL, 0 }, +#if X264_PATCH_THREAD_POOL { "thread-queue", required_argument, NULL, 0 }, +#endif { "thread-input", no_argument, NULL, OPT_THREAD_INPUT }, { "non-deterministic", no_argument, NULL, 0 }, { "no-psnr", no_argument, NULL, 0 }, @@ -485,8 +496,14 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) { "verbose", no_argument, NULL, 'v' }, { "progress", no_argument, NULL, OPT_PROGRESS }, { "visualize", no_argument, NULL, OPT_VISUALIZE }, + { "dump-yuv", required_argument, NULL, 0 }, { "sps-id", required_argument, NULL, 0 }, { "aud", no_argument, NULL, 0 }, +#if X264_PATCH_HDR + { "nal-hrd", no_argument, NULL, 0 }, + { "pulldown", required_argument, NULL, 0 }, + { "pd", required_argument, NULL, 0 }, +#endif { "nr", required_argument, NULL, 0 }, { "cqm", required_argument, NULL, 0 }, { "cqmfile", required_argument, NULL, 0 }, @@ -507,7 +524,9 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) { "transfer", required_argument, NULL, 0 }, { "colormatrix", required_argument, NULL, 0 }, { "chromaloc", required_argument, NULL, 0 }, +#if X264VFW_USE_VIRTUALDUB_HACK { "vd-hack", no_argument, NULL, OPT_VD_HACK }, +#endif { "no-output", no_argument, NULL, OPT_NO_OUTPUT }, { 0, 0, 0, 0 } }; @@ -542,9 +561,11 @@ static int Parse(const char *cmdline, x264_param_t *param, CODEC *codec) param->i_log_level = X264_LOG_DEBUG; break; +#if X264VFW_USE_VIRTUALDUB_HACK case OPT_VD_HACK: codec->b_use_vd_hack = TRUE; break; +#endif case OPT_NO_OUTPUT: codec->b_no_output = TRUE; @@ -599,6 +620,7 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp { CONFIG *config = &codec->config; x264_param_t param; + char cqm_file[MAX_PATH]; char stat_out[MAX_STATS_SIZE]; char stat_in[MAX_STATS_SIZE]; @@ -608,23 +630,24 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp if (compress_query(codec, lpbiInput, lpbiOutput) != ICERR_OK) return ICERR_BADFORMAT; -#ifdef BUGGY_APPS_HACK +#if X264VFW_USE_BUGGY_APPS_HACK codec->prev_lpbiOutput = NULL; codec->prev_output_biSizeImage = 0; #endif -#ifdef VIRTUALDUB_HACK - codec->i_frame_remain = codec->i_frame_total ? codec->i_frame_total : -1; -#endif /* Get default param */ x264_param_default(¶m); +#if X264VFW_USE_VIRTUALDUB_HACK codec->b_use_vd_hack = FALSE; /* Don't use "VD hack" by default */ + codec->save_fcc = lpbiOutput->bmiHeader.biCompression; +#endif codec->b_no_output = FALSE; + codec->i_frame_remain = codec->i_frame_total ? codec->i_frame_total : -1; /* Video Properties */ - param.i_csp = X264_CSP_I420; param.i_width = lpbiInput->bmiHeader.biWidth; param.i_height = abs(lpbiInput->bmiHeader.biHeight); + param.i_csp = X264_CSP_I420; x264_csp_init(&codec->csp, param.i_csp); x264_picture_alloc(&codec->conv_pic, param.i_csp, param.i_width, param.i_height); @@ -649,27 +672,65 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp } else { +#if X264VFW_USE_VIRTUALDUB_HACK codec->b_use_vd_hack = config->b_vd_hack; +#endif /* CPU flags */ -#ifdef HAVE_PTHREAD + param.cpu = config->b_no_asm ? 0 : param.cpu; +#if X264VFW_USE_THREADS param.i_threads = config->i_threads; + param.b_deterministic = config->i_threads != 1 ? config->b_mt_deterministic : TRUE; +#if X264_PATCH_THREAD_POOL + param.i_thread_queue = config->i_threads != 1 ? config->i_thread_queue : 1; +#endif #else param.i_threads = 1; + param.b_deterministic = TRUE; +#if X264_PATCH_THREAD_POOL + param.i_thread_queue = 1; +#endif #endif /* Video Properties */ + switch (config->i_avc_level) + { + case 1: param.i_level_idc = 10; break; + case 2: param.i_level_idc = 11; break; + case 3: param.i_level_idc = 12; break; + case 4: param.i_level_idc = 13; break; + case 5: param.i_level_idc = 20; break; + case 6: param.i_level_idc = 21; break; + case 7: param.i_level_idc = 22; break; + case 8: param.i_level_idc = 30; break; + case 9: param.i_level_idc = 31; break; + case 10: param.i_level_idc = 32; break; + case 11: param.i_level_idc = 40; break; + case 12: param.i_level_idc = 41; break; + case 13: param.i_level_idc = 42; break; + case 14: param.i_level_idc = 50; break; + case 15: param.i_level_idc = 51; break; + default: param.i_level_idc = -1; break; + } param.vui.i_sar_width = config->i_sar_width; param.vui.i_sar_height = config->i_sar_height; + param.vui.i_overscan = config->i_overscan; + param.vui.i_vidformat = config->i_vidformat; + param.vui.b_fullrange = config->i_fullrange > 0; + param.vui.i_colorprim = config->i_colorprim; + param.vui.i_transfer = config->i_transfer; + param.vui.i_colmatrix = config->i_colmatrix; + param.vui.i_chroma_loc = config->i_chromaloc; /* Bitstream parameters */ param.i_frame_reference = config->i_refmax; - param.i_keyint_min = config->i_keyint_min; param.i_keyint_max = config->i_keyint_max; + param.i_keyint_min = config->i_keyint_min; param.i_scenecut_threshold = config->i_scenecut_threshold; + param.b_pre_scenecut = config->i_scenecut_threshold >= 0 && config->b_pre_scenecut; param.i_bframe = config->i_bframe; - param.b_bframe_adaptive = config->i_bframe > 0 && config->b_bframe_adaptive; - param.i_bframe_bias = config->i_bframe > 0 && config->b_bframe_adaptive ? config->i_bframe_bias : 0; + param.i_bframe_adaptive = config->i_bframe > 0 && config->i_bframe_adaptive > 0 ? config->i_bframe_adaptive : 0; + param.i_bframe_bias = config->i_bframe > 0 && config->i_bframe_adaptive > 0 ? config->i_bframe_bias : 0; param.b_bframe_pyramid = config->i_bframe > 1 && config->b_b_refs; param.b_deblocking_filter = config->i_encoding_type > 0 && config->b_filter; @@ -678,7 +739,15 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp param.b_cabac = config->b_cabac; - param.b_interlaced = config->b_interlaced; + param.b_interlaced = config->i_interlaced > 0; +#if X264_PATCH_HDR + param.b_nal_hrd = param.b_interlaced; + param.b_tff = config->i_interlaced == 1; +#endif + + strcpy(cqm_file, config->cqmfile); + param.i_cqm_preset = config->i_encoding_type > 0 ? config->i_cqm : 0; + param.psz_cqm_file = config->i_encoding_type > 0 && config->i_cqm == 2 ? (char *)&cqm_file : NULL; /* Log */ param.i_log_level = config->i_log_level - 1; @@ -686,16 +755,17 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp /* Encoder analyser parameters */ param.analyse.intra = 0; param.analyse.inter = 0; - if (config->i_encoding_type > 0 && config->b_dct8x8 && config->b_i8x8) + if ((config->i_encoding_type > 0 || config->b_cabac) && config->b_dct8x8) { - param.analyse.intra |= X264_ANALYSE_I8x8; - param.analyse.inter |= X264_ANALYSE_I8x8; + if (config->b_intra_i8x8) + param.analyse.intra |= X264_ANALYSE_I8x8; + if (config->b_i8x8) + param.analyse.inter |= X264_ANALYSE_I8x8; } - if (config->b_i4x4) - { + if (config->b_intra_i4x4) param.analyse.intra |= X264_ANALYSE_I4x4; + if (config->b_i4x4) param.analyse.inter |= X264_ANALYSE_I4x4; - } if (config->b_psub16x16) { param.analyse.inter |= X264_ANALYSE_PSUB16x16; @@ -708,28 +778,44 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp param.analyse.b_transform_8x8 = config->i_encoding_type > 0 && config->b_dct8x8; param.analyse.b_weighted_bipred = config->i_bframe > 0 && config->b_b_wpred; param.analyse.i_direct_mv_pred = config->i_bframe > 0 ? config->i_direct_mv_pred : 0; + param.analyse.i_chroma_qp_offset = config->i_encoding_type > 0 ? config->i_chroma_qp_offset : 0; param.analyse.i_me_method = config->i_me_method; param.analyse.i_me_range = config->i_me_range; - param.analyse.i_subpel_refine = config->i_subpel_refine + 1; /* 0..6 -> 1..7 */ - param.analyse.b_bidir_me = config->i_bframe > 0 && config->b_bidir_me; + param.analyse.i_subpel_refine = config->i_subpel_refine + 1; /* 0..8 -> 1..9 */ param.analyse.b_chroma_me = config->i_subpel_refine >= 4 && config->b_chroma_me; - param.analyse.b_bframe_rdo = config->i_bframe > 0 && config->i_subpel_refine >= 5 && config->b_brdo; param.analyse.b_mixed_references = config->i_refmax > 1 && config->b_mixedref; param.analyse.i_trellis = config->i_encoding_type > 0 && config->b_cabac ? config->i_trellis : 0; + param.analyse.b_fast_pskip = config->i_encoding_type > 0 && config->b_fast_pskip; + param.analyse.b_dct_decimate = config->i_encoding_type > 0 && config->b_dct_decimate; param.analyse.i_noise_reduction = config->i_encoding_type > 0 ? config->i_noise_reduction : 0; + param.analyse.f_psy_rd = config->i_encoding_type > 0 && config->i_subpel_refine >= 5 ? config->f_psy_rdo : 0.0; + param.analyse.f_psy_trellis = config->i_encoding_type > 0 && config->b_cabac && config->i_trellis > 0 ? config->f_psy_trellis : 0.0; - param.analyse.b_psnr = config->i_log_level >= 3; - param.analyse.b_ssim = config->i_log_level >= 3; + param.analyse.i_luma_deadzone[0] = config->i_encoding_type > 0 ? config->i_inter_deadzone : 0; + param.analyse.i_luma_deadzone[1] = config->i_encoding_type > 0 ? config->i_intra_deadzone : 0; - /* Rate control parameters */ - param.rc.i_qp_min = config->i_encoding_type > 1 ? config->i_qp_min : 0; - param.rc.i_qp_max = config->i_encoding_type > 1 ? config->i_qp_max : X264_QUANT_MAX; - param.rc.i_qp_step = config->i_encoding_type > 1 ? config->i_qp_step : X264_QUANT_MAX; + param.analyse.b_psnr = config->i_log_level >= 3 && config->b_psnr; + param.analyse.b_ssim = config->i_log_level >= 3 && config->b_ssim; - param.rc.f_ip_factor = config->i_encoding_type > 0 ? 1.0 + (float)config->i_key_boost / 100.0 : 1.0; - param.rc.f_pb_factor = config->i_encoding_type > 0 && config->i_bframe > 0 ? 1.0 + (float)config->i_b_red / 100.0 : 1.0; - param.rc.f_qcompress = config->i_encoding_type > 1 ? (float)config->i_curve_comp / 100.0 : 1.0; + /* Rate control parameters */ + param.rc.i_qp_min = config->i_encoding_type > 1 ? config->i_qp_min : param.rc.i_qp_min; + param.rc.i_qp_max = config->i_encoding_type > 1 ? config->i_qp_max : param.rc.i_qp_max; + param.rc.i_qp_step = config->i_encoding_type > 1 ? config->i_qp_step : param.rc.i_qp_step; + + param.rc.f_rate_tolerance = config->i_encoding_type > 2 ? config->f_ratetol : param.rc.f_rate_tolerance; + param.rc.i_vbv_max_bitrate = config->i_encoding_type > 1 ? config->i_vbv_maxrate : 0; + param.rc.i_vbv_buffer_size = config->i_encoding_type > 1 ? config->i_vbv_bufsize : 0; + param.rc.f_vbv_buffer_init = config->i_encoding_type > 1 ? (float)config->i_vbv_occupancy / 100.0 : param.rc.f_vbv_buffer_init; + param.rc.f_ip_factor = config->i_encoding_type > 0 ? config->f_ipratio : 1.0; + param.rc.f_pb_factor = config->i_encoding_type > 0 && config->i_bframe > 0 ? config->f_pbratio : 1.0; + + param.rc.i_aq_mode = config->i_encoding_type > 1 ? config->i_aq_mode : 0; + param.rc.f_aq_strength = config->i_encoding_type > 1 && config->i_aq_mode > 0 ? config->f_aq_strength : 0.0; +#if X264_PATCH_VAQ_MOD + param.rc.i_aq_metric = config->i_encoding_type > 1 && config->i_aq_mode > 0 ? config->i_aq_metric : param.rc.i_aq_metric; + param.rc.f_aq_sensitivity = config->i_encoding_type > 1 && config->i_aq_mode > 0 ? config->f_aq_sensitivity : param.rc.f_aq_sensitivity; +#endif strcpy(stat_out, config->stats); strcpy(stat_in, config->stats); @@ -738,6 +824,10 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp param.rc.b_stat_read = FALSE; param.rc.psz_stat_in = (char *)&stat_in; + param.rc.f_qcompress = config->i_encoding_type > 1 ? config->f_qcomp : 1.0; + param.rc.f_qblur = config->i_encoding_type == 4 && config->i_pass > 1 ? config->f_qblur : param.rc.f_qblur; + param.rc.f_complexity_blur = config->i_encoding_type == 4 && config->i_pass > 1 ? config->f_cplxblur : param.rc.f_complexity_blur; + switch (config->i_encoding_type) { case 0: /* 1 PASS LOSSLESS */ @@ -767,7 +857,6 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp { codec->b_no_output = TRUE; param.rc.b_stat_write = TRUE; - param.rc.f_rate_tolerance = 4.0; if (config->b_fast1pass) { /* Adjust or turn off some flags to gain speed, if needed */ @@ -778,8 +867,8 @@ LRESULT compress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutp param.analyse.i_me_method = X264_ME_DIA; param.analyse.i_subpel_refine = X264_MIN(2, param.analyse.i_subpel_refine); // subme=1 may lead for significant quality decrease param.analyse.b_chroma_me = FALSE; - param.analyse.b_bframe_rdo = FALSE; param.analyse.b_mixed_references = FALSE; + param.analyse.f_psy_rd = 0.0; } } else @@ -825,7 +914,7 @@ LRESULT compress(CODEC *codec, ICCOMPRESS *icc) int iWidth; int iHeight; -#ifdef BUGGY_APPS_HACK +#if X264VFW_USE_BUGGY_APPS_HACK // Work around applications' bugs // Because Microsoft's document is incomplete, many applications are buggy in my opinion. // lpbiOutput->biSizeImage is used to return value, the applications should update lpbiOutput->biSizeImage on every call. @@ -837,11 +926,12 @@ LRESULT compress(CODEC *codec, ICCOMPRESS *icc) codec->prev_output_biSizeImage = outhdr->biSizeImage; // End of work around applications' bugs. #endif -#ifdef VIRTUALDUB_HACK + if (codec->i_frame_remain) { - codec->i_frame_remain--; -#endif + if (codec->i_frame_remain != -1) + codec->i_frame_remain--; + /* Init the picture */ memset(&pic, 0, sizeof(x264_picture_t)); pic.img.i_csp = get_csp(inhdr); @@ -889,11 +979,9 @@ LRESULT compress(CODEC *codec, ICCOMPRESS *icc) /* Encode it */ x264_encoder_encode(codec->h, &nal, &i_nal, &codec->conv_pic, &pic_out); -#ifdef VIRTUALDUB_HACK } else x264_encoder_encode(codec->h, &nal, &i_nal, NULL, &pic_out); -#endif /* Create bitstream, unless we're dropping it in 1st pass */ i_out = 0; @@ -910,7 +998,7 @@ LRESULT compress(CODEC *codec, ICCOMPRESS *icc) } } -#ifdef VIRTUALDUB_HACK +#if X264VFW_USE_VIRTUALDUB_HACK if (codec->b_use_vd_hack && i_nal == 0) { *icc->lpdwFlags = 0; @@ -928,8 +1016,8 @@ LRESULT compress(CODEC *codec, ICCOMPRESS *icc) else *icc->lpdwFlags = 0; outhdr->biSizeImage = i_out; -#ifdef VIRTUALDUB_HACK - outhdr->biCompression = mmioFOURCC(codec->config.fcc[0], codec->config.fcc[1], codec->config.fcc[2], codec->config.fcc[3]); +#if X264VFW_USE_VIRTUALDUB_HACK + outhdr->biCompression = codec->save_fcc; } #endif @@ -966,6 +1054,7 @@ void default_compress_frames_info(CODEC *codec) codec->i_fps_den = 0; } +#if X264VFW_USE_DECODER LRESULT decompress_get_format(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOutput) { BITMAPINFOHEADER *inhdr = &lpbiInput->bmiHeader; @@ -1033,7 +1122,7 @@ LRESULT decompress_query(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOu if (pix_fmt == PIX_FMT_NONE) return ICERR_BADFORMAT; -#ifndef RGB24_FIXED +#if !FFMPEG_HAVE_RGB24_FIXED if (pix_fmt == PIX_FMT_BGR24 && iWidth % 4) // Bug in libavcodec (for me it is simpler forbid this than fixing libavcodec) return ICERR_BADFORMAT; #endif @@ -1086,7 +1175,7 @@ LRESULT decompress_begin(CODEC *codec, BITMAPINFO *lpbiInput, BITMAPINFO *lpbiOu return ICERR_ERROR; } -#ifdef HAVE_SWSCALE +#if !FFMPEG_HAVE_IMG_CONVERT codec->sws = sws_getContext(lpbiInput->bmiHeader.biWidth, lpbiInput->bmiHeader.biHeight, codec->decoder_context->pix_fmt, lpbiInput->bmiHeader.biWidth, lpbiInput->bmiHeader.biHeight, codec->decoder_pix_fmt, SWS_BILINEAR, NULL, NULL, NULL); @@ -1120,10 +1209,30 @@ LRESULT decompress(CODEC *codec, ICDECOMPRESS *icd) } memcpy(codec->decoder_buf, icd->lpInput, inhdr->biSizeImage); memset(codec->decoder_buf + inhdr->biSizeImage, 0, FF_INPUT_BUFFER_PADDING_SIZE); + got_picture = 0; len = avcodec_decode_video(codec->decoder_context, codec->decoder_frame, &got_picture, codec->decoder_buf, inhdr->biSizeImage); if (len < 0) return ICERR_ERROR; + if (!got_picture) + { + // Frame was decoded but delayed so we would show the BLACK-frame instead + int picture_size = avpicture_get_size(codec->decoder_pix_fmt, inhdr->biWidth, inhdr->biHeight); + + if (codec->decoder_pix_fmt == PIX_FMT_YUV420P) + { + int luma_size = picture_size * 2 / 3; + memset(icd->lpOutput, 0x10, luma_size); //TV Scale + memset(icd->lpOutput + luma_size, 0x80, picture_size - luma_size); + } + else if (codec->decoder_pix_fmt == PIX_FMT_YUYV422) + wmemset(icd->lpOutput, 0x8010, picture_size / sizeof(wchar_t)); //TV Scale + else + memset(icd->lpOutput, 0x00, picture_size); +// icd->lpbiOutput->biSizeImage = picture_size; + return ICERR_OK; + } + if (avpicture_fill(&picture, icd->lpOutput, codec->decoder_pix_fmt, inhdr->biWidth, inhdr->biHeight) < 0) return ICERR_ERROR; if (codec->decoder_swap_UV) @@ -1161,7 +1270,7 @@ LRESULT decompress(CODEC *codec, ICDECOMPRESS *icd) picture.linesize[3] = -picture.linesize[3]; } } -#ifdef HAVE_SWSCALE +#if !FFMPEG_HAVE_IMG_CONVERT sws_scale(codec->sws, codec->decoder_frame->data, codec->decoder_frame->linesize, 0, inhdr->biHeight, picture.data, picture.linesize); #else if (img_convert(&picture, codec->decoder_pix_fmt, (AVPicture *)codec->decoder_frame, codec->decoder_context->pix_fmt, inhdr->biWidth, inhdr->biHeight) < 0) @@ -1180,9 +1289,10 @@ LRESULT decompress_end(CODEC *codec) av_freep(&codec->decoder_frame); av_freep(&codec->decoder_buf); codec->decoder_buf_size = 0; -#ifdef HAVE_SWSCALE +#if !FFMPEG_HAVE_IMG_CONVERT sws_freeContext(codec->sws); codec->sws = NULL; #endif return ICERR_OK; } +#endif diff --git a/config.c b/config.c index 40cad0e..4e5b63c 100644 --- a/config.c +++ b/config.c @@ -24,15 +24,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -/************************************************************************** - * - * History: - * - * 2004.05.14 CBR encode mode support - * - **************************************************************************/ - #include "x264vfw.h" + #include /* sprintf */ #include #include @@ -53,12 +46,35 @@ #define X264_NAME "x264vfw" #define X264_DEF_TEXT "Are you sure you want to load default values?" +static const char * const overscan_names[] = { "undef", "show", "crop" }; +static const char * const vidformat_names[] = { "undef", "component", "pal", "ntsc", "secam", "mac" }; +static const char * const fullrange_names[] = { "off", "on" }; +static const char * const colorprim_names[] = { "undef", "bt709", "bt470m", "bt470bg", "smpte170m", "smpte240m", "film" }; +static const char * const transfer_names[] = { "undef", "bt709", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316" }; +static const char * const colmatrix_names[] = { "undef", "bt709", "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", "GBR" }; + +static const int overscan_loc2abs[] = { 0, 1, 2 }; +static const int vidformat_loc2abs[] = { 5, 0, 1, 2, 3, 4 }; +static const int fullrange_loc2abs[] = { 0, 1 }; +static const int colorprim_loc2abs[] = { 2, 1, 4, 5, 6, 7, 8 }; +static const int transfer_loc2abs[] = { 2, 1, 4, 5, 6, 7, 8, 9, 10 }; +static const int colmatrix_loc2abs[] = { 2, 1, 4, 5, 6, 7, 8, 0 }; + +static const int overscan_abs2loc[] = { 0, 1, 2 }; +static const int vidformat_abs2loc[] = { 1, 2, 3, 4, 5, 0 }; +static const int fullrange_abs2loc[] = { 0, 1 }; +static const int colorprim_abs2loc[] = { 0, 1, 0, 0, 2, 3, 4, 5, 6 }; +static const int transfer_abs2loc[] = { 0, 1, 0, 0, 2, 3, 4, 5, 6, 7, 8 }; +static const int colmatrix_abs2loc[] = { 7, 1, 0, 0, 2, 3, 4, 5, 6 }; + /* Registery handling */ typedef struct { char *reg_value; int *config_int; int default_int; + int min_int; + int max_int; } reg_int_t; typedef struct @@ -69,99 +85,194 @@ typedef struct int max_len; /* maximum string length, including the terminating NULL char */ } reg_str_t; +typedef struct +{ + char *reg_value; + float *config_float; + float default_float; + float min_float; + float max_float; +} reg_float_t; + CONFIG reg; HWND hMainDlg; -HWND hTabs[4]; +HWND hTabs[3]; HWND hTooltip; int b_tabs_updated; static const reg_int_t reg_int_table[] = { - /* Bitrate */ - { "encoding_type", ®.i_encoding_type, 4 }, /* take into account GordianKnot workaround */ - { "quantizer", ®.i_qp, 26 }, - { "ratefactor", ®.i_rf_constant, 260 }, - { "passbitrate", ®.i_passbitrate, 800 }, - { "pass_number", ®.i_pass, 1 }, - { "fast1pass", ®.b_fast1pass, 0 }, - { "updatestats", ®.b_updatestats, 1 }, - - /* Rate Control */ - { "key_boost", ®.i_key_boost, 40 }, - { "b_red", ®.i_b_red, 30 }, - { "curve_comp", ®.i_curve_comp, 60 }, - { "qp_min", ®.i_qp_min, 10 }, - { "qp_max", ®.i_qp_max, 51 }, - { "qp_step", ®.i_qp_step, 4 }, - { "scenecut", ®.i_scenecut_threshold, 40 }, - { "keyint_min", ®.i_keyint_min, 25 }, - { "keyint_max", ®.i_keyint_max, 250 }, - - /* MBs & Frames */ - { "dct8x8", ®.b_dct8x8, 1 }, - { "i8x8", ®.b_i8x8, 1 }, - { "i4x4", ®.b_i4x4, 1 }, - { "psub16x16", ®.b_psub16x16, 1 }, - { "psub8x8", ®.b_psub8x8, 0 }, - { "bsub16x16", ®.b_bsub16x16, 1 }, - { "bmax", ®.i_bframe, 0 }, - { "vd_hack", ®.b_vd_hack, 0 }, - { "b_bias", ®.i_bframe_bias, 0 }, - { "b_adapt", ®.b_bframe_adaptive, 1 }, - { "b_refs", ®.b_b_refs, 1 }, - { "b_wpred", ®.b_b_wpred, 1 }, - { "b_bidir_me", ®.b_bidir_me, 1 }, - { "direct_pred", ®.i_direct_mv_pred, 1 }, - - /* More... */ - { "subpel", ®.i_subpel_refine, 5 }, - { "brdo", ®.b_brdo, 1 }, - { "me_method", ®.i_me_method, 2 }, - { "me_range", ®.i_me_range, 16 }, - { "chroma_me", ®.b_chroma_me, 1 }, - { "refmax", ®.i_refmax, 1 }, - { "mixedref", ®.b_mixedref, 1 }, - { "log_level", ®.i_log_level, 2 }, - { "fourcc_num", ®.i_fcc_num, 0 }, - { "sar_width", ®.i_sar_width, 1 }, - { "sar_height", ®.i_sar_height, 1 }, - { "threads", ®.i_threads, 1 }, - { "cabac", ®.b_cabac, 1 }, - { "trellis", ®.i_trellis, 1 }, - { "noise_reduction", ®.i_noise_reduction, 0 }, - { "loop_filter", ®.b_filter, 1 }, - { "inloop_a", ®.i_inloop_a, 0 }, - { "inloop_b", ®.i_inloop_b, 0 }, - { "interlaced", ®.b_interlaced, 0 }, - - /* Command Line */ - { "use_cmdline", ®.b_use_cmdline, 0 } + /* Main */ + { "encoding_type", ®.i_encoding_type, 4, 0, 4 }, /* take into account GordianKnot workaround */ + { "quantizer", ®.i_qp, 26, 1, X264_QUANT_MAX }, + { "ratefactor", ®.i_rf_constant, 260, 10, X264_QUANT_MAX * 10 }, + { "passbitrate", ®.i_passbitrate, 800, 1, X264_BITRATE_MAX }, + { "pass_number", ®.i_pass, 1, 1, 2 }, + { "fast1pass", ®.b_fast1pass, 0, 0, 1 }, + { "updatestats", ®.b_updatestats, 1, 0, 1 }, + + /* Misc */ + { "avc_level", ®.i_avc_level, 0, 0, 15 }, + { "sar_width", ®.i_sar_width, 1, 1, 9999 }, + { "sar_height", ®.i_sar_height, 1, 1, 9999 }, + + /* Debug */ + { "log_level", ®.i_log_level, 2, 0, 4 }, + { "psnr", ®.b_psnr, 1, 0, 1 }, + { "ssim", ®.b_ssim, 1, 0, 1 }, + { "no_asm", ®.b_no_asm, 0, 0, 1 }, + + /* VFW */ + { "fourcc_num", ®.i_fcc_num, 0, 0, sizeof(fcc_str_table) / sizeof(fourcc_str) - 1}, +#if X264VFW_USE_VIRTUALDUB_HACK + { "vd_hack", ®.b_vd_hack, 0, 0, 1 }, +#endif +#if X264VFW_USE_DECODER + { "disable_decoder", ®.b_disable_decoder, 0, 0, 1 }, +#endif + + /* Analysis */ + { "dct8x8", ®.b_dct8x8, 1, 0, 1 }, + { "intra_i8x8", ®.b_intra_i8x8, 1, 0, 1 }, + { "intra_i4x4", ®.b_intra_i4x4, 1, 0, 1 }, + { "i8x8", ®.b_i8x8, 1, 0, 1 }, + { "i4x4", ®.b_i4x4, 1, 0, 1 }, + { "psub16x16", ®.b_psub16x16, 1, 0, 1 }, + { "psub8x8", ®.b_psub8x8, 0, 0, 1 }, + { "bsub16x16", ®.b_bsub16x16, 1, 0, 1 }, + { "fast_pskip", ®.b_fast_pskip, 1, 0, 1 }, + { "refmax", ®.i_refmax, 1, 1, 16 }, + { "mixedref", ®.b_mixedref, 1, 0, 1 }, + { "me_method", ®.i_me_method, 2, 0, 4 }, + { "me_range", ®.i_me_range, 16, 4, 64 }, + { "subpel", ®.i_subpel_refine, 6, 0, 8 }, + { "chroma_me", ®.b_chroma_me, 1, 0, 1 }, + { "keyint_min", ®.i_keyint_min, 25, 1, 9999 }, + { "keyint_max", ®.i_keyint_max, 250, 1, 9999 }, + { "scenecut", ®.i_scenecut_threshold, 40, -1, 100 }, + { "pre_scenecut", ®.b_pre_scenecut, 0, 0, 1 }, + { "bmax", ®.i_bframe, 0, 0, X264_BFRAME_MAX }, + { "b_adapt", ®.i_bframe_adaptive, 1, 0, 2 }, + { "b_bias", ®.i_bframe_bias, 0, -90, 100 }, + { "direct_pred", ®.i_direct_mv_pred, 1, 0, 3 }, + { "b_refs", ®.b_b_refs, 1, 0, 1 }, + { "b_wpred", ®.b_b_wpred, 1, 0, 1 }, + + /* Encoding */ + { "loop_filter", ®.b_filter, 1, 0, 1 }, + { "inloop_a", ®.i_inloop_a, 0, -6, 6 }, + { "inloop_b", ®.i_inloop_b, 0, -6, 6 }, +#if !X264_PATCH_HDR + { "interlaced", ®.i_interlaced, 0, 0, 1 }, +#else + { "interlaced", ®.i_interlaced, 0, 0, 2 }, +#endif + { "cabac", ®.b_cabac, 1, 0, 1 }, + { "dct_decimate", ®.b_dct_decimate, 1, 0, 1 }, + { "noise_reduction", ®.i_noise_reduction, 0, 0, 9999 }, + { "trellis", ®.i_trellis, 1, 0, 2 }, + { "intra_deadzone", ®.i_intra_deadzone, 11, 0, 32 }, + { "inter_deadzone", ®.i_inter_deadzone, 21, 0, 32 }, + { "cqm", ®.i_cqm, 0, 0, 2 }, + + /* Rate control */ + { "vbv_maxrate", ®.i_vbv_maxrate, 0, 0, 999999 }, + { "vbv_bufsize", ®.i_vbv_bufsize, 0, 0, 999999 }, + { "vbv_occupancy", ®.i_vbv_occupancy, 90, 0, 100 }, + { "qp_min", ®.i_qp_min, 10, 1, X264_QUANT_MAX }, + { "qp_max", ®.i_qp_max, 51, 1, X264_QUANT_MAX }, + { "qp_step", ®.i_qp_step, 4, 1, X264_QUANT_MAX }, + { "chroma_qp_offset", ®.i_chroma_qp_offset, 0, -12, 12 }, + + /* AQ */ + { "aq_mode", ®.i_aq_mode, 1, 0, 1 }, +#if X264_PATCH_VAQ_MOD + { "aq_metric", ®.i_aq_metric, 0, 0, 2 }, +#endif + + /* Multithreading */ +#if X264VFW_USE_THREADS + { "threads", ®.i_threads, 1, 0, X264_THREAD_MAX }, + { "mt_deterministic", ®.b_mt_deterministic, 1, 0, 1 }, +#if X264_PATCH_THREAD_POOL + { "thread_queue", ®.i_thread_queue, 0, 0, X264_THREAD_MAX }, +#endif +#endif + + /* VUI */ + { "overscan", ®.i_overscan, 0, 0, 2 }, + { "vidformat", ®.i_vidformat, 5, 0, 5 }, + { "fullrange", ®.i_fullrange, 0, 0, 1 }, + { "colorprim", ®.i_colorprim, 2, 0, 8 }, + { "transfer", ®.i_transfer, 2, 0, 10 }, + { "colmatrix", ®.i_colmatrix, 2, 0, 8 }, + { "chromaloc", ®.i_chromaloc, 0, 0, 5 }, + + /* Config */ + { "use_cmdline", ®.b_use_cmdline, 0, 0, 1 } +}; + +static const reg_float_t reg_float_table[] = +{ + /* Analysis */ + { "psy_rdo", ®.f_psy_rdo, 0.0, 0.00, 1000.00 }, + + /* Encoding */ + { "psy_trellis", ®.f_psy_trellis, 0.0, 0.00, 1000.00 }, + + /* Rate control */ + { "ipratio", ®.f_ipratio, 1.40, 1.00, 1000.00 }, + { "pbratio", ®.f_pbratio, 1.30, 1.00, 1000.00 }, + { "qcomp", ®.f_qcomp, 0.60, 0.00, 1000.00 }, + { "cplxblur", ®.f_cplxblur, 20.00, 0.00, 1000.00 }, + { "qblur", ®.f_qblur, 0.50, 0.00, 1000.00 }, + { "ratetol", ®.f_ratetol, 1.00, 0.01, 1000.00 }, + + /* AQ */ + { "aq_strength", ®.f_aq_strength, 1.00, 0.00, 1000.00 } +#if X264_PATCH_VAQ_MOD + ,{ "aq_sensitivity", ®.f_aq_sensitivity, 10.00, 0.00, 1000.00 } +#endif }; static const reg_str_t reg_str_table[] = { + /* Main */ { "statsfile", reg.stats, ".\\x264.stats", MAX_STATS_PATH }, { "extra_cmdline", reg.extra_cmdline, "", MAX_CMDLINE }, + + /* VFW */ { "fourcc", reg.fcc, (char *)&fcc_str_table[0], sizeof(fourcc_str) }, + + /* Encoding */ + { "cqmfile", reg.cqmfile, "", MAX_PATH }, + + /* Config */ { "cmdline", reg.cmdline, "", MAX_CMDLINE } }; double GetDlgItemDouble(HWND hDlg, int nIDDlgItem) { - char temp[MAX_PATH]; + char temp[1024]; - GetDlgItemText(hDlg, nIDDlgItem, temp, MAX_PATH); + GetDlgItemText(hDlg, nIDDlgItem, temp, 1024); return atof(temp); } -void SetDlgItemDouble(HWND hDlg, int nIDDlgItem, double dblValue) +void SetDlgItemDouble(HWND hDlg, int nIDDlgItem, double dblValue, const char *format) { - char temp[MAX_PATH]; + char temp[1024]; - sprintf(temp, "%.1f", dblValue); + sprintf(temp, format, dblValue); SetDlgItemText(hDlg, nIDDlgItem, temp); } +#define VUI_abs2loc(val, name)\ + ((val) >= 0 && (val) < sizeof(name##_abs2loc) / sizeof(const int)) ? name##_abs2loc[val] : 0 + +#define VUI_loc2abs(val, name)\ + ((val) >= 0 && (val) < sizeof(name##_loc2abs) / sizeof(const int)) ? name##_loc2abs[val] : name##_loc2abs[0] + #define GordianKnotWorkaround(encoding_type)\ {\ switch (encoding_type)\ @@ -193,6 +304,7 @@ void config_reg_load(CONFIG *config) HKEY hKey; DWORD i_size; int i; + char temp[1024]; RegOpenKeyEx(X264_REG_KEY, X264_REG_PARENT "\\" X264_REG_CHILD, 0, KEY_READ, &hKey); @@ -203,8 +315,22 @@ void config_reg_load(CONFIG *config) if (RegQueryValueEx(hKey, reg_int_table[i].reg_value, 0, 0, (LPBYTE)reg_int_table[i].config_int, &i_size) != ERROR_SUCCESS) *reg_int_table[i].config_int = reg_int_table[i].default_int; } + for (i = 0; i < sizeof(reg_int_table) / sizeof(reg_int_t); i++) + *reg_int_table[i].config_int = X264_CLIP(*reg_int_table[i].config_int, reg_int_table[i].min_int, reg_int_table[i].max_int); + + /* Read all floats */ + for (i = 0; i < sizeof(reg_float_table) / sizeof(reg_float_t); i++) + { + i_size = 1024; + if (RegQueryValueEx(hKey, reg_float_table[i].reg_value, 0, 0, (LPBYTE)temp, &i_size) != ERROR_SUCCESS) + *reg_float_table[i].config_float = reg_float_table[i].default_float; + else + *reg_float_table[i].config_float = atof(temp); + } + for (i = 0; i < sizeof(reg_float_table) / sizeof(reg_float_t); i++) + *reg_float_table[i].config_float = X264_CLIP(*reg_float_table[i].config_float, reg_float_table[i].min_float, reg_float_table[i].max_float); - /* Read strings */ + /* Read all strings */ for (i = 0; i < sizeof(reg_str_table) / sizeof(reg_str_t); i++) { i_size = reg_str_table[i].max_len; @@ -223,6 +349,7 @@ void config_reg_save(CONFIG *config) HKEY hKey; DWORD dwDisposition; int i; + char temp[1024]; if (RegCreateKeyEx(X264_REG_KEY, X264_REG_PARENT "\\" X264_REG_CHILD, 0, X264_REG_CLASS, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hKey, &dwDisposition) != ERROR_SUCCESS) return; @@ -234,7 +361,14 @@ void config_reg_save(CONFIG *config) for (i = 0; i < sizeof(reg_int_table) / sizeof(reg_int_t); i++) RegSetValueEx(hKey, reg_int_table[i].reg_value, 0, REG_DWORD, (LPBYTE)reg_int_table[i].config_int, sizeof(int)); - /* Save strings */ + /* Save all floats */ + for (i = 0; i < sizeof(reg_float_table) / sizeof(reg_float_t); i++) + { + sprintf(temp, "%.2f", *reg_float_table[i].config_float); + RegSetValueEx(hKey, reg_float_table[i].reg_value, 0, REG_SZ, (LPBYTE)temp, strlen(temp) + 1); + } + + /* Save all strings */ for (i = 0; i < sizeof(reg_str_table) / sizeof(reg_str_t); i++) RegSetValueEx(hKey, reg_str_table[i].reg_value, 0, REG_SZ, (LPBYTE)reg_str_table[i].config_str, strlen(reg_str_table[i].config_str) + 1); @@ -245,11 +379,19 @@ void config_defaults(CONFIG *config) { int i; - /* Read all integers */ + /* Set all integers */ for (i = 0; i < sizeof(reg_int_table) / sizeof(reg_int_t); i++) *reg_int_table[i].config_int = reg_int_table[i].default_int; + for (i = 0; i < sizeof(reg_int_table) / sizeof(reg_int_t); i++) + *reg_int_table[i].config_int = X264_CLIP(*reg_int_table[i].config_int, reg_int_table[i].min_int, reg_int_table[i].max_int); + + /* Set all floats */ + for (i = 0; i < sizeof(reg_float_table) / sizeof(reg_float_t); i++) + *reg_float_table[i].config_float = reg_float_table[i].default_float; + for (i = 0; i < sizeof(reg_float_table) / sizeof(reg_float_t); i++) + *reg_float_table[i].config_float = X264_CLIP(*reg_float_table[i].config_float, reg_float_table[i].min_float, reg_float_table[i].max_float); - /* Read strings */ + /* Set all strings */ for (i = 0; i < sizeof(reg_str_table) / sizeof(reg_str_t); i++) strcpy(reg_str_table[i].config_str, reg_str_table[i].default_str); @@ -260,301 +402,479 @@ void config_defaults(CONFIG *config) /* Tabs */ void tabs_enable_items(CONFIG *config) { - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATELABEL), config->i_encoding_type > 0); - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATEEDIT), config->i_encoding_type > 0); - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATESLIDER), config->i_encoding_type > 0); - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATELOW), config->i_encoding_type > 0); - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATEHIGH), config->i_encoding_type > 0); - - EnableWindow(GetDlgItem(hTabs[0], IDC_UPDATESTATS), config->i_encoding_type == 4 && config->i_pass > 1); - EnableWindow(GetDlgItem(hTabs[0], IDC_STATSFILE), config->i_encoding_type == 4); - EnableWindow(GetDlgItem(hTabs[0], IDC_STATSFILE_BROWSE), config->i_encoding_type == 4); - -// EnableWindow(GetDlgItem(hTabs[0], IDC_EXTRA_CMDLINE), TRUE); - - EnableWindow(GetDlgItem(hTabs[1], IDC_IPRATIO), config->i_encoding_type > 0); - EnableWindow(GetDlgItem(hTabs[1], IDC_PBRATIO), config->i_encoding_type > 0 && config->i_bframe > 0); - EnableWindow(GetDlgItem(hTabs[1], IDC_CURVECOMP), config->i_encoding_type > 1); - - EnableWindow(GetDlgItem(hTabs[1], IDC_QPMIN), config->i_encoding_type > 1); - EnableWindow(GetDlgItem(hTabs[1], IDC_QPMAX), config->i_encoding_type > 1); - EnableWindow(GetDlgItem(hTabs[1], IDC_QPSTEP), config->i_encoding_type > 1); - -// EnableWindow(GetDlgItem(hTabs[1], IDC_SCENECUT), TRUE); -// EnableWindow(GetDlgItem(hTabs[1], IDC_KEYINTMIN), TRUE); -// EnableWindow(GetDlgItem(hTabs[1], IDC_KEYINTMAX), TRUE); - - EnableWindow(GetDlgItem(hTabs[2], IDC_DCT8X8), config->i_encoding_type > 0); - EnableWindow(GetDlgItem(hTabs[2], IDC_I8X8), config->i_encoding_type > 0 && config->b_dct8x8); -// EnableWindow(GetDlgItem(hTabs[2], IDC_I4X4), TRUE); -// EnableWindow(GetDlgItem(hTabs[2], IDC_P8X8), TRUE); - EnableWindow(GetDlgItem(hTabs[2], IDC_P4X4), config->b_psub16x16); - EnableWindow(GetDlgItem(hTabs[2], IDC_B8X8), config->i_bframe > 0); - -// EnableWindow(GetDlgItem(hTabs[2], IDC_BFRAME), TRUE); - -#ifdef VIRTUALDUB_HACK -// EnableWindow(GetDlgItem(hTabs[2], IDC_VDHACK), TRUE); -#else - ShowWindow(GetDlgItem(hTabs[2], IDC_VDHACK), FALSE); + /* Main */ + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_LABEL), config->i_encoding_type > 0); + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL), config->i_encoding_type > 0); + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL_SLIDER), config->i_encoding_type > 0); + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_LOW_LABEL), config->i_encoding_type > 0); + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_HIGH_LABEL), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[0], IDC_MAIN_STATS_UPDATE), config->i_encoding_type == 4 && config->i_pass > 1); + EnableWindow(GetDlgItem(hTabs[0], IDC_MAIN_STATS), config->i_encoding_type == 4); + EnableWindow(GetDlgItem(hTabs[0], IDC_MAIN_STATS_BROWSE), config->i_encoding_type == 4); + + /* Debug */ + EnableWindow(GetDlgItem(hTabs[0], IDC_DEBUG_PSNR), config->i_encoding_type > 0 && config->i_log_level >= 3); + EnableWindow(GetDlgItem(hTabs[0], IDC_DEBUG_SSIM), config->i_encoding_type > 0 && config->i_log_level >= 3); + + /* Analysis */ + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_8X8DCT), config->i_encoding_type > 0 || config->b_cabac); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_I_I8X8), (config->i_encoding_type > 0 || config->b_cabac) && config->b_dct8x8); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_PB_I8X8), (config->i_encoding_type > 0 || config->b_cabac) && config->b_dct8x8); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_PB_P4X4), config->b_psub16x16); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_PB_B8X8), config->i_bframe > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_FAST_PSKIP), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_MIXED_REFS), config->i_refmax > 1); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_CHROMA_ME), config->i_subpel_refine >= 4); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_PSY_RDO), config->i_encoding_type > 0 && config->i_subpel_refine >= 5); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_PRE_SCENECUT), config->i_scenecut_threshold >= 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_B_ADAPT), config->i_bframe > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_B_BIAS), config->i_bframe > 0 && config->i_bframe_adaptive > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_B_BIAS_SPIN), config->i_bframe > 0 && config->i_bframe_adaptive > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_DIRECT), config->i_bframe > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_B_PYRAMID), config->i_bframe > 1); + EnableWindow(GetDlgItem(hTabs[1], IDC_ANALYSIS_WEIGHTB), config->i_bframe > 0); + + /* Encoding */ + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK_A), config->i_encoding_type > 0 && config->b_filter); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK_A_SPIN), config->i_encoding_type > 0 && config->b_filter); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK_B), config->i_encoding_type > 0 && config->b_filter); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK_B_SPIN), config->i_encoding_type > 0 && config->b_filter); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DCT_DECIMATE), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_NR), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_TRELLIS), config->i_encoding_type > 0 && config->b_cabac); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEADZONE_INTRA), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEADZONE_INTRA_SPIN), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEADZONE_INTER), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_DEADZONE_INTER_SPIN), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_CQM), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_CQMFILE), config->i_encoding_type > 0 && config->i_cqm == 2); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_CQMFILE_BROWSE), config->i_encoding_type > 0 && config->i_cqm == 2); + EnableWindow(GetDlgItem(hTabs[1], IDC_ENC_PSY_TRELLIS), config->i_encoding_type > 0 && config->b_cabac && config->i_trellis > 0); + + /* Rate control */ + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_VBV_MAXRATE), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_VBV_BUFSIZE), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_VBV_INIT), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_VBV_INIT_SPIN), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QPMIN), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QPMIN_SPIN), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QPMAX), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QPMAX_SPIN), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QPSTEP), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QPSTEP_SPIN), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_IPRATIO), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_PBRATIO), config->i_encoding_type > 0 && config->i_bframe > 0); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_CHROMA_QP_OFFSET), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_CHROMA_QP_OFFSET_SPIN), config->i_encoding_type > 0); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QCOMP), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_CPLXBLUR), config->i_encoding_type == 4 && config->i_pass > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_QBLUR), config->i_encoding_type == 4 && config->i_pass > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_RC_RATETOL), config->i_encoding_type > 2); + + /* AQ */ + EnableWindow(GetDlgItem(hTabs[2], IDC_AQ_MODE), config->i_encoding_type > 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_AQ_STRENGTH), config->i_encoding_type > 1 && config->i_aq_mode > 0); +#if X264_PATCH_VAQ_MOD + EnableWindow(GetDlgItem(hTabs[2], IDC_AQ_METRIC), config->i_encoding_type > 1 && config->i_aq_mode > 0); + EnableWindow(GetDlgItem(hTabs[2], IDC_AQ_SENSITIVITY), config->i_encoding_type > 1 && config->i_aq_mode > 0); #endif - EnableWindow(GetDlgItem(hTabs[2], IDC_BBIASSLIDER), config->i_bframe > 0 && config->b_bframe_adaptive); - EnableWindow(GetDlgItem(hTabs[2], IDC_BBIAS), config->i_bframe > 0 && config->b_bframe_adaptive); - EnableWindow(GetDlgItem(hTabs[2], IDC_BADAPT), config->i_bframe > 0); - EnableWindow(GetDlgItem(hTabs[2], IDC_BREFS), config->i_bframe > 1); - EnableWindow(GetDlgItem(hTabs[2], IDC_WBPRED), config->i_bframe > 0); - EnableWindow(GetDlgItem(hTabs[2], IDC_BIDIR_ME), config->i_bframe > 0); - EnableWindow(GetDlgItem(hTabs[2], IDC_DIRECTPRED), config->i_bframe > 0); - -// EnableWindow(GetDlgItem(hTabs[3], IDC_SUBPEL), TRUE); - EnableWindow(GetDlgItem(hTabs[3], IDC_BRDO), config->i_bframe > 0 && config->i_subpel_refine >= 5); -// EnableWindow(GetDlgItem(hTabs[3], IDC_ME_METHOD), TRUE); -// EnableWindow(GetDlgItem(hTabs[3], IDC_MERANGE), TRUE); - EnableWindow(GetDlgItem(hTabs[3], IDC_CHROMAME), config->i_subpel_refine >= 4); -// EnableWindow(GetDlgItem(hTabs[3], IDC_FRAMEREFS), TRUE); - EnableWindow(GetDlgItem(hTabs[3], IDC_MIXEDREF), config->i_refmax > 1); - -// EnableWindow(GetDlgItem(hTabs[3], IDC_LOG), TRUE); -// EnableWindow(GetDlgItem(hTabs[3], IDC_FOURCC), TRUE); - -// EnableWindow(GetDlgItem(hTabs[3], IDC_SAR_W), TRUE); -// EnableWindow(GetDlgItem(hTabs[3], IDC_SAR_H), TRUE); - -#ifdef HAVE_PTHREAD -// EnableWindow(GetDlgItem(hTabs[3], IDC_THREADEDIT), TRUE); -#else - ShowWindow(GetDlgItem(hTabs[3], IDC_THREADLABEL), FALSE); - ShowWindow(GetDlgItem(hTabs[3], IDC_THREADEDIT), FALSE); + /* Multithreading */ +#if X264VFW_USE_THREADS + EnableWindow(GetDlgItem(hTabs[2], IDC_MT_DETERMINISTIC), config->i_threads != 1); +#if X264_PATCH_THREAD_POOL + EnableWindow(GetDlgItem(hTabs[2], IDC_MT_THREAD_QUEUE), config->i_threads != 1); + EnableWindow(GetDlgItem(hTabs[2], IDC_MT_THREAD_QUEUE_SPIN), config->i_threads != 1); +#endif #endif -// EnableWindow(GetDlgItem(hTabs[3], IDC_CABAC), TRUE); - EnableWindow(GetDlgItem(hTabs[3], IDC_TRELLIS), config->i_encoding_type > 0 && config->b_cabac); - EnableWindow(GetDlgItem(hTabs[3], IDC_NR), config->i_encoding_type > 0); - EnableWindow(GetDlgItem(hTabs[3], IDC_LOOPFILTER), config->i_encoding_type > 0); - EnableWindow(GetDlgItem(hTabs[3], IDC_INLOOP_A), config->i_encoding_type > 0 && config->b_filter); - EnableWindow(GetDlgItem(hTabs[3], IDC_INLOOP_B), config->i_encoding_type > 0 && config->b_filter); -// EnableWindow(GetDlgItem(hTabs[3], IDC_INTERLACED), TRUE); - -// EnableWindow(GetDlgItem(hMainDlg, IDC_USE_CMDLINE), TRUE); - EnableWindow(GetDlgItem(hMainDlg, IDC_CMDLINE), config->b_use_cmdline); + /* Config */ + EnableWindow(GetDlgItem(hMainDlg, IDC_CONFIG_CMDLINE), config->b_use_cmdline); } void tabs_update_items(CONFIG *config) { char szTmp[1024]; + /* Main */ sprintf(szTmp, "Build date: %s %s\nlibx264 core %d%s", __DATE__, __TIME__, X264_BUILD, X264_VERSION); - SetDlgItemText(hTabs[0], IDC_BUILDREV, szTmp); - - if (SendMessage(GetDlgItem(hTabs[0], IDC_BITRATEMODE), CB_GETCOUNT, 0, 0) == 0) + SetDlgItemText(hTabs[0], IDC_MAIN_BUILD_LABEL, szTmp); + if (SendMessage(GetDlgItem(hTabs[0], IDC_MAIN_RC_MODE), CB_GETCOUNT, 0, 0) == 0) { - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - lossless"); - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - quantizer-based (CQP)"); - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - ratefactor-based (CRF)"); - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - bitrate-based (ABR)"); - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Multipass - 1st pass"); - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Multipass - 1st pass (fast)"); - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_ADDSTRING, 0, (LPARAM)"Multipass - Nth pass"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - lossless"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - quantizer-based (CQP)"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - ratefactor-based (CRF)"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Single pass - bitrate-based (ABR)"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Multipass - 1st pass"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Multipass - 1st pass (fast)"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_ADDSTRING, 0, (LPARAM)"Multipass - Nth pass"); } - SendMessage(GetDlgItem(hTabs[0], IDC_BITRATEEDIT), EM_LIMITTEXT, 4, 0); + SendMessage(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL), EM_LIMITTEXT, 8, 0); switch (config->i_encoding_type) { case 0: /* 1 pass, lossless */ - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 0, 0); - SetDlgItemText(hTabs[0], IDC_BITRATELABEL, ""); - SetDlgItemText(hTabs[0], IDC_BITRATELOW, ""); - SetDlgItemText(hTabs[0], IDC_BITRATEHIGH, ""); - SetDlgItemInt(hTabs[0], IDC_BITRATEEDIT, 0, FALSE); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(0, 0)); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, 0); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 0, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LABEL, ""); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LOW_LABEL, ""); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_HIGH_LABEL, ""); + SetDlgItemInt(hTabs[0], IDC_MAIN_RC_VAL, 0, FALSE); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMIN, TRUE, 0); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMAX, TRUE, 0); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, 0); break; case 1: /* 1 pass, quantizer-based (CQP) */ - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 1, 0); - SetDlgItemText(hTabs[0], IDC_BITRATELABEL, "Quantizer"); - SetDlgItemText(hTabs[0], IDC_BITRATELOW, "1 (High quality)"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 1, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LABEL, "Quantizer"); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LOW_LABEL, "1 (High quality)"); sprintf(szTmp, "(Low quality) %d", X264_QUANT_MAX); - SetDlgItemText(hTabs[0], IDC_BITRATEHIGH, szTmp); - SetDlgItemInt(hTabs[0], IDC_BITRATEEDIT, config->i_qp, FALSE); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(1, X264_QUANT_MAX)); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_qp); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_HIGH_LABEL, szTmp); + SetDlgItemInt(hTabs[0], IDC_MAIN_RC_VAL, config->i_qp, FALSE); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMIN, TRUE, 1); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMAX, TRUE, X264_QUANT_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_qp); break; case 2: /* 1 pass, ratefactor-based (CRF) */ - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 2, 0); - SetDlgItemText(hTabs[0], IDC_BITRATELABEL, "Ratefactor"); - SetDlgItemText(hTabs[0], IDC_BITRATELOW, "1.0 (High quality)"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 2, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LABEL, "Ratefactor"); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LOW_LABEL, "1.0 (High quality)"); sprintf(szTmp, "(Low quality) %d.0", X264_QUANT_MAX); - SetDlgItemText(hTabs[0], IDC_BITRATEHIGH, szTmp); - SetDlgItemDouble(hTabs[0], IDC_BITRATEEDIT, config->i_rf_constant * 0.1); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(10, X264_QUANT_MAX * 10)); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_rf_constant); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_HIGH_LABEL, szTmp); + SetDlgItemDouble(hTabs[0], IDC_MAIN_RC_VAL, config->i_rf_constant * 0.1, "%.1f"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMIN, TRUE, 10); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMAX, TRUE, X264_QUANT_MAX * 10); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_rf_constant); break; case 3: /* 1 pass, bitrate-based (ABR) */ - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 3, 0); - SetDlgItemText(hTabs[0], IDC_BITRATELABEL, "Average bitrate (kbit/s)"); - SetDlgItemText(hTabs[0], IDC_BITRATELOW, "1"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 3, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LABEL, "Average bitrate (kbit/s)"); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LOW_LABEL, "1"); sprintf(szTmp, "%d", X264_BITRATE_MAX); - SetDlgItemText(hTabs[0], IDC_BITRATEHIGH, szTmp); - SetDlgItemInt(hTabs[0], IDC_BITRATEEDIT, config->i_passbitrate, FALSE); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(1, X264_BITRATE_MAX)); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_HIGH_LABEL, szTmp); + SetDlgItemInt(hTabs[0], IDC_MAIN_RC_VAL, config->i_passbitrate, FALSE); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMIN, TRUE, 1); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMAX, TRUE, X264_BITRATE_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); break; case 4: /* 2 pass */ if (config->i_pass > 1) - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 6, 0); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 6, 0); else if (config->b_fast1pass) - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 5, 0); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 5, 0); else - SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_SETCURSEL, 4, 0); - SetDlgItemText(hTabs[0], IDC_BITRATELABEL, "Target bitrate (kbit/s)"); - SetDlgItemText(hTabs[0], IDC_BITRATELOW, "1"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_SETCURSEL, 4, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LABEL, "Target bitrate (kbit/s)"); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_LOW_LABEL, "1"); sprintf(szTmp, "%d", X264_BITRATE_MAX); - SetDlgItemText(hTabs[0], IDC_BITRATEHIGH, szTmp); - SetDlgItemInt(hTabs[0], IDC_BITRATEEDIT, config->i_passbitrate, FALSE); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(1, X264_BITRATE_MAX)); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); + SetDlgItemText(hTabs[0], IDC_MAIN_RC_HIGH_LABEL, szTmp); + SetDlgItemInt(hTabs[0], IDC_MAIN_RC_VAL, config->i_passbitrate, FALSE); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMIN, TRUE, 1); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETRANGEMAX, TRUE, X264_BITRATE_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); break; default: assert(0); break; } - CheckDlgButton(hTabs[0], IDC_UPDATESTATS, config->b_updatestats); - SendMessage(GetDlgItem(hTabs[0], IDC_STATSFILE), EM_LIMITTEXT, MAX_STATS_PATH - 1, 0); - SetDlgItemText(hTabs[0], IDC_STATSFILE, config->stats); - - SendMessage(GetDlgItem(hTabs[0], IDC_EXTRA_CMDLINE), EM_LIMITTEXT, MAX_CMDLINE - 1, 0); - SetDlgItemText(hTabs[0], IDC_EXTRA_CMDLINE, config->extra_cmdline); - - SendMessage(GetDlgItem(hTabs[1], IDC_IPRATIO), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_IPRATIO, config->i_key_boost, FALSE); - SendMessage(GetDlgItem(hTabs[1], IDC_PBRATIO), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_PBRATIO, config->i_b_red, FALSE); - SendMessage(GetDlgItem(hTabs[1], IDC_CURVECOMP), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_CURVECOMP, config->i_curve_comp, FALSE); - - SendMessage(GetDlgItem(hTabs[1], IDC_QPMIN), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_QPMIN, config->i_qp_min, FALSE); - SendMessage(GetDlgItem(hTabs[1], IDC_QPMAX), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_QPMAX, config->i_qp_max, FALSE); - SendMessage(GetDlgItem(hTabs[1], IDC_QPSTEP), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_QPSTEP, config->i_qp_step, FALSE); - - SendMessage(GetDlgItem(hTabs[1], IDC_SCENECUT), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_SCENECUT, config->i_scenecut_threshold, TRUE); - SendMessage(GetDlgItem(hTabs[1], IDC_KEYINTMIN), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_KEYINTMIN, config->i_keyint_min, FALSE); - SendMessage(GetDlgItem(hTabs[1], IDC_KEYINTMAX), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[1], IDC_KEYINTMAX, config->i_keyint_max, FALSE); - - CheckDlgButton(hTabs[2], IDC_DCT8X8, config->b_dct8x8); - CheckDlgButton(hTabs[2], IDC_I8X8, config->b_i8x8); - CheckDlgButton(hTabs[2], IDC_I4X4, config->b_i4x4); - CheckDlgButton(hTabs[2], IDC_P8X8, config->b_psub16x16); - CheckDlgButton(hTabs[2], IDC_P4X4, config->b_psub8x8); - CheckDlgButton(hTabs[2], IDC_B8X8, config->b_bsub16x16); - - SendMessage(GetDlgItem(hTabs[2], IDC_BFRAME), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[2], IDC_BFRAME, config->i_bframe, FALSE); - CheckDlgButton(hTabs[2], IDC_VDHACK, config->b_vd_hack); - SendDlgItemMessage(hTabs[2], IDC_BBIASSLIDER, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(-90, 100)); - SendDlgItemMessage(hTabs[2], IDC_BBIASSLIDER, TBM_SETPOS, TRUE, config->i_bframe_bias); - SendMessage(GetDlgItem(hTabs[2], IDC_BBIAS), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[2], IDC_BBIAS, config->i_bframe_bias, TRUE); - CheckDlgButton(hTabs[2], IDC_BADAPT, config->b_bframe_adaptive); - CheckDlgButton(hTabs[2], IDC_BREFS, config->b_b_refs); - CheckDlgButton(hTabs[2], IDC_WBPRED, config->b_b_wpred); - CheckDlgButton(hTabs[2], IDC_BIDIR_ME, config->b_bidir_me); - if (SendMessage(GetDlgItem(hTabs[2], IDC_DIRECTPRED), CB_GETCOUNT, 0, 0) == 0) + CheckDlgButton(hTabs[0], IDC_MAIN_STATS_UPDATE, config->b_updatestats); + SendMessage(GetDlgItem(hTabs[0], IDC_MAIN_STATS), EM_LIMITTEXT, MAX_STATS_PATH - 1, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_STATS, config->stats); + SendMessage(GetDlgItem(hTabs[0], IDC_MAIN_EXTRA_CMDLINE), EM_LIMITTEXT, MAX_CMDLINE - 1, 0); + SetDlgItemText(hTabs[0], IDC_MAIN_EXTRA_CMDLINE, config->extra_cmdline); + + /* Misc */ + if (SendMessage(GetDlgItem(hTabs[0], IDC_MISC_LEVEL), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"Auto"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"1.0"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"1.1"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"1.2"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"1.3"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"2.0"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"2.1"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"2.2"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"3.0"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"3.1"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"3.2"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"4.0"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"4.1"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"4.2"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"5.0"); + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_ADDSTRING, 0, (LPARAM)"5.1"); + } + SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_SETCURSEL, config->i_avc_level, 0); + SendMessage(GetDlgItem(hTabs[0], IDC_MISC_SAR_W), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[0], IDC_MISC_SAR_W, config->i_sar_width, FALSE); + SendMessage(GetDlgItem(hTabs[0], IDC_MISC_SAR_H), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[0], IDC_MISC_SAR_H, config->i_sar_height, FALSE); + + /* Debug */ + if (SendMessage(GetDlgItem(hTabs[0], IDC_DEBUG_LOG_LEVEL), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_ADDSTRING, 0, (LPARAM)"None"); + SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_ADDSTRING, 0, (LPARAM)"Error"); + SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_ADDSTRING, 0, (LPARAM)"Warning"); + SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_ADDSTRING, 0, (LPARAM)"Info"); + SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_ADDSTRING, 0, (LPARAM)"Debug"); + } + SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_SETCURSEL, config->i_log_level, 0); + CheckDlgButton(hTabs[0], IDC_DEBUG_PSNR, config->b_psnr); + CheckDlgButton(hTabs[0], IDC_DEBUG_SSIM, config->b_ssim); + CheckDlgButton(hTabs[0], IDC_DEBUG_NO_ASM, config->b_no_asm); + + /* VFW */ + if (SendMessage(GetDlgItem(hTabs[0], IDC_VFW_FOURCC), CB_GETCOUNT, 0, 0) == 0) { - SendDlgItemMessage(hTabs[2], IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"None"); - SendDlgItemMessage(hTabs[2], IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"Spatial"); - SendDlgItemMessage(hTabs[2], IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"Temporal"); - SendDlgItemMessage(hTabs[2], IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"Auto"); + int i; + for (i = 0; i < sizeof(fcc_str_table) / sizeof(fourcc_str); i++) + SendDlgItemMessage(hTabs[0], IDC_VFW_FOURCC, CB_ADDSTRING, 0, (LPARAM)&fcc_str_table[i]); } - SendDlgItemMessage(hTabs[2], IDC_DIRECTPRED, CB_SETCURSEL, (config->i_direct_mv_pred), 0); + SendDlgItemMessage(hTabs[0], IDC_VFW_FOURCC, CB_SETCURSEL, config->i_fcc_num, 0); +#if X264VFW_USE_VIRTUALDUB_HACK + CheckDlgButton(hTabs[0], IDC_VFW_VD_HACK, config->b_vd_hack); +#endif +#if X264VFW_USE_DECODER + CheckDlgButton(hTabs[0], IDC_VFW_DISABLE_DECODER, config->b_disable_decoder); +#endif - if (SendMessage(GetDlgItem(hTabs[3], IDC_SUBPEL), CB_GETCOUNT, 0, 0) == 0) + /* Analysis */ + CheckDlgButton(hTabs[1], IDC_ANALYSIS_8X8DCT, config->b_dct8x8); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_I_I8X8, config->b_intra_i8x8); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_I_I4X4, config->b_intra_i4x4); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_PB_I8X8, config->b_i8x8); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_PB_I4X4, config->b_i4x4); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_PB_P8X8, config->b_psub16x16); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_PB_P4X4, config->b_psub8x8); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_PB_B8X8, config->b_bsub16x16); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_FAST_PSKIP, config->b_fast_pskip); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_REF), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_REF, config->i_refmax, FALSE); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_MIXED_REFS, config->b_mixedref); + if (SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_ME), CB_GETCOUNT, 0, 0) == 0) { - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"1 (Fast)"); - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"2"); - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"3"); - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"4"); - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"5 (Normal)"); - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"6 (RDO)"); - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"7 (Best)"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_ADDSTRING, 0, (LPARAM)"dia"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_ADDSTRING, 0, (LPARAM)"hex"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_ADDSTRING, 0, (LPARAM)"umh"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_ADDSTRING, 0, (LPARAM)"esa"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_ADDSTRING, 0, (LPARAM)"tesa"); } - SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_SETCURSEL, (config->i_subpel_refine), 0); - CheckDlgButton(hTabs[3], IDC_BRDO, config->b_brdo); - if (SendMessage(GetDlgItem(hTabs[3], IDC_ME_METHOD), CB_GETCOUNT, 0, 0) == 0) + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_SETCURSEL, config->i_me_method, 0); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_MERANGE), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_MERANGE, config->i_me_range, FALSE); + if (SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_SUBME), CB_GETCOUNT, 0, 0) == 0) { - SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_ADDSTRING, 0, (LPARAM)"dia"); - SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_ADDSTRING, 0, (LPARAM)"hex"); - SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_ADDSTRING, 0, (LPARAM)"umh"); - SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_ADDSTRING, 0, (LPARAM)"esa"); - SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_ADDSTRING, 0, (LPARAM)"tesa"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"1 QPel SAD"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"2 QPel SATD"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"3 HPel+QPel"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"4 Always QPel"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"5 Multi QPel"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"6 RD on I/P"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"7 RD on all"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"8 RDr on I/P"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_ADDSTRING, 0, (LPARAM)"9 RDr on all"); } - SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_SETCURSEL, (config->i_me_method), 0); - SendMessage(GetDlgItem(hTabs[3], IDC_MERANGE), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[3], IDC_MERANGE, config->i_me_range, FALSE); - CheckDlgButton(hTabs[3], IDC_CHROMAME, config->b_chroma_me); - SendMessage(GetDlgItem(hTabs[3], IDC_FRAMEREFS), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[3], IDC_FRAMEREFS, config->i_refmax, FALSE); - CheckDlgButton(hTabs[3], IDC_MIXEDREF, config->b_mixedref); - - if (SendMessage(GetDlgItem(hTabs[3], IDC_LOG), CB_GETCOUNT, 0, 0) == 0) + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_SETCURSEL, config->i_subpel_refine, 0); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_CHROMA_ME, config->b_chroma_me); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_PSY_RDO), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[1], IDC_ANALYSIS_PSY_RDO, config->f_psy_rdo, "%.2f"); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_MIN_KEYINT), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_MIN_KEYINT, config->i_keyint_min, FALSE); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_KEYINT), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_KEYINT, config->i_keyint_max, FALSE); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_SCENECUT), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_SCENECUT, config->i_scenecut_threshold, TRUE); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_PRE_SCENECUT, config->b_pre_scenecut); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_BFRAMES), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_BFRAMES, config->i_bframe, FALSE); + if (SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_B_ADAPT), CB_GETCOUNT, 0, 0) == 0) { - SendDlgItemMessage(hTabs[3], IDC_LOG, CB_ADDSTRING, 0, (LPARAM)"None"); - SendDlgItemMessage(hTabs[3], IDC_LOG, CB_ADDSTRING, 0, (LPARAM)"Error"); - SendDlgItemMessage(hTabs[3], IDC_LOG, CB_ADDSTRING, 0, (LPARAM)"Warning"); - SendDlgItemMessage(hTabs[3], IDC_LOG, CB_ADDSTRING, 0, (LPARAM)"Info"); - SendDlgItemMessage(hTabs[3], IDC_LOG, CB_ADDSTRING, 0, (LPARAM)"Debug"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_B_ADAPT, CB_ADDSTRING, 0, (LPARAM)"Off"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_B_ADAPT, CB_ADDSTRING, 0, (LPARAM)"Fast"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_B_ADAPT, CB_ADDSTRING, 0, (LPARAM)"Optimal"); } - SendDlgItemMessage(hTabs[3], IDC_LOG, CB_SETCURSEL, (config->i_log_level), 0); - if (SendMessage(GetDlgItem(hTabs[3], IDC_FOURCC), CB_GETCOUNT, 0, 0) == 0) + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_B_ADAPT, CB_SETCURSEL, config->i_bframe_adaptive, 0); + SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_B_BIAS), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_B_BIAS, config->i_bframe_bias, TRUE); + if (SendMessage(GetDlgItem(hTabs[1], IDC_ANALYSIS_DIRECT), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_DIRECT, CB_ADDSTRING, 0, (LPARAM)"None"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_DIRECT, CB_ADDSTRING, 0, (LPARAM)"Spatial"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_DIRECT, CB_ADDSTRING, 0, (LPARAM)"Temporal"); + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_DIRECT, CB_ADDSTRING, 0, (LPARAM)"Auto"); + } + SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_DIRECT, CB_SETCURSEL, config->i_direct_mv_pred, 0); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_B_PYRAMID, config->b_b_refs); + CheckDlgButton(hTabs[1], IDC_ANALYSIS_WEIGHTB, config->b_b_wpred); + + /* Encoding */ + CheckDlgButton(hTabs[1], IDC_ENC_DEBLOCK, config->b_filter); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK_A), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ENC_DEBLOCK_A, config->i_inloop_a, TRUE); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_DEBLOCK_B), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ENC_DEBLOCK_B, config->i_inloop_b, TRUE); + if (SendMessage(GetDlgItem(hTabs[1], IDC_ENC_INTERLACED), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[1], IDC_ENC_INTERLACED, CB_ADDSTRING, 0, (LPARAM)"Off"); +#if !X264_PATCH_HDR + SendDlgItemMessage(hTabs[1], IDC_ENC_INTERLACED, CB_ADDSTRING, 0, (LPARAM)"On"); +#else + SendDlgItemMessage(hTabs[1], IDC_ENC_INTERLACED, CB_ADDSTRING, 0, (LPARAM)"TFF"); + SendDlgItemMessage(hTabs[1], IDC_ENC_INTERLACED, CB_ADDSTRING, 0, (LPARAM)"BFF"); +#endif + } + SendDlgItemMessage(hTabs[1], IDC_ENC_INTERLACED, CB_SETCURSEL, config->i_interlaced, 0); + CheckDlgButton(hTabs[1], IDC_ENC_CABAC, config->b_cabac); + CheckDlgButton(hTabs[1], IDC_ENC_DCT_DECIMATE, config->b_dct_decimate); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_NR), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ENC_NR, config->i_noise_reduction, FALSE); + if (SendMessage(GetDlgItem(hTabs[1], IDC_ENC_TRELLIS), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[1], IDC_ENC_TRELLIS, CB_ADDSTRING, 0, (LPARAM)"Off"); + SendDlgItemMessage(hTabs[1], IDC_ENC_TRELLIS, CB_ADDSTRING, 0, (LPARAM)"MB encode"); + SendDlgItemMessage(hTabs[1], IDC_ENC_TRELLIS, CB_ADDSTRING, 0, (LPARAM)"Always"); + } + SendDlgItemMessage(hTabs[1], IDC_ENC_TRELLIS, CB_SETCURSEL, config->i_trellis, 0); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_DEADZONE_INTRA), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ENC_DEADZONE_INTRA, config->i_intra_deadzone, FALSE); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_DEADZONE_INTER), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[1], IDC_ENC_DEADZONE_INTER, config->i_inter_deadzone, FALSE); + + if (SendMessage(GetDlgItem(hTabs[1], IDC_ENC_CQM), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[1], IDC_ENC_CQM, CB_ADDSTRING, 0, (LPARAM)"Flat"); + SendDlgItemMessage(hTabs[1], IDC_ENC_CQM, CB_ADDSTRING, 0, (LPARAM)"JVT"); + SendDlgItemMessage(hTabs[1], IDC_ENC_CQM, CB_ADDSTRING, 0, (LPARAM)"Custom"); + } + SendDlgItemMessage(hTabs[1], IDC_ENC_CQM, CB_SETCURSEL, config->i_cqm, 0); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_CQMFILE), EM_LIMITTEXT, MAX_PATH - 1, 0); + SetDlgItemText(hTabs[1], IDC_ENC_CQMFILE, config->cqmfile); + SendMessage(GetDlgItem(hTabs[1], IDC_ENC_PSY_TRELLIS), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[1], IDC_ENC_PSY_TRELLIS, config->f_psy_trellis, "%.2f"); + + /* Rate control */ + SendMessage(GetDlgItem(hTabs[2], IDC_RC_VBV_MAXRATE), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_VBV_MAXRATE, config->i_vbv_maxrate, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_VBV_BUFSIZE), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_VBV_BUFSIZE, config->i_vbv_bufsize, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_VBV_INIT), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_VBV_INIT, config->i_vbv_occupancy, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_QPMIN), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_QPMIN, config->i_qp_min, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_QPMAX), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_QPMAX, config->i_qp_max, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_QPSTEP), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_QPSTEP, config->i_qp_step, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_IPRATIO), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_RC_IPRATIO, config->f_ipratio, "%.2f"); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_PBRATIO), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_RC_PBRATIO, config->f_pbratio, "%.2f"); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_CHROMA_QP_OFFSET), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_RC_CHROMA_QP_OFFSET, config->i_chroma_qp_offset, TRUE); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_QCOMP), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_RC_QCOMP, config->f_qcomp, "%.2f"); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_CPLXBLUR), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_RC_CPLXBLUR, config->f_cplxblur, "%.2f"); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_QBLUR), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_RC_QBLUR, config->f_qblur, "%.2f"); + SendMessage(GetDlgItem(hTabs[2], IDC_RC_RATETOL), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_RC_RATETOL, config->f_ratetol, "%.2f"); + + /* AQ */ + if (SendMessage(GetDlgItem(hTabs[2], IDC_AQ_MODE), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[2], IDC_AQ_MODE, CB_ADDSTRING, 0, (LPARAM)"Off"); + SendDlgItemMessage(hTabs[2], IDC_AQ_MODE, CB_ADDSTRING, 0, (LPARAM)"On"); + } + SendDlgItemMessage(hTabs[2], IDC_AQ_MODE, CB_SETCURSEL, config->i_aq_mode, 0); + SendMessage(GetDlgItem(hTabs[2], IDC_AQ_STRENGTH), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_AQ_STRENGTH, config->f_aq_strength, "%.2f"); +#if X264_PATCH_VAQ_MOD + if (SendMessage(GetDlgItem(hTabs[2], IDC_AQ_METRIC), CB_GETCOUNT, 0, 0) == 0) + { + SendDlgItemMessage(hTabs[2], IDC_AQ_METRIC, CB_ADDSTRING, 0, (LPARAM)"Original"); + SendDlgItemMessage(hTabs[2], IDC_AQ_METRIC, CB_ADDSTRING, 0, (LPARAM)"BM ver. 0"); + SendDlgItemMessage(hTabs[2], IDC_AQ_METRIC, CB_ADDSTRING, 0, (LPARAM)"BM ver. 1"); + } + SendDlgItemMessage(hTabs[2], IDC_AQ_METRIC, CB_SETCURSEL, config->i_aq_metric, 0); + SendMessage(GetDlgItem(hTabs[2], IDC_AQ_SENSITIVITY), EM_LIMITTEXT, 8, 0); + SetDlgItemDouble(hTabs[2], IDC_AQ_SENSITIVITY, config->f_aq_sensitivity, "%.2f"); +#endif + + /* Multithreading */ +#if X264VFW_USE_THREADS + SendMessage(GetDlgItem(hTabs[2], IDC_MT_THREADS), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_MT_THREADS, config->i_threads, FALSE); + CheckDlgButton(hTabs[2], IDC_MT_DETERMINISTIC, config->b_mt_deterministic); +#if X264_PATCH_THREAD_POOL + SendMessage(GetDlgItem(hTabs[2], IDC_MT_THREAD_QUEUE), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_MT_THREAD_QUEUE, config->i_thread_queue, FALSE); +#endif +#endif + + /* VUI */ + if (SendMessage(GetDlgItem(hTabs[2], IDC_VUI_OVERSCAN), CB_GETCOUNT, 0, 0) == 0) { int i; - for (i = 0; i < sizeof(fcc_str_table) / sizeof(fourcc_str); i++) - SendDlgItemMessage(hTabs[3], IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)&fcc_str_table[i]); + for (i = 0; i < sizeof(overscan_names) / sizeof(const char *); i++) + SendDlgItemMessage(hTabs[2], IDC_VUI_OVERSCAN, CB_ADDSTRING, 0, (LPARAM)overscan_names[i]); } - SendDlgItemMessage(hTabs[3], IDC_FOURCC, CB_SETCURSEL, (config->i_fcc_num), 0); - - SendMessage(GetDlgItem(hTabs[3], IDC_SAR_W), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[3], IDC_SAR_W, config->i_sar_width, FALSE); - SendMessage(GetDlgItem(hTabs[3], IDC_SAR_H), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[3], IDC_SAR_H, config->i_sar_height, FALSE); - SendMessage(GetDlgItem(hTabs[3], IDC_THREADEDIT), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[3], IDC_THREADEDIT, config->i_threads, FALSE); - - CheckDlgButton(hTabs[3], IDC_CABAC, config->b_cabac); - CheckDlgButton(hTabs[3], IDC_TRELLIS, config->i_trellis); - SendMessage(GetDlgItem(hTabs[3], IDC_NR), EM_LIMITTEXT, 4, 0); - SetDlgItemInt(hTabs[3], IDC_NR, config->i_noise_reduction, FALSE); - CheckDlgButton(hTabs[3], IDC_LOOPFILTER, config->b_filter); - SendDlgItemMessage(hTabs[3], IDC_INLOOP_A, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(-6, 6)); - SendDlgItemMessage(hTabs[3], IDC_INLOOP_A, TBM_SETPOS, TRUE, config->i_inloop_a); - SetDlgItemInt(hTabs[3], IDC_LOOPA_TXT, config->i_inloop_a, TRUE); - SendDlgItemMessage(hTabs[3], IDC_INLOOP_B, TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(-6, 6)); - SendDlgItemMessage(hTabs[3], IDC_INLOOP_B, TBM_SETPOS, TRUE, config->i_inloop_b); - SetDlgItemInt(hTabs[3], IDC_LOOPB_TXT, config->i_inloop_b, TRUE); - CheckDlgButton(hTabs[3], IDC_INTERLACED, config->b_interlaced); - - CheckDlgButton(hMainDlg, IDC_USE_CMDLINE, config->b_use_cmdline); - SendMessage(GetDlgItem(hMainDlg, IDC_CMDLINE), EM_LIMITTEXT, MAX_CMDLINE - 1, 0); - SetDlgItemText(hMainDlg, IDC_CMDLINE, config->cmdline); + SendDlgItemMessage(hTabs[2], IDC_VUI_OVERSCAN, CB_SETCURSEL, VUI_abs2loc(config->i_overscan, overscan), 0); + if (SendMessage(GetDlgItem(hTabs[2], IDC_VUI_VIDEOFORMAT), CB_GETCOUNT, 0, 0) == 0) + { + int i; + for (i = 0; i < sizeof(vidformat_names) / sizeof(const char *); i++) + SendDlgItemMessage(hTabs[2], IDC_VUI_VIDEOFORMAT, CB_ADDSTRING, 0, (LPARAM)vidformat_names[i]); + } + SendDlgItemMessage(hTabs[2], IDC_VUI_VIDEOFORMAT, CB_SETCURSEL, VUI_abs2loc(config->i_vidformat, vidformat), 0); + if (SendMessage(GetDlgItem(hTabs[2], IDC_VUI_FULLRANGE), CB_GETCOUNT, 0, 0) == 0) + { + int i; + for (i = 0; i < sizeof(fullrange_names) / sizeof(const char *); i++) + SendDlgItemMessage(hTabs[2], IDC_VUI_FULLRANGE, CB_ADDSTRING, 0, (LPARAM)fullrange_names[i]); + } + SendDlgItemMessage(hTabs[2], IDC_VUI_FULLRANGE, CB_SETCURSEL, VUI_abs2loc(config->i_fullrange, fullrange), 0); + if (SendMessage(GetDlgItem(hTabs[2], IDC_VUI_COLORPRIM), CB_GETCOUNT, 0, 0) == 0) + { + int i; + for (i = 0; i < sizeof(colorprim_names) / sizeof(const char *); i++) + SendDlgItemMessage(hTabs[2], IDC_VUI_COLORPRIM, CB_ADDSTRING, 0, (LPARAM)colorprim_names[i]); + } + SendDlgItemMessage(hTabs[2], IDC_VUI_COLORPRIM, CB_SETCURSEL, VUI_abs2loc(config->i_colorprim, colorprim), 0); + if (SendMessage(GetDlgItem(hTabs[2], IDC_VUI_TRANSFER), CB_GETCOUNT, 0, 0) == 0) + { + int i; + for (i = 0; i < sizeof(transfer_names) / sizeof(const char *); i++) + SendDlgItemMessage(hTabs[2], IDC_VUI_TRANSFER, CB_ADDSTRING, 0, (LPARAM)transfer_names[i]); + } + SendDlgItemMessage(hTabs[2], IDC_VUI_TRANSFER, CB_SETCURSEL, VUI_abs2loc(config->i_transfer, transfer), 0); + if (SendMessage(GetDlgItem(hTabs[2], IDC_VUI_COLORMATRIX), CB_GETCOUNT, 0, 0) == 0) + { + int i; + for (i = 0; i < sizeof(colmatrix_names) / sizeof(const char *); i++) + SendDlgItemMessage(hTabs[2], IDC_VUI_COLORMATRIX, CB_ADDSTRING, 0, (LPARAM)colmatrix_names[i]); + } + SendDlgItemMessage(hTabs[2], IDC_VUI_COLORMATRIX, CB_SETCURSEL, VUI_abs2loc(config->i_colmatrix, colmatrix), 0); + SendMessage(GetDlgItem(hTabs[2], IDC_VUI_CHROMALOC), EM_LIMITTEXT, 8, 0); + SetDlgItemInt(hTabs[2], IDC_VUI_CHROMALOC, config->i_chromaloc, FALSE); + + /* Config */ + CheckDlgButton(hMainDlg, IDC_CONFIG_USE_CMDLINE, config->b_use_cmdline); + SendMessage(GetDlgItem(hMainDlg, IDC_CONFIG_CMDLINE), EM_LIMITTEXT, MAX_CMDLINE - 1, 0); + SetDlgItemText(hMainDlg, IDC_CONFIG_CMDLINE, config->cmdline); } /* Assigns tooltips */ BOOL CALLBACK enum_tooltips(HWND hWnd, LPARAM lParam) { - char help[500]; + char help[1024]; /* The tooltip for a control is named the same as the control itself */ - if (LoadString(g_hInst, GetDlgCtrlID(hWnd), help, 500)) + if (LoadString(g_hInst, GetDlgCtrlID(hWnd), help, 1024)) { TOOLINFO ti; @@ -581,7 +901,7 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { TCITEM tie; RECT rect; - HWND hTabCtrl = GetDlgItem(hDlg, IDC_TABCONTROL); + HWND hTabCtrl = GetDlgItem(hDlg, IDC_CONFIG_TABCONTROL); SetWindowLong(hDlg, GWL_USERDATA, lParam); config = (CONFIG *)lParam; @@ -593,20 +913,17 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) // insert tabs in tab control tie.mask = TCIF_TEXT; tie.iImage = -1; - tie.pszText = "Bitrate"; TabCtrl_InsertItem(hTabCtrl, 0, &tie); - tie.pszText = "Rate Control"; TabCtrl_InsertItem(hTabCtrl, 1, &tie); - tie.pszText = "MBs && Frames"; TabCtrl_InsertItem(hTabCtrl, 2, &tie); - tie.pszText = "More..."; TabCtrl_InsertItem(hTabCtrl, 3, &tie); - hTabs[0] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_BITRATE), hMainDlg, (DLGPROC)callback_tabs, lParam); - hTabs[1] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_RATECONTROL), hMainDlg, (DLGPROC)callback_tabs, lParam); - hTabs[2] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_IPFRAMES), hMainDlg, (DLGPROC)callback_tabs, lParam); - hTabs[3] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_MISC), hMainDlg, (DLGPROC)callback_tabs, lParam); + tie.pszText = "Main"; TabCtrl_InsertItem(hTabCtrl, 0, &tie); + tie.pszText = "Analysis && Encoding"; TabCtrl_InsertItem(hTabCtrl, 1, &tie); + tie.pszText = "Rate control && Other"; TabCtrl_InsertItem(hTabCtrl, 2, &tie); + hTabs[0] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_MAIN), hMainDlg, (DLGPROC)callback_tabs, lParam); + hTabs[1] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_ANALYSIS_ENC), hMainDlg, (DLGPROC)callback_tabs, lParam); + hTabs[2] = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_TAB_RC_OTHER), hMainDlg, (DLGPROC)callback_tabs, lParam); GetClientRect(hTabCtrl, &rect); TabCtrl_AdjustRect(hTabCtrl, FALSE, &rect); MoveWindow(hTabs[0], rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); MoveWindow(hTabs[1], rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); MoveWindow(hTabs[2], rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); - MoveWindow(hTabs[3], rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); if ((hTooltip = CreateWindow(TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInst, NULL))) { @@ -630,7 +947,7 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) if (tem->code == TCN_SELCHANGING) { int num; - HWND hTabCtrl = GetDlgItem(hMainDlg, IDC_TABCONTROL); + HWND hTabCtrl = GetDlgItem(hMainDlg, IDC_CONFIG_TABCONTROL); SetFocus(hTabCtrl); num = TabCtrl_GetCurSel(hTabCtrl); @@ -639,7 +956,7 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) else if (tem->code == TCN_SELCHANGE) { int num; - HWND hTabCtrl = GetDlgItem(hMainDlg, IDC_TABCONTROL); + HWND hTabCtrl = GetDlgItem(hMainDlg, IDC_CONFIG_TABCONTROL); SetFocus(hTabCtrl); num = TabCtrl_GetCurSel(hTabCtrl); @@ -667,7 +984,7 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) EndDialog(hMainDlg, LOWORD(wParam)); break; - case IDC_DEFAULTS: + case IDC_CONFIG_DEFAULTS: if (MessageBox(hMainDlg, X264_DEF_TEXT, X264_NAME, MB_YESNO) == IDYES) { config_defaults(config); @@ -678,9 +995,9 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; - case IDC_USE_CMDLINE: - config->b_use_cmdline = IsDlgButtonChecked(hMainDlg, IDC_USE_CMDLINE); - EnableWindow(GetDlgItem(hMainDlg, IDC_CMDLINE), config->b_use_cmdline); + case IDC_CONFIG_USE_CMDLINE: + config->b_use_cmdline = IsDlgButtonChecked(hMainDlg, IDC_CONFIG_USE_CMDLINE); + EnableWindow(GetDlgItem(hMainDlg, IDC_CONFIG_CMDLINE), config->b_use_cmdline); break; default: @@ -691,8 +1008,8 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case EN_CHANGE: switch (LOWORD(wParam)) { - case IDC_CMDLINE: - if (GetDlgItemText(hMainDlg, IDC_CMDLINE, config->cmdline, MAX_CMDLINE) == 0) + case IDC_CONFIG_CMDLINE: + if (GetDlgItemText(hMainDlg, IDC_CONFIG_CMDLINE, config->cmdline, MAX_CMDLINE) == 0) strcpy(config->cmdline, ""); break; @@ -704,10 +1021,10 @@ BOOL CALLBACK callback_main(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case EN_KILLFOCUS: switch (LOWORD(wParam)) { - case IDC_CMDLINE: - if (GetDlgItemText(hMainDlg, IDC_CMDLINE, config->cmdline, MAX_CMDLINE) == 0) + case IDC_CONFIG_CMDLINE: + if (GetDlgItemText(hMainDlg, IDC_CONFIG_CMDLINE, config->cmdline, MAX_CMDLINE) == 0) strcpy(config->cmdline, ""); - SetDlgItemText(hMainDlg, IDC_CMDLINE, config->cmdline); + SetDlgItemText(hMainDlg, IDC_CONFIG_CMDLINE, config->cmdline); break; default: @@ -793,6 +1110,7 @@ void CheckControlTextIsNumber(HWND hDlgItem, BOOL bSigned, int iDecimalPlacesNum #define CHECKED_SET_INT(var, hDlg, nIDDlgItem, bSigned, min, max)\ {\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, 0);\ var = GetDlgItemInt(hDlg, nIDDlgItem, NULL, bSigned);\ if (var < min)\ {\ @@ -810,6 +1128,7 @@ void CheckControlTextIsNumber(HWND hDlgItem, BOOL bSigned, int iDecimalPlacesNum #define CHECKED_SET_MIN_INT(var, hDlg, nIDDlgItem, bSigned, min, max)\ {\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, 0);\ var = GetDlgItemInt(hDlg, nIDDlgItem, NULL, bSigned);\ if (var < min)\ {\ @@ -823,6 +1142,7 @@ void CheckControlTextIsNumber(HWND hDlgItem, BOOL bSigned, int iDecimalPlacesNum #define CHECKED_SET_MAX_INT(var, hDlg, nIDDlgItem, bSigned, min, max)\ {\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, 0);\ var = GetDlgItemInt(hDlg, nIDDlgItem, NULL, bSigned);\ if (var < min)\ var = min;\ @@ -836,6 +1156,7 @@ void CheckControlTextIsNumber(HWND hDlgItem, BOOL bSigned, int iDecimalPlacesNum #define CHECKED_SET_SHOW_INT(var, hDlg, nIDDlgItem, bSigned, min, max)\ {\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, 0);\ var = GetDlgItemInt(hDlg, nIDDlgItem, NULL, bSigned);\ if (var < min)\ var = min;\ @@ -844,6 +1165,63 @@ void CheckControlTextIsNumber(HWND hDlgItem, BOOL bSigned, int iDecimalPlacesNum SetDlgItemInt(hDlg, nIDDlgItem, var, bSigned);\ } +#define CHECKED_SET_FLOAT(var, hDlg, nIDDlgItem, bSigned, min, max, iDecimalPlacesNum, format)\ +{\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, iDecimalPlacesNum);\ + var = GetDlgItemDouble(hDlg, nIDDlgItem);\ + if (var < min)\ + {\ + var = min;\ + SetDlgItemDouble(hDlg, nIDDlgItem, var, format);\ + SendMessage(GetDlgItem(hDlg, nIDDlgItem), EM_SETSEL, -2, -2);\ + }\ + else if (var > max)\ + {\ + var = max;\ + SetDlgItemDouble(hDlg, nIDDlgItem, var, format);\ + SendMessage(GetDlgItem(hDlg, nIDDlgItem), EM_SETSEL, -2, -2);\ + }\ +} + +#define CHECKED_SET_MIN_FLOAT(var, hDlg, nIDDlgItem, bSigned, min, max, iDecimalPlacesNum, format)\ +{\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, iDecimalPlacesNum);\ + var = GetDlgItemDouble(hDlg, nIDDlgItem);\ + if (var < min)\ + {\ + var = min;\ + SetDlgItemDouble(hDlg, nIDDlgItem, var, format);\ + SendMessage(GetDlgItem(hDlg, nIDDlgItem), EM_SETSEL, -2, -2);\ + }\ + else if (var > max)\ + var = max;\ +} + +#define CHECKED_SET_MAX_FLOAT(var, hDlg, nIDDlgItem, bSigned, min, max, iDecimalPlacesNum, format)\ +{\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, iDecimalPlacesNum);\ + var = GetDlgItemDouble(hDlg, nIDDlgItem);\ + if (var < min)\ + var = min;\ + else if (var > max)\ + {\ + var = max;\ + SetDlgItemDouble(hDlg, nIDDlgItem, var, format);\ + SendMessage(GetDlgItem(hDlg, nIDDlgItem), EM_SETSEL, -2, -2);\ + }\ +} + +#define CHECKED_SET_SHOW_FLOAT(var, hDlg, nIDDlgItem, bSigned, min, max, iDecimalPlacesNum, format)\ +{\ + CheckControlTextIsNumber(GetDlgItem(hDlg, nIDDlgItem), bSigned, iDecimalPlacesNum);\ + var = GetDlgItemDouble(hDlg, nIDDlgItem);\ + if (var < min)\ + var = min;\ + else if (var > max)\ + var = max;\ + SetDlgItemDouble(hDlg, nIDDlgItem, var, format);\ +} + BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CONFIG *config = (CONFIG *)GetWindowLong(hDlg, GWL_USERDATA); @@ -864,10 +1242,10 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case LBN_SELCHANGE: switch (LOWORD(wParam)) { - case IDC_BITRATEMODE: + case IDC_MAIN_RC_MODE: config->i_pass = 1; config->b_fast1pass = FALSE; - switch (SendDlgItemMessage(hTabs[0], IDC_BITRATEMODE, CB_GETCURSEL, 0, 0)) + switch (SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_MODE, CB_GETCURSEL, 0, 0)) { case 0: config->i_encoding_type = 0; @@ -906,40 +1284,93 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) b_tabs_updated = FALSE; tabs_update_items(config); - /* Ugly hack for fixing visualization bug of IDC_BITRATESLIDER */ - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATESLIDER), FALSE); - ShowWindow(GetDlgItem(hTabs[0], IDC_BITRATESLIDER), config->i_encoding_type > 0); + /* Ugly hack for fixing visualization bug of IDC_MAIN_RC_VAL_SLIDER */ + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL_SLIDER), FALSE); + ShowWindow(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL_SLIDER), config->i_encoding_type > 0); b_tabs_updated = TRUE; break; - case IDC_DIRECTPRED: - config->i_direct_mv_pred = SendDlgItemMessage(hTabs[2], IDC_DIRECTPRED, CB_GETCURSEL, 0, 0); + case IDC_MISC_LEVEL: + config->i_avc_level = SendDlgItemMessage(hTabs[0], IDC_MISC_LEVEL, CB_GETCURSEL, 0, 0); break; - case IDC_SUBPEL: - config->i_subpel_refine = SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_GETCURSEL, 0, 0); + case IDC_DEBUG_LOG_LEVEL: + config->i_log_level = SendDlgItemMessage(hTabs[0], IDC_DEBUG_LOG_LEVEL, CB_GETCURSEL, 0, 0); break; - case IDC_ME_METHOD: - config->i_me_method = SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_GETCURSEL, 0, 0); + case IDC_VFW_FOURCC: + config->i_fcc_num = SendDlgItemMessage(hTabs[0], IDC_VFW_FOURCC, CB_GETCURSEL, 0, 0); + config->i_fcc_num = X264_CLIP(config->i_fcc_num, 0, sizeof(fcc_str_table) / sizeof(fourcc_str) - 1); + strcpy(config->fcc, fcc_str_table[config->i_fcc_num]); break; - case IDC_LOG: - config->i_log_level = SendDlgItemMessage(hTabs[3], IDC_LOG, CB_GETCURSEL, 0, 0); + case IDC_ANALYSIS_ME: + config->i_me_method = SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_ME, CB_GETCURSEL, 0, 0); break; - case IDC_FOURCC: - config->i_fcc_num = SendDlgItemMessage(hTabs[3], IDC_FOURCC, CB_GETCURSEL, 0, 0); - if (config->i_fcc_num < 0) - { - config->i_fcc_num = 0; - } - else if (config->i_fcc_num > sizeof(fcc_str_table) / sizeof(fourcc_str) - 1) - { - config->i_fcc_num = sizeof(fcc_str_table) / sizeof(fourcc_str) - 1; - } - strcpy(config->fcc, fcc_str_table[config->i_fcc_num]); + case IDC_ANALYSIS_SUBME: + config->i_subpel_refine = SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_SUBME, CB_GETCURSEL, 0, 0); + break; + + case IDC_ANALYSIS_B_ADAPT: + config->i_bframe_adaptive = SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_B_ADAPT, CB_GETCURSEL, 0, 0); + break; + + case IDC_ANALYSIS_DIRECT: + config->i_direct_mv_pred = SendDlgItemMessage(hTabs[1], IDC_ANALYSIS_DIRECT, CB_GETCURSEL, 0, 0); + break; + + case IDC_ENC_INTERLACED: + config->i_interlaced = SendDlgItemMessage(hTabs[1], IDC_ENC_INTERLACED, CB_GETCURSEL, 0, 0); + break; + + case IDC_ENC_TRELLIS: + config->i_trellis = SendDlgItemMessage(hTabs[1], IDC_ENC_TRELLIS, CB_GETCURSEL, 0, 0); + break; + + case IDC_ENC_CQM: + config->i_cqm = SendDlgItemMessage(hTabs[1], IDC_ENC_CQM, CB_GETCURSEL, 0, 0); + break; + + case IDC_AQ_MODE: + config->i_aq_mode = SendDlgItemMessage(hTabs[2], IDC_AQ_MODE, CB_GETCURSEL, 0, 0); + break; + +#if X264_PATCH_VAQ_MOD + case IDC_AQ_METRIC: + config->i_aq_metric = SendDlgItemMessage(hTabs[2], IDC_AQ_METRIC, CB_GETCURSEL, 0, 0); + break; +#endif + + case IDC_VUI_OVERSCAN: + config->i_overscan = SendDlgItemMessage(hTabs[2], IDC_VUI_OVERSCAN, CB_GETCURSEL, 0, 0); + config->i_overscan = VUI_loc2abs(config->i_overscan, overscan); + break; + + case IDC_VUI_VIDEOFORMAT: + config->i_vidformat = SendDlgItemMessage(hTabs[2], IDC_VUI_VIDEOFORMAT, CB_GETCURSEL, 0, 0); + config->i_vidformat = VUI_loc2abs(config->i_vidformat, vidformat); + break; + + case IDC_VUI_FULLRANGE: + config->i_fullrange = SendDlgItemMessage(hTabs[2], IDC_VUI_FULLRANGE, CB_GETCURSEL, 0, 0); + config->i_fullrange = VUI_loc2abs(config->i_fullrange, fullrange); + break; + + case IDC_VUI_COLORPRIM: + config->i_colorprim = SendDlgItemMessage(hTabs[2], IDC_VUI_COLORPRIM, CB_GETCURSEL, 0, 0); + config->i_colorprim = VUI_loc2abs(config->i_colorprim, colorprim); + break; + + case IDC_VUI_TRANSFER: + config->i_transfer = SendDlgItemMessage(hTabs[2], IDC_VUI_TRANSFER, CB_GETCURSEL, 0, 0); + config->i_transfer = VUI_loc2abs(config->i_transfer, transfer); + break; + + case IDC_VUI_COLORMATRIX: + config->i_colmatrix = SendDlgItemMessage(hTabs[2], IDC_VUI_COLORMATRIX, CB_GETCURSEL, 0, 0); + config->i_colmatrix = VUI_loc2abs(config->i_colmatrix, colmatrix); break; default: @@ -950,108 +1381,155 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case BN_CLICKED: switch (LOWORD(wParam)) { - case IDC_UPDATESTATS: - config->b_updatestats = IsDlgButtonChecked(hTabs[0], IDC_UPDATESTATS); + case IDC_MAIN_STATS_UPDATE: + config->b_updatestats = IsDlgButtonChecked(hTabs[0], IDC_MAIN_STATS_UPDATE); break; - case IDC_STATSFILE_BROWSE: - { - OPENFILENAME ofn; - char tmp[MAX_STATS_SIZE]; + case IDC_MAIN_STATS_BROWSE: + { + OPENFILENAME ofn; + char tmp[MAX_STATS_SIZE]; - GetDlgItemText(hTabs[0], IDC_STATSFILE, tmp, MAX_STATS_SIZE); + GetDlgItemText(hTabs[0], IDC_MAIN_STATS, tmp, MAX_STATS_SIZE); - memset(&ofn, 0, sizeof(OPENFILENAME)); - ofn.lStructSize = sizeof(OPENFILENAME); + memset(&ofn, 0, sizeof(OPENFILENAME)); + ofn.lStructSize = sizeof(OPENFILENAME); - ofn.hwndOwner = hMainDlg; - ofn.lpstrFilter = "Statsfile (*.stats)\0*.stats\0All files (*.*)\0*.*\0\0"; - ofn.lpstrFile = tmp; - ofn.nMaxFile = MAX_STATS_SIZE; - ofn.Flags = OFN_PATHMUSTEXIST; + ofn.hwndOwner = hMainDlg; + ofn.lpstrFilter = "Stats files (*.stats)\0*.stats\0All files (*.*)\0*.*\0\0"; + ofn.lpstrFile = tmp; + ofn.nMaxFile = MAX_STATS_SIZE; + ofn.Flags = OFN_PATHMUSTEXIST; - if (config->i_pass <= 1) - ofn.Flags |= OFN_OVERWRITEPROMPT; - else - ofn.Flags |= OFN_FILEMUSTEXIST; + if (config->i_pass <= 1) + ofn.Flags |= OFN_OVERWRITEPROMPT; + else + ofn.Flags |= OFN_FILEMUSTEXIST; - if ((config->i_pass <= 1 && GetSaveFileName(&ofn)) || - (config->i_pass > 1 && GetOpenFileName(&ofn))) - SetDlgItemText(hTabs[0], IDC_STATSFILE, tmp); - } + if ((config->i_pass <= 1 && GetSaveFileName(&ofn)) || + (config->i_pass > 1 && GetOpenFileName(&ofn))) + SetDlgItemText(hTabs[0], IDC_MAIN_STATS, tmp); break; + } + + case IDC_DEBUG_PSNR: + config->b_psnr = IsDlgButtonChecked(hTabs[0], IDC_DEBUG_PSNR); + break; + + case IDC_DEBUG_SSIM: + config->b_ssim = IsDlgButtonChecked(hTabs[0], IDC_DEBUG_SSIM); + break; + + case IDC_DEBUG_NO_ASM: + config->b_no_asm = IsDlgButtonChecked(hTabs[0], IDC_DEBUG_NO_ASM); + break; + +#if X264VFW_USE_VIRTUALDUB_HACK + case IDC_VFW_VD_HACK: + config->b_vd_hack = IsDlgButtonChecked(hTabs[0], IDC_VFW_VD_HACK); + break; +#endif + +#if X264VFW_USE_DECODER + case IDC_VFW_DISABLE_DECODER: + config->b_disable_decoder = IsDlgButtonChecked(hTabs[0], IDC_VFW_DISABLE_DECODER); + break; +#endif - case IDC_DCT8X8: - config->b_dct8x8 = IsDlgButtonChecked(hTabs[2], IDC_DCT8X8); + case IDC_ANALYSIS_8X8DCT: + config->b_dct8x8 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_8X8DCT); break; - case IDC_I8X8: - config->b_i8x8 = IsDlgButtonChecked(hTabs[2], IDC_I8X8); + case IDC_ANALYSIS_I_I8X8: + config->b_intra_i8x8 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_I_I8X8); break; - case IDC_I4X4: - config->b_i4x4 = IsDlgButtonChecked(hTabs[2], IDC_I4X4); + case IDC_ANALYSIS_I_I4X4: + config->b_intra_i4x4 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_I_I4X4); break; - case IDC_P8X8: - config->b_psub16x16 = IsDlgButtonChecked(hTabs[2], IDC_P8X8); + case IDC_ANALYSIS_PB_I8X8: + config->b_i8x8 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_PB_I8X8); break; - case IDC_P4X4: - config->b_psub8x8 = IsDlgButtonChecked(hTabs[2], IDC_P4X4); + case IDC_ANALYSIS_PB_I4X4: + config->b_i4x4 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_PB_I4X4); break; - case IDC_B8X8: - config->b_bsub16x16 = IsDlgButtonChecked(hTabs[2], IDC_B8X8); + case IDC_ANALYSIS_PB_P8X8: + config->b_psub16x16 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_PB_P8X8); break; - case IDC_VDHACK: - config->b_vd_hack = IsDlgButtonChecked(hTabs[2], IDC_VDHACK); + case IDC_ANALYSIS_PB_P4X4: + config->b_psub8x8 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_PB_P4X4); break; - case IDC_BADAPT: - config->b_bframe_adaptive = IsDlgButtonChecked(hTabs[2], IDC_BADAPT); + case IDC_ANALYSIS_PB_B8X8: + config->b_bsub16x16 = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_PB_B8X8); break; - case IDC_BREFS: - config->b_b_refs = IsDlgButtonChecked(hTabs[2], IDC_BREFS); + case IDC_ANALYSIS_FAST_PSKIP: + config->b_fast_pskip = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_FAST_PSKIP); break; - case IDC_WBPRED: - config->b_b_wpred = IsDlgButtonChecked(hTabs[2], IDC_WBPRED); + case IDC_ANALYSIS_MIXED_REFS: + config->b_mixedref = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_MIXED_REFS); break; - case IDC_BIDIR_ME: - config->b_bidir_me = IsDlgButtonChecked(hTabs[2], IDC_BIDIR_ME); + case IDC_ANALYSIS_CHROMA_ME: + config->b_chroma_me = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_CHROMA_ME); break; - case IDC_BRDO: - config->b_brdo = IsDlgButtonChecked(hTabs[3], IDC_BRDO); + case IDC_ANALYSIS_PRE_SCENECUT: + config->b_pre_scenecut = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_PRE_SCENECUT); break; - case IDC_CHROMAME: - config->b_chroma_me = IsDlgButtonChecked(hTabs[3], IDC_CHROMAME); + case IDC_ANALYSIS_B_PYRAMID: + config->b_b_refs = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_B_PYRAMID); break; - case IDC_MIXEDREF: - config->b_mixedref = IsDlgButtonChecked(hTabs[3], IDC_MIXEDREF); + case IDC_ANALYSIS_WEIGHTB: + config->b_b_wpred = IsDlgButtonChecked(hTabs[1], IDC_ANALYSIS_WEIGHTB); break; - case IDC_CABAC: - config->b_cabac = IsDlgButtonChecked(hTabs[3], IDC_CABAC); + case IDC_ENC_DEBLOCK: + config->b_filter = IsDlgButtonChecked(hTabs[1], IDC_ENC_DEBLOCK); break; - case IDC_TRELLIS: - config->i_trellis = IsDlgButtonChecked(hTabs[3], IDC_TRELLIS); + case IDC_ENC_CABAC: + config->b_cabac = IsDlgButtonChecked(hTabs[1], IDC_ENC_CABAC); break; - case IDC_LOOPFILTER: - config->b_filter = IsDlgButtonChecked(hTabs[3], IDC_LOOPFILTER); + case IDC_ENC_DCT_DECIMATE: + config->b_dct_decimate = IsDlgButtonChecked(hTabs[1], IDC_ENC_DCT_DECIMATE); break; - case IDC_INTERLACED: - config->b_interlaced = IsDlgButtonChecked(hTabs[3], IDC_INTERLACED); + case IDC_ENC_CQMFILE_BROWSE: + { + OPENFILENAME ofn; + char tmp[MAX_PATH]; + + GetDlgItemText(hTabs[1], IDC_ENC_CQMFILE, tmp, MAX_PATH); + + memset(&ofn, 0, sizeof(OPENFILENAME)); + ofn.lStructSize = sizeof(OPENFILENAME); + + ofn.hwndOwner = hMainDlg; + ofn.lpstrFilter = "Custom quant matrices files (*.cfg)\0*.cfg\0All files (*.*)\0*.*\0\0"; + ofn.lpstrFile = tmp; + ofn.nMaxFile = MAX_PATH; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + + if (GetOpenFileName(&ofn)) + SetDlgItemText(hTabs[1], IDC_ENC_CQMFILE, tmp); break; + } + +#if X264VFW_USE_THREADS + case IDC_MT_DETERMINISTIC: + config->b_mt_deterministic = IsDlgButtonChecked(hTabs[2], IDC_MT_DETERMINISTIC); + break; +#endif default: return FALSE; @@ -1061,37 +1539,35 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case EN_CHANGE: switch (LOWORD(wParam)) { - case IDC_BITRATEEDIT: + case IDC_MAIN_RC_VAL: switch (config->i_encoding_type) { case 0: break; case 1: - CheckControlTextIsNumber(GetDlgItem(hTabs[0], IDC_BITRATEEDIT), FALSE, 0); - CHECKED_SET_MAX_INT(config->i_qp, hTabs[0], IDC_BITRATEEDIT, FALSE, 1, X264_QUANT_MAX); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_qp); + CHECKED_SET_MAX_INT(config->i_qp, hTabs[0], IDC_MAIN_RC_VAL, FALSE, 1, X264_QUANT_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_qp); break; case 2: - CheckControlTextIsNumber(GetDlgItem(hTabs[0], IDC_BITRATEEDIT), FALSE, 1); - config->i_rf_constant = (int)(GetDlgItemDouble(hTabs[0], IDC_BITRATEEDIT) * 10); + CheckControlTextIsNumber(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL), FALSE, 1); + config->i_rf_constant = (int)(GetDlgItemDouble(hTabs[0], IDC_MAIN_RC_VAL) * 10); if (config->i_rf_constant < 10) config->i_rf_constant = 10; else if (config->i_rf_constant > X264_QUANT_MAX * 10) { config->i_rf_constant = X264_QUANT_MAX * 10; - SetDlgItemDouble(hTabs[0], IDC_BITRATEEDIT, config->i_rf_constant * 0.1); - SendMessage(GetDlgItem(hTabs[0], IDC_BITRATEEDIT), EM_SETSEL, -2, -2); + SetDlgItemDouble(hTabs[0], IDC_MAIN_RC_VAL, config->i_rf_constant * 0.1, "%.1f"); + SendMessage(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL), EM_SETSEL, -2, -2); } - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_rf_constant); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_rf_constant); break; case 3: case 4: - CheckControlTextIsNumber(GetDlgItem(hTabs[0], IDC_BITRATEEDIT), FALSE, 0); - CHECKED_SET_MAX_INT(config->i_passbitrate, hTabs[0], IDC_BITRATEEDIT, FALSE, 1, X264_BITRATE_MAX); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); + CHECKED_SET_MAX_INT(config->i_passbitrate, hTabs[0], IDC_MAIN_RC_VAL, FALSE, 1, X264_BITRATE_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); break; default: @@ -1100,85 +1576,181 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; - case IDC_STATSFILE: - if (GetDlgItemText(hTabs[0], IDC_STATSFILE, config->stats, MAX_STATS_PATH) == 0) + case IDC_MAIN_STATS: + if (GetDlgItemText(hTabs[0], IDC_MAIN_STATS, config->stats, MAX_STATS_PATH) == 0) strcpy(config->stats, ".\\x264.stats"); break; - case IDC_EXTRA_CMDLINE: - if (GetDlgItemText(hTabs[0], IDC_EXTRA_CMDLINE, config->extra_cmdline, MAX_CMDLINE) == 0) + case IDC_MAIN_EXTRA_CMDLINE: + if (GetDlgItemText(hTabs[0], IDC_MAIN_EXTRA_CMDLINE, config->extra_cmdline, MAX_CMDLINE) == 0) strcpy(config->extra_cmdline, ""); break; - case IDC_IPRATIO: - CHECKED_SET_MAX_INT(config->i_key_boost, hTabs[1], IDC_IPRATIO, FALSE, 0, 100); + case IDC_MISC_SAR_W: + CHECKED_SET_MAX_INT(config->i_sar_width, hTabs[0], IDC_MISC_SAR_W, FALSE, 1, 9999); + break; + + case IDC_MISC_SAR_H: + CHECKED_SET_MAX_INT(config->i_sar_height, hTabs[0], IDC_MISC_SAR_H, FALSE, 1, 9999); + break; + + case IDC_ANALYSIS_REF: + CHECKED_SET_MAX_INT(config->i_refmax, hTabs[1], IDC_ANALYSIS_REF, FALSE, 1, 16); + break; + + case IDC_ANALYSIS_MERANGE: + CHECKED_SET_MAX_INT(config->i_me_range, hTabs[1], IDC_ANALYSIS_MERANGE, FALSE, 4, 64); + break; + + case IDC_ANALYSIS_PSY_RDO: + CHECKED_SET_MAX_FLOAT(config->f_psy_rdo, hTabs[1], IDC_ANALYSIS_PSY_RDO, FALSE, 0.00, 1000.00, 2, "%.2f"); + break; + + case IDC_ANALYSIS_MIN_KEYINT: + CHECKED_SET_MAX_INT(config->i_keyint_min, hTabs[1], IDC_ANALYSIS_MIN_KEYINT, FALSE, 1, config->i_keyint_max); + break; + + case IDC_ANALYSIS_KEYINT: + CHECKED_SET_MAX_INT(config->i_keyint_max, hTabs[1], IDC_ANALYSIS_KEYINT, FALSE, config->i_keyint_min, 9999); + break; + + case IDC_ANALYSIS_SCENECUT: + CHECKED_SET_INT(config->i_scenecut_threshold, hTabs[1], IDC_ANALYSIS_SCENECUT, TRUE, -1, 100); + break; + + case IDC_ANALYSIS_BFRAMES: + CHECKED_SET_MAX_INT(config->i_bframe, hTabs[1], IDC_ANALYSIS_BFRAMES, FALSE, 0, X264_BFRAME_MAX); + break; + + case IDC_ANALYSIS_B_BIAS: + CHECKED_SET_INT(config->i_bframe_bias, hTabs[1], IDC_ANALYSIS_B_BIAS, TRUE, -90, 100); + break; + + case IDC_ENC_DEBLOCK_A: + CHECKED_SET_INT(config->i_inloop_a, hTabs[1], IDC_ENC_DEBLOCK_A, TRUE, -6, 6); + break; + + case IDC_ENC_DEBLOCK_B: + CHECKED_SET_INT(config->i_inloop_b, hTabs[1], IDC_ENC_DEBLOCK_B, TRUE, -6, 6); + break; + + case IDC_ENC_NR: + CHECKED_SET_MAX_INT(config->i_noise_reduction, hTabs[1], IDC_ENC_NR, FALSE, 0, 9999); + break; + + case IDC_ENC_DEADZONE_INTRA: + CHECKED_SET_MAX_INT(config->i_intra_deadzone, hTabs[1], IDC_ENC_DEADZONE_INTRA, FALSE, 0, 32); + break; + + case IDC_ENC_DEADZONE_INTER: + CHECKED_SET_MAX_INT(config->i_inter_deadzone, hTabs[1], IDC_ENC_DEADZONE_INTER, FALSE, 0, 32); + break; + + case IDC_ENC_CQMFILE: + if (GetDlgItemText(hTabs[1], IDC_ENC_CQMFILE, config->cqmfile, MAX_PATH) == 0) + strcpy(config->cqmfile, ""); + break; + + case IDC_ENC_PSY_TRELLIS: + CHECKED_SET_MAX_FLOAT(config->f_psy_trellis, hTabs[1], IDC_ENC_PSY_TRELLIS, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_PBRATIO: - CHECKED_SET_MAX_INT(config->i_b_red, hTabs[1], IDC_PBRATIO, FALSE, 0, 100); + case IDC_RC_VBV_MAXRATE: + CHECKED_SET_MAX_INT(config->i_vbv_maxrate, hTabs[2], IDC_RC_VBV_MAXRATE, FALSE, 0, 999999); break; - case IDC_CURVECOMP: - CHECKED_SET_MAX_INT(config->i_curve_comp, hTabs[1], IDC_CURVECOMP, FALSE, 0, 100); + case IDC_RC_VBV_BUFSIZE: + CHECKED_SET_MAX_INT(config->i_vbv_bufsize, hTabs[2], IDC_RC_VBV_BUFSIZE, FALSE, 0, 999999); break; - case IDC_QPMIN: - CHECKED_SET_MAX_INT(config->i_qp_min, hTabs[1], IDC_QPMIN, FALSE, 0, config->i_qp_max); + case IDC_RC_VBV_INIT: + CHECKED_SET_MAX_INT(config->i_vbv_occupancy, hTabs[2], IDC_RC_VBV_INIT, FALSE, 0, 100); break; - case IDC_QPMAX: - CHECKED_SET_MAX_INT(config->i_qp_max, hTabs[1], IDC_QPMAX, FALSE, config->i_qp_min, X264_QUANT_MAX); + case IDC_RC_QPMIN: + CHECKED_SET_MAX_INT(config->i_qp_min, hTabs[2], IDC_RC_QPMIN, FALSE, 1, config->i_qp_max); break; - case IDC_QPSTEP: - CHECKED_SET_MAX_INT(config->i_qp_step, hTabs[1], IDC_QPSTEP, FALSE, 1, X264_QUANT_MAX); + case IDC_RC_QPMAX: + CHECKED_SET_MAX_INT(config->i_qp_max, hTabs[2], IDC_RC_QPMAX, FALSE, config->i_qp_min, X264_QUANT_MAX); break; - case IDC_SCENECUT: - CheckControlTextIsNumber(GetDlgItem(hTabs[1], IDC_SCENECUT), TRUE, 0); - CHECKED_SET_INT(config->i_scenecut_threshold, hTabs[1], IDC_SCENECUT, TRUE, -1, 100); + case IDC_RC_QPSTEP: + CHECKED_SET_MAX_INT(config->i_qp_step, hTabs[2], IDC_RC_QPSTEP, FALSE, 1, X264_QUANT_MAX); break; - case IDC_KEYINTMIN: - CHECKED_SET_MAX_INT(config->i_keyint_min, hTabs[1], IDC_KEYINTMIN, FALSE, 1, config->i_keyint_max); + case IDC_RC_IPRATIO: + CHECKED_SET_MAX_FLOAT(config->f_ipratio, hTabs[2], IDC_RC_IPRATIO, FALSE, 1.00, 1000.00, 2, "%.2f"); break; - case IDC_KEYINTMAX: - CHECKED_SET_MAX_INT(config->i_keyint_max, hTabs[1], IDC_KEYINTMAX, FALSE, config->i_keyint_min, 9999); + case IDC_RC_PBRATIO: + CHECKED_SET_MAX_FLOAT(config->f_pbratio, hTabs[2], IDC_RC_PBRATIO, FALSE, 1.00, 1000.00, 2, "%.2f"); break; - case IDC_BFRAME: - CHECKED_SET_MAX_INT(config->i_bframe, hTabs[2], IDC_BFRAME, FALSE, 0, X264_BFRAME_MAX); + case IDC_RC_CHROMA_QP_OFFSET: + CHECKED_SET_INT(config->i_chroma_qp_offset, hTabs[2], IDC_RC_CHROMA_QP_OFFSET, TRUE, -12, 12); break; - case IDC_BBIAS: - CheckControlTextIsNumber(GetDlgItem(hTabs[2], IDC_BBIAS), TRUE, 0); - CHECKED_SET_INT(config->i_bframe_bias, hTabs[2], IDC_BBIAS, TRUE, -90, 100); - SendDlgItemMessage(hTabs[2], IDC_BBIASSLIDER, TBM_SETPOS, TRUE, config->i_bframe_bias); + case IDC_RC_QCOMP: + CHECKED_SET_MAX_FLOAT(config->f_qcomp, hTabs[2], IDC_RC_QCOMP, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_MERANGE: - CHECKED_SET_MAX_INT(config->i_me_range, hTabs[3], IDC_MERANGE, FALSE, 4, 64); + case IDC_RC_CPLXBLUR: + CHECKED_SET_MAX_FLOAT(config->f_cplxblur, hTabs[2], IDC_RC_CPLXBLUR, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_FRAMEREFS: - CHECKED_SET_MAX_INT(config->i_refmax, hTabs[3], IDC_FRAMEREFS, FALSE, 1, 16); + case IDC_RC_QBLUR: + CHECKED_SET_MAX_FLOAT(config->f_qblur, hTabs[2], IDC_RC_QBLUR, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_SAR_W: - CHECKED_SET_MAX_INT(config->i_sar_width, hTabs[3], IDC_SAR_W, FALSE, 1, 9999); + case IDC_RC_RATETOL: + CHECKED_SET_MAX_FLOAT(config->f_ratetol, hTabs[2], IDC_RC_RATETOL, FALSE, 0.01, 1000.00, 2, "%.2f"); break; - case IDC_SAR_H: - CHECKED_SET_MAX_INT(config->i_sar_height, hTabs[3], IDC_SAR_H, FALSE, 1, 9999); + case IDC_AQ_STRENGTH: + CHECKED_SET_MAX_FLOAT(config->f_aq_strength, hTabs[2], IDC_AQ_STRENGTH, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_THREADEDIT: - CHECKED_SET_MAX_INT(config->i_threads, hTabs[3], IDC_THREADEDIT, FALSE, 0, X264_THREAD_MAX); +#if X264_PATCH_VAQ_MOD + case IDC_AQ_SENSITIVITY: + CHECKED_SET_MAX_FLOAT(config->f_aq_sensitivity, hTabs[2], IDC_AQ_SENSITIVITY, FALSE, 0.00, 1000.00, 2, "%.2f"); break; +#endif - case IDC_NR: - CHECKED_SET_MAX_INT(config->i_noise_reduction, hTabs[3], IDC_NR, FALSE, 0, 9999); +#if X264VFW_USE_THREADS +#if !X264_PATCH_THREAD_POOL + case IDC_MT_THREADS: + CHECKED_SET_MAX_INT(config->i_threads, hTabs[2], IDC_MT_THREADS, FALSE, 0, X264_THREAD_MAX); + break; +#else + case IDC_MT_THREADS: + if (config->i_thread_queue == 0) + { + CHECKED_SET_MAX_INT(config->i_threads, hTabs[2], IDC_MT_THREADS, FALSE, 0, X264_THREAD_MAX); + } + else + { + CHECKED_SET_MAX_INT(config->i_threads, hTabs[2], IDC_MT_THREADS, FALSE, 0, config->i_thread_queue); + } + break; + + case IDC_MT_THREAD_QUEUE: + CheckControlTextIsNumber(GetDlgItem(hTabs[2], IDC_MT_THREAD_QUEUE), FALSE, 0); + config->i_thread_queue = GetDlgItemInt(hTabs[2], IDC_MT_THREAD_QUEUE, NULL, FALSE); + if (config->i_thread_queue < config->i_threads && config->i_thread_queue != 0) + config->i_thread_queue = 0; + else if (config->i_thread_queue > X264_THREAD_MAX) + { + config->i_thread_queue = X264_THREAD_MAX; + SetDlgItemInt(hTabs[2], IDC_MT_THREAD_QUEUE, config->i_thread_queue, FALSE); + SendMessage(GetDlgItem(hTabs[2], IDC_MT_THREAD_QUEUE), EM_SETSEL, -2, -2); + } + break; +#endif +#endif + + case IDC_VUI_CHROMALOC: + CHECKED_SET_MAX_INT(config->i_chromaloc, hTabs[2], IDC_VUI_CHROMALOC, FALSE, 0, 5); break; default: @@ -1189,31 +1761,32 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case EN_KILLFOCUS: switch (LOWORD(wParam)) { - case IDC_BITRATEEDIT: + case IDC_MAIN_RC_VAL: switch (config->i_encoding_type) { case 0: break; case 1: - CHECKED_SET_SHOW_INT(config->i_qp, hTabs[0], IDC_BITRATEEDIT, FALSE, 1, X264_QUANT_MAX); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_qp); + CHECKED_SET_SHOW_INT(config->i_qp, hTabs[0], IDC_MAIN_RC_VAL, FALSE, 1, X264_QUANT_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_qp); break; case 2: - config->i_rf_constant = (int)(GetDlgItemDouble(hTabs[0], IDC_BITRATEEDIT) * 10); + CheckControlTextIsNumber(GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL), FALSE, 1); + config->i_rf_constant = (int)(GetDlgItemDouble(hTabs[0], IDC_MAIN_RC_VAL) * 10); if (config->i_rf_constant < 10) config->i_rf_constant = 10; else if (config->i_rf_constant > X264_QUANT_MAX * 10) config->i_rf_constant = X264_QUANT_MAX * 10; - SetDlgItemDouble(hTabs[0], IDC_BITRATEEDIT, config->i_rf_constant * 0.1); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_rf_constant); + SetDlgItemDouble(hTabs[0], IDC_MAIN_RC_VAL, config->i_rf_constant * 0.1, "%.1f"); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_rf_constant); break; case 3: case 4: - CHECKED_SET_SHOW_INT(config->i_passbitrate, hTabs[0], IDC_BITRATEEDIT, FALSE, 1, X264_BITRATE_MAX); - SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); + CHECKED_SET_SHOW_INT(config->i_passbitrate, hTabs[0], IDC_MAIN_RC_VAL, FALSE, 1, X264_BITRATE_MAX); + SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_SETPOS, TRUE, config->i_passbitrate); break; default: @@ -1222,85 +1795,181 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; - case IDC_STATSFILE: - if (GetDlgItemText(hTabs[0], IDC_STATSFILE, config->stats, MAX_STATS_PATH) == 0) + case IDC_MAIN_STATS: + if (GetDlgItemText(hTabs[0], IDC_MAIN_STATS, config->stats, MAX_STATS_PATH) == 0) strcpy(config->stats, ".\\x264.stats"); - SetDlgItemText(hTabs[0], IDC_STATSFILE, config->stats); + SetDlgItemText(hTabs[0], IDC_MAIN_STATS, config->stats); break; - case IDC_EXTRA_CMDLINE: - if (GetDlgItemText(hTabs[0], IDC_EXTRA_CMDLINE, config->extra_cmdline, MAX_CMDLINE) == 0) + case IDC_MAIN_EXTRA_CMDLINE: + if (GetDlgItemText(hTabs[0], IDC_MAIN_EXTRA_CMDLINE, config->extra_cmdline, MAX_CMDLINE) == 0) strcpy(config->extra_cmdline, ""); - SetDlgItemText(hTabs[0], IDC_EXTRA_CMDLINE, config->extra_cmdline); + SetDlgItemText(hTabs[0], IDC_MAIN_EXTRA_CMDLINE, config->extra_cmdline); + break; + + case IDC_MISC_SAR_W: + CHECKED_SET_SHOW_INT(config->i_sar_width, hTabs[0], IDC_MISC_SAR_W, FALSE, 1, 9999); + break; + + case IDC_MISC_SAR_H: + CHECKED_SET_SHOW_INT(config->i_sar_height, hTabs[0], IDC_MISC_SAR_H, FALSE, 1, 9999); + break; + + case IDC_ANALYSIS_REF: + CHECKED_SET_SHOW_INT(config->i_refmax, hTabs[1], IDC_ANALYSIS_REF, FALSE, 1, 16); + break; + + case IDC_ANALYSIS_MERANGE: + CHECKED_SET_SHOW_INT(config->i_me_range, hTabs[1], IDC_ANALYSIS_MERANGE, FALSE, 4, 64); + break; + + case IDC_ANALYSIS_PSY_RDO: + CHECKED_SET_SHOW_FLOAT(config->f_psy_rdo, hTabs[1], IDC_ANALYSIS_PSY_RDO, FALSE, 0.00, 1000.00, 2, "%.2f"); + break; + + case IDC_ANALYSIS_MIN_KEYINT: + CHECKED_SET_SHOW_INT(config->i_keyint_min, hTabs[1], IDC_ANALYSIS_MIN_KEYINT, FALSE, 1, config->i_keyint_max); + break; + + case IDC_ANALYSIS_KEYINT: + CHECKED_SET_SHOW_INT(config->i_keyint_max, hTabs[1], IDC_ANALYSIS_KEYINT, FALSE, config->i_keyint_min, 9999); + break; + + case IDC_ANALYSIS_SCENECUT: + CHECKED_SET_SHOW_INT(config->i_scenecut_threshold, hTabs[1], IDC_ANALYSIS_SCENECUT, TRUE, -1, 100); + break; + + case IDC_ANALYSIS_BFRAMES: + CHECKED_SET_SHOW_INT(config->i_bframe, hTabs[1], IDC_ANALYSIS_BFRAMES, FALSE, 0, X264_BFRAME_MAX); + break; + + case IDC_ANALYSIS_B_BIAS: + CHECKED_SET_SHOW_INT(config->i_bframe_bias, hTabs[1], IDC_ANALYSIS_B_BIAS, TRUE, -90, 100); + break; + + case IDC_ENC_DEBLOCK_A: + CHECKED_SET_SHOW_INT(config->i_inloop_a, hTabs[1], IDC_ENC_DEBLOCK_A, TRUE, -6, 6); + break; + + case IDC_ENC_DEBLOCK_B: + CHECKED_SET_SHOW_INT(config->i_inloop_b, hTabs[1], IDC_ENC_DEBLOCK_B, TRUE, -6, 6); + break; + + case IDC_ENC_NR: + CHECKED_SET_SHOW_INT(config->i_noise_reduction, hTabs[1], IDC_ENC_NR, FALSE, 0, 9999); + break; + + case IDC_ENC_DEADZONE_INTRA: + CHECKED_SET_SHOW_INT(config->i_intra_deadzone, hTabs[1], IDC_ENC_DEADZONE_INTRA, FALSE, 0, 32); break; - case IDC_IPRATIO: - CHECKED_SET_SHOW_INT(config->i_key_boost, hTabs[1], IDC_IPRATIO, FALSE, 0, 100); + case IDC_ENC_DEADZONE_INTER: + CHECKED_SET_SHOW_INT(config->i_inter_deadzone, hTabs[1], IDC_ENC_DEADZONE_INTER, FALSE, 0, 32); break; - case IDC_PBRATIO: - CHECKED_SET_SHOW_INT(config->i_b_red, hTabs[1], IDC_PBRATIO, FALSE, 0, 100); + case IDC_ENC_CQMFILE: + if (GetDlgItemText(hTabs[1], IDC_ENC_CQMFILE, config->cqmfile, MAX_PATH) == 0) + strcpy(config->cqmfile, ""); + SetDlgItemText(hTabs[1], IDC_ENC_CQMFILE, config->cqmfile); break; - case IDC_CURVECOMP: - CHECKED_SET_SHOW_INT(config->i_curve_comp, hTabs[1], IDC_CURVECOMP, FALSE, 0, 100); + case IDC_ENC_PSY_TRELLIS: + CHECKED_SET_SHOW_FLOAT(config->f_psy_trellis, hTabs[1], IDC_ENC_PSY_TRELLIS, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_QPMIN: - CHECKED_SET_SHOW_INT(config->i_qp_min, hTabs[1], IDC_QPMIN, FALSE, 0, config->i_qp_max); + case IDC_RC_VBV_MAXRATE: + CHECKED_SET_SHOW_INT(config->i_vbv_maxrate, hTabs[2], IDC_RC_VBV_MAXRATE, FALSE, 0, 999999); break; - case IDC_QPMAX: - CHECKED_SET_SHOW_INT(config->i_qp_max, hTabs[1], IDC_QPMAX, FALSE, config->i_qp_min, X264_QUANT_MAX); + case IDC_RC_VBV_BUFSIZE: + CHECKED_SET_SHOW_INT(config->i_vbv_bufsize, hTabs[2], IDC_RC_VBV_BUFSIZE, FALSE, 0, 999999); break; - case IDC_QPSTEP: - CHECKED_SET_SHOW_INT(config->i_qp_step, hTabs[1], IDC_QPSTEP, FALSE, 1, X264_QUANT_MAX); + case IDC_RC_VBV_INIT: + CHECKED_SET_SHOW_INT(config->i_vbv_occupancy, hTabs[2], IDC_RC_VBV_INIT, FALSE, 0, 100); break; - case IDC_SCENECUT: - CHECKED_SET_SHOW_INT(config->i_scenecut_threshold, hTabs[1], IDC_SCENECUT, TRUE, -1, 100); + case IDC_RC_QPMIN: + CHECKED_SET_SHOW_INT(config->i_qp_min, hTabs[2], IDC_RC_QPMIN, FALSE, 1, config->i_qp_max); break; - case IDC_KEYINTMIN: - CHECKED_SET_SHOW_INT(config->i_keyint_min, hTabs[1], IDC_KEYINTMIN, FALSE, 1, config->i_keyint_max); + case IDC_RC_QPMAX: + CHECKED_SET_SHOW_INT(config->i_qp_max, hTabs[2], IDC_RC_QPMAX, FALSE, config->i_qp_min, X264_QUANT_MAX); break; - case IDC_KEYINTMAX: - CHECKED_SET_SHOW_INT(config->i_keyint_max, hTabs[1], IDC_KEYINTMAX, FALSE, config->i_keyint_min, 9999); + case IDC_RC_QPSTEP: + CHECKED_SET_SHOW_INT(config->i_qp_step, hTabs[2], IDC_RC_QPSTEP, FALSE, 1, X264_QUANT_MAX); break; - case IDC_BFRAME: - CHECKED_SET_SHOW_INT(config->i_bframe, hTabs[2], IDC_BFRAME, FALSE, 0, X264_BFRAME_MAX); + case IDC_RC_IPRATIO: + CHECKED_SET_SHOW_FLOAT(config->f_ipratio, hTabs[2], IDC_RC_IPRATIO, FALSE, 1.00, 1000.00, 2, "%.2f"); break; - case IDC_BBIAS: - CHECKED_SET_SHOW_INT(config->i_bframe_bias, hTabs[2], IDC_BBIAS, TRUE, -90, 100); - SendDlgItemMessage(hTabs[2], IDC_BBIASSLIDER, TBM_SETPOS, TRUE, config->i_bframe_bias); + case IDC_RC_PBRATIO: + CHECKED_SET_SHOW_FLOAT(config->f_pbratio, hTabs[2], IDC_RC_PBRATIO, FALSE, 1.00, 1000.00, 2, "%.2f"); break; - case IDC_MERANGE: - CHECKED_SET_SHOW_INT(config->i_me_range, hTabs[3], IDC_MERANGE, FALSE, 4, 64); + case IDC_RC_CHROMA_QP_OFFSET: + CHECKED_SET_SHOW_INT(config->i_chroma_qp_offset, hTabs[2], IDC_RC_CHROMA_QP_OFFSET, TRUE, -12, 12); break; - case IDC_FRAMEREFS: - CHECKED_SET_SHOW_INT(config->i_refmax, hTabs[3], IDC_FRAMEREFS, FALSE, 1, 16); + case IDC_RC_QCOMP: + CHECKED_SET_SHOW_FLOAT(config->f_qcomp, hTabs[2], IDC_RC_QCOMP, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_SAR_W: - CHECKED_SET_SHOW_INT(config->i_sar_width, hTabs[3], IDC_SAR_W, FALSE, 1, 9999); + case IDC_RC_CPLXBLUR: + CHECKED_SET_SHOW_FLOAT(config->f_cplxblur, hTabs[2], IDC_RC_CPLXBLUR, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_SAR_H: - CHECKED_SET_SHOW_INT(config->i_sar_height, hTabs[3], IDC_SAR_H, FALSE, 1, 9999); + case IDC_RC_QBLUR: + CHECKED_SET_SHOW_FLOAT(config->f_qblur, hTabs[2], IDC_RC_QBLUR, FALSE, 0.00, 1000.00, 2, "%.2f"); break; - case IDC_THREADEDIT: - CHECKED_SET_SHOW_INT(config->i_threads, hTabs[3], IDC_THREADEDIT, FALSE, 0, X264_THREAD_MAX); + case IDC_RC_RATETOL: + CHECKED_SET_SHOW_FLOAT(config->f_ratetol, hTabs[2], IDC_RC_RATETOL, FALSE, 0.01, 1000.00, 2, "%.2f"); break; - case IDC_NR: - CHECKED_SET_SHOW_INT(config->i_noise_reduction, hTabs[3], IDC_NR, FALSE, 0, 9999); + case IDC_AQ_STRENGTH: + CHECKED_SET_SHOW_FLOAT(config->f_aq_strength, hTabs[2], IDC_AQ_STRENGTH, FALSE, 0.00, 1000.00, 2, "%.2f"); + break; + +#if X264_PATCH_VAQ_MOD + case IDC_AQ_SENSITIVITY: + CHECKED_SET_SHOW_FLOAT(config->f_aq_sensitivity, hTabs[2], IDC_AQ_SENSITIVITY, FALSE, 0.00, 1000.00, 2, "%.2f"); + break; +#endif + +#if X264VFW_USE_THREADS +#if !X264_PATCH_THREAD_POOL + case IDC_MT_THREADS: + CHECKED_SET_SHOW_INT(config->i_threads, hTabs[2], IDC_MT_THREADS, FALSE, 0, X264_THREAD_MAX); + break; +#else + case IDC_MT_THREADS: + if (config->i_thread_queue == 0) + { + CHECKED_SET_SHOW_INT(config->i_threads, hTabs[2], IDC_MT_THREADS, FALSE, 0, X264_THREAD_MAX); + } + else + { + CHECKED_SET_SHOW_INT(config->i_threads, hTabs[2], IDC_MT_THREADS, FALSE, 0, config->i_thread_queue); + } + break; + + case IDC_MT_THREAD_QUEUE: + CheckControlTextIsNumber(GetDlgItem(hTabs[2], IDC_MT_THREAD_QUEUE), FALSE, 0); + config->i_thread_queue = GetDlgItemInt(hTabs[2], IDC_MT_THREAD_QUEUE, NULL, FALSE); + if (config->i_thread_queue < config->i_threads && config->i_thread_queue != 0) + config->i_thread_queue = config->i_threads; + else if (config->i_thread_queue > X264_THREAD_MAX) + config->i_thread_queue = X264_THREAD_MAX; + SetDlgItemInt(hTabs[2], IDC_MT_THREAD_QUEUE, config->i_thread_queue, FALSE); + break; +#endif +#endif + + case IDC_VUI_CHROMALOC: + CHECKED_SET_SHOW_INT(config->i_chromaloc, hTabs[2], IDC_VUI_CHROMALOC, FALSE, 0, 5); break; default: @@ -1313,8 +1982,124 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; + case WM_NOTIFY: + { + LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam; + + if (!lpnmud) + return FALSE; + if (lpnmud->hdr.code != UDN_DELTAPOS) + return FALSE; + + switch (lpnmud->hdr.idFrom) + { + case IDC_ANALYSIS_REF_SPIN: + config->i_refmax = X264_CLIP(config->i_refmax - lpnmud->iDelta, 1, 16); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_REF, config->i_refmax, FALSE); + break; + + case IDC_ANALYSIS_MERANGE_SPIN: + config->i_me_range = X264_CLIP(config->i_me_range - lpnmud->iDelta, 4, 64); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_MERANGE, config->i_me_range, FALSE); + break; + + case IDC_ANALYSIS_SCENECUT_SPIN: + config->i_scenecut_threshold = X264_CLIP(config->i_scenecut_threshold - lpnmud->iDelta, -1, 100); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_SCENECUT, config->i_scenecut_threshold, TRUE); + break; + + case IDC_ANALYSIS_BFRAMES_SPIN: + config->i_bframe = X264_CLIP(config->i_bframe - lpnmud->iDelta, 0, X264_BFRAME_MAX); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_BFRAMES, config->i_bframe, FALSE); + break; + + case IDC_ANALYSIS_B_BIAS_SPIN: + config->i_bframe_bias = X264_CLIP(config->i_bframe_bias - lpnmud->iDelta, -90, 100); + SetDlgItemInt(hTabs[1], IDC_ANALYSIS_B_BIAS, config->i_bframe_bias, TRUE); + break; + + case IDC_ENC_DEBLOCK_A_SPIN: + config->i_inloop_a = X264_CLIP(config->i_inloop_a - lpnmud->iDelta, -6, 6); + SetDlgItemInt(hTabs[1], IDC_ENC_DEBLOCK_A, config->i_inloop_a, TRUE); + break; + + case IDC_ENC_DEBLOCK_B_SPIN: + config->i_inloop_b = X264_CLIP(config->i_inloop_b - lpnmud->iDelta, -6, 6); + SetDlgItemInt(hTabs[1], IDC_ENC_DEBLOCK_B, config->i_inloop_b, TRUE); + break; + + case IDC_ENC_DEADZONE_INTRA_SPIN: + config->i_intra_deadzone = X264_CLIP(config->i_intra_deadzone - lpnmud->iDelta, 0, 32); + SetDlgItemInt(hTabs[1], IDC_ENC_DEADZONE_INTRA, config->i_intra_deadzone, FALSE); + break; + + case IDC_ENC_DEADZONE_INTER_SPIN: + config->i_inter_deadzone = X264_CLIP(config->i_inter_deadzone - lpnmud->iDelta, 0, 32); + SetDlgItemInt(hTabs[1], IDC_ENC_DEADZONE_INTER, config->i_inter_deadzone, FALSE); + break; + + case IDC_RC_VBV_INIT_SPIN: + config->i_vbv_occupancy = X264_CLIP(config->i_vbv_occupancy - lpnmud->iDelta, 0, 100); + SetDlgItemInt(hTabs[2], IDC_RC_VBV_INIT, config->i_vbv_occupancy, FALSE); + break; + + case IDC_RC_QPMIN_SPIN: + config->i_qp_min = X264_CLIP(config->i_qp_min - lpnmud->iDelta, 1, config->i_qp_max); + SetDlgItemInt(hTabs[2], IDC_RC_QPMIN, config->i_qp_min, FALSE); + break; + + case IDC_RC_QPMAX_SPIN: + config->i_qp_max = X264_CLIP(config->i_qp_max - lpnmud->iDelta, config->i_qp_min, X264_QUANT_MAX); + SetDlgItemInt(hTabs[2], IDC_RC_QPMAX, config->i_qp_max, FALSE); + break; + + case IDC_RC_QPSTEP_SPIN: + config->i_qp_step = X264_CLIP(config->i_qp_step - lpnmud->iDelta, 1, X264_QUANT_MAX); + SetDlgItemInt(hTabs[2], IDC_RC_QPSTEP, config->i_qp_step, FALSE); + break; + + case IDC_RC_CHROMA_QP_OFFSET_SPIN: + config->i_chroma_qp_offset = X264_CLIP(config->i_chroma_qp_offset - lpnmud->iDelta, -12, 12); + SetDlgItemInt(hTabs[2], IDC_RC_CHROMA_QP_OFFSET, config->i_chroma_qp_offset, TRUE); + break; + +#if X264VFW_USE_THREADS +#if !X264_PATCH_THREAD_POOL + case IDC_MT_THREADS_SPIN: + config->i_threads = X264_CLIP(config->i_threads - lpnmud->iDelta, 0, X264_THREAD_MAX); + SetDlgItemInt(hTabs[2], IDC_MT_THREADS, config->i_threads, FALSE); + break; +#else + case IDC_MT_THREADS_SPIN: + if (config->i_thread_queue == 0) + config->i_threads = X264_CLIP(config->i_threads - lpnmud->iDelta, 0, X264_THREAD_MAX); + else + config->i_threads = X264_CLIP(config->i_threads - lpnmud->iDelta, 0, config->i_thread_queue); + SetDlgItemInt(hTabs[2], IDC_MT_THREADS, config->i_threads, FALSE); + break; + + case IDC_MT_THREAD_QUEUE_SPIN: + config->i_thread_queue = X264_CLIP(config->i_thread_queue - lpnmud->iDelta, 0, X264_THREAD_MAX); + if (config->i_thread_queue < config->i_threads && config->i_thread_queue != 0) + config->i_thread_queue = config->i_threads; + SetDlgItemInt(hTabs[2], IDC_MT_THREAD_QUEUE, config->i_thread_queue, FALSE); + break; +#endif +#endif + + case IDC_VUI_CHROMALOC_SPIN: + config->i_chromaloc = X264_CLIP(config->i_chromaloc - lpnmud->iDelta, 0, 5); + SetDlgItemInt(hTabs[2], IDC_VUI_CHROMALOC, config->i_chromaloc, FALSE); + break; + + default: + return FALSE; + } + break; + } + case WM_HSCROLL: - if ((HWND)lParam == GetDlgItem(hTabs[0], IDC_BITRATESLIDER)) + if ((HWND)lParam == GetDlgItem(hTabs[0], IDC_MAIN_RC_VAL_SLIDER)) { switch (config->i_encoding_type) { @@ -1322,19 +2107,19 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case 1: - config->i_qp = SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_GETPOS, 0, 0); - SetDlgItemInt(hTabs[0], IDC_BITRATEEDIT, config->i_qp, FALSE); + config->i_qp = SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_GETPOS, 0, 0); + SetDlgItemInt(hTabs[0], IDC_MAIN_RC_VAL, config->i_qp, FALSE); break; case 2: - config->i_rf_constant = SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_GETPOS, 0, 0); - SetDlgItemDouble(hTabs[0], IDC_BITRATEEDIT, config->i_rf_constant * 0.1); + config->i_rf_constant = SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_GETPOS, 0, 0); + SetDlgItemDouble(hTabs[0], IDC_MAIN_RC_VAL, config->i_rf_constant * 0.1, "%.1f"); break; case 3: case 4: - config->i_passbitrate = SendDlgItemMessage(hTabs[0], IDC_BITRATESLIDER, TBM_GETPOS, 0, 0); - SetDlgItemInt(hTabs[0], IDC_BITRATEEDIT, config->i_passbitrate, FALSE); + config->i_passbitrate = SendDlgItemMessage(hTabs[0], IDC_MAIN_RC_VAL_SLIDER, TBM_GETPOS, 0, 0); + SetDlgItemInt(hTabs[0], IDC_MAIN_RC_VAL, config->i_passbitrate, FALSE); break; default: @@ -1342,21 +2127,6 @@ BOOL CALLBACK callback_tabs(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) break; } } - else if ((HWND)lParam == GetDlgItem(hTabs[2], IDC_BBIASSLIDER)) - { - config->i_bframe_bias = SendDlgItemMessage(hTabs[2], IDC_BBIASSLIDER, TBM_GETPOS, 0, 0); - SetDlgItemInt(hTabs[2], IDC_BBIAS, config->i_bframe_bias, TRUE); - } - else if ((HWND)lParam == GetDlgItem(hTabs[3], IDC_INLOOP_A)) - { - config->i_inloop_a = SendDlgItemMessage(hTabs[3], IDC_INLOOP_A, TBM_GETPOS, 0, 0); - SetDlgItemInt(hTabs[3], IDC_LOOPA_TXT, config->i_inloop_a, TRUE); - } - else if ((HWND)lParam == GetDlgItem(hTabs[3], IDC_INLOOP_B)) - { - config->i_inloop_b = SendDlgItemMessage(hTabs[3], IDC_INLOOP_B, TBM_GETPOS, 0, 0); - SetDlgItemInt(hTabs[3], IDC_LOOPB_TXT, config->i_inloop_b, TRUE); - } else return FALSE; break; @@ -1379,7 +2149,7 @@ BOOL CALLBACK callback_about(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) char temp[1024]; sprintf(temp, "Build date: %s %s\nlibx264 core %d%s", __DATE__, __TIME__, X264_BUILD, X264_VERSION); - SetDlgItemText(hDlg, IDC_BUILD, temp); + SetDlgItemText(hDlg, IDC_ABOUT_BUILD_LABEL, temp); break; } @@ -1387,7 +2157,7 @@ BOOL CALLBACK callback_about(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (HIWORD(wParam)) { case BN_CLICKED: - if (LOWORD(wParam) == IDC_HOMEPAGE) + if (LOWORD(wParam) == IDC_ABOUT_HOMEPAGE) ShellExecute(hDlg, "open", X264VFW_WEBSITE, NULL, NULL, SW_SHOWNORMAL); else if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) EndDialog(hDlg, LOWORD(wParam)); @@ -1425,11 +2195,11 @@ BOOL CALLBACK callback_err_console(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l DestroyWindow(hWnd); break; - case IDC_COPYCLIP: + case IDC_ERRCONSOLE_COPYCLIP: if (OpenClipboard(hWnd)) { int i; - int num_lines = SendDlgItemMessage(hWnd, IDC_CONSOLE, LB_GETCOUNT, 0, 0); + int num_lines = SendDlgItemMessage(hWnd, IDC_ERRCONSOLE_CONSOLE, LB_GETCOUNT, 0, 0); int text_size; char *buffer; HGLOBAL clipbuffer; @@ -1439,7 +2209,7 @@ BOOL CALLBACK callback_err_console(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l /* Calculate text size */ for (i = 0, text_size = 0; i < num_lines; i++) - text_size += SendDlgItemMessage(hWnd, IDC_CONSOLE, LB_GETTEXTLEN, (WPARAM)i, 0); + text_size += SendDlgItemMessage(hWnd, IDC_ERRCONSOLE_CONSOLE, LB_GETTEXTLEN, (WPARAM)i, 0); /* CR - LF for each line + terminating NULL */ text_size += 2 * num_lines + 1; @@ -1453,7 +2223,7 @@ BOOL CALLBACK callback_err_console(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l { char msg_buf[1024]; - SendDlgItemMessage(hWnd, IDC_CONSOLE, LB_GETTEXT, (WPARAM)i, (LPARAM)&msg_buf); + SendDlgItemMessage(hWnd, IDC_ERRCONSOLE_CONSOLE, LB_GETTEXT, (WPARAM)i, (LPARAM)&msg_buf); strcat(msg_buf, "\r\n"); memcpy(buffer, &msg_buf, strlen(msg_buf)); buffer += strlen(msg_buf); diff --git a/csp.c b/csp.c index 1fc8118..01ac100 100644 --- a/csp.c +++ b/csp.c @@ -5,6 +5,7 @@ * $Id: csp.c,v 1.1 2004/06/03 19:27:06 fenrir Exp $ * * Authors: Laurent Aimar + * Anton Mitrofanov (a.k.a. BugMaster) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,10 +22,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -#include "csp.h" +#include "x264vfw.h" + #include -static __inline void plane_copy( uint8_t *dst, int i_dst, +static inline void plane_copy( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int w, int h) { while( h-- ) @@ -35,13 +37,13 @@ static __inline void plane_copy( uint8_t *dst, int i_dst, } } -static __inline void plane_copy_vflip( uint8_t *dst, int i_dst, +static inline void plane_copy_vflip( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int w, int h) { plane_copy( dst, i_dst, src + (h -1)*i_src, -i_src, w, h ); } -static __inline void plane_subsamplev2( uint8_t *dst, int i_dst, +static inline void plane_subsamplev2( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int w, int h) { for( ; h > 0; h-- ) @@ -59,13 +61,13 @@ static __inline void plane_subsamplev2( uint8_t *dst, int i_dst, } } -static __inline void plane_subsamplev2_vlip( uint8_t *dst, int i_dst, +static inline void plane_subsamplev2_vlip( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int w, int h) { plane_subsamplev2( dst, i_dst, src + (2*h-1)*i_src, -i_src, w, h ); } -static __inline void plane_subsamplehv2( uint8_t *dst, int i_dst, +static inline void plane_subsamplehv2( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int w, int h) { for( ; h > 0; h-- ) @@ -83,7 +85,7 @@ static __inline void plane_subsamplehv2( uint8_t *dst, int i_dst, } } -static __inline void plane_subsamplehv2_vlip( uint8_t *dst, int i_dst, +static inline void plane_subsamplehv2_vlip( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int w, int h) { plane_subsamplehv2( dst, i_dst, src + (2*h-1)*i_src, -i_src, w, h ); @@ -261,7 +263,7 @@ static void yuyv_to_i420( x264_image_t *img_dst, x264_image_t *img_src, } } -#ifdef BT_709 +#if X264VFW_CSP_BT_709 //BT.709 #define Kb 0.0722 #define Kr 0.2126 @@ -275,7 +277,7 @@ static void yuyv_to_i420( x264_image_t *img_dst, x264_image_t *img_src, #define Sb (1.0 - Kb) #define Sr (1.0 - Kr) -#ifdef PC_SCALE +#if X264VFW_CSP_PC_SCALE //PC Scale //0 <= Y <= 255 //0 <= U <= 255 diff --git a/csp.h b/csp.h index b0ed86c..5bbc0fd 100644 --- a/csp.h +++ b/csp.h @@ -5,6 +5,7 @@ * $Id: csp.h,v 1.1 2004/06/03 19:27:06 fenrir Exp $ * * Authors: Laurent Aimar + * Anton Mitrofanov (a.k.a. BugMaster) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,8 +22,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -#ifndef _CSP_H -#define _CSP_H +#ifndef X264VFW_CSP_H +#define X264VFW_CSP_H #include #include diff --git a/driverproc.c b/driverproc.c index f21d90a..376729f 100644 --- a/driverproc.c +++ b/driverproc.c @@ -1,5 +1,5 @@ /***************************************************************************** - * drvproc.c: vfw x264 wrapper + * driverproc.c: vfw x264 wrapper ***************************************************************************** * Copyright (C) 2003 Laurent Aimar * $Id: driverproc.c,v 1.1 2004/06/03 19:27:09 fenrir Exp $ @@ -23,18 +23,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -#ifdef PTW32_STATIC_LIB -#include -#endif - #include "x264vfw.h" -#ifndef attribute_align_arg -#if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__>1) -# define attribute_align_arg __attribute__((force_align_arg_pointer)) -#else -# define attribute_align_arg -#endif +#ifdef PTW32_STATIC_LIB +#include #endif /* Global DLL instance */ @@ -71,11 +63,13 @@ BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) return TRUE; } +#if X264VFW_USE_DECODER static void log_callback(void* ptr, int level, const char* fmt, va_list vl) { if (level <= av_log_get_level()) DVPRINTF(fmt, vl); } +#endif /* This little puppy handles the calls which vfw programs send out to the codec */ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lParam1, LPARAM lParam2) @@ -85,9 +79,11 @@ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, U switch (uMsg) { case DRV_LOAD: +#if X264VFW_USE_DECODER avcodec_init(); avcodec_register_all(); av_log_set_callback(log_callback); +#endif return DRV_OK; case DRV_FREE: @@ -109,6 +105,9 @@ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, U memset(codec, 0, sizeof(CODEC)); config_reg_load(&codec->config); +#if X264VFW_USE_DECODER + codec->decoder_enabled = !codec->config.b_disable_decoder; +#endif default_compress_frames_info(codec); if (icopen) @@ -119,7 +118,9 @@ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, U case DRV_CLOSE: /* From xvid: compress_end/decompress_end don't always get called */ compress_end(codec); +#if X264VFW_USE_DECODER decompress_end(codec); +#endif x264_log_vfw_destroy(codec); free(codec); return DRV_OK; @@ -173,7 +174,11 @@ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, U icinfo->dwSize = sizeof(ICINFO); icinfo->fccType = ICTYPE_VIDEO; icinfo->fccHandler = FOURCC_X264; - icinfo->dwFlags = VIDCF_COMPRESSFRAMES | VIDCF_FASTTEMPORALC | VIDCF_FASTTEMPORALD; + icinfo->dwFlags = VIDCF_COMPRESSFRAMES | VIDCF_FASTTEMPORALC; +#if X264VFW_USE_DECODER + if (codec->decoder_enabled) + icinfo->dwFlags |= VIDCF_FASTTEMPORALD; +#endif icinfo->dwVersion = 0; icinfo->dwVersionICM = ICVERSION; wcscpy(icinfo->szName, X264_NAME_L); @@ -190,7 +195,7 @@ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, U codec->config.b_save = FALSE; memcpy(&temp, &codec->config, sizeof(CONFIG)); - DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_MAINCONFIG), (HWND)lParam1, callback_main, (LPARAM)&temp); + DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_CONFIG), (HWND)lParam1, callback_main, (LPARAM)&temp); if (temp.b_save) { @@ -236,21 +241,38 @@ LRESULT WINAPI attribute_align_arg DriverProc(DWORD dwDriverId, HDRVR hDriver, U case ICM_COMPRESS_FRAMES_INFO: return compress_frames_info(codec, (ICCOMPRESSFRAMES *)lParam1); +#if X264VFW_USE_DECODER /* Decompressor */ case ICM_DECOMPRESS_GET_FORMAT: - return decompress_get_format(codec, (BITMAPINFO *)lParam1, (BITMAPINFO *)lParam2); + if (codec->decoder_enabled) + return decompress_get_format(codec, (BITMAPINFO *)lParam1, (BITMAPINFO *)lParam2); + else + return ICERR_UNSUPPORTED; case ICM_DECOMPRESS_QUERY: - return decompress_query(codec, (BITMAPINFO *)lParam1, (BITMAPINFO *)lParam2); + if (codec->decoder_enabled) + return decompress_query(codec, (BITMAPINFO *)lParam1, (BITMAPINFO *)lParam2); + else + return ICERR_UNSUPPORTED; case ICM_DECOMPRESS_BEGIN: - return decompress_begin(codec, (BITMAPINFO *)lParam1, (BITMAPINFO *)lParam2); + if (codec->decoder_enabled) + return decompress_begin(codec, (BITMAPINFO *)lParam1, (BITMAPINFO *)lParam2); + else + return ICERR_UNSUPPORTED; case ICM_DECOMPRESS: - return decompress(codec, (ICDECOMPRESS *)lParam1); + if (codec->decoder_enabled) + return decompress(codec, (ICDECOMPRESS *)lParam1); + else + return ICERR_UNSUPPORTED; case ICM_DECOMPRESS_END: - return decompress_end(codec); + if (codec->decoder_enabled) + return decompress_end(codec); + else + return ICERR_UNSUPPORTED; +#endif default: if (uMsg < DRV_USER) @@ -272,6 +294,6 @@ void WINAPI Configure(HWND hwnd, HINSTANCE hinst, LPTSTR lpCmdLine, int nCmdShow DriverProc(dwDriverId, 0, ICM_CONFIGURE, (LPARAM)GetDesktopWindow(), 0); DriverProc(dwDriverId, 0, DRV_CLOSE, 0, 0); } - DriverProc(0, 0, DRV_FREE, 0, 0); + DriverProc(0, 0, DRV_FREE, 0, 0); } } diff --git a/ffmpeg.bmp b/ffmpeg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a66528260bad0e163c23f811815f9cc60af1f727 GIT binary patch literal 35454 zcmeHQ3vf=?7RGpl@ftG}qlD2)XS~Owda1|IVyaUeOm(WXgAU_8HFTzE=@22fHyV#i zROE_8C5S5?B_4I-8LtwF62z+!2_X{l=>2M&m1XUHjwAWo$)BEoewpv=z4khLul@ad z@3ZzgTdx5#1Ij)9bi!Xh{5y<)|G>ZUaxpIA<`Gp0M1e zfq4aa(AnhsCe9T$UDkAS@@5;IZkBghApBgo^WNu@D^ISpYUz|cQ@ErmZU9K zI^A^dvOwPreI53@F1G5_Dq~|``R6OTu#=S5t6Ccsx`|$Afi|n#IO%aK86&l7EvjWD zZ=c>UsG-*x(5M%Z?7TjlwcbxEY)Igzvx_~G;qa7u6uE-nKW2#60basY{#DDw;Rsg3CUKI{AF z!l2gLvujBVATlu$iMk|Gro~O;k}fX87QoP9de>dFqRyLx+k6mVRCp78d&Z`}_F#P%8xR^Yc4<_AJ`fvSmw^h2NTJrn>y* z;5Ry3RLW=n{R}&aR0YSdV|bSY(7@d^#cFru@Cs8#rTAsGkT%56j1>cXJbhVvUp z3;>rE{VVE{NWs#MOX}ELcqJyX-o1O1wH4UAcQ0>U{rW2A@|lztDY*`iX$?ikCdb?d>c*O$Mp3uErXFvWGoT#Ts_ zP(_zSig=c!Qr^g`0Rsk*sW~`v<_xu~H1n!Wn>M`KcmOdvItC3I#KnLWuiC9?$Gf=x zzv?HZCsM-!rtY1}1vnnRb3CV3YF29VWzD&O!jXFoIgUQg#{l5D%srTytK>tMKq}VQsqX+_^JZ?4@{x)e(G> z{F9K7aO1`exB^I_07Ad>c@WPRRAB|SZrw`CF>sNWH6kKHNP<^z6zCj43gT6gGm=RU z0Qh5+L?T$nB`;@Oes$@qx-h7<>B1&18Iv5Niyh3+3TH5Gh#zm?s z=DUfzC+aj%DPQjWk|Y685XE(2P%Anqnk28@zpBfW0bV_N^a#&QWN5{@k$XUDk_S13P^>)fv3=uEKdY339nGRLWK&ucI~46 zDhaQ!2;_C^*s&v5TS8ue6^PKoyhb`ftue7gvLv7G^-`EFrI| zR;~JUKg#Y8%{bHq1&j-}VkpFz&+V^9jA6ru@x+ZAH|FQ(W45A1On(m^JU~q-MS&9X z3Q8I^YLu6kM~yA^c(rihLSDCS-MW!ZfFVPM*ccr%rq%k2lL6sUJlqb{g7bsU>j9nu zY|krf`|?FmOiaw=$&>kntF-Y2cCmRSoNvvVH6znG0Zw=Y+V}?hUb$D~5CgT~a_4m7 zSZpOH+)5z-7#G8+1xF}PQP}zVN_2|xQqX{G^5^j?Ha3>mgq-9ES>fr!hYv?(cnYvR zuTW>IKLNzj@U3kq!L&=cf>$>FcExilxOwwtUN<~&a3PGUMhhyvFMjF>B3Or>BH#ikF>HS)?Bq5#4)3vLF_ClyCv1Hv1us5R$M zk@pWp;%~&)46JD-%+tM^SD~Syd>w`EIC}IbS!}|D3B0o~k?~95;_(Wr9j>QChYobd zV)F{Wf;x5TaJA#cjU%-j?A*CiiD8-^Jb18raxwA>GuNQ#LAbA9+eT2X z0Q2IX3vvTtsx7Q0Wb{ktyuz+7RxJzhbBSYqKWefsoy{P-~`2bev3HorSo zdgssovA=A^D`Y*+e>`y0K;GkovA>KE2+|K~eZ1vk$`v5+a3DznVEe|nGf1VpnpfP& zz?c?!+kvM{nIdHPr9H3UoLsSD#exM3;IzbN=FFMKUk6t5bW_1AjGygoKm3;k((3v# z7#=xt1j7`3zcXgc;FSkf4Uziqt^@l#o}=n>VMPRktf4ub^bnqD7*T#>>i;D<3#;fZAx}72Hkm43G?{)i0tS z(TM}Z^8NPkH`H4;t|^TtMMVnU}bj!uo)W*6~4GFJhnKDTQKv z#ce))`gCI*kj}+8E(x!&%tnN&xMRtA1%=py7W?D8&cJwd+OcB?zqOH9=wG;-j@&## zlAxB=u`@0I-4el~B#D!+tQP!Gi;z^31khgrL#R9#AnYj`cwC_kulDcXPq*U$!7ZX+ z=<;QGh3;f2z~eOVxI$53_mW!x z)UpcO!~RR$l{gXxwcZYU+ej^JTjMd4By;m~t)3+@YKfB^sFVO6r-8>6iVC}z!UCX{ zRoEV=wI^i{$>Uv~ZtJ=ksnu~!M@}u9XGu^?oa8|IIq*0QJg$(}*2P8(fLbHBk2Den z)Y_f0n@VNnX1x{qmQfN%&2VbjEco?zqDemiaS{{{n{#6Up8j!Q*;dyGrQgRmfp2@&t<&=;@sSRE;YJst6Op;z0}tvpy^gphhoflY(`cuG3BN zMhn;+uWdsBY)OkVXQ=IWbM6{XhP2T}S^V?{Qs@FNwE+Ha2<$tLjvcMOIQJOgdGtj* zRqycL{EOq CBR and 100% -> CQP)." - IDC_QPMIN "Minimum QP (quantizer parameter)." - IDC_QPMAX "Maximum QP (quantizer parameter)." - IDC_QPSTEP "Maximum QP (quantizer parameter) step between frames." - IDC_SCENECUT "Scene-cut detection. Controls how aggressively to insert extra I-frames. With small values of scenecut, codec often has to force an I-frame when it would exceed keyint. Good values of scenecut may find a better location for the I-frame. Large values use more I-frames than necessary, thus wasting bits. -1 disables scene-cut detection, so I-frames are inserted only every other keyint frames, which probably leads to ugly encoding artifacts." - IDC_KEYINTMIN "Minimum GOP size. Sets minimum interval between IDR-frames. In H.264, I-frames do not necessarily bound a closed GOP because it is allowable for a P-frame to be predicted from more frames than just the one frame before it (also see reference frame option). Therefore, I-frames are not necessarily seekable. IDR-frames restrict subsequent P-frames from referring to any frame prior to the IDR-frame. If scenecuts appear within this interval, they are still encoded as I-frames, but do not start a new GOP." - IDC_KEYINTMAX "Maximum GOP size. Sets maximum interval between IDR-frames. Larger values save bits, thus improving quality for a given bitrate at the cost of seeking precision." + GROUPBOX "Main",IDC_STATIC,6,6,324,236 +#if X264VFW_USE_DECODER + CONTROL IDB_X264_LOGO,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE,18,16,136,39,WS_EX_CLIENTEDGE + CONTROL IDB_FFMPEG_LOGO,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE,182,16,136,39,WS_EX_CLIENTEDGE +#else + CONTROL IDB_X264_LOGO,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE,100,16,136,39,WS_EX_CLIENTEDGE +#endif + CTEXT "IDC_MAIN_BUILD_LABEL",IDC_MAIN_BUILD_LABEL,18,60,300,24,WS_DISABLED + COMBOBOX IDC_MAIN_RC_MODE,18,88,300,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "IDC_MAIN_RC_LABEL",IDC_MAIN_RC_LABEL,18,104,246,12,SS_CENTERIMAGE + EDITTEXT IDC_MAIN_RC_VAL,264,104,54,12,ES_AUTOHSCROLL + CONTROL "",IDC_MAIN_RC_VAL_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,18,120,300,12 + LTEXT "IDC_MAIN_RC_LOW_LABEL",IDC_MAIN_RC_LOW_LABEL,18,136,150,12,SS_CENTERIMAGE + RTEXT "IDC_MAIN_RC_HIGH_LABEL",IDC_MAIN_RC_HIGH_LABEL,168,136,150,12,SS_CENTERIMAGE + CONTROL "Update stats file",IDC_MAIN_STATS_UPDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,152,300,12 + LTEXT "Stats file",IDC_STATIC,18,168,90,12,SS_CENTERIMAGE + EDITTEXT IDC_MAIN_STATS,108,168,186,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_MAIN_STATS_BROWSE,300,168,18,12 + LTEXT "Extra options:",IDC_STATIC,18,184,300,12,SS_CENTERIMAGE + EDITTEXT IDC_MAIN_EXTRA_CMDLINE,18,200,300,36,ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL + GROUPBOX "Misc",IDC_STATIC,330,6,162,76 + LTEXT "AVC level",IDC_STATIC,342,16,84,12,SS_CENTERIMAGE + COMBOBOX IDC_MISC_LEVEL,426,16,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Sample Aspect Ratio:",IDC_STATIC,342,32,138,12,SS_CENTERIMAGE + LTEXT "SAR width",IDC_STATIC,342,48,84,12,SS_CENTERIMAGE + EDITTEXT IDC_MISC_SAR_W,426,48,54,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "SAR height",IDC_STATIC,342,64,84,12,SS_CENTERIMAGE + EDITTEXT IDC_MISC_SAR_H,426,64,54,12,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Debug",IDC_STATIC,330,86,162,76 + LTEXT "Log level",IDC_STATIC,342,96,84,12,SS_CENTERIMAGE + COMBOBOX IDC_DEBUG_LOG_LEVEL,426,96,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "PSNR",IDC_DEBUG_PSNR,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,112,138,12 + CONTROL "SSIM",IDC_DEBUG_SSIM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,128,138,12 + CONTROL "Disable all CPU optimizations",IDC_DEBUG_NO_ASM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,144,138,12 + GROUPBOX "VFW",IDC_STATIC,330,166,162,76 + LTEXT "FourCC",IDC_STATIC,342,176,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VFW_FOURCC,426,176,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#if X264VFW_USE_VIRTUALDUB_HACK + CONTROL "VirtualDub Hack",IDC_VFW_VD_HACK,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,192,138,12 +#if X264VFW_USE_DECODER + CONTROL "Disable decoder",IDC_VFW_DISABLE_DECODER,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,208,138,12 +#endif +#else +#if X264VFW_USE_DECODER + CONTROL "Disable decoder",IDC_VFW_DISABLE_DECODER,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,192,138,12 +#endif +#endif END -STRINGTABLE +IDD_TAB_ANALYSIS_ENC DIALOGEX 0, 0, 500, 250 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - IDC_BFRAME "Maximum number of consecutive B-frames between I and P-frames." - IDC_VDHACK "VirtualDub hack for fixing B-frames lag (also multithreading lag). CAUTION! Use only with VirtualDub otherwise codec can produce invalid bitstream." - IDC_BBIASSLIDER "Bias the choice to use B-frames. Positive values cause more B-frames, negative values cause less B-frames." - IDC_BBIAS "Bias the choice to use B-frames. Positive values cause more B-frames, negative values cause less B-frames." - IDC_BADAPT "Adaptive B-frames decision." - IDC_BREFS "Allows B-frames to be used as references for predicting other frames. Keeps the middle of 2+ consecutive B-frames as a reference, and reorders frame appropriately." - IDC_WBPRED "Weighted prediction for B-frames." - IDC_BIDIR_ME "Jointly optimize both MVs (motion vectors) in B-frames." - IDC_DIRECTPRED "Direct MV (motion vector) prediction mode." + GROUPBOX "Analysis",IDC_STATIC,6,6,324,236 + CONTROL "Adaptive DCT",IDC_ANALYSIS_8X8DCT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,16,138,12 + GROUPBOX "I-frames partitions",IDC_STATIC,18,32,138,28 + CONTROL "i8x8",IDC_ANALYSIS_I_I8X8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,42,36,12 + CONTROL "i4x4",IDC_ANALYSIS_I_I4X4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,42,36,12 + GROUPBOX "P/B-frames partitions",IDC_STATIC,18,64,138,44 + CONTROL "i8x8",IDC_ANALYSIS_PB_I8X8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,74,36,12 + CONTROL "i4x4",IDC_ANALYSIS_PB_I4X4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,74,36,12 + CONTROL "p8x8",IDC_ANALYSIS_PB_P8X8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,90,36,12 + CONTROL "p4x4",IDC_ANALYSIS_PB_P4X4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,90,36,12 + CONTROL "b8x8",IDC_ANALYSIS_PB_B8X8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,102,90,36,12 + CONTROL "Fast P-skip",IDC_ANALYSIS_FAST_PSKIP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,17,112,138,12 + LTEXT "Max frame refs",IDC_STATIC,18,128,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_REF,102,128,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANALYSIS_REF_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,128,12,12 + CONTROL "Mixed refs",IDC_ANALYSIS_MIXED_REFS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,17,144,138,12 + LTEXT "ME algorithm",IDC_STATIC,18,160,84,12,SS_CENTERIMAGE + COMBOBOX IDC_ANALYSIS_ME,102,160,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "ME range",IDC_STATIC,18,176,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_MERANGE,102,176,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANALYSIS_MERANGE_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,176,12,12 + LTEXT "Subpixel ME refinement",IDC_STATIC,18,192,84,12,SS_CENTERIMAGE + COMBOBOX IDC_ANALYSIS_SUBME,102,192,54,108,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Chroma ME",IDC_ANALYSIS_CHROMA_ME,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,17,208,138,12 + LTEXT "Psy RDO strength",IDC_STATIC,18,224,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_PSY_RDO,102,224,54,12,ES_AUTOHSCROLL + LTEXT "Min GOP size",IDC_STATIC,168,16,96,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_MIN_KEYINT,264,16,54,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Max GOP size",IDC_STATIC,168,32,96,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_KEYINT,264,32,54,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Scenecut threshold",IDC_STATIC,168,48,96,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_SCENECUT,264,48,42,12,ES_AUTOHSCROLL + CONTROL "",IDC_ANALYSIS_SCENECUT_SPIN,"msctls_updown32",UDS_ARROWKEYS,306,48,12,12 + CONTROL "Fast scenecut",IDC_ANALYSIS_PRE_SCENECUT,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,167,64,150,12 + LTEXT "Max consecutive B-frames",IDC_STATIC,168,80,96,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_BFRAMES,264,80,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANALYSIS_BFRAMES_SPIN,"msctls_updown32",UDS_ARROWKEYS,306,80,12,12 + LTEXT "Adaptive B-frames",IDC_STATIC,168,96,96,12,SS_CENTERIMAGE + COMBOBOX IDC_ANALYSIS_B_ADAPT,264,96,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "B-frames bias",IDC_STATIC,168,112,96,12,SS_CENTERIMAGE + EDITTEXT IDC_ANALYSIS_B_BIAS,264,112,42,12,ES_AUTOHSCROLL + CONTROL "",IDC_ANALYSIS_B_BIAS_SPIN,"msctls_updown32",UDS_ARROWKEYS,306,112,12,12 + LTEXT "B-frames MV prediction",IDC_STATIC,168,128,96,12,SS_CENTERIMAGE + COMBOBOX IDC_ANALYSIS_DIRECT,264,128,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "B-frames pyramid",IDC_ANALYSIS_B_PYRAMID,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,167,144,150,12 + CONTROL "Weighted B-frames prediction",IDC_ANALYSIS_WEIGHTB, + "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,167,160,150,12 + GROUPBOX "Encoding",IDC_STATIC,330,6,162,236 + CONTROL "In-loop deblocking filter",IDC_ENC_DEBLOCK,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,16,138,12 + LTEXT "Deblocking strength",IDC_STATIC,342,32,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_DEBLOCK_A,426,32,42,12,ES_AUTOHSCROLL + CONTROL "",IDC_ENC_DEBLOCK_A_SPIN,"msctls_updown32",UDS_ARROWKEYS,468,32,12,12 + LTEXT "Deblocking threshold",IDC_STATIC,342,48,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_DEBLOCK_B,426,48,42,12,ES_AUTOHSCROLL + CONTROL "",IDC_ENC_DEBLOCK_B_SPIN,"msctls_updown32",UDS_ARROWKEYS,468,48,12,12 + LTEXT "Interlaced",IDC_STATIC,342,64,84,12,SS_CENTERIMAGE + COMBOBOX IDC_ENC_INTERLACED,426,64,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "CABAC",IDC_ENC_CABAC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,80,138,12 + CONTROL "DCT decimate",IDC_ENC_DCT_DECIMATE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,96,138,12 + LTEXT "Noise reduction",IDC_STATIC,342,112,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_NR,426,112,54,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Trellis",IDC_STATIC,342,128,84,12,SS_CENTERIMAGE + COMBOBOX IDC_ENC_TRELLIS,426,128,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Intra deadzone",IDC_STATIC,342,144,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_DEADZONE_INTRA,426,144,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ENC_DEADZONE_INTRA_SPIN,"msctls_updown32",UDS_ARROWKEYS,468,144,12,12 + LTEXT "Inter deadzone",IDC_STATIC,342,160,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_DEADZONE_INTER,426,160,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ENC_DEADZONE_INTER_SPIN,"msctls_updown32",UDS_ARROWKEYS,468,160,12,12 + LTEXT "Quant matrices",IDC_STATIC,342,176,84,12,SS_CENTERIMAGE + COMBOBOX IDC_ENC_CQM,426,176,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Custom quant matrices file:",IDC_STATIC,342,192,138,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_CQMFILE,342,208,114,12,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_ENC_CQMFILE_BROWSE,462,208,18,12 + LTEXT "Psy trellis strength",IDC_STATIC,342,224,84,12,SS_CENTERIMAGE + EDITTEXT IDC_ENC_PSY_TRELLIS,426,224,54,12,ES_AUTOHSCROLL END -STRINGTABLE +IDD_TAB_RC_OTHER DIALOGEX 0, 0, 500, 250 +STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - IDC_SUBPEL "This parameter controls quality versus speed tradeoffs involved in the motion estimation decision process (lower = quicker and higher = better quality)." - IDC_BRDO "RD (rate-distortion) based mode decision for B-frames." - IDC_ME_METHOD "Selects the ME (motion estimation) algorithm:\n - dia: diamond search, radius 1 (fast)\n - hex: hexagonal search, radius 2\n - umh: uneven multi-hexagon search\n - esa: exhaustive search\n - tesa: hadamard exhaustive search (slow)" - IDC_MERANGE "Maximum distance to search for ME (motion estimation), measured from predicted position(s). Default of 16 is good for most footage, high motion sequences may benefit from settings between 24 and 32." - IDC_CHROMAME "Chroma ME (motion estimation) for subpel and mode decision in P-frames." - IDC_FRAMEREFS "Number of previous frames used as predictors. This is effective in Anime, but seems to make little difference in live-action source material." - IDC_MIXEDREF "Allows each 8x8 or 16x8 partition to independently select a reference frame, as opposed to only one ref per MB (macroblock)." - IDC_SAR_W "Sample Aspect Ratio: width." - IDC_SAR_H "Sample Aspect Ratio: height." - IDC_THREADEDIT "Number of threads for parallel encoding (0 = Auto)." - IDC_CABAC "CABAC (Context-Adaptive Binary Arithmetic Coding). Slightly slows down encoding and decoding, but should save 10% to 15% bitrate." - IDC_TRELLIS "Trellis RD (rate-distortion) quantization: \n - unchecked: disabled\n - checked: enabled only on the final encode of a MB (macroblock)\n - indeterminate: enabled on all mode decisions (only with RDO)" - IDC_NR "DCT-domain noise reduction. Adaptive pseudo-deadzone. 10 to 1000 seems to be a useful range." - IDC_LOOPFILTER "Activate the deblocking loop filter (increases quality)." - IDC_INTERLACED "Pure-interlaced mode." + GROUPBOX "Rate control",IDC_STATIC,6,6,162,236 + LTEXT "VBV max bitrate (kbit/s)",IDC_STATIC,18,16,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_VBV_MAXRATE,102,16,54,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "VBV buffer size (kbit)",IDC_STATIC,18,32,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_VBV_BUFSIZE,102,32,54,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "VBV initial occupancy (%)",IDC_STATIC,18,48,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_VBV_INIT,102,48,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_RC_VBV_INIT_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,48,12,12 + LTEXT "Min QP",IDC_STATIC,18,64,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_QPMIN,102,64,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_RC_QPMIN_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,64,12,12 + LTEXT "Max QP",IDC_STATIC,18,80,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_QPMAX,102,80,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_RC_QPMAX_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,80,12,12 + LTEXT "Max QP step",IDC_STATIC,18,96,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_QPSTEP,102,96,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_RC_QPSTEP_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,96,12,12 + LTEXT "QP factor between I && P",IDC_STATIC,18,112,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_IPRATIO,102,112,54,12,ES_AUTOHSCROLL + LTEXT "QP factor between P && B",IDC_STATIC,18,128,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_PBRATIO,102,128,54,12,ES_AUTOHSCROLL + LTEXT "Chroma QP offset",IDC_STATIC,18,144,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_CHROMA_QP_OFFSET,102,144,42,12,ES_AUTOHSCROLL + CONTROL "",IDC_RC_CHROMA_QP_OFFSET_SPIN,"msctls_updown32",UDS_ARROWKEYS,144,144,12,12 + LTEXT "QP curve compression",IDC_STATIC,18,160,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_QCOMP,102,160,54,12,ES_AUTOHSCROLL + LTEXT "Temp. blur of complexity",IDC_STATIC,18,176,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_CPLXBLUR,102,176,54,12,ES_AUTOHSCROLL + LTEXT "Temp. blur of quants",IDC_STATIC,18,192,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_QBLUR,102,192,54,12,ES_AUTOHSCROLL + LTEXT "Bitrate tolerance (%)",IDC_STATIC,18,208,84,12,SS_CENTERIMAGE + EDITTEXT IDC_RC_RATETOL,102,208,54,12,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "AQ",IDC_STATIC,168,6,162,76 + LTEXT "Mode",IDC_STATIC,180,16,84,12,SS_CENTERIMAGE + COMBOBOX IDC_AQ_MODE,264,16,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Strength",IDC_STATIC,180,32,84,12,SS_CENTERIMAGE + EDITTEXT IDC_AQ_STRENGTH,264,32,54,12,ES_AUTOHSCROLL +#if X264_PATCH_VAQ_MOD + LTEXT "Metric",IDC_STATIC,180,48,84,12,SS_CENTERIMAGE + COMBOBOX IDC_AQ_METRIC,264,48,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Sensitivity",IDC_STATIC,180,64,84,12,SS_CENTERIMAGE + EDITTEXT IDC_AQ_SENSITIVITY,264,64,54,12,ES_AUTOHSCROLL +#endif +#if X264VFW_USE_THREADS + GROUPBOX "Multithreading",IDC_STATIC,330,6,162,76 + LTEXT "Threads",IDC_STATIC,342,16,84,12,SS_CENTERIMAGE + EDITTEXT IDC_MT_THREADS,426,16,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MT_THREADS_SPIN,"msctls_updown32",UDS_ARROWKEYS,468,16,12,12 + CONTROL "Deterministic",IDC_MT_DETERMINISTIC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,341,32,138,12 +#if X264_PATCH_THREAD_POOL + LTEXT "Threads queue",IDC_STATIC,342,48,84,12,SS_CENTERIMAGE + EDITTEXT IDC_MT_THREAD_QUEUE,426,48,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_MT_THREAD_QUEUE_SPIN,"msctls_updown32",UDS_ARROWKEYS,468,48,12,12 +#endif +#endif + GROUPBOX "VUI",IDC_STATIC,168,86,162,156 + LTEXT "Crop overscan",IDC_STATIC,180,96,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VUI_OVERSCAN,264,96,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Video format",IDC_STATIC,180,112,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VUI_VIDEOFORMAT,264,112,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Full range",IDC_STATIC,180,128,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VUI_FULLRANGE,264,128,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Color primaries",IDC_STATIC,180,144,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VUI_COLORPRIM,264,144,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Transfer characteristics",IDC_STATIC,180,160,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VUI_TRANSFER,264,160,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Color matrix",IDC_STATIC,180,176,84,12,SS_CENTERIMAGE + COMBOBOX IDC_VUI_COLORMATRIX,264,176,54,84,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Chroma sample location",IDC_STATIC,180,192,84,12,SS_CENTERIMAGE + EDITTEXT IDC_VUI_CHROMALOC,264,192,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_VUI_CHROMALOC_SPIN,"msctls_updown32",UDS_ARROWKEYS,306,192,12,12 END -#endif // English (U.S.) resources + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_X264_LOGO BITMAP "x264.bmp" +#if X264VFW_USE_DECODER +IDB_FFMPEG_LOGO BITMAP "ffmpeg.bmp" +#endif + +#endif // Russian resources ///////////////////////////////////////////////////////////////////////////// diff --git a/x264vfw.h b/x264vfw.h index 083313d..75d3301 100644 --- a/x264vfw.h +++ b/x264vfw.h @@ -1,5 +1,32 @@ -#ifndef _X264_VFW_H -#define _X264_VFW_H +/***************************************************************************** + * x264vfw.h: vfw x264 encoder + ***************************************************************************** + * Copyright (C) 2003 Laurent Aimar + * $Id: x264vfw.h,v 1.1 2004/06/03 19:27:09 fenrir Exp $ + * + * Authors: Justin Clay + * Laurent Aimar + * Anton Mitrofanov (a.k.a. BugMaster) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + *****************************************************************************/ + +#ifndef X264VFW_X264VFW_H +#define X264VFW_X264VFW_H + +#include "x264vfw_config.h" #include #include @@ -9,19 +36,45 @@ #include #include +#if X264VFW_USE_DECODER #include #include -#ifdef HAVE_SWSCALE +#if !FFMPEG_HAVE_IMG_CONVERT #include +#else +int img_convert(AVPicture *dst, int dst_pix_fmt, + const AVPicture *src, int src_pix_fmt, + int src_width, int src_height); +#endif #endif #include "csp.h" - #include "resource.h" -#define X264_MAX(a, b) ((a)>(b) ? (a) : (b)) -#define X264_MIN(a, b) ((a)<(b) ? (a) : (b)) +#ifdef _MSC_VER +#define inline __inline +#endif + +#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +#define UNUSED __attribute__((unused)) +#define ALWAYS_INLINE __attribute__((always_inline)) inline +#define NOINLINE __attribute__((noinline)) +#else +#define UNUSED +#define ALWAYS_INLINE inline +#define NOINLINE +#endif + +#if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__>1) +#define attribute_align_arg __attribute__((force_align_arg_pointer)) +#else +#define attribute_align_arg +#endif + +#define X264_MAX(a, b) (((a)>(b)) ? (a) : (b)) +#define X264_MIN(a, b) (((a)<(b)) ? (a) : (b)) +#define X264_CLIP(v, min, max) (((v)<(min)) ? (min) : ((v)>(max)) ? (max) : (v)) /* Name */ #define X264_NAME_L L"x264vfw" @@ -42,7 +95,7 @@ #define X264VFW_WEBSITE "http://sourceforge.net/projects/x264vfw/" /* Limits */ -#define X264_BITRATE_MAX 9999 +#define X264_BITRATE_MAX 20000 #define X264_QUANT_MAX 51 #define X264_BFRAME_MAX 16 #define X264_THREAD_MAX 128 @@ -50,6 +103,7 @@ #define MAX_STATS_PATH (MAX_PATH - 5) // -5 because x264 add ".temp" for temp file #define MAX_STATS_SIZE X264_MAX(MAX_STATS_PATH, MAX_PATH) #define MAX_CMDLINE 4096 +#define MAX_ZONES_SIZE 4096 typedef char fourcc_str[4 + 1]; @@ -58,7 +112,7 @@ typedef struct { int b_save; - /* Bitrate */ + /* Main */ int i_encoding_type; int i_qp; int i_rf_constant; /* 1pass VBR, nominal QP */ @@ -69,56 +123,112 @@ typedef struct char stats[MAX_STATS_SIZE]; char extra_cmdline[MAX_CMDLINE]; - /* Rate Control */ - int i_key_boost; - int i_b_red; - int i_curve_comp; - int i_qp_min; - int i_qp_max; - int i_qp_step; - int i_scenecut_threshold; - int i_keyint_min; - int i_keyint_max; + /* Misc */ + int i_avc_level; + int i_sar_width; + int i_sar_height; + + /* Debug */ + int i_log_level; + int b_psnr; + int b_ssim; + int b_no_asm; + + /* VFW */ + int i_fcc_num; + fourcc_str fcc; /* fourcc used */ +#if X264VFW_USE_VIRTUALDUB_HACK + int b_vd_hack; +#endif +#if X264VFW_USE_DECODER + int b_disable_decoder; +#endif - /* MBs & Frames */ + /* Analysis */ int b_dct8x8; + int b_intra_i8x8; + int b_intra_i4x4; int b_i8x8; int b_i4x4; int b_psub16x16; int b_psub8x8; int b_bsub16x16; + int b_fast_pskip; + int i_refmax; + int b_mixedref; + int i_me_method; + int i_me_range; + int i_subpel_refine; + int b_chroma_me; + float f_psy_rdo; + int i_keyint_min; + int i_keyint_max; + int i_scenecut_threshold; + int b_pre_scenecut; int i_bframe; - int b_vd_hack; + int i_bframe_adaptive; int i_bframe_bias; - int b_bframe_adaptive; + int i_direct_mv_pred; int b_b_refs; int b_b_wpred; - int b_bidir_me; - int i_direct_mv_pred; - /* More... */ - int i_subpel_refine; - int b_brdo; - int i_me_method; - int i_me_range; - int b_chroma_me; - int i_refmax; - int b_mixedref; - int i_log_level; - int i_fcc_num; - fourcc_str fcc; /* fourcc used */ - int i_sar_width; - int i_sar_height; - int i_threads; - int b_cabac; - int i_trellis; - int i_noise_reduction; + /* Encoding */ int b_filter; int i_inloop_a; int i_inloop_b; - int b_interlaced; + int i_interlaced; + int b_cabac; + int b_dct_decimate; + int i_noise_reduction; + int i_trellis; + int i_intra_deadzone; + int i_inter_deadzone; + int i_cqm; + char cqmfile[MAX_PATH]; + float f_psy_trellis; + + /* Rate control */ + int i_vbv_maxrate; + int i_vbv_bufsize; + int i_vbv_occupancy; + int i_qp_min; + int i_qp_max; + int i_qp_step; + float f_ipratio; + float f_pbratio; + int i_chroma_qp_offset; + float f_qcomp; + float f_cplxblur; + float f_qblur; + float f_ratetol; + + /* AQ */ + int i_aq_mode; + float f_aq_strength; +#if X264_PATCH_VAQ_MOD + int i_aq_metric; + float f_aq_sensitivity; +#endif + + /* Multithreading */ +#if X264VFW_USE_THREADS + int i_threads; + int b_mt_deterministic; +#if X264_PATCH_THREAD_POOL + int i_thread_queue; +#endif +#endif + + /* VUI */ + int i_overscan; + int i_vidformat; + int i_fullrange; + int i_colorprim; + int i_transfer; + int i_colmatrix; + int i_chromaloc; - /* Command Line */ + /* Config */ int b_use_cmdline; char cmdline[MAX_CMDLINE]; } CONFIG; @@ -140,19 +250,22 @@ typedef struct HWND hCons; BOOL b_visible; -#ifdef BUGGY_APPS_HACK +#if X264VFW_USE_BUGGY_APPS_HACK BITMAPINFOHEADER *prev_lpbiOutput; DWORD prev_output_biSizeImage; #endif -#ifdef VIRTUALDUB_HACK - int i_frame_remain; -#endif +#if X264VFW_USE_VIRTUALDUB_HACK int b_use_vd_hack; + DWORD save_fcc; +#endif int b_no_output; + int i_frame_remain; x264_csp_function_t csp; x264_picture_t conv_pic; +#if X264VFW_USE_DECODER + int decoder_enabled; AVCodec *decoder; AVCodecContext *decoder_context; AVFrame *decoder_frame; @@ -161,9 +274,10 @@ typedef struct enum PixelFormat decoder_pix_fmt; int decoder_vflip; int decoder_swap_UV; -#ifdef HAVE_SWSCALE +#if !FFMPEG_HAVE_IMG_CONVERT struct SwsContext *sws; #endif +#endif } CODEC; /* Compress functions */ @@ -176,12 +290,14 @@ LRESULT compress_end(CODEC *); LRESULT compress_frames_info(CODEC *, ICCOMPRESSFRAMES *); void default_compress_frames_info(CODEC *); +#if X264VFW_USE_DECODER /* Decompress functions */ LRESULT decompress_get_format(CODEC *, BITMAPINFO *, BITMAPINFO *); LRESULT decompress_query(CODEC *, BITMAPINFO *, BITMAPINFO *); LRESULT decompress_begin(CODEC *, BITMAPINFO *, BITMAPINFO *); LRESULT decompress(CODEC *, ICDECOMPRESS *); LRESULT decompress_end(CODEC *); +#endif /* Log functions */ void x264_log_vfw_create(CODEC *codec); @@ -216,7 +332,7 @@ static const fourcc_str fcc_str_table[] = #ifdef _DEBUG #include /* vsprintf */ #define DPRINTF_BUF_SZ 1024 -static __inline void DPRINTF(const char *fmt, ...) +static inline void DPRINTF(const char *fmt, ...) { va_list args; char buf[DPRINTF_BUF_SZ]; @@ -226,7 +342,7 @@ static __inline void DPRINTF(const char *fmt, ...) va_end(args); OutputDebugString(buf); } -static __inline void DVPRINTF(const char *fmt, va_list args) +static inline void DVPRINTF(const char *fmt, va_list args) { char buf[DPRINTF_BUF_SZ]; @@ -234,8 +350,8 @@ static __inline void DVPRINTF(const char *fmt, va_list args) OutputDebugString(buf); } #else -static __inline void DPRINTF(const char *fmt, ...) { } -static __inline void DVPRINTF(const char *fmt, va_list args) {} +static inline void DPRINTF(const char *fmt, ...) { } +static inline void DVPRINTF(const char *fmt, va_list args) {} #endif #endif diff --git a/x264vfw_config.h b/x264vfw_config.h new file mode 100644 index 0000000..fb9e23f --- /dev/null +++ b/x264vfw_config.h @@ -0,0 +1,16 @@ +#ifndef X264VFW_X264VFW_CONFIG_H +#define X264VFW_X264VFW_CONFIG_H + +#define X264VFW_USE_DECODER 1 +#define X264VFW_USE_THREADS 1 +#define X264VFW_USE_BUGGY_APPS_HACK 0 +#define X264VFW_USE_VIRTUALDUB_HACK 1 +#define X264VFW_CSP_BT_709 0 +#define X264VFW_CSP_PC_SCALE 0 +#define X264_PATCH_VAQ_MOD 1 +#define X264_PATCH_THREAD_POOL 1 +#define X264_PATCH_HDR 0 +#define FFMPEG_HAVE_RGB24_FIXED 1 +#define FFMPEG_HAVE_IMG_CONVERT 1 + +#endif diff --git a/x264vfw_config.mak b/x264vfw_config.mak new file mode 100644 index 0000000..cf2f3cf --- /dev/null +++ b/x264vfw_config.mak @@ -0,0 +1,2 @@ +HAVE_FFMPEG=yes +HAVE_SWSCALE=no