From 0f052631a44250685c1b85c04109809cd2f269ee Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sun, 7 Mar 2021 06:22:18 -0600 Subject: [PATCH] try to fix vaapi by always using nv12 or vaapi pixel format (#42) --- .../FFmpeg/FFmpegComplexFilterBuilderTests.cs | 25 +++++++++++-------- .../FFmpeg/FFmpegComplexFilterBuilder.cs | 21 ++++++++++------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs index 48385fc9d..f10799e76 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs @@ -209,7 +209,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg true, true, false, - "[0:v]scale_npp=1920:1000:format=yuv420p,hwdownload,setsar=1,hwupload[v]", + "[0:v]scale_npp=1920:1000,hwdownload,format=nv12,setsar=1,hwupload[v]", "[v]")] [TestCase( true, @@ -221,13 +221,13 @@ namespace ErsatzTV.Core.Tests.FFmpeg true, true, true, - "[0:v]scale_npp=1920:1000:format=yuv420p,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]scale_npp=1920:1000,hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] [TestCase( false, true, false, - "[0:v]scale_npp=1920:1000:format=yuv420p,hwdownload,setsar=1,hwupload[v]", + "[0:v]scale_npp=1920:1000,hwdownload,format=nv12,setsar=1,hwupload[v]", "[v]")] [TestCase( false, @@ -239,7 +239,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg false, true, true, - "[0:v]scale_npp=1920:1000:format=yuv420p,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]scale_npp=1920:1000,hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] public void Should_Return_NVENC_Video_Filter( bool deinterlace, @@ -280,32 +280,37 @@ namespace ErsatzTV.Core.Tests.FFmpeg true, true, false, - "[0:v]deinterlace_vaapi,scale_vaapi=w=1920:h=1000,hwdownload,setsar=1,hwupload[v]", + "[0:v]deinterlace_vaapi,scale_vaapi=w=1920:h=1000,hwdownload,format=nv12|vaapi,setsar=1,hwupload[v]", "[v]")] [TestCase( true, false, true, - "[0:v]deinterlace_vaapi,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]deinterlace_vaapi,hwdownload,format=nv12|vaapi,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] [TestCase( true, true, true, - "[0:v]deinterlace_vaapi,scale_vaapi=w=1920:h=1000,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]deinterlace_vaapi,scale_vaapi=w=1920:h=1000,hwdownload,format=nv12|vaapi,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[v]")] + [TestCase( + false, + true, + false, + "[0:v]scale_vaapi=w=1920:h=1000,hwdownload,format=nv12|vaapi,setsar=1,hwupload[v]", "[v]")] - [TestCase(false, true, false, "[0:v]scale_vaapi=w=1920:h=1000,hwdownload,setsar=1,hwupload[v]", "[v]")] [TestCase( false, false, true, - "[0:v]hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]hwdownload,format=nv12|vaapi,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] [TestCase( false, true, true, - "[0:v]scale_vaapi=w=1920:h=1000,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]scale_vaapi=w=1920:h=1000,hwdownload,format=nv12|vaapi,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] public void Should_Return_VAAPI_Video_Filter( bool deinterlace, diff --git a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs index 19e2d0187..7fe060a14 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs @@ -89,7 +89,7 @@ namespace ErsatzTV.Core.FFmpeg string filter = acceleration switch { HardwareAccelerationKind.Qsv => $"scale_qsv=w={size.Width}:h={size.Height}", - HardwareAccelerationKind.Nvenc => $"scale_npp={size.Width}:{size.Height}:format=yuv420p", + HardwareAccelerationKind.Nvenc => $"scale_npp={size.Width}:{size.Height}", HardwareAccelerationKind.Vaapi => $"scale_vaapi=w={size.Width}:h={size.Height}", _ => $"scale={size.Width}:{size.Height}:flags=fast_bilinear" }; @@ -105,11 +105,12 @@ namespace ErsatzTV.Core.FFmpeg if (acceleration != HardwareAccelerationKind.None) { filterQueue.Add("hwdownload"); - if (_scaleToSize.IsNone && acceleration == HardwareAccelerationKind.Nvenc || - acceleration == HardwareAccelerationKind.Qsv) + string format = acceleration switch { - filterQueue.Add("format=nv12"); - } + HardwareAccelerationKind.Vaapi => "format=nv12|vaapi", + _ => "format=nv12" + }; + filterQueue.Add(format); } filterQueue.Add("setsar=1"); @@ -119,8 +120,12 @@ namespace ErsatzTV.Core.FFmpeg if ((_scaleToSize.IsSome || _padToSize.IsSome) && acceleration != HardwareAccelerationKind.None) { - filterQueue.Add( - acceleration == HardwareAccelerationKind.Qsv ? "hwupload=extra_hw_frames=64" : "hwupload"); + string upload = acceleration switch + { + HardwareAccelerationKind.Qsv => "hwupload=extra_hw_frames=64", + _ => "hwupload" + }; + filterQueue.Add(upload); } if (filterQueue.Any()) @@ -128,7 +133,7 @@ namespace ErsatzTV.Core.FFmpeg // TODO: any audio filter if (_audioDuration.IsSome) { - complexFilter.Append(";"); + complexFilter.Append(';'); } complexFilter.Append($"[{videoLabel}]");