diff --git a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderH264Cuvid.cs b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderH264Cuvid.cs index ca99925c1..a8ad979ba 100644 --- a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderH264Cuvid.cs +++ b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderH264Cuvid.cs @@ -17,8 +17,16 @@ public class DecoderH264Cuvid : DecoderBase { IList result = base.InputOptions(inputFile); - result.Add("-hwaccel_output_format"); - result.Add(_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None ? "cuda" : "nv12"); + if (_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None) + { + result.Add("-hwaccel_output_format"); + result.Add("cuda"); + } + else + { + result.Add("-hwaccel_output_format"); + result.Add(InputBitDepth(inputFile) == 10 ? "p010le" : "nv12"); + } return result; } diff --git a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderHevcCuvid.cs b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderHevcCuvid.cs index 51ebe1a34..dc7db6a75 100644 --- a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderHevcCuvid.cs +++ b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderHevcCuvid.cs @@ -17,8 +17,16 @@ public class DecoderHevcCuvid : DecoderBase { IList result = base.InputOptions(inputFile); - result.Add("-hwaccel_output_format"); - result.Add(_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None ? "cuda" : "nv12"); + if (_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None) + { + result.Add("-hwaccel_output_format"); + result.Add("cuda"); + } + else + { + result.Add("-hwaccel_output_format"); + result.Add(InputBitDepth(inputFile) == 10 ? "p010le" : "nv12"); + } return result; } diff --git a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg2Cuvid.cs b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg2Cuvid.cs index 186699adc..fa0fd73d2 100644 --- a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg2Cuvid.cs +++ b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg2Cuvid.cs @@ -22,8 +22,16 @@ public class DecoderMpeg2Cuvid : DecoderBase { IList result = base.InputOptions(inputFile); - result.Add("-hwaccel_output_format"); - result.Add(_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None ? "cuda" : "nv12"); + if (_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None) + { + result.Add("-hwaccel_output_format"); + result.Add("cuda"); + } + else + { + result.Add("-hwaccel_output_format"); + result.Add(InputBitDepth(inputFile) == 10 ? "p010le" : "nv12"); + } return result; } diff --git a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg4Cuvid.cs b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg4Cuvid.cs index 1de1d018a..a2371c6d3 100644 --- a/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg4Cuvid.cs +++ b/ErsatzTV.FFmpeg/Decoder/Cuvid/DecoderMpeg4Cuvid.cs @@ -17,8 +17,16 @@ public class DecoderMpeg4Cuvid : DecoderBase { IList result = base.InputOptions(inputFile); - result.Add("-hwaccel_output_format"); - result.Add(_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None ? "cuda" : "nv12"); + if (_ffmpegState.EncoderHardwareAccelerationMode != HardwareAccelerationMode.None) + { + result.Add("-hwaccel_output_format"); + result.Add("cuda"); + } + else + { + result.Add("-hwaccel_output_format"); + result.Add(InputBitDepth(inputFile) == 10 ? "p010le" : "nv12"); + } return result; } diff --git a/ErsatzTV.FFmpeg/Decoder/DecoderBase.cs b/ErsatzTV.FFmpeg/Decoder/DecoderBase.cs index 4f0d0b899..14be18413 100644 --- a/ErsatzTV.FFmpeg/Decoder/DecoderBase.cs +++ b/ErsatzTV.FFmpeg/Decoder/DecoderBase.cs @@ -1,4 +1,5 @@ using ErsatzTV.FFmpeg.Environment; +using ErsatzTV.FFmpeg.Format; namespace ErsatzTV.FFmpeg.Decoder; @@ -20,4 +21,22 @@ public abstract class DecoderBase : IDecoder public bool AppliesTo(VideoInputFile videoInputFile) => true; public bool AppliesTo(ConcatInputFile concatInputFile) => false; + + protected int InputBitDepth(InputFile inputFile) + { + var bitDepth = 8; + + if (inputFile is VideoInputFile videoInputFile) + { + foreach (VideoStream videoStream in videoInputFile.VideoStreams.HeadOrNone()) + { + foreach (IPixelFormat pixelFormat in videoStream.PixelFormat) + { + bitDepth = pixelFormat.BitDepth; + } + } + } + + return bitDepth; + } }