--- trunk/xvidcore/vfw/src/config.c 2004/07/13 12:22:46 1490 +++ trunk/xvidcore/vfw/src/config.c 2008/11/28 11:56:01 1816 @@ -104,47 +104,67 @@ /* MPEG-4 PROFILES/LEVELS ============================================================== */ /* ===================================================================================== */ - +/* #define EXTRA_PROFILES */ /* default vbv_occupancy is (64/170)*vbv_buffer_size */ +#define PROFILE_S (PROFILE_4MV) +#define PROFILE_ARTS (PROFILE_4MV|PROFILE_ADAPTQUANT) +#define PROFILE_AS (PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_MPEGQUANT|PROFILE_INTERLACE|PROFILE_QPEL|PROFILE_GMC) + const profile_t profiles[] = { -/* name p@l, w h fps obj Tvmv vmv vcv ac% vbv pkt kbps flags */ - { "Simple @ L0", 0x08, 176, 144, 15, 1, 198, 99, 1485, 100, 10*16368, 2048, 64, 0 }, - /* simple@l0: max f_code=1, intra_dc_vlc_threshold=0 */ - /* if ac preidition is used, adaptive quantization must not be used */ - /* <=qcif must be used */ - { "Simple @ L1", 0x01, 176, 144, 15, 4, 198, 99, 1485, 100, 10*16368, 2048, 64, PROFILE_ADAPTQUANT }, - { "Simple @ L2", 0x02, 352, 288, 15, 4, 792, 396, 5940, 100, 40*16368, 4096, 128, PROFILE_ADAPTQUANT }, - { "Simple @ L3", 0x03, 352, 288, 15, 4, 792, 396, 11880, 100, 40*16368, 8192, 384, PROFILE_ADAPTQUANT }, - - { "ARTS @ L1", 0x91, 176, 144, 15, 4, 198, 99, 1485, 100, 10*16368, 8192, 64, PROFILE_ARTS }, - { "ARTS @ L2", 0x92, 352, 288, 15, 4, 792, 396, 5940, 100, 40*16368, 16384, 128, PROFILE_ARTS }, - { "ARTS @ L3", 0x93, 352, 288, 30, 4, 792, 396, 11880, 100, 40*16368, 16384, 384, PROFILE_ARTS }, - { "ARTS @ L4", 0x94, 352, 288, 30, 16, 792, 396, 11880, 100, 80*16368, 16384, 2000, PROFILE_ARTS }, - - { "AS @ L0", 0xf0, 176, 144, 30, 1, 297, 99, 2970, 100, 10*16368, 2048, 128, PROFILE_AS }, - { "AS @ L1", 0xf1, 176, 144, 30, 4, 297, 99, 2970, 100, 10*16368, 2048, 128, PROFILE_AS }, - { "AS @ L2", 0xf2, 352, 288, 15, 4, 1188, 396, 5940, 100, 40*16368, 4096, 384, PROFILE_AS }, - { "AS @ L3", 0xf3, 352, 288, 30, 4, 1188, 396, 11880, 100, 40*16368, 4096, 768, PROFILE_AS }, +/* name p@l w h fps obj Tvmv vmv vcv ac% vbv pkt bps vbv_peak dbf flags */ + { "Simple @ L0", 0x08, 176, 144, 15, 1, 198, 99, 1485, 100, 10*16368, 2048, 64000, 0, -1, PROFILE_S }, + /* simple@l0: max f_code=1, intra_dc_vlc_threshold=0 */ + /* if ac preidition is used, adaptive quantization must not be used */ + /* <=qcif must be used */ + { "Simple @ L1", 0x01, 176, 144, 15, 4, 198, 99, 1485, 100, 10*16368, 2048, 64000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, + { "Simple @ L2", 0x02, 352, 288, 15, 4, 792, 396, 5940, 100, 40*16368, 4096, 128000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, + { "Simple @ L3", 0x03, 352, 288, 15, 4, 792, 396, 11880, 100, 40*16368, 8192, 384000, 0, -1, PROFILE_S|PROFILE_ADAPTQUANT }, + +#if 0 /* since rrv encoding is no longer support, these profiles have little use */ + { "ARTS @ L1", 0x91, 176, 144, 15, 4, 198, 99, 1485, 100, 10*16368, 8192, 64000, 0, -1, PROFILE_ARTS }, + { "ARTS @ L2", 0x92, 352, 288, 15, 4, 792, 396, 5940, 100, 40*16368, 16384, 128000, 0, -1, PROFILE_ARTS }, + { "ARTS @ L3", 0x93, 352, 288, 30, 4, 792, 396, 11880, 100, 40*16368, 16384, 384000, 0, -1, PROFILE_ARTS }, + { "ARTS @ L4", 0x94, 352, 288, 30, 16, 792, 396, 11880, 100, 80*16368, 16384, 2000000, 0, -1, PROFILE_ARTS }, +#endif + + { "Advanced Simple @ L0", 0xf0, 176, 144, 30, 1, 297, 99, 2970, 100, 10*16368, 2048, 128000, 0, -1, PROFILE_AS }, + { "Advanced Simple @ L1", 0xf1, 176, 144, 30, 4, 297, 99, 2970, 100, 10*16368, 2048, 128000, 0, -1, PROFILE_AS }, + { "Advanced Simple @ L2", 0xf2, 352, 288, 15, 4, 1188, 396, 5940, 100, 40*16368, 4096, 384000, 0, -1, PROFILE_AS }, + { "Advanced Simple @ L3", 0xf3, 352, 288, 30, 4, 1188, 396, 11880, 100, 40*16368, 4096, 768000, 0, -1, PROFILE_AS }, /* ISMA Profile 1, (ASP) @ L3b (CIF, 1.5 Mb/s) CIF(352x288), 30fps, 1.5Mbps max ??? */ - { "AS @ L4", 0xf4, 352, 576, 30, 4, 2376, 792, 23760, 50, 80*16368, 8192, 3000, PROFILE_AS }, - { "AS @ L5", 0xf5, 720, 576, 30, 4, 4860, 1620, 48600, 25, 112*16368, 16384, 8000, PROFILE_AS }, + { "Advanced Simple @ L4", 0xf4, 352, 576, 30, 4, 2376, 792, 23760, 50, 80*16368, 8192, 3000000, 0, -1, PROFILE_AS }, + { "Advanced Simple @ L5", 0xf5, 720, 576, 30, 4, 4860, 1620, 48600, 25, 112*16368, 16384, 8000000, 0, -1, PROFILE_AS }, -#ifdef DXN_PROFILES - { "DXN Handheld", 0x00, 176, 144, 15, -1, 198, 99, 1485, 100, 16*16368, -1, 128, PROFILE_ADAPTQUANT }, - { "DXN Portable NTSC", 0x00, 352, 240, 30, -1, 990, 330, 9900, 100, 64*16368, -1, 768, PROFILE_ADAPTQUANT|PROFILE_BVOP }, - { "DXN Portable PAL", 0x00, 352, 288, 25, -1, 1188, 396, 9900, 100, 64*16368, -1, 768, PROFILE_ADAPTQUANT|PROFILE_BVOP }, - { "DXN HT NTSC", 0x00, 720, 480, 30, -1, 4050, 1350, 40500, 100, 192*16368, -1, 4000, PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE }, - { "DXN HT PAL", 0x00, 720, 576, 25, -1, 4860, 1620, 40500, 100, 192*16368, -1, 4000, PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE }, - { "DXN HDTV", 0x00, 1280, 720, 30, -1,10800, 3600, 108000, 100, 384*16368, -1, 8000, PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_INTERLACE }, +#ifndef EXTRA_PROFILES + { "Mobile", 0x00, 352, 240, 30, 1, 990, 330, 36000, 100, 128*8192, -1, 1334850, 8000000, 5, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_MPEGQUANT|PROFILE_QPEL }, + { "Portable", 0x00, 640, 480, 30, 1, 3600, 1200, 36000, 100, 384*8192, -1, 4854000, 8000000, 5, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_MPEGQUANT|PROFILE_QPEL|PROFILE_INTERLACE }, + { "Home", 0x00, 720, 576, 25, 1, 4860, 1620, 40500, 100, 384*8192, -1, 4854000, 8000000, 5, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_MPEGQUANT|PROFILE_QPEL|PROFILE_INTERLACE }, + { "Highdef", 0x00, 1280, 720, 30, 1,10800, 3600, 108000, 100, 768*8192, -1, 9708400, 16000000, 5, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_MPEGQUANT|PROFILE_QPEL|PROFILE_INTERLACE }, +#else + { "Handheld", 0x00, 176, 144, 15, 1, 198, 99, 1485, 100, 32*8192, -1, 537600, 800000, 0, PROFILE_ADAPTQUANT|PROFILE_EXTRA }, + { "Portable NTSC", 0x00, 352, 240, 30, 1, 990, 330, 36000, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_EXTRA }, + { "Portable PAL", 0x00, 352, 288, 25, 1, 1188, 396, 36000, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_EXTRA }, + { "Home Theatre NTSC", 0x00, 720, 480, 30, 1, 4050, 1350, 40500, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_INTERLACE|PROFILE_EXTRA }, + { "Home Theatre PAL", 0x00, 720, 576, 25, 1, 4860, 1620, 40500, 100, 384*8192, -1, 4854000, 8000000, 1, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_INTERLACE|PROFILE_EXTRA }, + { "HDTV", 0x00, 1280, 720, 30, 1,10800, 3600, 108000, 100, 768*8192, -1, 9708400, 16000000, 2, PROFILE_4MV|PROFILE_ADAPTQUANT|PROFILE_BVOP|PROFILE_PACKED|PROFILE_INTERLACE|PROFILE_EXTRA }, #endif - { "(unrestricted)", 0x00, 0, 0, 0, 0, 0, 0, 0, 100, 0*16368, 0, 0, 0xffffffff }, + { "(unrestricted)", 0x00, 0, 0, 0, 0, 0, 0, 0, 100, 0*16368, -1, 0, 0, -1, 0xffffffff & ~(PROFILE_EXTRA | PROFILE_PACKED)}, }; +const quality_t quality_table[] = +{ + /* name | m vhq bf cme tbo kfi fdr | iquant pquant bquant trellis */ + { "Real-time", 1, 0, 0, 0, 0, 300, 0, 1, 31, 1, 31, 1, 31, 0 }, + { QUALITY_GENERAL_STRING, 6, 1, 0, 1, 0, 300, 0, 1, 31, 1, 31, 1, 31, 1 }, +}; + +const int quality_table_num = sizeof(quality_table)/sizeof(quality_t); + typedef struct { char * name; float value; @@ -203,13 +223,11 @@ {"tff", ®.tff, 0}, {"qpel", ®.qpel, 0}, {"gmc", ®.gmc, 0}, - {"reduced_resolution", ®.reduced_resolution, 0}, {"use_bvop", ®.use_bvop, 1}, {"max_bframes", ®.max_bframes, 2}, {"bquant_ratio", ®.bquant_ratio, 150}, /* 100-base float */ {"bquant_offset", ®.bquant_offset, 100}, /* 100-base float */ {"packed", ®.packed, 1}, - {"closed_gov", ®.closed_gov, 1}, /* aspect ratio */ {"ar_mode", ®.ar_mode, 0}, @@ -255,28 +273,31 @@ {"audio_size", ®.audio_size, 0}, /* motion */ - {"motion_search", ®.motion_search, 6}, - {"vhq_mode", ®.vhq_mode, 1}, - {"chromame", ®.chromame, 1}, - {"cartoon_mode", ®.cartoon_mode, 0}, - {"turbo", ®.turbo, 0}, - {"max_key_interval", ®.max_key_interval, 300}, - {"frame_drop_ratio", ®.frame_drop_ratio, 0}, + {"motion_search", ®.quality_user.motion_search, 6}, + {"vhq_mode", ®.quality_user.vhq_mode, 1}, + {"vhq_bframe", ®.quality_user.vhq_bframe, 0}, + {"chromame", ®.quality_user.chromame, 1}, + {"turbo", ®.quality_user.turbo, 0}, + {"max_key_interval", ®.quality_user.max_key_interval, 300}, + {"frame_drop_ratio", ®.quality_user.frame_drop_ratio, 0}, /* quant */ - {"min_iquant", ®.min_iquant, 1}, - {"max_iquant", ®.max_iquant, 31}, - {"min_pquant", ®.min_pquant, 1}, - {"max_pquant", ®.max_pquant, 31}, - {"min_bquant", ®.min_bquant, 1}, - {"max_bquant", ®.max_bquant, 31}, - {"trellis_quant", ®.trellis_quant, 0}, + {"min_iquant", ®.quality_user.min_iquant, 1}, + {"max_iquant", ®.quality_user.max_iquant, 31}, + {"min_pquant", ®.quality_user.min_pquant, 1}, + {"max_pquant", ®.quality_user.max_pquant, 31}, + {"min_bquant", ®.quality_user.min_bquant, 1}, + {"max_bquant", ®.quality_user.max_bquant, 31}, + {"trellis_quant", ®.quality_user.trellis_quant, 1}, /* debug */ {"fourcc_used", ®.fourcc_used, 0}, {"debug", ®.debug, 0x0}, {"vop_debug", ®.vop_debug, 0}, {"display_status", ®.display_status, 1}, + + /* smp */ + {"num_threads", ®.num_threads, 0}, /* decoder, shared with dshow */ {"Brightness", &pp_brightness, 0}, @@ -289,7 +310,8 @@ }; static const REG_STR reg_strs[] = { - {"profile", reg.profile_name, "AS @ L5"}, + {"profile", reg.profile_name, "(unrestricted)"}, + {"quality", reg.quality_name, QUALITY_GENERAL_STRING}, {"stats", reg.stats, CONFIG_2PASS_FILE}, }; @@ -304,6 +326,7 @@ {"zone%i_greyscale", &stmp.greyscale, 0}, {"zone%i_chroma_opt", &stmp.chroma_opt, 0}, {"zone%i_bvop_threshold", &stmp.bvop_threshold, 0}, + {"zone%i_cartoon_mode", &stmp.cartoon_mode, 0}, }; static const BYTE default_qmatrix_intra[] = { @@ -356,7 +379,6 @@ } reg.cpu = info.cpu_flags; - reg.num_threads = info.num_threads; RegOpenKeyEx(XVID_REG_KEY, XVID_REG_PARENT "\\" XVID_REG_CHILD, 0, KEY_READ, &hKey); @@ -376,6 +398,7 @@ } } + /* find profile table index */ reg.profile = 0; for (i=0; i 0) { SetDlgItemInt(hDlg, IDC_BITRATE_VSIZE, vsize, TRUE); /* convert from kbytes to kbits-per-second */ - SetDlgItemInt(hDlg, IDC_BITRATE_VRATE, (vsize * 8 * 128) / (duration * 125), TRUE); + SetDlgItemInt(hDlg, IDC_BITRATE_VRATE, (int)(((__int64)vsize * 8 * 128) / (duration * 125)), TRUE); }else{ SetDlgItemText(hDlg, IDC_BITRATE_VSIZE, "Overflow"); SetDlgItemText(hDlg, IDC_BITRATE_VRATE, "Overflow"); @@ -1032,13 +1099,15 @@ EnableDlgWindow(hDlg, IDC_ZONE_BVOPTHRESHOLD, bvops); break; - case IDD_DEBUG : + case IDD_COMMON : cpu_force = IsDlgChecked(hDlg, IDC_CPU_FORCE); EnableDlgWindow(hDlg, IDC_CPU_MMX, cpu_force); EnableDlgWindow(hDlg, IDC_CPU_MMXEXT, cpu_force); EnableDlgWindow(hDlg, IDC_CPU_SSE, cpu_force); EnableDlgWindow(hDlg, IDC_CPU_SSE2, cpu_force); - EnableDlgWindow(hDlg, IDC_CPU_3DNOW, cpu_force); + EnableDlgWindow(hDlg, IDC_CPU_SSE3, cpu_force); + EnableDlgWindow(hDlg, IDC_CPU_SSE4, cpu_force); + EnableDlgWindow(hDlg, IDC_CPU_3DNOW, cpu_force); EnableDlgWindow(hDlg, IDC_CPU_3DNOWEXT, cpu_force); break; } @@ -1059,14 +1128,12 @@ CheckDlg(hDlg, IDC_TFF, config->tff); CheckDlg(hDlg, IDC_QPEL, config->qpel); CheckDlg(hDlg, IDC_GMC, config->gmc); - CheckDlg(hDlg, IDC_REDUCED, config->reduced_resolution); CheckDlg(hDlg, IDC_BVOP, config->use_bvop); SetDlgItemInt(hDlg, IDC_MAXBFRAMES, config->max_bframes, FALSE); set_dlgitem_float(hDlg, IDC_BQUANTRATIO, config->bquant_ratio); set_dlgitem_float(hDlg, IDC_BQUANTOFFSET, config->bquant_offset); CheckDlg(hDlg, IDC_PACKED, config->packed); - CheckDlg(hDlg, IDC_CLOSEDGOV, config->closed_gov); break; case IDD_AR: @@ -1135,44 +1202,75 @@ CheckDlgButton(hDlg, IDC_ZONE_GREYSCALE, config->zones[config->cur_zone].greyscale); CheckDlgButton(hDlg, IDC_ZONE_CHROMAOPT, config->zones[config->cur_zone].chroma_opt); + CheckDlg(hDlg, IDC_CARTOON, config->zones[config->cur_zone].cartoon_mode); + SetDlgItemInt(hDlg, IDC_ZONE_BVOPTHRESHOLD, config->zones[config->cur_zone].bvop_threshold, TRUE); break; case IDD_MOTION : - SendDlgItemMessage(hDlg, IDC_MOTION, CB_SETCURSEL, config->motion_search, 0); - SendDlgItemMessage(hDlg, IDC_VHQ, CB_SETCURSEL, config->vhq_mode, 0); - CheckDlg(hDlg, IDC_CHROMAME, config->chromame); - CheckDlg(hDlg, IDC_CARTOON, config->cartoon_mode); - CheckDlg(hDlg, IDC_TURBO, config->turbo); - SetDlgItemInt(hDlg, IDC_FRAMEDROP, config->frame_drop_ratio, FALSE); - SetDlgItemInt(hDlg, IDC_MAXKEY, config->max_key_interval, FALSE); + { + const int userdef = (config->quality==quality_table_num); + const quality_t* quality_preset = userdef ? &config->quality_user : &quality_table[config->quality]; + + SendDlgItemMessage(hDlg, IDC_MOTION, CB_SETCURSEL, quality_preset->motion_search, 0); + SendDlgItemMessage(hDlg, IDC_VHQ, CB_SETCURSEL, quality_preset->vhq_mode, 0); + CheckDlg(hDlg, IDC_VHQ_BFRAME, quality_preset->vhq_bframe); + CheckDlg(hDlg, IDC_CHROMAME, quality_preset->chromame); + CheckDlg(hDlg, IDC_TURBO, quality_preset->turbo); + SetDlgItemInt(hDlg, IDC_FRAMEDROP, quality_preset->frame_drop_ratio, FALSE); + SetDlgItemInt(hDlg, IDC_MAXKEY, quality_preset->max_key_interval, FALSE); + + EnableDlgWindow(hDlg, IDC_MOTION, userdef); + EnableDlgWindow(hDlg, IDC_VHQ, userdef); + EnableDlgWindow(hDlg, IDC_VHQ_BFRAME, userdef); + EnableDlgWindow(hDlg, IDC_CHROMAME, userdef); + EnableDlgWindow(hDlg, IDC_TURBO, userdef); + EnableDlgWindow(hDlg, IDC_FRAMEDROP, userdef); + EnableDlgWindow(hDlg, IDC_MAXKEY, userdef); break; + } case IDD_QUANT : - SetDlgItemInt(hDlg, IDC_MINIQUANT, config->min_iquant, FALSE); - SetDlgItemInt(hDlg, IDC_MAXIQUANT, config->max_iquant, FALSE); - SetDlgItemInt(hDlg, IDC_MINPQUANT, config->min_pquant, FALSE); - SetDlgItemInt(hDlg, IDC_MAXPQUANT, config->max_pquant, FALSE); - SetDlgItemInt(hDlg, IDC_MINBQUANT, config->min_bquant, FALSE); - SetDlgItemInt(hDlg, IDC_MAXBQUANT, config->max_bquant, FALSE); - CheckDlg(hDlg, IDC_TRELLISQUANT, config->trellis_quant); + { + const int userdef = (config->quality==quality_table_num); + const quality_t* quality_preset = userdef ? &config->quality_user : &quality_table[config->quality]; + + SetDlgItemInt(hDlg, IDC_MINIQUANT, quality_preset->min_iquant, FALSE); + SetDlgItemInt(hDlg, IDC_MAXIQUANT, quality_preset->max_iquant, FALSE); + SetDlgItemInt(hDlg, IDC_MINPQUANT, quality_preset->min_pquant, FALSE); + SetDlgItemInt(hDlg, IDC_MAXPQUANT, quality_preset->max_pquant, FALSE); + SetDlgItemInt(hDlg, IDC_MINBQUANT, quality_preset->min_bquant, FALSE); + SetDlgItemInt(hDlg, IDC_MAXBQUANT, quality_preset->max_bquant, FALSE); + CheckDlg(hDlg, IDC_TRELLISQUANT, quality_preset->trellis_quant); + + EnableDlgWindow(hDlg, IDC_MINIQUANT, userdef); + EnableDlgWindow(hDlg, IDC_MAXIQUANT, userdef); + EnableDlgWindow(hDlg, IDC_MINPQUANT, userdef); + EnableDlgWindow(hDlg, IDC_MAXPQUANT, userdef); + EnableDlgWindow(hDlg, IDC_MINBQUANT, userdef); + EnableDlgWindow(hDlg, IDC_MAXBQUANT, userdef); + EnableDlgWindow(hDlg, IDC_TRELLISQUANT, userdef); break; + } - case IDD_DEBUG : + case IDD_COMMON : CheckDlg(hDlg, IDC_CPU_MMX, (config->cpu & XVID_CPU_MMX)); CheckDlg(hDlg, IDC_CPU_MMXEXT, (config->cpu & XVID_CPU_MMXEXT)); CheckDlg(hDlg, IDC_CPU_SSE, (config->cpu & XVID_CPU_SSE)); CheckDlg(hDlg, IDC_CPU_SSE2, (config->cpu & XVID_CPU_SSE2)); - CheckDlg(hDlg, IDC_CPU_3DNOW, (config->cpu & XVID_CPU_3DNOW)); + CheckDlg(hDlg, IDC_CPU_SSE3, (config->cpu & XVID_CPU_SSE3)); + CheckDlg(hDlg, IDC_CPU_SSE4, (config->cpu & XVID_CPU_SSE41)); + CheckDlg(hDlg, IDC_CPU_3DNOW, (config->cpu & XVID_CPU_3DNOW)); CheckDlg(hDlg, IDC_CPU_3DNOWEXT, (config->cpu & XVID_CPU_3DNOWEXT)); CheckRadioButton(hDlg, IDC_CPU_AUTO, IDC_CPU_FORCE, config->cpu & XVID_CPU_FORCE ? IDC_CPU_FORCE : IDC_CPU_AUTO ); + set_dlgitem_hex(hDlg, IDC_DEBUG, config->debug); + break; + case IDD_ENC: SetDlgItemInt(hDlg, IDC_NUMTHREADS, config->num_threads, FALSE); - SendDlgItemMessage(hDlg, IDC_FOURCC, CB_SETCURSEL, config->fourcc_used, 0); - set_dlgitem_hex(hDlg, IDC_DEBUG, config->debug); CheckDlg(hDlg, IDC_VOPDEBUG, config->vop_debug); CheckDlg(hDlg, IDC_DISPLAY_STATUS, config->display_status); break; @@ -1206,14 +1304,12 @@ config->tff = IsDlgChecked(hDlg, IDC_TFF); config->qpel = IsDlgChecked(hDlg, IDC_QPEL); config->gmc = IsDlgChecked(hDlg, IDC_GMC); - config->reduced_resolution = IsDlgChecked(hDlg, IDC_REDUCED); config->use_bvop = IsDlgChecked(hDlg, IDC_BVOP); config->max_bframes = config_get_uint(hDlg, IDC_MAXBFRAMES, config->max_bframes); config->bquant_ratio = get_dlgitem_float(hDlg, IDC_BQUANTRATIO, config->bquant_ratio); config->bquant_offset = get_dlgitem_float(hDlg, IDC_BQUANTOFFSET, config->bquant_offset); config->packed = IsDlgChecked(hDlg, IDC_PACKED); - config->closed_gov = IsDlgChecked(hDlg, IDC_CLOSEDGOV); break; case IDD_AR: @@ -1318,52 +1414,60 @@ config->zones[config->cur_zone].chroma_opt = IsDlgButtonChecked(hDlg, IDC_ZONE_CHROMAOPT); config->zones[config->cur_zone].bvop_threshold = config_get_int(hDlg, IDC_ZONE_BVOPTHRESHOLD, config->zones[config->cur_zone].bvop_threshold); + config->zones[config->cur_zone].cartoon_mode = IsDlgChecked(hDlg, IDC_CARTOON); break; case IDD_MOTION : - config->motion_search = SendDlgItemMessage(hDlg, IDC_MOTION, CB_GETCURSEL, 0, 0); - config->vhq_mode = SendDlgItemMessage(hDlg, IDC_VHQ, CB_GETCURSEL, 0, 0); - config->chromame = IsDlgChecked(hDlg, IDC_CHROMAME); - config->cartoon_mode = IsDlgChecked(hDlg, IDC_CARTOON); - config->turbo = IsDlgChecked(hDlg, IDC_TURBO); + if (config->quality==quality_table_num) { + config->quality_user.motion_search = SendDlgItemMessage(hDlg, IDC_MOTION, CB_GETCURSEL, 0, 0); + config->quality_user.vhq_mode = SendDlgItemMessage(hDlg, IDC_VHQ, CB_GETCURSEL, 0, 0); + config->quality_user.vhq_bframe = IsDlgButtonChecked(hDlg, IDC_VHQ_BFRAME); + config->quality_user.chromame = IsDlgChecked(hDlg, IDC_CHROMAME); + config->quality_user.turbo = IsDlgChecked(hDlg, IDC_TURBO); - config->frame_drop_ratio = config_get_uint(hDlg, IDC_FRAMEDROP, config->frame_drop_ratio); + config->quality_user.frame_drop_ratio = config_get_uint(hDlg, IDC_FRAMEDROP, config->quality_user.frame_drop_ratio); - config->max_key_interval = config_get_uint(hDlg, IDC_MAXKEY, config->max_key_interval); + config->quality_user.max_key_interval = config_get_uint(hDlg, IDC_MAXKEY, config->quality_user.max_key_interval); + } break; case IDD_QUANT : - config->min_iquant = config_get_uint(hDlg, IDC_MINIQUANT, config->min_iquant); - config->max_iquant = config_get_uint(hDlg, IDC_MAXIQUANT, config->max_iquant); - config->min_pquant = config_get_uint(hDlg, IDC_MINPQUANT, config->min_pquant); - config->max_pquant = config_get_uint(hDlg, IDC_MAXPQUANT, config->max_pquant); - config->min_bquant = config_get_uint(hDlg, IDC_MINBQUANT, config->min_bquant); - config->max_bquant = config_get_uint(hDlg, IDC_MAXBQUANT, config->max_bquant); - - CONSTRAINVAL(config->min_iquant, 1, 31); - CONSTRAINVAL(config->max_iquant, config->min_iquant, 31); - CONSTRAINVAL(config->min_pquant, 1, 31); - CONSTRAINVAL(config->max_pquant, config->min_pquant, 31); - CONSTRAINVAL(config->min_bquant, 1, 31); - CONSTRAINVAL(config->max_bquant, config->min_bquant, 31); + if (config->quality==quality_table_num) { + config->quality_user.min_iquant = config_get_uint(hDlg, IDC_MINIQUANT, config->quality_user.min_iquant); + config->quality_user.max_iquant = config_get_uint(hDlg, IDC_MAXIQUANT, config->quality_user.max_iquant); + config->quality_user.min_pquant = config_get_uint(hDlg, IDC_MINPQUANT, config->quality_user.min_pquant); + config->quality_user.max_pquant = config_get_uint(hDlg, IDC_MAXPQUANT, config->quality_user.max_pquant); + config->quality_user.min_bquant = config_get_uint(hDlg, IDC_MINBQUANT, config->quality_user.min_bquant); + config->quality_user.max_bquant = config_get_uint(hDlg, IDC_MAXBQUANT, config->quality_user.max_bquant); + + CONSTRAINVAL(config->quality_user.min_iquant, 1, 31); + CONSTRAINVAL(config->quality_user.max_iquant, config->quality_user.min_iquant, 31); + CONSTRAINVAL(config->quality_user.min_pquant, 1, 31); + CONSTRAINVAL(config->quality_user.max_pquant, config->quality_user.min_pquant, 31); + CONSTRAINVAL(config->quality_user.min_bquant, 1, 31); + CONSTRAINVAL(config->quality_user.max_bquant, config->quality_user.min_bquant, 31); - config->trellis_quant = IsDlgChecked(hDlg, IDC_TRELLISQUANT); + config->quality_user.trellis_quant = IsDlgChecked(hDlg, IDC_TRELLISQUANT); + } break; - case IDD_DEBUG : + case IDD_COMMON : config->cpu = 0; config->cpu |= IsDlgChecked(hDlg, IDC_CPU_MMX) ? XVID_CPU_MMX : 0; config->cpu |= IsDlgChecked(hDlg, IDC_CPU_MMXEXT) ? XVID_CPU_MMXEXT : 0; config->cpu |= IsDlgChecked(hDlg, IDC_CPU_SSE) ? XVID_CPU_SSE : 0; config->cpu |= IsDlgChecked(hDlg, IDC_CPU_SSE2) ? XVID_CPU_SSE2 : 0; - config->cpu |= IsDlgChecked(hDlg, IDC_CPU_3DNOW) ? XVID_CPU_3DNOW : 0; + config->cpu |= IsDlgChecked(hDlg, IDC_CPU_SSE3) ? XVID_CPU_SSE3 : 0; + config->cpu |= IsDlgChecked(hDlg, IDC_CPU_SSE4) ? XVID_CPU_SSE41 : 0; + config->cpu |= IsDlgChecked(hDlg, IDC_CPU_3DNOW) ? XVID_CPU_3DNOW : 0; config->cpu |= IsDlgChecked(hDlg, IDC_CPU_3DNOWEXT) ? XVID_CPU_3DNOWEXT : 0; config->cpu |= IsDlgChecked(hDlg, IDC_CPU_FORCE) ? XVID_CPU_FORCE : 0; + config->debug = get_dlgitem_hex(hDlg, IDC_DEBUG, config->debug); + break; - config->num_threads = config_get_uint(hDlg, IDC_NUMTHREADS, config->num_threads); - + case IDD_ENC : + config->num_threads = min(4, config_get_uint(hDlg, IDC_NUMTHREADS, config->num_threads)); config->fourcc_used = SendDlgItemMessage(hDlg, IDC_FOURCC, CB_GETCURSEL, 0, 0); - config->debug = get_dlgitem_hex(hDlg, IDC_DEBUG, config->debug); config->vop_debug = IsDlgChecked(hDlg, IDC_VOPDEBUG); config->display_status = IsDlgChecked(hDlg, IDC_DISPLAY_STATUS); break; @@ -1387,13 +1491,13 @@ { PROPSHEETINFO *psi; - psi = (PROPSHEETINFO*)GetWindowLong(hDlg, GWL_USERDATA); + psi = (PROPSHEETINFO*)GetWindowLongPtr(hDlg, GWLP_USERDATA); switch (uMsg) { case WM_INITDIALOG : psi = (PROPSHEETINFO*) ((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLong(hDlg, GWL_USERDATA, (LPARAM)psi); + SetWindowLongPtr(hDlg, GWLP_USERDATA, (LPARAM)psi); if (g_hTooltip) EnumChildWindows(hDlg, enum_tooltips, 0); @@ -1407,6 +1511,7 @@ switch (LOWORD(wParam)) { case IDC_INTERLACING : + case IDC_VHQ_BFRAME : case IDC_BVOP : case IDC_ZONE_MODE_WEIGHT : case IDC_ZONE_MODE_QUANT : @@ -1580,19 +1685,19 @@ DPRINTF("PSN_SET"); adv_upload(hDlg, psi->idd, psi->config); adv_mode(hDlg, psi->idd, psi->config); - SetWindowLong(hDlg, DWL_MSGRESULT, FALSE); + SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE); break; case PSN_KILLACTIVE : DPRINTF("PSN_KILL"); adv_download(hDlg, psi->idd, psi->config); - SetWindowLong(hDlg, DWL_MSGRESULT, FALSE); + SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE); break; case PSN_APPLY : DPRINTF("PSN_APPLY"); psi->config->save = TRUE; - SetWindowLong(hDlg, DWL_MSGRESULT, FALSE); + SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE); break; } break; @@ -1646,7 +1751,7 @@ psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP; psh.hwndParent = hParent; psh.hInstance = g_hInst; - psh.pszCaption = (LPSTR) "XviD Configuration"; + psh.pszCaption = (LPSTR) "Xvid Configuration"; psh.nPages = size; psh.nStartPage = 0; psh.ppsp = (LPCPROPSHEETPAGE)&psp; @@ -1703,6 +1808,9 @@ strcat(tmp, "G "); if (s->chroma_opt) + strcat(tmp, "O "); + + if (s->cartoon_mode) strcat(tmp, "C "); ListView_SetItemText(hDlg, i, 2, tmp); @@ -1729,7 +1837,7 @@ wsprintf(buf, "%i kbps", DEFAULT_MIN_KBPS); SetDlgItemText(hDlg, IDC_BITRATE_MIN, buf); - max = profiles[profile].max_bitrate; + max = profiles[profile].max_bitrate / 1000; if (max == 0) max = DEFAULT_MAX_KBPS; wsprintf(buf, "%i kbps", max); SetDlgItemText(hDlg, IDC_BITRATE_MAX, buf); @@ -1765,6 +1873,7 @@ SendDlgItemMessage(hDlg, IDC_PROFILE, CB_SETCURSEL, config->profile, 0); SendDlgItemMessage(hDlg, IDC_MODE, CB_SETCURSEL, config->mode, 0); + SendDlgItemMessage(hDlg, IDC_QUALITY, CB_SETCURSEL, config->quality, 0); g_use_bitrate = config->use_2pass_bitrate; @@ -1785,6 +1894,7 @@ { config->profile = SendDlgItemMessage(hDlg, IDC_PROFILE, CB_GETCURSEL, 0, 0); config->mode = SendDlgItemMessage(hDlg, IDC_MODE, CB_GETCURSEL, 0, 0); + config->quality = SendDlgItemMessage(hDlg, IDC_QUALITY, CB_GETCURSEL, 0, 0); if (g_use_bitrate) { config->bitrate = config_get_uint(hDlg, IDC_BITRATE, config->bitrate); @@ -1804,19 +1914,19 @@ static const int pass2_dlgs[] = { IDD_RC_2PASS2 }; static const int bitrate_dlgs[] = { IDD_BITRATE }; static const int zone_dlgs[] = { IDD_ZONE }; -static const int decoder_dlgs[] = { IDD_DEC }; -static const int adv_dlgs[] = { IDD_MOTION, IDD_QUANT, IDD_DEBUG}; +static const int quality_dlgs[] = { IDD_MOTION, IDD_QUANT }; +static const int other_dlgs[] = { IDD_ENC, IDD_DEC, IDD_COMMON }; BOOL CALLBACK main_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - CONFIG* config = (CONFIG*)GetWindowLong(hDlg, GWL_USERDATA); + CONFIG* config = (CONFIG*)GetWindowLongPtr(hDlg, GWLP_USERDATA); unsigned int i; switch (uMsg) { case WM_INITDIALOG : - SetWindowLong(hDlg, GWL_USERDATA, lParam); + SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam); config = (CONFIG*)lParam; for (i=0; i= 0x0300) SendMessage(g_hTooltip, TTM_SETMAXTIPWIDTH, 0, 400); +#endif EnumChildWindows(hDlg, enum_tooltips, 0); } - SetClassLong(GetDlgItem(hDlg, IDC_BITRATE_S), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_HAND)); + SetClassLongPtr(GetDlgItem(hDlg, IDC_BITRATE_S), GCLP_HCURSOR, (LONG)LoadCursor(NULL, IDC_HAND)); { DWORD ext_style = ListView_GetExtendedListViewStyle(GetDlgItem(hDlg,IDC_ZONES)); - ext_style |= LVS_EX_FULLROWSELECT | LVS_EX_FLATSB ; +#if (_WIN32_IE >= 0x0300) + ext_style |= LVS_EX_FULLROWSELECT; +#endif +#if( _WIN32_IE >= 0x0400 ) + ext_style |= LVS_EX_FLATSB ; +#endif ListView_SetExtendedListViewStyle(GetDlgItem(hDlg,IDC_ZONES), ext_style); } @@ -1940,9 +2061,9 @@ main_upload(hDlg, config); break; - case IDC_DECODER : + case IDC_OTHER : main_download(hDlg, config); - adv_dialog(hDlg, config, decoder_dlgs, sizeof(decoder_dlgs)/sizeof(int)); + adv_dialog(hDlg, config, other_dlgs, sizeof(other_dlgs)/sizeof(int)); main_mode(hDlg, config); break; @@ -2016,9 +2137,23 @@ } break; - case IDC_ADVANCED : + case IDC_QUALITY_ADV : main_download(hDlg, config); - adv_dialog(hDlg, config, adv_dlgs, sizeof(adv_dlgs)/sizeof(int)); + + if (config->quality < quality_table_num) { + int result = MessageBox(hDlg, + "The built-in quality presets are read-only. Would you like to copy the values\n" + "of the selected preset into the \"" QUALITY_USER_STRING "\" preset for editing?", + "Question", MB_YESNOCANCEL|MB_DEFBUTTON2|MB_ICONQUESTION); + + if (result==0 || result==IDCANCEL) break; + if (result==IDYES) { + memcpy(&config->quality_user, &quality_table[config->quality], sizeof(quality_t)); + config->quality = quality_table_num; + } + } + adv_dialog(hDlg, config, quality_dlgs, sizeof(quality_dlgs)/sizeof(int)); + SendDlgItemMessage(hDlg, IDC_QUALITY, CB_SETCURSEL, config->quality, 0); break; case IDC_DEFAULTS : @@ -2092,6 +2227,61 @@ } +/* ===================================================================================== */ +/* LICENSE DIALOG ====================================================================== */ +/* ===================================================================================== */ + +static BOOL CALLBACK license_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG : + { + HRSRC hRSRC; + HGLOBAL hGlobal = NULL; + if ((hRSRC = FindResource(g_hInst, MAKEINTRESOURCE(IDR_GPL), "TEXT"))) { + if ((hGlobal = LoadResource(g_hInst, hRSRC))) { + LPVOID lpData; + if ((lpData = LockResource(hGlobal))) { + SendDlgItemMessage(hDlg, IDC_LICENSE_TEXT, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), MAKELPARAM(TRUE, 0)); + SetDlgItemText(hDlg, IDC_LICENSE_TEXT, lpData); + SendDlgItemMessage(hDlg, IDC_LICENSE_TEXT, EM_SETSEL, (WPARAM)-1, (LPARAM)0); + } + } + } + SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG)hGlobal); + } + break; + + case WM_DESTROY : + { + HGLOBAL hGlobal = (HGLOBAL)GetWindowLongPtr(hDlg, GWLP_USERDATA); + if (hGlobal) { + FreeResource(hGlobal); + } + } + break; + + case WM_COMMAND : + if (HIWORD(wParam) == BN_CLICKED) { + switch(LOWORD(wParam)) { + case IDOK : + case IDCANCEL : + EndDialog(hDlg, 0); + break; + default : + return 0; + } + break; + } + break; + + default : + return 0; + } + + return 1; +} /* ===================================================================================== */ /* ABOUT DIALOG ======================================================================== */ @@ -2110,7 +2300,12 @@ HINSTANCE m_hdll; SetDlgItemText(hDlg, IDC_BUILD, XVID_BUILD); - SetDlgItemText(hDlg, IDC_SPECIAL_BUILD, XVID_SPECIAL_BUILD); +#ifdef _WIN64 + wsprintf(core, "(%s, 64-bit Edition)", XVID_SPECIAL_BUILD); +#else + wsprintf(core, "(%s)", XVID_SPECIAL_BUILD); +#endif + SetDlgItemText(hDlg, IDC_SPECIAL_BUILD, core); memset(&info, 0, sizeof(info)); info.version = XVID_VERSION; @@ -2145,7 +2340,7 @@ } } - SetClassLong(GetDlgItem(hDlg, IDC_WEBSITE), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_HAND)); + SetClassLongPtr(GetDlgItem(hDlg, IDC_WEBSITE), GCLP_HCURSOR, (LONG)LoadCursor(NULL, IDC_HAND)); SetDlgItemText(hDlg, IDC_WEBSITE, XVID_WEBSITE); } break; @@ -2159,12 +2354,11 @@ return 0; case WM_COMMAND : - if (LOWORD(wParam) == IDC_WEBSITE && HIWORD(wParam) == STN_CLICKED) - { + if (LOWORD(wParam) == IDC_WEBSITE && HIWORD(wParam) == STN_CLICKED) { ShellExecute(hDlg, "open", XVID_WEBSITE, NULL, NULL, SW_SHOWNORMAL); - } - else if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) - { + }else if (LOWORD(wParam) == IDC_LICENSE) { + DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_LICENSE), hDlg, license_proc, (LPARAM)0); + } else if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); } break;