From: Loren Merritt Date: Mon, 10 Jan 2005 09:29:31 +0000 (+0000) Subject: updated VfW interface by Radek Czyz X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ccb93c1a78a8dfeb1953426b89494f6f5d36fec;p=libx264 updated VfW interface by Radek Czyz git-svn-id: svn://svn.videolan.org/x264/trunk@89 df754926-b1dd-0310-bc7b-ec298dee348c --- diff --git a/vfw/build/win32/x264vfw.dsp b/vfw/build/win32/x264vfw.dsp index 0fadf913..fb0153cd 100644 --- a/vfw/build/win32/x264vfw.dsp +++ b/vfw/build/win32/x264vfw.dsp @@ -1,135 +1,137 @@ -# Microsoft Developer Studio Project File - Name="x264vfw" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=x264vfw - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "x264vfw.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "x264vfw.mak" CFG="x264vfw - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "x264vfw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "x264vfw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "x264vfw - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "obj/Release" -# PROP Intermediate_Dir "obj/Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../../extras" /I "../../.." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x804 /d "NDEBUG" -# ADD RSC /l 0x804 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 winmm.lib vfw32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"bin/x264vfw.dll" - -!ELSEIF "$(CFG)" == "x264vfw - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "obj/Debug" -# PROP Intermediate_Dir "obj/Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../../extras" /I "../../.." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x804 /d "_DEBUG" -# ADD RSC /l 0x804 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"bin/x264vfw.dll" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "x264vfw - Win32 Release" -# Name "x264vfw - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\codec.c -# End Source File -# Begin Source File - -SOURCE=..\..\config.c -# End Source File -# Begin Source File - -SOURCE=..\..\driverproc.c -# End Source File -# Begin Source File - -SOURCE=..\..\driverproc.def -# End Source File -# Begin Source File - -SOURCE=..\..\resource.rc -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\resource.h -# End Source File -# Begin Source File - -SOURCE=..\..\x264vfw.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=..\..\..\build\win32\bin\libx264.lib -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="x264vfw" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=x264vfw - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "x264vfw.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "x264vfw.mak" CFG="x264vfw - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "x264vfw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "x264vfw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=xicl6.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "x264vfw - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "obj/Release" +# PROP Intermediate_Dir "obj/Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../../extras" /I "../../.." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /FR /YX /FD /c +# SUBTRACT CPP /Z +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x804 /d "NDEBUG" +# ADD RSC /l 0x804 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=xilink6.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 winmm.lib vfw32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"bin/x264vfw.dll" +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "x264vfw - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "obj/Debug" +# PROP Intermediate_Dir "obj/Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../../extras" /I "../../.." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x804 /d "_DEBUG" +# ADD RSC /l 0x804 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=xilink6.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"bin/x264vfw.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "x264vfw - Win32 Release" +# Name "x264vfw - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\codec.c +# End Source File +# Begin Source File + +SOURCE=..\..\config.c +# End Source File +# Begin Source File + +SOURCE=..\..\driverproc.c +# End Source File +# Begin Source File + +SOURCE=..\..\driverproc.def +# End Source File +# Begin Source File + +SOURCE=..\..\resource.rc +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\resource.h +# End Source File +# Begin Source File + +SOURCE=..\..\x264vfw.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=..\..\..\build\win32\bin\libx264.lib +# End Source File +# End Target +# End Project diff --git a/vfw/codec.c b/vfw/codec.c index 076d7962..197bd862 100644 --- a/vfw/codec.c +++ b/vfw/codec.c @@ -24,6 +24,8 @@ #include "x264vfw.h" +#include /* debug only */ + /* get_csp: * return a valid x264 CSP or X264_CSP_NULL if unsuported */ static int get_csp( BITMAPINFOHEADER *hdr ) @@ -130,6 +132,7 @@ LRESULT compress_begin(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiO { CONFIG *config = &codec->config; x264_param_t param; + static char statsfile[] = ".\\x264.stats"; /* Destroy previous handle */ if( codec->h != NULL ) @@ -141,37 +144,66 @@ LRESULT compress_begin(CODEC * codec, BITMAPINFO * lpbiInput, BITMAPINFO * lpbiO /* Get default param */ x264_param_default( ¶m ); + param.i_log_level = X264_LOG_NONE; + param.analyse.b_psnr = 0; + param.analyse.inter = param.analyse.intra = 0; + /* Set params: TODO to complete */ param.i_width = lpbiInput->bmiHeader.biWidth; param.i_height= lpbiInput->bmiHeader.biHeight; - if( codec->fbase > 0 ) - param.f_fps = (float)codec->fincr / (float)codec->fbase; + param.i_fps_num = codec->fbase; + param.i_fps_den = codec->fincr; param.i_frame_reference = config->i_refmax; param.i_idrframe = config->i_idrframe; param.i_iframe = config->i_iframe; - param.i_qp_constant = config->i_qp; param.b_deblocking_filter = config->b_filter; param.b_cabac = config->b_cabac; - param.analyse.intra = 0; - param.analyse.inter = 0; + param.i_bframe = config->i_bframe; + param.analyse.i_subpel_refine = config->i_subpel_refine + 1; /* 0..4 -> 1..5 */ + + /* bframe prediction - gui goes alphabetically, so 0=NONE, 1=SPATIAL, 2=TEMPORAL */ + switch(config->i_direct_mv_pred) { + case 0: param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_NONE; break; + case 1: param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL; break; + case 2: param.analyse.i_direct_mv_pred = X264_DIRECT_PRED_TEMPORAL; break; + } + param.i_deblocking_filter_alphac0 = config->i_inloop_a; + param.i_deblocking_filter_beta = config->i_inloop_b; + + if( config->b_bsub16x16 ) + param.analyse.inter |= X264_ANALYSE_BSUB16x16; + if( config->b_psub16x16 ) param.analyse.inter |= X264_ANALYSE_PSUB16x16; if( config->b_psub8x8 ) param.analyse.inter |= X264_ANALYSE_PSUB8x8; - if( config->b_i4x4 ) - { + if( config->b_i4x4 ) { param.analyse.intra |= X264_ANALYSE_I4x4; param.analyse.inter |= X264_ANALYSE_I4x4; } - switch( config->mode ) + switch( config->i_encoding_type ) { - case 0: /* 1 PASS */ + case 0: /* 1 PASS CBR */ + param.rc.b_cbr = 1; + param.rc.i_bitrate = config->bitrate; + break; + case 1: /* 1 PASS CQ */ + param.rc.i_qp_constant = config->i_qp; break; default: + case 2: /* 2 PASS */ + param.rc.psz_stat_out = param.rc.psz_stat_in = ".\\x264.stats"; + if (config->i_pass == 1) + param.rc.b_stat_write = 1; + else { + param.rc.i_bitrate = config->i_2passbitrate; + param.rc.b_stat_read = 1; + param.rc.b_cbr = 1; + } break; } @@ -253,15 +285,18 @@ LRESULT compress( CODEC *codec, ICCOMPRESS *icc ) /* encode it */ x264_encoder_encode( codec->h, &nal, &i_nal, &pic ); - /* create bitstream */ + /* create bitstream, unless we're dropping it in 1st pass */ i_out = 0; - for( i = 0; i < i_nal; i++ ) - { - int i_size = outhdr->biSizeImage - i_out; - x264_nal_encode( (uint8_t*)icc->lpOutput + i_out, &i_size, 1, &nal[i] ); - i_out += i_size; + if (codec->config.i_encoding_type != 2 || codec->config.i_pass > 1) { + for( i = 0; i < i_nal; i++ ) { + int i_size = outhdr->biSizeImage - i_out; + x264_nal_encode( (uint8_t*)icc->lpOutput + i_out, &i_size, 1, &nal[i] ); + + i_out += i_size; + } } + outhdr->biSizeImage = i_out; /* Set key frame only for IDR, as they are real synch point, I frame diff --git a/vfw/config.c b/vfw/config.c index 79f5a7ba..ecc12a40 100644 --- a/vfw/config.c +++ b/vfw/config.c @@ -35,18 +35,18 @@ #include /* Registry */ -#define X264_REG_KEY HKEY_CURRENT_USER -#define X264_REG_PARENT "Software\\GNU\\x264" +#define X264_REG_KEY HKEY_CURRENT_USER +#define X264_REG_PARENT "Software\\GNU" #define X264_REG_CHILD "x264" #define X264_REG_CLASS "config" /* window controls */ -#define BITRATE_MAX 5000 -#define QUANT_MAX 51 +#define BITRATE_MAX 5000 +#define QUANT_MAX 51 /* description */ -#define X264_NAME "x264" -#define X264_DEF_TEXT "Are you sure you want to load default vaules" +#define X264_NAME "x264" +#define X264_DEF_TEXT "Are you sure you want to load default vaules" /* Registery handling */ typedef struct @@ -70,23 +70,32 @@ static const reg_int_t reg_int_table[] = { "bitrate", ®.bitrate, 800 }, { "quantizer", ®.i_qp, 26 }, { "encoding_type", ®.i_encoding_type, 1 }, + { "passbitrate", ®.i_2passbitrate, 800 }, + { "pass_number", ®.i_pass, 1 }, /* Advance dialog */ { "cabac", ®.b_cabac, 1 }, { "loop_filter", ®.b_filter, 1 }, { "idrframe", ®.i_idrframe, 1 }, - { "iframe", ®.i_iframe, 150 }, + { "iframe", ®.i_iframe, 250}, { "refmax", ®.i_refmax, 1 }, + { "bmax", ®.i_bframe, 0 }, + {"direct_pred", ®.i_direct_mv_pred, 2 }, + {"inloop_a", ®.i_inloop_a, 0 }, + {"inloop_b", ®.i_inloop_b, 0 }, /* analysis */ {"i4x4", ®.b_i4x4, 1 }, {"psub16x16", ®.b_psub16x16, 1 }, - {"psub8x8", ®.b_psub8x8, 1 } + {"psub8x8", ®.b_psub8x8, 0 }, + {"bsub16x16", ®.b_bsub16x16, 1 }, + {"subpel", ®.i_subpel_refine, 3 } + }; static const reg_str_t reg_str_table[] = { - { "fourcc", reg.fcc, "x264" } + { "fourcc", reg.fcc, "h264" } }; void config_reg_load( CONFIG *config ) @@ -164,15 +173,17 @@ void config_reg_defaults( CONFIG *config ) { HKEY hKey; - /* Just in case */ - memset( config, 0, sizeof( CONFIG ) ); - - if(RegOpenKeyEx( X264_REG_KEY, X264_REG_PARENT, 0, KEY_ALL_ACCESS, &hKey )) + if(RegOpenKeyEx( X264_REG_KEY, X264_REG_PARENT, 0, KEY_ALL_ACCESS, &hKey )) { return; - if( RegDeleteKey( hKey, X264_REG_CHILD ) ) + } + if( RegDeleteKey( hKey, X264_REG_CHILD ) ) { return; + } RegCloseKey( hKey ); + /* Just in case */ + memset( config, 0, sizeof( CONFIG ) ); + config_reg_load( config ); config_reg_save( config ); } @@ -190,7 +201,12 @@ static void main_enable_item( HWND hDlg, CONFIG * config ) EnableWindow( GetDlgItem( hDlg, IDC_QUANTEDIT ), FALSE ); EnableWindow( GetDlgItem( hDlg, IDC_QUANTSLIDER ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASS1 ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASS2 ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE_S ), FALSE ); break; + case 1 : /* 1 Pass, Quantizer Based */ EnableWindow( GetDlgItem( hDlg, IDC_BITRATEEDIT ), FALSE ); EnableWindow( GetDlgItem( hDlg, IDC_BITRATESLIDER ), FALSE ); @@ -198,9 +214,24 @@ static void main_enable_item( HWND hDlg, CONFIG * config ) EnableWindow( GetDlgItem( hDlg, IDC_QUANTEDIT ), TRUE ); EnableWindow( GetDlgItem( hDlg, IDC_QUANTSLIDER ), TRUE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASS1 ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASS2 ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE_S ), FALSE ); break; + case 2 : /* 2 Pass */ - /* not yet implemented */ + EnableWindow( GetDlgItem( hDlg, IDC_BITRATEEDIT ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_BITRATESLIDER ), FALSE ); + + EnableWindow( GetDlgItem( hDlg, IDC_QUANTEDIT ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_QUANTSLIDER ), FALSE ); + + EnableWindow( GetDlgItem( hDlg, IDC_2PASS1 ), TRUE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASS2 ), TRUE ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE ), config->i_pass > 1 ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE_S ), config->i_pass > 1 ); + break; } @@ -208,6 +239,10 @@ static void main_enable_item( HWND hDlg, CONFIG * config ) (LPARAM) MAKELONG( 0, BITRATE_MAX ) ); SendDlgItemMessage( hDlg, IDC_QUANTSLIDER, TBM_SETRANGE, TRUE, (LPARAM) MAKELONG( 0, QUANT_MAX ) ); + SendDlgItemMessage( hDlg, IDC_2PASSBITRATE_S, TBM_SETRANGE, TRUE, + (LPARAM) MAKELONG( 0, BITRATE_MAX ) ); + + } /* Updates the window from config */ @@ -215,6 +250,7 @@ static void main_update_dlg( HWND hDlg, CONFIG * config ) { SetDlgItemInt( hDlg, IDC_BITRATEEDIT, config->bitrate, FALSE ); SetDlgItemInt( hDlg, IDC_QUANTEDIT, config->i_qp, FALSE ); + SetDlgItemInt( hDlg, IDC_2PASSBITRATE, config->i_2passbitrate, FALSE ); switch( config->i_encoding_type ) { @@ -223,12 +259,22 @@ static void main_update_dlg( HWND hDlg, CONFIG * config ) IDC_RADIOBITRATE, IDC_RADIOTWOPASS, IDC_RADIOBITRATE); break; case 1 : /* 1 Pass, Quantizer Based */ - CheckRadioButton(hDlg, - IDC_RADIOBITRATE, IDC_RADIOTWOPASS, IDC_RADIOQUANT); + CheckRadioButton( hDlg, + IDC_RADIOBITRATE, IDC_RADIOTWOPASS, IDC_RADIOQUANT); break; case 2 : /* 2 Pass */ - CheckRadioButton(hDlg, - IDC_RADIOBITRATE, IDC_RADIOTWOPASS, IDC_RADIOTWOPASS); + CheckRadioButton( hDlg, + IDC_RADIOBITRATE, IDC_RADIOTWOPASS, IDC_RADIOTWOPASS); + + if (config->i_pass == 1) + CheckRadioButton(hDlg, + IDC_2PASS1, IDC_2PASS2, IDC_2PASS1); + else + CheckRadioButton(hDlg, + IDC_2PASS1, IDC_2PASS2, IDC_2PASS2); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE ), config->i_pass > 1 ); + EnableWindow( GetDlgItem( hDlg, IDC_2PASSBITRATE_S ), config->i_pass > 1 ); + break; } @@ -236,6 +282,9 @@ static void main_update_dlg( HWND hDlg, CONFIG * config ) config->bitrate ); SendDlgItemMessage( hDlg, IDC_QUANTSLIDER, TBM_SETPOS, TRUE, config->i_qp ); + SendDlgItemMessage( hDlg, IDC_2PASSBITRATE_S, TBM_SETPOS, TRUE, + config->i_2passbitrate ); + } @@ -297,6 +346,16 @@ BOOL CALLBACK callback_main( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam main_enable_item( hDlg, config ); main_update_dlg( hDlg, config ); break; + case IDC_2PASS1 : + config->i_pass = 1; /* 1st pass */ + main_enable_item( hDlg, config ); + main_update_dlg( hDlg, config ); + break; + case IDC_2PASS2 : + config->i_pass = 2; /* 2nd pass */ + main_enable_item( hDlg, config ); + main_update_dlg( hDlg, config ); + break; } break; case EN_CHANGE : @@ -310,6 +369,10 @@ BOOL CALLBACK callback_main( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam config->i_qp = GetDlgItemInt( hDlg, IDC_QUANTEDIT, FALSE, FALSE ); SendDlgItemMessage( hDlg, IDC_QUANTSLIDER, TBM_SETPOS, TRUE, config->i_qp ); break; + case IDC_2PASSBITRATE : + config->i_2passbitrate = GetDlgItemInt( hDlg, IDC_2PASSBITRATE, FALSE, FALSE ); + SendDlgItemMessage( hDlg, IDC_2PASSBITRATE_S, TBM_SETPOS, TRUE, config->i_2passbitrate ); + break; } break; default: @@ -329,6 +392,11 @@ BOOL CALLBACK callback_main( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam config->i_qp = SendDlgItemMessage( hDlg, IDC_QUANTSLIDER, TBM_GETPOS, 0, 0 ); SetDlgItemInt( hDlg, IDC_QUANTEDIT, config->i_qp, FALSE ); } + else if( (HWND) lParam == GetDlgItem( hDlg, IDC_2PASSBITRATE_S ) ) + { + config->i_2passbitrate = SendDlgItemMessage( hDlg, IDC_2PASSBITRATE_S, TBM_GETPOS, 0, 0 ); + SetDlgItemInt( hDlg, IDC_2PASSBITRATE, config->i_2passbitrate, FALSE ); + } break; default : @@ -365,18 +433,62 @@ BOOL CALLBACK callback_about( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam return 1; } +static void set_dlgitem_int(HWND hDlg, UINT item, int value) +{ + char buf[8]; + sprintf(buf, "%i", value); + SetDlgItemText(hDlg, item, buf); +} + static void adv_update_dlg( HWND hDlg, CONFIG * config ) { char fourcc[5]; + SendDlgItemMessage(hDlg, IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"None"); + SendDlgItemMessage(hDlg, IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"Spatial"); + SendDlgItemMessage(hDlg, IDC_DIRECTPRED, CB_ADDSTRING, 0, (LPARAM)"Temporal"); + + SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"1 (Fastest)"); + SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"2"); + SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"3"); + SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"4"); + SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_ADDSTRING, 0, (LPARAM)"5 (Max Quality)"); + CheckDlgButton( hDlg,IDC_CABAC, config->b_cabac ? BST_CHECKED : BST_UNCHECKED ); CheckDlgButton( hDlg,IDC_LOOPFILTER, config->b_filter ? BST_CHECKED: BST_UNCHECKED ); + CheckDlgButton( hDlg,IDC_P16X16, + config->b_psub16x16 ? BST_CHECKED: BST_UNCHECKED ); + CheckDlgButton( hDlg,IDC_P8X8, + config->b_psub8x8 ? BST_CHECKED: BST_UNCHECKED ); + CheckDlgButton( hDlg,IDC_B16X16, + config->b_bsub16x16 ? BST_CHECKED: BST_UNCHECKED ); + CheckDlgButton( hDlg,IDC_I4X4, + config->b_i4x4 ? BST_CHECKED: BST_UNCHECKED ); SetDlgItemInt( hDlg, IDC_IDRFRAMES, config->i_idrframe, FALSE ); SetDlgItemInt( hDlg, IDC_IFRAMES, config->i_iframe, FALSE ); SetDlgItemInt( hDlg, IDC_KEYFRAME, config->i_refmax, FALSE ); + SetDlgItemInt( hDlg, IDC_BFRAME, config->i_bframe, FALSE ); + + SendDlgItemMessage(hDlg, IDC_DIRECTPRED, CB_SETCURSEL, (config->i_direct_mv_pred), 0); + SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_SETCURSEL, (config->i_subpel_refine), 0); + + SendDlgItemMessage( hDlg, IDC_INLOOP_A, TBM_SETRANGE, TRUE, + (LPARAM) MAKELONG( -6, 6 ) ); + SendDlgItemMessage( hDlg, IDC_INLOOP_B, TBM_SETRANGE, TRUE, + (LPARAM) MAKELONG( -6, 6 ) ); + + SendDlgItemMessage( hDlg, IDC_INLOOP_A, TBM_SETPOS, TRUE, + config->i_inloop_a ); + SendDlgItemMessage( hDlg, IDC_INLOOP_B, TBM_SETPOS, TRUE, + config->i_inloop_b ); + set_dlgitem_int( hDlg, IDC_LOOPA_TXT, config->i_inloop_a); + set_dlgitem_int( hDlg, IDC_LOOPB_TXT, config->i_inloop_b); + + EnableWindow( GetDlgItem( hDlg, IDC_P8X8 ), config->b_psub16x16 ); + memcpy( fourcc, config->fcc, 4 ); fourcc[4] = '\0'; @@ -384,7 +496,6 @@ static void adv_update_dlg( HWND hDlg, CONFIG * config ) SetDlgItemText( hDlg, IDC_FOURCC, fourcc ); } - /* advanced configuration dialog process */ BOOL CALLBACK callback_advanced( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { @@ -414,6 +525,19 @@ BOOL CALLBACK callback_advanced( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa case IDC_LOOPFILTER : config->b_filter = ( IsDlgButtonChecked( hDlg, IDC_LOOPFILTER ) == BST_CHECKED ); break; + case IDC_P16X16 : + config->b_psub16x16 = ( IsDlgButtonChecked( hDlg, IDC_P16X16 ) == BST_CHECKED ); + EnableWindow( GetDlgItem( hDlg, IDC_P8X8 ), config->b_psub16x16 ); + break; + case IDC_P8X8 : + config->b_psub8x8 = ( IsDlgButtonChecked( hDlg, IDC_P8X8 ) == BST_CHECKED ); + break; + case IDC_B16X16 : + config->b_bsub16x16 = ( IsDlgButtonChecked( hDlg, IDC_B16X16 ) == BST_CHECKED ); + break; + case IDC_I4X4 : + config->b_i4x4 = ( IsDlgButtonChecked( hDlg, IDC_I4X4 ) == BST_CHECKED ); + break; } break; case EN_CHANGE : @@ -431,10 +555,36 @@ BOOL CALLBACK callback_advanced( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa case IDC_FOURCC : GetDlgItemText( hDlg, IDC_FOURCC, config->fcc, 5 ); break; + case IDC_BFRAME : + config->i_bframe = GetDlgItemInt( hDlg, IDC_BFRAME, FALSE, FALSE ); + break; } break; + case LBN_SELCHANGE : + switch ( LOWORD( wParam ) ) { + case IDC_DIRECTPRED: + config->i_direct_mv_pred = SendDlgItemMessage(hDlg, IDC_DIRECTPRED, CB_GETCURSEL, 0, 0); + break; + case IDC_SUBPEL: + config->i_subpel_refine = SendDlgItemMessage(hDlg, IDC_SUBPEL, CB_GETCURSEL, 0, 0); + break; + } + break; } break; + case WM_HSCROLL : + if( (HWND) lParam == GetDlgItem( hDlg, IDC_INLOOP_A ) ) { + config->i_inloop_a = SendDlgItemMessage( hDlg, IDC_INLOOP_A, TBM_GETPOS, 0, 0 ); + set_dlgitem_int( hDlg, IDC_LOOPA_TXT, config->i_inloop_a); + + } else if ( (HWND) lParam == GetDlgItem( hDlg, IDC_INLOOP_B ) ) { + config->i_inloop_b = SendDlgItemMessage( hDlg, IDC_INLOOP_B, TBM_GETPOS, 0, 0 ); + set_dlgitem_int( hDlg, IDC_LOOPB_TXT, config->i_inloop_b); + } + break; + case WM_CLOSE: + EndDialog( hDlg, LOWORD( wParam ) ); + break; default : return 0; } diff --git a/vfw/driverproc.c b/vfw/driverproc.c index 4a050e68..35bfc342 100644 --- a/vfw/driverproc.c +++ b/vfw/driverproc.c @@ -119,15 +119,15 @@ LRESULT WINAPI DriverProc( DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lP CONFIG temp; codec->config.b_save = FALSE; - memcpy( &temp, &codec->config, sizeof(CONFIG) ); + memcpy( &temp, &codec->config, sizeof(CONFIG) ); DialogBoxParam( g_hInst, MAKEINTRESOURCE(IDD_MAINCONFIG), (HWND)lParam1, callback_main, (LPARAM)&temp ); - if( temp.b_save ) - { - memcpy( &codec->config, &temp, sizeof(CONFIG) ); + if( temp.b_save ) + { + memcpy( &codec->config, &temp, sizeof(CONFIG) ); config_reg_save( &codec->config ); - } + } } return ICERR_OK; @@ -215,9 +215,11 @@ LRESULT WINAPI DriverProc( DWORD dwDriverId, HDRVR hDriver, UINT uMsg, LPARAM lP } return ICERR_UNSUPPORTED; #endif - default: - return DefDriverProc( dwDriverId, hDriver, uMsg, lParam1, lParam2 ); + if (uMsg < DRV_USER) + return DefDriverProc(dwDriverId, hDriver, uMsg, lParam1, lParam2); + else + return ICERR_UNSUPPORTED; } } diff --git a/vfw/resource.h b/vfw/resource.h index df693805..050ba720 100644 --- a/vfw/resource.h +++ b/vfw/resource.h @@ -13,17 +13,26 @@ #define IDC_CABAC 1005 #define IDC_BITRATEEDIT2 1005 #define IDC_QUANTEDIT 1005 +#define IDC_B16X16 1006 +#define IDC_2PASSBITRATE_S 1006 #define IDC_LOOPFILTER 1007 +#define IDC_2PASSBITRATE 1007 +#define IDC_I4X4 1008 #define IDC_BITRATELOW 1009 +#define IDC_P16X16 1009 #define IDC_BITRATELOW2 1010 +#define IDC_P8X8 1010 #define IDC_BITRATEHIGH 1011 #define IDC_BFRAMES 1012 #define IDC_BITRATEHIGH2 1012 #define IDC_IDRFRAMES 1012 #define IDC_BFRAMES2 1013 #define IDC_IFRAMES 1013 +#define IDC_BITRATELOW3 1013 #define IDC_EDIT3 1014 #define IDC_KEYFRAME 1014 +#define IDC_BITRATEHIGH3 1014 +#define IDC_BFRAME 1015 #define IDC_DEFAULTS 1016 #define IDC_CHECK3 1017 #define IDC_ADVANCED 1018 @@ -39,6 +48,14 @@ #define IDC_X264 1035 #define IDC_BUILD 1036 #define IDC_FOURCC 1039 +#define IDC_SUBPEL 1040 +#define IDC_DIRECTPRED 1041 +#define IDC_2PASS1 1041 +#define IDC_2PASS2 1042 +#define IDC_INLOOP_A 1044 +#define IDC_INLOOP_B 1045 +#define IDC_LOOPA_TXT 1047 +#define IDC_LOOPB_TXT 1048 // Next default values for new objects // @@ -46,7 +63,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1040 +#define _APS_NEXT_CONTROL_VALUE 1049 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/vfw/resource.rc b/vfw/resource.rc index 64360b81..3b49d8ab 100644 --- a/vfw/resource.rc +++ b/vfw/resource.rc @@ -61,51 +61,88 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,168,210,50,14 CONTROL "Slider1",IDC_BITRATESLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,13,31,175,15 - EDITTEXT IDC_BITRATEEDIT,191,32,27,14,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_BITRATEEDIT,189,32,27,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Average Bitrate (kbps)",IDC_STATIC,59,20,73,8 - GROUPBOX "1 Pass, Target Bitrate",IDC_STATIC,7,7,211,47 + GROUPBOX "",IDC_STATIC,7,7,211,47 LTEXT "0",IDC_BITRATELOW,14,19,22,8 - LTEXT "2500",IDC_BITRATEHIGH,166,21,17,8 + LTEXT "5000",IDC_BITRATEHIGH,166,21,17,8 PUSHBUTTON "Load Defaults",IDC_DEFAULTS,7,210,57,14 PUSHBUTTON "Advanced",IDC_ADVANCED,67,210,49,14 CONTROL "Slider1",IDC_QUANTSLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,13,81,175,15 - EDITTEXT IDC_QUANTEDIT,191,82,27,14,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_QUANTEDIT,189,82,27,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Quantizer",IDC_STATIC,81,71,31,8 - GROUPBOX "1 Pass, Target Quality",IDC_STATIC,7,57,211,47 + GROUPBOX "",IDC_STATIC,7,57,211,47 LTEXT "0 (High Quality)",IDC_BITRATELOW2,14,70,50,8 LTEXT "51 (Low Quality)",IDC_BITRATEHIGH2,131,71,53,8 - GROUPBOX "2 Pass (Best Quality at a Given Bitrate)",IDC_STATIC,7, - 109,211,63 - LTEXT "Not Yet Implemented",IDC_STATIC,79,139,67,8 - GROUPBOX "Mode Select",IDC_MODE,7,176,211,30 + GROUPBOX "",IDC_STATIC,7,109,211,63 CONTROL "1 Pass, Bitrate",IDC_RADIOBITRATE,"Button", - BS_AUTORADIOBUTTON | WS_DISABLED,14,188,58,10 + BS_AUTORADIOBUTTON,13,7,58,10 CONTROL "1 Pass, Quantizer",IDC_RADIOQUANT,"Button", - BS_AUTORADIOBUTTON,85,188,75,10 - CONTROL "Two Pass",IDC_RADIOTWOPASS,"Button",BS_AUTORADIOBUTTON | - WS_DISABLED,168,188,43,10 + BS_AUTORADIOBUTTON,13,57,75,10 + CONTROL "Two Pass",IDC_RADIOTWOPASS,"Button",BS_AUTORADIOBUTTON, + 13,109,43,10 + CONTROL "First Pass",IDC_2PASS1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,27,126,46,10 + CONTROL "Second Pass",IDC_2PASS2,"Button",BS_AUTORADIOBUTTON,87, + 126,58,10 + CONTROL "Slider1",IDC_2PASSBITRATE_S,"msctls_trackbar32", + TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,13,149,175,15 + EDITTEXT IDC_2PASSBITRATE,189,149,27,14,ES_AUTOHSCROLL | + ES_NUMBER + LTEXT "0",IDC_BITRATELOW3,14,136,22,8 + LTEXT "5000",IDC_BITRATEHIGH3,166,136,17,8 END -IDD_ADVANCED DIALOG DISCARDABLE 0, 0, 220, 110 +IDD_ADVANCED DIALOG DISCARDABLE 0, 0, 302, 258 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "x264 Advanced Settings" FONT 8, "MS Sans Serif" BEGIN - DEFPUSHBUTTON "OK",IDOK,163,89,50,14 - CONTROL "Enable CABAC",IDC_CABAC,"Button",BS_AUTOCHECKBOX | - WS_TABSTOP,13,25,61,10 + DEFPUSHBUTTON "OK",IDOK,245,237,50,14 + CONTROL "CABAC",IDC_CABAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 16,23,61,10 + EDITTEXT IDC_IDRFRAMES,36,126,22,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Every",IDC_STATIC,15,128,19,8 + GROUPBOX "H.264 features",IDC_STATIC,7,7,288,228 + EDITTEXT IDC_KEYFRAME,255,20,33,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Max Reference Frames:",IDC_STATIC,170,24,76,8 + EDITTEXT IDC_IFRAMES,114,107,24,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Max Keyframe Interval:",IDC_STATIC,13,110,76,8 + EDITTEXT IDC_FOURCC,223,107,25,14,ES_AUTOHSCROLL + LTEXT "FourCC:",IDC_STATIC,193,110,26,8 + CONTROL "8x16, 16x8 and 8x8 B-frame search",IDC_B16X16,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,17,189,127,10 + EDITTEXT IDC_BFRAME,256,40,33,14,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Max B-Frames:",IDC_STATIC,197,43,48,8 + CONTROL "4x4 INTRA search",IDC_I4X4,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,165,189,82,10 + CONTROL "8x16, 16x8 and 8x8 P-frame search",IDC_P16X16,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,17,171,127,10 + CONTROL "4x8, 8x4 and 4x4 P frame search",IDC_P8X8,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,165,172,119,10 + COMBOBOX IDC_SUBPEL,117,208,70,77,CBS_DROPDOWN | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + LTEXT "Subpixel refinement precision",IDC_STATIC,17,211,92,8 + COMBOBOX IDC_DIRECTPRED,220,63,70,67,CBS_DROPDOWN | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + LTEXT "BFRAME prediction mode:",IDC_STATIC,133,65,84,8 + CONTROL "Slider1",IDC_INLOOP_A,"msctls_trackbar32",TBS_NOTICKS | + WS_TABSTOP,56,53,47,10 + GROUPBOX "",IDC_STATIC,7,40,115,44 + LTEXT "Strength (A)",IDC_STATIC,15,53,39,8 + CONTROL "Slider1",IDC_INLOOP_B,"msctls_trackbar32",TBS_NOTICKS | + WS_TABSTOP,56,66,47,10 + LTEXT "Strength (B)",IDC_STATIC,15,66,39,8 + LTEXT "th INTRA frame\n becomes a keyframe",IDC_STATIC,61,128, + 85,16 + GROUPBOX "More Encoder Settings",IDC_STATIC,7,93,145,66 + GROUPBOX "VfW settings",IDC_STATIC,151,93,144,66 + LTEXT "0",IDC_LOOPA_TXT,109,53,8,8 + LTEXT "0",IDC_LOOPB_TXT,109,66,8,8 + GROUPBOX "Motion Search Precision",IDC_STATIC,7,154,288,81 CONTROL "Deblocking Filter",IDC_LOOPFILTER,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,13,38,72,10 - EDITTEXT IDC_IDRFRAMES,183,22,24,14,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Max Number of IDR-Frames:",IDC_STATIC,91,25,89,8 - GROUPBOX "Advanced Settings",IDC_STATIC,7,7,206,79 - EDITTEXT IDC_KEYFRAME,174,62,33,14,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Max Reference Frames:",IDC_STATIC,96,66,76,8 - EDITTEXT IDC_IFRAMES,183,38,24,14,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Max Keyframe Interval:",IDC_STATIC,108,41,72,8 - EDITTEXT IDC_FOURCC,41,63,25,14,ES_AUTOHSCROLL - LTEXT "FourCC:",IDC_STATIC,13,66,26,8 + BS_AUTOCHECKBOX | WS_TABSTOP,16,39,69,10 END IDD_ABOUT DIALOG DISCARDABLE 0, 0, 213, 130 @@ -122,7 +159,6 @@ BEGIN END - ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -142,9 +178,9 @@ BEGIN IDD_ADVANCED, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 213 + RIGHTMARGIN, 295 TOPMARGIN, 7 - BOTTOMMARGIN, 103 + BOTTOMMARGIN, 251 END IDD_ABOUT, DIALOG @@ -157,6 +193,20 @@ BEGIN END #endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog Info +// + +IDD_ADVANCED DLGINIT +BEGIN + IDC_DIRECTPRED, 0x403, 22, 0 +0x6f4e, 0x656e, 0x542c, 0x6d65, 0x6f70, 0x6172, 0x2c6c, 0x7053, 0x7461, +0x6169, 0x006c, + 0 +END + #endif // English (Canada) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/vfw/x264vfw.h b/vfw/x264vfw.h index 36e36cf3..784f90bd 100644 --- a/vfw/x264vfw.h +++ b/vfw/x264vfw.h @@ -28,7 +28,7 @@ #define FOURCC_YUY2 mmioFOURCC('Y','U','Y','2') #define FOURCC_YUYV mmioFOURCC('Y','U','Y','V') -#define X264_WEBSITE "http://lyra.via.ecp.fr/" +#define X264_WEBSITE "http://videolan.org/x264.html" /* CONFIG: vfw config */ @@ -40,6 +40,8 @@ typedef struct int desired_size; /* please try to avoid modifications here */ char stats[MAX_PATH]; /*******************************/ + int i_2passbitrate; + int i_pass; /* Our config */ int i_refmax; @@ -54,6 +56,14 @@ typedef struct int b_i4x4; int b_psub16x16; int b_psub8x8; + int b_bsub16x16; + + int i_bframe; + int i_subpel_refine; + int i_direct_mv_pred; + + int i_inloop_a; + int i_inloop_b; /* vfw interface */ int b_save; @@ -99,5 +109,22 @@ BOOL CALLBACK callback_advanced( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa /* Dll instance */ extern HINSTANCE g_hInst; +#if defined(_DEBUG) +#include /* vsprintf */ +#define DPRINTF_BUF_SZ 1024 +static __inline void DPRINTF(char *fmt, ...) +{ + va_list args; + char buf[DPRINTF_BUF_SZ]; + + va_start(args, fmt); + vsprintf(buf, fmt, args); + OutputDebugString(buf); +} +#else +static __inline void DPRINTF(char *fmt, ...) { } +#endif + + #endif