Browse Source

fix hevc_nvenc encoder on sm < 75 (#1187)

pull/1188/head
Jason Dove 3 years ago committed by GitHub
parent
commit
3fafd5192f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      ErsatzTV.FFmpeg/Capabilities/NvidiaHardwareCapabilities.cs
  2. 16
      ErsatzTV.FFmpeg/Encoder/Nvenc/EncoderHevcNvenc.cs
  3. 2
      ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

2
ErsatzTV.FFmpeg/Capabilities/NvidiaHardwareCapabilities.cs

@ -95,6 +95,8 @@ public class NvidiaHardwareCapabilities : IHardwareCapabilities
return isHardware ? FFmpegCapability.Hardware : FFmpegCapability.Software; return isHardware ? FFmpegCapability.Hardware : FFmpegCapability.Software;
} }
public bool HevcBFrames => _architecture >= 75;
private FFmpegCapability CheckHardwareCodec(string codec, Func<string, bool> check) private FFmpegCapability CheckHardwareCodec(string codec, Func<string, bool> check)
{ {
if (check(codec)) if (check(codec))

16
ErsatzTV.FFmpeg/Encoder/Nvenc/EncoderHevcNvenc.cs

@ -1,13 +1,27 @@
using ErsatzTV.FFmpeg.Format; using ErsatzTV.FFmpeg.Capabilities;
using ErsatzTV.FFmpeg.Format;
namespace ErsatzTV.FFmpeg.Encoder.Nvenc; namespace ErsatzTV.FFmpeg.Encoder.Nvenc;
public class EncoderHevcNvenc : EncoderBase public class EncoderHevcNvenc : EncoderBase
{ {
private readonly bool _bFrames;
public EncoderHevcNvenc(IHardwareCapabilities hardwareCapabilities)
{
if (hardwareCapabilities is NvidiaHardwareCapabilities nvidia)
{
_bFrames = nvidia.HevcBFrames;
}
}
public override string Name => "hevc_nvenc"; public override string Name => "hevc_nvenc";
public override StreamKind Kind => StreamKind.Video; public override StreamKind Kind => StreamKind.Video;
public override FrameState NextState(FrameState currentState) => currentState with public override FrameState NextState(FrameState currentState) => currentState with
{ {
VideoFormat = VideoFormat.Hevc VideoFormat = VideoFormat.Hevc
}; };
public override IList<string> OutputOptions =>
new[] { "-c:v", "hevc_nvenc", "-b_ref_mode", _bFrames ? "1" : "0" };
} }

2
ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

@ -223,7 +223,7 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
Option<IEncoder> maybeEncoder = Option<IEncoder> maybeEncoder =
(ffmpegState.EncoderHardwareAccelerationMode, desiredState.VideoFormat) switch (ffmpegState.EncoderHardwareAccelerationMode, desiredState.VideoFormat) switch
{ {
(HardwareAccelerationMode.Nvenc, VideoFormat.Hevc) => new EncoderHevcNvenc(), (HardwareAccelerationMode.Nvenc, VideoFormat.Hevc) => new EncoderHevcNvenc(_hardwareCapabilities),
(HardwareAccelerationMode.Nvenc, VideoFormat.H264) => new EncoderH264Nvenc(), (HardwareAccelerationMode.Nvenc, VideoFormat.H264) => new EncoderH264Nvenc(),
(_, _) => GetSoftwareEncoder(currentState, desiredState) (_, _) => GetSoftwareEncoder(currentState, desiredState)

Loading…
Cancel
Save