Add Intel QuickSync (QSV) encoder support

This commit is contained in:
N00MKRAD 2023-10-27 10:25:21 +02:00
parent b782c8334d
commit 8749f425de
4 changed files with 48 additions and 2 deletions

View File

@ -12,7 +12,7 @@
public class Encoding
{
public enum Codec { H264, H265, AV1, VP9, ProRes, Gif, Png, Jpeg, Webp, Ffv1, Huffyuv, Magicyuv, Rawvideo }
public enum Encoder { X264, X265, SvtAv1, VpxVp9, Nvenc264, Nvenc265, NvencAv1, Amf264, Amf265, ProResKs, Gif, Png, Jpeg, Webp, Ffv1, Huffyuv, Magicyuv, Rawvideo }
public enum Encoder { X264, X265, SvtAv1, VpxVp9, Nvenc264, Nvenc265, NvencAv1, Amf264, Amf265, Qsv264, Qsv265, ProResKs, Gif, Png, Jpeg, Webp, Ffv1, Huffyuv, Magicyuv, Rawvideo }
public enum PixelFormat { Yuv420P, Yuva420P, Yuv420P10Le, Yuv422P, Yuv422P10Le, Yuv444P, Yuv444P10Le, Yuva444P10Le, Rgb24, Rgba, Pal8 };
public class Quality

View File

@ -28,6 +28,8 @@ namespace Flowframes.Data
{ Enums.Encoding.Encoder.NvencAv1.ToString(), "AV1 NVENC" },
{ Enums.Encoding.Encoder.Amf264.ToString(), "h264 AMF" },
{ Enums.Encoding.Encoder.Amf265.ToString(), "h265 AMF" },
{ Enums.Encoding.Encoder.Qsv264.ToString(), "h264 QuickSync" },
{ Enums.Encoding.Encoder.Qsv265.ToString(), "h265 QuickSync" },
{ Enums.Encoding.Encoder.Gif.ToString(), "GIF" },
{ Enums.Encoding.Encoder.Png.ToString(), "PNG" },
{ Enums.Encoding.Encoder.Jpeg.ToString(), "JPEG" },

View File

@ -271,6 +271,18 @@ namespace Flowframes.Media
args.Add($"-b:v 0 -rc cqp -qp_i {crf} -qp_p {crf} -quality 2");
}
if (enc == Encoder.Qsv264)
{
int crf = GetCrf(settings);
args.Add($"-preset veryslow -global_quality {crf}");
}
if (enc == Encoder.Qsv265)
{
int crf = GetCrf(settings);
args.Add($"-preset veryslow -global_quality {crf}");
}
if (enc == Encoder.ProResKs)
{
var profile = ParseUtils.GetEnum<Quality.ProResProfile>(settings.Quality, true, Strings.VideoQuality);

View File

@ -136,6 +136,32 @@ namespace Flowframes.MiscUtils
};
}
if (encoder == Encoder.Qsv264)
{
return new EncoderInfoVideo
{
Codec = Codec.H264,
Name = "h264_qsv",
PixelFormats = new List<PixFmt>() { PixFmt.Yuv420P },
QualityLevels = ParseUtils.GetEnumStrings<Quality.Common>(),
QualityDefault = (int)Quality.Common.VeryHigh,
HwAccelerated = true,
};
}
if (encoder == Encoder.Qsv265)
{
return new EncoderInfoVideo
{
Codec = Codec.H265,
Name = "hevc_qsv",
PixelFormats = new List<PixFmt>() { PixFmt.Yuv420P },
QualityLevels = ParseUtils.GetEnumStrings<Quality.Common>(),
QualityDefault = (int)Quality.Common.VeryHigh,
HwAccelerated = true,
};
}
if (encoder == Encoder.ProResKs)
{
return new EncoderInfoVideo
@ -274,7 +300,11 @@ namespace Flowframes.MiscUtils
var allEncoders = Enum.GetValues(typeof(Encoder)).Cast<Encoder>();
var supportedCodecs = GetSupportedCodecs(format);
var availableEncoders = supportedCodecs.SelectMany(codec => allEncoders.Where(enc => enc.GetInfo().Codec == codec)).ToList();
RemoveIncompatibleEncoders(ref availableEncoders, new[] { Encoder.Nvenc264, Encoder.Nvenc265, Encoder.NvencAv1, Encoder.Amf264, Encoder.Amf265 });
RemoveIncompatibleEncoders(ref availableEncoders, new[] {
Encoder.Nvenc264, Encoder.Nvenc265, Encoder.NvencAv1,
Encoder.Amf264, Encoder.Amf265,
Encoder.Qsv264, Encoder.Qsv265,
});
return availableEncoders;
}
@ -306,6 +336,8 @@ namespace Flowframes.MiscUtils
multiplier = 1.15f;
if (encoder == Encoder.NvencAv1)
multiplier = 1.3f;
if (encoder == Encoder.Qsv265)
multiplier = 0.8f;
return (baseCrf * multiplier).RoundToInt();
}