SHOW:
|
|
- or go back to the newest paste.
| 1 | - | # Advanced Denoising and anime bob v1.42 |
| 1 | + | # Advanced Denoising and anime bob v1.43 |
| 2 | ||
| 3 | # MotionThresh by mf, mod by A.SONY | |
| 4 | # Simple scenechange-proof motion threshold | |
| 5 | # Tile outputs 16x16 clip for speed | |
| 6 | # Use tile=true for conditional filtering, tile=false for masking | |
| 7 | ||
| 8 | function MotionThresh(clip input, float thresh, bool "tile", bool "fast", int "cache") {
| |
| 9 | fast = Default(fast, false) | |
| 10 | tile = Default(tile, fast) | |
| 11 | cache= default(cache,10) | |
| 12 | ||
| 13 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 14 | ||
| 15 | sislumaonly = !(VersionNumber() < 2.60) ? ssispmt ? input.isy() : input.isy8() : nop() | |
| 16 | ||
| 17 | input = fast && !sislumaonly ? ssispmt ? input.converttoy() : input.converttoy8() : input | |
| 18 | black = !fast ? BlankClip(input, width=16, height=16 ) : BlankClip(input, width=16, height=16, Color_yuv=color_black) | |
| 19 | white = !fast ? BlankClip(input, width=16, height=16, color=$FFFFFF) : BlankClip(input, width=16, height=16, Color_yuv=color_white) | |
| 20 | cond1 = fast ? nop() : ConditionalFilter(input, white, black, "YDifferenceFromPrevious()", "greaterthan", String(thresh)) | |
| 21 | cond2 = fast ? nop() : ConditionalFilter(input, white, black, "YDifferenceToNext()", "greaterthan", String(thresh)) | |
| 22 | fast ? eval("""
| |
| 23 | global MotionThreshblack = black | |
| 24 | global MotionThreshthresh = thresh | |
| 25 | global MotionThreshinput = input | |
| 26 | global mtcav=0 | |
| 27 | global mtnav=0 | |
| 28 | """) : nop() | |
| 29 | fast ? white.ScriptClip("""
| |
| 30 | MotionThreshwhite = last | |
| 31 | input = MotionThreshinput | |
| 32 | cfr=current_frame | |
| 33 | ||
| 34 | mtpav=cfr<3 ? 0 : mtcav | |
| 35 | global mtcav=cfr<2 ? 0 : mtnav | |
| 36 | global mtnav=input.trim(1,0).AverageLuma() | |
| 37 | ||
| 38 | cond1 = abs(mtcav-mtpav) > MotionThreshthresh ? MotionThreshwhite : MotionThreshblack | |
| 39 | cond2 = abs(mtcav-mtnav) > MotionThreshthresh ? MotionThreshwhite : MotionThreshblack | |
| 40 | Overlay(cond1, cond2, mode="darken") | |
| 41 | """) : nop() | |
| 42 | fast ? last : Overlay(cond1, cond2, mode="darken") | |
| 43 | tile ? last : PointResize(input.width, input.height) | |
| 44 | fast ? cache<0 ? last : last.RequestLinear(8, cache, 5, false, false) : last | |
| 45 | } | |
| 46 | ||
| 47 | ||
| 48 | ###################################################################### | |
| 49 | # MotionRamp by mf, mod for speed by A.SONY | |
| 50 | # Average motion soft-thresholding based on 5 thresholds | |
| 51 | # Dependancies: MotionThresh, ParameterisedBlend or Average if avs is 2.6 or up | |
| 52 | ||
| 53 | function MotionRamp(clip input, int thresh1, int thresh2, int thresh3, int thresh4, int thresh5, int "min", int "max", int "floor", int "ceil", int "radius", bool "tile", bool "fast", int "cache") {
| |
| 54 | min = Default(min, 0) | |
| 55 | max = Default(max, 255) | |
| 56 | floor = Default(floor, 0) | |
| 57 | ceil = Default(ceil, 255) | |
| 58 | radius = Default(radius, 2) | |
| 59 | fast = Default(fast, false) | |
| 60 | tile = Default(tile, fast) | |
| 61 | cache= default(cache,10) | |
| 62 | ||
| 63 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 64 | ||
| 65 | sislumaonly = fast ? ssispmt ? input.isy() : input.isy8() : false | |
| 66 | ||
| 67 | fast && !(VersionNumber() < 2.60) && !sislumaonly ? ssispmt ? input.converttoy() : input.converttoy8() : input | |
| 68 | ||
| 69 | fast ? eval("""
| |
| 70 | white = BlankClip(last, width=16, height=16, Color_yuv=color_white) | |
| 71 | global MotionThreshblack = BlankClip(last, width=16, height=16, Color_yuv=color_black) | |
| 72 | global MotionThreshthresh1 = thresh1 | |
| 73 | global MotionThreshthresh2 = thresh2 | |
| 74 | global MotionThreshthresh3 = thresh3 | |
| 75 | global MotionThreshthresh4 = thresh4 | |
| 76 | global MotionThreshthresh5 = thresh5 | |
| 77 | global MotionThreshinput = last | |
| 78 | global mtnav=0 | |
| 79 | """) : last | |
| 80 | fast ? white.ScriptClip("""
| |
| 81 | input = MotionThreshinput | |
| 82 | MotionThreshwhite = last | |
| 83 | cfr=current_frame | |
| 84 | ||
| 85 | mtpav=cfr<1 ? 0 : mtnav | |
| 86 | global mtnav=input.YDifferenceToNext() | |
| 87 | ||
| 88 | cond11 = mtpav > MotionThreshthresh1 ? MotionThreshwhite : MotionThreshblack | |
| 89 | cond21 = mtnav > MotionThreshthresh1 ? MotionThreshwhite : MotionThreshblack | |
| 90 | c1=Overlay(cond11, cond21, mode="darken") | |
| 91 | ||
| 92 | cond12 = mtpav > MotionThreshthresh2 ? MotionThreshwhite : MotionThreshblack | |
| 93 | cond22 = mtnav > MotionThreshthresh2 ? MotionThreshwhite : MotionThreshblack | |
| 94 | c2=Overlay(cond12, cond22, mode="darken") | |
| 95 | ||
| 96 | cond13 = mtpav > MotionThreshthresh3 ? MotionThreshwhite : MotionThreshblack | |
| 97 | cond23 = mtnav > MotionThreshthresh3 ? MotionThreshwhite : MotionThreshblack | |
| 98 | c3=Overlay(cond13, cond23, mode="darken") | |
| 99 | ||
| 100 | cond14 = mtpav > MotionThreshthresh4 ? MotionThreshwhite : MotionThreshblack | |
| 101 | cond24 = mtnav > MotionThreshthresh4 ? MotionThreshwhite : MotionThreshblack | |
| 102 | c4=Overlay(cond14, cond24, mode="darken") | |
| 103 | ||
| 104 | cond15 = mtpav > MotionThreshthresh5 ? MotionThreshwhite : MotionThreshblack | |
| 105 | cond25 = mtnav > MotionThreshthresh5 ? MotionThreshwhite : MotionThreshblack | |
| 106 | c5=Overlay(cond15, cond25, mode="darken") | |
| 107 | ||
| 108 | VersionNumber() < 2.6 ? Interleave(c3, c2, c4, c1, c5).ParameterisedBlend(0.20, 0.20, 0.20, 0.20, 0.20, gamma=1, scaleweights=false).SelectEvery(5,0) : Average(c3, 0.20, c2, 0.20, c4, 0.20, c1, 0.20, c5, 0.20) | |
| 109 | """) : VersionNumber() < 2.6 ? Interleave(MotionThresh(thresh3, tile=true), MotionThresh(thresh2, tile=true), MotionThresh(thresh4, tile=true), MotionThresh(thresh1, tile=true), MotionThresh(thresh5, tile=true)).ParameterisedBlend(0.20, 0.20, 0.20, 0.20, 0.20, gamma=1, scaleweights=false).SelectEvery(5,0) : \ | |
| 110 | Average(MotionThresh(thresh3, tile=true), 0.20, MotionThresh(thresh2, tile=true), 0.20, MotionThresh(thresh4, tile=true), 0.20, MotionThresh(thresh1, tile=true), 0.20, MotionThresh(thresh5, tile=true), 0.20) | |
| 111 | fast ? cache<0 ? last : last.RequestLinear(8, cache, 5, false, false) : last | |
| 112 | TemporalSoften(radius,255,0,255,2) | |
| 113 | fast ? last : Levels(floor, 1, ceil, min, max) | |
| 114 | fast ? last : ColorYUV(levels="TV->PC") | |
| 115 | tile ? last : PointResize(input.width, input.height) | |
| 116 | } | |
| 117 | ||
| 118 | ||
| 119 | ########## | |
| 120 | function admfilter(clip input, bool "mc", float "f", bool "DarkPreserve", float "rStr", float "amp", bool "lsb", bool "lsb_in", bool "lsb_out", bool "luma_rebuild", bool "u", bool "v", string "pp", string "dfttest_params", string "mcdfttest_params", string "custom_filter", clip "MotionRampadc") {
| |
| 121 | d = default (DarkPreserve , true) | |
| 122 | mc = default (mc , true) | |
| 123 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 124 | f = Default(f, 16.0) | |
| 125 | lsb = default (lsb, ssispmt ? input.BitsPerComponent() > 8 ? false : true : true) | |
| 126 | lsb_in = default (lsb_in , false) | |
| 127 | lsb_out = default (lsb_out , lsb_in) | |
| 128 | lsb = lsb_in || lsb_out ? true : lsb | |
| 129 | luma_rebuild = default (luma_rebuild , true) | |
| 130 | u = default (u , true) | |
| 131 | v = default (v , true) | |
| 132 | dfttest_params = default(dfttest_params, "") | |
| 133 | mcdfttest_params = default(mcdfttest_params, "") | |
| 134 | pp = default (pp, "blur(1.53)") | |
| 135 | ||
| 136 | custom_filter = defined(custom_filter) ? custom_filter : \ | |
| 137 | mc ? "dfttestmc(pp=Eval(pp),lsb=lsb, Sigma=adSigma+1.0/f,rStr=rStr,amp=amp,lsb_in=lsb_in,luma_rebuild=luma_rebuild,u=u,v=v,dfttest_params=dfttest_params" + mcdfttest_params + ")" : \ | |
| 138 | "dfttest(lsb=lsb, Sigma=adSigma+1.0/f, lsb_in=lsb_in,u=u,v=v" + dfttest_params + ")" | |
| 139 | ||
| 140 | input | |
| 141 | MotionRampadc = defined(MotionRampadc) ? MotionRampadc : last.MotionRamp(5,10,15,20,25,Max=255,fast=True) | |
| 142 | lsb_out && !lsb_in ? Dither_convert_8_to_16() : lsb_in && !lsb_out ? Ditherpost(mode=-1, y=1, u=1,v=1) : last | |
| 143 | return GScriptClip("""
| |
| 144 | adfloat = AverageLuma(MotionRampadc) | |
| 145 | adSigmb = ssispmt ? BitsPerComponent() > 8 ? BitsPerComponent() == 10 ? 4 : BitsPerComponent() == 12 ? 8 : BitsPerComponent() == 14 ? 64 : nop() : nop() : nop() | |
| 146 | - | adSigma = ssispmt ? BitsPerComponent() > 8 ? BitsPerComponent() < 16 ? adfloat/adSigmb : BitsPerComponent() > 30 ? adfloat*255.0 : sqrt(adfloat) : adfloat : adfloat |
| 146 | + | adSigma = ssispmt ? isvideofloat() ? adfloat*255.0 : BitsPerComponent() > 8 ? BitsPerComponent() < 16 ? adfloat/adSigmb : sqrt(adfloat) : adfloat : adfloat |
| 147 | (lsb_out && !lsb_in) || (lsb_in && !lsb_out) ? input : last | |
| 148 | adden = Eval(custom_filter) | |
| 149 | d ? DarkPreserve_function(filtered=adden, original=last, u=u ? 3 : 4, v=v ? 3 : 4, lsb=lsb, lsb_in=lsb_in, lsb_out=lsb_out) : adden | |
| 150 | !d && !lsb_out && lsb ? Ditherpost(mode=7, slice=false) : last | |
| 151 | """, args="MotionRampadc, f, d, rStr, amp, lsb_in, lsb_out, lsb, luma_rebuild, u, v,dfttest_params,mcdfttest_params,pp,input,custom_filter,ssispmt") | |
| 152 | } | |
| 153 | ||
| 154 | ||
| 155 | ####### | |
| 156 | function DarkPreserve_function(clip "filtered", clip "original", bool "merge16_8", int "u", int "v", bool "lsb", bool "lsb_in", bool "lsb_out") {
| |
| 157 | lsb_in = default (lsb_in , false) #for original | |
| 158 | F_lsb_in = lsb_in ? (Height(filtered)) == (Height(original)) : (Height(filtered)) == (Height(original)*2) | |
| 159 | lsb_out = default (lsb_out , F_lsb_in || lsb_in) | |
| 160 | lsb = default (lsb , lsb_in || lsb_out || F_lsb_in) | |
| 161 | merge16_8 = default (merge16_8 , true) | |
| 162 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 163 | sislumaonly = ssispmt ? original.isy() : VersionNumber() < 2.6 ? nop() : original.isy8() | |
| 164 | u = default (u , VersionNumber() < 2.6 ? 3 : sislumaonly ? 1 : 3) | |
| 165 | v = default (v , u) | |
| 166 | chroma = !(u != 3 && v != 3) | |
| 167 | ||
| 168 | F_lsb_in ? Assert(lsb, "16stacked filtered clip requires: lsb=true") : nop() | |
| 169 | lsb_in ? Assert(lsb, "lsb_in requires: lsb=true") : nop() | |
| 170 | lsb_out ? Assert(lsb, "lsb_out requires: lsb=true") : nop() | |
| 171 | ||
| 172 | dp_lut = lsb_in ? original.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 4.338916843220339 * - ? ?",u=1,v=1) : VersionNumber() < 2.6 ? original.mt_lut("x 16 < 255 x 75 > 0 255 x 16 - 4.322033898305085 * - ? ?",u=1,v=1)
| |
| 173 | - | \ : original.mt_lut("x 16 #F < range_max x 75 #F > 0 range_max x 16 #F - range_max 75 #F 16 #F - / * - ? ?",u=1,v=1)
|
| 173 | + | \ : original.mt_lut("x 16 scalef < range_max x 75 scalef > 0 range_max x 16 scalef - range_max 75 scalef 16 scalef - / * - ? ?",u=1,v=1)
|
| 174 | ||
| 175 | dp_lut = lsb_in && merge16_8 ? dp_lut.Ditherpost(mode=6, slice=false, u=1, v=1) : dp_lut | |
| 176 | ||
| 177 | dp_merge = lsb ? merge16_8 ? Dither_merge16_8(F_lsb_in ? filtered : filtered.Dither_convert_8_to_16(), lsb_in ? original : original.Dither_convert_8_to_16(), dp_lut, luma=chroma, u=u,v=v) : \ | |
| 178 | Dither_merge16(F_lsb_in ? filtered : filtered.Dither_convert_8_to_16(), lsb_in ? original : original.Dither_convert_8_to_16(), dp_lut, luma=chroma, u=u,v=v) : \ | |
| 179 | mt_merge(filtered, original, dp_lut, luma=chroma, u=u,v=v) | |
| 180 | lsb ? lsb_out ? dp_merge : dp_merge.Ditherpost(mode=7, slice=false) : dp_merge | |
| 181 | } | |
| 182 | ||
| 183 | function lightPreserve_function(clip "filtered", clip "original", bool "merge16_8", int "u", int "v", bool "lsb", bool "lsb_in", bool "lsb_out") {
| |
| 184 | lsb_in = default (lsb_in , false) #for original | |
| 185 | F_lsb_in = lsb_in ? (Height(filtered)) == (Height(original)) : (Height(filtered)) == (Height(original)*2) | |
| 186 | lsb_out = default (lsb_out , F_lsb_in || lsb_in) | |
| 187 | lsb = default (lsb , lsb_in || lsb_out || F_lsb_in) | |
| 188 | merge16_8 = default (merge16_8 , true) | |
| 189 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 190 | sislumaonly = ssispmt ? original.isy() : VersionNumber() < 2.6 ? nop() : original.isy8() | |
| 191 | u = default (u , VersionNumber() < 2.6 ? 3 : sislumaonly ? 1 : 3) | |
| 192 | v = default (v , u) | |
| 193 | chroma = !(u != 3 && v != 3) | |
| 194 | ||
| 195 | F_lsb_in ? Assert(lsb, "16stacked filtered clip requires: lsb=true") : nop() | |
| 196 | lsb_in ? Assert(lsb, "lsb_in requires: lsb=true") : nop() | |
| 197 | lsb_out ? Assert(lsb, "lsb_out requires: lsb=true") : nop() | |
| 198 | ||
| 199 | dp_lut = lsb_in ? original.Dither_lut16("x 60160 > 65535 x 45056 < 0 65535 60160 x - 4.338916843220339 * - ? ?",u=1,v=1) : VersionNumber() < 2.6 ? original.mt_lut("x 235 > 255 x 176 < 0 255 235 x - 4.322033898305085 * - ? ?",u=1,v=1)
| |
| 200 | - | \ : original.mt_lut("x 235 #F > range_max x 176 #F < 0 range_max x 235 #F - range_max 176 #F 235 #F - / * - ? ?",u=1,v=1)
|
| 200 | + | \ : original.mt_lut("x 235 scalef > range_max x 176 scalef < 0 range_max x 235 scalef - range_max 176 scalef 235 scalef - / * - ? ?",u=1,v=1)
|
| 201 | ||
| 202 | dp_lut = lsb_in && merge16_8 ? dp_lut.Ditherpost(mode=6, slice=false, u=1, v=1) : dp_lut | |
| 203 | ||
| 204 | dp_merge = lsb ? merge16_8 ? Dither_merge16_8(F_lsb_in ? filtered : filtered.Dither_convert_8_to_16(), lsb_in ? original : original.Dither_convert_8_to_16(), dp_lut, luma=chroma, u=u,v=v) : \ | |
| 205 | Dither_merge16(F_lsb_in ? filtered : filtered.Dither_convert_8_to_16(), lsb_in ? original : original.Dither_convert_8_to_16(), dp_lut, luma=chroma, u=u,v=v) : \ | |
| 206 | mt_merge(filtered, original, dp_lut, luma=chroma, u=u,v=v) | |
| 207 | lsb ? lsb_out ? dp_merge : dp_merge.Ditherpost(mode=7, slice=false) : dp_merge | |
| 208 | } | |
| 209 | ||
| 210 | ||
| 211 | ########## | |
| 212 | #edge side bleed | |
| 213 | #original idea by "colours", this function mod by A.SONY | |
| 214 | ########## | |
| 215 | function edgesidebleed(clip input, float "w32", float "w16", float "w8", float "w4", float "w2", bool "bleed", bool "chroma", int "mode") {
| |
| 216 | w2 = Default(w2, 0.001) | |
| 217 | w4 = Default(w4, 0.055) | |
| 218 | w8 = Default(w8, 0.015) | |
| 219 | w16 = Default(w16, 0.02) | |
| 220 | w32 = Default(w32, 0.001) | |
| 221 | chroma = default(chroma, false) | |
| 222 | mode = default(mode, 0) | |
| 223 | bleed = default(bleed, !(VersionNumber() < 2.6)) | |
| 224 | ||
| 225 | ssispmt = !chroma ? Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 : nop() | |
| 226 | sislumaonly = !chroma ? ssispmt ? input.isy() : VersionNumber() < 2.6 ? true : input.isy8() : nop() | |
| 227 | !chroma ? sislumaonly ? input : ssispmt ? input.converttoy() : input.converttoy8() : input | |
| 228 | w = bleed ? Width() : nop() | |
| 229 | h = bleed ? Height() : nop() | |
| 230 | ||
| 231 | shift32 = w32!=0 ? !bleed ? Crop(Width()-32,0,32,0,true).StackHorizontal(Crop(0,0,-32,0,true)) : nop() : nop() | |
| 232 | shift32 = w32!=0 ? bleed ? BicubicResize (w / 32, h, 1, 0,src_left=-32).BicubicResize (w, h, 1, 0) : shift32 : nop() | |
| 233 | w32==0 ? last : mode == 0 ? average(last,1+w32,shift32,-w32) : mode==1 ? lightPreserve_function(average(last,1+w32,shift32,-w32),last) : DarkPreserve_function(average(last,1+w32,shift32,-w32),last) | |
| 234 | shift16 = w16!=0 ? !bleed ? Crop(Width()-16,0,16,0,true).StackHorizontal(Crop(0,0,-16,0,true)) : nop() : nop() | |
| 235 | shift16 = w16!=0 ? bleed ? BicubicResize (w / 16, h, 1, 0,src_left=-16).BicubicResize (w, h, 1, 0) : shift16 : nop() | |
| 236 | w16==0 ? last : mode == 0 ? average(last,1+w16,shift16,-w16) : mode==1 ? lightPreserve_function(average(last,1+w16,shift16,-w16),last) : DarkPreserve_function(average(last,1+w16,shift16,-w16),last) | |
| 237 | shift8 = w8!=0 ? !bleed ? Crop(Width()-8,0,8,0,true).StackHorizontal(Crop(0,0,-8,0,true)) : nop() : nop() | |
| 238 | shift8 = w8!=0 ? bleed ? BicubicResize (w / 8, h, 1, 0,src_left=-8).BicubicResize (w, h, 1, 0) : shift8 : nop() | |
| 239 | w8==0 ? last : mode == 0 ? average(last,1+w8,shift8,-w8) : mode==1 ? lightPreserve_function(average(last,1+w8,shift8,-w8),last) : DarkPreserve_function(average(last,1+w8,shift8,-w8),last) | |
| 240 | shift4 = w4!=0 ? !bleed ? Crop(Width()-4,0,4,0,true).StackHorizontal(Crop(0,0,-4,0,true)) : nop() : nop() | |
| 241 | shift4 = w4!=0 ? bleed ? BicubicResize (w / 4, h, 1, 0,src_left=-4).BicubicResize (w, h, 1, 0) : shift4 : nop() | |
| 242 | w4==0 ? last : mode == 0 ? average(last,1+w4,shift4,-w4) : mode==1 ? lightPreserve_function(average(last,1+w4,shift4,-w4),last) : DarkPreserve_function(average(last,1+w4,shift4,-w4),last) | |
| 243 | shift2 = w2!=0 ? !bleed ? Crop(Width()-2,0,2,0,true).StackHorizontal(Crop(0,0,-2,0,true)) : nop() : nop() | |
| 244 | shift2 = w2!=0 ? bleed ? BicubicResize (w / 2, h, 1, 0,src_left=-2).BicubicResize (w, h, 1, 0) : shift2 : nop() | |
| 245 | w2==0 ? last : mode == 0 ? average(last,1+w2,shift2,-w2) : mode==1 ? lightPreserve_function(average(last,1+w2,shift2,-w2),last) : DarkPreserve_function(average(last,1+w2,shift2,-w2),last) | |
| 246 | ||
| 247 | !chroma ? sislumaonly ? last : ssispmt ? CombinePlanes(last,input,planes="YUV",sample_clip=input) : ytouv(input.utoy8(),input.vtoy8(),last) : last | |
| 248 | } | |
| 249 | ||
| 250 | ||
| 251 | ########## | |
| 252 | #chroma edge side bleed (aka pink artifacts) fix, by A.SONY | |
| 253 | ########## | |
| 254 | function chromasidebleed(clip input, int "diameter", float "sDev", float "iDev", float "cs", bool "bic", string "cplace", bool "d2", int "kernS", int "kernI", int "resType") | |
| 255 | {
| |
| 256 | diameter = default (diameter, 11) | |
| 257 | sDev = default (sDev, 31.1) | |
| 258 | iDev = default (iDev, 15.1) | |
| 259 | d2 = default (d2, true) | |
| 260 | kernS = default (kernS, 8) | |
| 261 | kernI = default (kernI, 3) | |
| 262 | restype = default (restype, 0) | |
| 263 | bic = default (bic, true) | |
| 264 | cplace = default (cplace, "MPEG2") | |
| 265 | ||
| 266 | chroma = false | |
| 267 | gui = false | |
| 268 | ||
| 269 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 270 | sisfullchr = ssispmt ? input.is444() : VersionNumber() < 2.6 ? false : input.isyv24() | |
| 271 | sislumaonly = ssispmt ? input.isy() : VersionNumber() < 2.6 ? false : input.isy8() | |
| 272 | Assert(!sislumaonly, "why you use this on no chroma clip?!") | |
| 273 | ||
| 274 | y=VersionNumber() < 2.6 ? input : ssispmt ? input.converttoy() : input.converttoy8() | |
| 275 | u=VersionNumber() < 2.6 ? input.utoy() : input.utoy8() | |
| 276 | v=VersionNumber() < 2.6 ? input.vtoy() : input.vtoy8() | |
| 277 | cshift = (cplace == "MPEG1" && IsYV12(input)) || IsYV24(input) ? 0 : -0.5 | |
| 278 | ych = sisfullchr ? y : bic ? input.BicubicResize(u.width(), v.height(), 1, 0, src_left=cshift) : input.BilinearResize(u.width(), v.height(), src_left=cshift) | |
| 279 | u=u.ConvertToYV12().TBilateral(diameterL=diameter, sDevL=sDev, iDevL=iDev, csL=cs, d2=d2, chroma=chroma, ppclip=ych.ConvertToYV12(), kernS=kernS, kernI=kernI, resType=resType) | |
| 280 | v=v.ConvertToYV12().TBilateral(diameterL=diameter, sDevL=sDev, iDevL=iDev, csL=cs, d2=d2, chroma=chroma, ppclip=ych.ConvertToYV12(), kernS=kernS, kernI=kernI, resType=resType) | |
| 281 | YToUV(u,v,y) | |
| 282 | } | |
| 283 | ||
| 284 | ||
| 285 | ############### | |
| 286 | # Hqdn3d_2 | |
| 287 | ||
| 288 | function Hqdn3d_2(clip clip, float "ls", float "cs", float "lt", float "ct", int "UV", bool "lsb", bool "lsb_in", bool "i16") {
| |
| 289 | cs = default (cs , 3.0) | |
| 290 | ct = default (ct , 4.5) | |
| 291 | UV = default (UV , 3) | |
| 292 | UV = !(VersionNumber() < 2.60) ? isY8(clip) ? 1 : UV : UV | |
| 293 | lsb_in = default (lsb_in , false) | |
| 294 | i16 = default (i16 , false) | |
| 295 | lsb_out = default (lsb , lsb_in) | |
| 296 | ||
| 297 | i16b = lsb_out || i16 || lsb_in | |
| 298 | ||
| 299 | isrgb(clip) ? Assert(!i16b, "no 16bit for RGB, but you can use some trickes for that (see dither doc)") : nop() | |
| 300 | ||
| 301 | yString = VersionNumber() < 2.60 ? "yv12" : "Y8" | |
| 302 | ||
| 303 | pclip = isYUV(clip) && i16b && isYUY2(clip) && !(VersionNumber() < 2.60) ? clip.ConvertToYV16() : clip | |
| 304 | ||
| 305 | i16clip = isYUV(clip) ? i16b ? lsb_in ? pclip.Bitdepth(from=88, to=16) : i16 ? clip : pclip.Bitdepth(from=8, to=16) : nop() : nop() | |
| 306 | ||
| 307 | y = isYUV(clip) ? VersionNumber() < 2.60 ? i16b ? i16clip : clip : i16b ? ConvertToY8(i16clip) : ConvertToY8(clip) : nop() | |
| 308 | u = isYUV(clip) && UV != 1 ? VersionNumber() < 2.60 ? i16b ? UToY(i16clip) : UToY(clip) : i16b ? UToY8(i16clip) : UToY8(clip) : nop() | |
| 309 | v = isYUV(clip) && UV != 1 ? VersionNumber() < 2.60 ? i16b ? VToY(i16clip) : VToY(clip) : i16b ? VToY8(i16clip) : VToY8(clip) : nop() | |
| 310 | y = isYUV(clip) ? VersionNumber() < 2.60 ? isclip(i16clip) ? y.converttoyv12().Hqdn3d16Y(sp=ls, tp=lt) : y.converttoyv12().Hqdn3dY(sp=ls, tp=lt) : isclip(i16clip) ? y.Hqdn3d16Y(sp=ls, tp=lt) : y.Hqdn3dY(sp=ls, tp=lt) : nop() | |
| 311 | u = isYUV(clip) ? UV == 3 ? VersionNumber() < 2.60 ? isclip(i16clip) ? u.converttoyv12().Hqdn3d16Y(sp=cs, tp=ct) : u.converttoyv12().Hqdn3dY(sp=cs, tp=ct) : isclip(i16clip) ? u.Hqdn3d16Y(sp=cs, tp=ct) : u.Hqdn3dY(sp=cs, tp=ct) : u : nop() | |
| 312 | v = isYUV(clip) ? UV == 3 ? VersionNumber() < 2.60 ? isclip(i16clip) ? v.converttoyv12().Hqdn3d16Y(sp=cs, tp=ct) : v.converttoyv12().Hqdn3dY(sp=cs, tp=ct) : isclip(i16clip) ? v.Hqdn3d16Y(sp=cs, tp=ct) : v.Hqdn3dY(sp=cs, tp=ct) : v : nop() | |
| 313 | isYUV(clip) ? (VersionNumber() < 2.60) && isYUY2(clip) ? UV == 1 ? y : YToUV(u.converttoyuy2(),v.converttoyuy2(),y.converttoyuy2()) : UV == 1 ? y : YToUV(u,v,y) : nop() | |
| 314 | isYUV(clip) ? i16b && !i16 && lsb_out ? Bitdepth(from=16, to=88) : last : last | |
| 315 | isYUV(clip) ? !i16b || lsb_out || i16 ? last : Bitdepth(from=16, to=8) : last | |
| 316 | isYUY2(clip) ? VersionNumber() < 2.60 ? last : converttoyuy2() : last | |
| 317 | ||
| 318 | A = isrgb32(clip) ? clip.ShowAlpha(yString) : nop() | |
| 319 | r = isrgb(clip) ? clip.ShowRed(yString) : nop() | |
| 320 | g = isrgb(clip) ? clip.ShowGreen(yString) : nop() | |
| 321 | b = isrgb(clip) ? clip.ShowBlue(yString) : nop() | |
| 322 | A = isrgb32(clip) ? A.Hqdn3dY(sp=ls, tp=lt) : nop() | |
| 323 | r = isrgb(clip) ? r.Hqdn3dY(sp=ls, tp=lt) : nop() | |
| 324 | g = isrgb(clip) ? g.Hqdn3dY(sp=ls, tp=lt) : nop() | |
| 325 | b = isrgb(clip) ? b.Hqdn3dY(sp=ls, tp=lt) : nop() | |
| 326 | isYUV(clip) ? last : isrgb32(clip) ? MergeARGB(A,r,g,b) : MergeRGB(r,g,b,"RGB24") | |
| 327 | } | |
| 328 | ||
| 329 | ||
| 330 | ############### | |
| 331 | #motion adaptive by A.SONY | |
| 332 | ||
| 333 | function smam(clip input, clip "prefilter", val "filter", int "pel", int "blksize", clip "motionmask", float "Str", float "Amp", bool "TV_range", bool "qtgmc_lsb", int "tr2", int "usedaa3mod") {
| |
| 334 | ||
| 335 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 336 | qtgmc_lsb = default(qtgmc_lsb, ssispmt ? input.BitsPerComponent() > 8 ? false : true : true) | |
| 337 | ||
| 338 | defined(filter) ? Assert((Isclip(filter) || IsString(filter)), "'filter' only accepts clip or string") : nop() | |
| 339 | ||
| 340 | Str = default (Str, 1.5) | |
| 341 | exfilclp = isclip(filter) | |
| 342 | sisbob = round(framerate(input))==60 || framerate(input)==50 | |
| 343 | tr2 = default (tr2, sisbob ? 3 : 1) | |
| 344 | usedaa3mod = default (usedaa3mod, exfilclp ? 0 : sisbob ? 1 : 2) | |
| 345 | ||
| 346 | infiltr = usedaa3mod == 1 ? input.daa3mod() : input | |
| 347 | filclip = defined(filter) ? exfilclp ? filter : eval("infiltr." + filter) : infiltr.QTGMC(InputType=1, tr0=0, tr1=sisbob ? undefined : 1, tr2=tr2, lsb=qtgmc_lsb, rep1=sisbob ? undefined : 11, rep2=sisbob ? undefined : 11, Sharpness=0.0, TV_range=TV_range, Str=Str, Amp=Amp)
| |
| 348 | filclip = usedaa3mod == 2 ? filclip.daa3mod() : filclip | |
| 349 | ||
| 350 | momask = !defined(motionmask) ? input.smam_mask(prefilter,pel,blksize) : motionmask #if you deal with YUY2 then it should be Planar YUY2 in avs2.5 and yv16 in avs2.6 | |
| 351 | isyuy2(input) && VersionNumber() < 2.60 ? mt_merge(input.Interleaved2Planar(),filclip.Interleaved2Planar(),momask,u=3,v=3).Planar2Interleaved() : isyuy2(input) ? mt_merge(input.converttoyv16(),filclip.converttoyv16(),momask,u=3,v=3).converttoyuy2() : mt_merge(input,filclip,momask,u=3,v=3) | |
| 352 | } | |
| 353 | ||
| 354 | ||
| 355 | ############### | |
| 356 | #smam_mask | |
| 357 | # if input is YUY2 the output will be Planar YUY2 in avs 2.5 and yv16 in avs 2.6 | |
| 358 | ||
| 359 | function smam_mask(clip input, clip "prefilter", int "pel", int "blksize", bool "chroma", int "dct") {
| |
| 360 | ox = input.width() | |
| 361 | oy = input.height() | |
| 362 | HD = (ox > 1099 || oy > 599) | |
| 363 | sisbob = round(framerate(input))==60 || framerate(input)==50 | |
| 364 | pel = default( pel, HD ? 1 : 2 ) | |
| 365 | dct = default( dct, sisbob ? 0 : 2 ) | |
| 366 | blksize = default(blksize,HD ? sisbob ? 8 : 16 : sisbob ? 4 : 8) | |
| 367 | preclip= defined(prefilter) ? prefilter : (VersionNumber() < 2.60) && isyv12(input) ? input.HQdn3d().FFT3DFilter() : input.HQdn3d_2().FFT3DFilter() | |
| 368 | sup = preclip.MSuper(pel=pel,sharp=1) | |
| 369 | fv1 = sup.MAnalyse(isb=false,delta=1,DCT=dct,Truemotion=false,blksize=blksize,chroma=chroma) | |
| 370 | fv2 = sup.MAnalyse(isb=true,delta=1,DCT=dct,Truemotion=true,blksize=blksize,chroma=chroma) | |
| 371 | ||
| 372 | momask1 = input.MMask(fv1, kind = 1, ml=2) | |
| 373 | momask2 = input.MMask(fv2, kind = 1, ml=3) | |
| 374 | momask1 =isyuy2(input) && VersionNumber() < 2.60 ? momask1.Interleaved2Planar() : isyuy2(input) ? momask1.converttoyv16() : momask1 | |
| 375 | momask2 =isyuy2(input) && VersionNumber() < 2.60 ? momask2.Interleaved2Planar() : isyuy2(input) ? momask2.converttoyv16() : momask2 | |
| 376 | mt_average(momask1,momask2,u=3,v=3) | |
| 377 | } | |
| 378 | ||
| 379 | ||
| 380 | ############## | |
| 381 | # sanimebob by A.SONY | |
| 382 | ||
| 383 | function sanimebob(clip i, val "useqtgmc", val "bobpresmooth", float "Str", float "Amp", bool "TV_range", bool "qtgmc_lsb", bool "usedaa3mod", bool "usesmam", int "tr2") {
| |
| 384 | ||
| 385 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 386 | qtgmc_lsb = default(qtgmc_lsb, ssispmt ? i.BitsPerComponent() > 8 ? false : true : true) | |
| 387 | ||
| 388 | useq = default (useqtgmc, 0) | |
| 389 | Stringuseq = IsString(useq ) | |
| 390 | bobpresmbool = default (isbool(bobpresmooth) ? bobpresmooth : !Stringuseq ? (useq==8 || defined(bobpresmooth)) : defined(bobpresmooth), false) | |
| 391 | Str = default (Str, 1.5) | |
| 392 | tr2 = default (tr2, !Stringuseq ? useq==8 ? 3 : 1 : 1) | |
| 393 | usedaa3mod = default (usedaa3mod, !Stringuseq ? useq==4 || useq==5 || useq==7 || useq==9 : false) | |
| 394 | usesmam = default (usesmam, !Stringuseq ? !(useq==0 || useq==1 || useq==8) : false) | |
| 395 | ||
| 396 | Assert(Isint(useq) || Stringuseq, "'useqtgmc' only accepts int or string") | |
| 397 | ||
| 398 | prefiltered_i = defined(bobpresmooth) ? isclip(bobpresmooth) ? bobpresmooth : IsString(bobpresmooth) ? Eval("i." + bobpresmooth) : undefined() : undefined()
| |
| 399 | ||
| 400 | nonyuy2=!(VersionNumber() < 2.6) && i.isyuy2() | |
| 401 | iforbob = bobpresmbool ? defined(prefiltered_i) ? prefiltered_i : i.QTGMC_bob(0,0.5).nonyuy2clipin(nonyuy2).reduceflicker(strength=2).nonyuy2clipout(nonyuy2).interlaced60or50(BFF=!(GetParity(i))) : i | |
| 402 | iforbob = bobpresmbool && !defined(prefiltered_i) ? isyuy2(i) ? iforbob.SeparateFields().Interleaved2Planar().Repair(i.SeparateFields().Interleaved2Planar(),Planar=true).Planar2Interleaved().weave() : iforbob.SeparateFields().Repair(i.SeparateFields()).weave() : iforbob | |
| 403 | ||
| 404 | pyi = i.pointresize(width(i),height(i)+8,0,-4,width(i),height(i)+8.0001) | |
| 405 | pei = i.eedi3(-2,sclip=iforbob.nnedi3(-2)).pointresize(width(i),height(i)+8,0,-4,width(i),height(i)+8.0001) | |
| 406 | ||
| 407 | ymodclip = VersionNumber() < 2.60 ? pyi.yadifmod(mode=3, edeint=pei).crop(0,4,-0,-4) : pyi.nonyuy2clipin(nonyuy2).yadifmod2(mode=3, edeint=pei.nonyuy2clipin(nonyuy2)).crop(0,4,-0,-4) | |
| 408 | yadifclip = isyuy2(i) && VersionNumber() < 2.60 ? ymodclip.Interleaved2Planar().Repair(i.TDeint(1,emask=iforbob.tmm2_ortmm1(1)).Interleaved2Planar(),Planar=true).Planar2Interleaved() : \ | |
| 409 | ymodclip.Repair(i.TDeint(1,emask=iforbob.tmm2_ortmm1(1)).nonyuy2clipin(nonyuy2)).nonyuy2clipout(nonyuy2) | |
| 410 | ||
| 411 | # for custom qtgmc, don't forget to put the input clip like this:- iforbob.QTGMC(... or yadifclip.QTGMC(... or i.QTGMC(... | |
| 412 | QTGMCclip = isstring(useq) ? eval(useq) : \ | |
| 413 | useq==0 ? yadifclip : \ | |
| 414 | useq==1 || useq==2 || useq==4 ? iforbob.QTGMC(SourceMatch=3, Lossless=2, EdiExt=yadifclip, tr0=1, tr1=1, tr2=tr2, lsb=qtgmc_lsb, rep0=11, rep1=11, rep2=11, Sharpness=0.1, TV_range=TV_range, Str=Str, Amp=Amp) : \ | |
| 415 | useq==3 || useq==5 ? yadifclip.QTGMC(InputType=1, tr0=1, tr1=1, tr2=tr2, lsb=qtgmc_lsb, rep0=11, rep1=11, rep2=11, Sharpness=0.1, TV_range=TV_range, Str=Str, Amp=Amp) : \ | |
| 416 | useq==6 || useq==7 ? yadifclip.QTGMC(InputType=1, tr0=0, lsb=qtgmc_lsb, Sharpness=usedaa3mod ? 0.0 : 0.1, TV_range=TV_range, Str=Str, Amp=Amp) : \ | |
| 417 | i.QTGMC(SourceMatch=3, Lossless=2, EdiExt=yadifclip, useEdiExt=!(useq==9), tr0=useq==9 ? -1 : undefined(), rep0=useq==9 ? undefined() : 11, tr2=tr2, lsb=qtgmc_lsb, Sharpness=0.0, TV_range=TV_range, Str=Str, Amp=Amp) | |
| 418 | ||
| 419 | daa3mclip = usedaa3mod ? QTGMCclip.daa3mod() : QTGMCclip | |
| 420 | ||
| 421 | !usesmam ? daa3mclip : \ | |
| 422 | yadifclip.smam(filter=QTGMCclip) | |
| 423 | } |