Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }