Files
ersatztv/ErsatzTV.FFmpeg/GlobalOption/HardwareAcceleration/QsvHardwareAccelerationOption.cs
T
Jason DoveandGitHub 9471cb55dd upgrade from dotnet 7 to dotnet 8 (#1529)
* upgrade sdk

* fix warnings in ersatztv.ffmpeg

* fix warnings in ersatztv.core

* fix warnings in ersatztv.infrastructure

* fix warnings in ersatztv.application

* disable analysis for migrations projects

* fix warnings in ersatztv.scanner

* fix warnings in ersatztv

* upgrade project framework

* update github actions and dockerfiles
2023-12-30 13:29:57 -06:00

67 lines
1.9 KiB
C#

using ErsatzTV.FFmpeg.Format;
namespace ErsatzTV.FFmpeg.GlobalOption.HardwareAcceleration;
public class QsvHardwareAccelerationOption : GlobalOption
{
private readonly Option<string> _qsvDevice;
// TODO: read this from ffmpeg output
private readonly List<string> _supportedFFmpegFormats = new()
{
FFmpegFormat.NV12,
FFmpegFormat.P010LE
};
public QsvHardwareAccelerationOption(Option<string> qsvDevice) => _qsvDevice = qsvDevice;
public override string[] GlobalOptions
{
get
{
string[] initDevices = OperatingSystem.IsWindows()
? new[] { "-init_hw_device", "d3d11va=hw:,vendor=0x8086", "-filter_hw_device", "hw" }
: new[] { "-init_hw_device", "qsv=hw", "-filter_hw_device", "hw" };
var result = new List<string>
{
"-hwaccel", "qsv",
"-hwaccel_output_format", "qsv"
};
if (OperatingSystem.IsLinux())
{
foreach (string qsvDevice in _qsvDevice)
{
if (!string.IsNullOrWhiteSpace(qsvDevice))
{
result.AddRange(new[] { "-qsv_device", qsvDevice });
}
}
}
result.AddRange(initDevices);
return result.ToArray();
}
}
// qsv encoders want nv12
public override FrameState NextState(FrameState currentState)
{
FrameState result = currentState;
foreach (IPixelFormat pixelFormat in currentState.PixelFormat)
{
if (_supportedFFmpegFormats.Contains(pixelFormat.FFmpegName))
{
return result;
}
return result with { PixelFormat = new PixelFormatNv12(pixelFormat.Name) };
}
return result with { PixelFormat = new PixelFormatNv12(new PixelFormatUnknown().Name) };
}
}