diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs index 015099c13..b992fa39f 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs @@ -119,32 +119,32 @@ namespace ErsatzTV.Core.Tests.FFmpeg true, true, false, - "[0:v]deinterlace_qsv,scale_qsv=w=1920:h=1000,hwdownload,setsar=1,hwupload[v]", + "[0:v]deinterlace_qsv,scale_qsv=w=1920:h=1000,hwdownload,format=nv12,setsar=1,hwupload=extra_hw_frames=64[v]", "[v]")] [TestCase( true, false, true, - "[0:v]deinterlace_qsv,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]deinterlace_qsv,hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload=extra_hw_frames=64[v]", "[v]")] [TestCase( true, true, true, - "[0:v]deinterlace_qsv,scale_qsv=w=1920:h=1000,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]deinterlace_qsv,scale_qsv=w=1920:h=1000,hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload=extra_hw_frames=64[v]", "[v]")] - [TestCase(false, true, false, "[0:v]scale_qsv=w=1920:h=1000,hwdownload,setsar=1,hwupload[v]", "[v]")] + [TestCase(false, true, false, "[0:v]scale_qsv=w=1920:h=1000,hwdownload,format=nv12,setsar=1,hwupload=extra_hw_frames=64[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,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload=extra_hw_frames=64[v]", "[v]")] [TestCase( false, true, true, - "[0:v]scale_qsv=w=1920:h=1000,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]scale_qsv=w=1920:h=1000,hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload=extra_hw_frames=64[v]", "[v]")] public void Should_Return_QSV_Video_Filter( bool deinterlace, @@ -200,7 +200,6 @@ namespace ErsatzTV.Core.Tests.FFmpeg // true, // "[0:v]yadif_cuda,scale_npp=1920:1000:format=yuv420p,hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", // "[v]")] - [TestCase(true, false, false, "[0:v][v]", "[v]")] [TestCase( true, true, @@ -211,7 +210,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg true, false, true, - "[0:v]hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] [TestCase( true, @@ -229,7 +228,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg false, false, true, - "[0:v]hwdownload,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", + "[0:v]hwdownload,format=nv12,setsar=1,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,hwupload[v]", "[v]")] [TestCase( false, diff --git a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs index 0b6a36b1f..f529d97c8 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs @@ -105,7 +105,8 @@ namespace ErsatzTV.Core.FFmpeg if (acceleration != HardwareAccelerationKind.None) { filterQueue.Add("hwdownload"); - if (_scaleToSize.IsNone && acceleration == HardwareAccelerationKind.Nvenc) + if ((_scaleToSize.IsNone && acceleration == HardwareAccelerationKind.Nvenc) || + acceleration == HardwareAccelerationKind.Qsv) { filterQueue.Add("format=nv12"); } @@ -118,7 +119,8 @@ namespace ErsatzTV.Core.FFmpeg if ((_scaleToSize.IsSome || _padToSize.IsSome) && acceleration != HardwareAccelerationKind.None) { - filterQueue.Add("hwupload"); + filterQueue.Add( + acceleration == HardwareAccelerationKind.Qsv ? "hwupload=extra_hw_frames=64" : "hwupload"); } if (filterQueue.Any()) diff --git a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs index 88e8b5039..bdc53f3e0 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs @@ -57,6 +57,8 @@ namespace ErsatzTV.Core.FFmpeg case HardwareAccelerationKind.Qsv: _arguments.Add("-hwaccel"); _arguments.Add("qsv"); + _arguments.Add("-init_hw_device"); + _arguments.Add("qsv=qsv:MFX_IMPL_hw_any"); break; case HardwareAccelerationKind.Nvenc: _arguments.Add("-hwaccel");