Browse Source

use a more precise carve out for polaris workaround

pull/2654/head
Jason Dove 8 months ago
parent
commit
cdab44fd65
No known key found for this signature in database
  1. 2
      CHANGELOG.md
  2. 7
      ErsatzTV.FFmpeg/Capabilities/VaapiHardwareCapabilities.cs
  3. 10
      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,

10
ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

@ -101,6 +101,16 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder @@ -101,6 +101,16 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder
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;
}
}
// disable auto scaling when using hw encoding
if (encodeCapability is FFmpegCapability.Hardware)
{

Loading…
Cancel
Save