Browse Source

fix qsv color normalization (#1046)

pull/1047/head
Jason Dove 4 years ago committed by GitHub
parent
commit
cd0f1e98cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs
  2. 2
      ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs
  3. 12
      ErsatzTV.FFmpeg/Pipeline/QsvPipelineBuilder.cs
  4. 2
      ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

9
ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs

@ -6,15 +6,18 @@ public class ColorspaceFilter : BaseFilter
{ {
private readonly VideoStream _videoStream; private readonly VideoStream _videoStream;
private readonly IPixelFormat _desiredPixelFormat; private readonly IPixelFormat _desiredPixelFormat;
private readonly bool _forceInputOverrides;
private readonly FrameDataLocation _nextDataLocation; private readonly FrameDataLocation _nextDataLocation;
public ColorspaceFilter( public ColorspaceFilter(
VideoStream videoStream, VideoStream videoStream,
IPixelFormat desiredPixelFormat, IPixelFormat desiredPixelFormat,
bool forceInputOverrides = false,
FrameDataLocation nextDataLocation = FrameDataLocation.Software) FrameDataLocation nextDataLocation = FrameDataLocation.Software)
{ {
_videoStream = videoStream; _videoStream = videoStream;
_desiredPixelFormat = desiredPixelFormat; _desiredPixelFormat = desiredPixelFormat;
_forceInputOverrides = forceInputOverrides;
_nextDataLocation = nextDataLocation; _nextDataLocation = nextDataLocation;
} }
@ -36,10 +39,12 @@ public class ColorspaceFilter : BaseFilter
{ {
string inputOverrides = string.Empty; string inputOverrides = string.Empty;
ColorParams cp = _videoStream.ColorParams; ColorParams cp = _videoStream.ColorParams;
if (cp.IsMixed) if (cp.IsMixed || _forceInputOverrides)
{ {
string range = string.IsNullOrWhiteSpace(cp.ColorRange) ? "tv" : cp.ColorRange;
inputOverrides = inputOverrides =
$"irange={cp.ColorRange}:ispace={cp.ColorSpace}:itrc={cp.ColorTransfer}:iprimaries={cp.ColorPrimaries}:"; $"irange={range}:ispace={cp.ColorSpace}:itrc={cp.ColorTransfer}:iprimaries={cp.ColorPrimaries}:";
} }
string colorspace = _desiredPixelFormat.BitDepth switch string colorspace = _desiredPixelFormat.BitDepth switch

2
ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

@ -262,7 +262,7 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
if (!videoStream.ColorParams.IsBt709) if (!videoStream.ColorParams.IsBt709)
{ {
_logger.LogDebug("Adding colorspace filter"); _logger.LogDebug("Adding colorspace filter");
var colorspace = new ColorspaceFilter(videoStream, format, currentState.FrameDataLocation); var colorspace = new ColorspaceFilter(videoStream, format, false, currentState.FrameDataLocation);
currentState = colorspace.NextState(currentState); currentState = colorspace.NextState(currentState);
result.Add(colorspace); result.Add(colorspace);

12
ErsatzTV.FFmpeg/Pipeline/QsvPipelineBuilder.cs

@ -190,6 +190,7 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder
} }
List<IPipelineFilterStep> pixelFormatFilterSteps = SetPixelFormat( List<IPipelineFilterStep> pixelFormatFilterSteps = SetPixelFormat(
videoInputFile,
videoStream, videoStream,
desiredState.PixelFormat, desiredState.PixelFormat,
ffmpegState, ffmpegState,
@ -207,6 +208,7 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder
} }
private List<IPipelineFilterStep> SetPixelFormat( private List<IPipelineFilterStep> SetPixelFormat(
VideoInputFile videoInputFile,
VideoStream videoStream, VideoStream videoStream,
Option<IPixelFormat> desiredPixelFormat, Option<IPixelFormat> desiredPixelFormat,
FFmpegState ffmpegState, FFmpegState ffmpegState,
@ -233,7 +235,15 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder
if (!videoStream.ColorParams.IsBt709) if (!videoStream.ColorParams.IsBt709)
{ {
_logger.LogDebug("Adding colorspace filter"); _logger.LogDebug("Adding colorspace filter");
var colorspace = new ColorspaceFilter(videoStream, format, currentState.FrameDataLocation);
// vpp_qsv seems to strip color info, so if we use that at all, force overriding input color info
bool forceInputOverrides = videoInputFile.FilterSteps.Any(f => f is QsvFormatFilter or ScaleQsvFilter);
var colorspace = new ColorspaceFilter(
videoStream,
format,
forceInputOverrides,
currentState.FrameDataLocation);
// force nv12 if we're still in hardware // force nv12 if we're still in hardware
if (currentState.FrameDataLocation == FrameDataLocation.Hardware) if (currentState.FrameDataLocation == FrameDataLocation.Hardware)

2
ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

@ -240,7 +240,7 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder
if (!videoStream.ColorParams.IsBt709) if (!videoStream.ColorParams.IsBt709)
{ {
_logger.LogDebug("Adding colorspace filter"); _logger.LogDebug("Adding colorspace filter");
var colorspace = new ColorspaceFilter(videoStream, format, currentState.FrameDataLocation); var colorspace = new ColorspaceFilter(videoStream, format, false, currentState.FrameDataLocation);
currentState = colorspace.NextState(currentState); currentState = colorspace.NextState(currentState);
result.Add(colorspace); result.Add(colorspace);
} }

Loading…
Cancel
Save