* replace FluentAssertions with Shouldly * fix song transcoding tests * only specify hwaccel when hardware decode is required * update changelog
205 lines
10 KiB
C#
205 lines
10 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using ErsatzTV.FFmpeg.Capabilities.Vaapi;
|
|
using Shouldly;
|
|
using NUnit.Framework;
|
|
|
|
namespace ErsatzTV.FFmpeg.Tests.Capabilities.Vaapi;
|
|
|
|
[TestFixture]
|
|
public class VaapiCapabilityParserTests
|
|
{
|
|
private const string BriefOutput = @"Trying display: wayland
|
|
vainfo: VA-API version: 1.18 (libva 2.18.2)
|
|
vainfo: Driver version: Mesa Gallium driver 23.1.2 for AMD Radeon RX 6750 XT (navi22, LLVM 15.0.7, DRM 3.52, 6.3.8-arch1-1)
|
|
vainfo: Supported profile and entrypoints
|
|
VAProfileMPEG2Simple : VAEntrypointVLD
|
|
VAProfileMPEG2Main : VAEntrypointVLD
|
|
VAProfileVC1Simple : VAEntrypointVLD
|
|
VAProfileVC1Main : VAEntrypointVLD
|
|
VAProfileVC1Advanced : VAEntrypointVLD
|
|
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
|
|
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
|
|
VAProfileH264Main : VAEntrypointVLD
|
|
VAProfileH264Main : VAEntrypointEncSlice
|
|
VAProfileH264High : VAEntrypointVLD
|
|
VAProfileH264High : VAEntrypointEncSlice
|
|
VAProfileHEVCMain : VAEntrypointVLD
|
|
VAProfileHEVCMain : VAEntrypointEncSlice
|
|
VAProfileHEVCMain10 : VAEntrypointVLD
|
|
VAProfileHEVCMain10 : VAEntrypointEncSlice
|
|
VAProfileJPEGBaseline : VAEntrypointVLD
|
|
VAProfileVP9Profile0 : VAEntrypointVLD
|
|
VAProfileVP9Profile2 : VAEntrypointVLD
|
|
VAProfileAV1Profile0 : VAEntrypointVLD
|
|
VAProfileNone : VAEntrypointVideoProc";
|
|
|
|
private const string FullOutput = @"Trying display: wayland
|
|
vainfo: VA-API version: 1.18 (libva 2.18.2)
|
|
vainfo: Driver version: Mesa Gallium driver 23.1.2 for AMD Radeon RX 6750 XT (navi22, LLVM 15.0.7, DRM 3.52, 6.3.8-arch1-1)
|
|
vainfo: Supported config attributes per profile/entrypoint pair
|
|
VAProfileMPEG2Simple/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileMPEG2Main/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileVC1Simple/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileVC1Main/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileVC1Advanced/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileH264ConstrainedBaseline/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileH264ConstrainedBaseline/VAEntrypointEncSlice
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VAConfigAttribRateControl : VA_RC_CBR
|
|
VA_RC_VBR
|
|
VA_RC_CQP
|
|
VAConfigAttribEncPackedHeaders : VA_ENC_PACKED_HEADER_NONE
|
|
VAConfigAttribEncMaxRefFrames : l0=1
|
|
l1=0
|
|
VAConfigAttribEncMaxSlices : 128
|
|
VAConfigAttribEncSliceStructure : VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS
|
|
VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS
|
|
VAConfigAttribEncQualityRange : number of supported quality levels is 32
|
|
VAConfigAttribEncRateControlExt : max_num_temporal_layers_minus1=3 temporal_layer_bitrate_control_flag=1
|
|
VAConfigAttribMaxFrameSize : max_frame_size=1
|
|
multiple_pass=0
|
|
|
|
VAProfileH264Main/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileH264Main/VAEntrypointEncSlice
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VAConfigAttribRateControl : VA_RC_CBR
|
|
VA_RC_VBR
|
|
VA_RC_CQP
|
|
VAConfigAttribEncPackedHeaders : VA_ENC_PACKED_HEADER_NONE
|
|
VAConfigAttribEncMaxRefFrames : l0=1
|
|
l1=0
|
|
VAConfigAttribEncMaxSlices : 128
|
|
VAConfigAttribEncSliceStructure : VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS
|
|
VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS
|
|
VAConfigAttribEncQualityRange : number of supported quality levels is 32
|
|
VAConfigAttribEncRateControlExt : max_num_temporal_layers_minus1=3 temporal_layer_bitrate_control_flag=1
|
|
VAConfigAttribMaxFrameSize : max_frame_size=1
|
|
multiple_pass=0
|
|
|
|
VAProfileH264High/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileH264High/VAEntrypointEncSlice
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VA_RT_FORMAT_YUV420_10
|
|
VA_RT_FORMAT_YUV420_10BPP
|
|
VAConfigAttribRateControl : VA_RC_CBR
|
|
VA_RC_VBR
|
|
VA_RC_CQP
|
|
VAConfigAttribEncPackedHeaders : VA_ENC_PACKED_HEADER_NONE
|
|
VAConfigAttribEncMaxRefFrames : l0=1
|
|
l1=0
|
|
VAConfigAttribEncMaxSlices : 128
|
|
VAConfigAttribEncSliceStructure : VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS
|
|
VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS
|
|
VAConfigAttribEncQualityRange : number of supported quality levels is 32
|
|
VAConfigAttribEncRateControlExt : max_num_temporal_layers_minus1=3 temporal_layer_bitrate_control_flag=1
|
|
VAConfigAttribMaxFrameSize : max_frame_size=1
|
|
multiple_pass=0
|
|
|
|
VAProfileHEVCMain/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileHEVCMain/VAEntrypointEncSlice
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VAConfigAttribRateControl : VA_RC_CBR
|
|
VA_RC_VBR
|
|
VA_RC_CQP
|
|
VAConfigAttribEncPackedHeaders : VA_ENC_PACKED_HEADER_SEQUENCE
|
|
VAConfigAttribEncMaxRefFrames : l0=1
|
|
l1=0
|
|
VAConfigAttribEncMaxSlices : 128
|
|
VAConfigAttribEncSliceStructure : VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS
|
|
VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS
|
|
VAConfigAttribEncQualityRange : number of supported quality levels is 32
|
|
VAConfigAttribMaxFrameSize : max_frame_size=1
|
|
multiple_pass=0
|
|
|
|
VAProfileHEVCMain10/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VA_RT_FORMAT_YUV420_10
|
|
VA_RT_FORMAT_YUV420_10BPP
|
|
|
|
VAProfileHEVCMain10/VAEntrypointEncSlice
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VA_RT_FORMAT_YUV420_10
|
|
VA_RT_FORMAT_YUV420_10BPP
|
|
VAConfigAttribRateControl : VA_RC_CBR
|
|
VA_RC_VBR
|
|
VA_RC_CQP
|
|
VAConfigAttribEncPackedHeaders : VA_ENC_PACKED_HEADER_SEQUENCE
|
|
VAConfigAttribEncMaxRefFrames : l0=1
|
|
l1=0
|
|
VAConfigAttribEncMaxSlices : 128
|
|
VAConfigAttribEncSliceStructure : VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS
|
|
VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS
|
|
VAConfigAttribEncQualityRange : number of supported quality levels is 32
|
|
VAConfigAttribMaxFrameSize : max_frame_size=1
|
|
multiple_pass=0
|
|
|
|
VAProfileJPEGBaseline/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VA_RT_FORMAT_YUV422
|
|
VA_RT_FORMAT_YUV444
|
|
VA_RT_FORMAT_YUV400
|
|
|
|
VAProfileVP9Profile0/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
|
|
VAProfileVP9Profile2/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420_10
|
|
VA_RT_FORMAT_YUV420_10BPP
|
|
|
|
VAProfileAV1Profile0/VAEntrypointVLD
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VA_RT_FORMAT_YUV420_10
|
|
VA_RT_FORMAT_YUV420_10BPP
|
|
|
|
VAProfileNone/VAEntrypointVideoProc
|
|
VAConfigAttribRTFormat : VA_RT_FORMAT_YUV420
|
|
VA_RT_FORMAT_YUV422
|
|
VA_RT_FORMAT_YUV444
|
|
VA_RT_FORMAT_YUV400
|
|
VA_RT_FORMAT_YUV420_10
|
|
VA_RT_FORMAT_RGB32
|
|
VA_RT_FORMAT_YUV420_10BPP";
|
|
|
|
[Test]
|
|
public void ShouldParseEntrypoints()
|
|
{
|
|
List<VaapiProfileEntrypoint> brief = VaapiCapabilityParser.Parse(BriefOutput);
|
|
List<VaapiProfileEntrypoint> full = VaapiCapabilityParser.ParseFull(FullOutput);
|
|
|
|
brief.Count.ShouldBe(20);
|
|
full.Count.ShouldBe(20);
|
|
}
|
|
|
|
[Test]
|
|
public void Full_ShouldParseRateControlModes()
|
|
{
|
|
List<VaapiProfileEntrypoint> full = VaapiCapabilityParser.ParseFull(FullOutput);
|
|
|
|
full.Count.ShouldBe(20);
|
|
full.Count(e => e.VaapiEntrypoint.StartsWith("VAEntrypointEnc")).ShouldBeGreaterThan(0);
|
|
foreach (VaapiProfileEntrypoint entrypoint in full.Where(e => e.VaapiEntrypoint.StartsWith("VAEntrypointEnc")))
|
|
{
|
|
entrypoint.RateControlModes.Count.ShouldBeGreaterThan(0);
|
|
}
|
|
}
|
|
}
|