From e40d192aeac4cf3431f6652293620bfe001f6616 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Sat, 22 Nov 2025 12:35:29 -0600 Subject: [PATCH] limit hw sw decode downgrade polaris (#2654) * use a more precise carve out for polaris workaround * fix decode capability ordering --- CHANGELOG.md | 2 +- .../Capabilities/VaapiHardwareCapabilities.cs | 7 ++---- .../Pipeline/VaapiPipelineBuilder.cs | 22 ++++++++++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e06377dd7..b104e8f13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,7 +83,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Add toggle to hide/show disabled channels in channel list - Add disabled text color and `(D)` and `(H)` labels for disabled and hidden channels in channel list - Graphics engine: fix subtitle path escaping and font loading -- Fix corrupt output (green artifacts) when decoding 10-bit content using AMD Polaris GPUs +- Fix corrupt output (green artifacts) when decoding certain 10-bit content using AMD Polaris GPUs ### Changed - Classic schedules: `Refresh` classic playouts from playout list; do not `Reset` them diff --git a/ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs b/ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs index 4a4c9957a..77b540c27 100644 --- a/ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs +++ b/ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs @@ -12,6 +12,8 @@ public class VaapiHardwareCapabilities( { public int EntrypointCount => profileEntrypoints.Count; + public string Generation => generation; + public FFmpegCapability CanDecode( string videoFormat, Option videoProfile, @@ -20,16 +22,11 @@ public class VaapiHardwareCapabilities( { int bitDepth = maybePixelFormat.Map(pf => pf.BitDepth).IfNone(8); - bool isPolaris = generation.Contains("polaris", StringComparison.OrdinalIgnoreCase); - bool isHardware = (videoFormat, videoProfile.IfNone(string.Empty).ToLowerInvariant()) switch { // no hardware decoding of 10-bit h264 (VideoFormat.H264, _) when bitDepth == 10 => false, - // skip polaris hardware decoding 10-bit - (_, _) when bitDepth == 10 && isPolaris => false, - // no hardware decoding of h264 baseline profile (VideoFormat.H264, "baseline" or "66") => false, diff --git a/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs b/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs index 16b5bb5e4..562240754 100644 --- a/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs +++ b/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs @@ -85,6 +85,22 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder throw new NotSupportedException("AV1 output is only supported with HLS Segmenter (fmp4)"); } + // use software decoding with an extensive pipeline + if (context is { HasSubtitleOverlay: true, HasWatermark: true }) + { + decodeCapability = FFmpegCapability.Software; + } + + // use software decode with irregular dimensions and AMD Polaris + if (videoStream.FrameSize.Width % 32 != 0 && + _hardwareCapabilities is VaapiHardwareCapabilities vaapiCapabilities) + { + if (vaapiCapabilities.Generation.Contains("polaris", StringComparison.OrdinalIgnoreCase)) + { + decodeCapability = FFmpegCapability.Software; + } + } + foreach (string vaapiDevice in ffmpegState.VaapiDevice) { pipelineSteps.Add(new VaapiHardwareAccelerationOption(vaapiDevice, decodeCapability)); @@ -95,12 +111,6 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder } } - // use software decoding with an extensive pipeline - if (context is { HasSubtitleOverlay: true, HasWatermark: true }) - { - decodeCapability = FFmpegCapability.Software; - } - // disable auto scaling when using hw encoding if (encodeCapability is FFmpegCapability.Hardware) {