示例#1
0
 public TransformedResizeableFilter(Func <IFilter, IFilter> transformation, IResizeableFilter inputFilter)
     : base(new IFilter[0])
 {
     m_InputFilter     = inputFilter;
     PassthroughFilter = transformation(m_InputFilter);
     CheckSize();
 }
示例#2
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                var nedi1Shader           = CompileShader("NEDI-I.hlsl");
                var nedi2Shader           = CompileShader("NEDI-II.hlsl");
                var nediHInterleaveShader = CompileShader("NEDI-HInterleave.hlsl");
                var nediVInterleaveShader = CompileShader("NEDI-VInterleave.hlsl");

                Func <Size, Size> transformWidth;
                Func <Size, Size> transformHeight;

                if (Centered)
                {
                    transformWidth  = s => new Size(2 * s.Width - 1, s.Height);
                    transformHeight = s => new Size(s.Width, 2 * s.Height - 1);
                }
                else
                {
                    transformWidth  = s => new Size(2 * s.Width, s.Height);
                    transformHeight = s => new Size(s.Width, 2 * s.Height);
                }

                if (!UseNedi(sourceFilter))
                {
                    return(sourceFilter);
                }

                var nedi1 = new ShaderFilter(nedi1Shader, LumaConstants, sourceFilter);
                var nediH = new ShaderFilter(nediHInterleaveShader, transformWidth, sourceFilter, nedi1);
                var nedi2 = new ShaderFilter(nedi2Shader, LumaConstants, nediH);
                var nediV = new ShaderFilter(nediVInterleaveShader, transformHeight, nediH, nedi2);

                return(nediV);
            }
 public TransformedResizeableFilter(Func <IFilter, IFilter> transformation, IResizeableFilter inputFilter)
     : base(new IBaseFilter[0])
 {
     m_InputFilter     = inputFilter;
     CompilationResult = transformation(m_InputFilter);
     CheckSize();
 }
示例#4
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                Create3DTexture();
                var shader = CompileShader("Lut3D.hlsl");

                return(new ShaderFilter(shader, true, sourceFilter, new Texture3DSourceFilter(m_Texture3D)));
            }
示例#5
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                CreateTextures();
                var shader = CompileShader("CustomTextures.hlsl");

                return(new ShaderFilter(shader, sourceFilter, new TextureSourceFilter(m_Texture1),
                                        new TextureSourceFilter(m_Texture2)));
            }
 public override IFilter CreateFilter(IResizeableFilter sourceFilter)
 {
     if (UseImageProcessor(sourceFilter))
     {
         return(ShaderFileNames.Aggregate((IFilter)sourceFilter,
                                          (current, filename) => new ShaderFilter(CompileShader(filename), current)));
     }
     return(sourceFilter);
 }
示例#7
0
 public override IFilter CreateFilter(IResizeableFilter sourceFilter)
 {
     if (SelectedOption != null)
     {
         return(SelectedOption.CreateFilter(sourceFilter));
     }
     else
     {
         return(sourceFilter);
     }
 }
示例#8
0
 public override IFilter CreateFilter(IResizeableFilter sourceFilter)
 {
     if (Script != null)
     {
         return(Script.GetChain().CreateFilter(sourceFilter));
     }
     else
     {
         return(sourceFilter);
     }
 }
示例#9
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                // get MPDN to scale image to target size first
                sourceFilter += new Resizer {
                    ResizerOption = ResizerOption.TargetSize100Percent
                };

                // apply our blue tint
                var blueTint = CompileShader("BlueTintSm3.hlsl");

                return(new ShaderFilter(blueTint, false, new[] { 0.25f, 0.5f, 0.75f }, sourceFilter));
            }
示例#10
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                if (!Activate || !File.Exists(FileName))
                {
                    return(sourceFilter);
                }

                Create3DTexture();
                var shader = CompileShader("Lut3D.hlsl");

                return(new ShaderFilter(shader, true, sourceFilter, new Texture3DSourceFilter(m_Texture3D)));
            }
示例#11
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                var inputSize  = sourceFilter.OutputSize;
                var targetSize = TargetSize();

                // Skip if downscaling
                if (targetSize.Width <= inputSize.Width && targetSize.Height <= inputSize.Height)
                {
                    return(sourceFilter);
                }
                else
                {
                    return(CreateFilter(sourceFilter, sourceFilter));
                }
            }
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                var chromaShader = CompileShader("Chroma.hlsl");

                var yInput = new YSourceFilter();
                var uInput = new USourceFilter();
                var vInput = new VSourceFilter();

                float[] offset = { 0.0f, 0.5f };

                var chroma = new ShaderFilter(chromaShader, new[] { B, C, offset[0], offset[1] }, yInput, uInput, vInput);
                var rgb    = chroma.ConvertToRgb();

                return(rgb);
            }
示例#13
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                if (!Renderer.IsDx11Avail)
                {
                    return(new NullFilter()); // display blank screen on purpose
                }
                // get MPDN to scale image to target size first
                sourceFilter += new Resizer {
                    ResizerOption = ResizerOption.TargetSize100Percent
                };

                // apply our blue tint
                var blueTint = CompileShader11("BlueTintSm5.hlsl", "ps_5_0");

                return(new Shader11Filter(blueTint, false, new[] { 0.25f, 0.5f, 0.75f }, sourceFilter));
            }
示例#14
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                if (!Renderer.IsDx11Avail)
                {
                    return(new NullFilter()); // display blank screen on purpose
                }
                // get MPDN to scale image to target size first
                sourceFilter += new Resizer {
                    ResizerOption = ResizerOption.TargetSize100Percent
                };

                // apply our blue tint
                var blueTint = CompileShader11("BlueTintDirectCompute.hlsl", "cs_5_0");
                var width    = sourceFilter.OutputSize.Width;
                var height   = sourceFilter.OutputSize.Height;

                return(new DirectComputeFilter(blueTint, width / 32 + 1, height / 32 + 1, 1, new[] { 0.25f, 0.5f, 0.75f },
                                               sourceFilter));
            }
示例#15
0
 public override IFilter CreateFilter(IResizeableFilter sourceFilter)
 {
     return(new ResizeFilter(sourceFilter, GetOutputSize(),
                             Upscaler ?? Renderer.LumaUpscaler, Downscaler ?? Renderer.LumaDownscaler));
 }
示例#16
0
 public abstract IFilter CreateFilter(IResizeableFilter sourceFilter);
示例#17
0
 public override IFilter CreateFilter(IResizeableFilter sourceFilter)
 {
     return(m_Compiler(sourceFilter));
 }
示例#18
0
 public TransformedResizeableFilter(Func <ITextureFilter, ITextureFilter> transformation, IResizeableFilter inputFilter)
     : base(inputFilter)
 {
     m_InputFilter    = inputFilter;
     m_Transformation = transformation;
 }
示例#19
0
 public static IResizeableFilter Transform(this IResizeableFilter filter, Func <ITextureFilter, ITextureFilter> transformation)
 {
     return(new TransformedResizeableFilter(transformation, filter));
 }
示例#20
0
 public override IFilter CreateFilter(IResizeableFilter sourceFilter)
 {
     return(ScriptList.Select(pair => pair.GetChain()).Aggregate(sourceFilter, (a, b) => a + b));
 }
示例#21
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                IFilter yuv;

                var chromaSize = Renderer.ChromaSize;
                var targetSize = sourceFilter.OutputSize;

                var Diff       = CompileShader("SuperChromaRes/Diff.hlsl");
                var CopyLuma   = CompileShader("SuperChromaRes/CopyLuma.hlsl");
                var CopyChroma = CompileShader("SuperChromaRes/CopyChroma.hlsl");
                var SuperRes   = CompileShader("SuperChromaRes/SuperRes.hlsl");

                var GammaToLab    = CompileShader("GammaToLab.hlsl");
                var LabToGamma    = CompileShader("LabToGamma.hlsl");
                var LinearToGamma = CompileShader("LinearToGamma.hlsl");
                var GammaToLinear = CompileShader("GammaToLinear.hlsl");
                var LabToLinear   = CompileShader("LabToLinear.hlsl");
                var LinearToLab   = CompileShader("LinearToLab.hlsl");

                // Skip if downscaling
                if (targetSize.Width <= chromaSize.Width && targetSize.Height <= chromaSize.Height)
                {
                    return(sourceFilter);
                }

                // Original values
                var yInput = new YSourceFilter();
                var uInput = new USourceFilter();
                var vInput = new VSourceFilter();

                float[] YuvConsts = new float[2];
                switch (Renderer.Colorimetric)
                {
                case YuvColorimetric.Auto: return(sourceFilter);

                case YuvColorimetric.FullRangePc601: YuvConsts = new[] { 0.114f, 0.299f, 0.0f }; break;

                case YuvColorimetric.FullRangePc709: YuvConsts = new[] { 0.0722f, 0.2126f, 0.0f }; break;

                case YuvColorimetric.FullRangePc2020: YuvConsts = new[] { 0.0593f, 0.2627f, 0.0f }; break;

                case YuvColorimetric.ItuBt601: YuvConsts = new[] { 0.114f, 0.299f, 1.0f }; break;

                case YuvColorimetric.ItuBt709: YuvConsts = new[] { 0.0722f, 0.2126f, 1.0f }; break;

                case YuvColorimetric.ItuBt2020: YuvConsts = new[] { 0.0593f, 0.2627f, 1.0f }; break;
                }

                var Consts = new[] { Strength, Sharpness, AntiAliasing, AntiRinging,
                                     Softness, YuvConsts[0], YuvConsts[1] };

                yuv = sourceFilter.ConvertToYuv();

                for (int i = 1; i <= Passes; i++)
                {
                    IFilter res, diff, linear;
                    bool    useBilinear = (upscaler is Scaler.Bilinear) || (FirstPassOnly && !(i == 1));

                    // Compare to chroma
                    linear = new ShaderFilter(GammaToLinear, yuv.ConvertToRgb());
                    res    = new ResizeFilter(linear, chromaSize, upscaler, downscaler);
                    res    = new ShaderFilter(LinearToGamma, res).ConvertToYuv();
                    diff   = new ShaderFilter(Diff, YuvConsts, res, uInput, vInput);
                    if (!useBilinear)
                    {
                        diff = new ResizeFilter(diff, targetSize, upscaler, downscaler); // Scale to output size
                    }
                    // Update result
                    yuv = new ShaderFilter(SuperRes, useBilinear, Consts, yuv, diff, uInput, vInput);
                }

                return(yuv.ConvertToRgb());
            }
示例#22
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                var upscaler   = new Scaler.Custom(new GaussianBlur(0.75), ScalerTaps.Four, false);
                var downscaler = new Scaler.HwBilinear(); // Good enough (?)

                int bits = 8;

                switch (Renderer.InputFormat)
                {
                case FrameBufferInputFormat.P010: bits = 10; break;

                case FrameBufferInputFormat.Y410: bits = 10; break;

                case FrameBufferInputFormat.P016: bits = 16; break;

                case FrameBufferInputFormat.Y416: bits = 16; break;

                case FrameBufferInputFormat.Rgb24: return(sourceFilter);

                case FrameBufferInputFormat.Rgb32: return(sourceFilter);
                }
                if (bits > maxbitdepth)
                {
                    return(sourceFilter);
                }

                var inputsize = sourceFilter.OutputSize;
                var size      = inputsize;
                var current   = sourceFilter.ConvertToYuv();

                var factor     = 2.0;
                var downscaled = new Stack <IFilter>();

                downscaled.Push(current);

                // Generate downscaled images
                for (int i = 0; i < 8; i++)
                {
                    size = new Size((int)Math.Floor(size.Width / factor), (int)Math.Floor(size.Height / factor));
                    if (size.Width == 0 || size.Height == 0)
                    {
                        break;
                    }

                    current = new ResizeFilter(current, size, upscaler, downscaler);
                    downscaled.Push(current);
                }

                var deband = downscaled.Pop();

                while (downscaled.Count > 0)
                {
                    deband = new ShaderFilter(CompileShader("Deband.hlsl"), true,
                                              new[]
                    {
                        (1 << bits) - 1,
                        advancedMode ? threshold : DEFAULT_THRESHOLD,
                        advancedMode ? margin : DEFAULT_MARGIN
                    },
                                              downscaled.Pop(), deband);
                }

                return(deband.ConvertToRgb());
            }
 public TransformedResizeableFilter(Func<IFilter, IFilter> transformation, IResizeableFilter inputFilter)
     : base(new IBaseFilter[0])
 {
     m_InputFilter = inputFilter;
     CompilationResult = transformation(m_InputFilter);
     CheckSize();
 }
示例#24
0
            public override IFilter CreateFilter(IResizeableFilter sourceFilter)
            {
                // Scale chroma first (this bypasses MPDN's chroma scaler)
                sourceFilter += new BicubicChroma {
                    Preset = Presets.MitchellNetravali
                };

                if (Renderer.InterlaceFlags.HasFlag(InterlaceFlags.IsInterlaced))
                {
                    // Deinterlace using blend
                    sourceFilter += new ImageProcessor {
                        ShaderFileNames = Deinterlace
                    };
                }

                // Pre resize shaders, followed by NEDI image doubler
                sourceFilter += new ImageProcessor {
                    ShaderFileNames = PreProcess
                };

                // Use NEDI once only.
                // Note: To use NEDI as many times as required to get the image past target size,
                //       Change the following *if* to *while*
                if (IsUpscalingFrom(sourceFilter)) // See CombinedChain for other comparer methods
                {
                    sourceFilter += new Nedi {
                        AlwaysDoubleImage = true
                    };
                }

                if (IsDownscalingFrom(sourceFilter))
                {
                    // Use linear light for downscaling
                    sourceFilter += new ImageProcessor {
                        ShaderFileNames = ToLinear
                    }
                    +new Resizer {
                        ResizerOption = ResizerOption.TargetSize100Percent
                    }
                    +new ImageProcessor {
                        ShaderFileNames = ToGamma
                    };
                }
                else
                {
                    // Otherwise, scale with gamma light
                    sourceFilter += new Resizer {
                        ResizerOption = ResizerOption.TargetSize100Percent
                    };
                }

                if (Renderer.VideoSize.Width < 1920)
                {
                    // Sharpen only if video isn't full HD
                    sourceFilter += new ImageProcessor {
                        ShaderFileNames = PostProcess
                    };
                }

                return(sourceFilter);
            }
示例#25
0
 public TransformedResizeableFilter(Func<IFilter, IFilter> transformation, IResizeableFilter inputFilter)
 {
     m_InputFilter = inputFilter;
     m_Transformation = transformation;
 }