Index: vfw/config.c =================================================================== --- vfw/config.c (revision 425) +++ vfw/config.c (working copy) @@ -72,6 +72,7 @@ } reg_str_t; CONFIG reg; +HWND hTooltip; HWND hTabs[8]; static const reg_int_t reg_int_table[] = { @@ -100,6 +101,7 @@ { "b_refs", ®.b_b_refs, 0 }, { "b_bias", ®.i_bframe_bias, 0 }, { "b_adapt", ®.b_bframe_adaptive, 1 }, + { "b_bidir_me", ®.b_bidir_me, 1 }, { "b_wpred", ®.b_b_wpred, 1 }, { "inloop_a", ®.i_inloop_a, 0 }, { "inloop_b", ®.i_inloop_b, 0 }, @@ -108,7 +110,7 @@ { "curve_comp", ®.i_curve_comp, 60 }, { "sar_width", ®.i_sar_width, 1 }, { "sar_height", ®.i_sar_height, 1 }, - + { "noise_reduction",®.i_noise_reduction, 0 }, { "log_level", ®.i_log_level, 1 }, /* analysis */ @@ -122,7 +124,8 @@ { "me_range", ®.i_me_range, 16 }, { "chroma_me", ®.b_chroma_me, 1 }, { "subpel", ®.i_subpel_refine, 4 }, - { "mixedref", ®.b_mixedref, 0 } + { "mixedref", ®.b_mixedref, 0 }, + { "trellis", ®.i_trellis, 1 } }; @@ -232,6 +235,30 @@ } +/* assigns tooltips */ + +BOOL CALLBACK enum_tooltips(HWND hWnd, LPARAM lParam) +{ + char help[500]; + + /* The tooltip for a control is named the same as the control itself */ + if (LoadString(g_hInst, GetDlgCtrlID(hWnd), help, 500)) + { + TOOLINFO ti; + + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND; + ti.hwnd = GetParent(hWnd); + ti.uId = (LPARAM)hWnd; + ti.lpszText = help; + + SendMessage(hTooltip, TTM_ADDTOOL, 0, (LPARAM)&ti); + } + + return TRUE; +} + + /* Main window */ BOOL CALLBACK callback_main( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) @@ -266,6 +293,15 @@ MoveWindow(hTabs[2], rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top-40, TRUE); MoveWindow(hTabs[3], rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top-40, TRUE); + if ((hTooltip = CreateWindow(TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, g_hInst, NULL))) + { + SetWindowPos(hTooltip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); + SendMessage(hTooltip, TTM_SETMAXTIPWIDTH, 0, 400); + EnumChildWindows(hDlg, enum_tooltips, 0); + } + tabs_enable_items( hDlg, config ); tabs_update_items( hDlg, config ); ShowWindow( hTabs[0], SW_SHOW ); @@ -336,7 +372,7 @@ { char szTmp[1024]; sprintf( szTmp, "Core %d%s, build %s %s", X264_BUILD, X264_VERSION, __DATE__, __TIME__ ); - SetDlgItemText( hTabs[3], IDC_BUILDREV, szTmp ); + SetDlgItemText( hTabs[0], IDC_BUILDREV, szTmp ); switch( config->i_encoding_type ) { @@ -385,10 +421,12 @@ EnableWindow( GetDlgItem( hTabs[2], IDC_BREFS ), config->i_bframe > 1 ); EnableWindow( GetDlgItem( hTabs[2], IDC_WBPRED ), config->i_bframe > 1 ); EnableWindow( GetDlgItem( hTabs[2], IDC_BADAPT ), config->i_bframe > 0 ); + EnableWindow( GetDlgItem( hTabs[2], IDC_BIDIR_ME ), config->i_bframe > 0 ); EnableWindow( GetDlgItem( hTabs[2], IDC_BBIAS ), config->i_bframe > 0 ); EnableWindow( GetDlgItem( hTabs[2], IDC_BBIASSLIDER ), config->i_bframe > 0 ); EnableWindow( GetDlgItem( hTabs[3], IDC_MERANGE ), config->i_me_method > 1 ); EnableWindow( GetDlgItem( hTabs[3], IDC_CHROMAME ), config->i_subpel_refine >= 4 ); + EnableWindow( GetDlgItem( hTabs[3], IDC_TRELLIS ), config->b_cabac ); } void tabs_update_items( HWND hDlg, CONFIG * config ) @@ -466,8 +504,11 @@ /* update misc. tab */ SetDlgItemInt( hTabs[3], IDC_THREADEDIT, config->i_threads, FALSE ); + SetDlgItemInt( hTabs[3], IDC_NR, config->i_noise_reduction, FALSE ); CheckDlgButton( hTabs[3],IDC_CABAC, config->b_cabac ? BST_CHECKED : BST_UNCHECKED ); + CheckDlgButton( hTabs[3],IDC_TRELLIS, + config->i_trellis ? BST_CHECKED: BST_UNCHECKED ); CheckDlgButton( hTabs[3],IDC_LOOPFILTER, config->b_filter ? BST_CHECKED: BST_UNCHECKED ); @@ -505,6 +546,8 @@ config->b_b_wpred ? BST_CHECKED: BST_UNCHECKED ); CheckDlgButton( hTabs[2],IDC_BADAPT, config->b_bframe_adaptive ? BST_CHECKED: BST_UNCHECKED ); + CheckDlgButton( hTabs[2],IDC_BIDIR_ME, + config->b_bidir_me ? BST_CHECKED: BST_UNCHECKED ); CheckDlgButton( hTabs[2],IDC_BREFS, config->b_b_refs ? BST_CHECKED: BST_UNCHECKED ); CheckDlgButton( hTabs[2],IDC_B16X16, @@ -534,6 +577,7 @@ SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"4"); SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"5 (High Quality)"); SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"6 (RDO - Slowest)"); + SendDlgItemMessage(hTabs[3], IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"6 (RDO on B frames)"); } SendDlgItemMessage(hTabs[3], IDC_ME_METHOD, CB_SETCURSEL, (config->i_me_method), 0); @@ -564,7 +608,11 @@ { case IDC_CABAC : config->b_cabac = ( IsDlgButtonChecked( hTabs[3], IDC_CABAC ) == BST_CHECKED ); + EnableWindow( GetDlgItem( hTabs[3], IDC_TRELLIS ), config->b_cabac ); break; + case IDC_TRELLIS : + config->i_trellis = ( IsDlgButtonChecked( hTabs[3], IDC_TRELLIS ) == BST_CHECKED ); + break; case IDC_LOOPFILTER : config->b_filter = ( IsDlgButtonChecked( hTabs[3], IDC_LOOPFILTER ) == BST_CHECKED ); EnableWindow( GetDlgItem( hTabs[3], IDC_INLOOP_A ), config->b_filter ); @@ -579,6 +627,9 @@ case IDC_BADAPT : config->b_bframe_adaptive = ( IsDlgButtonChecked( hTabs[2], IDC_BADAPT ) == BST_CHECKED ); break; + case IDC_BIDIR_ME : + config->b_bidir_me = ( IsDlgButtonChecked( hTabs[2], IDC_BIDIR_ME ) == BST_CHECKED ); + break; case IDC_P16X16 : config->b_psub16x16 = ( IsDlgButtonChecked( hTabs[2], IDC_P16X16 ) == BST_CHECKED ); EnableWindow( GetDlgItem( hTabs[2], IDC_P8X8 ), config->b_psub16x16 ); @@ -643,6 +694,8 @@ case IDC_FOURCC : GetDlgItemText( hTabs[3], IDC_FOURCC, config->fcc, 5 ); break; + case IDC_NR : + config->i_noise_reduction = GetDlgItemInt( hTabs[3], IDC_NR, FALSE, FALSE ); case IDC_THREADEDIT : config->i_threads = GetDlgItemInt( hTabs[3], IDC_THREADEDIT, FALSE, FALSE ); if (config->i_threads < 1) @@ -765,6 +818,7 @@ EnableWindow( GetDlgItem( hTabs[2], IDC_WBPRED ), config->i_bframe > 1 ); EnableWindow( GetDlgItem( hTabs[1], IDC_DIRECTPRED ), config->i_bframe > 0 ); EnableWindow( GetDlgItem( hTabs[2], IDC_BADAPT ), config->i_bframe > 0 ); + EnableWindow( GetDlgItem( hTabs[2], IDC_BIDIR_ME ), config->i_bframe > 0 ); EnableWindow( GetDlgItem( hTabs[2], IDC_BBIAS ), config->i_bframe > 0 ); EnableWindow( GetDlgItem( hTabs[2], IDC_BBIASSLIDER ), config->i_bframe > 0 ); break; Index: vfw/resource.rc =================================================================== --- vfw/resource.rc (revision 425) +++ vfw/resource.rc (working copy) @@ -52,6 +52,7 @@ LTEXT "Statsfile name",IDC_STATIC,12,156,48,12,SS_CENTERIMAGE EDITTEXT IDC_STATSFILE,60,156,102,12,ES_AUTOHSCROLL PUSHBUTTON "...",IDC_STATSFILE_BROWSE,168,156,18,12 + CTEXT "BUILD",IDC_BUILDREV,7,52,186,8,SS_CENTERIMAGE | WS_DISABLED END IDD_TAB_IPFRAMES DIALOGEX 0, 0, 200, 188 @@ -78,6 +79,7 @@ CONTROL "",IDC_BBIASSLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,48,162,72,12,WS_EX_TRANSPARENT EDITTEXT IDC_BBIAS,126,162,24,12,ES_AUTOHSCROLL CONTROL "Mixed Refs",IDC_MIXEDREF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,122,24,48,12,WS_EX_TRANSPARENT + CONTROL "Bidirectional ME",IDC_BIDIR_ME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,109,123,72,12,WS_EX_TRANSPARENT END IDD_TAB_RATECONTROL DIALOGEX 0, 0, 200, 188 @@ -88,7 +90,7 @@ GROUPBOX "Quantization Limits",IDC_STATIC,6,56,186,52,WS_DISABLED GROUPBOX "Scene Cuts",IDC_STATIC,6,110,186,70,WS_DISABLED LTEXT "Keyframe boost (%)",IDC_STATIC,42,10,68,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT - LTEXT "B-frames reduction (%)",IDC_STATIC,42,25,78,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT + LTEXT "B-frames reduction (%)",IDC_STATIC,42,24,78,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT LTEXT "Bitrate variability (%)",IDC_STATIC,42,38,68,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT LTEXT "Min QP",IDC_STATIC,42,64,24,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT LTEXT "Max QP",IDC_STATIC,42,78,26,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT @@ -113,10 +115,10 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Strength",IDC_STATIC,82,140,36,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT - LTEXT "Threshold",IDC_STATIC,82,153,36,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT - LTEXT "0",IDC_LOOPA_TXT,166,140,12,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT - LTEXT "0",IDC_LOOPB_TXT,166,153,12,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT + LTEXT "Strength",IDC_STATIC,87,154,36,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT + LTEXT "Threshold",IDC_STATIC,87,167,36,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT + LTEXT "0",IDC_LOOPA_TXT,171,154,12,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT + LTEXT "0",IDC_LOOPB_TXT,171,167,12,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT GROUPBOX "Motion Estimation",IDC_STATIC,7,2,186,64,WS_DISABLED LTEXT "Partition decision",IDC_STATIC,30,12,60,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT LTEXT "Method",IDC_STATIC,30,30,30,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT @@ -127,21 +129,23 @@ LTEXT "Sample AR",IDC_STATIC,10,85,36,12,SS_CENTERIMAGE,WS_EX_TRANSPARENT LTEXT "Threads",IDC_THREADS,10,103,30,12,SS_CENTERIMAGE CTEXT ":",IDC_STATIC,61,85,12,12,SS_CENTERIMAGE - CONTROL "CABAC",IDC_CABAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,126,39,12,WS_EX_TRANSPARENT - CONTROL "Deblocking filter:",IDC_LOOPFILTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,140,66,12 - CONTROL "",IDC_INLOOP_A,"msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,118,141,42,12,WS_EX_TRANSPARENT - CONTROL "",IDC_INLOOP_B,"msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,118,153,42,12,WS_EX_TRANSPARENT + CONTROL "CABAC",IDC_CABAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,140,39,12,WS_EX_TRANSPARENT + CONTROL "Deblocking filter:",IDC_LOOPFILTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,154,66,12 + CONTROL "",IDC_INLOOP_A,"msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,123,155,42,12,WS_EX_TRANSPARENT + CONTROL "",IDC_INLOOP_B,"msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,123,167,42,12,WS_EX_TRANSPARENT EDITTEXT IDC_SAR_W,46,85,18,12,ES_AUTOHSCROLL | ES_NUMBER EDITTEXT IDC_SAR_H,70,85,18,12,ES_AUTOHSCROLL | ES_NUMBER EDITTEXT IDC_THREADEDIT,46,103,18,12,ES_AUTOHSCROLL | ES_NUMBER COMBOBOX IDC_LOG,136,85,48,67,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_FOURCC,136,103,30,12,ES_AUTOHSCROLL - CTEXT "BUILD",IDC_BUILDREV,12,169,174,8,SS_CENTERIMAGE | WS_DISABLED CONTROL "Chroma ME",IDC_CHROMAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,48,48,12,WS_EX_TRANSPARENT COMBOBOX IDC_SUBPEL,90,12,84,77,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_ME_METHOD,84,30,90,67,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_MERANGE,60,48,24,12,ES_AUTOHSCROLL | ES_NUMBER GROUPBOX "Misc. options",IDC_STATIC,7,68,186,113,WS_DISABLED + CONTROL "Trellis",IDC_TRELLIS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,65,140,37,12,WS_EX_TRANSPARENT + LTEXT "Noise Reduction",IDC_STATIC,10,121,56,12,SS_CENTERIMAGE + EDITTEXT IDC_NR,67,121,21,12,ES_AUTOHSCROLL | ES_NUMBER END @@ -191,6 +195,7 @@ RIGHTMARGIN, 193 TOPMARGIN, 7 BOTTOMMARGIN, 181 + HORZGUIDE, 179 END END #endif // APSTUDIO_INVOKED @@ -202,6 +207,46 @@ // IDB_LOGO BITMAP "x264.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDC_KEYINTMIN "Minimum GOP size" + IDC_KEYINTMAX "Maximum GOP size" + IDC_BFRAME "Limit consecutive runs of B-frames" + IDC_DEFAULTS "Resets everything" +END + +STRINGTABLE +BEGIN + IDC_TRELLIS "Enable trellis coding on the final MB" + IDC_BIDIR_ME "Jointly optimize both MVs in B-frames" +END + +STRINGTABLE +BEGIN + IDC_BREFS "Keep some B-frames as references" + IDC_WBPRED "Weighted prediction for B-frames" + IDC_NR "DCT noise reduction amount" + IDC_MIXEDREF "Decide references on a per partition basis" + IDC_BADAPT "Use less B-frames if needed" +END + +STRINGTABLE +BEGIN + IDC_BBIAS "Influence how often B-frames are used" + IDC_SCENECUT "How aggressively to insert extra I-frames" +END + +STRINGTABLE +BEGIN + IDC_DIRECTPRED "Direct MV prediction mode" +END + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// Index: vfw/x264vfw.h =================================================================== --- vfw/x264vfw.h (revision 425) +++ vfw/x264vfw.h (working copy) @@ -99,7 +99,10 @@ int b_save; /* fourcc used */ char fcc[4+1]; - int i_encoding_type; + int i_encoding_type; + int i_trellis; + int b_bidir_me; + int i_noise_reduction; } CONFIG; /* CODEC: vfw codec instance Index: vfw/resource.h =================================================================== --- vfw/resource.h (revision 425) +++ vfw/resource.h (working copy) @@ -76,6 +76,7 @@ #define IDC_SAR_H 1063 #define IDC_I8X8 1064 #define IDC_DCT8X8 1065 +#define IDC_NR 1065 #define IDC_ME_METHOD 1066 #define IDC_MIXEDREF 1066 #define IDC_CHROMAME 1067 @@ -97,6 +98,8 @@ #define IDC_BITRATELABEL 1092 #define IDC_LOGO 1093 #define IDC_BUILDREV 1095 +#define IDC_TRELLIS 1097 +#define IDC_BIDIR_ME 1098 // Next default values for new objects // @@ -104,7 +107,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 109 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1096 +#define _APS_NEXT_CONTROL_VALUE 1101 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif Index: vfw/codec.c =================================================================== --- vfw/codec.c (revision 425) +++ vfw/codec.c (working copy) @@ -199,6 +199,7 @@ param.rc.psz_stat_out = malloc (MAX_PATH); param.rc.psz_stat_in = malloc (MAX_PATH); param.i_threads = config->i_threads; + param.analyse.i_noise_reduction = config->i_noise_reduction; param.i_log_level = config->i_log_level - 1; param.pf_log = x264_log_vfw; @@ -225,6 +226,9 @@ param.rc.i_qp_step = config->i_qp_step; param.b_deblocking_filter = config->b_filter; param.b_cabac = config->b_cabac; + if( config->b_cabac && config->i_trellis ) + param.analyse.i_trellis = 1; + param.analyse.b_chroma_me = config->b_chroma_me; param.rc.f_ip_factor = 1 + (float)config->i_key_boost / 100; param.rc.f_pb_factor = 1 + (float)config->i_b_red / 100; @@ -238,8 +242,15 @@ if( config->i_bframe > 1 && config->b_b_refs) param.b_bframe_pyramid = 1; param.b_bframe_adaptive = config->b_bframe_adaptive; + param.analyse.b_bidir_me = config->b_bidir_me; param.i_bframe_bias = config->i_bframe_bias; - param.analyse.i_subpel_refine = config->i_subpel_refine + 1; /* 0..4 -> 1..5 */ + param.analyse.i_subpel_refine = config->i_subpel_refine + 1; /* 0..5 -> 1..6 */ + if (param.analyse.i_subpel_refine == 7) + { + param.analyse.i_subpel_refine = 6; + param.analyse.b_bframe_rdo = 1; + } + param.analyse.i_me_method = config->i_me_method; param.analyse.i_me_range = config->i_me_range;