Implement video processing presets.

This commit is contained in:
Sorgelig
2022-01-29 19:20:34 +08:00
parent 0d848c615b
commit 5cc951d262
4 changed files with 151 additions and 27 deletions

View File

@@ -139,6 +139,7 @@ const char* FileReadLine(fileTextReader *reader);
#define GAMMA_DIR "gamma"
#define AFILTER_DIR "filters_audio"
#define SMASK_DIR "shadow_masks"
#define PRESET_DIR "presets"
#define GAMES_DIR "games"
#define CIFS_DIR "cifs"

View File

@@ -134,6 +134,7 @@ enum MENU
MENU_COEFF_FILE_SELECTED,
MENU_GAMMA_FILE_SELECTED,
MENU_SMASK_FILE_SELECTED,
MENU_PRESET_FILE_SELECTED,
MENU_AFILTER_FILE_SELECTED,
@@ -2540,7 +2541,7 @@ void HandleUI(void)
case MENU_VIDEOPROC1:
helptext_idx = 0;
menumask = 0x7FF;
menumask = 0xFFF;
OsdSetTitle("Video Processing");
menustate = MENU_VIDEOPROC2;
parentstate = MENU_VIDEOPROC1;
@@ -2551,57 +2552,60 @@ void HandleUI(void)
if (!menusub) firstmenu = 0;
adjvisible = 0;
MenuWrite(n++, " Load preset", menusub == 0);
MenuWrite(n++);
sprintf(s, video_get_scaler_flt(VFILTER_HORZ) ? " Horz filter: From file" : " Video filter: NearNeighbour");
MenuWrite(n++, s, menusub == 0, cfg.direct_video);
MenuWrite(n++, s, menusub == 1, cfg.direct_video);
strcpy(s, " ");
if (strlen(video_get_scaler_coeff(VFILTER_HORZ))) strncat(s, video_get_scaler_coeff(VFILTER_HORZ), 25);
else strcpy(s, " < none >");
while (strlen(s) < 26) strcat(s, " ");
strcat(s, " \x16 ");
MenuWrite(n++, s, menusub == 1, !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)));
MenuWrite(n++, s, menusub == 2, !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)));
MenuWrite(n++);
sprintf(s, " Vert filter: %s", video_get_scaler_flt(VFILTER_VERT) ? "From file" : "Same as Horz");
MenuWrite(n++, s, menusub == 2, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ));
MenuWrite(n++, s, menusub == 3, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ));
strcpy(s, " ");
if (strlen(video_get_scaler_coeff(VFILTER_VERT))) strncat(s, video_get_scaler_coeff(VFILTER_VERT), 25);
else strcpy(s, " < none >");
while (strlen(s) < 26) strcat(s, " ");
strcat(s, " \x16 ");
MenuWrite(n++, s, menusub == 3, !video_get_scaler_flt(VFILTER_VERT) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video);
MenuWrite(n++, s, menusub == 4, !video_get_scaler_flt(VFILTER_VERT) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video);
MenuWrite(n++);
sprintf(s, " Scan filter: %s", video_get_scaler_flt(VFILTER_SCAN) ? "From file" : "Same as Vert");
MenuWrite(n++, s, menusub == 4, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ));
MenuWrite(n++, s, menusub == 5, cfg.direct_video || !video_get_scaler_flt(VFILTER_HORZ));
strcpy(s, " ");
if (strlen(video_get_scaler_coeff(VFILTER_SCAN))) strncat(s, video_get_scaler_coeff(VFILTER_SCAN), 25);
else strcpy(s, " < none >");
while (strlen(s) < 26) strcat(s, " ");
strcat(s, " \x16 ");
MenuWrite(n++, s, menusub == 5, !video_get_scaler_flt(VFILTER_SCAN) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video);
MenuWrite(n++, s, menusub == 6, !video_get_scaler_flt(VFILTER_SCAN) || !video_get_scaler_flt(VFILTER_HORZ) || !S_ISDIR(getFileType(COEFF_DIR)) || cfg.direct_video);
MenuWrite(n++);
sprintf(s, " Gamma correction - %s", (video_get_gamma_en() > 0) ? "On" : "Off");
MenuWrite(n++, s, menusub == 6, video_get_gamma_en() < 0);
MenuWrite(n++, s, menusub == 7, video_get_gamma_en() < 0);
strcpy(s, " ");
if (strlen(video_get_gamma_curve())) strncat(s, video_get_gamma_curve(), 25);
else strcpy(s, " < none >");
while (strlen(s) < 26) strcat(s, " ");
strcat(s, " \x16 ");
MenuWrite(n++, s, menusub == 7, (video_get_gamma_en() <= 0) || !S_ISDIR(getFileType(GAMMA_DIR)));
MenuWrite(n++, s, menusub == 8, (video_get_gamma_en() <= 0) || !S_ISDIR(getFileType(GAMMA_DIR)));
MenuWrite(n++);
sprintf(s, " Shadow Mask - %s", (video_get_shadow_mask_mode() < 0) ? config_smask_msg[0] : config_smask_msg[video_get_shadow_mask_mode()]);
MenuWrite(n++, s, menusub == 8, video_get_shadow_mask_mode() < 0);
MenuWrite(n++, s, menusub == 9, video_get_shadow_mask_mode() < 0);
strcpy(s, " ");
if (strlen(video_get_shadow_mask())) strncat(s, video_get_shadow_mask(), 25);
else strcpy(s, " < none >");
while (strlen(s) < 26) strcat(s, " ");
strcat(s, " \x16 ");
MenuWrite(n++, s, menusub == 9, (video_get_shadow_mask_mode() <= 0) || !S_ISDIR(getFileType(SMASK_DIR)));
MenuWrite(n++, s, menusub == 10, (video_get_shadow_mask_mode() <= 0) || !S_ISDIR(getFileType(SMASK_DIR)));
MenuWrite(n++);
MenuWrite(n++, STD_BACK, menusub == 10);
MenuWrite(n++, STD_BACK, menusub == 11);
if (!adjvisible) break;
firstmenu += adjvisible;
@@ -2618,7 +2622,7 @@ void HandleUI(void)
if (plus || minus)
{
if (menusub == 8)
if (menusub == 9)
{
video_set_shadow_mask_mode(video_get_shadow_mask_mode() + (plus ? 1 : -1));
}
@@ -2626,11 +2630,23 @@ void HandleUI(void)
break;
}
if ((select || recent) && menusub == 0)
{
fs_Options = SCANO_DIR | SCANO_TXT;
fs_MenuSelect = MENU_PRESET_FILE_SELECTED;
fs_MenuCancel = parentstate;
strcpy(fs_pFileExt, "INI");
if (!FileExists(Selected_F[15])) snprintf(Selected_F[15], sizeof(Selected_F[15]), PRESET_DIR);
if (select) SelectFile(Selected_F[15], fs_pFileExt, fs_Options, fs_MenuSelect, fs_MenuCancel);
else if (recent_init(15)) menustate = MENU_RECENT1;
break;
}
if (select)
{
switch (menusub)
{
case 0:
case 1:
if (!cfg.direct_video)
{
video_set_scaler_flt(VFILTER_HORZ, video_get_scaler_flt(VFILTER_HORZ) ? 0 : 1);
@@ -2638,10 +2654,10 @@ void HandleUI(void)
}
break;
case 1:
case 3:
case 5:
vfilter_type = (menusub == 1) ? VFILTER_HORZ : (menusub == 3) ? VFILTER_VERT : VFILTER_SCAN;
case 2:
case 4:
case 6:
vfilter_type = (menusub == 2) ? VFILTER_HORZ : (menusub == 4) ? VFILTER_VERT : VFILTER_SCAN;
if (video_get_scaler_flt(VFILTER_HORZ))
{
snprintf(Selected_tmp, sizeof(Selected_tmp), COEFF_DIR"/%s", video_get_scaler_coeff(vfilter_type));
@@ -2650,7 +2666,7 @@ void HandleUI(void)
}
break;
case 2:
case 3:
if (!cfg.direct_video && video_get_scaler_flt(VFILTER_HORZ))
{
video_set_scaler_flt(VFILTER_VERT, video_get_scaler_flt(VFILTER_VERT) ? 0 : 1);
@@ -2658,7 +2674,7 @@ void HandleUI(void)
}
break;
case 4:
case 5:
if (!cfg.direct_video && video_get_scaler_flt(VFILTER_HORZ))
{
video_set_scaler_flt(VFILTER_SCAN, video_get_scaler_flt(VFILTER_SCAN) ? 0 : 1);
@@ -2666,12 +2682,12 @@ void HandleUI(void)
}
break;
case 6:
case 7:
if (video_get_gamma_en() >= 0) video_set_gamma_en(video_get_gamma_en() ? 0 : 1);
menustate = parentstate;
break;
case 7:
case 8:
if (video_get_gamma_en() > 0)
{
snprintf(Selected_tmp, sizeof(Selected_tmp), GAMMA_DIR"/%s", video_get_gamma_curve());
@@ -2680,12 +2696,12 @@ void HandleUI(void)
}
break;
case 8:
case 9:
if (video_get_shadow_mask_mode() >= 0) video_set_shadow_mask_mode(video_get_shadow_mask_mode() + 1);
menustate = parentstate;
break;
case 9:
case 10:
if (video_get_shadow_mask_mode() > 0)
{
snprintf(Selected_tmp, sizeof(Selected_tmp), SMASK_DIR"/%s", video_get_shadow_mask());
@@ -2694,7 +2710,7 @@ void HandleUI(void)
}
break;
case 10:
case 11:
menusub = 5;
menustate = MENU_COMMON1;
break;
@@ -3209,6 +3225,13 @@ void HandleUI(void)
}
break;
case MENU_PRESET_FILE_SELECTED:
memcpy(Selected_F[15], selPath, sizeof(Selected_F[15]));
recent_update(SelectedDir, selPath, SelectedLabel, 15);
video_loadPreset(selPath);
menustate = MENU_VIDEOPROC1;
break;
case MENU_MISC1:
OsdSetSize(16);
helptext_idx = 0;

101
video.cpp
View File

@@ -338,7 +338,7 @@ void video_set_scaler_flt(int type, int n)
set_vfilter(1);
}
void video_set_scaler_coeff(int type, char *name)
void video_set_scaler_coeff(int type, const char *name)
{
strcpy(scaler_flt[type] + 1, name);
FileSaveConfig(scaler_cfg, &scaler_flt, sizeof(scaler_flt));
@@ -643,6 +643,105 @@ static void loadShadowMaskCfg()
}
}
#define IS_NEWLINE(c) (((c) == '\r') || ((c) == '\n'))
#define IS_WHITESPACE(c) (IS_NEWLINE(c) || ((c) == ' ') || ((c) == '\t'))
static char* get_preset_arg(const char *str)
{
static char par[1024];
snprintf(par, sizeof(par), "%s", str);
char *pos = par;
while (*pos && !IS_NEWLINE(*pos)) pos++;
*pos-- = 0;
while (pos >= par)
{
if (!IS_WHITESPACE(*pos)) break;
*pos-- = 0;
}
return par;
}
static void load_flt_pres(const char *str, int type)
{
char *arg = get_preset_arg(str);
if (arg[0])
{
if (!strcasecmp(arg, "same") || !strcasecmp(arg, "off"))
{
video_set_scaler_flt(type, 0);
}
else
{
video_set_scaler_coeff(type, arg);
video_set_scaler_flt(type, 1);
}
}
}
void video_loadPreset(char *name)
{
char *arg;
fileTextReader reader;
if (FileOpenTextReader(&reader, name))
{
const char *line;
while ((line = FileReadLine(&reader)))
{
if (!strncasecmp(line, "hfilter=", 8))
{
load_flt_pres(line + 8, VFILTER_HORZ);
}
else if (!strncasecmp(line, "vfilter=", 8))
{
load_flt_pres(line + 8, VFILTER_VERT);
}
else if (!strncasecmp(line, "sfilter=", 8))
{
load_flt_pres(line + 8, VFILTER_SCAN);
}
else if (!strncasecmp(line, "mask=", 5))
{
arg = get_preset_arg(line + 5);
if (arg[0])
{
if (!strcasecmp(arg, "off") || !strcasecmp(arg, "none")) video_set_shadow_mask_mode(0);
else video_set_shadow_mask(arg);
}
}
else if (!strncasecmp(line, "maskmode=", 9))
{
arg = get_preset_arg(line + 9);
if (arg[0])
{
if (!strcasecmp(arg, "off") || !strcasecmp(arg, "none")) video_set_shadow_mask_mode(0);
else if (!strcasecmp(arg, "1x")) video_set_shadow_mask_mode(SM_MODE_1X);
else if (!strcasecmp(arg, "2x")) video_set_shadow_mask_mode(SM_MODE_2X);
else if (!strcasecmp(arg, "1x rotated")) video_set_shadow_mask_mode(SM_MODE_1X_ROTATED);
else if (!strcasecmp(arg, "2x rotated")) video_set_shadow_mask_mode(SM_MODE_2X_ROTATED);
}
}
else if (!strncasecmp(line, "gamma=", 6))
{
arg = get_preset_arg(line + 6);
if (arg[0])
{
if (!strcasecmp(arg, "off") || !strcasecmp(arg, "none")) video_set_gamma_en(0);
else
{
video_set_gamma_curve(arg);
video_set_gamma_en(1);
}
}
}
}
}
}
static char fb_reset_cmd[128] = {};
static void set_video(vmode_custom_t *v, double Fpix)
{

View File

@@ -8,7 +8,7 @@
int video_get_scaler_flt(int type);
void video_set_scaler_flt(int type, int n);
char* video_get_scaler_coeff(int type);
void video_set_scaler_coeff(int type, char *name);
void video_set_scaler_coeff(int type, const char *name);
int video_get_gamma_en();
void video_set_gamma_en(int n);
@@ -19,6 +19,7 @@ int video_get_shadow_mask_mode();
void video_set_shadow_mask_mode(int n);
char* video_get_shadow_mask();
void video_set_shadow_mask(char *name);
void video_loadPreset(char *name);
void video_mode_load();
void video_mode_adjust();