View Full Version : Derainbow.... only "exactly" where needed
Lothar
2nd January 2005, 13:00
Looking for a reinbow removing solution i found the sh0dan's DeRainbow script:
function DeRainbow(clip org)
{
org_u = utoy(org)
org_v = vtoy(org)
msharpen(threshold = 10, mask=true)
reduceby2()
greyscale()
uv = blur(1.5).levels(0,2.0,255,0,255).blur(1.5)
filtered_u = org_u.blur(1.5).blur(1.5).blur(1.5).temporalsoften(2,255,0,3,2)
filtered_v = org_v.blur(1.5).blur(1.5).blur(1.5).temporalsoften(2,255,0,3,2)
u_final = MaskedMerge(org_u, filtered_u, uv)
v_final = MaskedMerge(org_v, filtered_v, uv)
return ytouv(u_final, v_final, org)
}
This works GREAT in my tests in removing the rainbows, but there's quite a big loss in chroma: even in the areas not affected by rainbows the filtered colors are less bright and vivid.
So I tryed to limit the effects of this filter to to areas around edges only, using something like:
MaskedMerge(original, derainbow, edgemask, Y=1, U=3, V=3)
The result whit this combination is a little better in keeping the original chroma information, but it also keeps a little more of the original rainbows...
I'm looking for a way to completely overlay the edges (and the area around them) of the original picture with the ones filtered with derainbow, but (have i misunderstood something of "makedmerge"? :confused: ) something like "MaskedMerge(original, derainbow, edgemask)" simply returns the original picture...
Thanks.
Didée
2nd January 2005, 17:49
Your 2nd example command "MaskedMerge(original, derainbow, edgemask)" has "no effect" because MaskedMerge's default for the U/V plane operators are U=V=1 (keep chroma from 1st clip).
Your 1st example with U=V=3 is the correct call to actually process chroma. But then, the edgemask probably wasn't how it should be ...
Best way would be to create the edgemask on the Y channel, and use that for the chroma planes:
MaskedMerge(original, derainbow, edgemask.FitY2UV(), U=3,V=3)
Depending on how you actually create the edgemask (there's a buch of possibilities, where a simple "EdgeMask()" isn't a too powerful one), you might want to firstly feather the mask out by one or more "expand.blur(1.58)" commands.
Lothar
3rd January 2005, 13:46
Thx Didée, I've created the mask using your hint:
edgemask= Edgemask(type = "cartoon", thy1=6 , thy2=6, thc1=6, thc2=6).expand().blur(1.58).blur(1.58).FitY2UV()
And then
MaskedMerge(original, derainbow, edgemask, Y=1, U=3, V=3)
It works pretty good :)
The result image has about the same "deraibowing" as the simply derainbowed one, but the colors are much closer to the original.
This is so far the best result I've achieved in my tests on Cowboy Bebop.
Any idea to improve it or suggestions on other methods?
Thanks.
Chainmax
3rd January 2005, 14:50
Well, you could also try loading the VDub filter SSIQ. By the way, what is the correct procedure to load VDub filters on Avisynth? The most I could find via the search was that an avs function had to be loaded, but I don't know where to find it...
In any case, I've seen the same problems that you experienced on other clips, Lothar. Could you post in here the final function once you're satisfied with the results?
Lothar
3rd January 2005, 20:46
Well, I'm not fully satisfied, but here's my try:
function DeRainbow2(clip org, int "thresh")
{
#Based on DeRainbow by Sh0dan
assert(org.isYV12(),"DeRainbow2() requires YV12 input!")
thresh = default(thresh, 10)
org_u = utoy(org)
org_v = vtoy(org)
msharpen(org, threshold = thresh, mask=true)
reduceby2()
greyscale()
uv = blur(1.5).levels(0,2.0,255,0,255, coring=false).levels(50,2.0,255,0,255, coring=false)
filtered_u = org_u.mipsmooth(spatial=255, temporal=255, scenechange=3, show=false, method="strong", scalefactor=0.5)
filtered_v = org_v.mipsmooth(spatial=255, temporal=255, scenechange=3, show=false, method="strong", scalefactor=0.5)
u_final = MaskedMerge(org_u, filtered_u, uv)
v_final = MaskedMerge(org_v, filtered_v, uv)
derainbowed = ytouv(u_final, v_final, org)
edgem = org.Edgemask(type = "cartoon", thy1=6 , thy2=6, thc1=6, thc2=6).expand().blur(1.58).FitY2UV()
return MaskedMerge(org, derainbowed, edgem, Y=1, U=3, V=3)
}
@ Chainmax: SSIQ to remove rainbows?
Nicholi
4th January 2005, 08:54
@Chainmax
LoadVirtualDubPlugin("filename","filtername",preroll)
Filtername being the name you will use to call the filter later in the AVS.
Preroll determines how many frames to buffer before processing so the filter can corectly work. Filters of any temporal nature would need some frames prerolled.
The plugin though still requires RGB32 colorspace, so you will need to make the conversion for that before it's called.
As for rainbows, SSIQ nicely enough has been ported to avisynth, in yv12 and yuy2 no less. http://yatta.mellbin.org/misc/
However it's only a small portion of a much greater picture at removing rainbows. Bifrost works extremely well at removing most light-medium strength rainbows with little discoloration and bleeding. For the stronger types of rainbow, I see no solution other then accepting a small amount of color loss and bleeding using the usual tools.
Bifrost interestingly enough places rainbows in two groups: sources that apparently have had rainbows added after the Telecine process (type1) and those that have been rainbowed before (type2). Consequently it seems type1 rainbows are removed extremely efficiently, while type2's are the usual problematic ones.
Mug Funky
4th January 2005, 16:42
for rainbows in interlaced footage caused by composite cables (assume the rainbows are combed, and each field is the opposite end of the chroma plane), a simple thresholded blend-deinterlace on the chroma channels is enough to pretty much wipe them out without having to nuke the rest of the chroma.
subtle rainbowing caused by aliasing (you can get this even with component connections - it's more a matter of poor bandwidth filtering in the A/D conversion i think) is very difficult to remove, though. for this kind of thing we need to somehow teach the computer what a rainbow is as distinct from a colourful picture. this is beyond my expertise...
Lothar
4th January 2005, 16:46
Originally posted by Mug Funky
for rainbows in interlaced footage caused by composite cables (assume the rainbows are combed, and each field is the opposite end of the chroma plane), a simple thresholded blend-deinterlace on the chroma channels is enough to pretty much wipe them out without having to nuke the rest of the chroma.
Don't know if that's the case, but how would you do that?
Thx :)
Mug Funky
4th January 2005, 17:08
function ChubbyRain(clip c, int "th", int "radius", bool "show")
{
th = default(th,10)
radius = default(radius,3)
show = default(show,false)
u = c.utoy()
v = c.vtoy()
uc = u.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0,usemmx=true)
vc = v.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0,usemmx=true)
cc = c.yv12convolution(horizontal="1",vertical="1 2 1",Y=2,U=3,V=3,usemmx=true).temporalsoften(radius,0,255,2,2)
rainbow=yv12lutxy(uc,vc,Yexpr=string("x y + "+string(th)+" > 256 0 ?")).pointresize(c.width,c.height).expand(y=3,u=-128,v=-128)
overlay(c,cc,mask=rainbow)
show==true? rainbow : last
}
that's the one i use for sources like Fawlty Towers, or Lain (PAL and NTSC respectively). it doesn't appear to touch the chroma all that much, though theoretically it will mess up moving brightly coloured objects (guy-in-red-jacket-walking-past-camera). i haven't seen this effect so far, and i consider it worth it.
one thing - apply this first, don't run anything before it - it needs raw, unadulterated interlacing to work properly. even telecide will throw it off, so run everything after it.
also, it'll only really work on stuff that is encoded as pure interlaced (be it film or video), and only works on crosstalk-type rainbows (the really strong combed ones on edges).
default settings should do.
[edit] oh, you need masktools for this to work. a version with the YV12LUTxy functions
Lothar
4th January 2005, 18:34
Thx Mug Funky, here's my new try:
Function ChubbyDeRain(clip c, int "th", int "radius", bool "show")
{
#based on Sh0dan's DeRainbow & Mug Funky's ChubbyRain
th = default(th,5)
radius = default(radius,3)
show = default(show,false)
u = c.utoy()
v = c.vtoy()
uc = u.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0) #,usemmx=true
vc = v.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0)
cc2 = c.yv12convolution(horizontal="1",vertical="1 2 1",Y=2,U=3,V=3).mipsmooth(spatial=255, temporal=255, scenechange=3, show=false, method="strong", scalefactor=0.5)
rainbow=yv12lutxy(uc,vc,Yexpr=string("x y + "+string(th)+" > 256 0 ?")).bicubicresize(c.width,c.height).expand(y=3,u=-128,v=-128)
ms = MaskedMerge(c,cc2,rainbow, Y=1, U=3, V=3)
show==true? rainbow : ms
}
Tested on progressive.
I don't understand fully how it works, but the result is really good to me :)
Mug Funky
5th January 2005, 04:44
cool. with the binary mask there, you might get some artefacts at edges in some cases, but apart from that it looks pretty good.
btw, with that mipsmooth in there, you no longer need the "radius" parameter in the function, so you can drop that out.
i'd really love a foolproof way to detect rainbows, but unfortunately once aliasing is introduced it becomes just more frequency content and can't be removed using traditional methods. maybe a neural-network could handle it, and after some training it might be pretty fast, too. but that's for a few years from now, or until someone who knows neural networks starts coding for avisynth...
Chainmax
6th January 2005, 01:36
Originally posted by Nicholi
@Chainmax
LoadVirtualDubPlugin("filename","filtername",preroll)
Filtername being the name you will use to call the filter later in the AVS.
Preroll determines how many frames to buffer before processing so the filter can corectly work. Filters of any temporal nature would need some frames prerolled.
The plugin though still requires RGB32 colorspace, so you will need to make the conversion for that before it's called.
As for rainbows, SSIQ nicely enough has been ported to avisynth, in yv12 and yuy2 no less. http://yatta.mellbin.org/misc/
I thought you also needed to load some kind of avs before using that line, is that not needed anymore or was it never needed at all? BTW, I know that SSIQ was ported to Avisynth, but I recall reading somewhere on the net that the Avisynth version wasn't as good as the VDub version, is that true?
Lothar
6th January 2005, 10:15
Here's my latest try:
function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft")
{
#based on Mug Funky's ChubbyRain
th = default(th,10)
radius = default(radius,10)
show = default(show,false)
sft = default (sft, 10)
u = c.utoy()
v = c.vtoy()
uc = u.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0)
vc = v.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0)
cc = c.yv12convolution(horizontal="1",vertical="1 2 1",Y=2,U=3,V=3).bifrost(interlaced=false).cnr2().temporalsoften(radius,0,sft,2,2)
rainbow=yv12lutxy(uc,vc,Yexpr=string("x y + "+string(th)+" > 256 0 ?")).pointresize(c.width,c.height).expand(y=3,u=-128,v=-128)#.blur(1.5)
overlay(c,cc,mask=rainbow)
show==true? rainbow : last
}
In short: ChubbyRain works really good on removing rainbows, but the side effect is given by the use of temporalsoften high values of threshond on chroma, causing ghosts.
So i tryed a way to lower that values by reducing rainbows before applying temporalsoften.
This gives to me best results I've seen so far in my tests, so I hope it works (maybe by tweaking some parameters) on other sources.
Thx to Mug Funky and Sh0dan for the scripts I've used :)
Avisynth_challenged
6th October 2008, 02:40
function ChubbyRain(clip c, int "th", int "radius", bool "show")
{
th = default(th,10)
radius = default(radius,3)
show = default(show,false)
u = c.utoy()
v = c.vtoy()
uc = u.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0,usemmx=true)
vc = v.yv12convolution(horizontal="1",vertical="1 -2 1",Y=3,U=0,V=0,usemmx=true)
cc = c.yv12convolution(horizontal="1",vertical="1 2 1",Y=2,U=3,V=3,usemmx=true).temporalsoften(radius,0,255,2,2)
rainbow=yv12lutxy(uc,vc,Yexpr=string("x y + "+string(th)+" > 256 0 ?")).pointresize(c.width,c.height).expand(y=3,u=-128,v=-128)
overlay(c,cc,mask=rainbow)
show==true? rainbow : last
}
that's the one i use for sources like Fawlty Towers, or Lain (PAL and NTSC respectively). it doesn't appear to touch the chroma all that much, though theoretically it will mess up moving brightly coloured objects (guy-in-red-jacket-walking-past-camera). i haven't seen this effect so far, and i consider it worth it.
one thing - apply this first, don't run anything before it - it needs raw, unadulterated interlacing to work properly. even telecide will throw it off, so run everything after it.
also, it'll only really work on stuff that is encoded as pure interlaced (be it film or video), and only works on crosstalk-type rainbows (the really strong combed ones on edges).
default settings should do.
[edit] oh, you need masktools for this to work. a version with the YV12LUTxy functions
I'm experimenting with this function to attack rainbows in my (pre-IVTC'd) source. I'd like to tweak your script, because the default settings are not quite strong enough for certain instances of rainbow. But I'm not sure what to do. If you don't mind, could you tell us what to modify in the original script in order to achieve stronger derainbowing than the defaults provide? Thank you very much in advance! :thanks:
JKyle
13th June 2021, 01:33
I slightly modded Lothar's ChubbyRain2 as follows:
# ChubbyRain2.avsi
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
#
# mod by JKyle
# 2021-06-12
#
# --- CHANGES ---
#
# - replaced cnr2 with vsCnr2
#
# --- REQUIREMENTS ---
#
# Bifrost(https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2(https://github.com/pinterf/masktools)
# vsCnr2(https://github.com/Asd-g/AviSynth-vsCnr2)
#
# Supported input colorspace: Planar 8-bit (YV12, YV16, YV24)
# HBD is not supported yet.
#
function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
th = Default(th, 10) # Masking threshold; lower values consider more pixels as rainbows.
radius = Default(radius, 10) # radius for TemporalSoften.
show = Default(show, false) # If true, rainbow mask will be shown. This can be helpful for adjusting th.
sft = Default(sft, 10) # chroma_threshold for TemporalSoften.
interlaced = Default(interlaced, false) # false means the input clip is progressive.
c = (interlaced == true) ? c.SeparateFields() : c
u = c.UToY()
v = c.VToY()
uc = u.mt_convolution(horizontal="1", vertical="1 -2 1", Y=3, U=0, V=0)
vc = v.mt_convolution(horizontal="1", vertical="1 -2 1", Y=3, U=0, V=0)
# replaced cnr2 with vsCnr2 (JKyle)
cc = c.mt_convolution(horizontal="1", vertical="1 2 1", Y=2, U=3, V=3).Bifrost(interlaced=false).vsCnr2().TemporalSoften(radius, 0, sft, 2, 2)
rainbow = mt_lutxy(uc, vc, yExpr=String("x y + "+String(th)+" > 256 0 ?")).PointResize(c.width, c.height).mt_expand(y=3, u=-128, v=-128)#.blur(1.5)
Overlay(c, cc, mask=rainbow)
output = (show == true) ? rainbow : (interlaced == true) ? last.Weave() : last
return output
}
kedautinh12
13th June 2021, 01:54
Asd-g was moded Chubbyrain2 and was supported HBD
https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi
JKyle
13th June 2021, 02:30
Asd-g was moded Chubbyrain2 and was supported HBD
https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi
:thanks: for the info.
In the end, I didn't have to reinvent the wheel. :D
He solved the HBD problem in a very easy way. Lesson learned. :)
GMJCZP
13th June 2021, 02:37
To speed up, you can replace Overlay with:
Mt_merge(c, cc, rainbow)
Edit: asd-g already changed it.
kedautinh12
13th June 2021, 02:45
:thanks: for the info.
In the end, I didn't have to reinvent the wheel. :D
He solved the HBD problem in a very easy way. Lesson learned. :)
More scripts was moded and backported from vapoursynth. You can check here:
https://github.com/Asd-g/AviSynthPlus-Scripts
GMJCZP
13th June 2021, 03:33
Collecting and ordering all the information, here the complete script:
# ChubbyRain2.avsi updated by Asd-g
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
### Requirements ###
#-------------------
# Bifrost (https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2 (https://github.com/pinterf/masktools)
# vsCnr2 (https://github.com/Asd-g/AviSynth-vsCnr2)
# Avsresize (http://avisynth.nl/index.php/Avsresize)
### Changelog ###
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2.
# Added support for 10..16-bit clips.
function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
#based on Mug Funky's ChubbyRain
Assert(Is420(c), "ChubbyRain2: only clips with chroma subsampling 420 are supported.")
th = default(th,10)
radius = default(radius,10)
show = default(show,false)
sft = default (sft, 10)
interlaced = default(interlaced, false)
c = (interlaced) ? c.separatefields() : c
uc = mt_convolution(c, horizontal="1",vertical="1 -2 1",Y=1,U=3,V=3)
mt_convolution(c, horizontal="1",vertical="1 2 1",Y=2,U=3,V=3)
bifrost(interlaced=false)
vsCnr2()
cc = temporalsoften(radius,0,sft,2,2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+string(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
z_pointresize(c.width,c.height)
rainbow = mt_expand(y=3,u=-128,v=-128)#.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : (interlaced) ? weave() : last
}
JKyle
13th June 2021, 04:05
Thanks.
But z_pointresize raises an error with interlaced=true.
Thus z_pointresize seems to be not working with field-based frames processed by separatefields.
See my issue report here (https://github.com/Asd-g/AviSynthPlus-Scripts/issues/7).
JKyle
13th June 2021, 15:34
In addition to the fact that z_PointResize fails on separated fields (interlaced=true), I've also found out that the restriction of chroma subsampling 420 is meaningless. I confirmed that this script works as well with YUV422 and YUV444.
So I modded as follows:
z_PointResize reverted back to PointResize to avoid error when interlaced=true
Loosened chroma subsampling 420 restriction to accept 422 and 444
Here's my script code:
# ChubbyRain2.avsi
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
# - updated by Asd-g to support HBD
# - moddded by JKyle
# - z_PointResize reverted back to PointResize to avoid error when interlaced=true
# - Loosened chroma subsampling 420 restriction to accept 422 and 444
#
### Requirements ###
#-------------------
# Bifrost (https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2 (https://github.com/pinterf/masktools)
# vsCnr2 (https://github.com/Asd-g/AviSynth-vsCnr2)
#
### Changelog ###
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2.
# Added support for 10..16-bit clips.
function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
Assert(IsYUV(c), "ChubbyRain2: only YUV clips are supported.")
Assert(IsPlanar(c), "ChubbyRain2: only clips with planar color formats are supported.")
th = Default(th, 10)
radius = Default(radius, 10)
show = Default(show, false)
sft = Default(sft, 10)
interlaced = Default(interlaced, false)
c = (interlaced) ? c.SeparateFields() : c
uc = mt_convolution(c, horizontal="1", vertical="1 -2 1", Y=1, U=3, V=3)
mt_convolution(c, horizontal="1", vertical="1 2 1", Y=2, U=3, V=3)
bifrost(interlaced=false)
vsCnr2()
cc = TemporalSoften(radius, 0, sft, 2, 2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+String(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
PointResize(c.width,c.height)
rainbow = mt_expand(y=3, u=-128, v=-128)#.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : (interlaced) ? Weave() : last
}
JKyle
13th June 2021, 15:47
For reference, here's an outcome when the above new script is applied to an interlaced YUV422 source.
https://i.imgur.com/1KEM0N8.png
StainlessS
13th June 2021, 15:48
Maybe something like this (Untested)
# ChubbyRain2.avsi
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
# - updated by Asd-g to support HBD
# - moddded by JKyle
# - z_PointResize reverted back to PointResize to avoid error when interlaced=true
# - Loosened chroma subsampling 420 restriction to accept 422 and 444
#
### Requirements ###
#-------------------
# Bifrost (https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2 (https://github.com/pinterf/masktools)
# vsCnr2 (https://github.com/Asd-g/AviSynth-vsCnr2)
#
### Changelog ###
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2.
# Added support for 10..16-bit clips.
function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
Assert(IsYUV(c), "ChubbyRain2: only YUV clips are supported.")
Assert(IsPlanar(c), "ChubbyRain2: only clips with planar color formats are supported.")
th = Default(th, 10)
radius = Default(radius, 10)
show = Default(show, false)
sft = Default(sft, 10)
interlaced = Default(interlaced, false)
c = (interlaced) ? c.SeparateFields().AssumeFrameBased : c
uc = mt_convolution(c, horizontal="1", vertical="1 -2 1", Y=1, U=3, V=3)
mt_convolution(c, horizontal="1", vertical="1 2 1", Y=2, U=3, V=3)
bifrost(interlaced=false)
vsCnr2()
cc = TemporalSoften(radius, 0, sft, 2, 2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+String(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
z_PointResize(c.width,c.height) # Dont know if this is correct
rainbow = mt_expand(y=3, u=-128, v=-128)#.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : (interlaced) ? AssumeFieldBased.Weave() : last
}
EDIT: You need to check the z_Pointresize thing, and change docs, you dont need to mention my suggestion in docs,
assummng that you approve them.
kedautinh12
13th June 2021, 16:42
Here for fixed, you can check it:
https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi
JKyle
13th June 2021, 16:56
Here for fixed, you can check it:
https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi
Doesn't work.
Script Error
propGetType: This filter can only be used within run-time filters
(D:\Utilities\StaxRip\Settings\Plugins\AviSynth\Scripts\ChubbyRain2.avsi, line 59)
(D:\Utilities\StaxRip\Settings\Plugins\AviSynth\Scripts\ChubbyRain2.avsi, line 75)
(D:\Test\Chroma noise YUY2 raw sample_temp\Chroma noise YUY2 raw sample_view.avs, line 15)
And why the restriction of 420 only?
The script works on other planar color formats as well. :rolleyes:
---
And StainlessS's idea doesn't work, either.
It simply outputs black pixels on HBD sources.
kedautinh12
13th June 2021, 18:10
New ver: https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi
GMJCZP
13th June 2021, 18:10
In addition to the fact that z_PointResize fails on separated fields (interlaced=true), I've also found out that the restriction of chroma subsampling 420 is meaningless. I confirmed that this script works as well with YUV422 and YUV444.
So I modded as follows:
z_PointResize reverted back to PointResize to avoid error when interlaced=true
Loosened chroma subsampling 420 restriction to accept 422 and 444
Here's my script code:
# ChubbyRain2.avsi
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
# - updated by Asd-g to support HBD
# - moddded by JKyle
# - z_PointResize reverted back to PointResize to avoid error when interlaced=true
# - Loosened chroma subsampling 420 restriction to accept 422 and 444
#
### Requirements ###
#-------------------
# Bifrost (https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2 (https://github.com/pinterf/masktools)
# vsCnr2 (https://github.com/Asd-g/AviSynth-vsCnr2)
#
### Changelog ###
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2.
# Added support for 10..16-bit clips.
function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
Assert(IsYUV(c), "ChubbyRain2: only YUV clips are supported.")
Assert(IsPlanar(c), "ChubbyRain2: only clips with planar color formats are supported.")
th = Default(th, 10)
radius = Default(radius, 10)
show = Default(show, false)
sft = Default(sft, 10)
interlaced = Default(interlaced, false)
c = (interlaced) ? c.SeparateFields() : c
uc = mt_convolution(c, horizontal="1", vertical="1 -2 1", Y=1, U=3, V=3)
mt_convolution(c, horizontal="1", vertical="1 2 1", Y=2, U=3, V=3)
bifrost(interlaced=false)
vsCnr2()
cc = TemporalSoften(radius, 0, sft, 2, 2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+String(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
PointResize(c.width,c.height)
rainbow = mt_expand(y=3, u=-128, v=-128)#.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : (interlaced) ? Weave() : last
}
:thanks:
StainlessS
13th June 2021, 18:23
And StainlessS's idea doesn't work, either.
It simply outputs black pixels on HBD sources.
Works for me.
# ChubbyRain2.avsi
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
# - updated by Asd-g to support HBD
# - moddded by JKyle
# - z_PointResize reverted back to PointResize to avoid error when interlaced=true
# - Loosened chroma subsampling 420 restriction to accept 422 and 444
#
### Requirements ###
#-------------------
# Bifrost (https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2 (https://github.com/pinterf/masktools)
# vsCnr2 (https://github.com/Asd-g/AviSynth-vsCnr2)
#
### Changelog ###
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2.
# Added support for 10..16-bit clips.
Function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced") {
Assert(IsYUV(c), "ChubbyRain2: only YUV clips are supported.")
Assert(IsPlanar(c), "ChubbyRain2: only clips with planar color formats are supported.")
th = Default(th, 10)
radius = Default(radius, 10)
show = Default(show, false)
sft = Default(sft, 10)
interlaced = Default(interlaced, false)
c = (interlaced) ? c.SeparateFields().AssumeFrameBased : c
uc = mt_convolution(c, horizontal="1", vertical="1 -2 1", Y=1, U=3, V=3)
mt_convolution(c, horizontal="1", vertical="1 2 1", Y=2, U=3, V=3)
bifrost(interlaced=false)
vsCnr2()
cc = TemporalSoften(radius, 0, sft, 2, 2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+String(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
z_PointResize(c.width,c.height)
rainbow = mt_expand(y=3, u=-128, v=-128)#.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : (interlaced) ? AssumeFieldBased.Weave() : last
}
# I did not have any of these and so had to download them.
LoadPlugin(".\Bifrost_x86.dll")
LoadPlugin(".\vsCnr2_x86.dll")
LoadPlugin(".\avsresize_x86.dll")
# ADDED
#LoadPlugin(".\Bifrost_x64.dll")
#LoadPlugin(".\vsCnr2_x64.dll")
#LoadPlugin(".\avsresize_x64.dll")
ColorBars().KillAudio
ConvertToYV24.ConvertBits(10) # YUV444P10 : OK
#ConvertToYV16.ConvertBits(16) # YUV422P16 : OK
#ConvertToYV16.ConvertBits(32) # YUV422PS DONT WORK : bifrost 8 -> 16 bit only
LACED=True
ChubbyRain2(th=10, radius=10, show=false, sft=10, interlaced=LACED)
info
#ConvertToRGB32 # if cannot view in player
Return Last
JKyle
13th June 2021, 18:48
Works for me.
My system is x64. Maybe that's the difference.
ConvertToYV24.ConvertBits(10) # YUV444P10 : OK
#ConvertToYV16.ConvertBits(16) # YUV422P16 : OK
#ConvertToYV16.ConvertBits(32) # YUV422PS DONT WORK : bifrost 8 -> 16 bit only
Thanks for the info.
StainlessS
13th June 2021, 18:51
So is mine, I'll test in 64 bit.
EDIT: NOPE, fails in x64.
I'll find out why.
StainlessS
13th June 2021, 18:59
OK, My error in above post, it worked ok in x64.
I had used my default PotPlayer x86 [from within PS-PAD text editor] using x64 plugins in the script, thats why it failed.
But when loading script in x64 Vdub2 [EDIT: or Potplayer x64], plays OK.
result with 16 bit clip,YUV422P16
https://i.postimg.cc/TKg6CS12/a-00.jpg (https://postimg.cc/TKg6CS12)
EDIT: I earlier downloaded current versions of all 3 plugs, perhaps you have an old one.
JKyle
13th June 2021, 19:31
OK, My error in above post, it worked ok in x64.
I had used my default PotPlayer x86 [from PS-PAD] using x64 plugins, thats why it failed.
But when loading script in x64 Vdub2 [EDIT: or Potplayer x64], plays OK.
EDIT: I earlier downloaded current versions of all 3 plugs, perhaps you have an old one.
It works OK with ColorBars on my side too. But when a real video clip is loaded, it fails.
Error: clip must be frame-based.
Try this sample (https://drive.google.com/file/d/1932O54x9mWtqhQMo0FypcCqWGltX7uKH/view?usp=sharing) (113.2 MB) with FFMS2, plz.
All my plugins are the most recent ones to the best of my knowledge.
Avsresize r6 StvG : https://forum.doom9.org/showthread.php?p=1943908#post1943908
Bifrost 2.1.0 : https://github.com/Asd-g/AviSynth-bifrost/releases/tag/2.1.0
vsCnr2 1.0.0 : https://github.com/Asd-g/AviSynth-vsCnr2/releases/tag/1.0.0
Masktools2 2.2.26 : https://github.com/pinterf/masktools/releases/tag/2.2.26
ffms2 2020-11-23 StvG : https://forum.doom9.org/showthread.php?p=1928993#post1928993
BTW, Asd-g's new fix (https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi) seems to work OK with interlaced sources.
(By deinterlacing the source first with TDeint.)
Now the only thing that confuses me is why he put the 420 restriction in his script. :confused:
StainlessS
13th June 2021, 19:55
Avsresize r6 StvG : https://forum.doom9.org/showthread.p...08#post1943908
Bifrost 2.1.0 : https://github.com/Asd-g/AviSynth-bi...ases/tag/2.1.0
vsCnr2 1.0.0 : https://github.com/Asd-g/AviSynth-vs...ases/tag/1.0.0
Above same as me.
I'm using earlier Masktools and ffms2 [probably got them, just not installed in plugins yet].
Maybe prob down to some size requirement [multiple of whatever, x and y].
I'll down your sample maybe a little later and try, I'm off out down the pub soon, some celebrations still going on there I think. [football]
JKyle
14th June 2021, 00:44
Looking at the script code, z_PointResize applies to the plane that has either 0 or 255(scaled) according to the expression in mt_lutxy.
But I see no gain of using a z_ function on those values where the algorithm is a simple nearest neighbor method.
So I think we better not use z_PointResize in this case.
This way, we can get rid of the need to deinterlace the interlaced source (like Asd-g introduced in his fix) and thus save the processing time drastically for interlaced sources.
And about the chroma subsampling restriction, I see no reason why the source should be 420. No function in the script forces that restriction.
Therefore, I believe the script suggested in my above post (https://forum.doom9.org/showthread.php?p=1944945#post1944945) is a proper version that works as expected.
kedautinh12
14th June 2021, 04:02
You're right, just simple and fast
kedautinh12
14th June 2021, 11:34
Asd-g explain his choice
https://github.com/Asd-g/AviSynthPlus-Scripts/issues/7#issuecomment-860541218
JKyle
14th June 2021, 20:34
I've been mistakenly missing the incorrect application of TemporalSoften to separated fields of interlaced sources.
Asd-g disabled(dummied) the interlaced option and removed the SeparateFields process on interlaced sources for this and other related issues. I think his mod is better in this regard.
Here (https://github.com/Asd-g/AviSynthPlus-Scripts/blob/master/ChubbyRain2_.avsi)'s his script.
You need Avsresize additionally to run his script since he adopts z_PointResize.
And real.finder has come up with his own solution, ChubbyRain3, to address the interlaced source issues. See here (https://github.com/Asd-g/AviSynthPlus-Scripts/issues/7#issuecomment-860845968) for reference.
JKyle
14th June 2021, 22:31
I've found an issue with Asd-g's new script on some source files. See here (https://github.com/Asd-g/AviSynthPlus-Scripts/issues/7#issuecomment-860993045).
So I replaced z_PointResize with PointResize to avoid such errors. Like Asd-g mentioned, "there is no gain of using z_ over internal resizer because of the factor (2)".
And instead of disabling the interlaced option, I put it in Bifrost.
The output looks satisfying, and I believe it's OK since no field separation is involved this time.
#########################################################################################
#
# ChubbyRain2.avsi
#
# http://avisynth.nl/index.php/ChubbyRain2
#
# - based on Mug Funky's ChubbyRain
# - ChubbyRain2 by Lothar on Doom9's forum
# https://forum.doom9.org/showthread.php?p=589885#post589885
# - updated by Asd-g to support HBD
# - mod by JKyle
#
### Requirements ###
#-------------------
# Bifrost (https://github.com/Asd-g/AviSynth-bifrost)
# MaskTools2 (https://github.com/pinterf/masktools)
# vsCnr2 (https://github.com/Asd-g/AviSynth-vsCnr2)
#
### Changelog ###
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2 (Asd-g)
# Added support for 10..16-bit clips (Asd-g)
# Removed restriction for only 420 video (Asd-g)
# Made parameter "interlaced" dummy (Asd-g)
# Replaced z_PointResize with PointResize (JKyle)
# Revived "interlaced" for use in Bifrost (JKyle)
#
#########################################################################################
function ChubbyRain2(clip c, int "th", int "radius", int "sft", bool "interlaced", bool "show")
{
th = Default(th, 10)
radius = Default(radius, 10)
sft = Default(sft, 10)
interlaced = Default(interlaced, false)
show = Default(show, false)
uc = mt_convolution(c, horizontal="1", vertical="1 -2 1", Y=1, U=3, V=3)
mt_convolution(c, horizontal="1", vertical="1 2 1", Y=2, U=3, V=3)
Bifrost(interlaced=interlaced)
vsCnr2()
cc = TemporalSoften(radius, 0, sft, 2, 2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+String(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
PointResize(c.width, c.height)
rainbow = mt_expand(y=3, u=-128, v=-128)#.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : last
}
---
[Update]
As Asd-g explained in his reply, you need to deinterlace the source properly (BWDIF or yadifmod2, etc.) in order to use his script.
See here (https://github.com/Asd-g/AviSynthPlus-Scripts/issues/7#issuecomment-861029674) for detail.
real.finder
14th June 2021, 23:57
new update for ChubbyRain3 https://github.com/realfinder/AVS-Stuff/blob/Community/avs%202.5%20and%20up/ChubbyRain3.avsi
it should be faster than ChubbyRain2 without interlaced=true, and it should work as it should when using interlaced=true
kedautinh12
15th June 2021, 00:15
Thanks
JKyle
15th June 2021, 00:53
new update for ChubbyRain3 https://github.com/realfinder/AVS-Stuff/blob/Community/avs%202.5%20and%20up/ChubbyRain3.avsi
it should be faster than ChubbyRain2 without interlaced=true, and it should work as it should when using interlaced=true
With an interlaced source (https://drive.google.com/file/d/1932O54x9mWtqhQMo0FypcCqWGltX7uKH/view?usp=sharing)(113.2 MB), I tested ChubbyRain3 as follows.
The script code:
SetFilterMTMode("DEFAULT_MT_MODE", 2)
LoadPlugin("D:\Utilities\StaxRip\Apps\Plugins\Dual\ffms2\ffms2.dll")
FFVideoSource("D:\Test\MBAFF interlaced 422 10bit VFR sample.mkv")
LoadPlugin("D:\Utilities\StaxRip\Apps\Plugins\AVS\masktools2\masktools2.dll")
LoadPlugin("D:\Utilities\StaxRip\Settings\Plugins\AviSynth\Bifrost\Bifrost.dll")
LoadPlugin("D:\Utilities\StaxRip\Settings\Plugins\AviSynth\vsCnr2\vsCnr2.dll")
LoadPlugin("D:\Utilities\StaxRip\Apps\Plugins\AVS\TDeint\TDeint.dll")
Import("D:\Utilities\StaxRip\Apps\Plugins\AVS\Zs_RF_Shared\Zs_RF_Shared.avsi")
#~ Import("D:\Utilities\StaxRip\Settings\Plugins\AviSynth\Scripts\ChubbyRain2.avsi")
Import("D:\Downloads\ChubbyRain3.avsi")
ChubbyRain3(th=10, radius=10, sft=10, interlaced=true)
Prefetch(4)
AVSMeter result:
AVSMeter 3.0.9.0 (x64), (c) Groucho2004, 2012-2021
AviSynth+ 3.7.0 (r3382, 3.7, x86_64) (3.7.0.0)
Number of frames: 1622
Length (hh:mm:ss.ms): 00:01:04.880
Frame width: 1920
Frame height: 1080
Framerate: 25.000 (25/1)
Colorspace: YUV422P10
Frames processed: 1622 (0 - 1621)
FPS (min | max | average): 0.397 | 238095 | 4.638
Process memory usage (max): 1191 MiB
Thread count: 14
CPU usage (average): 38.7%
Time (elapsed): 00:05:49.709
For comparison, a similar code with ChubbyRain2(my mod) yields the following result:
Number of frames: 1622
Length (hh:mm:ss.ms): 00:01:04.880
Frame width: 1920
Frame height: 1080
Framerate: 25.000 (25/1)
Colorspace: YUV422P10
Frames processed: 1622 (0 - 1621)
FPS (min | max | average): 1.069 | 120482 | 19.37
Process memory usage (max): 663 MiB
Thread count: 13
CPU usage (average): 59.6%
Time (elapsed): 00:01:23.726
As was predicted, the internal deinterlacing process with TDeint takes up a lot of time.
OTOH, ChubbyRain3 was slightly faster than ChubbyRain2 on progressive sources.
Although I'm not sure this will hold in general cases as well, at least it seems like a positive signal of improvement.
kedautinh12
15th June 2021, 01:59
You can use extools replace mvtools2 for speed but it's only use for avs+ > 3.5
GMJCZP
18th June 2021, 23:24
Interestingly I notice in ChubbyRain3 in the variable "rainbow" at the end of it uses blur(1.58), while in ChubbyRain2 it is disabled (always) with #blur(1.5).
kedautinh12
18th July 2021, 12:57
Asd-g update Chubbyrain2 with 10% faster
https://github.com/Asd-g/AviSynthPlus-Scripts/commit/57fd6cddc3db17661130612e45a8498d3e8e0cec
GMJCZP
18th July 2021, 18:18
Asd-g update Chubbyrain2 with 10% faster
https://github.com/Asd-g/AviSynthPlus-Scripts/commit/57fd6cddc3db17661130612e45a8498d3e8e0cecThanks.
Below is the Asd-g script with some fixes (shown in red):
# http://avisynth.nl/index.php/ChubbyRain2
### Changelog ###
#---------------
# Replaced mt_convolution with GeneralConvolution for >10% speed up.
#---------------
# Made parameter "interlaced" dummy.
#---------------
# Removed restriction for only 420 video.
#---------------
# Fixed interlaced=true.
#---------------
# Changed requirements: replaced Cnr2 with vsCnr2.
# Added support for 10..16-bit clips.
Function ChubbyRain2(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
#based on Mug Funky's ChubbyRain
th = default(th,10)
radius = default(radius,10)
show = default(show,false)
sft = default (sft, 10)
interlaced = default(interlaced, false)
uc = GeneralConvolution(c, matrix="0 1 0 0 -2 0 0 1 0", luma=false, alpha=false)
GeneralConvolution(c, matrix="0 1 0 0 2 0 0 1 0", luma=false, alpha=false)
bifrost(interlaced=interlaced)
vsCnr2()
cc = temporalsoften(radius,0,sft,2,2)
mt_lutxy(ExtractU(uc), ExtractV(uc), "x y + "+string(th)+" > 255 0 ?", scale_inputs="allf", use_expr=1)
z_PointResize(c.width, c.height)
rainbow = mt_expand(y=3,u=-128,v=-128) #.blur(1.5)
mt_merge(c, cc, rainbow, y=2, luma=true)
return (show) ? rainbow : last
}
kedautinh12
19th July 2021, 02:33
Replace z_PointResize to PointResize won't have problem in interlaced mode
kedautinh12
19th July 2021, 04:53
If replace mt_convolution with GeneralConvolution ChubbyRain3 will be
# based on ChubbyRain2
Function ChubbyRain3(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
sisavs26 = !(VersionNumber() < 2.60)
sisphbd = AvsPlusVersionNumber > 2294
interlaced = default(interlaced, false)
th = default(th,10)
radius = default(radius,10)
show = default(show,false)
sft = default (sft, 10)
f = interlaced ? GetParity(c) : nop()
c = interlaced ? c.TDeint(1,tryWeave=true) : c
u = sisphbd ? ExtractU(c) : sisavs26 ? Utoy8(c) : Utoy(c)
v = sisphbd ? ExtractV(c) : sisavs26 ? Vtoy8(c) : Vtoy(c)
uc = GeneralConvolution(c, matrix="0 1 0 0 -2 0 0 1 0", luma=false, alpha=false)
vc = GeneralConvolution(c, matrix="0 1 0 0 -2 0 0 1 0", luma=false, alpha=false)
cc = sisavs26 ? GeneralConvolution(c, matrix="0 1 0 0 2 0 0 1 0", luma=false, alpha=false).bifrost(interlaced=false).vsCnr2().temporalsoften(radius,0,sft,2,2) :
\ GeneralConvolution(c, matrix="0 1 0 0 2 0 0 1 0", luma=false, alpha=false).bifrost(interlaced=false).Cnr2().temporalsoften(radius,0,sft,2,2)
rainbow = mt_lutxy(uc, vc, "x y + "+string(th)+" scalef > range_max 0 ?", use_expr=1).Blur(1.58)
YToUV(mt_merge(u, sisphbd ? ExtractU(cc) : sisavs26 ? Utoy8(cc) : Utoy(cc), rainbow),mt_merge(v, sisphbd ? ExtractV(cc) : sisavs26 ? Vtoy8(cc) : Vtoy(cc), rainbow),c)
show ? rainbow.pointresize(c.width,c.height) : last
return (interlaced) ? f ? AssumeBFF().DoubleWeave().SelectEvery(4,1) : AssumeTFF().DoubleWeave().SelectEvery(4,1) : last
}
GMJCZP
19th July 2021, 05:19
If replace mt_convolution with GeneralConvolution ChubbyRain3 will be
# based on ChubbyRain2
Function ChubbyRain3(clip c, int "th", int "radius", bool "show", int "sft", bool "interlaced")
{
sisavs26 = !(VersionNumber() < 2.60)
sisphbd = AvsPlusVersionNumber > 2294
interlaced = default(interlaced, false)
th = default(th,10)
radius = default(radius,10)
show = default(show,false)
sft = default (sft, 10)
f = interlaced ? GetParity(c) : nop()
c = interlaced ? c.TDeint(1,tryWeave=true) : c
u = sisphbd ? ExtractU(c) : sisavs26 ? Utoy8(c) : Utoy(c)
v = sisphbd ? ExtractV(c) : sisavs26 ? Vtoy8(c) : Vtoy(c)
uc = GeneralConvolution(c, matrix="0 1 0 0 -2 0 0 1 0", luma=false, alpha=false)
vc = GeneralConvolution(c, matrix="0 1 0 0 -2 0 0 1 0", luma=false, alpha=false)
cc = sisavs26 ? GeneralConvolution(c, matrix="0 1 0 0 2 0 0 1 0", luma=false, alpha=false).bifrost(interlaced=false).vsCnr2().temporalsoften(radius,0,sft,2,2) :
\ GeneralConvolution(c, matrix="0 1 0 0 2 0 0 1 0", luma=false, alpha=false).bifrost(interlaced=false).Cnr2().temporalsoften(radius,0,sft,2,2)
rainbow = mt_lutxy(uc, vc, "x y + "+string(th)+" scalef > range_max 0 ?", use_expr=1).Blur(1.58)
YToUV(mt_merge(u, sisphbd ? ExtractU(cc) : sisavs26 ? Utoy8(cc) : Utoy(cc), rainbow),mt_merge(v, sisphbd ? ExtractV(cc) : sisavs26 ? Vtoy8(cc) : Vtoy(cc), rainbow),c)
show ? rainbow.pointresize(c.width,c.height) : last
return (interlaced) ? f ? AssumeBFF().DoubleWeave().SelectEvery(4,1) : AssumeTFF().DoubleWeave().SelectEvery(4,1) : last
}
The script when placing bifrost (interlaced = false) is saying that it is only considering a progressive source, bifrost (interlaced = interlaced) must be placed, otherwise it would not make sense to pass to the function bool "interlaced".
Edit: is that Tdeint is used to deinterlace, that explains everything, there is no problem here but in the Asd-g script it is worth my clarification.
Edit2: according to Bifrost wiki:
bool interlaced = true
If true, SeparateFields and Weave will be invoked in order to process the top and bottom fields separately.
The Asd-g script with interlaced = false is forcing you to work only progressively, without providing an alternative, or at least inserting an Assert command to avoid the complications of interlaced content. IMHO ChubbyRain3 makes more sense.
real.finder
19th July 2021, 06:03
update https://github.com/realfinder/AVS-Stuff/blob/Community/avs%202.5%20and%20up/ChubbyRain3.avsi
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.