Browse Source

fix nvidia hardware decoding on windows (#1513)

pull/1514/head
Jason Dove 2 years ago committed by GitHub
parent
commit
d310b5c09d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/workflows/artifacts.yml
  2. 23
      ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs
  3. 5
      ErsatzTV.FFmpeg/Pipeline/PipelineBuilderFactory.cs
  4. 2
      ErsatzTV.Scanner.Tests/Core/FFmpeg/TranscodingTests.cs

2
.github/workflows/artifacts.yml

@ -204,7 +204,7 @@ jobs: @@ -204,7 +204,7 @@ jobs:
id: downloadffmpeg
name: Download ffmpeg
with:
url: "https://github.com/GyanD/codexffmpeg/releases/download/6.1/ffmpeg-6.1-full_build.7z"
url: "https://github.com/ErsatzTV/ErsatzTV-ffmpeg/releases/download/6.1-working-cuvid/ffmpeg-6.1-working-cuvid.7z"
target: ffmpeg/
- name: Build

23
ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

@ -1,4 +1,3 @@ @@ -1,4 +1,3 @@
using System.Runtime.InteropServices;
using ErsatzTV.FFmpeg.Capabilities;
using ErsatzTV.FFmpeg.Decoder;
using ErsatzTV.FFmpeg.Decoder.Cuvid;
@ -10,7 +9,6 @@ using ErsatzTV.FFmpeg.Format; @@ -10,7 +9,6 @@ using ErsatzTV.FFmpeg.Format;
using ErsatzTV.FFmpeg.GlobalOption.HardwareAcceleration;
using ErsatzTV.FFmpeg.InputOption;
using ErsatzTV.FFmpeg.OutputOption;
using ErsatzTV.FFmpeg.Runtime;
using ErsatzTV.FFmpeg.State;
using Microsoft.Extensions.Logging;
@ -18,13 +16,11 @@ namespace ErsatzTV.FFmpeg.Pipeline; @@ -18,13 +16,11 @@ namespace ErsatzTV.FFmpeg.Pipeline;
public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
{
private readonly IRuntimeInfo _runtimeInfo;
private readonly IFFmpegCapabilities _ffmpegCapabilities;
private readonly IHardwareCapabilities _hardwareCapabilities;
private readonly ILogger _logger;
public NvidiaPipelineBuilder(
IRuntimeInfo runtimeInfo,
IFFmpegCapabilities ffmpegCapabilities,
IHardwareCapabilities hardwareCapabilities,
HardwareAccelerationMode hardwareAccelerationMode,
@ -45,7 +41,6 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder @@ -45,7 +41,6 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
fontsFolder,
logger)
{
_runtimeInfo = runtimeInfo;
_ffmpegCapabilities = ffmpegCapabilities;
_hardwareCapabilities = hardwareCapabilities;
_logger = logger;
@ -96,13 +91,6 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder @@ -96,13 +91,6 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
FFmpegState ffmpegState,
PipelineContext context)
{
if (NeedsCudaWorkaround(ffmpegState, videoStream.Codec))
{
var cuda = new DecoderImplicitCuda();
videoInputFile.AddOption(cuda);
return cuda;
}
Option<IDecoder> maybeDecoder = (ffmpegState.DecoderHardwareAccelerationMode, videoStream.Codec) switch
{
(HardwareAccelerationMode.Nvenc, VideoFormat.Hevc) => new DecoderHevcCuvid(HardwareAccelerationMode.Nvenc),
@ -647,15 +635,4 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder @@ -647,15 +635,4 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
return currentState;
}
// the combination of:
// - windows
// - ffmpeg 6.1 snapshot (where readrate_initial_burst option is present)
// - h264_cuvid
// appears to cause jitter, so use implicit cuda decoder in that specific case
private bool NeedsCudaWorkaround(FFmpegState ffmpegState, string videoFormat) =>
_runtimeInfo.IsOSPlatform(OSPlatform.Windows)
&& _ffmpegCapabilities.HasOption(FFmpegKnownOption.ReadrateInitialBurst)
&& ffmpegState.DecoderHardwareAccelerationMode is HardwareAccelerationMode.Nvenc
&& videoFormat == VideoFormat.H264;
}

5
ErsatzTV.FFmpeg/Pipeline/PipelineBuilderFactory.cs

@ -1,5 +1,4 @@ @@ -1,5 +1,4 @@
using ErsatzTV.FFmpeg.Capabilities;
using ErsatzTV.FFmpeg.Runtime;
using Microsoft.Extensions.Logging;
namespace ErsatzTV.FFmpeg.Pipeline;
@ -8,14 +7,11 @@ public class PipelineBuilderFactory : IPipelineBuilderFactory @@ -8,14 +7,11 @@ public class PipelineBuilderFactory : IPipelineBuilderFactory
{
private readonly IHardwareCapabilitiesFactory _hardwareCapabilitiesFactory;
private readonly ILogger<PipelineBuilderFactory> _logger;
private readonly IRuntimeInfo _runtimeInfo;
public PipelineBuilderFactory(
IRuntimeInfo runtimeInfo,
IHardwareCapabilitiesFactory hardwareCapabilitiesFactory,
ILogger<PipelineBuilderFactory> logger)
{
_runtimeInfo = runtimeInfo;
_hardwareCapabilitiesFactory = hardwareCapabilitiesFactory;
_logger = logger;
}
@ -44,7 +40,6 @@ public class PipelineBuilderFactory : IPipelineBuilderFactory @@ -44,7 +40,6 @@ public class PipelineBuilderFactory : IPipelineBuilderFactory
return hardwareAccelerationMode switch
{
HardwareAccelerationMode.Nvenc when capabilities is not NoHardwareCapabilities => new NvidiaPipelineBuilder(
_runtimeInfo,
ffmpegCapabilities,
capabilities,
hardwareAccelerationMode,

2
ErsatzTV.Scanner.Tests/Core/FFmpeg/TranscodingTests.cs

@ -241,7 +241,6 @@ public class TranscodingTests @@ -241,7 +241,6 @@ public class TranscodingTests
new FakeStreamSelector(),
tempFilePool,
new PipelineBuilderFactory(
new RuntimeInfo(),
//new FakeNvidiaCapabilitiesFactory(),
new HardwareCapabilitiesFactory(
MemoryCache,
@ -858,7 +857,6 @@ public class TranscodingTests @@ -858,7 +857,6 @@ public class TranscodingTests
new FakeStreamSelector(),
Substitute.For<ITempFilePool>(),
new PipelineBuilderFactory(
new RuntimeInfo(),
//new FakeNvidiaCapabilitiesFactory(),
new HardwareCapabilitiesFactory(
MemoryCache,

Loading…
Cancel
Save