Browse Source

add videotoolbox acceleration (#575)

pull/576/head develop
Jason Dove 4 years ago committed by GitHub
parent
commit
0440f7643b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 17
      ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs
  3. 3
      ErsatzTV.Core/Domain/HardwareAccelerationKind.cs
  4. 7
      ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs
  5. 4
      ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs
  6. 3
      ErsatzTV.Infrastructure/Health/Checks/HardwareAccelerationHealthCheck.cs
  7. 13
      ErsatzTV/Validators/FFmpegProfileEditViewModelValidator.cs

1
CHANGELOG.md

@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- When items are missing from disk, they will be flagged and present in the `Media` > `Trash` page
- The trash page can be used to permanently remove missing items from the database
- When items reappear at the expected location on disk, they will be unflagged and removed from the trash
- Add basic Mac hardware acceleration using VideoToolbox
### Changed
- Local libraries only: when items are missing from disk, they will be added to the trash and no longer removed from collections, etc.

17
ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs

@ -94,6 +94,17 @@ namespace ErsatzTV.Core.Tests.FFmpeg @@ -94,6 +94,17 @@ namespace ErsatzTV.Core.Tests.FFmpeg
{
HardwareAccelerationKind.Vaapi
};
public static string[] VideoToolboxCodecs =
{
"h264_videotoolbox",
"hevc_videotoolbox"
};
public static HardwareAccelerationKind[] VideoToolboxAcceleration =
{
HardwareAccelerationKind.VideoToolbox
};
}
[Test, Combinatorial]
@ -108,10 +119,12 @@ namespace ErsatzTV.Core.Tests.FFmpeg @@ -108,10 +119,12 @@ namespace ErsatzTV.Core.Tests.FFmpeg
bool pad,
// [ValueSource(typeof(TestData), nameof(TestData.SoftwareCodecs))] string profileCodec,
// [ValueSource(typeof(TestData), nameof(TestData.NoAcceleration))] HardwareAccelerationKind profileAcceleration)
[ValueSource(typeof(TestData), nameof(TestData.NvidiaCodecs))] string profileCodec,
[ValueSource(typeof(TestData), nameof(TestData.NvidiaAcceleration))] HardwareAccelerationKind profileAcceleration)
// [ValueSource(typeof(TestData), nameof(TestData.NvidiaCodecs))] string profileCodec,
// [ValueSource(typeof(TestData), nameof(TestData.NvidiaAcceleration))] HardwareAccelerationKind profileAcceleration)
// [ValueSource(typeof(TestData), nameof(TestData.VaapiCodecs))] string profileCodec,
// [ValueSource(typeof(TestData), nameof(TestData.VaapiAcceleration))] HardwareAccelerationKind profileAcceleration)
[ValueSource(typeof(TestData), nameof(TestData.VideoToolboxCodecs))] string profileCodec,
[ValueSource(typeof(TestData), nameof(TestData.VideoToolboxAcceleration))] HardwareAccelerationKind profileAcceleration)
{
string name = GetStringSha256Hash(
$"{inputCodec}_{inputPixelFormat}_{pad}_{profileResolution}_{profileCodec}_{profileAcceleration}");

3
ErsatzTV.Core/Domain/HardwareAccelerationKind.cs

@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
None = 0,
Qsv = 1,
Nvenc = 2,
Vaapi = 3
Vaapi = 3,
VideoToolbox = 4
}
}

7
ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs

@ -149,6 +149,7 @@ namespace ErsatzTV.Core.FFmpeg @@ -149,6 +149,7 @@ namespace ErsatzTV.Core.FFmpeg
HardwareAccelerationKind.Nvenc => !isSong,
HardwareAccelerationKind.Qsv => !isSong,
HardwareAccelerationKind.VideoToolbox => false,
_ => false
};
@ -169,9 +170,11 @@ namespace ErsatzTV.Core.FFmpeg @@ -169,9 +170,11 @@ namespace ErsatzTV.Core.FFmpeg
audioFilterQueue.Add($"apad=whole_dur={durationString}ms");
});
bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None && !isHardwareDecode &&
bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None &&
acceleration != HardwareAccelerationKind.VideoToolbox &&
!isHardwareDecode &&
(_deinterlace || _scaleToSize.IsSome);
if (isSong)
{
switch (acceleration)

4
ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs

@ -108,6 +108,10 @@ namespace ErsatzTV.Core.FFmpeg @@ -108,6 +108,10 @@ namespace ErsatzTV.Core.FFmpeg
_arguments.Add("-hwaccel_output_format");
_arguments.Add("vaapi");
break;
case HardwareAccelerationKind.VideoToolbox:
_arguments.Add("-hwaccel");
_arguments.Add("videotoolbox");
break;
}
_complexFilterBuilder = _complexFilterBuilder.WithHardwareAcceleration(hwAccel);

3
ErsatzTV.Infrastructure/Health/Checks/HardwareAccelerationHealthCheck.cs

@ -115,6 +115,9 @@ namespace ErsatzTV.Infrastructure.Health.Checks @@ -115,6 +115,9 @@ namespace ErsatzTV.Infrastructure.Health.Checks
case "qsv":
result.Add(HardwareAccelerationKind.Qsv);
break;
case "videotoolbox":
result.Add(HardwareAccelerationKind.VideoToolbox);
break;
}
}

13
ErsatzTV/Validators/FFmpegProfileEditViewModelValidator.cs

@ -10,6 +10,7 @@ namespace ErsatzTV.Validators @@ -10,6 +10,7 @@ namespace ErsatzTV.Validators
private static readonly List<string> QsvEncoders = new() { "h264_qsv", "hevc_qsv", "mpeg2_qsv" };
private static readonly List<string> NvencEncoders = new() { "h264_nvenc", "hevc_nvenc" };
private static readonly List<string> VaapiEncoders = new() { "h264_vaapi", "hevc_vaapi", "mpeg2_vaapi" };
private static readonly List<string> VideoToolboxEncoders = new() { "h264_videotoolbox", "hevc_videotoolbox" };
public FFmpegProfileEditViewModelValidator()
{
@ -53,11 +54,21 @@ namespace ErsatzTV.Validators @@ -53,11 +54,21 @@ namespace ErsatzTV.Validators
.WithMessage("VAAPI codec is required (h264_vaapi, hevc_vaapi, mpeg2_vaapi)");
});
When(
x => x.HardwareAcceleration == HardwareAccelerationKind.VideoToolbox,
() =>
{
RuleFor(x => x.VideoCodec).Must(c => VideoToolboxEncoders.Contains(c))
.WithMessage("VideoToolbox codec is required (h264_videotoolbox, hevc_videotoolbox)");
});
When(
x => x.HardwareAcceleration == HardwareAccelerationKind.None,
() =>
{
RuleFor(x => x.VideoCodec).Must(c => !QsvEncoders.Contains(c) && !NvencEncoders.Contains(c))
RuleFor(x => x.VideoCodec).Must(
c => !QsvEncoders.Contains(c) && !NvencEncoders.Contains(c) && !VaapiEncoders.Contains(c) &&
!VideoToolboxEncoders.Contains(c))
.WithMessage("Hardware acceleration is required for this codec");
});
}

Loading…
Cancel
Save