Browse Source

use colorspace filter for some edge cases

qsv-improvements
Jason Dove 1 month ago
parent
commit
eda0318868
No known key found for this signature in database
  1. 4
      ErsatzTV.FFmpeg/ColorParams.cs
  2. 37
      ErsatzTV.FFmpeg/Pipeline/QsvPipelineBuilder.cs
  3. 12
      ErsatzTV.Scanner.Tests/Core/FFmpeg/TranscodingTests.cs

4
ErsatzTV.FFmpeg/ColorParams.cs

@ -12,6 +12,10 @@ public record ColorParams(string ColorRange, string ColorSpace, string ColorTran @@ -12,6 +12,10 @@ public record ColorParams(string ColorRange, string ColorSpace, string ColorTran
string.IsNullOrWhiteSpace(ColorTransfer) &&
string.IsNullOrWhiteSpace(ColorPrimaries);
public bool IsPartiallyUnknown => string.IsNullOrWhiteSpace(ColorSpace) ||
string.IsNullOrWhiteSpace(ColorTransfer) ||
string.IsNullOrWhiteSpace(ColorPrimaries);
public bool IsMixed => ColorSpace != ColorTransfer || ColorTransfer != ColorPrimaries ||
string.IsNullOrWhiteSpace(ColorRange);

37
ErsatzTV.FFmpeg/Pipeline/QsvPipelineBuilder.cs

@ -330,7 +330,42 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder @@ -330,7 +330,42 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder
if (!videoStream.ColorParams.IsBt709 || usesVppQsv)
{
pipelineSteps.Add(new ColorMetadataOutputOption());
if (videoStream.ColorParams.IsPartiallyUnknown)
{
// _logger.LogDebug("Adding colorspace filter");
// force p010/nv12 if we're still in hardware
if (currentState.FrameDataLocation == FrameDataLocation.Hardware)
{
foreach (int bitDepth in currentState.PixelFormat.Map(pf => pf.BitDepth))
{
if (bitDepth is 10 && formatForDownload is not PixelFormatYuv420P10Le)
{
formatForDownload = new PixelFormatYuv420P10Le();
currentState = currentState with { PixelFormat = Some(formatForDownload) };
}
else if (bitDepth is 8 && formatForDownload is not PixelFormatNv12)
{
formatForDownload = new PixelFormatNv12(formatForDownload.Name);
currentState = currentState with { PixelFormat = Some(formatForDownload) };
}
}
}
// vpp_qsv seems to strip color info, so if we use that at all, force overriding input color info
var colorspace = new ColorspaceFilter(
currentState,
videoStream,
format,
usesVppQsv);
currentState = colorspace.NextState(currentState);
result.Add(colorspace);
}
else
{
pipelineSteps.Add(new ColorMetadataOutputOption());
}
}
if (ffmpegState.EncoderHardwareAccelerationMode == HardwareAccelerationMode.None)

12
ErsatzTV.Scanner.Tests/Core/FFmpeg/TranscodingTests.cs

@ -110,10 +110,10 @@ public class TranscodingTests @@ -110,10 +110,10 @@ public class TranscodingTests
public static Watermark[] Watermarks =
[
Watermark.None,
Watermark.PermanentOpaqueScaled,
Watermark.PermanentOpaqueActualSize,
//Watermark.PermanentOpaqueScaled,
//Watermark.PermanentOpaqueActualSize,
Watermark.PermanentTransparentScaled,
Watermark.PermanentTransparentActualSize
//Watermark.PermanentTransparentActualSize
];
public static Subtitle[] Subtitles =
@ -145,7 +145,7 @@ public class TranscodingTests @@ -145,7 +145,7 @@ public class TranscodingTests
public static InputFormat[] InputFormats =
[
// // // example format that requires colorspace filter
// new("libx264", "yuv420p", "tv", "smpte170m", "bt709", "smpte170m"),
new("libx264", "yuv420p", "tv", "smpte170m", "bt709", "smpte170m"),
// // //
// // // // example format that requires setparams filter
// new("libx264", "yuv420p", string.Empty, string.Empty, string.Empty, string.Empty),
@ -198,9 +198,9 @@ public class TranscodingTests @@ -198,9 +198,9 @@ public class TranscodingTests
public static HardwareAccelerationKind[] TestAccelerations =
[
//HardwareAccelerationKind.None,
HardwareAccelerationKind.Nvenc,
//HardwareAccelerationKind.Nvenc,
//HardwareAccelerationKind.Vaapi
//HardwareAccelerationKind.Qsv,
HardwareAccelerationKind.Qsv,
// HardwareAccelerationKind.VideoToolbox,
// HardwareAccelerationKind.Amf
];

Loading…
Cancel
Save