73 lines
2.0 KiB
C#
73 lines
2.0 KiB
C#
using ErsatzTV.FFmpeg.Capabilities;
|
|
using ErsatzTV.FFmpeg.Format;
|
|
|
|
namespace ErsatzTV.FFmpeg.GlobalOption.HardwareAcceleration;
|
|
|
|
public class QsvHardwareAccelerationOption(Option<string> device, FFmpegCapability decodeCapability) : GlobalOption
|
|
{
|
|
// TODO: read this from ffmpeg output
|
|
private readonly List<string> _supportedFFmpegFormats = new()
|
|
{
|
|
FFmpegFormat.NV12,
|
|
FFmpegFormat.P010LE
|
|
};
|
|
|
|
public override string[] GlobalOptions
|
|
{
|
|
get
|
|
{
|
|
var result = new List<string>
|
|
{
|
|
"-hwaccel", "qsv",
|
|
"-hwaccel_output_format", "qsv"
|
|
};
|
|
|
|
if (decodeCapability is not FFmpegCapability.Hardware)
|
|
{
|
|
result.Clear();
|
|
}
|
|
|
|
var deviceConfigured = false;
|
|
foreach (string qsvDevice in device)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(qsvDevice))
|
|
{
|
|
result.AddRange(
|
|
[
|
|
"-init_hw_device", $"vaapi=va:{qsvDevice}",
|
|
"-init_hw_device", "qsv=hw@va"
|
|
]);
|
|
deviceConfigured = true;
|
|
}
|
|
}
|
|
|
|
if (!deviceConfigured)
|
|
{
|
|
result.AddRange(["-init_hw_device", "qsv=hw"]);
|
|
}
|
|
|
|
result.AddRange(["-filter_hw_device", "hw"]);
|
|
|
|
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) };
|
|
}
|
|
}
|