Exemple #1
0
        protected override void Initialize(AVSValue args)
        {
            LimitedRange = LimitedRange && GetVideoInfo().IsPlanar();
            planes       = GetVideoInfo().pixel_type.HasFlag(ColorSpaces.CS_INTERLEAVED)
                ? new[] { default(YUVPlanes) }
                : (Channels ?? "yuv").ToCharArray().Select(p => Enum.Parse(typeof(YUVPlanes), "PLANAR_" + p, true))
            .Cast <YUVPlanes>().ToArray();
            realChannels = GetVideoInfo().IsPlanar()
                ? new[] { 0 }
                : (Channels ?? "rgb").ToLower().ToCharArray().Select(p => "bgr".IndexOf(p)).ToArray();
            if (!OverlayUtils.IsRealPlanar(Child))
            {
                planes = new[] { default(YUVPlanes) }
            }
            ;
            sampleBits    = Sample.GetVideoInfo().pixel_type.GetBitDepth();
            referenceBits = Reference.GetVideoInfo().pixel_type.GetBitDepth();
            var vi = GetVideoInfo();

            vi.pixel_type = vi.pixel_type.ChangeBitDepth(referenceBits);
            SetVideoInfo(ref vi);
            var cacheSize = tr * 2 + 1;
            var cacheKey  = StaticEnv.GetEnv2() == null ? CacheType.CACHE_25_ALL : CacheType.CACHE_GENERIC;

            Child.SetCacheHints(cacheKey, cacheSize);
            Sample.SetCacheHints(cacheKey, cacheSize);
            Reference.SetCacheHints(cacheKey, cacheSize);
            SampleMask?.SetCacheHints(cacheKey, cacheSize);
            ReferenceMask?.SetCacheHints(cacheKey, cacheSize);
            if (Intensity < 1 && sampleBits != referenceBits)
            {
                throw new AvisynthException("Intensity < 1 is not allowed when sample and reference bit depth are not equal");
            }
        }
        protected override void Initialize(AVSValue args)
        {
            Width  = Child?.GetVideoInfo().width ?? args[1].AsInt();
            Height = Child?.GetVideoInfo().height ?? args[2].AsInt();

            Left   = args[3].AsInt(Left);
            Top    = args[4].AsInt(Top);
            Right  = args[5].AsInt(Right);
            Bottom = args[6].AsInt(Bottom);

            Noise    = args[7].AsBool(Noise);
            Gradient = args[8].AsBool(Gradient);
            if (!Noise && !Gradient)
            {
                StaticEnv.ThrowError("No gradient, no noise");
            }
            Seed = args[9].AsInt(Seed);

            var vi = GetVideoInfo();

            vi.width           = Width;
            vi.height          = Height;
            vi.pixel_type      = Child?.GetVideoInfo().pixel_type ?? ColorSpaces.CS_BGR24;
            vi.num_frames      = Child?.GetVideoInfo().num_frames ?? (Noise ? 1000000 : 1);
            vi.fps_numerator   = Child?.GetVideoInfo().fps_numerator ?? 25;
            vi.fps_denominator = Child?.GetVideoInfo().fps_denominator ?? 1;
            SetVideoInfo(ref vi);
            realPlanar    = Child == null || Child.IsRealPlanar(); //Y8 is interleaved
            rgb           = GetVideoInfo().IsRGB();
            bitDepth      = vi.pixel_type.GetBitDepth();
            byteDepth     = bitDepth == 8 ? 1 : 2;
            shortMaxValue = (ushort)((1 << bitDepth) - 1);
        }
Exemple #3
0
        protected override void Initialize(AVSValue args)
        {
            parallelOptions = new ParallelOptions
            {
                MaxDegreeOfParallelism = Threads == 0 ? -1 : Threads
            };
            LimitedRange = LimitedRange && GetVideoInfo().IsPlanar();
            planes       = GetVideoInfo().pixel_type.HasFlag(ColorSpaces.CS_INTERLEAVED)
                ? new[] { default(YUVPlanes) }
                : (Channels ?? "yuv").ToCharArray().Select(p => Enum.Parse(typeof(YUVPlanes), "PLANAR_" + p, true))
            .Cast <YUVPlanes>().ToArray();
            realChannels = GetVideoInfo().IsPlanar()
                ? new[] { 0 }
                : (Channels ?? "rgb").ToLower().ToCharArray().Select(p => "bgr".IndexOf(p)).ToArray();
            if (!Child.IsRealPlanar())
            {
                planes = new[] { default(YUVPlanes) }
            }
            ;
            sampleBits    = Sample.GetVideoInfo().pixel_type.GetBitDepth();
            referenceBits = Reference.GetVideoInfo().pixel_type.GetBitDepth();
            var vi = GetVideoInfo();

            vi.pixel_type = vi.pixel_type.ChangeBitDepth(referenceBits);
            SetVideoInfo(ref vi);
            var cacheSize = AdjacentFramesCount * 2 + 1;
            var cacheKey  = StaticEnv.GetEnv2() == null ? CacheType.CACHE_25_ALL : CacheType.CACHE_GENERIC;

            Child.SetCacheHints(cacheKey, cacheSize);
            Sample.SetCacheHints(cacheKey, cacheSize);
            Reference.SetCacheHints(cacheKey, cacheSize);
            SampleMask?.SetCacheHints(cacheKey, cacheSize);
            ReferenceMask?.SetCacheHints(cacheKey, cacheSize);
            if (Intensity < 1 && sampleBits != referenceBits)
            {
                throw new AvisynthException("Intensity < 1 is not allowed when sample and reference bit depth are not equal");
            }

            histogramCache = !string.IsNullOrEmpty(CacheId)
                ? HistogramCache.Get(CacheId)
                : new HistogramCache(planes, realChannels, SIMD, LimitedRange,
                                     Sample.GetVideoInfo().pixel_type, Reference.GetVideoInfo().pixel_type,
                                     Child.GetVideoInfo().pixel_type, AdjacentFramesCount, GreyMask, parallelOptions);

            if (histogramCache == null)
            {
                throw new AvisynthException($"$Histogram cache with ID: {CacheId} not found");
            }
        }
        protected override VideoFrame GetFrame(int n)
        {
            var frame = base.GetFrame(n);

            StaticEnv.MakeWritable(frame);
            unsafe
            {
                using (var stream = new UnmanagedMemoryStream((byte *)frame.GetWritePtr().ToPointer(),
                                                              frame.GetRowSize(), frame.GetRowSize(), FileAccess.Write))
                    using (var writer = new BinaryWriter(stream))
                    {
                        writer.Write(nameof(OverlayConfig));
                        writer.Write(MinOverlayArea);
                        writer.Write(MinSourceArea);
                        writer.Write(AspectRatio1);
                        writer.Write(AspectRatio2);
                        writer.Write(Angle1);
                        writer.Write(Angle2);
                        writer.Write(MinSampleArea);
                        writer.Write(RequiredSampleArea);
                        writer.Write(MaxSampleDiff);
                        writer.Write(Subpixel);
                        writer.Write(ScaleBase);
                        writer.Write(Branches);
                        writer.Write(AcceptableDiff);
                        writer.Write(Correction);
                        writer.Write(MinX);
                        writer.Write(MaxX);
                        writer.Write(MinY);
                        writer.Write(MaxY);
                        writer.Write(MinArea);
                        writer.Write(MaxArea);
                        writer.Write(FixedAspectRatio);
                        writer.Write(BranchMaxDiff);
                        writer.Write(WarpSteps);
                        writer.Write(WarpOffset);
                        writer.Write(WarpPoints.Count);
                        foreach (var point in WarpPoints)
                        {
                            writer.Write(point.X);
                            writer.Write(point.Y);
                            writer.Write(point.Right);
                            writer.Write(point.Bottom);
                        }
                    }
            }
            return(frame);
        }
Exemple #5
0
        protected override VideoFrame GetFrame(int n)
        {
            var frame = base.GetFrame(n);

            StaticEnv.MakeWritable(frame);
            unsafe
            {
                using var stream = new UnmanagedMemoryStream(
                          (byte *)frame.GetWritePtr().ToPointer(),
                          frame.GetRowSize(), frame.GetRowSize(), FileAccess.Write);
                using var writer = new BinaryWriter(stream);
                writer.Write(nameof(Rect));
                writer.Write(Left);
                writer.Write(Top);
                writer.Write(Right);
                writer.Write(Bottom);
            }
            return(frame);
        }
Exemple #6
0
        protected override VideoFrame GetFrame(int n)
        {
            var input = Child.GetFrame(n, StaticEnv);

            if (Intensity <= double.Epsilon)
            {
                return(input);
            }
            var writable   = GetVideoInfo().pixel_type == Child.GetVideoInfo().pixel_type&& StaticEnv.MakeWritable(input);
            var output     = writable ? input : NewVideoFrame(StaticEnv);
            var pixelSize  = Sample.GetVideoInfo().IsRGB() ? 3 : 1;
            var firstFrame = Math.Max(0, n - AdjacentFramesCount);
            var lastFrame  = Math.Min(Child.GetVideoInfo().num_frames - 1, n + AdjacentFramesCount);
            var dimensions = new[]
            {
                Enumerable.Range(n, lastFrame - n + 1),
                Enumerable.Range(firstFrame, n - firstFrame)
            }.SelectMany(range => range.Select(frame =>
            {
                using (new VideoFrameCollector())
                    return(string.IsNullOrEmpty(CacheId) || frame == n
                        ? histogramCache.GetFrame(frame,
                                                  () => Extrapolation ? (frame == n ? input : Child.GetFrame(frame, StaticEnv)) : null,
                                                  () => Sample.GetFrame(frame, StaticEnv),
                                                  () => Reference.GetFrame(frame, StaticEnv),
                                                  () => SampleMask?.GetFrame(frame, StaticEnv),
                                                  () => ReferenceMask?.GetFrame(frame, StaticEnv))
                        : histogramCache[frame]);
            }).TakeWhile(dims =>
            {
                var current = histogramCache[n];
                return(dims != null && current.All(pair =>
                                                   current == dims || !dims[pair.Key].Empty &&
                                                   CompareHist(dims[pair.Key].DiffHist, pair.Value.DiffHist) < AdjacentFramesDiff));
            }).SelectMany(p => p)).ToList();

            Parallel.ForEach(planes, parallelOptions, plane =>
            {
                Parallel.ForEach(realChannels, parallelOptions, channel =>
                {
                    var currentDimensions = dimensions
                                            .Where(p => p.Key.Equal(plane, channel))
                                            .Select(p => p.Value).ToArray();
                    var sampleHist    = AverageHist(sampleBits, currentDimensions.Select(p => p.SampleHist).ToArray());
                    var referenceHist = AverageHist(referenceBits, currentDimensions.Select(p => p.ReferenceHist).ToArray());

                    if (sampleHist == null || referenceHist == null)
                    {
                        return;
                    }

                    var map = GetTransitionMap(sampleHist, referenceHist, n, plane);

                    if (Extrapolation)
                    {
                        var srcHist = AverageHist(referenceBits, currentDimensions.Select(p => p.InputHist).ToArray());
                        Extrapolate(map, srcHist, GetLowColor(referenceBits), GetHighColor(referenceBits, plane));
                    }

                    Interpolate(map, GetLowColor(referenceBits), GetHighColor(referenceBits, plane), sampleBits, referenceBits);

                    if (Intensity < 1)
                    {
                        var decreased = new ColorMap(sampleBits, n, Dither);
                        for (var color = 0; color < 1 << sampleBits; color++)
                        {
                            decreased.AddReal(color, map.Average(color) * Intensity + color * (1 - Intensity));
                        }
                        map = decreased;
                    }

                    var tuple = map.GetColorsAndWeights();

                    NativeUtils.ApplyColorMap(DynamicNoise ? Seed ^ n : 0,
                                              input.GetReadPtr(plane), input.GetPitch(plane), sampleBits > 8,
                                              output.GetWritePtr(plane), output.GetPitch(plane), referenceBits > 8,
                                              input.GetRowSize(plane), input.GetHeight(plane), pixelSize, channel,
                                              map.FixedMap, tuple.Item1, tuple.Item2);
                });
            });

            if (!writable)
            {
                input.Dispose();
            }
            return(output);
        }
Exemple #7
0
        protected override VideoFrame GetFrame(int n)
        {
            var input           = Child.GetFrame(n, StaticEnv);
            var sampleFrames    = Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Sample.GetFrame(p, StaticEnv)).ToList();
            var referenceFrames = Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Reference.GetFrame(p, StaticEnv)).ToList();
            var writable        = GetVideoInfo().pixel_type == Child.GetVideoInfo().pixel_type&& StaticEnv.MakeWritable(input);
            var output          = writable ? input : NewVideoFrame(StaticEnv);

            using (var sampleMaskFrame = SampleMask?.GetFrame(n, StaticEnv))
                using (var refMaskFrame = ReferenceMask?.GetFrame(n, StaticEnv))
                {
                    var pixelSize = Sample.GetVideoInfo().IsRGB() ? 3 : 1;
                    Parallel.ForEach(planes, plane =>
                    {
                        Parallel.ForEach(realChannels, channel =>
                        {
                            int[] sampleHist = null, referenceHist = null;
                            Parallel.Invoke(
                                () => sampleHist    = GetHistogram(sampleFrames, sampleMaskFrame, pixelSize, channel, plane, Sample.GetVideoInfo().pixel_type, sampleBits, false),
                                () => referenceHist = GetHistogram(referenceFrames, refMaskFrame, pixelSize, channel, plane, Reference.GetVideoInfo().pixel_type, referenceBits, LimitedRange));

                            var map = GetTransitionMap(sampleHist, referenceHist, n, plane);

                            var tuple = map.GetColorsAndWeights();

                            NativeUtils.ApplyColorMap(
                                input.GetReadPtr(plane), input.GetPitch(plane), sampleBits > 8,
                                output.GetWritePtr(plane), output.GetPitch(plane), referenceBits > 8,
                                input.GetRowSize(plane), input.GetHeight(plane), pixelSize, channel,
                                map.fixedMap, tuple.Item1, tuple.Item2);
                        });
                    });
                }
            if (!writable)
            {
                input.Dispose();
            }
            sampleFrames.ForEach(p => p.Dispose());
            referenceFrames.ForEach(p => p.Dispose());
            return(output);
        }
Exemple #8
0
        protected override VideoFrame GetFrame(int n)
        {
            var input = Child.GetFrame(n, StaticEnv);

            if (Intensity <= double.Epsilon)
            {
                return(input);
            }
            var sampleFrames    = Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Sample.GetFrame(p, StaticEnv)).ToList();
            var referenceFrames = Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Reference.GetFrame(p, StaticEnv)).ToList();
            var inputFrames     = tr == 0
                ? new List <VideoFrame> {
                input
            }
                : Enumerable.Range(n - tr, tr * 2 + 1).Select(p => Child.GetFrame(p, StaticEnv)).ToList();
            var writable = GetVideoInfo().pixel_type == Child.GetVideoInfo().pixel_type&& StaticEnv.MakeWritable(input);
            var output   = writable ? input : NewVideoFrame(StaticEnv);

            using (var sampleMaskFrame = SampleMask?.GetFrame(n, StaticEnv))
                using (var refMaskFrame = ReferenceMask?.GetFrame(n, StaticEnv))
                {
                    var pixelSize = Sample.GetVideoInfo().IsRGB() ? 3 : 1;
                    Parallel.ForEach(planes, plane =>
                    {
                        Parallel.ForEach(realChannels, channel =>
                        {
                            int[] sampleHist = null, referenceHist = null, srcHist = null;

                            Parallel.Invoke(
                                () => sampleHist    = GetHistogram(sampleFrames, sampleMaskFrame, pixelSize, channel, plane, Sample.GetVideoInfo().pixel_type, sampleBits, false),
                                () => referenceHist = GetHistogram(referenceFrames, refMaskFrame, pixelSize, channel, plane, Reference.GetVideoInfo().pixel_type, referenceBits, LimitedRange),
                                () => srcHist       = Extrapolation ? GetHistogram(inputFrames, null, pixelSize, channel, plane, Child.GetVideoInfo().pixel_type, sampleBits, LimitedRange) : null);

                            var map = GetTransitionMap(sampleHist, referenceHist, n, plane);

                            if (Extrapolation)
                            {
                                Extrapolate(map, srcHist, GetLowColor(referenceBits), GetHighColor(referenceBits, plane));
                            }

                            Interpolate(map, GetLowColor(referenceBits), GetHighColor(referenceBits, plane), sampleBits, referenceBits);

                            if (Intensity < 1)
                            {
                                var decreased = new ColorMap(sampleBits, n, Dither);
                                for (var color = 0; color < 1 << sampleBits; color++)
                                {
                                    decreased.Add(color, map.Average(color) * Intensity + color * (1 - Intensity));
                                }
                                map = decreased;
                            }

                            var tuple = map.GetColorsAndWeights();

                            NativeUtils.ApplyColorMap(DynamicNoise ? n : 0,
                                                      input.GetReadPtr(plane), input.GetPitch(plane), sampleBits > 8,
                                                      output.GetWritePtr(plane), output.GetPitch(plane), referenceBits > 8,
                                                      input.GetRowSize(plane), input.GetHeight(plane), pixelSize, channel,
                                                      map.FixedMap, tuple.Item1, tuple.Item2);
                        });
                    });
                }

            if (!writable)
            {
                input.Dispose();
            }
            sampleFrames.ForEach(p => p.Dispose());
            referenceFrames.ForEach(p => p.Dispose());
            return(output);
        }