[svn] / branches / dev-api-4 / xvidcore / vfw / src / config.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/vfw/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 889, Sat Feb 22 08:24:01 2003 UTC revision 983, Sat Apr 12 06:58:50 2003 UTC
# Line 62  Line 62 
62    
63  #include <xvid.h>       // XviD API  #include <xvid.h>       // XviD API
64    
65    #include "debug.h"
66  #include "codec.h"  #include "codec.h"
67  #include "config.h"  #include "config.h"
68  #include "resource.h"  #include "resource.h"
69    
70    
71    #define CONSTRAINVAL(X,Y,Z) if((X)<(Y)) X=Y; if((X)>(Z)) X=Z;
72    #define IsDlgChecked(hwnd,idc)  (IsDlgButtonChecked(hwnd,idc) == BST_CHECKED)
73    #define EnableDlgWindow(hwnd,idc,state) EnableWindow(GetDlgItem(hwnd,idc),state)
74    
75  /* registry info structs */  HINSTANCE g_hInst;
76    HWND g_hTooltip;
77    
78    /* enumerates child windows, assigns tooltips */
79    BOOL CALLBACK enum_tooltips(HWND hWnd, LPARAM lParam)
80    {
81            char help[500];
82    
83        if (LoadString(g_hInst, GetDlgCtrlID(hWnd), help, 500))
84            {
85                    TOOLINFO ti;
86                    ti.cbSize = sizeof(TOOLINFO);
87                    ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND;
88                    ti.hwnd = GetParent(hWnd);
89                    ti.uId  = (LPARAM)hWnd;
90                    ti.lpszText = help;
91                    SendMessage(g_hTooltip, TTM_ADDTOOL, 0, (LPARAM)&ti);
92            }
93    
94            return TRUE;
95    }
96    
97    
98    /* ===================================================================================== */
99    /* MPEG-4 PROFILES/LEVELS ============================================================== */
100    /* ===================================================================================== */
101    
102    #define PROFILE_BVOP            0x00000001
103    #define PROFILE_MPEGQUANT       0x00000002
104    #define PROFILE_INTERLACE       0x00000004
105    #define PROFILE_QPEL            0x00000008
106    #define PROFILE_GMC                     0x00000010
107    #define PROFILE_REDUCED         0x00000020      /* dynamic resolution conversion */
108    
109    #define PROFILE_AS                      (PROFILE_BVOP|PROFILE_MPEGQUANT|PROFILE_INTERLACE|PROFILE_QPEL|PROFILE_GMC)
110    #define PROFILE_ARTS            (PROFILE_REDUCED)
111    
112    
113    typedef struct
114    {
115            char * name;
116            int width;
117            int height;
118            int fps;
119            int max_objects;
120            int total_vmv_buffer_sz;    /* macroblock memory; when BVOPS=false, vmv = 2*vcv; when BVOPS=true,  vmv = 3*vcv*/
121            int max_vmv_buffer_sz;      /* max macroblocks per vop */
122            int vcv_decoder_rate;   /* macroblocks decoded per second */
123            int max_acpred_mbs;     /* percentage */
124            int max_vbv_size;                       /*    max vbv size (bits) 16368 bits */
125            int max_video_packet_length; /* bits */
126            int max_bitrate;                        /* kbits/s */
127            unsigned int flags;
128    } profile_t;
129    
130    /* default vbv_occupancy is (64/170)*vbv_buffer_size */
131    
132    static const profile_t profiles[] =
133    {
134    /*    name                   w    h  fps  obj  Tvmv  vmv    vcv   ac%  vbv          pkt   kbps  flags */
135            { "(unrestricted)",       0,   0,  0,  0,    0,    0,      0, 100,   0*16368,     0,    0, 0xffffffff },
136    
137            { "Simple @ L1",        176, 144, 15,  4,  198,   99,   1485, 100,  10*16368,  2048,   64, 0 },
138            { "Simple @ L2",        352, 288, 15,  4,  792,  396,   5940, 100,  40*16368,  4096,  128, 0 },
139            { "Simple @ L3",        352, 288, 15,  4,  792,  396,  11880, 100,  40*16368,  8192,  384, 0 },
140    
141            { "ARTS @ L1",          176, 144, 15,  4,  198,   99,   1485, 100,  10*16368,  8192,   64, PROFILE_ARTS },
142            { "ARTS @ L2",          352, 288, 15,  4,  792,  396,   5940, 100,  40*16368, 16384,  128, PROFILE_ARTS },
143            { "ARTS @ L3",          352, 288, 30,  4,  792,  396,  11880, 100,  40*16368, 16384,  384, PROFILE_ARTS },
144            { "ARTS @ L4",          352, 288, 30, 16,  792,  396,  11880, 100,  80*16368, 16384, 2000, PROFILE_ARTS },
145    
146            { "AS @ L0",            176, 144, 30,  1,  297,   99,   2970, 100,  10*16368,  2048,  128, PROFILE_AS },
147            { "AS @ L1",            176, 144, 30,  4,  297,   99,   2970, 100,  10*16368,  2048,  128, PROFILE_AS },
148            { "AS @ L2",            352, 288, 15,  4, 1188,  396,   5940, 100,  40*16368,  4096,  384, PROFILE_AS },
149            { "AS @ L3",            352, 288, 30,  4, 1188,  396,  11880, 100,  40*16368,  4096,  768, PROFILE_AS },
150            { "AS @ L4",            352, 576, 30,  4, 2376,  792,  23760,  50,  80*16368,  8192, 3000, PROFILE_AS },
151            { "AS @ L5",            720, 576, 30,  4, 4860, 1620,  48600,  25, 112*16368, 16384, 8000, PROFILE_AS },
152    
153            { "DXN Handheld",               176, 144, 15, -1,  198,   99,   1485, 100,  16*16368,    -1,  128, 0 },
154            { "DXN Portable NTSC",  352, 240, 30, -1,  990,  330,   9900, 100,  64*16368,    -1,  768, PROFILE_BVOP },
155            { "DXN Portable PAL",   352, 288, 25, -1, 1188,  396,   9900, 100,  64*16368,    -1,  768, PROFILE_BVOP },
156            { "DXN HT NTSC",            720, 480, 30, -1, 4050, 1350,  40500, 100, 192*16368,    -1, 4000, PROFILE_BVOP|PROFILE_INTERLACE },
157            { "DXN HT NTSC",        720, 576, 25, -1, 4860, 1620,  40500, 100, 192*16368,    -1, 4000, PROFILE_BVOP|PROFILE_INTERLACE },
158            { "DXN HDTV",          1280, 720, 30, -1,10800, 3600, 108000, 100, 384*16368,    -1, 8000, PROFILE_BVOP|PROFILE_INTERLACE },
159    };
160    
161    
162    /* ===================================================================================== */
163    /* REGISTRY ============================================================================ */
164    /* ===================================================================================== */
165    
166    /* registry info structs */
167  CONFIG reg;  CONFIG reg;
168    
169  REG_INT const reg_ints[] = {  static const REG_INT reg_ints[] = {
170          {"mode",                                        &reg.mode,                                              DLG_MODE_CBR},          {"mode",                                        &reg.mode,                                              RC_MODE_CBR},
171          {"quality",                                     &reg.quality,                                   85},          {"quality",                                     &reg.quality,                                   85},
172          {"quant",                                       &reg.quant,                                             5},          {"quant",                                       &reg.quant,                                             5},
173          {"rc_bitrate",                          &reg.rc_bitrate,                                900000},          {"rc_bitrate",                          &reg.rc_bitrate,                                900000},
# Line 92  Line 186 
186          {"qpel",                                        &reg.qpel,                                              0},          {"qpel",                                        &reg.qpel,                                              0},
187          {"gmc",                                         &reg.gmc,                                               0},          {"gmc",                                         &reg.gmc,                                               0},
188          {"chromame",                            &reg.chromame,                                  0},          {"chromame",                            &reg.chromame,                                  0},
 //added by koepi for gruel's greyscale_mode  
189          {"greyscale",                           &reg.greyscale,                                 0},          {"greyscale",                           &reg.greyscale,                                 0},
190  // end of koepi's additions      {"use_bvop",                                &reg.use_bvop,                          0},
191          {"max_bframes",                         &reg.max_bframes,                               -1},          {"max_bframes",                         &reg.max_bframes,                               2},
192          {"bquant_ratio",                        &reg.bquant_ratio,                              150},          {"bquant_ratio",                        &reg.bquant_ratio,                              150},
193          {"bquant_offset",                       &reg.bquant_offset,                             100},          {"bquant_offset",                       &reg.bquant_offset,                             100},
194        {"bvop_threshold",          &reg.bvop_threshold,            0},
195          {"packed",                                      &reg.packed,                                    0},          {"packed",                                      &reg.packed,                                    0},
196          {"dx50bvop",                            &reg.dx50bvop,                                  1},          {"closed_gov",                          &reg.closed_gov,                                1},
197          {"debug",                                       &reg.debug,                                             0},          {"debug",                                       &reg.debug,                                             0},
198          {"reduced_resolution",          &reg.reduced_resolution,                0},          {"reduced_resolution",          &reg.reduced_resolution,                0},
199          {"chroma_opt",                          &reg.chroma_opt,                                0},          {"chroma_opt",                          &reg.chroma_opt,                                0},
# Line 113  Line 207 
207          {"desired_size",                        &reg.desired_size,                              570000},          {"desired_size",                        &reg.desired_size,                              570000},
208          {"keyframe_boost",                      &reg.keyframe_boost,                    0},          {"keyframe_boost",                      &reg.keyframe_boost,                    0},
209          {"discard1pass",                        &reg.discard1pass,                              1},          {"discard1pass",                        &reg.discard1pass,                              1},
         {"dummy2pass",                          &reg.dummy2pass,                                0},  
 // added by koepi for new two-pass curve treatment  
210          {"kftreshold",                          &reg.kftreshold,                                10},          {"kftreshold",                          &reg.kftreshold,                                10},
211          {"kfreduction",                         &reg.kfreduction,                               20},          {"kfreduction",                         &reg.kfreduction,                               20},
 // end of koepi's additions  
212          {"curve_compression_high",      &reg.curve_compression_high,    0},          {"curve_compression_high",      &reg.curve_compression_high,    0},
213          {"curve_compression_low",       &reg.curve_compression_low,             0},          {"curve_compression_low",       &reg.curve_compression_low,             0},
214          {"use_alt_curve",                       &reg.use_alt_curve,                             0},          {"use_alt_curve",                       &reg.use_alt_curve,                             0},
# Line 134  Line 225 
225          {"twopass_max_bitrate",         &reg.twopass_max_bitrate,               10000 * CONFIG_KBPS},          {"twopass_max_bitrate",         &reg.twopass_max_bitrate,               10000 * CONFIG_KBPS},
226          {"twopass_max_overflow_improvement", &reg.twopass_max_overflow_improvement, 60},          {"twopass_max_overflow_improvement", &reg.twopass_max_overflow_improvement, 60},
227          {"twopass_max_overflow_degradation", &reg.twopass_max_overflow_degradation, 60},          {"twopass_max_overflow_degradation", &reg.twopass_max_overflow_degradation, 60},
         {"hinted_me",                           &reg.hinted_me,                                 0},  
   
         {"credits_start",                       &reg.credits_start,                             0},  
         {"credits_start_begin",         &reg.credits_start_begin,               0},  
         {"credits_start_end",           &reg.credits_start_end,                 0},  
         {"credits_end",                         &reg.credits_end,                               0},  
         {"credits_end_begin",           &reg.credits_end_begin,                 0},  
         {"credits_end_end",                     &reg.credits_end_end,                   0},  
   
 // added by koepi for greyscale credits  
         {"credits_greyscale",           &reg.credits_greyscale,                 0},  
 // end of koepi's addition  
         {"credits_mode",                        &reg.credits_mode,                              0},  
         {"credits_rate",                        &reg.credits_rate,                              20},  
         {"credits_quant_i",                     &reg.credits_quant_i,                   20},  
         {"credits_quant_p",                     &reg.credits_quant_p,                   20},  
         {"credits_start_size",          &reg.credits_start_size,                10000},  
         {"credits_end_size",            &reg.credits_end_size,                  10000},  
228    
229          /* decoder */          /* decoder */
230          {"deblock_y",                           &reg.deblock_y,                                 0},  //      {"deblock_y",                           &reg.deblock_y,                                 0},
231          {"deblock_uv",                          &reg.deblock_uv,                                0}  //      {"deblock_uv",                          &reg.deblock_uv,                                0}
232  };  };
233    
234  REG_STR const reg_strs[] = {  static const REG_STR reg_strs[] = {
235          {"hintfile",                            reg.hintfile,                                   CONFIG_HINTFILE},          {"profile",                                     reg.profile_name,                               "(unrestricted)"},
236          {"stats1",                                      reg.stats1,                                             CONFIG_2PASS_1_FILE},      {"stats",                                   reg.stats,                                              CONFIG_2PASS_FILE},
         {"stats2",                                      reg.stats2,                                             CONFIG_2PASS_2_FILE}  
 //      {"build",                                       reg.build,                                              XVID_BUILD}  
237  };  };
238    
239  /* get config settings from registry */  /* get config settings from registry */
# Line 231  Line 302 
302                  REG_GET_B("qmatrix_inter", reg.qmatrix_inter, default_qmatrix_inter);                  REG_GET_B("qmatrix_inter", reg.qmatrix_inter, default_qmatrix_inter);
303          }          }
304    
305        reg.profile = 0;
306        for (i=0; i<sizeof(profiles)/sizeof(profile_t); i++) {
307            if (strcmpi(profiles[i].name, reg.profile_name) == 0) {
308                reg.profile = i;
309            }
310        }
311    
312          memcpy(config, &reg, sizeof(CONFIG));          memcpy(config, &reg, sizeof(CONFIG));
313    
314          RegCloseKey(hKey);          RegCloseKey(hKey);
# Line 258  Line 336 
336                          &hKey,                          &hKey,
337                          &dispo) != ERROR_SUCCESS)                          &dispo) != ERROR_SUCCESS)
338          {          {
339                  DEBUG1("Couldn't create XVID_REG_SUBKEY - ", GetLastError());                  DPRINTF("Couldn't create XVID_REG_SUBKEY - GetLastError=%i", GetLastError());
340                  return;                  return;
341          }          }
342    
343          memcpy(&reg, config, sizeof(CONFIG));          memcpy(&reg, config, sizeof(CONFIG));
344    
345        strcpy(reg.profile_name, profiles[reg.profile].name);
346    
347          for (i=0 ; i<sizeof(reg_ints)/sizeof(REG_INT) ; ++i)          for (i=0 ; i<sizeof(reg_ints)/sizeof(REG_INT) ; ++i)
348          {          {
349                  RegSetValueEx(hKey, reg_ints[i].reg_value, 0, REG_DWORD, (LPBYTE)reg_ints[i].config_int, sizeof(int));                  RegSetValueEx(hKey, reg_ints[i].reg_value, 0, REG_DWORD, (LPBYTE)reg_ints[i].config_int, sizeof(int));
# Line 289  Line 369 
369    
370          if (RegOpenKeyEx(XVID_REG_KEY, XVID_REG_PARENT, 0, KEY_ALL_ACCESS, &hKey))          if (RegOpenKeyEx(XVID_REG_KEY, XVID_REG_PARENT, 0, KEY_ALL_ACCESS, &hKey))
371          {          {
372                  DEBUG1("Couldn't open registry key for deletion - ", GetLastError());                  DPRINTF("Couldn't open registry key for deletion - GetLastError=%i", GetLastError());
373                  return;                  return;
374          }          }
375    
376          if (RegDeleteKey(hKey, XVID_REG_CHILD))          if (RegDeleteKey(hKey, XVID_REG_CHILD))
377          {          {
378                  DEBUG1("Couldn't delete registry key - ", GetLastError());                  DPRINTF("Couldn't delete registry key - GetLastError=%i", GetLastError());
379                  return;                  return;
380          }          }
381    
# Line 327  Line 407 
407  }  }
408    
409    
 /* downloads data from main dialog */  
   
 void main_download(HWND hDlg, CONFIG * config)  
 {  
         switch(config->mode)  
         {  
         default :  
         case DLG_MODE_CBR :  
                 config->rc_bitrate = config_get_uint(hDlg, IDC_VALUE, config->rc_bitrate) * CONFIG_KBPS;  
                 break;  
410    
411          case DLG_MODE_VBR_QUAL :  /* ===================================================================================== */
412                  config->quality = config_get_uint(hDlg, IDC_VALUE, config->quality);  /* QUANT MATRIX DIALOG ================================================================= */
413                  break;  /* ===================================================================================== */
414    
415          case DLG_MODE_VBR_QUANT :  void quant_upload(HWND hDlg, CONFIG* config)
416                  config->quant = config_get_uint(hDlg, IDC_VALUE, config->quant);  {
417                  break;          int i;
418    
419          case DLG_MODE_2PASS_2_INT :          for (i=0 ; i<64 ; ++i)
420                  config->desired_size = config_get_uint(hDlg, IDC_VALUE, config->desired_size);          {
421                  break;                  SetDlgItemInt(hDlg, IDC_QINTRA00 + i, config->qmatrix_intra[i], FALSE);
422                    SetDlgItemInt(hDlg, IDC_QINTER00 + i, config->qmatrix_inter[i], FALSE);
423          }          }
   
         config->mode = SendDlgItemMessage(hDlg, IDC_MODE, CB_GETCURSEL, 0, 0);  
424  }  }
425    
426    
427  /* updates the edit box */  void quant_download(HWND hDlg, CONFIG* config)
   
 void main_value(HWND hDlg, CONFIG* config)  
428  {  {
429          char* text;          int i;
         int value;  
         int enabled = TRUE;  
430    
431          switch (config->mode)          for (i=0; i<64 ; ++i)
432          {          {
433          default :                  int temp;
                 enabled = FALSE;  
   
         case DLG_MODE_CBR :  
                 text = "Bitrate (Kbps):";  
                 value = config->rc_bitrate / CONFIG_KBPS;  
                 break;  
   
         case DLG_MODE_VBR_QUAL :  
                 text = "Quality:";  
                 value = config->quality;  
                 break;  
434    
435          case DLG_MODE_VBR_QUANT :                  temp = config_get_uint(hDlg, i + IDC_QINTRA00, config->qmatrix_intra[i]);
436                  text = "Quantizer:";                  CONSTRAINVAL(temp, 1, 255);
437                  value = config->quant;                  config->qmatrix_intra[i] = temp;
                 break;  
438    
439          case DLG_MODE_2PASS_2_INT :                  temp = config_get_uint(hDlg, i + IDC_QINTER00, config->qmatrix_inter[i]);
440                  text = "Desired size (Kbtyes):";                  CONSTRAINVAL(temp, 1, 255);
441                  value = config->desired_size;                  config->qmatrix_inter[i] = temp;
                 break;  
442          }          }
   
         SetDlgItemText(hDlg, IDC_VALUE_STATIC, text);  
         SetDlgItemInt(hDlg, IDC_VALUE, value, FALSE);  
   
         EnableWindow(GetDlgItem(hDlg, IDC_VALUE_STATIC), enabled);  
         EnableWindow(GetDlgItem(hDlg, IDC_VALUE), enabled);  
443  }  }
444    
445    /* quantization matrix dialog proc */
446    
447  /* updates the slider */  BOOL CALLBACK quantmatrix_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
   
 void main_slider(HWND hDlg, CONFIG * config)  
448  {  {
449          char* text;          CONFIG* config = (CONFIG*)GetWindowLong(hDlg, GWL_USERDATA);
         long range;  
         int pos;  
         int enabled = TRUE;  
450    
451          switch (config->mode)          switch (uMsg)
452          {          {
453          default :          case WM_INITDIALOG :
454                  enabled = FALSE;                  SetWindowLong(hDlg, GWL_USERDATA, lParam);
455                    config = (CONFIG*)lParam;
456          case DLG_MODE_CBR :                  quant_upload(hDlg, config);
                 text = "Bitrate (Kbps):";  
                 range = MAKELONG(0,10000);  
                 pos = config->rc_bitrate / CONFIG_KBPS;  
                 break;  
457    
458          case DLG_MODE_VBR_QUAL :                  if (g_hTooltip)
459                  text = "Quality:";                  {
460                  range = MAKELONG(0,100);                          EnumChildWindows(hDlg, enum_tooltips, 0);
461                  pos = config->quality;                  }
462                  break;                  break;
463    
464          case DLG_MODE_VBR_QUANT :          case WM_COMMAND :
465                  text = "Quantizer:";                  if (LOWORD(wParam) == IDOK && HIWORD(wParam) == BN_CLICKED)
466                  range = MAKELONG(1,31);                  {
467                  pos = config->quant;                          quant_download(hDlg, config);
468                  break;                          EndDialog(hDlg, IDOK);
469          }          }
470                    else if (LOWORD(wParam) == IDCANCEL)
471          SetDlgItemText(hDlg, IDC_SLIDER_STATIC, text);                  {
472          SendDlgItemMessage(hDlg, IDC_SLIDER, TBM_SETRANGE, TRUE, range);                          EndDialog(hDlg, IDCANCEL);
         SendDlgItemMessage(hDlg, IDC_SLIDER, TBM_SETPOS, TRUE, pos);  
   
         EnableWindow(GetDlgItem(hDlg, IDC_SLIDER_STATIC), enabled);  
         EnableWindow(GetDlgItem(hDlg, IDC_SLIDER), enabled);  
473  }  }
474                    else if ((LOWORD(wParam) == IDC_LOAD || LOWORD(wParam) == IDC_SAVE) && HIWORD(wParam) == BN_CLICKED)
475                    {
476                            OPENFILENAME ofn;
477                            char file[MAX_PATH];
478    
479                            HANDLE hFile;
480                            DWORD read=128, wrote=0;
481                            BYTE quant_data[128];
482    
483  /* load advanced options property sheet */                          strcpy(file, "\\matrix");
484                            memset(&ofn, 0, sizeof(OPENFILENAME));
485                            ofn.lStructSize = sizeof(OPENFILENAME);
486    
487  void adv_dialog(HWND hParent, CONFIG * config)                          ofn.hwndOwner = hDlg;
488                            ofn.lpstrFilter = "All files (*.*)\0*.*\0\0";
489                            ofn.lpstrFile = file;
490                            ofn.nMaxFile = MAX_PATH;
491                            ofn.Flags = OFN_PATHMUSTEXIST;
492    
493                            if (LOWORD(wParam) == IDC_SAVE)
494  {  {
495          PROPSHEETINFO psi[DLG_COUNT];                                  ofn.Flags |= OFN_OVERWRITEPROMPT;
496          PROPSHEETPAGE psp[DLG_COUNT];                                  if (GetSaveFileName(&ofn))
497          PROPSHEETHEADER psh;                                  {
498          CONFIG temp;                                          hFile = CreateFile(file, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
         int i;  
499    
500          config->save = FALSE;                                          quant_download(hDlg, config);
501          memcpy(&temp, config, sizeof(CONFIG));                                          memcpy(quant_data, config->qmatrix_intra, 64);
502                                            memcpy(quant_data+64, config->qmatrix_inter, 64);
503    
504          for (i=0 ; i<DLG_COUNT ; ++i)                                          if (hFile == INVALID_HANDLE_VALUE)
505          {          {
506                  psp[i].dwSize = sizeof(PROPSHEETPAGE);                                                  DPRINTF("Couldn't save quant matrix");
                 psp[i].dwFlags = 0;  
                 psp[i].hInstance = hInst;  
                 psp[i].pfnDlgProc = adv_proc;  
                 psp[i].lParam = (LPARAM)&psi[i];  
                 psp[i].pfnCallback = NULL;  
   
                 psi[i].page = i;  
                 psi[i].config = &temp;  
507          }          }
508                                            else
         psp[DLG_GLOBAL].pszTemplate             = MAKEINTRESOURCE(IDD_GLOBAL);  
         psp[DLG_QUANT].pszTemplate              = MAKEINTRESOURCE(IDD_QUANT);  
         psp[DLG_2PASS].pszTemplate              = MAKEINTRESOURCE(IDD_2PASS);  
         psp[DLG_2PASSALT].pszTemplate   = MAKEINTRESOURCE(IDD_2PASSALT);  
         psp[DLG_CREDITS].pszTemplate    = MAKEINTRESOURCE(IDD_CREDITS);  
         psp[DLG_CPU].pszTemplate                = MAKEINTRESOURCE(IDD_CPU);  
   
         psh.dwSize = sizeof(PROPSHEETHEADER);  
         psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;  
         psh.hwndParent = hParent;  
         psh.hInstance = hInst;  
         psh.pszCaption = (LPSTR) "XviD Configuration";  
         psh.nPages = DLG_COUNT;  
         psh.nStartPage = DLG_GLOBAL;  
         psh.ppsp = (LPCPROPSHEETPAGE)&psp;  
         psh.pfnCallback = NULL;  
   
         PropertySheet(&psh);  
   
         if (temp.save)  
509          {          {
510                  memcpy(config, &temp, sizeof(CONFIG));                                                  if (!WriteFile(hFile, quant_data, 128, &wrote, 0))
511                                                    {
512                                                            DPRINTF("Couldnt write quant matrix");
513          }          }
514  }  }
515    
516                                            CloseHandle(hFile);
517  /* enable/disable advanced controls based on encoder mode */                                  }
518                            }
519  #define CONTROLDLG(X,Y) EnableWindow(GetDlgItem(hDlg, (X)), (Y))                          else
 #define ISDLGSET(X)     (IsDlgButtonChecked(hDlg, (X)) == BST_CHECKED)  
   
 #define MOD_CBR  
   
 void adv_mode(HWND hDlg, int mode)  
520  {  {
521          // create arrays of controls to be disabled for each mode                                  ofn.Flags |= OFN_FILEMUSTEXIST;
522          const short twopass_disable[] = {                                  if (GetOpenFileName(&ofn))
523                  IDC_KFBOOST, IDC_DUMMY2PASS, IDC_USEALT,                                  {
524  // added by koepi for new curve treatment                                          hFile = CreateFile(file, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
                 IDC_KFTRESHOLD, IDC_KFREDUCTION,  
 //end of koepi's additions  
                 IDC_CURVECOMPH, IDC_CURVECOMPL, IDC_PAYBACK, IDC_PAYBACKBIAS, IDC_PAYBACKPROP,  
                 IDC_STATS2, IDC_STATS2_BROWSE,  
         };  
   
         const short cbr_disable[] = {  
                 IDC_STATS1, IDC_STATS1_BROWSE, IDC_DISCARD1PASS, IDC_HINTEDME,  
                 IDC_CREDITS_START, IDC_CREDITS_END, IDC_CREDITS_START_BEGIN, IDC_CREDITS_START_END,  
                 IDC_CREDITS_END_BEGIN, IDC_CREDITS_END_END, IDC_CREDITS_RATE_RADIO,  
                 IDC_CREDITS_QUANT_RADIO, IDC_CREDITS_QUANT_STATIC, IDC_CREDITS_SIZE_RADIO,  
                 IDC_CREDITS_QUANTI, IDC_CREDITS_QUANTP, IDC_CREDITS_END_STATIC, IDC_CREDITS_RATE,  
                 IDC_CREDITS_START_SIZE, IDC_CREDITS_END_SIZE, IDC_CREDITS_GREYSCALE, IDC_HINTFILE  
         };  
   
         const short qual_disable[] = {  
                 IDC_STATS1, IDC_STATS1_BROWSE, IDC_DISCARD1PASS, IDC_HINTEDME,  
                 IDC_CBR_REACTIONDELAY, IDC_CBR_AVERAGINGPERIOD, IDC_CBR_BUFFER,  
                 IDC_CREDITS_SIZE_RADIO, IDC_CREDITS_END_STATIC, IDC_CREDITS_START_SIZE, IDC_CREDITS_END_SIZE,  
                 IDC_HINTFILE  
         };  
   
         const short quant_disable[] = {  
                 IDC_STATS1, IDC_STATS1_BROWSE, IDC_DISCARD1PASS, IDC_HINTEDME,  
                 IDC_CBR_REACTIONDELAY, IDC_CBR_AVERAGINGPERIOD, IDC_CBR_BUFFER,  
                 IDC_MINIQUANT, IDC_MAXIQUANT, IDC_MINPQUANT, IDC_MAXPQUANT,  
                 IDC_CREDITS_SIZE_RADIO, IDC_CREDITS_END_STATIC, IDC_CREDITS_START_SIZE, IDC_CREDITS_END_SIZE,  
                 IDC_HINTFILE  
         };  
   
         const short twopass1_disable[] = {  
                 IDC_CBR_REACTIONDELAY, IDC_CBR_AVERAGINGPERIOD, IDC_CBR_BUFFER,  
                 IDC_MINIQUANT, IDC_MAXIQUANT, IDC_MINPQUANT, IDC_MAXPQUANT,  
                 IDC_CREDITS_RATE_RADIO, IDC_CREDITS_RATE, IDC_CREDITS_SIZE_RADIO, IDC_CREDITS_END_STATIC,  
                 IDC_CREDITS_START_SIZE, IDC_CREDITS_END_SIZE  
         };  
   
         const short twopass2_ext_disable[] = {  
                 IDC_CBR_REACTIONDELAY, IDC_CBR_AVERAGINGPERIOD, IDC_CBR_BUFFER,  
                 IDC_CREDITS_RATE_RADIO,  
                 IDC_CREDITS_SIZE_RADIO, IDC_CREDITS_END_STATIC, IDC_CREDITS_RATE,  
                 IDC_CREDITS_START_SIZE, IDC_CREDITS_END_SIZE  
         };  
   
         const short twopass2_int_disable[] = {  
                 IDC_CBR_REACTIONDELAY, IDC_CBR_AVERAGINGPERIOD, IDC_CBR_BUFFER,  
                 IDC_STATS2, IDC_STATS2_BROWSE  
         };  
   
         // store pointers in order so we can lookup using config->mode  
         const short* modes[] = {  
                 cbr_disable, qual_disable, quant_disable,  
                 twopass1_disable, twopass2_ext_disable, twopass2_int_disable  
         };  
   
         // ditto modes[]  
         const int lengths[] = {  
                 sizeof(cbr_disable)/sizeof(short), sizeof(qual_disable)/sizeof(short),  
                 sizeof(quant_disable)/sizeof(short), sizeof(twopass1_disable)/sizeof(short),  
                 sizeof(twopass2_ext_disable)/sizeof(short), sizeof(twopass2_int_disable)/sizeof(short), 0  
         };  
   
         int i;  
         int hinted_me, use_alt, use_alt_auto, use_alt_auto_bonus;  
         int credits_start, credits_end, credits_rate, credits_quant, credits_size;  
         int cpu_force;  
525    
526          // first perform checkbox-based enable/disable                                          if (hFile == INVALID_HANDLE_VALUE)
         hinted_me = ISDLGSET(IDC_HINTEDME);  
         CONTROLDLG(IDC_HINTFILE,                        hinted_me);  
         CONTROLDLG(IDC_HINT_BROWSE,                     hinted_me);  
   
         use_alt                         = ISDLGSET(IDC_USEALT) && (mode == DLG_MODE_2PASS_2_EXT || mode == DLG_MODE_2PASS_2_INT);  
         use_alt_auto            = ISDLGSET(IDC_USEAUTO);  
         use_alt_auto_bonus      = ISDLGSET(IDC_USEAUTOBONUS);  
         CONTROLDLG(IDC_USEAUTO,                         use_alt);  
         CONTROLDLG(IDC_AUTOSTR,                         use_alt && use_alt_auto);  
         CONTROLDLG(IDC_USEAUTOBONUS,            use_alt);  
         CONTROLDLG(IDC_BONUSBIAS,                       use_alt && !use_alt_auto_bonus);  
         CONTROLDLG(IDC_CURVETYPE,                       use_alt);  
         CONTROLDLG(IDC_ALTCURVEHIGH,            use_alt);  
         CONTROLDLG(IDC_ALTCURVELOW,                     use_alt);  
         CONTROLDLG(IDC_MINQUAL,                         use_alt && !use_alt_auto);  
   
         credits_start           = ISDLGSET(IDC_CREDITS_START);  
         CONTROLDLG(IDC_CREDITS_START_BEGIN,     credits_start);  
         CONTROLDLG(IDC_CREDITS_START_END,       credits_start);  
   
         credits_end                     = ISDLGSET(IDC_CREDITS_END);  
         CONTROLDLG(IDC_CREDITS_END_BEGIN,       credits_end);  
         CONTROLDLG(IDC_CREDITS_END_END,         credits_end);  
   
         credits_rate            = ISDLGSET(IDC_CREDITS_RATE_RADIO);  
         credits_quant           = ISDLGSET(IDC_CREDITS_QUANT_RADIO);  
         credits_size            = ISDLGSET(IDC_CREDITS_SIZE_RADIO);  
         CONTROLDLG(IDC_CREDITS_RATE,            credits_rate);  
         CONTROLDLG(IDC_CREDITS_QUANTI,          credits_quant);  
         CONTROLDLG(IDC_CREDITS_QUANTP,          credits_quant);  
         CONTROLDLG(IDC_CREDITS_START_SIZE,      credits_size);  
         CONTROLDLG(IDC_CREDITS_END_SIZE,        credits_size);  
   
         cpu_force                       = ISDLGSET(IDC_CPU_FORCE);  
         CONTROLDLG(IDC_CPU_MMX,                         cpu_force);  
         CONTROLDLG(IDC_CPU_MMXEXT,                      cpu_force);  
         CONTROLDLG(IDC_CPU_SSE,                         cpu_force);  
         CONTROLDLG(IDC_CPU_SSE2,                        cpu_force);  
         CONTROLDLG(IDC_CPU_3DNOW,                       cpu_force);  
         CONTROLDLG(IDC_CPU_3DNOWEXT,            cpu_force);  
   
         // now perform codec mode enable/disable  
         for (i=0 ; i<lengths[mode] ; ++i)  
527          {          {
528                  EnableWindow(GetDlgItem(hDlg, modes[mode][i]), FALSE);                                                  DPRINTF("Couldn't load quant matrix");
529          }          }
530                                            else
531          if (mode != DLG_MODE_2PASS_2_EXT && mode != DLG_MODE_2PASS_2_INT)                                          {
532                                                    if (!ReadFile(hFile, quant_data, 128, &read, 0))
533          {          {
534                  for (i=0 ; i<sizeof(twopass_disable)/sizeof(short) ; ++i)                                                          DPRINTF("Couldnt read quant matrix");
535                                                    }
536                                                    else
537                  {                  {
538                          EnableWindow(GetDlgItem(hDlg, twopass_disable[i]), FALSE);                                                          memcpy(config->qmatrix_intra, quant_data, 64);
539                                                            memcpy(config->qmatrix_inter, quant_data+64, 64);
540                                                            quant_upload(hDlg, config);
541                                                    }
542                                            }
543    
544                                            CloseHandle(hFile);
545                  }                  }
546          }          }
547  }  }
548                    break;
549    
550            default :
551                    return 0;
552            }
553    
554  /* upload config data into dialog */          return 1;
555    }
556    
557  void adv_upload(HWND hDlg, int page, CONFIG * config)  
558  {  /* ===================================================================================== */
559          switch (page)  /* ADVANCED DIALOG PAGES ================================================================ */
560    /* ===================================================================================== */
561    
562    /* initialise pages */
563    void adv_init(HWND hDlg, int idd, CONFIG * config)
564          {          {
565          case DLG_GLOBAL :          unsigned int i;
                 SendDlgItemMessage(hDlg, IDC_MOTION, CB_SETCURSEL, config->motion_search, 0);  
                 SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_SETCURSEL, config->quant_type, 0);  
                 SendDlgItemMessage(hDlg, IDC_FOURCC, CB_SETCURSEL, config->fourcc_used, 0);  
                 SendDlgItemMessage(hDlg, IDC_VHQ, CB_SETCURSEL, config->vhq_mode, 0);  
                 SetDlgItemInt(hDlg, IDC_MAXKEY, config->max_key_interval, FALSE);  
                 SetDlgItemInt(hDlg, IDC_MINKEY, config->min_key_interval, FALSE);  
                 CheckDlgButton(hDlg, IDC_LUMMASK, config->lum_masking ? BST_CHECKED : BST_UNCHECKED);  
                 CheckDlgButton(hDlg, IDC_INTERLACING, config->interlacing ? BST_CHECKED : BST_UNCHECKED);  
566    
567                  CheckDlgButton(hDlg, IDC_QPEL, config->qpel ? BST_CHECKED : BST_UNCHECKED);      switch(idd) {
568                  CheckDlgButton(hDlg, IDC_GMC, config->gmc ? BST_CHECKED : BST_UNCHECKED);      case IDD_PROFILE :
569                  CheckDlgButton(hDlg, IDC_CHROMAME, config->chromame ? BST_CHECKED : BST_UNCHECKED);                  for (i=0; i<sizeof(profiles)/sizeof(profile_t); i++)
570  // added by koepi for gruel's greyscale_mode                          SendDlgItemMessage(hDlg, IDC_PROFILE_PROFILE, CB_ADDSTRING, 0, (LPARAM)profiles[i].name);
571                  CheckDlgButton(hDlg, IDC_GREYSCALE, config->greyscale ? BST_CHECKED : BST_UNCHECKED);          break;
 // end of koepi's addition  
                 SetDlgItemInt(hDlg, IDC_MAXBFRAMES, config->max_bframes, TRUE);  
                 SetDlgItemInt(hDlg, IDC_BQUANTRATIO, config->bquant_ratio, FALSE);  
                 SetDlgItemInt(hDlg, IDC_BQUANTOFFSET, config->bquant_offset, FALSE);  
                 CheckDlgButton(hDlg, IDC_PACKED, config->packed ? BST_CHECKED : BST_UNCHECKED);  
                 CheckDlgButton(hDlg, IDC_DX50BVOP, config->dx50bvop ? BST_CHECKED : BST_UNCHECKED);  
                 CheckDlgButton(hDlg, IDC_DEBUG, config->debug ? BST_CHECKED : BST_UNCHECKED);  
572    
573                  CheckDlgButton(hDlg, IDC_REDUCED, config->reduced_resolution ? BST_CHECKED : BST_UNCHECKED);      case IDD_RC_2PASS2_ALT :
574                    SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_ADDSTRING, 0, (LPARAM)"Low");
575                    SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_ADDSTRING, 0, (LPARAM)"Medium");
576                    SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_ADDSTRING, 0, (LPARAM)"High");
577                  break;                  break;
578    
579          case DLG_QUANT :      case IDD_MOTION :
580                  SetDlgItemInt(hDlg, IDC_MINIQUANT, config->min_iquant, FALSE);                  SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"0 - None");
581                  SetDlgItemInt(hDlg, IDC_MAXIQUANT, config->max_iquant, FALSE);                  SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"1 - Very Low");
582                  SetDlgItemInt(hDlg, IDC_MINPQUANT, config->min_pquant, FALSE);                  SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"2 - Low");
583                  SetDlgItemInt(hDlg, IDC_MAXPQUANT, config->max_pquant, FALSE);                  SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"3 - Medium");
584                    SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"4 - High");
585                    SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"5 - Very High");
586                    SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"6 - Ultra High");
587    
588                    SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"0 - Off");
589                    SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"1 - Mode Decision");
590                    SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"2 - Limited Search");
591                    SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"3 - Medium Search");
592                    SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"4 - Wide Search");
593                  break;                  break;
594    
595          case DLG_2PASS :      case IDD_TOOLS :
596                  SetDlgItemInt(hDlg, IDC_KFBOOST, config->keyframe_boost, FALSE);                  SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"H.263");
597                    SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"MPEG");
598                    SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"MPEG-Custom");
599            break;
600    
601        case IDD_DEBUG :
602                    /* force threads disabled */
603                    EnableWindow(GetDlgItem(hDlg, IDC_NUMTHREADS_STATIC), FALSE);
604                    EnableWindow(GetDlgItem(hDlg, IDC_NUMTHREADS), FALSE);
605    
606                    SendDlgItemMessage(hDlg, IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)"XVID");
607                    SendDlgItemMessage(hDlg, IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)"DIVX");
608                    SendDlgItemMessage(hDlg, IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)"DX50");
609            break;
610        }
611    }
612    
613    /* enable/disable controls based on encoder-mode or user selection */
614    
615    void adv_mode(HWND hDlg, int idd, CONFIG * config)
616    {
617            int use_alt, use_alt_auto, use_alt_auto_bonus;
618        int cpu_force;
619        int bvops;
620    
621        switch(idd) {
622        case IDD_PROFILE :
623            CheckDlgButton(hDlg, IDC_PROFILE_BVOP, profiles[config->profile].flags&PROFILE_BVOP ? BST_CHECKED : BST_UNCHECKED);
624            CheckDlgButton(hDlg, IDC_PROFILE_MPEGQUANT, profiles[config->profile].flags&PROFILE_MPEGQUANT ? BST_CHECKED : BST_UNCHECKED);
625            CheckDlgButton(hDlg, IDC_PROFILE_INTERLACE, profiles[config->profile].flags&PROFILE_INTERLACE ? BST_CHECKED : BST_UNCHECKED);
626            CheckDlgButton(hDlg, IDC_PROFILE_QPEL, profiles[config->profile].flags&PROFILE_QPEL ? BST_CHECKED : BST_UNCHECKED);
627            CheckDlgButton(hDlg, IDC_PROFILE_GMC, profiles[config->profile].flags&PROFILE_GMC ? BST_CHECKED : BST_UNCHECKED);
628            CheckDlgButton(hDlg, IDC_PROFILE_REDUCED, profiles[config->profile].flags&PROFILE_REDUCED ? BST_CHECKED : BST_UNCHECKED);
629            break;
630    
631        case IDD_RC_2PASS2_ALT :
632                use_alt                             = IsDlgChecked(hDlg, IDC_USEALT);
633                use_alt_auto                = IsDlgChecked(hDlg, IDC_USEAUTO);
634                use_alt_auto_bonus  = IsDlgChecked(hDlg, IDC_USEAUTOBONUS);
635                EnableDlgWindow(hDlg, IDC_USEAUTO,          use_alt);
636                EnableDlgWindow(hDlg, IDC_AUTOSTR,          use_alt && use_alt_auto);
637                EnableDlgWindow(hDlg, IDC_USEAUTOBONUS,     use_alt);
638                EnableDlgWindow(hDlg, IDC_BONUSBIAS,        use_alt && !use_alt_auto_bonus);
639                EnableDlgWindow(hDlg, IDC_CURVETYPE,        use_alt);
640                EnableDlgWindow(hDlg, IDC_ALTCURVEHIGH,     use_alt);
641                EnableDlgWindow(hDlg, IDC_ALTCURVELOW,      use_alt);
642                EnableDlgWindow(hDlg, IDC_MINQUAL,          use_alt && !use_alt_auto);
643            break;
644    
645        case IDD_TOOLS :
646            bvops = IsDlgChecked(hDlg, IDC_BVOP);
647                    EnableDlgWindow(hDlg, IDC_MAXBFRAMES,   bvops);
648                    EnableDlgWindow(hDlg, IDC_BQUANTRATIO,  bvops);
649                    EnableDlgWindow(hDlg, IDC_BQUANTOFFSET, bvops);
650            EnableDlgWindow(hDlg, IDC_BVOP_THRESHOLD, bvops);
651    
652                    EnableDlgWindow(hDlg, IDC_MAXBFRAMES_S,   bvops);
653                    EnableDlgWindow(hDlg, IDC_BQUANTRATIO_S,  bvops);
654                    EnableDlgWindow(hDlg, IDC_BQUANTOFFSET_S, bvops);
655            EnableDlgWindow(hDlg, IDC_BVOP_THRESHOLD_S, bvops);
656    
657                    EnableDlgWindow(hDlg, IDC_PACKED,       bvops);
658                    EnableDlgWindow(hDlg, IDC_CLOSEDGOV,     bvops);
659            break;
660    
661        case IDD_DEBUG :
662                cpu_force                   = IsDlgChecked(hDlg, IDC_CPU_FORCE);
663                EnableDlgWindow(hDlg, IDC_CPU_MMX,          cpu_force);
664                EnableDlgWindow(hDlg, IDC_CPU_MMXEXT,       cpu_force);
665                EnableDlgWindow(hDlg, IDC_CPU_SSE,          cpu_force);
666                EnableDlgWindow(hDlg, IDC_CPU_SSE2,         cpu_force);
667                EnableDlgWindow(hDlg, IDC_CPU_3DNOW,        cpu_force);
668                EnableDlgWindow(hDlg, IDC_CPU_3DNOWEXT,     cpu_force);
669            break;
670        }
671    }
672    
673    
674    
675    /* upload config data into dialog */
676    void adv_upload(HWND hDlg, int idd, CONFIG * config)
677    {
678            switch (idd)
679            {
680            case IDD_PROFILE :
681                    SendDlgItemMessage(hDlg, IDC_PROFILE_PROFILE, CB_SETCURSEL, config->profile, 0);
682            SetDlgItemInt(hDlg, IDC_PROFILE_WIDTH, profiles[config->profile].width, FALSE);
683            SetDlgItemInt(hDlg, IDC_PROFILE_HEIGHT, profiles[config->profile].height, FALSE);
684            SetDlgItemInt(hDlg, IDC_PROFILE_FPS, profiles[config->profile].fps, FALSE);
685            SetDlgItemInt(hDlg, IDC_PROFILE_VMV, profiles[config->profile].max_vmv_buffer_sz, FALSE);
686            SetDlgItemInt(hDlg, IDC_PROFILE_VCV, profiles[config->profile].vcv_decoder_rate, FALSE);
687            SetDlgItemInt(hDlg, IDC_PROFILE_VBV, profiles[config->profile].max_vbv_size, FALSE);
688            SetDlgItemInt(hDlg, IDC_PROFILE_BITRATE, profiles[config->profile].max_bitrate, FALSE);
689                    break;
690    
691            case IDD_RC_CBR :
692                    SetDlgItemInt(hDlg, IDC_CBR_REACTIONDELAY, config->rc_reaction_delay_factor, FALSE);
693                    SetDlgItemInt(hDlg, IDC_CBR_AVERAGINGPERIOD, config->rc_averaging_period, FALSE);
694                    SetDlgItemInt(hDlg, IDC_CBR_BUFFER, config->rc_buffer, FALSE);
695                    break;
696    
697        case IDD_RC_2PASS1 :
698            SetDlgItemText(hDlg, IDC_STATS, config->stats);
699                  CheckDlgButton(hDlg, IDC_DISCARD1PASS, config->discard1pass ? BST_CHECKED : BST_UNCHECKED);                  CheckDlgButton(hDlg, IDC_DISCARD1PASS, config->discard1pass ? BST_CHECKED : BST_UNCHECKED);
700                  CheckDlgButton(hDlg, IDC_DUMMY2PASS, config->dummy2pass ? BST_CHECKED : BST_UNCHECKED);          break;
701  // added by koepi for new 2pass curve treatment  
702            case IDD_RC_2PASS2 :
703                    SetDlgItemText(hDlg, IDC_STATS, config->stats);
704            SetDlgItemInt(hDlg, IDC_KFBOOST, config->keyframe_boost, FALSE);
705                  SetDlgItemInt(hDlg, IDC_KFTRESHOLD, config->kftreshold, FALSE);                  SetDlgItemInt(hDlg, IDC_KFTRESHOLD, config->kftreshold, FALSE);
706                  SetDlgItemInt(hDlg, IDC_KFREDUCTION, config->kfreduction, FALSE);                  SetDlgItemInt(hDlg, IDC_KFREDUCTION, config->kfreduction, FALSE);
 // end of koepi's additions  
707                  SetDlgItemInt(hDlg, IDC_CURVECOMPH, config->curve_compression_high, FALSE);                  SetDlgItemInt(hDlg, IDC_CURVECOMPH, config->curve_compression_high, FALSE);
708                  SetDlgItemInt(hDlg, IDC_CURVECOMPL, config->curve_compression_low, FALSE);                  SetDlgItemInt(hDlg, IDC_CURVECOMPL, config->curve_compression_low, FALSE);
709                  SetDlgItemInt(hDlg, IDC_PAYBACK, config->bitrate_payback_delay, FALSE);                  SetDlgItemInt(hDlg, IDC_PAYBACK, config->bitrate_payback_delay, FALSE);
710                  CheckDlgButton(hDlg, IDC_PAYBACKBIAS, (config->bitrate_payback_method == 0));                  CheckDlgButton(hDlg, IDC_PAYBACKBIAS, (config->bitrate_payback_method == 0));
711                  CheckDlgButton(hDlg, IDC_PAYBACKPROP, (config->bitrate_payback_method == 1));                  CheckDlgButton(hDlg, IDC_PAYBACKPROP, (config->bitrate_payback_method == 1));
   
                 CheckDlgButton(hDlg, IDC_HINTEDME, config->hinted_me ? BST_CHECKED : BST_UNCHECKED);  
                 SetDlgItemText(hDlg, IDC_HINTFILE, config->hintfile);  
                 SetDlgItemText(hDlg, IDC_STATS1, config->stats1);  
                 SetDlgItemText(hDlg, IDC_STATS2, config->stats2);  
712                  break;                  break;
713    
714          case DLG_2PASSALT :          case IDD_RC_2PASS2_ALT :
715                  CheckDlgButton(hDlg, IDC_USEALT, config->use_alt_curve ? BST_CHECKED : BST_UNCHECKED);                  CheckDlgButton(hDlg, IDC_USEALT, config->use_alt_curve ? BST_CHECKED : BST_UNCHECKED);
716    
717                  SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_SETCURSEL, config->alt_curve_type, 0);                  SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_SETCURSEL, config->alt_curve_type, 0);
# Line 707  Line 730 
730                  SetDlgItemInt(hDlg, IDC_OVERDEG, config->twopass_max_overflow_degradation, FALSE);                  SetDlgItemInt(hDlg, IDC_OVERDEG, config->twopass_max_overflow_degradation, FALSE);
731                  break;                  break;
732    
         case DLG_CREDITS :  
                 CheckDlgButton(hDlg, IDC_CREDITS_START, config->credits_start ? BST_CHECKED : BST_UNCHECKED);  
                 SetDlgItemInt(hDlg, IDC_CREDITS_START_BEGIN, config->credits_start_begin, FALSE);  
                 SetDlgItemInt(hDlg, IDC_CREDITS_START_END, config->credits_start_end, FALSE);  
                 CheckDlgButton(hDlg, IDC_CREDITS_END, config->credits_end ? BST_CHECKED : BST_UNCHECKED);  
                 SetDlgItemInt(hDlg, IDC_CREDITS_END_BEGIN, config->credits_end_begin, FALSE);  
                 SetDlgItemInt(hDlg, IDC_CREDITS_END_END, config->credits_end_end, FALSE);  
733    
734  // added by koepi for credits greyscale          case IDD_MOTION :
735                  CheckDlgButton(hDlg, IDC_CREDITS_GREYSCALE, config->credits_greyscale ? BST_CHECKED : BST_UNCHECKED);                  SendDlgItemMessage(hDlg, IDC_MOTION, CB_SETCURSEL, config->motion_search, 0);
736  // end of koepi's addition                  SendDlgItemMessage(hDlg, IDC_VHQ, CB_SETCURSEL, config->vhq_mode, 0);
737                  SetDlgItemInt(hDlg, IDC_CREDITS_RATE, config->credits_rate, FALSE);                  CheckDlgButton(hDlg, IDC_CHROMAME, config->chromame ? BST_CHECKED : BST_UNCHECKED);
738                  SetDlgItemInt(hDlg, IDC_CREDITS_QUANTI, config->credits_quant_i, FALSE);                  CheckDlgButton(hDlg, IDC_GREYSCALE, config->greyscale ? BST_CHECKED : BST_UNCHECKED);
739                  SetDlgItemInt(hDlg, IDC_CREDITS_QUANTP, config->credits_quant_p, FALSE);          break;
                 SetDlgItemInt(hDlg, IDC_CREDITS_START_SIZE, config->credits_start_size, FALSE);  
                 SetDlgItemInt(hDlg, IDC_CREDITS_END_SIZE, config->credits_end_size, FALSE);  
740    
741                  if (config->credits_mode == CREDITS_MODE_RATE)      case IDD_TOOLS :
742                  {          if (profiles[config->profile].flags & PROFILE_MPEGQUANT) {
743                          CheckDlgButton(hDlg, IDC_CREDITS_RATE_RADIO, BST_CHECKED);              EnableDlgWindow(hDlg, IDC_QUANTTYPE, TRUE);
744                SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_SETCURSEL, config->quant_type, 0);
745            }else{
746                SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_SETCURSEL, 0 /* h263 */, 0);
747                EnableDlgWindow(hDlg, IDC_QUANTTYPE, FALSE);
748                  }                  }
749                  else if (config->credits_mode == CREDITS_MODE_QUANT)  
750                  {          if (profiles[config->profile].flags & PROFILE_INTERLACE) {
751                          CheckDlgButton(hDlg, IDC_CREDITS_QUANT_RADIO, BST_CHECKED);              EnableDlgWindow(hDlg, IDC_INTERLACING, TRUE);
752                    CheckDlgButton(hDlg, IDC_INTERLACING, config->interlacing ? BST_CHECKED : BST_UNCHECKED);
753            }else{
754                CheckDlgButton(hDlg, IDC_INTERLACING, BST_UNCHECKED);
755                EnableDlgWindow(hDlg, IDC_INTERLACING, FALSE);
756                  }                  }
757                  else    // CREDITS_MODE_SIZE  
758                  {          if (profiles[config->profile].flags & PROFILE_QPEL) {
759                          CheckDlgButton(hDlg, IDC_CREDITS_SIZE_RADIO, BST_CHECKED);              EnableDlgWindow(hDlg, IDC_QPEL, TRUE);
760                CheckDlgButton(hDlg, IDC_QPEL, config->qpel ? BST_CHECKED : BST_UNCHECKED);
761            }else{
762                CheckDlgButton(hDlg, IDC_QPEL, BST_UNCHECKED);
763                EnableDlgWindow(hDlg, IDC_QPEL, FALSE);
764            }
765    
766            if (profiles[config->profile].flags & PROFILE_GMC) {
767                EnableDlgWindow(hDlg, IDC_GMC, TRUE);
768                    CheckDlgButton(hDlg, IDC_GMC, config->gmc ? BST_CHECKED : BST_UNCHECKED);
769            }else{
770                CheckDlgButton(hDlg, IDC_GMC, BST_UNCHECKED);
771                EnableDlgWindow(hDlg, IDC_GMC, FALSE);
772            }
773    
774            if (profiles[config->profile].flags & PROFILE_REDUCED) {
775                EnableDlgWindow(hDlg, IDC_REDUCED, TRUE);
776                        CheckDlgButton(hDlg, IDC_REDUCED, config->reduced_resolution ? BST_CHECKED : BST_UNCHECKED);
777            }else{
778                CheckDlgButton(hDlg, IDC_REDUCED, BST_UNCHECKED);
779                EnableDlgWindow(hDlg, IDC_REDUCED, FALSE);
780                  }                  }
781    
782            if (profiles[config->profile].flags & PROFILE_BVOP) {
783                EnableDlgWindow(hDlg, IDC_BVOP, TRUE);
784                CheckDlgButton(hDlg, IDC_BVOP, config->use_bvop ? BST_CHECKED : BST_UNCHECKED);
785            }else{
786                EnableDlgWindow(hDlg, IDC_BVOP, FALSE);
787                CheckDlgButton(hDlg, IDC_BVOP, BST_UNCHECKED);
788            }
789                    SetDlgItemInt(hDlg, IDC_MAXBFRAMES, config->max_bframes, FALSE);
790                    SetDlgItemInt(hDlg, IDC_BQUANTRATIO, config->bquant_ratio, FALSE);
791                    SetDlgItemInt(hDlg, IDC_BQUANTOFFSET, config->bquant_offset, FALSE);
792            SetDlgItemInt(hDlg, IDC_BVOP_THRESHOLD, config->bvop_threshold, FALSE);
793            CheckDlgButton(hDlg, IDC_PACKED, config->packed ? BST_CHECKED : BST_UNCHECKED);
794                    CheckDlgButton(hDlg, IDC_CLOSEDGOV, config->closed_gov ? BST_CHECKED : BST_UNCHECKED);
795    
796                    CheckDlgButton(hDlg, IDC_LUMMASK, config->lum_masking ? BST_CHECKED : BST_UNCHECKED);
797                    SetDlgItemInt(hDlg, IDC_MAXKEY, config->max_key_interval, FALSE);
798                    SetDlgItemInt(hDlg, IDC_MINKEY, config->min_key_interval, FALSE);
799    
800                    break;
801    
802            case IDD_QUANT :
803                    SetDlgItemInt(hDlg, IDC_MINIQUANT, config->min_iquant, FALSE);
804                    SetDlgItemInt(hDlg, IDC_MAXIQUANT, config->max_iquant, FALSE);
805                    SetDlgItemInt(hDlg, IDC_MINPQUANT, config->min_pquant, FALSE);
806                    SetDlgItemInt(hDlg, IDC_MAXPQUANT, config->max_pquant, FALSE);
807                  break;                  break;
808    
809          case DLG_CPU :          case IDD_DEBUG :
810                  CheckDlgButton(hDlg, IDC_CPU_MMX, (config->cpu & XVID_CPU_MMX) ? BST_CHECKED : BST_UNCHECKED);                  CheckDlgButton(hDlg, IDC_CPU_MMX, (config->cpu & XVID_CPU_MMX) ? BST_CHECKED : BST_UNCHECKED);
811                  CheckDlgButton(hDlg, IDC_CPU_MMXEXT, (config->cpu & XVID_CPU_MMXEXT) ? BST_CHECKED : BST_UNCHECKED);                  CheckDlgButton(hDlg, IDC_CPU_MMXEXT, (config->cpu & XVID_CPU_MMXEXT) ? BST_CHECKED : BST_UNCHECKED);
812                  CheckDlgButton(hDlg, IDC_CPU_SSE, (config->cpu & XVID_CPU_SSE) ? BST_CHECKED : BST_UNCHECKED);                  CheckDlgButton(hDlg, IDC_CPU_SSE, (config->cpu & XVID_CPU_SSE) ? BST_CHECKED : BST_UNCHECKED);
# Line 752  Line 820 
820                  SetDlgItemInt(hDlg, IDC_NUMTHREADS, config->num_threads, FALSE);                  SetDlgItemInt(hDlg, IDC_NUMTHREADS, config->num_threads, FALSE);
821                  CheckDlgButton(hDlg, IDC_CHROMA_OPT, (config->chroma_opt) ? BST_CHECKED : BST_UNCHECKED);                  CheckDlgButton(hDlg, IDC_CHROMA_OPT, (config->chroma_opt) ? BST_CHECKED : BST_UNCHECKED);
822                  SetDlgItemInt(hDlg, IDC_FRAMEDROP, config->frame_drop_ratio, FALSE);                  SetDlgItemInt(hDlg, IDC_FRAMEDROP, config->frame_drop_ratio, FALSE);
823                  SetDlgItemInt(hDlg, IDC_CBR_REACTIONDELAY, config->rc_reaction_delay_factor, FALSE);  
824                  SetDlgItemInt(hDlg, IDC_CBR_AVERAGINGPERIOD, config->rc_averaging_period, FALSE);                  CheckDlgButton(hDlg, IDC_DEBUG, config->debug ? BST_CHECKED : BST_UNCHECKED);
825                  SetDlgItemInt(hDlg, IDC_CBR_BUFFER, config->rc_buffer, FALSE);                  SendDlgItemMessage(hDlg, IDC_FOURCC, CB_SETCURSEL, config->fourcc_used, 0);
826                    break;
827    
828            case IDD_POSTPROC :
829    //              CheckDlgButton(hDlg, IDC_DEBLOCK_Y,  config->deblock_y ? BST_CHECKED : BST_UNCHECKED);
830    //              CheckDlgButton(hDlg, IDC_DEBLOCK_UV, config->deblock_uv ? BST_CHECKED : BST_UNCHECKED);
831                  break;                  break;
832    
833          }          }
834  }  }
835    
836    
837  /* download config data from dialog  /* download config data from dialog */
    replaces invalid values instead of alerting user for now  
 */  
   
 #define CONSTRAINVAL(X,Y,Z) if((X)<(Y)) X=Y; if((X)>(Z)) X=Z;  
838    
839  void adv_download(HWND hDlg, int page, CONFIG * config)  void adv_download(HWND hDlg, int idd, CONFIG * config)
840  {  {
841          switch (page)          switch (idd)
842          {          {
843          case DLG_GLOBAL :          case IDD_PROFILE :
844                  config->motion_search = SendDlgItemMessage(hDlg, IDC_MOTION, CB_GETCURSEL, 0, 0);                  config->profile = SendDlgItemMessage(hDlg, IDC_PROFILE_PROFILE, CB_GETCURSEL, 0, 0);
                 config->quant_type = SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_GETCURSEL, 0, 0);  
                 config->fourcc_used = SendDlgItemMessage(hDlg, IDC_FOURCC, CB_GETCURSEL, 0, 0);  
                 config->vhq_mode = SendDlgItemMessage(hDlg, IDC_VHQ, CB_GETCURSEL, 0, 0);  
                 config->max_key_interval = config_get_uint(hDlg, IDC_MAXKEY, config->max_key_interval);  
                 config->min_key_interval = config_get_uint(hDlg, IDC_MINKEY, config->min_key_interval);  
                 config->lum_masking = ISDLGSET(IDC_LUMMASK);  
                 config->interlacing = ISDLGSET(IDC_INTERLACING);  
   
                 config->qpel = ISDLGSET(IDC_QPEL);  
                 config->gmc = ISDLGSET(IDC_GMC);  
                 config->chromame = ISDLGSET(IDC_CHROMAME);  
 // added by koepi for gruel's greyscale_mode  
                 config->greyscale = ISDLGSET(IDC_GREYSCALE);  
 // end of koepi's addition  
                 config->max_bframes = config_get_int(hDlg, IDC_MAXBFRAMES, config->max_bframes);  
                 config->bquant_ratio = config_get_uint(hDlg, IDC_BQUANTRATIO, config->bquant_ratio);  
                 config->bquant_offset = config_get_uint(hDlg, IDC_BQUANTOFFSET, config->bquant_offset);  
                 config->packed = ISDLGSET(IDC_PACKED);  
                 config->dx50bvop = ISDLGSET(IDC_DX50BVOP);  
                 config->debug = ISDLGSET(IDC_DEBUG);  
                 config->reduced_resolution = ISDLGSET(IDC_REDUCED);  
845                  break;                  break;
846    
847          case DLG_QUANT :          case IDD_RC_CBR :
848                  config->min_iquant = config_get_uint(hDlg, IDC_MINIQUANT, config->min_iquant);                  config->rc_reaction_delay_factor = config_get_uint(hDlg, IDC_CBR_REACTIONDELAY, config->rc_reaction_delay_factor);
849                  config->max_iquant = config_get_uint(hDlg, IDC_MAXIQUANT, config->max_iquant);                  config->rc_averaging_period = config_get_uint(hDlg, IDC_CBR_AVERAGINGPERIOD, config->rc_averaging_period);
850                  config->min_pquant = config_get_uint(hDlg, IDC_MINPQUANT, config->min_pquant);                  config->rc_buffer = config_get_uint(hDlg, IDC_CBR_BUFFER, config->rc_buffer);
851                  config->max_pquant = config_get_uint(hDlg, IDC_MAXPQUANT, config->max_pquant);                  break;
852    
853                  CONSTRAINVAL(config->min_iquant, 1, 31);          case IDD_RC_2PASS1 :
854                  CONSTRAINVAL(config->max_iquant, config->min_iquant, 31);          if (GetDlgItemText(hDlg, IDC_STATS, config->stats, MAX_PATH) == 0)
855                  CONSTRAINVAL(config->min_pquant, 1, 31);                          lstrcpy(config->stats, CONFIG_2PASS_FILE);
856                  CONSTRAINVAL(config->max_pquant, config->min_pquant, 31);          config->discard1pass = IsDlgChecked(hDlg, IDC_DISCARD1PASS);
857                  break;                  break;
858    
859          case DLG_2PASS :      case IDD_RC_2PASS2 :
860            if (GetDlgItemText(hDlg, IDC_STATS, config->stats, MAX_PATH) == 0)
861                            lstrcpy(config->stats, CONFIG_2PASS_FILE);
862    
863                  config->keyframe_boost = GetDlgItemInt(hDlg, IDC_KFBOOST, NULL, FALSE);                  config->keyframe_boost = GetDlgItemInt(hDlg, IDC_KFBOOST, NULL, FALSE);
 // added by koepi for the new 2pass curve treatment  
864                  config->kftreshold = GetDlgItemInt(hDlg, IDC_KFTRESHOLD, NULL, FALSE);                  config->kftreshold = GetDlgItemInt(hDlg, IDC_KFTRESHOLD, NULL, FALSE);
865                  config->kfreduction = GetDlgItemInt(hDlg, IDC_KFREDUCTION, NULL, FALSE);                  config->kfreduction = GetDlgItemInt(hDlg, IDC_KFREDUCTION, NULL, FALSE);
866  //end of koepi's additions  
                 config->discard1pass = ISDLGSET(IDC_DISCARD1PASS);  
                 config->dummy2pass = ISDLGSET(IDC_DUMMY2PASS);  
867                  config->curve_compression_high = GetDlgItemInt(hDlg, IDC_CURVECOMPH, NULL, FALSE);                  config->curve_compression_high = GetDlgItemInt(hDlg, IDC_CURVECOMPH, NULL, FALSE);
868                  config->curve_compression_low = GetDlgItemInt(hDlg, IDC_CURVECOMPL, NULL, FALSE);                  config->curve_compression_low = GetDlgItemInt(hDlg, IDC_CURVECOMPL, NULL, FALSE);
869                  config->bitrate_payback_delay = config_get_uint(hDlg, IDC_PAYBACK, config->bitrate_payback_delay);                  config->bitrate_payback_delay = config_get_uint(hDlg, IDC_PAYBACK, config->bitrate_payback_delay);
870                  config->bitrate_payback_method = ISDLGSET(IDC_PAYBACKPROP);                  config->bitrate_payback_method = IsDlgChecked(hDlg, IDC_PAYBACKPROP);
                 config->hinted_me = ISDLGSET(IDC_HINTEDME);  
871    
                 if (GetDlgItemText(hDlg, IDC_HINTFILE, config->hintfile, MAX_PATH) == 0)  
                 {  
                         lstrcpy(config->hintfile, CONFIG_HINTFILE);  
                 }  
                 if (GetDlgItemText(hDlg, IDC_STATS1, config->stats1, MAX_PATH) == 0)  
                 {  
                         lstrcpy(config->stats1, CONFIG_2PASS_1_FILE);  
                 }  
                 if (GetDlgItemText(hDlg, IDC_STATS2, config->stats2, MAX_PATH) == 0)  
                 {  
                         lstrcpy(config->stats2, CONFIG_2PASS_2_FILE);  
                 }  
872    
873                  CONSTRAINVAL(config->bitrate_payback_delay, 1, 10000);                  CONSTRAINVAL(config->bitrate_payback_delay, 1, 10000);
874                  CONSTRAINVAL(config->keyframe_boost, 0, 1000);                  CONSTRAINVAL(config->keyframe_boost, 0, 1000);
# Line 840  Line 876 
876                  CONSTRAINVAL(config->curve_compression_low, 0, 100);                  CONSTRAINVAL(config->curve_compression_low, 0, 100);
877                  break;                  break;
878    
879          case DLG_2PASSALT :          case IDD_RC_2PASS2_ALT :
880                  config->use_alt_curve = ISDLGSET(IDC_USEALT);                  config->use_alt_curve = IsDlgChecked(hDlg, IDC_USEALT);
881    
882                  config->alt_curve_use_auto = ISDLGSET(IDC_USEAUTO);                  config->alt_curve_use_auto = IsDlgChecked(hDlg, IDC_USEAUTO);
883                  config->alt_curve_auto_str = config_get_uint(hDlg, IDC_AUTOSTR, config->alt_curve_auto_str);                  config->alt_curve_auto_str = config_get_uint(hDlg, IDC_AUTOSTR, config->alt_curve_auto_str);
884    
885                  config->alt_curve_use_auto_bonus_bias = ISDLGSET(IDC_USEAUTOBONUS);                  config->alt_curve_use_auto_bonus_bias = IsDlgChecked(hDlg, IDC_USEAUTOBONUS);
886                  config->alt_curve_bonus_bias = config_get_uint(hDlg, IDC_BONUSBIAS, config->alt_curve_bonus_bias);                  config->alt_curve_bonus_bias = config_get_uint(hDlg, IDC_BONUSBIAS, config->alt_curve_bonus_bias);
887    
888                  config->alt_curve_type = SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_GETCURSEL, 0, 0);                  config->alt_curve_type = SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_GETCURSEL, 0, 0);
# Line 864  Line 900 
900                  CONSTRAINVAL(config->twopass_max_overflow_degradation, 1, 80);                  CONSTRAINVAL(config->twopass_max_overflow_degradation, 1, 80);
901                  break;                  break;
902    
903          case DLG_CREDITS :          case IDD_MOTION :
904                  config->credits_start = ISDLGSET(IDC_CREDITS_START);                  config->motion_search = SendDlgItemMessage(hDlg, IDC_MOTION, CB_GETCURSEL, 0, 0);
905                  config->credits_start_begin = GetDlgItemInt(hDlg, IDC_CREDITS_START_BEGIN, NULL, FALSE);                  config->vhq_mode = SendDlgItemMessage(hDlg, IDC_VHQ, CB_GETCURSEL, 0, 0);
                 config->credits_start_end = config_get_uint(hDlg, IDC_CREDITS_START_END, config->credits_start_end);  
                 config->credits_end = ISDLGSET(IDC_CREDITS_END);  
                 config->credits_end_begin = config_get_uint(hDlg, IDC_CREDITS_END_BEGIN, config->credits_end_begin);  
                 config->credits_end_end = config_get_uint(hDlg, IDC_CREDITS_END_END, config->credits_end_end);  
   
 // added by koepi for gruel's greyscale_mode  
                 config->credits_greyscale = ISDLGSET(IDC_CREDITS_GREYSCALE);  
 // end of koepi's addition  
                 config->credits_rate = config_get_uint(hDlg, IDC_CREDITS_RATE, config->credits_rate);  
                 config->credits_quant_i = config_get_uint(hDlg, IDC_CREDITS_QUANTI, config->credits_quant_i);  
                 config->credits_quant_p = config_get_uint(hDlg, IDC_CREDITS_QUANTP, config->credits_quant_p);  
                 config->credits_start_size = config_get_uint(hDlg, IDC_CREDITS_START_SIZE, config->credits_start_size);  
                 config->credits_end_size = config_get_uint(hDlg, IDC_CREDITS_END_SIZE, config->credits_end_size);  
   
                 config->credits_mode = 0;  
                 config->credits_mode = ISDLGSET(IDC_CREDITS_RATE_RADIO) ? CREDITS_MODE_RATE : config->credits_mode;  
                 config->credits_mode = ISDLGSET(IDC_CREDITS_QUANT_RADIO) ? CREDITS_MODE_QUANT : config->credits_mode;  
                 config->credits_mode = ISDLGSET(IDC_CREDITS_SIZE_RADIO) ? CREDITS_MODE_SIZE : config->credits_mode;  
   
                 CONSTRAINVAL(config->credits_rate, 1, 100);  
                 CONSTRAINVAL(config->credits_quant_i, 1, 31);  
                 CONSTRAINVAL(config->credits_quant_p, 1, 31);  
   
                 if (config->credits_start_begin > config->credits_start_end)  
                 {  
                         config->credits_start_begin = config->credits_start_end;  
                         config->credits_start = 0;  
                 }  
                 if (config->credits_end_begin > config->credits_end_end)  
                 {  
                         config->credits_end_begin = config->credits_end_end;  
                         config->credits_end = 0;  
                 }  
                 break;  
906    
907          case DLG_CPU :                  config->chromame = IsDlgChecked(hDlg, IDC_CHROMAME);
908                  config->cpu = 0;                  config->greyscale = IsDlgChecked(hDlg, IDC_GREYSCALE);
                 config->cpu |= ISDLGSET(IDC_CPU_MMX) ? XVID_CPU_MMX : 0;  
                 config->cpu |= ISDLGSET(IDC_CPU_MMXEXT) ? XVID_CPU_MMXEXT: 0;  
                 config->cpu |= ISDLGSET(IDC_CPU_SSE) ? XVID_CPU_SSE: 0;  
                 config->cpu |= ISDLGSET(IDC_CPU_SSE2) ? XVID_CPU_SSE2: 0;  
                 config->cpu |= ISDLGSET(IDC_CPU_3DNOW) ? XVID_CPU_3DNOW: 0;  
                 config->cpu |= ISDLGSET(IDC_CPU_3DNOWEXT) ? XVID_CPU_3DNOWEXT: 0;  
                 config->cpu |= ISDLGSET(IDC_CPU_FORCE) ? XVID_CPU_FORCE : 0;  
909    
910                  config->num_threads = config_get_uint(hDlg, IDC_NUMTHREADS, config->num_threads);                  config->chroma_opt = IsDlgChecked(hDlg, IDC_CHROMA_OPT);
                 config->chroma_opt = ISDLGSET(IDC_CHROMA_OPT);  
911                  config->frame_drop_ratio = config_get_uint(hDlg, IDC_FRAMEDROP, config->frame_drop_ratio);                  config->frame_drop_ratio = config_get_uint(hDlg, IDC_FRAMEDROP, config->frame_drop_ratio);
                 config->rc_reaction_delay_factor = config_get_uint(hDlg, IDC_CBR_REACTIONDELAY, config->rc_reaction_delay_factor);  
                 config->rc_averaging_period = config_get_uint(hDlg, IDC_CBR_AVERAGINGPERIOD, config->rc_averaging_period);  
                 config->rc_buffer = config_get_uint(hDlg, IDC_CBR_BUFFER, config->rc_buffer);  
912                  break;                  break;
         }  
 }  
   
   
 void quant_upload(HWND hDlg, CONFIG* config)  
 {  
         int i;  
   
         for (i=0 ; i<64 ; ++i)  
         {  
                 SetDlgItemInt(hDlg, IDC_QINTRA00 + i, config->qmatrix_intra[i], FALSE);  
                 SetDlgItemInt(hDlg, IDC_QINTER00 + i, config->qmatrix_inter[i], FALSE);  
         }  
 }  
   
   
 void quant_download(HWND hDlg, CONFIG* config)  
 {  
         int i;  
   
         for (i=0 ; i<64 ; ++i)  
         {  
                 int temp;  
   
                 temp = config_get_uint(hDlg, i + IDC_QINTRA00, config->qmatrix_intra[i]);  
                 CONSTRAINVAL(temp, 1, 255);  
                 config->qmatrix_intra[i] = temp;  
913    
914                  temp = config_get_uint(hDlg, i + IDC_QINTER00, config->qmatrix_inter[i]);      case IDD_TOOLS :
915                  CONSTRAINVAL(temp, 1, 255);                  config->quant_type = SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_GETCURSEL, 0, 0);
916                  config->qmatrix_inter[i] = temp;                  config->interlacing = IsDlgChecked(hDlg, IDC_INTERLACING);
917          }          config->qpel = IsDlgChecked(hDlg, IDC_QPEL);
918  }                  config->gmc = IsDlgChecked(hDlg, IDC_GMC);
919                    config->reduced_resolution = IsDlgChecked(hDlg, IDC_REDUCED);
   
 /* enumerates child windows, assigns tooltips */  
   
 BOOL CALLBACK enum_tooltips(HWND hWnd, LPARAM lParam)  
 {  
         char help[500];  
   
         if (LoadString(hInst, GetDlgCtrlID(hWnd), help, 500))  
         {  
                 TOOLINFO ti;  
920    
921                  ti.cbSize = sizeof(TOOLINFO);          config->use_bvop = IsDlgChecked(hDlg, IDC_BVOP);
922                  ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND;                  config->max_bframes = config_get_int(hDlg, IDC_MAXBFRAMES, config->max_bframes);
923                  ti.hwnd = GetParent(hWnd);                  config->bquant_ratio = config_get_uint(hDlg, IDC_BQUANTRATIO, config->bquant_ratio);
924                  ti.uId  = (LPARAM)hWnd;                  config->bquant_offset = config_get_uint(hDlg, IDC_BQUANTOFFSET, config->bquant_offset);
925                  ti.lpszText = help;          config->bvop_threshold = config_get_uint(hDlg, IDC_BVOP_THRESHOLD, config->bvop_threshold);
926                    config->packed = IsDlgChecked(hDlg, IDC_PACKED);
927                    config->closed_gov = IsDlgChecked(hDlg, IDC_CLOSEDGOV);
928    
929                  SendMessage(hTooltip, TTM_ADDTOOL, 0, (LPARAM)&ti);          config->lum_masking = IsDlgChecked(hDlg, IDC_LUMMASK);
930          }                  config->max_key_interval = config_get_uint(hDlg, IDC_MAXKEY, config->max_key_interval);
931                    config->min_key_interval = config_get_uint(hDlg, IDC_MINKEY, config->min_key_interval);
932            break;
933    
934          return TRUE;          case IDD_QUANT :
935  }                  config->min_iquant = config_get_uint(hDlg, IDC_MINIQUANT, config->min_iquant);
936                    config->max_iquant = config_get_uint(hDlg, IDC_MAXIQUANT, config->max_iquant);
937                    config->min_pquant = config_get_uint(hDlg, IDC_MINPQUANT, config->min_pquant);
938                    config->max_pquant = config_get_uint(hDlg, IDC_MAXPQUANT, config->max_pquant);
939    
940                    CONSTRAINVAL(config->min_iquant, 1, 31);
941                    CONSTRAINVAL(config->max_iquant, config->min_iquant, 31);
942                    CONSTRAINVAL(config->min_pquant, 1, 31);
943                    CONSTRAINVAL(config->max_pquant, config->min_pquant, 31);
944                    break;
945    
946            case IDD_DEBUG :
947                    config->cpu = 0;
948                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_MMX)      ? XVID_CPU_MMX : 0;
949                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_MMXEXT)   ? XVID_CPU_MMXEXT : 0;
950                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_SSE)      ? XVID_CPU_SSE : 0;
951                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_SSE2)     ? XVID_CPU_SSE2 : 0;
952                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_3DNOW)    ? XVID_CPU_3DNOW : 0;
953                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_3DNOWEXT) ? XVID_CPU_3DNOWEXT : 0;
954                    config->cpu |= IsDlgChecked(hDlg, IDC_CPU_FORCE)    ? XVID_CPU_FORCE : 0;
955    
956  /* --- decoder options dialog  --- */                  config->num_threads = config_get_uint(hDlg, IDC_NUMTHREADS, config->num_threads);
957    
958  #define DEC_DLG_COUNT   1          config->fourcc_used = SendDlgItemMessage(hDlg, IDC_FOURCC, CB_GETCURSEL, 0, 0);
959  #define DEC_DLG_POSTPROC        0                  config->debug = IsDlgChecked(hDlg, IDC_DEBUG);
960                    break;
961    
 /* decoder dialog: upload config data */  
962    
963  void dec_upload(HWND hDlg, int page, CONFIG * config)          case IDD_POSTPROC :
964  {  //              config->deblock_y = IsDlgChecked(hDlg, IDC_DEBLOCK_Y);
965          switch (page)  //              config->deblock_uv = IsDlgChecked(hDlg, IDC_DEBLOCK_UV);
         {  
         case DEC_DLG_POSTPROC :  
                 CheckDlgButton(hDlg, IDC_DEBLOCK_Y,  config->deblock_y ? BST_CHECKED : BST_UNCHECKED);  
                 CheckDlgButton(hDlg, IDC_DEBLOCK_UV, config->deblock_uv ? BST_CHECKED : BST_UNCHECKED);  
966                  break;                  break;
967          }          }
968  }  }
969    
970    
 /* dec dialog: download config data */  
   
 void dec_download(HWND hDlg, int page, CONFIG * config)  
 {  
         switch (page)  
         {  
         case DEC_DLG_POSTPROC :  
                 config->deblock_y = ISDLGSET(IDC_DEBLOCK_Y);  
                 config->deblock_uv = ISDLGSET(IDC_DEBLOCK_UV);  
                 break;  
         }  
 }  
971    
972  /* decoder dialog proc */  /* advanced dialog proc */
973    
974  BOOL CALLBACK dec_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  BOOL CALLBACK adv_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
975  {  {
976          PROPSHEETINFO *psi;          PROPSHEETINFO *psi;
977    
# Line 1022  Line 981 
981          {          {
982          case WM_INITDIALOG :          case WM_INITDIALOG :
983                  psi = (PROPSHEETINFO*) ((LPPROPSHEETPAGE)lParam)->lParam;                  psi = (PROPSHEETINFO*) ((LPPROPSHEETPAGE)lParam)->lParam;
   
984                  SetWindowLong(hDlg, GWL_USERDATA, (LPARAM)psi);                  SetWindowLong(hDlg, GWL_USERDATA, (LPARAM)psi);
985    
986                  if (hTooltip)                  if (g_hTooltip)
                 {  
987                          EnumChildWindows(hDlg, enum_tooltips, 0);                          EnumChildWindows(hDlg, enum_tooltips, 0);
                 }  
988    
989                  dec_upload(hDlg, psi->page, psi->config);          adv_init(hDlg, psi->idd, psi->config);
990                    adv_upload(hDlg, psi->idd, psi->config);
991                    adv_mode(hDlg, psi->idd, psi->config);
992                  break;                  break;
993    
994          case WM_NOTIFY :          case WM_COMMAND :
995                  switch (((NMHDR *)lParam)->code)                  if (HIWORD(wParam) == BN_CLICKED)
996                  {                  {
997                  case PSN_KILLACTIVE :                          switch (LOWORD(wParam))
998                          /* validate */                          {
999                          dec_download(hDlg, psi->page, psi->config);              case IDC_PROFILE_MPEGQUANT :
1000                          SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);              case IDC_PROFILE_INTERLACE :
1001                          break;              case IDC_PROFILE_QPEL :
1002                case IDC_PROFILE_GMC :
1003                case IDC_PROFILE_REDUCED :
1004                case IDC_PROFILE_BVOP :
1005                            case IDC_USEALT :
1006                            case IDC_USEAUTO :
1007                            case IDC_USEAUTOBONUS :
1008                case IDC_BVOP :
1009                            case IDC_CPU_AUTO :
1010                            case IDC_CPU_FORCE :
1011                                    adv_mode(hDlg, psi->idd, psi->config);
1012                                    break;
1013    
1014                case IDC_QUANTMATRIX :
1015                            DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_QUANTMATRIX), hDlg, quantmatrix_proc, (LPARAM)psi->config);
1016                    break;
1017    
1018                case IDC_STATS_BROWSE :
1019                {
1020                                OPENFILENAME ofn;
1021                                char tmp[MAX_PATH];
1022    
1023                                GetDlgItemText(hDlg, IDC_STATS, tmp, MAX_PATH);
1024    
1025                                memset(&ofn, 0, sizeof(OPENFILENAME));
1026                                ofn.lStructSize = sizeof(OPENFILENAME);
1027    
1028                                ofn.hwndOwner = hDlg;
1029                                ofn.lpstrFilter = "bitrate curve (*.stats)\0*.stats\0All files (*.*)\0*.*\0\0";
1030                                ofn.lpstrFile = tmp;
1031                                ofn.nMaxFile = MAX_PATH;
1032                                ofn.Flags = OFN_PATHMUSTEXIST;
1033    
1034                    if (psi->idd == IDD_RC_2PASS1) {
1035                        ofn.Flags |= OFN_OVERWRITEPROMPT;
1036                    }else{
1037                        ofn.Flags |= OFN_FILEMUSTEXIST;
1038                    }
1039    
1040                                if (GetSaveFileName(&ofn))
1041                                {
1042                                        SetDlgItemText(hDlg, IDC_STATS, tmp);
1043                    }
1044                }
1045                }
1046                    }else if (LOWORD(wParam) == IDC_PROFILE_PROFILE && HIWORD(wParam) == LBN_SELCHANGE)
1047                    {
1048                            adv_download(hDlg, psi->idd, psi->config);
1049                adv_upload(hDlg, psi->idd, psi->config);
1050                adv_mode(hDlg, psi->idd, psi->config);
1051            }
1052                    break;
1053    
1054            case WM_NOTIFY :
1055                    switch (((NMHDR *)lParam)->code)
1056                    {
1057                    case PSN_KILLACTIVE :
1058                            /* validate */
1059                            adv_download(hDlg, psi->idd, psi->config);
1060                            SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
1061                            break;
1062    
1063                  case PSN_APPLY :                  case PSN_APPLY :
1064                          /* apply */                          /* apply */
1065                          dec_download(hDlg, psi->page, psi->config);                          adv_download(hDlg, psi->idd, psi->config);
1066                          SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);                          SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
1067                          psi->config->save = TRUE;                          psi->config->save = TRUE;
1068                          break;                          break;
# Line 1059  Line 1077 
1077  }  }
1078    
1079    
1080  void dec_dialog(HWND hParent, CONFIG * config)  
1081    
1082    /* load advanced options property sheet */
1083    void adv_dialog(HWND hParent, CONFIG * config, const int * dlgs, int size)
1084  {  {
1085          PROPSHEETINFO psi[DEC_DLG_COUNT];          PROPSHEETINFO psi[6];
1086          PROPSHEETPAGE psp[DEC_DLG_COUNT];          PROPSHEETPAGE psp[6];
1087          PROPSHEETHEADER psh;          PROPSHEETHEADER psh;
1088          CONFIG temp;          CONFIG temp;
1089          int i;          int i;
# Line 1070  Line 1091 
1091          config->save = FALSE;          config->save = FALSE;
1092          memcpy(&temp, config, sizeof(CONFIG));          memcpy(&temp, config, sizeof(CONFIG));
1093    
1094          for (i=0 ; i<DEC_DLG_COUNT ; ++i)          for (i=0; i<size; i++)
1095          {          {
1096                  psp[i].dwSize = sizeof(PROPSHEETPAGE);                  psp[i].dwSize = sizeof(PROPSHEETPAGE);
1097                  psp[i].dwFlags = 0;                  psp[i].dwFlags = 0;
1098                  psp[i].hInstance = hInst;                  psp[i].hInstance = g_hInst;
1099                  psp[i].pfnDlgProc = dec_proc;                  psp[i].pfnDlgProc = adv_proc;
1100                  psp[i].lParam = (LPARAM)&psi[i];                  psp[i].lParam = (LPARAM)&psi[i];
1101                  psp[i].pfnCallback = NULL;                  psp[i].pfnCallback = NULL;
1102                    psp[i].pszTemplate = MAKEINTRESOURCE(dlgs[i]);
1103    
1104                  psi[i].page = i;                  psi[i].idd = dlgs[i];
1105                  psi[i].config = &temp;                  psi[i].config = &temp;
1106          }          }
1107    
         psp[DEC_DLG_POSTPROC].pszTemplate = MAKEINTRESOURCE(IDD_POSTPROC);  
   
1108          psh.dwSize = sizeof(PROPSHEETHEADER);          psh.dwSize = sizeof(PROPSHEETHEADER);
1109          psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;          psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
1110          psh.hwndParent = hParent;          psh.hwndParent = hParent;
1111          psh.hInstance = hInst;          psh.hInstance = g_hInst;
1112          psh.pszCaption = (LPSTR) "XviD Configuration";          psh.pszCaption = (LPSTR) "XviD Configuration";
1113          psh.nPages = DEC_DLG_COUNT;          psh.nPages = size;
1114          psh.nStartPage = DEC_DLG_POSTPROC;          psh.nStartPage = 0;
1115          psh.ppsp = (LPCPROPSHEETPAGE)&psp;          psh.ppsp = (LPCPROPSHEETPAGE)&psp;
1116          psh.pfnCallback = NULL;          psh.pfnCallback = NULL;
   
1117          PropertySheet(&psh);          PropertySheet(&psh);
1118    
1119          if (temp.save)          if (temp.save)
# Line 1103  Line 1122 
1122          }          }
1123  }  }
1124    
1125    /* ===================================================================================== */
1126    /* MAIN DIALOG ========================================================================= */
1127    /* ===================================================================================== */
1128    
1129    
1130    /* downloads data from main dialog */
1131    
1132    void main_download(HWND hDlg, CONFIG * config)
1133    {
1134    
1135            config->profile = SendDlgItemMessage(hDlg, IDC_PROFILE, CB_GETCURSEL, 0, 0);
1136    
1137            switch(config->mode)
1138            {
1139            default :
1140            case RC_MODE_CBR :
1141                    config->rc_bitrate = config_get_uint(hDlg, IDC_VALUE, config->rc_bitrate) * CONFIG_KBPS;
1142                    break;
1143    
1144            /* case RC_MODE_VBR_QUAL :
1145                    config->quality = config_get_uint(hDlg, IDC_VALUE, config->quality);
1146                    break; */
1147    
1148            case RC_MODE_FIXED :
1149                    config->quant = config_get_uint(hDlg, IDC_VALUE, config->quant);
1150                    break;
1151    
1152            case RC_MODE_2PASS2_INT :
1153                    config->desired_size = config_get_uint(hDlg, IDC_VALUE, config->desired_size);
1154                    break;
1155            }
1156    
1157            config->mode = SendDlgItemMessage(hDlg, IDC_MODE, CB_GETCURSEL, 0, 0);
1158    }
1159    
1160    
1161    /* updates the edit box */
1162    
1163    void main_value(HWND hDlg, CONFIG* config)
1164    {
1165            char* text;
1166            int value;
1167            int enabled = TRUE;
1168    
1169            switch (config->mode)
1170            {
1171            default :
1172                    enabled = FALSE;
1173    
1174            case RC_MODE_CBR :
1175                    text = "Bitrate (Kbps):";
1176                    value = config->rc_bitrate / CONFIG_KBPS;
1177                    break;
1178    
1179            /* case DLG_MODE_VBR_QUAL :
1180                    text = "Quality:";
1181                    value = config->quality;
1182                    break; */
1183    
1184            case RC_MODE_FIXED :
1185                    text = "Quantizer:";
1186                    value = config->quant;
1187                    break;
1188    
1189            case RC_MODE_2PASS2_INT :
1190                    text = "Desired size (Kbtyes):";
1191                    value = config->desired_size;
1192                    break;
1193            }
1194    
1195            SetDlgItemText(hDlg, IDC_VALUE_STATIC, text);
1196            SetDlgItemInt(hDlg, IDC_VALUE, value, FALSE);
1197    
1198            EnableWindow(GetDlgItem(hDlg, IDC_VALUE_STATIC), enabled);
1199            EnableWindow(GetDlgItem(hDlg, IDC_VALUE), enabled);
1200    
1201            if (config->mode == RC_MODE_CBR || config->mode == RC_MODE_2PASS1 ||
1202            config->mode == RC_MODE_2PASS2_INT || config->mode == RC_MODE_2PASS2_EXT) {
1203                    EnableWindow(GetDlgItem(hDlg, IDC_MODE_ADV), TRUE);
1204        }else{
1205                    EnableWindow(GetDlgItem(hDlg, IDC_MODE_ADV), FALSE);
1206        }
1207    }
1208    
1209    
1210    /* updates the slider */
1211    
1212    void main_slider(HWND hDlg, CONFIG * config)
1213    {
1214            char* text;
1215            long range;
1216            int pos;
1217            int enabled = TRUE;
1218    
1219            switch (config->mode)
1220            {
1221            default :
1222                    enabled = FALSE;
1223    
1224            case RC_MODE_CBR :
1225                    text = "Bitrate (Kbps):";
1226                    range = MAKELONG(0,10000);
1227                    pos = config->rc_bitrate / CONFIG_KBPS;
1228                    break;
1229    
1230            /* case RC_MODE_VBR_QUAL :
1231                    text = "Quality:";
1232                    range = MAKELONG(0,100);
1233                    pos = config->quality;
1234                    break; */
1235    
1236            case RC_MODE_FIXED :
1237                    text = "Quantizer:";
1238                    range = MAKELONG(1,31);
1239                    pos = config->quant;
1240                    break;
1241            }
1242    
1243            SetDlgItemText(hDlg, IDC_SLIDER_STATIC, text);
1244            SendDlgItemMessage(hDlg, IDC_SLIDER, TBM_SETRANGE, TRUE, range);
1245            SendDlgItemMessage(hDlg, IDC_SLIDER, TBM_SETPOS, TRUE, pos);
1246    
1247            EnableWindow(GetDlgItem(hDlg, IDC_SLIDER_STATIC), enabled);
1248            EnableWindow(GetDlgItem(hDlg, IDC_SLIDER), enabled);
1249    }
1250    
1251    
1252  /* main dialog proc */  /* main dialog proc */
# Line 1110  Line 1254 
1254  BOOL CALLBACK main_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  BOOL CALLBACK main_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
1255  {  {
1256          CONFIG* config = (CONFIG*)GetWindowLong(hDlg, GWL_USERDATA);          CONFIG* config = (CONFIG*)GetWindowLong(hDlg, GWL_USERDATA);
1257            unsigned int i;
1258    
1259          switch (uMsg)          switch (uMsg)
1260          {          {
# Line 1118  Line 1263 
1263    
1264                  config = (CONFIG*)lParam;                  config = (CONFIG*)lParam;
1265    
1266                    for (i=0; i<sizeof(profiles)/sizeof(profile_t); i++)
1267                            SendDlgItemMessage(hDlg, IDC_PROFILE, CB_ADDSTRING, 0, (LPARAM)profiles[i].name);
1268                    SendDlgItemMessage(hDlg, IDC_PROFILE, CB_SETCURSEL, config->profile, 0);
1269    
1270                  SendDlgItemMessage(hDlg, IDC_MODE, CB_ADDSTRING, 0, (LPARAM)"1 Pass - CBR");                  SendDlgItemMessage(hDlg, IDC_MODE, CB_ADDSTRING, 0, (LPARAM)"1 Pass - CBR");
1271                  SendDlgItemMessage(hDlg, IDC_MODE, CB_ADDSTRING, 0, (LPARAM)"1 Pass - quality");                  SendDlgItemMessage(hDlg, IDC_MODE, CB_ADDSTRING, 0, (LPARAM)"1 Pass - quality");
1272                  SendDlgItemMessage(hDlg, IDC_MODE, CB_ADDSTRING, 0, (LPARAM)"1 Pass - quantizer");                  SendDlgItemMessage(hDlg, IDC_MODE, CB_ADDSTRING, 0, (LPARAM)"1 Pass - quantizer");
# Line 1130  Line 1279 
1279    
1280                  InitCommonControls();                  InitCommonControls();
1281    
1282                  if ((hTooltip = CreateWindow(TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP,                  if ((g_hTooltip = CreateWindow(TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP,
1283                                  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,                                  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1284                                  NULL, NULL, hInst, NULL)))                                  NULL, NULL, g_hInst, NULL)))
1285                  {                  {
1286                          SetWindowPos(hTooltip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);                          SetWindowPos(g_hTooltip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
1287                          SendMessage(hTooltip, TTM_SETDELAYTIME, TTDT_AUTOMATIC, MAKELONG(1500, 0));                          SendMessage(g_hTooltip, TTM_SETDELAYTIME, TTDT_AUTOMATIC, MAKELONG(1500, 0));
1288                          SendMessage(hTooltip, TTM_SETMAXTIPWIDTH, 0, 400);                          SendMessage(g_hTooltip, TTM_SETMAXTIPWIDTH, 0, 400);
1289    
1290                          EnumChildWindows(hDlg, enum_tooltips, 0);                          EnumChildWindows(hDlg, enum_tooltips, 0);
1291                  }                  }
# Line 1157  Line 1306 
1306                  break;                  break;
1307    
1308          case WM_COMMAND :          case WM_COMMAND :
1309                  if (LOWORD(wParam) == IDC_MODE && HIWORD(wParam) == LBN_SELCHANGE)                  if (HIWORD(wParam) == LBN_SELCHANGE && (LOWORD(wParam) == IDC_PROFILE || LOWORD(wParam) == IDC_MODE))
1310                  {                  {
1311                          main_download(hDlg, config);                          main_download(hDlg, config);
1312                          main_slider(hDlg, config);                          main_slider(hDlg, config);
1313                          main_value(hDlg, config);                          main_value(hDlg, config);
1314                  }                  }
1315                    else if (LOWORD(wParam) == IDC_PROFILE_ADV && HIWORD(wParam) == BN_CLICKED)     /* profile dlg */
1316                    {
1317                            static const int dlgs[] = { IDD_PROFILE };
1318    
1319                            adv_dialog(hDlg, config, dlgs, sizeof(dlgs)/sizeof(int));
1320                            if (config->save)
1321                            {
1322                                    config_reg_set(config);
1323                            }
1324                            SendDlgItemMessage(hDlg, IDC_PROFILE, CB_SETCURSEL, config->profile, 0);
1325                    }
1326                    else if (LOWORD(wParam) == IDC_MODE_ADV && HIWORD(wParam) == BN_CLICKED)        /* rate control dialog */
1327                    {
1328                            if (config->mode == RC_MODE_CBR) {
1329                                    static const int dlgs[] = { IDD_RC_CBR };
1330                                    adv_dialog(hDlg, config, dlgs, sizeof(dlgs)/sizeof(int));
1331                            }else if (config->mode == RC_MODE_2PASS1) {
1332                                    static const int dlgs[] = { IDD_RC_2PASS1 };
1333                                    adv_dialog(hDlg, config, dlgs, sizeof(dlgs)/sizeof(int));
1334                            }else if (config->mode == RC_MODE_2PASS2_INT || config->mode == RC_MODE_2PASS2_EXT) {
1335                                    static const int dlgs[] = { IDD_RC_2PASS2, IDD_RC_2PASS2_ALT};
1336                                    adv_dialog(hDlg, config, dlgs, sizeof(dlgs)/sizeof(int));
1337                            }
1338                            if (config->save)
1339                            {
1340                                    config_reg_set(config);
1341                            }
1342                    }
1343                  else if (LOWORD(wParam) == IDC_ADVANCED && HIWORD(wParam) == BN_CLICKED)                  else if (LOWORD(wParam) == IDC_ADVANCED && HIWORD(wParam) == BN_CLICKED)
1344                  {                  {
1345                          adv_dialog(hDlg, config);                          static const int dlgs[] = { IDD_MOTION, IDD_TOOLS, IDD_QUANT, IDD_DEBUG};
1346                            adv_dialog(hDlg, config, dlgs, sizeof(dlgs)/sizeof(int));
1347    
1348                          if (config->save)                          if (config->save)
1349                          {                          {
# Line 1174  Line 1352 
1352                  }                  }
1353                  else if (LOWORD(wParam) == IDC_DECODER && HIWORD(wParam) == BN_CLICKED)                  else if (LOWORD(wParam) == IDC_DECODER && HIWORD(wParam) == BN_CLICKED)
1354                  {                  {
1355                          dec_dialog(hDlg, config);                          static const int dlgs[] = { IDD_POSTPROC };
1356                            adv_dialog(hDlg, config, dlgs, sizeof(dlgs)/sizeof(int));
1357    
1358                          if (config->save)                          if (config->save)
1359                          {                          {
# Line 1195  Line 1374 
1374                          int value = config_get_uint(hDlg, IDC_VALUE, 1);                          int value = config_get_uint(hDlg, IDC_VALUE, 1);
1375                          int max = 1;                          int max = 1;
1376    
1377                          max = (config->mode == DLG_MODE_CBR) ? 10000 :                          max = (config->mode == RC_MODE_CBR) ? 10000 :
1378                                  ((config->mode == DLG_MODE_VBR_QUAL) ? 100 :                                  /*((config->mode == DLG_MODE_VBR_QUAL) ? 100 :*/
1379                                  ((config->mode == DLG_MODE_VBR_QUANT) ? 31 : 1<<30));                                  ((config->mode == RC_MODE_FIXED) ? 31 : 1<<30)  /*)*/;
1380    
1381                          if (value < 1)                          if (value < 1)
1382                          {                          {
# Line 1209  Line 1388 
1388                                  SetDlgItemInt(hDlg, IDC_VALUE, value, FALSE);                                  SetDlgItemInt(hDlg, IDC_VALUE, value, FALSE);
1389                          }                          }
1390    
1391                          if (config->mode != DLG_MODE_2PASS_2_INT)                          if (config->mode != RC_MODE_2PASS2_INT)
1392                          {                          {
1393                                  SendDlgItemMessage(hDlg, IDC_SLIDER, TBM_SETPOS, TRUE, value);                                  SendDlgItemMessage(hDlg, IDC_SLIDER, TBM_SETPOS, TRUE, value);
1394                          }                          }
# Line 1235  Line 1414 
1414  }  }
1415    
1416    
 /* advanced dialog proc */  
   
 BOOL CALLBACK adv_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  
 {  
         PROPSHEETINFO *psi;  
   
         psi = (PROPSHEETINFO*)GetWindowLong(hDlg, GWL_USERDATA);  
   
         switch (uMsg)  
         {  
         case WM_INITDIALOG :  
                 psi = (PROPSHEETINFO*) ((LPPROPSHEETPAGE)lParam)->lParam;  
   
                 SetWindowLong(hDlg, GWL_USERDATA, (LPARAM)psi);  
   
                 if (psi->page == DLG_GLOBAL)  
                 {  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"0 - None");  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"1 - Very Low");  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"2 - Low");  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"3 - Medium");  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"4 - High");  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"5 - Very High");  
                         SendDlgItemMessage(hDlg, IDC_MOTION, CB_ADDSTRING, 0, (LPARAM)"6 - Ultra High");  
   
                         SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"H.263");  
                         SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"MPEG");  
                         SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"MPEG-Custom");  
                         SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"Modulated");  
                         SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_ADDSTRING, 0, (LPARAM)"New Modulated HQ");  
   
                         SendDlgItemMessage(hDlg, IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)"XVID");  
                         SendDlgItemMessage(hDlg, IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)"DIVX");  
                         SendDlgItemMessage(hDlg, IDC_FOURCC, CB_ADDSTRING, 0, (LPARAM)"DX50");  
   
                         SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"0 - Off");  
                         SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"1 - Mode Decision");  
                         SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"2 - Limited Search");  
                         SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"3 - Medium Search");  
                         SendDlgItemMessage(hDlg, IDC_VHQ, CB_ADDSTRING, 0, (LPARAM)"4 - Wide Search");  
                         /* XXX: reduced resolution is not ready for prime-time */  
                         ShowWindow(GetDlgItem(hDlg, IDC_REDUCED), SW_HIDE);  
                 }  
                 else if (psi->page == DLG_2PASSALT)  
                 {  
                         SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_ADDSTRING, 0, (LPARAM)"Low");  
                         SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_ADDSTRING, 0, (LPARAM)"Medium");  
                         SendDlgItemMessage(hDlg, IDC_CURVETYPE, CB_ADDSTRING, 0, (LPARAM)"High");  
                 }  
                 else if (psi->page == DLG_CPU)  
                 {  
                         EnableWindow(GetDlgItem(hDlg, IDC_NUMTHREADS_STATIC), FALSE);  
                         EnableWindow(GetDlgItem(hDlg, IDC_NUMTHREADS), FALSE);  
                 }  
   
                 if (hTooltip)  
                 {  
                         EnumChildWindows(hDlg, enum_tooltips, 0);  
                 }  
   
                 adv_upload(hDlg, psi->page, psi->config);  
                 adv_mode(hDlg, psi->config->mode);  
                 break;  
   
         case WM_COMMAND :  
                 if (HIWORD(wParam) == BN_CLICKED)  
                 {  
                         switch (LOWORD(wParam))  
                         {  
                         case IDC_HINTEDME :  
                         case IDC_USEALT :  
                         case IDC_USEAUTO :  
                         case IDC_USEAUTOBONUS :  
                         case IDC_CREDITS_START :  
                         case IDC_CREDITS_END :  
                         case IDC_CREDITS_RATE_RADIO :  
                         case IDC_CREDITS_QUANT_RADIO :  
                         case IDC_CREDITS_SIZE_RADIO :  
                         case IDC_CPU_AUTO :  
                         case IDC_CPU_FORCE :  
                                 adv_mode(hDlg, psi->config->mode);  
                                 break;  
                         }  
                 }  
                 if ((LOWORD(wParam) == IDC_HINT_BROWSE || LOWORD(wParam) == IDC_STATS1_BROWSE || LOWORD(wParam) == IDC_STATS2_BROWSE) && HIWORD(wParam) == BN_CLICKED)  
                 {  
                         OPENFILENAME ofn;  
                         char tmp[MAX_PATH];  
                         int hComponent = (LOWORD(wParam) == IDC_STATS1_BROWSE ? IDC_STATS1 : IDC_STATS2);  
   
                         GetDlgItemText(hDlg, hComponent, tmp, MAX_PATH);  
   
                         memset(&ofn, 0, sizeof(OPENFILENAME));  
                         ofn.lStructSize = sizeof(OPENFILENAME);  
   
                         ofn.hwndOwner = hDlg;  
                         ofn.lpstrFilter = "bitrate curve (*.stats)\0*.stats\0All files (*.*)\0*.*\0\0";  
                         ofn.lpstrFile = tmp;  
                         ofn.nMaxFile = MAX_PATH;  
                         ofn.Flags = OFN_PATHMUSTEXIST;  
   
                         if (LOWORD(wParam) == IDC_HINT_BROWSE)  
                         {  
                                 ofn.lpstrFilter = "motion hints (*.mvh)\0*.mvh\0All files (*.*)\0*.*\0\0";  
                                 if (GetOpenFileName(&ofn))  
                                 {  
                                         SetDlgItemText(hDlg, IDC_HINTFILE, tmp);  
                                 }  
                         }  
                         else if (LOWORD(wParam) == IDC_STATS1_BROWSE &&  
                                 psi->config->mode == DLG_MODE_2PASS_1)  
                         {  
                                 ofn.Flags |= OFN_OVERWRITEPROMPT;  
                                 if (GetSaveFileName(&ofn))  
                                 {  
                                         SetDlgItemText(hDlg, hComponent, tmp);  
                                 }  
                         }  
                         else  
                         {  
                                 ofn.Flags |= OFN_FILEMUSTEXIST;  
                                 if (GetOpenFileName(&ofn)) {  
                                         SetDlgItemText(hDlg, hComponent, tmp);  
                                 }  
                         }  
                 }  
                 else if (LOWORD(wParam) == IDC_QUANTMATRIX && HIWORD(wParam) == BN_CLICKED)  
                 {  
                         DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_QUANTMATRIX), hDlg, quantmatrix_proc, (LPARAM)psi->config);  
                 }  
                 break;  
   
         case WM_NOTIFY :  
                 switch (((NMHDR *)lParam)->code)  
                 {  
                 case PSN_KILLACTIVE :  
                         /* validate */  
                         adv_download(hDlg, psi->page, psi->config);  
                         SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);  
                         break;  
   
                 case PSN_APPLY :  
                         /* apply */  
                         adv_download(hDlg, psi->page, psi->config);  
                         SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);  
                         psi->config->save = TRUE;  
                         break;  
                 }  
                 break;  
   
         default :  
                 return 0;  
         }  
   
         return 1;  
 }  
   
   
 /* quantization matrix dialog proc */  
   
 BOOL CALLBACK quantmatrix_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  
 {  
         CONFIG* config = (CONFIG*)GetWindowLong(hDlg, GWL_USERDATA);  
   
         switch (uMsg)  
         {  
         case WM_INITDIALOG :  
                 SetWindowLong(hDlg, GWL_USERDATA, lParam);  
                 config = (CONFIG*)lParam;  
                 quant_upload(hDlg, config);  
   
                 if (hTooltip)  
                 {  
                         EnumChildWindows(hDlg, enum_tooltips, 0);  
                 }  
                 break;  
   
         case WM_COMMAND :  
                 if (LOWORD(wParam) == IDOK && HIWORD(wParam) == BN_CLICKED)  
                 {  
                         quant_download(hDlg, config);  
                         EndDialog(hDlg, IDOK);  
                 }  
                 else if (LOWORD(wParam) == IDCANCEL)  
                 {  
                         EndDialog(hDlg, IDCANCEL);  
                 }  
                 else if ((LOWORD(wParam) == IDC_LOAD || LOWORD(wParam) == IDC_SAVE) && HIWORD(wParam) == BN_CLICKED)  
                 {  
                         OPENFILENAME ofn;  
                         char file[MAX_PATH];  
   
                         HANDLE hFile;  
                         DWORD read=128, wrote=0;  
                         BYTE quant_data[128];  
   
                         strcpy(file, "\\matrix");  
                         memset(&ofn, 0, sizeof(OPENFILENAME));  
                         ofn.lStructSize = sizeof(OPENFILENAME);  
   
                         ofn.hwndOwner = hDlg;  
                         ofn.lpstrFilter = "All files (*.*)\0*.*\0\0";  
                         ofn.lpstrFile = file;  
                         ofn.nMaxFile = MAX_PATH;  
                         ofn.Flags = OFN_PATHMUSTEXIST;  
   
                         if (LOWORD(wParam) == IDC_SAVE)  
                         {  
                                 ofn.Flags |= OFN_OVERWRITEPROMPT;  
                                 if (GetSaveFileName(&ofn))  
                                 {  
                                         hFile = CreateFile(file, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  
   
                                         quant_download(hDlg, config);  
                                         memcpy(quant_data, config->qmatrix_intra, 64);  
                                         memcpy(quant_data+64, config->qmatrix_inter, 64);  
   
                                         if (hFile == INVALID_HANDLE_VALUE)  
                                         {  
                                                 DEBUGERR("Couldn't save quant matrix");  
                                         }  
                                         else  
                                         {  
                                                 if (!WriteFile(hFile, quant_data, 128, &wrote, 0))  
                                                 {  
                                                         DEBUGERR("Couldnt write quant matrix");  
                                                 }  
                                         }  
   
                                         CloseHandle(hFile);  
                                 }  
                         }  
                         else  
                         {  
                                 ofn.Flags |= OFN_FILEMUSTEXIST;  
                                 if (GetOpenFileName(&ofn))  
                                 {  
                                         hFile = CreateFile(file, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  
   
                                         if (hFile == INVALID_HANDLE_VALUE)  
                                         {  
                                                 DEBUGERR("Couldn't load quant matrix");  
                                         }  
                                         else  
                                         {  
                                                 if (!ReadFile(hFile, quant_data, 128, &read, 0))  
                                                 {  
                                                         DEBUGERR("Couldnt read quant matrix");  
                                                 }  
                                                 else  
                                                 {  
                                                         memcpy(config->qmatrix_intra, quant_data, 64);  
                                                         memcpy(config->qmatrix_inter, quant_data+64, 64);  
                                                         quant_upload(hDlg, config);  
                                                 }  
                                         }  
   
                                         CloseHandle(hFile);  
                                 }  
                         }  
                 }  
                 break;  
   
         default :  
                 return 0;  
         }  
   
         return 1;  
 }  
   
1417    
1418  /* about dialog proc */  /* ===================================================================================== */
1419    /* ABOUT DIALOG ======================================================================== */
1420    /* ===================================================================================== */
1421    
1422  BOOL CALLBACK about_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)  BOOL CALLBACK about_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
1423  {  {

Legend:
Removed from v.889  
changed lines
  Added in v.983

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4