From 55d1871d94535b5c58b00d68ab6a9df4535b9aa5 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Thu, 25 Nov 2021 13:04:13 -0600 Subject: [PATCH] re-enable hardware acceleration for songs (#499) --- .../FFmpeg/FFmpegComplexFilterBuilder.cs | 29 +++++++++++++++---- ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs | 9 ------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs index c52875560..daecc14dd 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs @@ -143,9 +143,9 @@ namespace ErsatzTV.Core.FFmpeg HardwareAccelerationKind acceleration = _hardwareAccelerationKind.IfNone(HardwareAccelerationKind.None); bool isHardwareDecode = acceleration switch { - HardwareAccelerationKind.Vaapi => _inputCodec != "mpeg4", - HardwareAccelerationKind.Nvenc => true, - HardwareAccelerationKind.Qsv => true, + HardwareAccelerationKind.Vaapi => !isSong && _inputCodec != "mpeg4", + HardwareAccelerationKind.Nvenc => !isSong, + HardwareAccelerationKind.Qsv => !isSong, _ => false }; @@ -168,6 +168,19 @@ namespace ErsatzTV.Core.FFmpeg bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None && !isHardwareDecode && (_deinterlace || _scaleToSize.IsSome); + + if (isSong) + { + switch (acceleration) + { + case HardwareAccelerationKind.Qsv: + videoFilterQueue.Add("format=nv12"); + break; + default: + videoFilterQueue.Add("format=yuv420p"); + break; + } + } switch (usesHardwareFilters, false, acceleration) { @@ -220,6 +233,7 @@ namespace ErsatzTV.Core.FFmpeg HardwareAccelerationKind.Qsv => $"scale_qsv=w={size.Width}:h={size.Height}", HardwareAccelerationKind.Nvenc when _pixelFormat is "yuv420p10le" => $"hwupload_cuda,scale_cuda={size.Width}:{size.Height}", + HardwareAccelerationKind.Nvenc when isSong => $"scale_cuda={size.Width}:{size.Height}:format=yuv420p", HardwareAccelerationKind.Nvenc => $"scale_cuda={size.Width}:{size.Height}", HardwareAccelerationKind.Vaapi => $"scale_vaapi=format=nv12:w={size.Width}:h={size.Height}", _ => $"scale={size.Width}:{size.Height}:flags=fast_bilinear" @@ -244,6 +258,8 @@ namespace ErsatzTV.Core.FFmpeg HardwareAccelerationKind.Vaapi => "format=nv12|vaapi", HardwareAccelerationKind.Nvenc when _pixelFormat == "yuv420p10le" => "format=p010le,format=nv12", + HardwareAccelerationKind.Qsv when isSong => "format=nv12,format=yuv420p", + _ when isSong => "format=yuv420p", _ => "format=nv12" }; videoFilterQueue.Add(format); @@ -397,9 +413,12 @@ namespace ErsatzTV.Core.FFmpeg if (usesSoftwareFilters && acceleration != HardwareAccelerationKind.None) { - switch (acceleration) + switch (isSong, acceleration) { - case HardwareAccelerationKind.Qsv: + case (true, HardwareAccelerationKind.Nvenc): + complexFilter.Append(",hwupload_cuda"); + break; + case (_, HardwareAccelerationKind.Qsv): complexFilter.Append(",format=yuv420p,hwupload=extra_hw_frames=64"); break; default: diff --git a/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs b/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs index c80db7ad7..c7692f44d 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs @@ -64,15 +64,6 @@ namespace ErsatzTV.Core.FFmpeg inPoint, outPoint); - if (videoVersion is BackgroundImageMediaVersion) - { - FFmpegPlaybackSettings errorSettings = - _playbackSettingsCalculator.CalculateErrorSettings(channel.FFmpegProfile); - - playbackSettings.HardwareAcceleration = errorSettings.HardwareAcceleration; - playbackSettings.VideoCodec = errorSettings.VideoCodec; - } - Option watermarkOptions = await GetWatermarkOptions(channel, globalWatermark, videoVersion);