using Microsoft.Extensions.Logging; namespace ErsatzTV.FFmpeg.Option.HardwareAcceleration; public static class AvailableHardwareAccelerationOptions { public static Option ForMode( HardwareAccelerationMode mode, Option gpuDevice, ILogger logger) => mode switch { HardwareAccelerationMode.Nvenc => new CudaHardwareAccelerationOption(), HardwareAccelerationMode.Qsv => new QsvHardwareAccelerationOption(gpuDevice), HardwareAccelerationMode.Vaapi => GetVaapiAcceleration(gpuDevice, logger), HardwareAccelerationMode.VideoToolbox => new VideoToolboxHardwareAccelerationOption(), HardwareAccelerationMode.Amf => new AmfHardwareAccelerationOption(), HardwareAccelerationMode.None => Option.None, _ => LogUnknownMode(mode, logger) }; private static Option GetVaapiAcceleration(Option vaapiDevice, ILogger logger) { foreach (string device in vaapiDevice) { return new VaapiHardwareAccelerationOption(device); } logger.LogWarning("VAAPI device name is missing; falling back to software mode"); return Option.None; } private static Option LogUnknownMode(HardwareAccelerationMode mode, ILogger logger) { logger.LogWarning("Unexpected hardware acceleration mode {AccelMode}; may have playback issues", mode); return Option.None; } }