1
0
mirror of https://github.com/marqs85/ossc.git synced 2024-06-16 23:29:30 +00:00

make sampling phase mode-specific

This commit is contained in:
marqs 2019-05-08 00:05:16 +03:00
parent 9e81fb5922
commit 125814225f
10 changed files with 6728 additions and 6677 deletions

View File

@ -224,7 +224,7 @@ set_global_assignment -name ENABLE_SIGNALTAP OFF
set_global_assignment -name USE_SIGNALTAP_FILE output_files/ossc_la.stp
set_global_assignment -name FITTER_EFFORT "AUTO FIT"
set_global_assignment -name SEED 12
set_global_assignment -name SEED 10

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -63,15 +63,15 @@ extern alt_u32 remote_code;
extern alt_u32 btn_code, btn_code_prev;
extern alt_u8 remote_rpt, remote_rpt_prev;
extern avconfig_t tc, tc_default;
extern alt_u8 vm_sel;
alt_u8 target_typemask;
alt_u8 target_type;
alt_u8 stable_frames;
alt_u8 update_cur_vm;
alt_u8 vm_sel, vm_edit, profile_sel, profile_sel_menu, input_profiles[AV_LAST], lt_sel, def_input, profile_link, lcd_bl_timeout;
alt_u8 profile_sel, profile_sel_menu, input_profiles[AV_LAST], lt_sel, def_input, profile_link, lcd_bl_timeout;
alt_u8 auto_input, auto_av1_ypbpr, auto_av2_ypbpr = 1, auto_av3_ypbpr;
alt_u16 tc_h_samplerate, tc_h_synclen, tc_h_bporch, tc_h_active, tc_v_synclen, tc_v_bporch, tc_v_active;
char row1[LCD_ROW_LEN+1], row2[LCD_ROW_LEN+1], menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1];
@ -292,6 +292,7 @@ status_t get_status(tvp_input_t input, video_format format)
if (update_cur_vm) {
tvp_setup_hpll(cm.sample_mult*video_modes[cm.id].h_total, clkcnt, cm.cc.tvp_hpll2x && (video_modes[cm.id].flags & MODE_PLLDIVBY2));
cm.sample_sel = tvp_set_hpll_phase(video_modes[cm.id].sampler_phase, cm.sample_mult);
status = (status < SC_CONFIG_CHANGE) ? SC_CONFIG_CHANGE : status;
}
@ -317,11 +318,6 @@ status_t get_status(tvp_input_t input, video_format format)
(tc.reverse_lpf != cm.cc.reverse_lpf))
status = (status < SC_CONFIG_CHANGE) ? SC_CONFIG_CHANGE : status;
if (tc.sampler_phase != cm.cc.sampler_phase) {
cm.sample_sel = tvp_set_hpll_phase(tc.sampler_phase, cm.sample_mult);
status = (status < SC_CONFIG_CHANGE) ? SC_CONFIG_CHANGE : status;
}
if (tc.sync_vth != cm.cc.sync_vth)
tvp_set_sog_thold(tc.sync_vth);
@ -588,7 +584,7 @@ void program_mode()
cm.cc.tvp_hpll2x && (video_modes[cm.id].flags & MODE_PLLDIVBY2),
(alt_u8)h_synclen_px);
set_lpf(cm.cc.video_lpf);
cm.sample_sel = tvp_set_hpll_phase(cm.cc.sampler_phase, cm.sample_mult);
cm.sample_sel = tvp_set_hpll_phase(video_modes[cm.id].sampler_phase, cm.sample_mult);
update_sc_config();
@ -656,39 +652,6 @@ int save_profile() {
return retval;
}
void vm_select() {
vm_edit = vm_sel;
tc_h_samplerate = video_modes[vm_edit].h_total;
tc_h_synclen = (alt_u16)video_modes[vm_edit].h_synclen;
tc_h_bporch = (alt_u16)video_modes[vm_edit].h_backporch;
tc_h_active = video_modes[vm_edit].h_active;
tc_v_synclen = (alt_u16)video_modes[vm_edit].v_synclen;
tc_v_bporch = (alt_u16)video_modes[vm_edit].v_backporch;
tc_v_active = video_modes[vm_edit].v_active;
}
void vm_tweak(alt_u16 v) {
if (cm.sync_active && (cm.id == vm_edit)) {
if ((video_modes[cm.id].h_total != tc_h_samplerate) ||
(video_modes[cm.id].h_synclen != tc_h_synclen) ||
(video_modes[cm.id].h_backporch != (alt_u8)tc_h_bporch) ||
(video_modes[cm.id].h_active != tc_h_active) ||
(video_modes[cm.id].v_synclen != tc_v_synclen) ||
(video_modes[cm.id].v_backporch != (alt_u8)tc_v_bporch) ||
(video_modes[cm.id].v_active != tc_v_active))
update_cur_vm = 1;
}
video_modes[vm_edit].h_total = tc_h_samplerate;
video_modes[vm_edit].h_synclen = (alt_u8)tc_h_synclen;
video_modes[vm_edit].h_backporch = (alt_u8)tc_h_bporch;
video_modes[vm_edit].h_active = tc_h_active;
video_modes[vm_edit].v_synclen = (alt_u8)tc_v_synclen;
video_modes[vm_edit].v_backporch = (alt_u8)tc_v_bporch;
video_modes[vm_edit].v_active = tc_v_active;
sniprintf(menu_row2, LCD_ROW_LEN+1, "%u", v);
}
// Initialize hardware
int init_hw()
{

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -103,8 +103,6 @@ typedef struct {
inline void lcd_write_menu();
inline void lcd_write_status();
void vm_select();
void vm_tweak(alt_u16 v);
int load_profile();
int save_profile();

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -40,7 +40,6 @@ const avconfig_t tc_default = {
.pm_480i = 1,
.pm_1080i = 1,
.tvp_hpll2x = DEFAULT_ON,
.sampler_phase = DEFAULT_SAMPLER_PHASE,
.sync_vth = DEFAULT_SYNC_VTH,
.linelen_tol = DEFAULT_LINELEN_TOL,
.vsync_thold = DEFAULT_VSYNC_THOLD,

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -95,7 +95,6 @@ typedef struct {
alt_u8 tx_mode;
alt_u8 hdmi_itc;
alt_u8 s480p_mode;
alt_u8 sampler_phase;
alt_u8 tvp_hpll2x;
alt_u8 upsample2x;
alt_u8 ypbpr_cs;

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -37,7 +37,7 @@ const alt_u16 rc_keymap_default[REMOTE_MAX_KEYS] = {0x3E29, 0x3EA9, 0x3E69, 0x3E
alt_u16 rc_keymap[REMOTE_MAX_KEYS];
extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1];
extern const mode_data_t video_modes[];
extern mode_data_t video_modes[];
extern avmode_t cm;
extern avconfig_t tc;
extern avinput_t target_input;
@ -45,6 +45,7 @@ extern alt_u8 menu_active;
extern alt_u16 sys_ctrl;
extern alt_u8 profile_sel, profile_sel_menu;
extern alt_u8 lcd_bl_timeout;
extern alt_u8 update_cur_vm;
extern volatile sc_regs *sc;
alt_u32 remote_code;
@ -215,8 +216,8 @@ int parse_control()
lcd_write_status();
menu_active = 0;
break;
case RC_PHASE_PLUS: tc.sampler_phase = (tc.sampler_phase < SAMPLER_PHASE_MAX) ? (tc.sampler_phase + 1) : 0; break;
case RC_PHASE_MINUS: tc.sampler_phase = tc.sampler_phase ? (tc.sampler_phase - 1) : SAMPLER_PHASE_MAX; break;
case RC_PHASE_PLUS: video_modes[cm.id].sampler_phase = (video_modes[cm.id].sampler_phase < SAMPLER_PHASE_MAX) ? (video_modes[cm.id].sampler_phase + 1) : 0; update_cur_vm = 1; break;
case RC_PHASE_MINUS: video_modes[cm.id].sampler_phase = video_modes[cm.id].sampler_phase ? (video_modes[cm.id].sampler_phase - 1) : SAMPLER_PHASE_MAX; update_cur_vm = 1; break;
case RC_PROF_HOTKEY:
strncpy(menu_row1, "Profile load:", LCD_ROW_LEN+1);
strncpy(menu_row2, "press 0-9", LCD_ROW_LEN+1);

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -36,16 +36,20 @@
#endif
extern char row1[LCD_ROW_LEN+1], row2[LCD_ROW_LEN+1], menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1];
extern avmode_t cm;
extern avconfig_t tc;
extern mode_data_t video_modes[];
extern alt_u16 tc_h_samplerate, tc_h_synclen, tc_h_bporch, tc_h_active, tc_v_synclen, tc_v_bporch, tc_v_active;
extern alt_u32 remote_code;
extern alt_u16 rc_keymap[REMOTE_MAX_KEYS];
extern alt_u8 vm_sel, profile_sel_menu, lt_sel, def_input, profile_link, lcd_bl_timeout;
extern alt_u8 auto_input, auto_av1_ypbpr, auto_av2_ypbpr, auto_av3_ypbpr;
extern alt_u8 update_cur_vm;
extern char target_profile_name[PROFILE_NAME_LEN+1];
alt_u16 tc_h_samplerate, tc_h_synclen, tc_h_bporch, tc_h_active, tc_v_synclen, tc_v_bporch, tc_v_active;
alt_u8 tc_sampler_phase;
alt_u8 menu_active;
alt_u8 vm_sel, vm_edit;
static const char *off_on_desc[] = { LNG("Off","オフ"), LNG("On","オン") };
static const char *video_lpf_desc[] = { LNG("Auto","オート"), LNG("Off","オフ"), "95MHz (HDTV II)", "35MHz (HDTV I)", "16MHz (EDTV)", "9MHz (SDTV)" };
@ -72,7 +76,6 @@ static const char *lcd_bl_timeout_desc[] = { "Off", "3s", "10s", "30s" };
static const char *rgsb_ypbpr_desc[] = { "RGsB", "YPbPr" };
static const char *auto_input_desc[] = { "Off", "Current input", "All inputs" };
static void sampler_phase_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, LNG("%d deg","%d ド"), (v*1125)/100); }
static void sync_vth_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%d mV", (v*1127)/100); }
static void intclks_to_time_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2u us", (unsigned)(((1000000U*v)/(TVP_INTCLK_HZ/1000))/1000), (unsigned)((((1000000U*v)/(TVP_INTCLK_HZ/1000))%1000)/10)); }
static void extclks_to_time_disp(alt_u8 v) { sniprintf(menu_row2, LCD_ROW_LEN+1, "%u.%.2u us", (unsigned)(((1000000U*v)/(TVP_EXTCLK_HZ/1000))/1000), (unsigned)((((1000000U*v)/(TVP_EXTCLK_HZ/1000))%1000)/10)); }
@ -102,20 +105,21 @@ MENU(menu_advtiming, P99_PROTECT({ \
{ LNG("V. synclen","V. ドウキナガサ"), OPT_AVCONFIG_NUMVAL_U16,{ .num_u16 = { &tc_v_synclen, V_SYNCLEN_MIN, V_SYNCLEN_MAX, vm_tweak } } },
{ LNG("V. backporch","V. バックポーチ"), OPT_AVCONFIG_NUMVAL_U16,{ .num_u16 = { &tc_v_bporch, V_BPORCH_MIN, V_BPORCH_MAX, vm_tweak } } },
{ LNG("V. active","V. アクティブ"), OPT_AVCONFIG_NUMVAL_U16,{ .num_u16 = { &tc_v_active, V_ACTIVE_MIN, V_ACTIVE_MAX, vm_tweak } } },
{ LNG("Sampling phase","サンプリングフェーズ"), OPT_AVCONFIG_NUMVALUE, { .num = { &tc_sampler_phase, OPT_WRAP, 0, SAMPLER_PHASE_MAX, sampler_phase_tweak } } },
}))
MENU(menu_cust_sl, P99_PROTECT({ \
{ "Sub-line 0 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[0], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 1 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[1], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 2 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[2], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 3 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[3], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 4 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[4], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 0 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[0], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 1 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[1], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 2 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[2], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 3 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[3], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 4 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[4], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 5 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[5], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 1 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[0], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 2 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[1], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 3 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[2], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 4 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[3], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-line 5 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_l_str[4], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 1 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[0], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 2 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[1], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 3 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[2], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 4 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[3], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 5 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[4], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
{ "Sub-column 6 str", OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sl_cust_c_str[5], OPT_NOWRAP, 0, SCANLINESTR_MAX+1, sl_cust_str_disp } } },
}))
@ -132,7 +136,6 @@ MENU(menu_vinputproc, P99_PROTECT({ \
}))
MENU(menu_sampling, P99_PROTECT({ \
{ LNG("Sampling phase","サンプリングフェーズ"), OPT_AVCONFIG_NUMVALUE, { .num = { &tc.sampler_phase, OPT_WRAP, 0, SAMPLER_PHASE_MAX, sampler_phase_disp } } },
{ LNG("480p in sampler","サンプラーデ480p"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.s480p_mode, OPT_WRAP, SETTING_ITEM(s480p_mode_desc) } } },
{ LNG("Allow TVP HPLL2x","TVP HPLL2xキョヨウ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.tvp_hpll2x, OPT_WRAP, SETTING_ITEM(off_on_desc) } } },
{ LNG("Allow upsample2x","アップサンプル2xキョヨウ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.upsample2x, OPT_WRAP, SETTING_ITEM(off_on_desc) } } },
@ -378,3 +381,45 @@ void display_menu(alt_u8 forcedisp)
lcd_write_menu();
}
static void vm_select() {
vm_edit = vm_sel;
tc_h_samplerate = video_modes[vm_edit].h_total;
tc_h_synclen = (alt_u16)video_modes[vm_edit].h_synclen;
tc_h_bporch = (alt_u16)video_modes[vm_edit].h_backporch;
tc_h_active = video_modes[vm_edit].h_active;
tc_v_synclen = (alt_u16)video_modes[vm_edit].v_synclen;
tc_v_bporch = (alt_u16)video_modes[vm_edit].v_backporch;
tc_v_active = video_modes[vm_edit].v_active;
tc_sampler_phase = video_modes[vm_edit].sampler_phase;
}
static void vm_tweak(alt_u16 v) {
if (cm.sync_active && (cm.id == vm_edit)) {
if ((video_modes[cm.id].h_total != tc_h_samplerate) ||
(video_modes[cm.id].h_synclen != tc_h_synclen) ||
(video_modes[cm.id].h_backporch != (alt_u8)tc_h_bporch) ||
(video_modes[cm.id].h_active != tc_h_active) ||
(video_modes[cm.id].v_synclen != tc_v_synclen) ||
(video_modes[cm.id].v_backporch != (alt_u8)tc_v_bporch) ||
(video_modes[cm.id].v_active != tc_v_active))
update_cur_vm = 1;
}
video_modes[vm_edit].h_total = tc_h_samplerate;
video_modes[vm_edit].h_synclen = (alt_u8)tc_h_synclen;
video_modes[vm_edit].h_backporch = (alt_u8)tc_h_bporch;
video_modes[vm_edit].h_active = tc_h_active;
video_modes[vm_edit].v_synclen = (alt_u8)tc_v_synclen;
video_modes[vm_edit].v_backporch = (alt_u8)tc_v_bporch;
video_modes[vm_edit].v_active = tc_v_active;
sniprintf(menu_row2, LCD_ROW_LEN+1, "%u", v);
}
static void sampler_phase_tweak(alt_u8 v) {
if (cm.sync_active && (cm.id == vm_edit) && (video_modes[cm.id].sampler_phase != tc_sampler_phase))
update_cur_vm = 1;
video_modes[vm_edit].sampler_phase = tc_sampler_phase;
sniprintf(menu_row2, LCD_ROW_LEN+1, LNG("%d deg","%d ド"), (v*1125)/100);
}

View File

@ -115,5 +115,8 @@ typedef struct {
} menunavi;
void display_menu(alt_u8 forcedisp);
static void vm_select();
static void vm_tweak(alt_u16 v);
static void sampler_phase_tweak(alt_u8 v);
#endif

View File

@ -1,5 +1,5 @@
//
// Copyright (C) 2015-2018 Markus Hiienkari <mhiienka@niksula.hut.fi>
// Copyright (C) 2015-2019 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
@ -98,60 +98,61 @@ typedef struct {
alt_u8 v_backporch;
alt_u8 h_synclen;
alt_u8 v_synclen;
video_type type;
video_group group;
alt_u8 sampler_phase;
video_type type:5;
video_group group:3;
mode_flags flags;
} mode_data_t;
#define VIDEO_MODES_DEF { \
/* 240p modes */ \
{ "1600x240", 1600, 240, 2046, 262, 202, 15, 150, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "1280x240", 1280, 240, 1560, 262, 170, 15, 72, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "960x240", 960, 240, 1170, 262, 128, 15, 54, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "512x240", 512, 240, 682, 262, 77, 14, 50, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_512_COL | MODE_L3_512_COL | MODE_L4_512_COL | MODE_L5_512_COL) }, \
{ "320x240", 320, 240, 426, 262, 49, 14, 31, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_320_COL | MODE_L3_320_COL | MODE_L4_320_COL | MODE_L5_320_COL) }, \
{ "256x240", 256, 240, 341, 262, 39, 14, 25, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_256_COL | MODE_L3_256_COL | MODE_L4_256_COL | MODE_L5_256_COL) }, \
{ "240p", 720, 240, 858, 262, 57, 15, 62, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
{ "1600x240", 1600, 240, 2046, 262, 202, 15, 150, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "1280x240", 1280, 240, 1560, 262, 170, 15, 72, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "960x240", 960, 240, 1170, 262, 128, 15, 54, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "512x240", 512, 240, 682, 262, 77, 14, 50, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_512_COL | MODE_L3_512_COL | MODE_L4_512_COL | MODE_L5_512_COL) }, \
{ "320x240", 320, 240, 426, 262, 49, 14, 31, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_320_COL | MODE_L3_320_COL | MODE_L4_320_COL | MODE_L5_320_COL) }, \
{ "256x240", 256, 240, 341, 262, 39, 14, 25, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_256_COL | MODE_L3_256_COL | MODE_L4_256_COL | MODE_L5_256_COL) }, \
{ "240p", 720, 240, 858, 262, 57, 15, 62, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
/* 288p modes */ \
{ "1600x240L", 1600, 240, 2046, 312, 202, 41, 150, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "1280x288", 1280, 288, 1560, 312, 170, 15, 72, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "960x288", 960, 288, 1170, 312, 128, 15, 54, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "512x240LB", 512, 240, 682, 312, 77, 41, 50, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_512_COL | MODE_L3_512_COL | MODE_L4_512_COL | MODE_L5_512_COL) }, \
{ "320x240LB", 320, 240, 426, 312, 49, 41, 31, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_320_COL | MODE_L3_320_COL | MODE_L4_320_COL | MODE_L5_320_COL) }, \
{ "256x240LB", 256, 240, 341, 312, 39, 41, 25, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_256_COL | MODE_L3_256_COL | MODE_L4_256_COL | MODE_L5_256_COL) }, \
{ "288p", 720, 288, 864, 312, 69, 19, 63, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
{ "1600x240L", 1600, 240, 2046, 312, 202, 41, 150, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L5_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "1280x288", 1280, 288, 1560, 312, 170, 15, 72, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "960x288", 960, 288, 1170, 312, 128, 15, 54, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L3_GEN_4_3 | MODE_PLLDIVBY2) }, \
{ "512x240LB", 512, 240, 682, 312, 77, 41, 50, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_512_COL | MODE_L3_512_COL | MODE_L4_512_COL | MODE_L5_512_COL) }, \
{ "320x240LB", 320, 240, 426, 312, 49, 41, 31, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_320_COL | MODE_L3_320_COL | MODE_L4_320_COL | MODE_L5_320_COL) }, \
{ "256x240LB", 256, 240, 341, 312, 39, 41, 25, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_L2_256_COL | MODE_L3_256_COL | MODE_L4_256_COL | MODE_L5_256_COL) }, \
{ "288p", 720, 288, 864, 312, 69, 19, 63, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_240P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
/* 360p: GBI */ \
{ "480x360", 480, 360, 600, 375, 63, 10, 38, 3, (VIDEO_EDTV), GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
{ "240x360", 256, 360, 300, 375, 24, 10, 18, 3, (VIDEO_EDTV), GROUP_384P, (MODE_L2_240x360 | MODE_L3_240x360) }, \
{ "480x360", 480, 360, 600, 375, 63, 10, 38, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_EDTV), GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
{ "240x360", 256, 360, 300, 375, 24, 10, 18, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_EDTV), GROUP_384P, (MODE_L2_240x360 | MODE_L3_240x360) }, \
/* 384p: Sega Model 2 */ \
{ "384p", 496, 384, 640, 423, 50, 29, 62, 3, (VIDEO_EDTV), GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
{ "384p", 496, 384, 640, 423, 50, 29, 62, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_EDTV), GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
/* 640x400, VGA Mode 13h */ \
{ "640x400", 640, 400, 800, 449, 48, 36, 96, 2, VIDEO_PC, GROUP_384P, (MODE_PT | MODE_L2) }, \
{ "640x400", 640, 400, 800, 449, 48, 36, 96, 2, DEFAULT_SAMPLER_PHASE, VIDEO_PC, GROUP_384P, (MODE_PT | MODE_L2) }, \
/* 384p: X68k @ 24kHz */ \
{ "640x384", 640, 384, 800, 492, 48, 63, 96, 2, VIDEO_PC, GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
{ "640x384", 640, 384, 800, 492, 48, 63, 96, 2, DEFAULT_SAMPLER_PHASE, VIDEO_PC, GROUP_384P, (MODE_PT | MODE_L2 | MODE_PLLDIVBY2) }, \
/* ~525-line modes */ \
{ "480i", 720, 240, 858, 525, 57, 15, 62, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_480I, (MODE_PT | MODE_L2 | MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2 | MODE_INTERLACED) }, \
{ "480p", 720, 480, 858, 525, 60, 30, 62, 6, (VIDEO_EDTV | VIDEO_PC), GROUP_480P, (MODE_PT | MODE_L2) }, \
{ "640x480", 640, 480, 800, 525, 48, 33, 96, 2, (VIDEO_PC | VIDEO_EDTV), GROUP_480P, (MODE_PT | MODE_L2) }, \
{ "480i", 720, 240, 858, 525, 57, 15, 62, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_480I, (MODE_PT | MODE_L2 | MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2 | MODE_INTERLACED) }, \
{ "480p", 720, 480, 858, 525, 60, 30, 62, 6, DEFAULT_SAMPLER_PHASE, (VIDEO_EDTV | VIDEO_PC), GROUP_480P, (MODE_PT | MODE_L2) }, \
{ "640x480", 640, 480, 800, 525, 48, 33, 96, 2, DEFAULT_SAMPLER_PHASE, (VIDEO_PC | VIDEO_EDTV), GROUP_480P, (MODE_PT | MODE_L2) }, \
/* X68k @ 31kHz */ \
{ "640x512", 640, 512, 800, 568, 48, 28, 96, 2, (VIDEO_PC | VIDEO_EDTV), GROUP_480P, (MODE_PT | MODE_L2) }, \
{ "640x512", 640, 512, 800, 568, 48, 28, 96, 2, DEFAULT_SAMPLER_PHASE, (VIDEO_PC | VIDEO_EDTV), GROUP_480P, (MODE_PT | MODE_L2) }, \
/* ~625-line modes */ \
{ "576i", 720, 288, 864, 625, 69, 19, 63, 3, (VIDEO_SDTV | VIDEO_PC), GROUP_480I, (MODE_PT | MODE_L2 | MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2 | MODE_INTERLACED) }, \
{ "576p", 720, 576, 864, 625, 68, 39, 64, 5, VIDEO_EDTV, GROUP_480P, (MODE_PT | MODE_L2) }, \
{ "800x600", 800, 600, 1056, 628, 88, 23, 128, 4, VIDEO_PC, GROUP_NONE, MODE_PT }, \
{ "576i", 720, 288, 864, 625, 69, 19, 63, 3, DEFAULT_SAMPLER_PHASE, (VIDEO_SDTV | VIDEO_PC), GROUP_480I, (MODE_PT | MODE_L2 | MODE_L3_GEN_16_9 | MODE_L4_GEN_4_3 | MODE_PLLDIVBY2 | MODE_INTERLACED) }, \
{ "576p", 720, 576, 864, 625, 68, 39, 64, 5, DEFAULT_SAMPLER_PHASE, VIDEO_EDTV, GROUP_480P, (MODE_PT | MODE_L2) }, \
{ "800x600", 800, 600, 1056, 628, 88, 23, 128, 4, DEFAULT_SAMPLER_PHASE, VIDEO_PC, GROUP_NONE, MODE_PT }, \
/* 720p modes */ \
{ "720p", 1280, 720, 1650, 750, 220, 20, 40, 5, (VIDEO_HDTV | VIDEO_PC), GROUP_NONE, MODE_PT }, \
{ "720p", 1280, 720, 1650, 750, 220, 20, 40, 5, DEFAULT_SAMPLER_PHASE, (VIDEO_HDTV | VIDEO_PC), GROUP_NONE, MODE_PT }, \
/* VESA XGA and SXGA modes */ \
{ "1024x768", 1024, 768, 1344, 806, 160, 29, 136, 6, VIDEO_PC, GROUP_NONE, MODE_PT }, \
{ "1280x1024", 1280, 1024, 1688, 1066, 248, 38, 112, 3, VIDEO_PC, GROUP_NONE, MODE_PT }, \
{ "1024x768", 1024, 768, 1344, 806, 160, 29, 136, 6, DEFAULT_SAMPLER_PHASE, VIDEO_PC, GROUP_NONE, MODE_PT }, \
{ "1280x1024", 1280, 1024, 1688, 1066, 248, 38, 112, 3, DEFAULT_SAMPLER_PHASE, VIDEO_PC, GROUP_NONE, MODE_PT }, \
/* PS2 GSM 960i mode */ \
{ "640x960i", 640, 480, 800, 1050, 48, 33, 96, 2, (VIDEO_EDTV | VIDEO_PC), GROUP_1080I, (MODE_PT | MODE_L2 | MODE_INTERLACED) }, \
{ "640x960i", 640, 480, 800, 1050, 48, 33, 96, 2, DEFAULT_SAMPLER_PHASE, (VIDEO_EDTV | VIDEO_PC), GROUP_1080I, (MODE_PT | MODE_L2 | MODE_INTERLACED) }, \
/* 1080i/p modes */ \
{ "1080i", 1920, 540, 2200, 1125, 148, 16, 44, 5, (VIDEO_HDTV | VIDEO_PC), GROUP_1080I, (MODE_PT | MODE_L2 | MODE_INTERLACED) }, \
{ "1080p", 1920, 1080, 2200, 1125, 148, 36, 44, 5, (VIDEO_HDTV | VIDEO_PC), GROUP_NONE, MODE_PT }, \
{ "1080i", 1920, 540, 2200, 1125, 148, 16, 44, 5, DEFAULT_SAMPLER_PHASE, (VIDEO_HDTV | VIDEO_PC), GROUP_1080I, (MODE_PT | MODE_L2 | MODE_INTERLACED) }, \
{ "1080p", 1920, 1080, 2200, 1125, 148, 36, 44, 5, DEFAULT_SAMPLER_PHASE, (VIDEO_HDTV | VIDEO_PC), GROUP_NONE, MODE_PT }, \
/* VESA UXGA with 49 H.backporch cycles exchanged for H.synclen */ \
{ "1600x1200", 1600, 1200, 2160, 1250, 255, 46, 241, 3, VIDEO_PC, GROUP_NONE, MODE_PT }, \
{ "1600x1200", 1600, 1200, 2160, 1250, 255, 46, 241, 3, DEFAULT_SAMPLER_PHASE, VIDEO_PC, GROUP_NONE, MODE_PT }, \
}
#define VIDEO_MODES_SIZE (sizeof((mode_data_t[])VIDEO_MODES_DEF))