Browse Source

use a new filter

pull/2718/head
Jason Dove 8 months ago
parent
commit
13ef574203
No known key found for this signature in database
  1. 9
      ErsatzTV.FFmpeg/Filter/Cuda/CudaSoftwareFallbackUploadFilter.cs
  2. 3
      ErsatzTV.FFmpeg/Filter/Cuda/HardwareUploadCudaFilter.cs
  3. 5
      ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

9
ErsatzTV.FFmpeg/Filter/Cuda/CudaSoftwareFallbackUploadFilter.cs

@ -0,0 +1,9 @@
namespace ErsatzTV.FFmpeg.Filter.Cuda;
public class CudaSoftwareFallbackUploadFilter : BaseFilter
{
public override string Filter => "hwupload";
public override FrameState NextState(FrameState currentState) =>
currentState with { FrameDataLocation = FrameDataLocation.Hardware };
}

3
ErsatzTV.FFmpeg/Filter/HardwareUploadCudaFilter.cs → ErsatzTV.FFmpeg/Filter/Cuda/HardwareUploadCudaFilter.cs

@ -1,11 +1,10 @@
namespace ErsatzTV.FFmpeg.Filter; namespace ErsatzTV.FFmpeg.Filter.Cuda;
public class HardwareUploadCudaFilter(FrameDataLocation frameDataLocation) : BaseFilter public class HardwareUploadCudaFilter(FrameDataLocation frameDataLocation) : BaseFilter
{ {
public override string Filter => frameDataLocation switch public override string Filter => frameDataLocation switch
{ {
FrameDataLocation.Hardware => string.Empty, FrameDataLocation.Hardware => string.Empty,
FrameDataLocation.Unknown => "hwupload",
_ => "hwupload_cuda" _ => "hwupload_cuda"
}; };

5
ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

@ -135,9 +135,12 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
{ {
videoInputFile.AddOption(decoder); videoInputFile.AddOption(decoder);
// sometimes cuda fails to decode in hardware and falls back to software
// in that case, we need to upload to get the frame in hardware as expected
// this *should* no-op when frames are already in hardware
if (ffmpegState.DecoderHardwareAccelerationMode is HardwareAccelerationMode.Nvenc) if (ffmpegState.DecoderHardwareAccelerationMode is HardwareAccelerationMode.Nvenc)
{ {
videoInputFile.FilterSteps.Add(new HardwareUploadCudaFilter(FrameDataLocation.Unknown)); videoInputFile.FilterSteps.Add(new CudaSoftwareFallbackUploadFilter());
} }
return Some(decoder); return Some(decoder);

Loading…
Cancel
Save