public override VideoFrame GetFrame(int n, ScriptEnvironment env) { var resFrame = NewVideoFrame(env); if (realPlanar) { OverlayUtils.ResetChroma(resFrame); } using (var srcFrame = base.GetFrame(n, env)) { unsafe { var src = (byte *)srcFrame.GetReadPtr(); var srcStride = srcFrame.GetPitch(); var dest = (byte *)resFrame.GetWritePtr(); var destStride = resFrame.GetPitch(); var rowSize = resFrame.GetRowSize(); for (var y = 0; y < height; y++, src += srcStride, dest += destStride) { for (var x = 0; x < rowSize; x++) { var val = src[x]; dest[x] = val >= low && val <= high ? byte.MaxValue : byte.MinValue; } } } } return(resFrame); }
public override VideoFrame GetFrame(int n, ScriptEnvironment env) { var resFrame = NewVideoFrame(env); if (realPlanar && greyMask) { OverlayUtils.ResetChroma(resFrame); } using var srcFrame = base.GetFrame(n, env); unsafe { var planes = greyMask ? new[] { default(YUVPlanes) } : OverlayUtils.GetPlanes(GetVideoInfo().pixel_type); Parallel.ForEach(planes, plane => { var srcStride = srcFrame.GetPitch(plane); var destStride = resFrame.GetPitch(plane); var width = resFrame.GetRowSize(plane) / (hdr ? 2 : 1); var height = resFrame.GetHeight(plane); if (hdr) { var src = (ushort *)srcFrame.GetReadPtr(plane); var dest = (ushort *)resFrame.GetWritePtr(plane); Parallel.For(0, height, y => { var srcData = src + y * srcStride; var destData = dest + y * destStride; for (var x = 0; x < width; x++) { var val = srcData[x]; destData[x] = val >= low && val <= high ? ushort.MaxValue : ushort.MinValue; } }); } else { var src = (byte *)srcFrame.GetReadPtr(plane); var dest = (byte *)resFrame.GetWritePtr(plane); Parallel.For(0, height, y => { var srcData = src + y * srcStride; var destData = dest + y * destStride; for (var x = 0; x < width; x++) { var val = srcData[x]; destData[x] = val >= low && val <= high ? byte.MaxValue : byte.MinValue; } }); } }); } return(resFrame); }
public override VideoFrame GetFrame(int n, ScriptEnvironment env) { var resFrame = NewVideoFrame(env); if (realPlanar) { OverlayUtils.ResetChroma(resFrame); } using var srcFrame = base.GetFrame(n, env); unsafe { var srcStride = srcFrame.GetPitch(); var destStride = resFrame.GetPitch(); if (hdr) { var src = (ushort *)srcFrame.GetReadPtr(); var dest = (ushort *)resFrame.GetWritePtr(); Parallel.For(0, height, y => { var srcData = src + y * srcStride; var destData = dest + y * destStride; for (var x = 0; x < width; x++) { var val = srcData[x]; destData[x] = val >= low && val <= high ? ushort.MaxValue : ushort.MinValue; } }); } else { var src = (byte *)srcFrame.GetReadPtr(); var dest = (byte *)resFrame.GetWritePtr(); Parallel.For(0, height, y => { var srcData = src + y * srcStride; var destData = dest + y * destStride; for (var x = 0; x < width; x++) { var val = srcData[x]; destData[x] = val >= low && val <= high ? byte.MaxValue : byte.MinValue; } }); } } return(resFrame); }
public override VideoFrame GetFrame(int n, ScriptEnvironment env) { var frame = NewVideoFrame(env); if (realPlanar) { OverlayUtils.ResetChroma(frame); } OverlayUtils.MemSet(frame.GetWritePtr(), byte.MaxValue, frame.GetHeight() * frame.GetPitch()); var stride = frame.GetPitch(); var pixelSize = frame.GetRowSize() / GetVideoInfo().width; var random = new Random(seed == int.MaxValue ? n : seed); unsafe { void LeftRight(int length, Func <int, int> offset) { if (length > 0) { for (var x = 0; x < length; x++) { var data = (byte *)frame.GetWritePtr() + offset(x) * pixelSize; var gradientVal = GradientVal(x, length); for (var y = 0; y < height; y++, data += stride) { var val = gradientVal; if (noise && random.Next(length + 1) > x && random.Next(length + 1) > x) { val = 0; } if (val != byte.MaxValue) { for (var i = 0; i < pixelSize; i++) { data[i] = val; } } } } } } void TopBottom(int length, Func <int, int> offset) { if (length > 0) { for (var y = 0; y < length; y++) { var data = (byte *)frame.GetWritePtr() + offset(rgb ? (height - y - 1) : y) * stride; var gradientVal = GradientVal(y, length); for (var x = 0; x < width; x++, data += pixelSize) { var val = gradientVal; if (noise && random.Next(length + 1) > y && random.Next(length + 1) > y) { val = 0; } if (val != byte.MaxValue && data[0] > val) { for (var i = 0; i < pixelSize; i++) { data[i] = val; } } } } } } LeftRight(left, x => x); LeftRight(right, x => width - x - 1); TopBottom(top, y => y); TopBottom(bottom, y => height - y - 1); } return(frame); }
protected override VideoFrame GetFrame(int n) { var frame = NewVideoFrame(StaticEnv); if (realPlanar) { OverlayUtils.ResetChroma(frame); } OverlayUtils.MemSet(frame.GetWritePtr(), byte.MaxValue, frame.GetHeight() * frame.GetPitch()); var stride = frame.GetPitch() / byteDepth; var pixelSize = frame.GetRowSize() / (GetVideoInfo().width *byteDepth); var random = new FastRandom(Seed == 0 ? n : Seed); unsafe { void LeftRightByte(int length, Func <int, int> offset) { if (length == 0) { return; } for (var x = 0; x < length; x++) { var data = (byte *)frame.GetWritePtr() + offset(x) * pixelSize; var gradientVal = GradientValByte(x, length); for (var y = 0; y < Height; y++, data += stride) { var val = gradientVal; if (Noise && random.Next(length) > x && random.Next(length) > x) { val = 0; } if (val != byte.MaxValue) { for (var i = 0; i < pixelSize; i++) { data[i] = val; } } } } } void TopBottomByte(int length, Func <int, int> offset) { if (length == 0) { return; } for (var y = 0; y < length; y++) { var data = (byte *)frame.GetWritePtr() + offset(rgb ? (Height - y - 1) : y) * stride; var gradientVal = GradientValByte(y, length); for (var x = 0; x < Width; x++, data += pixelSize) { var val = gradientVal; if (Noise && random.Next(length) > y && random.Next(length) > y) { val = 0; } if (val != byte.MaxValue && data[0] > val) { for (var i = 0; i < pixelSize; i++) { data[i] = val; } } } } } void LeftRightShort(int length, Func <int, int> offset) { if (length == 0) { return; } for (var x = 0; x < length; x++) { var data = (ushort *)frame.GetWritePtr() + offset(x) * pixelSize; var gradientVal = GradientValShort(x, length); for (var y = 0; y < Height; y++, data += stride) { var val = gradientVal; if (Noise && random.Next(length) > x && random.Next(length) > x) { val = 0; } if (val != shortMaxValue) { for (var i = 0; i < pixelSize; i++) { data[i] = val; } } } } } void TopBottomShort(int length, Func <int, int> offset) { if (length == 0) { return; } for (var y = 0; y < length; y++) { var data = (ushort *)frame.GetWritePtr() + offset(rgb ? (Height - y - 1) : y) * stride; var gradientVal = GradientValShort(y, length); for (var x = 0; x < Width; x++, data += pixelSize) { var val = gradientVal; if (Noise && random.Next(length) > y && random.Next(length) > y) { val = 0; } if (val != shortMaxValue && data[0] > val) { for (var i = 0; i < pixelSize; i++) { data[i] = val; } } } } } if (GetVideoInfo().pixel_type.GetBitDepth() == 8) { Parallel.Invoke(() => LeftRightByte(Left, x => x), () => LeftRightByte(Right, x => Width - x - 1)); Parallel.Invoke(() => TopBottomByte(Top, y => y), () => TopBottomByte(Bottom, y => Height - y - 1)); } else { Parallel.Invoke(() => LeftRightShort(Left, x => x), () => LeftRightShort(Right, x => Width - x - 1)); Parallel.Invoke(() => TopBottomShort(Top, y => y), () => TopBottomShort(Bottom, y => Height - y - 1)); } } return(frame); }