From fe5198fe16423a7ec76f26d5a986c358d24e1a6a Mon Sep 17 00:00:00 2001 From: John Andrews Date: Tue, 27 Sep 2022 11:18:39 +1300 Subject: [PATCH] av1 --- FileFlows.Plugin.dll | Bin 124416 -> 124416 bytes FileFlows.Plugin.pdb | Bin 28632 -> 28632 bytes .../FfmpegBuilderExecutor.cs | 58 +++++++++++------- .../Video/FfmpegBuilderVideoEncode.cs | 16 +++-- .../FfmpegBuilder_BasicTests.cs | 35 +++++++++++ 5 files changed, 82 insertions(+), 27 deletions(-) diff --git a/FileFlows.Plugin.dll b/FileFlows.Plugin.dll index 7981ba6fa837716ea6d760b28167df022022a9f2..780c4a66fc01071be5913ace2e2b0a9ee9796a1a 100644 GIT binary patch delta 114 zcmZoT!`^U)eL@Gze=Wn;jXhg?74$ zJ^jjE#sGm>@A=R3I!k@F&ShEeUTb!By2(ApU!9}g6*4%xoq0;2{mi*3`Y zebcYpWegD5F`ZSk{YSOaq^WGlla$v>PB*#77_0yly%Yo$1*v}}>1O)-&tl&utHSc_ K%kMEpvI79DCNq}+ diff --git a/FileFlows.Plugin.pdb b/FileFlows.Plugin.pdb index 5176b9afc74540752a1c2040b7a3ab2b6913a030..4fe983bf1873fd3b3a08a26c75a0b492fa0370fd 100644 GIT binary patch delta 107 zcmca{pYg_h#tAhdvEK8a=XI9)Y@N%p-o4iBYUqYX-5Vz?P*a%wOrFTY&x8)kWORe*(GsGDRceHwUO+F_mCqU}j)ss$_%^3~UTc!7AJgyhf94Vyzj^ KZmx(;5CQ() + if (hw == null) + continue; + if (CanUseHardwareEncoding.DisabledByVariables(Args, string.Join(" ", hw))) + continue; + try + { + var arguments = new List() { "-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); diff --git a/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderVideoEncode.cs b/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderVideoEncode.cs index 85082976..aaeb3fc3 100644 --- a/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderVideoEncode.cs +++ b/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderVideoEncode.cs @@ -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"; + /// /// 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 /// [DefaultValue(true)] [Boolean(2)] - [ConditionEquals(nameof(Codec), CODEC_AV1, inverse: true)] + [ConditionEquals(nameof(Codec), "/av1/", inverse: true)] public bool HardwareEncoding { get; set; } /// @@ -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 AV1(NodeParameters args, int quality) + private static IEnumerable 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 parameters = new List(); parameters.AddRange(AV1_CPU(quality)); + if (tenBit) + parameters.AddRange(new [] { "-pix_fmt:v:{index}", "yuv420p10le" }); return parameters; } diff --git a/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs b/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs index dee0aa43..69ebcb32 100644 --- a/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs +++ b/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs @@ -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() {