From 25ea75b761d9dba3be240f19088515f7a693df0f Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Fri, 25 Nov 2022 21:25:04 -0600 Subject: [PATCH] more color fixes (#1040) --- ErsatzTV.FFmpeg/ColorParams.cs | 2 ++ ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs | 15 +++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ErsatzTV.FFmpeg/ColorParams.cs b/ErsatzTV.FFmpeg/ColorParams.cs index bdcda80a2..92f58855e 100644 --- a/ErsatzTV.FFmpeg/ColorParams.cs +++ b/ErsatzTV.FFmpeg/ColorParams.cs @@ -10,6 +10,8 @@ public record ColorParams(string ColorRange, string ColorSpace, string ColorTran string.IsNullOrWhiteSpace(ColorTransfer) && string.IsNullOrWhiteSpace(ColorPrimaries); + public bool IsMixed => ColorSpace != ColorTransfer || ColorTransfer != ColorPrimaries; + public bool IsBt709 { get diff --git a/ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs b/ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs index ece4eeb12..a69e27441 100644 --- a/ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/ColorspaceFilter.cs @@ -24,20 +24,23 @@ public class ColorspaceFilter : BaseFilter { get { - string setParams = string.Empty; - if (_videoStream.ColorParams.IsUnknown) + string inputOverrides = string.Empty; + ColorParams cp = _videoStream.ColorParams; + if (cp.IsMixed) { - setParams = "setparams=range=tv:colorspace=bt709:color_trc=bt709:color_primaries=bt709"; + inputOverrides = + $"irange={cp.ColorRange}:ispace={cp.ColorSpace}:itrc={cp.ColorTransfer}:iprimaries={cp.ColorPrimaries}:"; } string colorspace = _desiredPixelFormat.BitDepth switch { - 10 when !_videoStream.ColorParams.IsUnknown => "colorspace=all=bt709:format=yuv420p10", - 8 when !_videoStream.ColorParams.IsUnknown => "colorspace=all=bt709:format=yuv420p", + _ when cp.IsUnknown => "setparams=range=tv:colorspace=bt709:color_trc=bt709:color_primaries=bt709", + 10 when !cp.IsUnknown => $"colorspace={inputOverrides}all=bt709:format=yuv420p10", + 8 when !cp.IsUnknown => $"colorspace={inputOverrides}all=bt709:format=yuv420p", _ => string.Empty }; - return string.Join(',', new[] { setParams, colorspace }.Filter(s => !string.IsNullOrWhiteSpace(s))); + return colorspace; } } }