📄 config.c
字号:
for (i=0; i<sizeof(video_fps_list)/sizeof(named_float_t); i++) SendDlgItemMessage(hDlg, IDC_BITRATE_FPS, CB_ADDSTRING, 0, (LPARAM)video_fps_list[i].name); for (i=0; i<sizeof(audio_type_list)/sizeof(named_int_t); i++) SendDlgItemMessage(hDlg, IDC_BITRATE_AFORMAT, CB_ADDSTRING, 0, (LPARAM)audio_type_list[i].name); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"32"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"56"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"64"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"96"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"112"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"128"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"160"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"192"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"224"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"256"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"384"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"448"); SendDlgItemMessage(hDlg, IDC_BITRATE_ARATE, CB_ADDSTRING, 0, (LPARAM)"512"); break; case IDD_ZONE : EnableDlgWindow(hDlg, IDC_ZONE_FETCH, config->ci_valid); break; case IDD_MOTION : 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_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"); break; case IDD_DEBUG : /* force threads disabled */ EnableWindow(GetDlgItem(hDlg, IDC_NUMTHREADS_STATIC), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_NUMTHREADS), FALSE); 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"); break; }}/* enable/disable controls based on encoder-mode or user selection */static void adv_mode(HWND hDlg, int idd, CONFIG * config){ int profile; int weight_en, quant_en; int cpu_force; int custom_quant, bvops; int ar_mode, ar_par; switch(idd) { case IDD_PROFILE : profile = SendDlgItemMessage(hDlg, IDC_PROFILE_PROFILE, CB_GETCURSEL, 0, 0); EnableDlgWindow(hDlg, IDC_BVOP, profiles[profile].flags&PROFILE_BVOP); EnableDlgWindow(hDlg, IDC_QUANTTYPE_S, profiles[profile].flags&PROFILE_MPEGQUANT); EnableDlgWindow(hDlg, IDC_QUANTTYPE_S, profiles[profile].flags&PROFILE_MPEGQUANT); EnableDlgWindow(hDlg, IDC_QUANTTYPE, profiles[profile].flags&PROFILE_MPEGQUANT); custom_quant = (profiles[profile].flags&PROFILE_MPEGQUANT) && SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_GETCURSEL, 0, 0)==QUANT_MODE_CUSTOM; EnableDlgWindow(hDlg, IDC_QUANTMATRIX, custom_quant); EnableDlgWindow(hDlg, IDC_LUMMASK, profiles[profile].flags&PROFILE_ADAPTQUANT); EnableDlgWindow(hDlg, IDC_INTERLACING, profiles[profile].flags&PROFILE_INTERLACE); EnableDlgWindow(hDlg, IDC_QPEL, profiles[profile].flags&PROFILE_QPEL); EnableDlgWindow(hDlg, IDC_GMC, profiles[profile].flags&PROFILE_GMC); EnableDlgWindow(hDlg, IDC_REDUCED, profiles[profile].flags&PROFILE_REDUCED); bvops = (profiles[profile].flags&PROFILE_BVOP) && IsDlgChecked(hDlg, IDC_BVOP); EnableDlgWindow(hDlg, IDC_MAXBFRAMES, bvops); EnableDlgWindow(hDlg, IDC_BQUANTRATIO, bvops); EnableDlgWindow(hDlg, IDC_BQUANTOFFSET, bvops); EnableDlgWindow(hDlg, IDC_MAXBFRAMES_S, bvops); EnableDlgWindow(hDlg, IDC_BQUANTRATIO_S, bvops); EnableDlgWindow(hDlg, IDC_BQUANTOFFSET_S, bvops); EnableDlgWindow(hDlg, IDC_PACKED, bvops); EnableDlgWindow(hDlg, IDC_CLOSEDGOV, bvops); break; case IDD_AR: ar_mode = IsDlgChecked(hDlg, IDC_PAR); EnableDlgWindow(hDlg, IDC_ASPECT_RATIO, ar_mode); ar_par = SendDlgItemMessage(hDlg, IDC_ASPECT_RATIO, CB_GETCURSEL, 0, 0); if (ar_par == 5) { /* custom par */ SetDlgItemInt(hDlg, IDC_PARY, config->par_y, FALSE); SetDlgItemInt(hDlg, IDC_PARX, config->par_x, FALSE); EnableDlgWindow(hDlg, IDC_PARX, ar_mode); EnableDlgWindow(hDlg, IDC_PARY, ar_mode); } else { SetDlgItemInt(hDlg, IDC_PARX, PARS[ar_par][0], FALSE); SetDlgItemInt(hDlg, IDC_PARY, PARS[ar_par][1], FALSE); EnableDlgWindow(hDlg, IDC_PARX, FALSE); EnableDlgWindow(hDlg, IDC_PARY, FALSE); } ar_mode = IsDlgChecked(hDlg, IDC_AR); config->ar_x = config_get_uint(hDlg, IDC_ARX, config->ar_x); config->ar_y = config_get_uint(hDlg, IDC_ARY, config->ar_y); EnableDlgWindow(hDlg, IDC_ARX, ar_mode); EnableDlgWindow(hDlg, IDC_ARY, ar_mode); break; case IDD_LEVEL : profile = SendDlgItemMessage(hDlg, IDC_LEVEL_PROFILE, CB_GETCURSEL, 0, 0); SetDlgItemInt(hDlg, IDC_LEVEL_WIDTH, profiles[profile].width, FALSE); SetDlgItemInt(hDlg, IDC_LEVEL_HEIGHT, profiles[profile].height, FALSE); SetDlgItemInt(hDlg, IDC_LEVEL_FPS, profiles[profile].fps, FALSE); SetDlgItemInt(hDlg, IDC_LEVEL_VMV, profiles[profile].max_vmv_buffer_sz, FALSE); SetDlgItemInt(hDlg, IDC_LEVEL_VCV, profiles[profile].vcv_decoder_rate, FALSE); SetDlgItemInt(hDlg, IDC_LEVEL_VBV, profiles[profile].max_vbv_size, FALSE); SetDlgItemInt(hDlg, IDC_LEVEL_BITRATE, profiles[profile].max_bitrate, FALSE); break; case IDD_BITRATE : { int ctype = SendDlgItemMessage(hDlg, IDC_BITRATE_CFORMAT, CB_GETCURSEL, 0, 0); int target_size = config_get_cbuint(hDlg, IDC_BITRATE_TSIZE, 0); int subtitle_size = config_get_uint(hDlg, IDC_BITRATE_SSIZE, 0); int fps = SendDlgItemMessage(hDlg, IDC_BITRATE_FPS, CB_GETCURSEL, 0, 0); int duration = 3600 * config_get_uint(hDlg, IDC_BITRATE_HOURS, 0) + 60 * config_get_uint(hDlg, IDC_BITRATE_MINUTES, 0) + config_get_uint(hDlg, IDC_BITRATE_SECONDS, 0); int audio_type = SendDlgItemMessage(hDlg, IDC_BITRATE_AFORMAT, CB_GETCURSEL, 0, 0); int audio_mode = IsDlgChecked(hDlg, IDC_BITRATE_AMODE_SIZE); int audio_rate = config_get_cbuint(hDlg, IDC_BITRATE_ARATE, 0); int audio_size = config_get_uint(hDlg, IDC_BITRATE_ASIZE, 0); int frames; int overhead; int vsize; if (duration == 0) break; if (fps < 0 || fps >= sizeof(video_fps_list)/sizeof(named_float_t)) { fps = 0; } if (audio_type < 0 || audio_type >= sizeof(audio_type_list)/sizeof(named_int_t)) { audio_type = 0; } EnableDlgWindow(hDlg, IDC_BITRATE_AMODE_RATE, audio_type!=NO_AUDIO); EnableDlgWindow(hDlg, IDC_BITRATE_AMODE_SIZE, audio_type!=NO_AUDIO); EnableDlgWindow(hDlg, IDC_BITRATE_ARATE, audio_type!=NO_AUDIO && !audio_mode); EnableDlgWindow(hDlg, IDC_BITRATE_ASIZE, audio_type!=NO_AUDIO && audio_mode); EnableDlgWindow(hDlg, IDC_BITRATE_ASELECT, audio_type!=NO_AUDIO && audio_mode); /* step 1: calculate number of frames */ frames = (int)(duration * video_fps_list[fps].value); /* step 2: calculate audio_size (kbytes)*/ if (audio_type!=NO_AUDIO) { if (audio_mode==0) { audio_size = (1000 * duration * audio_rate) / (8*1024); } }else{ audio_size = 0; } /* step 3: calculate container overhead */ switch(ctype) { case 0 : /* AVI */ case 1 : /* AVI-OpenDML */ overhead = frames; if (audio_type!=NO_AUDIO) { overhead += (duration * 1000) / audio_type_list[audio_type].avi_interval; } overhead *= (ctype==0) ? 24 : 16; overhead /= 1024; break; case 2 : /* Matroska: gknot formula */ /* common overhead */ overhead = 40 + 12 + 8+ 16*duration + 200 + 100*1/*one audio stream*/ + 11*duration; /* video overhead */ overhead += frames*8 + (int)(frames * 4 * 0.94); /* cue tables and menu seek entries (300k default) */ overhead += 300 * 1024; /* audio */ overhead += (int)(duration * audio_type_list[audio_type].mkv_multiplier); overhead /= 1024; break; case 3 : /* OGM: inaccurate model */ overhead = (int)(0.0039F * (target_size - subtitle_size)); break; default : /* (none) */ overhead = 0; break; } SetDlgItemInt(hDlg, IDC_BITRATE_COVERHEAD, overhead, TRUE); /* final video bitstream size */ vsize = target_size - subtitle_size - audio_size - overhead; if (vsize > 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); }else{ SetDlgItemText(hDlg, IDC_BITRATE_VSIZE, "Overflow"); SetDlgItemText(hDlg, IDC_BITRATE_VRATE, "Overflow"); } } break; case IDD_ZONE : weight_en = IsDlgChecked(hDlg, IDC_ZONE_MODE_WEIGHT); quant_en = IsDlgChecked(hDlg, IDC_ZONE_MODE_QUANT); EnableDlgWindow(hDlg, IDC_ZONE_WEIGHT, weight_en); EnableDlgWindow(hDlg, IDC_ZONE_QUANT, quant_en); EnableDlgWindow(hDlg, IDC_ZONE_SLIDER, weight_en|quant_en); if (weight_en) { SendDlgItemMessage(hDlg, IDC_ZONE_SLIDER, TBM_SETRANGE, TRUE, MAKELONG(001,200)); SendDlgItemMessage(hDlg, IDC_ZONE_SLIDER, TBM_SETPOS, TRUE, get_dlgitem_float(hDlg, IDC_ZONE_WEIGHT, 100)); SetDlgItemText(hDlg, IDC_ZONE_MIN, "0.01"); SetDlgItemText(hDlg, IDC_ZONE_MAX, "2.00"); }else if (quant_en) { SendDlgItemMessage(hDlg, IDC_ZONE_SLIDER, TBM_SETRANGE, TRUE, MAKELONG(100,3100)); SendDlgItemMessage(hDlg, IDC_ZONE_SLIDER, TBM_SETPOS, TRUE, get_dlgitem_float(hDlg, IDC_ZONE_QUANT, 100)); SetDlgItemText(hDlg, IDC_ZONE_MIN, "1"); SetDlgItemText(hDlg, IDC_ZONE_MAX, "31"); } bvops = (profiles[config->profile].flags&PROFILE_BVOP) && config->use_bvop; EnableDlgWindow(hDlg, IDC_ZONE_BVOPTHRESHOLD_S, bvops); EnableDlgWindow(hDlg, IDC_ZONE_BVOPTHRESHOLD, bvops); break; case IDD_DEBUG : 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_3DNOWEXT, cpu_force); break; }}/* upload config data into dialog */static void adv_upload(HWND hDlg, int idd, CONFIG * config){ switch (idd) { case IDD_PROFILE : SendDlgItemMessage(hDlg, IDC_PROFILE_PROFILE, CB_SETCURSEL, config->profile, 0); SendDlgItemMessage(hDlg, IDC_QUANTTYPE, CB_SETCURSEL, config->quant_type, 0); CheckDlg(hDlg, IDC_LUMMASK, config->lum_masking); CheckDlg(hDlg, IDC_INTERLACING, config->interlacing); 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: CheckRadioButton(hDlg, IDC_AR, IDC_PAR, config->ar_mode == 0 ? IDC_PAR : IDC_AR); SendDlgItemMessage(hDlg, IDC_ASPECT_RATIO, CB_SETCURSEL, (config->display_aspect_ratio), 0); SetDlgItemInt(hDlg, IDC_ARX, config->ar_x, FALSE); SetDlgItemInt(hDlg, IDC_ARY, config->ar_y, FALSE); break; case IDD_LEVEL : SendDlgItemMessage(hDlg, IDC_LEVEL_PROFILE, CB_SETCURSEL, config->profile, 0); break; case IDD_RC_CBR : SetDlgItemInt(hDlg, IDC_CBR_REACTIONDELAY, config->rc_reaction_delay_factor, FALSE); SetDlgItemInt(hDlg, IDC_CBR_AVERAGINGPERIOD, config->rc_averaging_period, FALSE); SetDlgItemInt(hDlg, IDC_CBR_BUFFER, config->rc_buffer, FALSE); break; case IDD_RC_2PASS1 : SetDlgItemText(hDlg, IDC_STATS, config->stats); CheckDlg(hDlg, IDC_DISCARD1PASS, config->discard1pass); CheckDlg(hDlg, IDC_FULL1PASS, config->full1pass); break; case IDD_RC_2PASS2 : SetDlgItemText(hDlg, IDC_STATS, config->stats); SetDlgItemInt(hDlg, IDC_KFBOOST, config->keyframe_boost, FALSE); SetDlgItemInt(hDlg, IDC_KFREDUCTION, config->kfreduction, FALSE); SetDlgItemInt(hDlg, IDC_OVERFLOW_CONTROL_STRENGTH, config->overflow_control_strength, FALSE); SetDlgItemInt(hDlg, IDC_OVERIMP, config->twopass_max_overflow_improvement, FALSE); SetDlgItemInt(hDlg, IDC_OVERDEG, config->twopass_max_overflow_degradation, FALSE); SetDlgItemInt(hDlg, IDC_CURVECOMPH, config->curve_compression_high, FALSE); SetDlgItemInt(hDlg, IDC_CURVECOMPL, config->curve_compression_low, FALSE); SetDlgItemInt(hDlg, IDC_MINKEY, config->kfthreshold, FALSE); break; case IDD_BITRATE : SendDlgItemMessage(hDlg, IDC_BITRATE_CFORMAT, CB_SETCURSEL, config->container_type, 0); SetDlgItemInt(hDlg, IDC_BITRATE_TSIZE, config->target_size, FALSE); SetDlgItemInt(hDlg, IDC_BITRATE_SSIZE, config->subtitle_size, FALSE); SetDlgItemInt(hDlg, IDC_BITRATE_HOURS, config->hours, FALSE); SetDlgItemInt(hDlg, IDC_BITRATE_MINUTES, config->minutes, FALSE); SetDlgItemInt(hDlg, IDC_BITRATE_SECONDS, config->seconds, FALSE); SendDlgItemMessage(hDlg, IDC_BITRATE_FPS, CB_SETCURSEL, config->fps, 0); SendDlgItemMessage(hDlg, IDC_BITRATE_AFORMAT, CB_SETCURSEL, config->audio_type, 0); CheckRadioButton(hDlg, IDC_BITRATE_AMODE_RATE, IDC_BITRATE_AMODE_SIZE, config->audio_mode == 0 ? IDC_BITRATE_AMODE_RATE : IDC_BITRATE_AMODE_SIZE); SetDlgItemInt(hDlg, IDC_BITRATE_ARATE, config->audio_rate, FALSE); SetDlgItemInt(hDlg, IDC_BITRATE_ASIZE, config->audio_size, FALSE); break; case IDD_ZONE : SetDlgItemInt(hDlg, IDC_ZONE_FRAME, config->zones[config->cur_zone].frame, FALSE); CheckDlgButton(hDlg, IDC_ZONE_MODE_WEIGHT, config->zones[config->cur_zone].mode == RC_ZONE_WEIGHT); CheckDlgButton(hDlg, IDC_ZONE_MODE_QUANT, config->zones[config->cur_zone].mode == RC_ZONE_QUANT); set_dlgitem_float(hDlg, IDC_ZONE_WEIGHT, config->zones[config->cur_zone].weight); set_dlgitem_float(hDlg, IDC_ZONE_QUANT, config->zones[config->cur_zone].quant); CheckDlgButton(hDlg, IDC_ZONE_FORCEIVOP, config->zones[config->cur_zone].type==XVID_TYPE_IVOP); CheckDlgButton(hDlg, IDC_ZONE_GREYSCALE, config->zones[config->cur_zone].greyscale); CheckDlgButton(hDlg, IDC_ZONE_CHROMAOPT, config->zones[config->cur_zone].chroma_opt); 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); break; case IDD_QUANT : SetDlgItemInt(hDlg, IDC_MINIQUANT, config->min_iquant, FALSE); SetDlgItemInt(hDlg, IDC_MAXIQUANT, config->max_iquant, FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -