private static unsafe void PaintYuvFrame(Yuv444Frame yuv444Frame, StencilFrame stencilFrame, int startX, int startY, int width, int height) { var yPtr = (byte *)stencilFrame.YPtr.ToPointer(); var uPtr = (byte *)stencilFrame.UPtr.ToPointer(); var vPtr = (byte *)stencilFrame.VPtr.ToPointer(); var alphaPtr = (byte *)stencilFrame.AlphaPtr.ToPointer(); for (var y = startY; y < startY + height; y += 1) { for (var x = startX; x < startX + width; x += 1) { var pixelIndex = stencilFrame.Width * y + x; if (alphaPtr[pixelIndex] <= 0 || yuv444Frame.ColoredBytes[pixelIndex]) { continue; } var stencilChromaIndex = (stencilFrame.Width / 2) * (y / 2) + (x / 2); yuv444Frame.YBytes[pixelIndex] = yPtr[pixelIndex]; yuv444Frame.UBytes[pixelIndex] = uPtr[stencilChromaIndex]; yuv444Frame.VBytes[pixelIndex] = vPtr[stencilChromaIndex]; yuv444Frame.ColoredBytes[pixelIndex] = true; } } }
public static Yuv444Frame PaintYuvFrame(int width, int height, StencilFrame[] stencilFrames) { var resultYuv444 = new Yuv444Frame(width, height); foreach (var stencilFrame in stencilFrames) { PaintYuvFrame(resultYuv444, stencilFrame); } return(resultYuv444); }
private static void PaintYuvFrame(Yuv444Frame yuv444Frame, StencilFrame stencilFrame) { for (var maskYIndex = 0; maskYIndex < 2; maskYIndex += 1) { for (var maskXIndex = 0; maskXIndex < 4; maskXIndex += 1) { var maskIndex = maskYIndex * 4 + maskXIndex; var maskValue = stencilFrame.MaskTree & (1 << maskIndex); var isPassed = maskValue == 0; if (isPassed) { continue; } var startX = maskXIndex * stencilFrame.Width / 4; var startY = maskYIndex * stencilFrame.Height / 2; var width = stencilFrame.Width / 4; var height = stencilFrame.Height / 2; PaintYuvFrame(yuv444Frame, stencilFrame, startX, startY, width, height); } } }