public PlanarPipelineContext(PixelSource sourceY, PixelSource sourceCb, PixelSource sourceCr) { if (sourceY.Format.FormatGuid != Consts.GUID_WICPixelFormat8bppY) { throw new ArgumentException("Invalid pixel format", nameof(sourceY)); } if (sourceCb.Format.FormatGuid != Consts.GUID_WICPixelFormat8bppCb) { throw new ArgumentException("Invalid pixel format", nameof(sourceCb)); } if (sourceCr.Format.FormatGuid != Consts.GUID_WICPixelFormat8bppCr) { throw new ArgumentException("Invalid pixel format", nameof(sourceCr)); } SourceY = sourceY; SourceCb = sourceCb; SourceCr = sourceCr; ChromaSubsampling = sourceCb.Width < sourceY.Width && sourceCb.Height < sourceY.Height ? ChromaSubsampleMode.Subsample420 : sourceCb.Width < sourceY.Width ? ChromaSubsampleMode.Subsample422 : sourceCb.Height < sourceY.Height ? ChromaSubsampleMode.Subsample440 : ChromaSubsampleMode.Subsample444; }
public static void AddPlanarHighQualityScaler(PipelineContext ctx, ChromaSubsampleMode subsample) { Debug.Assert(ctx.PlanarContext is not null); AddHighQualityScaler(ctx); ctx.PlanarContext.SourceY = ctx.Source; ctx.Source = ctx.PlanarContext.SourceCb; if (subsample.IsSubsampledX()) { ctx.Settings.InnerSize.Width = MathUtil.DivCeiling(ctx.Settings.InnerSize.Width, 2); } if (subsample.IsSubsampledY()) { ctx.Settings.InnerSize.Height = MathUtil.DivCeiling(ctx.Settings.InnerSize.Height, 2); } AddHighQualityScaler(ctx); ctx.PlanarContext.SourceCb = ctx.Source; ctx.Source = ctx.PlanarContext.SourceCr; AddHighQualityScaler(ctx); ctx.PlanarContext.SourceCr = ctx.Source; ctx.Source = ctx.PlanarContext.SourceY; }
public static bool IsSubsampledY(this ChromaSubsampleMode o) => IsSubsampledY((WICJpegYCrCbSubsamplingOption)o);
public static bool IsSubsampledY(this ChromaSubsampleMode o) => o == ChromaSubsampleMode.Subsample420 || o == ChromaSubsampleMode.Subsample440;