From ca5d303ac787aeca00d40971ed1aea866dc51d1a Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Tue, 31 May 2022 06:07:50 -0500 Subject: [PATCH] fix qsv encoder regression and memory errors (#828) * fix qsv encoders; only use 64 extra hw frames * update changelog --- CHANGELOG.md | 1 + ErsatzTV.FFmpeg/Encoder/Qsv/EncoderH264Qsv.cs | 6 +++--- ErsatzTV.FFmpeg/Encoder/Qsv/EncoderHevcQsv.cs | 6 +++--- ErsatzTV.FFmpeg/Filter/HardwareUploadFilter.cs | 2 +- ErsatzTV.FFmpeg/Filter/Qsv/DeinterlaceQsvFilter.cs | 2 +- ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs | 4 ++-- ErsatzTV.FFmpeg/Filter/SubtitleHardwareUploadFilter.cs | 2 +- ErsatzTV.FFmpeg/Filter/WatermarkHardwareUploadFilter.cs | 2 +- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf9505e7d..a71cf541e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Additional fix for duplicate `Other Videos` entries; trash may need to be emptied one last time after upgrading - Fix watermark opacity in cultures where `,` is a decimal separator - Rework playlist filtering to avoid empty playlist responses +- Fix some QSV/VAAPI memory errors by always requesting 64 extra hardware frames ### Added - Enable QSV hardware acceleration for vaapi docker images diff --git a/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderH264Qsv.cs b/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderH264Qsv.cs index c047635e2..bbcf4e67c 100644 --- a/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderH264Qsv.cs +++ b/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderH264Qsv.cs @@ -20,7 +20,7 @@ public class EncoderH264Qsv : EncoderBase public override string Name => "h264_qsv"; public override StreamKind Kind => StreamKind.Video; - public override IList OutputOptions => new[] { "-low_power", "0" }; + public override IList OutputOptions => new[] { "-c:v", "h264_qsv", "-low_power", "0" }; // need to upload if we're still in software and a watermark is used public override string Filter @@ -37,11 +37,11 @@ public class EncoderH264Qsv : EncoderBase // pixel format should already be converted to a supported format by QsvHardwareAccelerationOption foreach (IPixelFormat pixelFormat in _currentState.PixelFormat) { - return $"format={pixelFormat.FFmpegName},hwupload=extra_hw_frames=128"; + return $"format={pixelFormat.FFmpegName},hwupload=extra_hw_frames=64"; } // default to nv12 - return "format=nv12,hwupload=extra_hw_frames=128"; + return "format=nv12,hwupload=extra_hw_frames=64"; } } diff --git a/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderHevcQsv.cs b/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderHevcQsv.cs index 70a49e1cb..325e431d6 100644 --- a/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderHevcQsv.cs +++ b/ErsatzTV.FFmpeg/Encoder/Qsv/EncoderHevcQsv.cs @@ -20,7 +20,7 @@ public class EncoderHevcQsv : EncoderBase public override string Name => "hevc_qsv"; public override StreamKind Kind => StreamKind.Video; - public override IList OutputOptions => new[] { "-low_power", "0" }; + public override IList OutputOptions => new[] { "-c:v", "hevc_qsv", "-low_power", "0" }; // need to upload if we're still in software and a watermark is used public override string Filter @@ -37,11 +37,11 @@ public class EncoderHevcQsv : EncoderBase // pixel format should already be converted to a supported format by QsvHardwareAccelerationOption foreach (IPixelFormat pixelFormat in _currentState.PixelFormat) { - return $"format={pixelFormat.FFmpegName},hwupload=extra_hw_frames=128"; + return $"format={pixelFormat.FFmpegName},hwupload=extra_hw_frames=64"; } // default to nv12 - return "format=nv12,hwupload=extra_hw_frames=128"; + return "format=nv12,hwupload=extra_hw_frames=64"; } } diff --git a/ErsatzTV.FFmpeg/Filter/HardwareUploadFilter.cs b/ErsatzTV.FFmpeg/Filter/HardwareUploadFilter.cs index 556465f51..41b4ac0de 100644 --- a/ErsatzTV.FFmpeg/Filter/HardwareUploadFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/HardwareUploadFilter.cs @@ -10,7 +10,7 @@ public class HardwareUploadFilter : BaseFilter { HardwareAccelerationMode.None => string.Empty, HardwareAccelerationMode.Nvenc => "hwupload_cuda", - HardwareAccelerationMode.Qsv => "hwupload=extra_hw_frames=128", + HardwareAccelerationMode.Qsv => "hwupload=extra_hw_frames=64", HardwareAccelerationMode.Vaapi => "format=nv12|vaapi,hwupload", _ => "hwupload" }; diff --git a/ErsatzTV.FFmpeg/Filter/Qsv/DeinterlaceQsvFilter.cs b/ErsatzTV.FFmpeg/Filter/Qsv/DeinterlaceQsvFilter.cs index 5b8c1cee8..3d36d4e9d 100644 --- a/ErsatzTV.FFmpeg/Filter/Qsv/DeinterlaceQsvFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/Qsv/DeinterlaceQsvFilter.cs @@ -10,7 +10,7 @@ public class DeinterlaceQsvFilter : BaseFilter // deinterlace_qsv seems to only support nv12, not p010le public override string Filter => _currentState.FrameDataLocation == FrameDataLocation.Software - ? "format=nv12,hwupload=extra_hw_frames=128,deinterlace_qsv" + ? "format=nv12,hwupload=extra_hw_frames=64,deinterlace_qsv" : "deinterlace_qsv"; public override FrameState NextState(FrameState currentState) diff --git a/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs b/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs index da946f78a..4fe963428 100644 --- a/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs @@ -49,10 +49,10 @@ public class ScaleQsvFilter : BaseFilter string initialPixelFormat = _currentState.PixelFormat.Match(pf => pf.FFmpegName, FFmpegFormat.NV12); if (!string.IsNullOrWhiteSpace(scale)) { - return $"format={initialPixelFormat},hwupload=extra_hw_frames=128,{scale}"; + return $"format={initialPixelFormat},hwupload=extra_hw_frames=64,{scale}"; } - return $"format={initialPixelFormat},hwupload=extra_hw_frames=128"; + return $"format={initialPixelFormat},hwupload=extra_hw_frames=64"; } } diff --git a/ErsatzTV.FFmpeg/Filter/SubtitleHardwareUploadFilter.cs b/ErsatzTV.FFmpeg/Filter/SubtitleHardwareUploadFilter.cs index 0dfbe0fd4..30ac95f76 100644 --- a/ErsatzTV.FFmpeg/Filter/SubtitleHardwareUploadFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/SubtitleHardwareUploadFilter.cs @@ -16,7 +16,7 @@ public class SubtitleHardwareUploadFilter : BaseFilter { HardwareAccelerationMode.None => string.Empty, HardwareAccelerationMode.Nvenc => "hwupload_cuda", - HardwareAccelerationMode.Qsv => "hwupload=extra_hw_frames=128", + HardwareAccelerationMode.Qsv => "hwupload=extra_hw_frames=64", // leave vaapi in software since we don't (yet) use overlay_vaapi HardwareAccelerationMode.Vaapi when _currentState.FrameDataLocation == FrameDataLocation.Software => diff --git a/ErsatzTV.FFmpeg/Filter/WatermarkHardwareUploadFilter.cs b/ErsatzTV.FFmpeg/Filter/WatermarkHardwareUploadFilter.cs index 7e6e6e3e2..01c75bc0e 100644 --- a/ErsatzTV.FFmpeg/Filter/WatermarkHardwareUploadFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/WatermarkHardwareUploadFilter.cs @@ -15,7 +15,7 @@ public class WatermarkHardwareUploadFilter : BaseFilter { HardwareAccelerationMode.None => string.Empty, HardwareAccelerationMode.Nvenc => "hwupload_cuda", - HardwareAccelerationMode.Qsv => "hwupload=extra_hw_frames=128", + HardwareAccelerationMode.Qsv => "hwupload=extra_hw_frames=64", // leave vaapi in software since we don't (yet) use overlay_vaapi HardwareAccelerationMode.Vaapi when _currentState.FrameDataLocation == FrameDataLocation.Software =>