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

5
ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

@ -135,9 +135,12 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder @@ -135,9 +135,12 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
{
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)
{
videoInputFile.FilterSteps.Add(new HardwareUploadCudaFilter(FrameDataLocation.Unknown));
videoInputFile.FilterSteps.Add(new CudaSoftwareFallbackUploadFilter());
}
return Some(decoder);

Loading…
Cancel
Save