mirror of
https://github.com/revenz/FileFlowsPlugins.git
synced 2026-01-06 03:40:15 -06:00
121 lines
4.4 KiB
C#
121 lines
4.4 KiB
C#
using FileFlows.VideoNodes.Helpers;
|
|
|
|
namespace FileFlows.VideoNodes.FfmpegBuilderNodes.EncoderAdjustments;
|
|
|
|
/// <summary>
|
|
/// Adjustments for VAAPI
|
|
/// </summary>
|
|
public class VaapiAdjustments : IEncoderAdjustment
|
|
{
|
|
/// <summary>
|
|
/// Gets if VAAPI hardware encoding is being used
|
|
/// </summary>
|
|
/// <param name="args">the ffmepg args</param>
|
|
/// <returns>true if using VAAPI hardware encoding, otherwise false</returns>
|
|
public static bool IsUsingVaapi(List<string> args)
|
|
=> args.Any(x => x == "hevc_vaapi" || x == "h264_vaapi");
|
|
|
|
/// <summary>
|
|
/// Runt the adjustments
|
|
/// </summary>
|
|
/// <param name="args">the ffmpeg args</param>
|
|
/// <returns>the adjusted arguments</returns>
|
|
public List<string> Run(ILogger logger, List<string> args)
|
|
{
|
|
//logger.ILog("Original VAAPI parameters: \n" + string.Join("\n", args));
|
|
int iIndex = args.IndexOf("-i");
|
|
if (iIndex >= 0 && VaapiHelper.VaapiLinux)
|
|
{
|
|
args.InsertRange(iIndex, new[]
|
|
{
|
|
"-vaapi_device",
|
|
VaapiHelper.VaapiRenderDevice
|
|
});
|
|
}
|
|
|
|
// "-pix_fmt:v:{index}", "p010le", "-profile:v:{index}", "main10"
|
|
int main10 = args.IndexOf("main10");
|
|
string additionalFilters = string.Empty;
|
|
if (main10 > 0)
|
|
{
|
|
// we dont specify main 10 for vaapi
|
|
args.RemoveAt(main10);
|
|
args.RemoveAt(main10 - 1);
|
|
}
|
|
else
|
|
{
|
|
additionalFilters += "format=nv12,";
|
|
}
|
|
|
|
additionalFilters += "hwupload,";
|
|
for (int i = 0; i < args.Count - 2; i++)
|
|
{
|
|
if (args[i].StartsWith("-filter:v:") == false)
|
|
continue;
|
|
++i;
|
|
var vf = args[i];
|
|
vf = additionalFilters + vf.Replace("scale=", "scale_vaapi=")
|
|
.Replace(":flags=lanczos", string.Empty);
|
|
args[i] = vf;
|
|
}
|
|
|
|
// int vfScaleIndex = args.FindIndex(x => x.StartsWith("scale=") || x.Contains(", scale="));
|
|
// if (vfScaleIndex > 0)
|
|
// {
|
|
// string vfScale = args[vfScaleIndex];
|
|
// var filters = vfScale.Split(',').Select(x => x.Trim()).ToArray();
|
|
// var scale = filters.FirstOrDefault(x => x.StartsWith("scale="));
|
|
// bool scaleRemoved = false;
|
|
//
|
|
// int vfIndex = args.IndexOf("-vf");
|
|
// if (vfIndex < 0)
|
|
// {
|
|
// int yIndex = args.IndexOf("-y");
|
|
// if (yIndex >= 0)
|
|
// {
|
|
// string vf = "format=nv12,hwupload";
|
|
// if (string.IsNullOrWhiteSpace(scale) == false)
|
|
// {
|
|
// vf += "," + scale.Replace("scale=", "scale_vaapi=")
|
|
// .Replace(":flags=lanczos", string.Empty);
|
|
// if (filters.Length == 1)
|
|
// {
|
|
// args.RemoveAt(vfScaleIndex);
|
|
// args.RemoveAt(vfScaleIndex - 1); // remove the filter for this
|
|
// scaleRemoved = true;
|
|
// }
|
|
// else
|
|
// {
|
|
// args = args.Select(x =>
|
|
// {
|
|
// if (x == vfScale)
|
|
// return string.Join(", ", filters.Where(x => x != scale));
|
|
// return x;
|
|
// }).ToList();
|
|
// }
|
|
// }
|
|
//
|
|
// args.InsertRange(yIndex + 1, new[] { "-vf", vf });
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// if (scaleRemoved == false)
|
|
// {
|
|
// for (int i = 0; i < args.Count; i++)
|
|
// {
|
|
// var arg = args[i];
|
|
// if (arg.StartsWith("scale=")) // scale should use scale_vaapi
|
|
// args[i] = arg.Replace("scale=", "scale_vaapi=");
|
|
// }
|
|
// }
|
|
|
|
// scale filter was used, but then removed
|
|
// int filterV0 = args.IndexOf("-filter:v:0");
|
|
// if(filterV0 > 0 && filterV0 < args.Count - 1 && args[filterV0 + 1].StartsWith("-"))
|
|
// args.RemoveAt(filterV0);
|
|
|
|
//logger.ILog("Updated VAAPI parameters: \n" + string.Join("\n", args));
|
|
return args;
|
|
}
|
|
} |