updated VfW interface by Radek Czyz
authorLoren Merritt <pengvado@videolan.org>
Mon, 10 Jan 2005 09:29:31 +0000 (09:29 +0000)
committerLoren Merritt <pengvado@videolan.org>
Mon, 10 Jan 2005 09:29:31 +0000 (09:29 +0000)
git-svn-id: svn://svn.videolan.org/x264/trunk@89 df754926-b1dd-0310-bc7b-ec298dee348c

vfw/build/win32/x264vfw.dsp
vfw/codec.c
vfw/config.c
vfw/driverproc.c
vfw/resource.h
vfw/resource.rc
vfw/x264vfw.h

index 0fadf91..fb0153c 100644 (file)
-# 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>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102\r
+\r
+CFG=x264vfw - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "x264vfw.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "x264vfw.mak" CFG="x264vfw - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "x264vfw - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE "x264vfw - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=xicl6.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "x264vfw - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "obj/Release"\r
+# PROP Intermediate_Dir "obj/Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "VFW_EXPORTS" /YX /FD /c\r
+# 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\r
+# SUBTRACT CPP /Z<none>\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x804 /d "NDEBUG"\r
+# ADD RSC /l 0x804 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=xilink6.exe\r
+# 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\r
+# 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"\r
+# SUBTRACT LINK32 /debug\r
+\r
+!ELSEIF  "$(CFG)" == "x264vfw - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "obj/Debug"\r
+# PROP Intermediate_Dir "obj/Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# 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\r
+# 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\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x804 /d "_DEBUG"\r
+# ADD RSC /l 0x804 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=xilink6.exe\r
+# 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\r
+# 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\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "x264vfw - Win32 Release"\r
+# Name "x264vfw - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\codec.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\config.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\driverproc.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\driverproc.def\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\resource.rc\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\resource.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\x264vfw.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# End Group\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\build\win32\bin\libx264.lib\r
+# End Source File\r
+# End Target\r
+# End Project\r
index 076d796..197bd86 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "x264vfw.h"
 
+#include <stdio.h> /* 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( &param );
 
+    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
index 79f5a7b..ecc12a4 100644 (file)
 #include <commctrl.h>
 
 /* 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",        &reg.bitrate,           800 },
     { "quantizer",      &reg.i_qp,              26 },
     { "encoding_type",  &reg.i_encoding_type,   1 },
+    { "passbitrate",    &reg.i_2passbitrate,    800 },
+    { "pass_number",    &reg.i_pass,            1 },
 
     /* Advance dialog */
     { "cabac",          &reg.b_cabac,           1 },
     { "loop_filter",    &reg.b_filter,          1 },
     { "idrframe",       &reg.i_idrframe,        1 },
-    { "iframe",         &reg.i_iframe,          150 },
+    { "iframe",         &reg.i_iframe,          250},
     { "refmax",         &reg.i_refmax,          1 },
+    { "bmax",           &reg.i_bframe,          0 },
+    {"direct_pred",     &reg.i_direct_mv_pred,  2 },
+    {"inloop_a",        &reg.i_inloop_a,        0 },
+    {"inloop_b",        &reg.i_inloop_b,        0 },
 
     /* analysis */
     {"i4x4",            &reg.b_i4x4,            1 },
     {"psub16x16",       &reg.b_psub16x16,       1 },
-    {"psub8x8",         &reg.b_psub8x8,         1 }
+    {"psub8x8",         &reg.b_psub8x8,         0 },
+    {"bsub16x16",       &reg.b_bsub16x16,       1 },
+    {"subpel",          &reg.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;
     }
index 4a050e6..35bfc34 100644 (file)
@@ -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;
     }
 }
 
index df69380..050ba72 100644 (file)
 #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
 #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
index 64360b8..3b49d8a 100644 (file)
@@ -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
 /////////////////////////////////////////////////////////////////////////////
 
index 36e36cf..784f90b 100644 (file)
@@ -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 <stdio.h> /* 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