This commit is contained in:
John Andrews
2022-09-27 11:18:39 +13:00
parent ecf222fd5a
commit fe5198fe16
5 changed files with 82 additions and 27 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -166,44 +166,56 @@ namespace FileFlows.VideoNodes.FfmpegBuilderNodes
var decoders = isH264 ? Decoders_h264() :
isHevc ? Decoders_hevc() :
Decoders_Default();
foreach(var hw in decoders)
try
{
if (hw == null)
continue;
if (CanUseHardwareEncoding.DisabledByVariables(Args, string.Join(" ", hw)))
continue;
try
foreach (var hw in decoders)
{
var arguments = new List<string>()
if (hw == null)
continue;
if (CanUseHardwareEncoding.DisabledByVariables(Args, string.Join(" ", hw)))
continue;
try
{
var arguments = new List<string>()
{
"-y",
};
arguments.AddRange(hw);
arguments.AddRange(new[]
{
arguments.AddRange(hw);
arguments.AddRange(new[]
{
"-f", "lavfi",
"-i", "color=color=red",
"-frames:v", "10",
testFile
});
var result = Args.Execute(new ExecuteArgs
{
Command = FFMPEG,
ArgumentList = arguments.ToArray()
});
if (result.ExitCode == 0)
{
Args.Logger?.ILog("Supported hardware decoding detected: " + string.Join(" ", hw));
return hw;
var result = Args.Execute(new ExecuteArgs
{
Command = FFMPEG,
ArgumentList = arguments.ToArray()
});
if (result.ExitCode == 0)
{
Args.Logger?.ILog("Supported hardware decoding detected: " + string.Join(" ", hw));
return hw;
}
}
catch (Exception) { }
}
Args.Logger?.ILog("No hardware decoding availble");
return new string[] { };
}
finally
{
try
{
if (File.Exists(testFile))
File.Delete(testFile);
}
catch (Exception) { }
}
Args.Logger?.ILog("No hardware decoding availble");
return new string[] { };
}
private static readonly bool IsMac = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);

View File

@@ -17,6 +17,8 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
internal const string CODEC_H265 = "h265";
internal const string CODEC_H265_10BIT = "h265 10BIT";
internal const string CODEC_AV1 = "av1";
internal const string CODEC_AV1_10BIT = "av1 10BIT";
/// <summary>
/// The Help URL for this node
@@ -30,7 +32,8 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
[ChangeValue(nameof(Quality), 23, CODEC_H264)]
[ChangeValue(nameof(Quality), 28, CODEC_H265)]
[ChangeValue(nameof(Quality), 28, CODEC_H265_10BIT)]
[ChangeValue(nameof(Quality), 35, CODEC_AV1)]
[ChangeValue(nameof(Quality), 28, CODEC_AV1)]
[ChangeValue(nameof(Quality), 28, CODEC_AV1_10BIT)]
[Select(nameof(CodecOptions), 1)]
public string Codec { get; set; }
@@ -51,6 +54,7 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
new () { Label = "H.265", Value = CODEC_H265 },
new () { Label = "H.265 (10-Bit)", Value = CODEC_H265_10BIT },
new () { Label = "AV1", Value = CODEC_AV1 },
new () { Label = "AV1 (10-Bit)", Value = CODEC_AV1_10BIT },
};
}
return _CodecOptions;
@@ -62,7 +66,7 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
/// </summary>
[DefaultValue(true)]
[Boolean(2)]
[ConditionEquals(nameof(Codec), CODEC_AV1, inverse: true)]
[ConditionEquals(nameof(Codec), "/av1/", inverse: true)]
public bool HardwareEncoding { get; set; }
/// <summary>
@@ -95,6 +99,8 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
stream.EncodingParameters.AddRange(H264(args, false, Quality, HardwareEncoding));
else if (Codec == CODEC_H265 || Codec == CODEC_H265_10BIT)
stream.EncodingParameters.AddRange(H265(args, Codec == CODEC_H265_10BIT, Quality, HardwareEncoding));
else if (Codec == CODEC_AV1 || Codec == CODEC_AV1_10BIT)
stream.EncodingParameters.AddRange(AV1(args, Codec == CODEC_AV1_10BIT, Quality));
else
{
args.Logger?.ILog("Unknown codec: " + Codec);
@@ -112,7 +118,7 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
if (codec == CODEC_H265 || codec == CODEC_H265_10BIT)
return H265(args, codec == CODEC_H265_10BIT, quality, useHardwareEncoder).Select(x => x.Replace("{index}", "0"));
if(codec == CODEC_AV1)
return AV1(args, quality).Select(x => x.Replace("{index}", "0"));
return AV1(args, codec == CODEC_AV1_10BIT, quality).Select(x => x.Replace("{index}", "0"));
throw new Exception("Unsupported codec: " + codec);
@@ -174,11 +180,13 @@ public class FfmpegBuilderVideoEncode:FfmpegBuilderNode
}
private static IEnumerable<string> AV1(NodeParameters args, int quality)
private static IEnumerable<string> AV1(NodeParameters args, bool tenBit, int quality)
{
// hevc_qsv -load_plugin hevc_hw -pix_fmt p010le -profile:v main10 -global_quality 21 -g 24 -look_ahead 1 -look_ahead_depth 60
List<string> parameters = new List<string>();
parameters.AddRange(AV1_CPU(quality));
if (tenBit)
parameters.AddRange(new [] { "-pix_fmt:v:{index}", "yuv420p10le" });
return parameters;
}

View File

@@ -44,6 +44,41 @@ public class FfmpegBuilder_BasicTests : TestBase
Assert.AreEqual(1, result);
}
[TestMethod]
public void FfmpegBuilder_Basic_Av1()
{
const string file = @"D:\videos\unprocessed\basic.mkv";
var logger = new TestLogger();
const string ffmpeg = @"C:\utils\ffmpeg\ffmpeg.exe";
var vi = new VideoInfoHelper(ffmpeg, logger);
var vii = vi.Read(file);
var args = new NodeParameters(file, logger, false, string.Empty);
args.GetToolPathActual = (string tool) => ffmpeg;
args.TempPath = @"D:\videos\temp";
args.Parameters.Add("VideoInfo", vii);
FfmpegBuilderStart ffStart = new();
ffStart.PreExecute(args);
Assert.AreEqual(1, ffStart.Execute(args));
FfmpegBuilderVideoEncode ffEncode = new();
ffEncode.Codec = "av1 10BIT";
ffEncode.Quality = 28;
ffEncode.HardwareEncoding = false;
ffEncode.PreExecute(args);
ffEncode.Execute(args);
FfmpegBuilderExecutor ffExecutor = new();
ffExecutor.HardwareDecoding = true;
ffExecutor.PreExecute(args);
int result = ffExecutor.Execute(args);
string log = logger.ToString();
Assert.AreEqual(1, result);
}
[TestMethod]
public void FfmpegBuilder_AddAc3Aac()
{