Browse Source

limit hw sw decode downgrade polaris (#2654)

* use a more precise carve out for polaris workaround

* fix decode capability ordering
pull/2656/head
Jason Dove 1 month ago committed by GitHub
parent
commit
e40d192aea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 7
      ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs
  3. 22
      ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

2
CHANGELOG.md

@ -83,7 +83,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -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

7
ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs

@ -12,6 +12,8 @@ public class VaapiHardwareCapabilities( @@ -12,6 +12,8 @@ public class VaapiHardwareCapabilities(
{
public int EntrypointCount => profileEntrypoints.Count;
public string Generation => generation;
public FFmpegCapability CanDecode(
string videoFormat,
Option<string> videoProfile,
@ -20,16 +22,11 @@ public class VaapiHardwareCapabilities( @@ -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,

22
ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

@ -85,6 +85,22 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder @@ -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 @@ -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)
{

Loading…
Cancel
Save