diff --git a/CHANGELOG.md b/CHANGELOG.md index f195c5444..aa1096fe9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,7 +64,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix deco dead air fallback selection and duration on mirror channels - Fix fallback filler duration on mirror channels - Fix slow startup caused by check for overlapping playout items -- Fix green line in *most* cases when overlaying content using NVIDIA acceleration +- Fix green line in *most* cases when overlaying content using NVIDIA acceleration and H264 output ### Changed - Filler presets: use separate text fields for `hours`, `minutes` and `seconds` duration diff --git a/ErsatzTV.FFmpeg/Encoder/Nvenc/EncoderHevcNvenc.cs b/ErsatzTV.FFmpeg/Encoder/Nvenc/EncoderHevcNvenc.cs index 66602af28..a61169c26 100644 --- a/ErsatzTV.FFmpeg/Encoder/Nvenc/EncoderHevcNvenc.cs +++ b/ErsatzTV.FFmpeg/Encoder/Nvenc/EncoderHevcNvenc.cs @@ -7,10 +7,12 @@ public class EncoderHevcNvenc : EncoderBase { private readonly bool _bFrames; private readonly Option _maybeVideoPreset; + private readonly bool _allowBFrames; - public EncoderHevcNvenc(IHardwareCapabilities hardwareCapabilities, Option maybeVideoPreset) + public EncoderHevcNvenc(IHardwareCapabilities hardwareCapabilities, Option maybeVideoPreset, bool allowBFrames) { _maybeVideoPreset = maybeVideoPreset; + _allowBFrames = allowBFrames; if (hardwareCapabilities is NvidiaHardwareCapabilities nvidia) { _bFrames = nvidia.HevcBFrames; @@ -28,7 +30,7 @@ public class EncoderHevcNvenc : EncoderBase { "-c:v", "hevc_nvenc", "-tag:v", "hvc1", - "-b_ref_mode", _bFrames ? "1" : "0" + "-b_ref_mode", _allowBFrames && _bFrames ? "1" : "0" }; foreach (string videoPreset in _maybeVideoPreset) diff --git a/ErsatzTV.FFmpeg/OutputOption/NvidiaGreenLineWorkaroundFilter.cs b/ErsatzTV.FFmpeg/OutputOption/NvidiaGreenLineWorkaroundFilter.cs index 9e377b92a..8cfecb9c7 100644 --- a/ErsatzTV.FFmpeg/OutputOption/NvidiaGreenLineWorkaroundFilter.cs +++ b/ErsatzTV.FFmpeg/OutputOption/NvidiaGreenLineWorkaroundFilter.cs @@ -8,7 +8,7 @@ public class NvidiaGreenLineWorkaroundFilter(string videoFormat, FrameSize frame { get { - if (videoFormat is not (VideoFormat.Hevc or VideoFormat.H264)) + if (videoFormat is not VideoFormat.H264) { return []; } diff --git a/ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs b/ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs index 684700782..fedc5fe99 100644 --- a/ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs +++ b/ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs @@ -307,7 +307,7 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder (ffmpegState.EncoderHardwareAccelerationMode, desiredState.VideoFormat) switch { (HardwareAccelerationMode.Nvenc, VideoFormat.Hevc) => - new EncoderHevcNvenc(_hardwareCapabilities, desiredState.VideoPreset), + new EncoderHevcNvenc(_hardwareCapabilities, desiredState.VideoPreset, desiredState.AllowBFrames), (HardwareAccelerationMode.Nvenc, VideoFormat.H264) => new EncoderH264Nvenc(desiredState.VideoProfile, desiredState.VideoPreset),