Browse Source

don't deinterlace using nvidia decoders (#643)

pull/644/head
Jason Dove 3 years ago committed by GitHub
parent
commit
a2e1dc8bfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      ErsatzTV.FFmpeg/Decoder/AvailableDecoders.cs
  2. 19
      ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderH264Cuvid.cs
  3. 19
      ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderHevcCuvid.cs
  4. 33
      ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg2Cuvid.cs
  5. 19
      ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg4Cuvid.cs
  6. 19
      ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderVc1Cuvid.cs
  7. 19
      ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderVp9Cuvid.cs

12
ErsatzTV.FFmpeg/Decoder/AvailableDecoders.cs

@ -13,17 +13,17 @@ public static class AvailableDecoders @@ -13,17 +13,17 @@ public static class AvailableDecoders
return (currentState.HardwareAccelerationMode, currentState.VideoFormat,
currentState.PixelFormat.Match(pf => pf.Name, () => string.Empty)) switch
{
(HardwareAccelerationMode.Nvenc, VideoFormat.Hevc, _) => new DecoderHevcCuvid(desiredState),
(HardwareAccelerationMode.Nvenc, VideoFormat.Hevc, _) => new DecoderHevcCuvid(),
// nvenc doesn't support hardware decoding of 10-bit content
(HardwareAccelerationMode.Nvenc, VideoFormat.H264, PixelFormat.YUV420P10LE or PixelFormat.YUV444P10LE)
=> new DecoderH264(),
(HardwareAccelerationMode.Nvenc, VideoFormat.H264, _) => new DecoderH264Cuvid(desiredState),
(HardwareAccelerationMode.Nvenc, VideoFormat.Mpeg2Video, _) => new DecoderMpeg2Cuvid(desiredState),
(HardwareAccelerationMode.Nvenc, VideoFormat.Vc1, _) => new DecoderVc1Cuvid(desiredState),
(HardwareAccelerationMode.Nvenc, VideoFormat.Vp9, _) => new DecoderVp9Cuvid(desiredState),
(HardwareAccelerationMode.Nvenc, VideoFormat.Mpeg4, _) => new DecoderMpeg4Cuvid(desiredState),
(HardwareAccelerationMode.Nvenc, VideoFormat.H264, _) => new DecoderH264Cuvid(),
(HardwareAccelerationMode.Nvenc, VideoFormat.Mpeg2Video, _) => new DecoderMpeg2Cuvid(),
(HardwareAccelerationMode.Nvenc, VideoFormat.Vc1, _) => new DecoderVc1Cuvid(),
(HardwareAccelerationMode.Nvenc, VideoFormat.Vp9, _) => new DecoderVp9Cuvid(),
(HardwareAccelerationMode.Nvenc, VideoFormat.Mpeg4, _) => new DecoderMpeg4Cuvid(),
// hevc_qsv decoder sometimes causes green lines with 10-bit content
(HardwareAccelerationMode.Qsv, VideoFormat.Hevc, PixelFormat.YUV420P10LE) => new DecoderHevc(),

19
ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderH264Cuvid.cs

@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
public class DecoderH264Cuvid : DecoderBase
{
private readonly FrameState _desiredState;
public DecoderH264Cuvid(FrameState desiredState)
{
_desiredState = desiredState;
}
public override string Name => "h264_cuvid";
public override IList<string> InputOptions
@ -17,12 +10,6 @@ public class DecoderH264Cuvid : DecoderBase @@ -17,12 +10,6 @@ public class DecoderH264Cuvid : DecoderBase
{
IList<string> result = base.InputOptions;
if (_desiredState.Deinterlaced)
{
result.Add("-deint");
result.Add("2");
}
result.Add("-hwaccel_output_format");
result.Add("cuda");
@ -31,10 +18,4 @@ public class DecoderH264Cuvid : DecoderBase @@ -31,10 +18,4 @@ public class DecoderH264Cuvid : DecoderBase
}
protected override FrameDataLocation OutputFrameDataLocation => FrameDataLocation.Hardware;
public override FrameState NextState(FrameState currentState)
{
FrameState result = base.NextState(currentState);
return _desiredState.Deinterlaced ? result with { Deinterlaced = true } : result;
}
}

19
ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderHevcCuvid.cs

@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
public class DecoderHevcCuvid : DecoderBase
{
private readonly FrameState _desiredState;
public DecoderHevcCuvid(FrameState desiredState)
{
_desiredState = desiredState;
}
public override string Name => "hevc_cuvid";
public override IList<string> InputOptions
{
@ -16,12 +9,6 @@ public class DecoderHevcCuvid : DecoderBase @@ -16,12 +9,6 @@ public class DecoderHevcCuvid : DecoderBase
{
IList<string> result = base.InputOptions;
if (_desiredState.Deinterlaced)
{
result.Add("-deint");
result.Add("2");
}
result.Add("-hwaccel_output_format");
result.Add("cuda");
@ -30,10 +17,4 @@ public class DecoderHevcCuvid : DecoderBase @@ -30,10 +17,4 @@ public class DecoderHevcCuvid : DecoderBase
}
protected override FrameDataLocation OutputFrameDataLocation => FrameDataLocation.Hardware;
public override FrameState NextState(FrameState currentState)
{
FrameState result = base.NextState(currentState);
return _desiredState.Deinterlaced ? result with { Deinterlaced = true } : result;
}
}

33
ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg2Cuvid.cs

@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
public class DecoderMpeg2Cuvid : DecoderBase
{
private readonly FrameState _desiredState;
public DecoderMpeg2Cuvid(FrameState desiredState)
{
_desiredState = desiredState;
}
public override string Name => "mpeg2_cuvid";
public override IList<string> InputOptions
{
@ -16,34 +9,12 @@ public class DecoderMpeg2Cuvid : DecoderBase @@ -16,34 +9,12 @@ public class DecoderMpeg2Cuvid : DecoderBase
{
IList<string> result = base.InputOptions;
if (_desiredState.Deinterlaced)
{
result.Add("-deint");
result.Add("2");
// make sure we decode into software
result.Add("-hwaccel_output_format");
result.Add("nv12");
}
else
{
// make sure we decode into hardware
result.Add("-hwaccel_output_format");
result.Add("cuda");
}
result.Add("-hwaccel_output_format");
result.Add("cuda");
return result;
}
}
protected override FrameDataLocation OutputFrameDataLocation => FrameDataLocation.Hardware;
public override FrameState NextState(FrameState currentState)
{
FrameState result = base.NextState(currentState);
return _desiredState.Deinterlaced
// when -deint is used, a hwupload_cuda is required to use more hw filters
? result with { Deinterlaced = true, FrameDataLocation = FrameDataLocation.Software }
: result;
}
}

19
ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg4Cuvid.cs

@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
public class DecoderMpeg4Cuvid : DecoderBase
{
private readonly FrameState _desiredState;
public DecoderMpeg4Cuvid(FrameState desiredState)
{
_desiredState = desiredState;
}
public override string Name => "mpeg4_cuvid";
public override IList<string> InputOptions
@ -17,12 +10,6 @@ public class DecoderMpeg4Cuvid : DecoderBase @@ -17,12 +10,6 @@ public class DecoderMpeg4Cuvid : DecoderBase
{
IList<string> result = base.InputOptions;
if (_desiredState.Deinterlaced)
{
result.Add("-deint");
result.Add("2");
}
result.Add("-hwaccel_output_format");
result.Add("cuda");
@ -31,10 +18,4 @@ public class DecoderMpeg4Cuvid : DecoderBase @@ -31,10 +18,4 @@ public class DecoderMpeg4Cuvid : DecoderBase
}
protected override FrameDataLocation OutputFrameDataLocation => FrameDataLocation.Hardware;
public override FrameState NextState(FrameState currentState)
{
FrameState result = base.NextState(currentState);
return _desiredState.Deinterlaced ? result with { Deinterlaced = true } : result;
}
}

19
ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderVc1Cuvid.cs

@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
public class DecoderVc1Cuvid : DecoderBase
{
private readonly FrameState _desiredState;
public DecoderVc1Cuvid(FrameState desiredState)
{
_desiredState = desiredState;
}
public override string Name => "vc1_cuvid";
public override IList<string> InputOptions
{
@ -16,12 +9,6 @@ public class DecoderVc1Cuvid : DecoderBase @@ -16,12 +9,6 @@ public class DecoderVc1Cuvid : DecoderBase
{
IList<string> result = base.InputOptions;
if (_desiredState.Deinterlaced)
{
result.Add("-deint");
result.Add("2");
}
result.Add("-hwaccel_output_format");
result.Add("cuda");
@ -30,10 +17,4 @@ public class DecoderVc1Cuvid : DecoderBase @@ -30,10 +17,4 @@ public class DecoderVc1Cuvid : DecoderBase
}
protected override FrameDataLocation OutputFrameDataLocation => FrameDataLocation.Hardware;
public override FrameState NextState(FrameState currentState)
{
FrameState result = base.NextState(currentState);
return _desiredState.Deinterlaced ? result with { Deinterlaced = true } : result;
}
}

19
ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderVp9Cuvid.cs

@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
public class DecoderVp9Cuvid : DecoderBase
{
private readonly FrameState _desiredState;
public DecoderVp9Cuvid(FrameState desiredState)
{
_desiredState = desiredState;
}
public override string Name => "vp9_cuvid";
public override IList<string> InputOptions
{
@ -16,12 +9,6 @@ public class DecoderVp9Cuvid : DecoderBase @@ -16,12 +9,6 @@ public class DecoderVp9Cuvid : DecoderBase
{
IList<string> result = base.InputOptions;
if (_desiredState.Deinterlaced)
{
result.Add("-deint");
result.Add("2");
}
result.Add("-hwaccel_output_format");
result.Add("cuda");
@ -30,10 +17,4 @@ public class DecoderVp9Cuvid : DecoderBase @@ -30,10 +17,4 @@ public class DecoderVp9Cuvid : DecoderBase
}
protected override FrameDataLocation OutputFrameDataLocation => FrameDataLocation.Hardware;
public override FrameState NextState(FrameState currentState)
{
FrameState result = base.NextState(currentState);
return _desiredState.Deinterlaced ? result with { Deinterlaced = true } : result;
}
}

Loading…
Cancel
Save