mirror of
https://github.com/n00mkrad/flowframes.git
synced 2025-12-16 08:27:44 +01:00
Save fixed factors for specific AI models in models.json
This commit is contained in:
@@ -39,7 +39,7 @@ namespace Flowframes.Data
|
|||||||
Backend = AI.AiBackend.Pytorch,
|
Backend = AI.AiBackend.Pytorch,
|
||||||
NameInternal = "FLAVR_CUDA",
|
NameInternal = "FLAVR_CUDA",
|
||||||
NameLong = "Flow-Agnostic Video Representations",
|
NameLong = "Flow-Agnostic Video Representations",
|
||||||
FactorSupport = AI.InterpFactorSupport.AnyFloat,
|
FactorSupport = AI.InterpFactorSupport.Fixed,
|
||||||
SupportedFactors = new int[] { 2, 4, 8 },
|
SupportedFactors = new int[] { 2, 4, 8 },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ namespace Flowframes.Data
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new List<AI> { rifeCuda, rifeNcnnVs, rifeNcnn, flavrCuda, dainNcnn, xvfiCuda, ifrnetNcnn };
|
return new List<AI> { rifeNcnnVs, rifeNcnn, rifeCuda, flavrCuda, dainNcnn, xvfiCuda, ifrnetNcnn };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ namespace Flowframes
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
bool alphaModel = model.supportsAlpha;
|
bool alphaModel = model.SupportsAlpha;
|
||||||
bool png = outMode == Interpolate.OutMode.ImgPng;
|
bool png = outMode == Interpolate.OutMode.ImgPng;
|
||||||
bool gif = outMode == Interpolate.OutMode.VidGif;
|
bool gif = outMode == Interpolate.OutMode.VidGif;
|
||||||
bool proResAlpha = outMode == Interpolate.OutMode.VidProRes && Config.GetInt(Config.Key.proResProfile) > 3;
|
bool proResAlpha = outMode == Interpolate.OutMode.VidProRes && Config.GetInt(Config.Key.proResProfile) > 3;
|
||||||
@@ -240,7 +240,7 @@ namespace Flowframes
|
|||||||
s += $"OUTFPS|{outFps}\n";
|
s += $"OUTFPS|{outFps}\n";
|
||||||
s += $"INTERPFACTOR|{interpFactor}\n";
|
s += $"INTERPFACTOR|{interpFactor}\n";
|
||||||
s += $"OUTMODE|{outMode}\n";
|
s += $"OUTMODE|{outMode}\n";
|
||||||
s += $"MODEL|{model.name}\n";
|
s += $"MODEL|{model.Name}\n";
|
||||||
s += $"INPUTRES|{InputResolution.Width}x{InputResolution.Height}\n";
|
s += $"INPUTRES|{InputResolution.Width}x{InputResolution.Height}\n";
|
||||||
s += $"OUTPUTRES|{ScaledResolution.Width}x{ScaledResolution.Height}\n";
|
s += $"OUTPUTRES|{ScaledResolution.Width}x{ScaledResolution.Height}\n";
|
||||||
s += $"ALPHA|{alpha}\n";
|
s += $"ALPHA|{alpha}\n";
|
||||||
|
|||||||
@@ -1,58 +1,54 @@
|
|||||||
using Flowframes.IO;
|
using Flowframes.IO;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Flowframes.Data
|
namespace Flowframes.Data
|
||||||
{
|
{
|
||||||
public class ModelCollection
|
public class ModelCollection
|
||||||
{
|
{
|
||||||
public AI ai;
|
public AI Ai { get; set; } = null;
|
||||||
public List<ModelInfo> models = new List<ModelInfo>();
|
public List<ModelInfo> Models { get; set; } = new List<ModelInfo>();
|
||||||
|
|
||||||
public class ModelInfo
|
public class ModelInfo
|
||||||
{
|
{
|
||||||
public AI ai;
|
public AI Ai { get; set; } = null;
|
||||||
public string name;
|
public string Name { get; set; } = "";
|
||||||
public string desc;
|
public string Desc { get; set; } = "";
|
||||||
public string dir;
|
public string Dir { get; set; } = "";
|
||||||
public bool supportsAlpha;
|
public bool SupportsAlpha { get; set; } = false;
|
||||||
public bool isDefault;
|
public bool IsDefault { get; set; } = false;
|
||||||
|
private int[] _fixedFactors = null;
|
||||||
|
public int[] FixedFactors { get { return _fixedFactors == null ? new int[0] : _fixedFactors; } set { _fixedFactors = value; } }
|
||||||
|
|
||||||
public ModelInfo(AI ai, string name, string desc, string dir, bool supportsAlpha, bool isDefault)
|
public ModelInfo() { }
|
||||||
{
|
|
||||||
this.ai = ai;
|
|
||||||
this.name = name;
|
|
||||||
this.desc = desc;
|
|
||||||
this.dir = dir;
|
|
||||||
this.supportsAlpha = supportsAlpha;
|
|
||||||
this.isDefault = isDefault;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetUiString()
|
public string GetUiString()
|
||||||
{
|
{
|
||||||
return $"{name} - {desc}{(supportsAlpha ? " (Supports Transparency)" : "")}{(isDefault ? " (Recommended)" : "")}";
|
return $"{Name} - {Desc}{(SupportsAlpha ? " (Supports Transparency)" : "")}{(FixedFactors.Count() > 0 ? $" ({GetFactorsString()})" : "")}{(IsDefault ? " (Recommended)" : "")}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public string GetFactorsString ()
|
||||||
{
|
{
|
||||||
return $"{name} - {desc} ({dir}){(supportsAlpha ? " (Supports Transparency)" : "")}{(isDefault ? " (Recommended)" : "")}";
|
return string.Join(", ", FixedFactors.Select(x => $"{x}x"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ModelCollection(AI ai)
|
public ModelCollection(AI ai)
|
||||||
{
|
{
|
||||||
this.ai = ai;
|
Ai = ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ModelCollection(AI ai, string jsonContentOrPath)
|
public ModelCollection(AI ai, string jsonContentOrPath)
|
||||||
{
|
{
|
||||||
this.ai = ai;
|
Ai = ai;
|
||||||
|
|
||||||
if (IoUtils.IsPathValid(jsonContentOrPath) && File.Exists(jsonContentOrPath))
|
if (IoUtils.IsPathValid(jsonContentOrPath) && File.Exists(jsonContentOrPath))
|
||||||
jsonContentOrPath = File.ReadAllText(jsonContentOrPath);
|
jsonContentOrPath = File.ReadAllText(jsonContentOrPath);
|
||||||
|
|
||||||
models = new List<ModelInfo>();
|
Models = new List<ModelInfo>();
|
||||||
dynamic data = JsonConvert.DeserializeObject(jsonContentOrPath);
|
dynamic data = JsonConvert.DeserializeObject(jsonContentOrPath);
|
||||||
|
|
||||||
foreach (var item in data)
|
foreach (var item in data)
|
||||||
@@ -63,7 +59,18 @@ namespace Flowframes.Data
|
|||||||
bool def = false;
|
bool def = false;
|
||||||
bool.TryParse((string)item.isDefault, out def);
|
bool.TryParse((string)item.isDefault, out def);
|
||||||
|
|
||||||
models.Add(new ModelInfo(ai, (string)item.name, (string)item.desc, (string)item.dir, alpha, def));
|
ModelInfo modelInfo = new ModelInfo()
|
||||||
|
{
|
||||||
|
Ai = ai,
|
||||||
|
Name = (string)item.name,
|
||||||
|
Desc = (string)item.desc,
|
||||||
|
Dir = (string)item.dir,
|
||||||
|
SupportsAlpha = alpha,
|
||||||
|
IsDefault = def,
|
||||||
|
FixedFactors = ((JArray)item.fixedFactors)?.Select(x => (int)x).ToArray(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Models.Add(modelInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ namespace Flowframes
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return AiModels.GetModels(currentAi).models[aiModel.SelectedIndex];
|
return AiModels.GetModels(currentAi).Models[aiModel.SelectedIndex];
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace Flowframes.Forms
|
|||||||
InterpSettings entry = Program.batchQueue.ElementAt(i);
|
InterpSettings entry = Program.batchQueue.ElementAt(i);
|
||||||
string niceOutMode = entry.outMode.ToString().ToUpper().Remove("VID").Remove("IMG");
|
string niceOutMode = entry.outMode.ToString().ToUpper().Remove("VID").Remove("IMG");
|
||||||
string str = $"#{i+1}: {Path.GetFileName(entry.inPath).Trunc(40)} - {entry.inFps.GetFloat()} FPS => " +
|
string str = $"#{i+1}: {Path.GetFileName(entry.inPath).Trunc(40)} - {entry.inFps.GetFloat()} FPS => " +
|
||||||
$"{entry.interpFactor}x {entry.ai.NameShort} ({entry.model.name}) => {niceOutMode}";
|
$"{entry.interpFactor}x {entry.ai.NameShort} ({entry.model.Name}) => {niceOutMode}";
|
||||||
taskList.Items.Add(str);
|
taskList.Items.Add(str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -579,7 +579,7 @@ namespace Flowframes.IO
|
|||||||
filename = filename.Replace("[FULLNAME]", Path.GetFileName(curr.inPath));
|
filename = filename.Replace("[FULLNAME]", Path.GetFileName(curr.inPath));
|
||||||
filename = filename.Replace("[FACTOR]", curr.interpFactor.ToStringDot());
|
filename = filename.Replace("[FACTOR]", curr.interpFactor.ToStringDot());
|
||||||
filename = filename.Replace("[AI]", curr.ai.NameShort.ToUpper());
|
filename = filename.Replace("[AI]", curr.ai.NameShort.ToUpper());
|
||||||
filename = filename.Replace("[MODEL]", curr.model.name.Remove(" "));
|
filename = filename.Replace("[MODEL]", curr.model.Name.Remove(" "));
|
||||||
filename = filename.Replace("[FPS]", fps.ToStringDot());
|
filename = filename.Replace("[FPS]", fps.ToStringDot());
|
||||||
filename = filename.Replace("[ROUNDFPS]", fps.RoundToInt().ToString());
|
filename = filename.Replace("[ROUNDFPS]", fps.RoundToInt().ToString());
|
||||||
filename = filename.Replace("[RES]", $"{outRes.Width}x{outRes.Height}");
|
filename = filename.Replace("[RES]", $"{outRes.Width}x{outRes.Height}");
|
||||||
|
|||||||
@@ -201,9 +201,9 @@ namespace Flowframes.IO
|
|||||||
string aiPkgFolder = Path.Combine(Paths.GetPkgPath(), ai.PkgDir);
|
string aiPkgFolder = Path.Combine(Paths.GetPkgPath(), ai.PkgDir);
|
||||||
ModelCollection aiModels = AiModels.GetModels(ai);
|
ModelCollection aiModels = AiModels.GetModels(ai);
|
||||||
|
|
||||||
foreach(ModelCollection.ModelInfo model in aiModels.models)
|
foreach(ModelCollection.ModelInfo model in aiModels.Models)
|
||||||
{
|
{
|
||||||
string mdlFolder = Path.Combine(aiPkgFolder, model.dir);
|
string mdlFolder = Path.Combine(aiPkgFolder, model.Dir);
|
||||||
|
|
||||||
if (Directory.Exists(mdlFolder))
|
if (Directory.Exists(mdlFolder))
|
||||||
modelPaths.Add(mdlFolder);
|
modelPaths.Add(mdlFolder);
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace Flowframes.Main
|
|||||||
{
|
{
|
||||||
string name = customModel.Remove("_alpha").Remove("_custom");
|
string name = customModel.Remove("_alpha").Remove("_custom");
|
||||||
bool alpha = customModel.Contains("_alpha");
|
bool alpha = customModel.Contains("_alpha");
|
||||||
modelCollection.models.Add(new ModelCollection.ModelInfo(ai, name, "Custom Model", customModel, alpha, false));
|
modelCollection.Models.Add(new ModelCollection.ModelInfo() { Ai = ai, Name = name, Desc = "Custom Model", SupportsAlpha = alpha, IsDefault = false });
|
||||||
}
|
}
|
||||||
|
|
||||||
return modelCollection;
|
return modelCollection;
|
||||||
@@ -53,9 +53,9 @@ namespace Flowframes.Main
|
|||||||
{
|
{
|
||||||
ModelCollection modelCollection = GetModels(ai);
|
ModelCollection modelCollection = GetModels(ai);
|
||||||
|
|
||||||
foreach(ModelCollection.ModelInfo model in modelCollection.models)
|
foreach(ModelCollection.ModelInfo model in modelCollection.Models)
|
||||||
{
|
{
|
||||||
if (model.name == modelName)
|
if (model.Name == modelName)
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,9 +66,9 @@ namespace Flowframes.Main
|
|||||||
{
|
{
|
||||||
ModelCollection modelCollection = GetModels(ai);
|
ModelCollection modelCollection = GetModels(ai);
|
||||||
|
|
||||||
foreach (ModelCollection.ModelInfo model in modelCollection.models)
|
foreach (ModelCollection.ModelInfo model in modelCollection.Models)
|
||||||
{
|
{
|
||||||
if (model.dir == dirName)
|
if (model.Dir == dirName)
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ namespace Flowframes
|
|||||||
|
|
||||||
public static async Task Realtime ()
|
public static async Task Realtime ()
|
||||||
{
|
{
|
||||||
await AiProcess.RunRifeNcnnVs(currentSettings.framesFolder, "", currentSettings.interpFactor, currentSettings.model.dir, true);
|
await AiProcess.RunRifeNcnnVs(currentSettings.framesFolder, "", currentSettings.interpFactor, currentSettings.model.Dir, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task GetFrames()
|
public static async Task GetFrames()
|
||||||
@@ -186,8 +186,14 @@ namespace Flowframes
|
|||||||
if (!ai.Piped || (ai.Piped && dedupe))
|
if (!ai.Piped || (ai.Piped && dedupe))
|
||||||
await Task.Run(async () => { await FrameOrder.CreateFrameOrderFile(currentSettings.framesFolder, Config.GetBool(Config.Key.enableLoop), currentSettings.interpFactor); });
|
await Task.Run(async () => { await FrameOrder.CreateFrameOrderFile(currentSettings.framesFolder, Config.GetBool(Config.Key.enableLoop), currentSettings.interpFactor); });
|
||||||
|
|
||||||
|
if (currentSettings.model.FixedFactors.Count() > 0 && (currentSettings.interpFactor != (int)currentSettings.interpFactor || !currentSettings.model.FixedFactors.Contains(currentSettings.interpFactor.RoundToInt())))
|
||||||
|
Cancel($"The selected model does not support {currentSettings.interpFactor}x interpolation.\n\nSupported Factors: {currentSettings.model.GetFactorsString()}");
|
||||||
|
|
||||||
|
if (canceled) return;
|
||||||
|
|
||||||
Program.mainForm.SetStatus("Downloading models...");
|
Program.mainForm.SetStatus("Downloading models...");
|
||||||
await ModelDownloader.DownloadModelFiles(ai, currentSettings.model.dir);
|
await ModelDownloader.DownloadModelFiles(ai, currentSettings.model.Dir);
|
||||||
|
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
|
|
||||||
currentlyUsingAutoEnc = Utils.CanUseAutoEnc(stepByStep, currentSettings);
|
currentlyUsingAutoEnc = Utils.CanUseAutoEnc(stepByStep, currentSettings);
|
||||||
@@ -197,25 +203,25 @@ namespace Flowframes
|
|||||||
List<Task> tasks = new List<Task>();
|
List<Task> tasks = new List<Task>();
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.rifeCuda.NameInternal)
|
if (ai.NameInternal == Implementations.rifeCuda.NameInternal)
|
||||||
tasks.Add(AiProcess.RunRifeCuda(currentSettings.framesFolder, currentSettings.interpFactor, currentSettings.model.dir));
|
tasks.Add(AiProcess.RunRifeCuda(currentSettings.framesFolder, currentSettings.interpFactor, currentSettings.model.Dir));
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.rifeNcnn.NameInternal)
|
if (ai.NameInternal == Implementations.rifeNcnn.NameInternal)
|
||||||
tasks.Add(AiProcess.RunRifeNcnn(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.dir));
|
tasks.Add(AiProcess.RunRifeNcnn(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.Dir));
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.rifeNcnnVs.NameInternal)
|
if (ai.NameInternal == Implementations.rifeNcnnVs.NameInternal)
|
||||||
tasks.Add(AiProcess.RunRifeNcnnVs(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.dir));
|
tasks.Add(AiProcess.RunRifeNcnnVs(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.Dir));
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.flavrCuda.NameInternal)
|
if (ai.NameInternal == Implementations.flavrCuda.NameInternal)
|
||||||
tasks.Add(AiProcess.RunFlavrCuda(currentSettings.framesFolder, currentSettings.interpFactor, currentSettings.model.dir));
|
tasks.Add(AiProcess.RunFlavrCuda(currentSettings.framesFolder, currentSettings.interpFactor, currentSettings.model.Dir));
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.dainNcnn.NameInternal)
|
if (ai.NameInternal == Implementations.dainNcnn.NameInternal)
|
||||||
tasks.Add(AiProcess.RunDainNcnn(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.dir, Config.GetInt(Config.Key.dainNcnnTilesize, 512)));
|
tasks.Add(AiProcess.RunDainNcnn(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.Dir, Config.GetInt(Config.Key.dainNcnnTilesize, 512)));
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.xvfiCuda.NameInternal)
|
if (ai.NameInternal == Implementations.xvfiCuda.NameInternal)
|
||||||
tasks.Add(AiProcess.RunXvfiCuda(currentSettings.framesFolder, currentSettings.interpFactor, currentSettings.model.dir));
|
tasks.Add(AiProcess.RunXvfiCuda(currentSettings.framesFolder, currentSettings.interpFactor, currentSettings.model.Dir));
|
||||||
|
|
||||||
if(ai.NameInternal == Implementations.ifrnetNcnn.NameInternal)
|
if(ai.NameInternal == Implementations.ifrnetNcnn.NameInternal)
|
||||||
tasks.Add(AiProcess.RunIfrnetNcnn(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.dir));
|
tasks.Add(AiProcess.RunIfrnetNcnn(currentSettings.framesFolder, outpath, currentSettings.interpFactor, currentSettings.model.Dir));
|
||||||
|
|
||||||
if (currentlyUsingAutoEnc)
|
if (currentlyUsingAutoEnc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ namespace Flowframes.Main
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model == null || model.dir.Trim() == "")
|
if (model == null || model.Dir.Trim() == "")
|
||||||
{
|
{
|
||||||
UiUtils.ShowMessageBox("No valid AI model has been selected!", UiUtils.MessageType.Error);
|
UiUtils.ShowMessageBox("No valid AI model has been selected!", UiUtils.MessageType.Error);
|
||||||
I.Cancel("No valid model selected.", true);
|
I.Cancel("No valid model selected.", true);
|
||||||
|
|||||||
@@ -48,14 +48,14 @@ namespace Flowframes.MiscUtils
|
|||||||
{
|
{
|
||||||
ModelCollection modelCollection = AiModels.GetModels(ai);
|
ModelCollection modelCollection = AiModels.GetModels(ai);
|
||||||
|
|
||||||
for (int i = 0; i < modelCollection.models.Count; i++)
|
for (int i = 0; i < modelCollection.Models.Count; i++)
|
||||||
{
|
{
|
||||||
if (canceled)
|
if (canceled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ModelCollection.ModelInfo modelInfo = modelCollection.models[i];
|
ModelCollection.ModelInfo modelInfo = modelCollection.Models[i];
|
||||||
form.SetStatus($"Downloading files for {modelInfo.ai.NameInternal.Replace("_", "-")}...");
|
form.SetStatus($"Downloading files for {modelInfo.Ai.NameInternal.Replace("_", "-")}...");
|
||||||
await ModelDownloader.DownloadModelFiles(ai, modelInfo.dir, false);
|
await ModelDownloader.DownloadModelFiles(ai, modelInfo.Dir, false);
|
||||||
taskCounter++;
|
taskCounter++;
|
||||||
UpdateProgressBar();
|
UpdateProgressBar();
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ namespace Flowframes.MiscUtils
|
|||||||
foreach(AI ai in ais)
|
foreach(AI ai in ais)
|
||||||
{
|
{
|
||||||
ModelCollection modelCollection = AiModels.GetModels(ai);
|
ModelCollection modelCollection = AiModels.GetModels(ai);
|
||||||
count += modelCollection.models.Count;
|
count += modelCollection.Models.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ namespace Flowframes.Ui
|
|||||||
{
|
{
|
||||||
AI ai = Program.mainForm.GetAi();
|
AI ai = Program.mainForm.GetAi();
|
||||||
|
|
||||||
if (ai.NameInternal == Implementations.rifeNcnn.NameInternal && !Program.mainForm.GetModel(ai).dir.Contains("v4"))
|
if (ai.NameInternal == Implementations.rifeNcnn.NameInternal && !Program.mainForm.GetModel(ai).Dir.Contains("v4"))
|
||||||
{
|
{
|
||||||
if (factor != 2)
|
if (factor != 2)
|
||||||
Logger.Log($"{ai.FriendlyName} models before 4.0 only support 2x interpolation!");
|
Logger.Log($"{ai.FriendlyName} models before 4.0 only support 2x interpolation!");
|
||||||
|
|||||||
@@ -38,19 +38,19 @@ namespace Flowframes.Ui
|
|||||||
{
|
{
|
||||||
ModelCollection modelCollection = AiModels.GetModels(ai);
|
ModelCollection modelCollection = AiModels.GetModels(ai);
|
||||||
|
|
||||||
if (modelCollection.models == null || modelCollection.models.Count < 1)
|
if (modelCollection.Models == null || modelCollection.Models.Count < 1)
|
||||||
return combox;
|
return combox;
|
||||||
|
|
||||||
for (int i = 0; i < modelCollection.models.Count; i++)
|
for (int i = 0; i < modelCollection.Models.Count; i++)
|
||||||
{
|
{
|
||||||
ModelCollection.ModelInfo modelInfo = modelCollection.models[i];
|
ModelCollection.ModelInfo modelInfo = modelCollection.Models[i];
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(modelInfo.name))
|
if (string.IsNullOrWhiteSpace(modelInfo.Name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
combox.Items.Add(modelInfo.GetUiString());
|
combox.Items.Add(modelInfo.GetUiString());
|
||||||
|
|
||||||
if (modelInfo.isDefault)
|
if (modelInfo.IsDefault)
|
||||||
combox.SelectedIndex = i;
|
combox.SelectedIndex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "FLAVR 2x",
|
"name": "FLAVR 2x",
|
||||||
"desc": "Official model, only works for 2x interpolation",
|
"desc": "Official model",
|
||||||
"dir": "FLAVR2X",
|
"dir": "FLAVR2X",
|
||||||
|
"fixedFactors": [2],
|
||||||
"isDefault": "true"
|
"isDefault": "true"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "FLAVR 4x",
|
"name": "FLAVR 4x",
|
||||||
"desc": "Official model, only works for 4x interpolation",
|
"desc": "Official model",
|
||||||
"dir": "FLAVR4X"
|
"dir": "FLAVR4X",
|
||||||
|
"fixedFactors": [4],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "FLAVR 8x",
|
"name": "FLAVR 8x",
|
||||||
"desc": "Official model, only works for 8x interpolation",
|
"desc": "Official model",
|
||||||
"dir": "FLAVR8X"
|
"dir": "FLAVR8X",
|
||||||
|
"fixedFactors": [8],
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,4 +1,10 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"name": "RIFE 2.3",
|
||||||
|
"desc": "Old Model",
|
||||||
|
"dir": "rife-v2.3",
|
||||||
|
"fixedFactors": [2]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "RIFE 4.0",
|
"name": "RIFE 4.0",
|
||||||
"desc": "New Fast General Model",
|
"desc": "New Fast General Model",
|
||||||
|
|||||||
Reference in New Issue
Block a user