Advertisement
Guest User

Advanced Denoising

a guest
Aug 12th, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Advanced Denoising and anime bob v1.56
  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 motinc, 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 ? motinc.isy() : motinc.isy8() : nop()
  16.  
  17. motinc = fast && !sislumaonly ? ssispmt ? motinc.converttoy() : motinc.converttoy8() : motinc
  18. black  = !fast ? BlankClip(motinc, width=16, height=16               ) : BlankClip(motinc, width=16, height=16, Color_yuv=color_black)
  19. white  = !fast ? BlankClip(motinc, width=16, height=16, color=$FFFFFF) : BlankClip(motinc, width=16, height=16, Color_yuv=color_white)
  20. cond1  = fast ? nop() : ConditionalFilter(motinc, white, black, "YDifferenceFromPrevious()", "greaterthan", String(thresh))
  21. cond2  = fast ? nop() : ConditionalFilter(motinc, white, black, "YDifferenceToNext()", "greaterthan", String(thresh))
  22. fast ? eval("""
  23. global MotionThreshblack = black
  24. global MotionThreshthresh = thresh
  25. global MotionThreshmotinc = motinc
  26. global mtcav=0
  27. global mtnav=0
  28. """) : nop()
  29. fast ? white.ScriptClip("""
  30. MotionThreshwhite = last
  31. motinc = MotionThreshmotinc
  32. cfr=current_frame
  33.  
  34. mtpav=cfr<3 ? 0 : mtcav
  35. global mtcav=cfr<2 ? 0 : mtnav
  36. global mtnav=motinc.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 : Eval("try { PointResizemt(motinc.width, motinc.height) } catch(error_msg) { PointResize(motinc.width, motinc.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 morinc, 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 ? morinc.isy() : morinc.isy8() : false
  66.  
  67. fast && !(VersionNumber() < 2.60) && !sislumaonly ? ssispmt ? morinc.converttoy() : morinc.converttoy8() : morinc
  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 MotionThreshmorinc = last
  78. global mtnav=0
  79. """) : last
  80. fast ? white.ScriptClip("""
  81. morinc = MotionThreshmorinc
  82. MotionThreshwhite = last
  83. cfr=current_frame
  84.  
  85. mtpav=cfr<1 ? 0 : mtnav
  86. global mtnav=morinc.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 : Eval("try { PointResizemt(morinc.width, morinc.height) } catch(error_msg) { PointResize(morinc.width, morinc.height) }")
  116. }
  117.  
  118.  
  119. ##########
  120. function admfilter(clip oin, 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", bool "mcf", clip "ppsuper", clip "super", clip "exmcclip") {
  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 ? oin.BitsPerComponent() > 8 ? false : true : true)
  126. lsb_in = default (lsb_in      , false)
  127. oin8 = lsb_in ? oin.ditherpost(mode=7,slice=false,u=u ? 3 : 1,v=v ? 3 : 1) : oin
  128.     ox = oin8.width()
  129.     oy = oin8.height()
  130.     HD = (ox > 1099 || oy > 599)
  131. lsb_out = default (lsb_out      , lsb_in)
  132. lsb = lsb_in || lsb_out ? true : lsb
  133. luma_rebuild = default (luma_rebuild      , true)
  134. u = default (u      , true)
  135. v = default (v      , true)
  136. exmc = defined(exmcclip)
  137. mcf = default (mcf, exmc)
  138. dfttest_params = default(dfttest_params, "")
  139. mcdfttest_params = default(mcdfttest_params, "")
  140. pp = default (pp, "blur(1.53)")
  141.  
  142. pel = HD ? 1 : 2
  143.  
  144. super = defined(super) ? super : oin8.MSuper(pel=pel, levels=1, chroma=(U || V))
  145. ppsu = defined(ppsuper) ? ppsuper : oin8.spp_super(pp=oin8.Eval(pp),rStr=rStr,amp=amp,lsb_in=lsb_in,luma_rebuild=luma_rebuild,u=u,v=v,hd=hd)
  146. exmcclip = mcf ? exmc ? exmcclip : oin8.sMCclips(ppsu,super,hd=hd) : nop()
  147.  
  148. custom_filter = defined(custom_filter) ? custom_filter : \
  149.                             mcf ? "dfttestmc(pp=oin8,lsb=lsb, Sigma=adSigma+1.0/f,lsb_in=lsb_in,u=u,v=v,slices=false,super=super,input8=oin8,hd=hd,exmcclip=exmcclip,dfttest_params=dfttest_params" + mcdfttest_params + ")" : \
  150.                                                          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 + ")" : \
  151.                                                               "dfttest(lsb=lsb, Sigma=adSigma+1.0/f, lsb_in=lsb_in,u=u,v=v" + dfttest_params + ")"
  152.  
  153. oin
  154. MotionRampadc = defined(MotionRampadc) ? MotionRampadc : last.MotionRamp(5,10,15,20,25,Max=255,fast=True)
  155. lsb_out && !lsb_in ? Dither_convert_8_to_16() : lsb_in && !lsb_out ? Ditherpost(mode=-1, y=1, u=1,v=1) : last
  156. return GScriptClip("""
  157.                     adfloat = AverageLuma(MotionRampadc)
  158.                     adSigmb = ssispmt ? BitsPerComponent() > 8 ? BitsPerComponent() == 10 ? 4 : BitsPerComponent() == 12 ? 8 : BitsPerComponent() == 14 ? 64 : nop() : nop() : nop()
  159.                     adSigma = ssispmt ? isvideofloat() ? adfloat*255.0 : BitsPerComponent() > 8 ? BitsPerComponent() < 16 ? adfloat/adSigmb : sqrt(adfloat) : adfloat : adfloat
  160.                     (lsb_out && !lsb_in) || (lsb_in && !lsb_out) ? oin : last
  161.                     adden = Eval(custom_filter)
  162.                     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
  163.                     !d && !lsb_out && lsb ? Ditherpost(mode=7, slice=false) : last
  164.                     """, args="MotionRampadc, f, d, rStr, amp, lsb_in, lsb_out, lsb, luma_rebuild, u, v,dfttest_params,mcdfttest_params,pp,oin,custom_filter,ssispmt,super,oin8,hd,exmcclip")
  165. }
  166.  
  167.  
  168. #######
  169. function DarkPreserve_function(clip "filtered", clip "original", bool "merge16_8", int "u", int "v", bool "lsb", bool "lsb_in", bool "lsb_out") {
  170. lsb_in    = default (lsb_in                       , false) #for original
  171. F_lsb_in  = lsb_in ? (Height(filtered)) == (Height(original)) : (Height(filtered)) == (Height(original)*2)
  172. lsb_out   = default (lsb_out         , F_lsb_in || lsb_in)
  173. lsb       = default (lsb ,  lsb_in || lsb_out || F_lsb_in)
  174. merge16_8 = default (merge16_8                     , true)
  175. ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  176. sislumaonly = ssispmt ? original.isy() : VersionNumber() < 2.6 ? nop() : original.isy8()
  177. u         = default (u                                , VersionNumber() < 2.6 ? 3 : sislumaonly ? 1 : 3)
  178. v         = default (v                                , u)
  179. chroma    = !(u != 3 && v != 3)
  180.  
  181. F_lsb_in        ? Assert(lsb,                          "16stacked filtered clip requires: lsb=true")                : nop()
  182. lsb_in          ? Assert(lsb,                          "lsb_in  requires: lsb=true")                                : nop()
  183. lsb_out         ? Assert(lsb,                          "lsb_out requires: lsb=true")                                : nop()
  184.  
  185. 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)
  186.                                                                  \             : 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)
  187.  
  188. dp_lut = lsb_in && merge16_8 ? dp_lut.Ditherpost(mode=6, slice=false, u=1, v=1) : dp_lut
  189.  
  190. 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) : \
  191.                              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) : \
  192.                              mt_merge(filtered, original, dp_lut, luma=chroma, u=u,v=v)
  193. lsb ? lsb_out ? dp_merge : dp_merge.Ditherpost(mode=7, slice=false) : dp_merge
  194. }
  195.  
  196. function lightPreserve_function(clip "filtered", clip "original", bool "merge16_8", int "u", int "v", bool "lsb", bool "lsb_in", bool "lsb_out") {
  197. lsb_in    = default (lsb_in                       , false) #for original
  198. F_lsb_in  = lsb_in ? (Height(filtered)) == (Height(original)) : (Height(filtered)) == (Height(original)*2)
  199. lsb_out   = default (lsb_out         , F_lsb_in || lsb_in)
  200. lsb       = default (lsb ,  lsb_in || lsb_out || F_lsb_in)
  201. merge16_8 = default (merge16_8                     , true)
  202. ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  203. sislumaonly = ssispmt ? original.isy() : VersionNumber() < 2.6 ? nop() : original.isy8()
  204. u         = default (u                                , VersionNumber() < 2.6 ? 3 : sislumaonly ? 1 : 3)
  205. v         = default (v                                , u)
  206. chroma    = !(u != 3 && v != 3)
  207.  
  208. F_lsb_in        ? Assert(lsb,                          "16stacked filtered clip requires: lsb=true")                : nop()
  209. lsb_in          ? Assert(lsb,                          "lsb_in  requires: lsb=true")                                : nop()
  210. lsb_out         ? Assert(lsb,                          "lsb_out requires: lsb=true")                                : nop()
  211.  
  212. 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)
  213.                                                                    \                 : 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)
  214.  
  215. dp_lut = lsb_in && merge16_8 ? dp_lut.Ditherpost(mode=6, slice=false, u=1, v=1) : dp_lut
  216.  
  217. 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) : \
  218.                              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) : \
  219.                              mt_merge(filtered, original, dp_lut, luma=chroma, u=u,v=v)
  220. lsb ? lsb_out ? dp_merge : dp_merge.Ditherpost(mode=7, slice=false) : dp_merge
  221. }
  222.  
  223.  
  224. ##########
  225. #edge side bleed
  226. #original idea by "colours", this function mod by A.SONY
  227. ##########
  228. function edgesidebleed(clip input, float "w32", float "w16", float "w8", float "w4", float "w2", bool "bleed", bool "chroma", int "mode") {
  229. w2     = Default(w2,     0.001)
  230. w4     = Default(w4,     0.055)
  231. w8     = Default(w8,     0.015)
  232. w16    = Default(w16,     0.02)
  233. w32    = Default(w32,    0.001)
  234. chroma = default(chroma, false)
  235. mode   = default(mode,       0)
  236. avs26  = !(VersionNumber() < 2.6)
  237. bleed  = default(bleed, avs26)
  238.  
  239. sisyuy2 = input.isyuy2()
  240. input = sisyuy2 && avs26 ? input.converttoyv16() : input
  241.  
  242. ssispmt = !chroma ? Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 : nop()
  243. sislumaonly = !chroma ? ssispmt ? input.isy() : !avs26 ? true : input.isy8() : nop()
  244. !chroma ? sislumaonly ? input : ssispmt ? input.converttoy() : input.converttoy8() : input
  245. w = bleed ?  Width() : nop()
  246. h = bleed ? Height() : nop()
  247.  
  248. shift32 = w32!=0 ? !bleed ? Crop(Width()-32,0,32,0,true).StackHorizontal(Crop(0,0,-32,0,true)) : nop() : nop()
  249. shift32 = w32!=0 ? bleed ? BicubicResize (w / 32, h, 1, 0,src_left=-32).BicubicResize (w, h, 1, 0) : shift32 : nop()
  250. 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)
  251. shift16 = w16!=0 ? !bleed ? Crop(Width()-16,0,16,0,true).StackHorizontal(Crop(0,0,-16,0,true)) : nop() : nop()
  252. shift16 = w16!=0 ? bleed ? BicubicResize (w / 16, h, 1, 0,src_left=-16).BicubicResize (w, h, 1, 0) : shift16 : nop()
  253. 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)
  254. shift8 = w8!=0 ? !bleed ? Crop(Width()-8,0,8,0,true).StackHorizontal(Crop(0,0,-8,0,true)) : nop() : nop()
  255. shift8 = w8!=0 ? bleed ? BicubicResize (w / 8, h, 1, 0,src_left=-8).BicubicResize (w, h, 1, 0) : shift8 : nop()
  256. 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)
  257. shift4 = w4!=0 ? !bleed ? Crop(Width()-4,0,4,0,true).StackHorizontal(Crop(0,0,-4,0,true)) : nop() : nop()
  258. shift4 = w4!=0 ? bleed ? BicubicResize (w / 4, h, 1, 0,src_left=-4).BicubicResize (w, h, 1, 0) : shift4 : nop()
  259. 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)
  260. shift2 = w2!=0 ? !bleed ? Crop(Width()-2,0,2,0,true).StackHorizontal(Crop(0,0,-2,0,true)) : nop() : nop()
  261. shift2 = w2!=0 ? bleed ? BicubicResize (w / 2, h, 1, 0,src_left=-2).BicubicResize (w, h, 1, 0) : shift2 : nop()
  262. 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)
  263.  
  264. !chroma ? sislumaonly ? last : ssispmt ? CombinePlanes(last,input,planes="YUV",sample_clip=input) : ytouv(input.utoy8(),input.vtoy8(),last) : last
  265. sisyuy2 ? converttoyuy2() : last
  266. }
  267.  
  268.  
  269. ##########
  270. #chroma edge side bleed (aka pink artifacts) fix, by A.SONY
  271. ##########
  272. function chromasidebleed(clip input, int "diameter", float "sDev", float "iDev", float "cs", bool "bic", string "cplace", bool "d2", int "kernS", int "kernI", int "resType")
  273. {
  274. diameter  = default (diameter,    11)
  275. sDev      = default (sDev,      31.1)
  276. iDev      = default (iDev,      15.1)
  277. d2        = default (d2,        true)
  278. kernS     = default (kernS,        8)
  279. kernI     = default (kernI,        3)
  280. restype   = default (restype,      0)
  281. bic       = default (bic,       true)
  282. cplace    = default (cplace, "MPEG2")
  283.  
  284. avs25   = VersionNumber() < 2.6
  285. sisyuy2 = input.isyuy2()
  286. input = sisyuy2 && !avs25 ? input.converttoyv16() : input
  287.  
  288. chroma = false
  289.  
  290. ssispmt   = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  291. sisfullchr = ssispmt ? input.is444() : avs25 ? false : input.isyv24()
  292. sislumaonly = ssispmt ? input.isy() : avs25 ? false : input.isy8()
  293. Assert(!sislumaonly, "why you use this on no chroma clip?!")
  294.  
  295. y=avs25 ? input : ssispmt ? input.converttoy() : input.converttoy8()
  296. u=avs25 ? input.utoy() : input.utoy8()
  297. v=avs25 ? input.vtoy() : input.vtoy8()
  298. cshift = (cplace == "MPEG1" && IsYV12(input)) || IsYV24(input) ? 0 : -0.5
  299. ych = sisfullchr ? y : bic ? input.BicubicResize(u.width(), v.height(), 1, 0, src_left=cshift) : input.BilinearResize(u.width(), v.height(), src_left=cshift)
  300. 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)
  301. 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)
  302. YToUV(u,v,y)
  303. sisyuy2 ? converttoyuy2() : last
  304. }
  305.  
  306.  
  307. #########
  308. # Comb wrapper function
  309.  
  310. function sComb(clip clip, bool "DeCrawing", bool "DeRainbowing", int "LRepair", int "CRepair") {
  311. DeCrawing = default (DeCrawing, true)
  312. DeRainbowing = default (DeRainbowing, true)
  313. LRepair = default (LRepair, DeCrawing ? 2 : 0)
  314. CRepair = default (CRepair, 0)
  315. clip
  316. SeparateFields()
  317. oriFiel=last
  318. DeCrawing ? DDComb(static=true,strong=true) : last
  319. DeRainbowing ? ASTDRmc(edgemprefil=oriFiel,chroma=true) : last
  320. Weave()
  321. LRepair==0 && CRepair==0 ? last : last.Repair(clip,LRepair,CRepair)
  322. }
  323.  
  324.  
  325. # Padding by Didée
  326. function Padding(clip c, int left, int top, int right, int bottom, int "threads")
  327. {
  328. threads = Default(threads, 0)
  329. w = c.width()
  330. h = c.height()
  331. threads!=1 ? Eval("try { pointresizemt(w+left+right, h+top+bottom, -left, -top, w+left+right, h+top+bottom+0.0001, threads=threads) } catch(error_msg) { c.pointresize( w+left+right, h+top+bottom, -left, -top, w+left+right, h+top+bottom+0.0001 ) }") : c.pointresize( w+left+right, h+top+bottom, -left, -top, w+left+right, h+top+bottom+0.0001 )
  332. }
  333.  
  334.  
  335. # filtering with some borders by A.SONY
  336. Function filtering_wsb (clip src, string "filter", int "oneborder", clip "linesm", clip "clip4lines", int "mmy", bool "mmLuma", int "mmuv", bool "minflate", int "bordertype")
  337. {
  338. oneborder = Default (oneborder,   2)
  339. mmLuma    = Default (mmLuma,  false)
  340. minflate  = Default (minflate, true)
  341. mmuv      = Default (mmuv, mmLuma ? 3 : 2)
  342. mmy       = Default (mmy,         3)
  343. bordertyp = Default (bordertype,  1)
  344. filter    = Default (filter, defined(linesm) ? "yahr3.TBilateral(5,5,0.9,0.9,5,5,0.7,chroma=false)" : \
  345.                                              """FineDehaloanalog(exdehalo="VHSHaloremover(2,2,200,100,0.5).yahr2(32)")""")
  346. minf = defined(linesm) ? minflate ? linesm.mt_inflate(155,155,u=mmLuma || mmuv!=3 ? 1 : 3 ,v=mmLuma || mmuv!=3 ? 1 : 3) : linesm : nop()
  347.  
  348. src
  349. bordertyp==0 ? Padding(oneborder,oneborder,oneborder,oneborder) : AddBorders(oneborder,oneborder,oneborder,oneborder,bordertyp==1 ? undefined : bordertyp==2 ? color_white : bordertyp)
  350. eval(filter)
  351. Crop(oneborder, oneborder, -oneborder, -oneborder, align=true)
  352.  
  353. defined(linesm) ? mt_Merge(last, defined(clip4lines) ? clip4lines : src, minf,y=mmy,luma=mmLuma,u=mmuv,v=mmuv) : last
  354. }
  355.  
  356.  
  357. ###############
  358. # Hqdn3d_2
  359.  
  360. function Hqdn3d_2(clip clip, float "ls", float "cs", float "lt", float "ct", int "UV", bool "lsb", bool "lsb_in", bool "i16") {
  361. cs        = default (cs              , 3.0)
  362. ct        = default (ct              , 4.5)
  363. UV        = default (UV               , 3)
  364. UV        = !(VersionNumber() < 2.60) ? isY8(clip) ? 1 : UV : UV
  365. lsb_in    = default (lsb_in          , false)
  366. i16       = default (i16             , false)
  367. lsb_out   = default (lsb             , lsb_in)
  368.  
  369. i16b      = lsb_out || i16 || lsb_in
  370.  
  371. isrgb(clip) ? Assert(!i16b, "no 16bit for RGB, but you can use some trickes for that (see dither doc)") : nop()
  372.  
  373. yString = VersionNumber() < 2.60 ? "yv12" : "Y8"
  374.  
  375. pclip   = isYUV(clip) && i16b && isYUY2(clip) && !(VersionNumber() < 2.60) ? clip.ConvertToYV16() : clip
  376.  
  377. i16clip = isYUV(clip) ? i16b ? lsb_in ? pclip.Bitdepth(from=88, to=16) : i16 ? clip : pclip.Bitdepth(from=8, to=16) : nop() : nop()
  378.  
  379.     y = isYUV(clip) ? VersionNumber() < 2.60 ? i16b ? i16clip : clip : i16b ? ConvertToY8(i16clip) : ConvertToY8(clip) : nop()
  380.     u = isYUV(clip) && UV != 1 ? VersionNumber() < 2.60 ? i16b ? UToY(i16clip) : UToY(clip) : i16b ? UToY8(i16clip) : UToY8(clip) : nop()
  381.     v = isYUV(clip) && UV != 1 ? VersionNumber() < 2.60 ? i16b ? VToY(i16clip) : VToY(clip) : i16b ? VToY8(i16clip) : VToY8(clip) : nop()
  382.     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()
  383.     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()
  384.     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()
  385.     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()
  386.         isYUV(clip) ? i16b && !i16 && lsb_out ? Bitdepth(from=16, to=88) : last : last
  387.     isYUV(clip) ? !i16b || lsb_out || i16 ? last : Bitdepth(from=16, to=8) : last
  388.     isYUY2(clip) ? VersionNumber() < 2.60 ? last : converttoyuy2() : last
  389.  
  390.     A = isrgb32(clip) ? clip.ShowAlpha(yString) : nop()
  391.     r = isrgb(clip) ? clip.ShowRed(yString) : nop()
  392.     g = isrgb(clip) ? clip.ShowGreen(yString) : nop()
  393.     b = isrgb(clip) ? clip.ShowBlue(yString) : nop()
  394.     A = isrgb32(clip) ? A.Hqdn3dY(sp=ls, tp=lt) : nop()
  395.     r = isrgb(clip) ? r.Hqdn3dY(sp=ls, tp=lt) : nop()
  396.     g = isrgb(clip) ? g.Hqdn3dY(sp=ls, tp=lt) : nop()
  397.     b = isrgb(clip) ? b.Hqdn3dY(sp=ls, tp=lt) : nop()
  398.     isYUV(clip) ? last : isrgb32(clip) ? MergeARGB(A,r,g,b) : MergeRGB(r,g,b,"RGB24")
  399. }
  400.  
  401.  
  402. ###############
  403. #motion adaptive by A.SONY
  404.  
  405. 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", bool "repblend", val "dslow", bool "qtgmc_n16") {
  406.  
  407. ssispmt   = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  408. qtgmc_lsb = default(qtgmc_lsb, ssispmt ? false : true)
  409. qtgmc_n16 = default(qtgmc_n16, ssispmt ? input.BitsPerComponent() > 8 ? false : true : false)
  410. repblend  = default(repblend, false)
  411.  
  412. defined(filter) ? Assert((Isclip(filter) || IsString(filter)),        "'filter' only accepts clip or string") : nop()
  413.  
  414. Str             = default (Str, 1.5)
  415. exfilclp        = isclip(filter)
  416. sisbob          = round(framerate(input))==60 || framerate(input)==50
  417. tr2             = default (tr2, sisbob ? 3 : 1)
  418. usedaa3mod      = default (usedaa3mod, exfilclp ? 0 : sisbob ? 1 : 2)
  419.  
  420. infiltr = usedaa3mod == 1 ? input.daa3mod(dslow) : input
  421. filclip = defined(filter) ? exfilclp ? filter : eval("infiltr." + filter) : infiltr.QTGMC(InputType=1, tr0=0, tr1=sisbob ? undefined : 1, tr2=tr2, lsb=qtgmc_lsb, n16=qtgmc_n16, rep1=sisbob ? undefined : 11, rep2=sisbob ? undefined : 11, Sharpness=0.0, TV_range=TV_range, Str=Str, Amp=Amp)
  422. filclip = usedaa3mod == 2 ? filclip.daa3mod(dslow) : filclip
  423.  
  424. 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
  425. 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)
  426. repblend ? isyuy2(input) && VersionNumber() < 2.60 ? Interleaved2Planar() : isyuy2(input) ? converttoyv16() : last : last
  427. repblend ? isyuy2(input) && VersionNumber() < 2.60 ? Repair(Repair(input.Interleaved2Planar(),16,Planar=true),12,Planar=true).Planar2Interleaved() : isyuy2(input) ? Repair(Repair(input.converttoyv16(),16),12).converttoyuy2() : Repair(Repair(input,16),12) : last
  428. }
  429.  
  430.  
  431. ###############
  432. #smam_mask
  433. # if input is YUY2 the output will be Planar YUY2 in avs 2.5 and yv16 in avs 2.6
  434.  
  435. function smam_mask(clip input, clip "prefilter", int "pel", int "blksize", bool "chroma", int "dct") {
  436.     ox = input.width()
  437.     oy = input.height()
  438.     HD = (ox > 1099 || oy > 599)
  439.     sisbob  = round(framerate(input))==60 || framerate(input)==50
  440.     pel = default( pel,     HD ? 1 : 2 )
  441.     dct = default( dct, sisbob ? 0 : 2 )
  442.     blksize = default(blksize,HD ? sisbob ? 8 : 16 : sisbob ? 4 : 8)
  443. preclip= defined(prefilter) ? prefilter : (VersionNumber() < 2.60) && isyv12(input) ? input.HQdn3d().FFT3DFilter() : input.HQdn3d_2().FFT3DFilter()
  444. sup    = preclip.MSuper(pel=pel,sharp=1)
  445. fv1    = sup.MAnalyse(isb=false,delta=1,DCT=dct,Truemotion=false,blksize=blksize,chroma=chroma)
  446. fv2    = sup.MAnalyse(isb=true,delta=1,DCT=dct,Truemotion=true,blksize=blksize,chroma=chroma)
  447.  
  448. momask1 = input.MMask(fv1, kind = 1, ml=2)
  449. momask2 = input.MMask(fv2, kind = 1, ml=3)
  450. momask1 =isyuy2(input) && VersionNumber() < 2.60 ? momask1.Interleaved2Planar() : isyuy2(input) ? momask1.converttoyv16() : momask1
  451. momask2 =isyuy2(input) && VersionNumber() < 2.60 ? momask2.Interleaved2Planar() : isyuy2(input) ? momask2.converttoyv16() : momask2
  452. mt_average(momask1,momask2,u=3,v=3)
  453. }
  454.  
  455.  
  456. ##############
  457. # sanimebob by A.SONY
  458.  
  459. function sanimebob(clip i, val "useqtgmc", val "bobpresmooth", float "Str", float "Amp", bool "TV_range", bool "qtgmc_lsb", bool "usedaa3mod", bool "usesmam", int "tr2", bool "repblend", val "dslow", bool "qtgmc_n16", bool "nnrep", bool "nnedi3pad") {
  460.  
  461. ssispmt   = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  462. qtgmc_lsb = default(qtgmc_lsb, ssispmt ? false : true)
  463. qtgmc_n16 = default(qtgmc_n16, ssispmt ? i.BitsPerComponent() > 8 ? false : true : false)
  464.  
  465. useq                  = default (useqtgmc,                                                                                                           0)
  466. Stringuseq        = IsString(useq                                                                                                                 )
  467. bobpresmbool = default (isbool(bobpresmooth) ? bobpresmooth : !Stringuseq ? (useq==8 || defined(bobpresmooth)) : defined(bobpresmooth), false)
  468. Str                     = default (Str,                                                                                                              1.5)
  469. tr2                     = default (tr2,                                                                                !Stringuseq ? useq==8 ? 3 : 1 : 1)
  470. usedaa3mod   = default (usedaa3mod,                                            !Stringuseq ? useq==4 || useq==5 || useq==7 || useq==9 : false)
  471. usesmam        = default (usesmam,                                                       !Stringuseq ? !(useq==0 || useq==1 || useq==8) : false)
  472. nnrep               = default (nnrep, false)
  473. nnedi3pad       = default (nnedi3pad, false)
  474.  
  475. Assert(Isint(useq) || Stringuseq, "'useqtgmc' only accepts int or string")
  476.  
  477. prefiltered_i   = defined(bobpresmooth) ? isclip(bobpresmooth) ? bobpresmooth : IsString(bobpresmooth) ? Eval("i." + bobpresmooth) : undefined() : undefined()
  478.  
  479. nonyuy2=!(VersionNumber() < 2.6) && i.isyuy2()
  480. 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
  481. 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
  482.  
  483. pyi       = i.Padding(0,4,0,4)
  484. pni       = nnedi3pad ? iforbob.Padding(2,4,2,4).nnedi3(-2).crop(2,4,-2,-4,true) : iforbob.nnedi3(-2)
  485. pei       = i.eedi3(-2,sclip=pni)
  486. pei       = nnrep ? isyuy2(i) ? pei.Interleaved2Planar().Repair(pni.Interleaved2Planar(),9,Planar=true).Planar2Interleaved().Padding(0,4,0,4) : pei.Repair(pni,9).Padding(0,4,0,4) : pei.Padding(0,4,0,4)
  487.  
  488. 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)
  489. yadifclip = isyuy2(i) && VersionNumber() < 2.60 ? ymodclip.Interleaved2Planar().Repair(i.TDeint(1,emask=iforbob.tmm2_ortmm1(1)).Interleaved2Planar(),Planar=true).Planar2Interleaved() : \
  490.                                                   ymodclip.Repair(i.TDeint(1,emask=iforbob.tmm2_ortmm1(1)).nonyuy2clipin(nonyuy2)).nonyuy2clipout(nonyuy2)
  491.  
  492. # for custom qtgmc, don't forget to put the input clip like this:- iforbob.QTGMC(... or yadifclip.QTGMC(... or i.QTGMC(...
  493. QTGMCclip = isstring(useq) ? eval(useq) : \
  494.                              useq==0 ? yadifclip : \
  495.        useq==1 || useq==2 || useq==4 ? iforbob.QTGMC(SourceMatch=3, Lossless=2, EdiExt=yadifclip, tr0=1, tr1=1, tr2=tr2, lsb=qtgmc_lsb, n16=qtgmc_n16, rep0=11, rep1=11, rep2=11, Sharpness=0.1, TV_range=TV_range, Str=Str, Amp=Amp) : \
  496.                   useq==3 || useq==5 ? yadifclip.QTGMC(InputType=1, tr0=1, tr1=1, tr2=tr2, lsb=qtgmc_lsb, n16=qtgmc_n16, rep0=11, rep1=11, rep2=11, Sharpness=0.1, TV_range=TV_range, Str=Str, Amp=Amp) : \
  497.                   useq==6 || useq==7 ? yadifclip.QTGMC(InputType=1, tr0=0, lsb=qtgmc_lsb, n16=qtgmc_n16, Sharpness=usedaa3mod ? 0.0 : 0.1, TV_range=TV_range, Str=Str, Amp=Amp) : \
  498.                                        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, n16=qtgmc_n16, Sharpness=0.0, TV_range=TV_range, Str=Str, Amp=Amp)
  499.  
  500. daa3mclip = usedaa3mod ? QTGMCclip.daa3mod(dslow) : QTGMCclip
  501.  
  502. !usesmam ? daa3mclip : \
  503.            yadifclip.smam(filter=daa3mclip,repblend=repblend)
  504. }
  505.  
  506.  
  507. ##############
  508. # sypixsub 1.2, Subtracting one luma pixel with the neighboring pixel on the left or the top
  509. Function sypixsub(clip c, int "left", int "top", bool "expr")
  510. {
  511. left=Default(left, 1) #set the "left" to 2 will make it 2 pass since the subtract mode in overlay ignore the negative result of subtracting, set it to -1 and will show the negative result only
  512. top=Default(top, 0) #same as "left" parameter
  513. expr=Default(expr, true)
  514. ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  515. expr=ssispmt ? expr : false
  516.  
  517. Assert(!(left>2 || left<-1 || top>2 || top<-1), "sypixsub: left and top modes must be between -1 to 2")
  518. Assert(!(left==0 && top==0), "sypixsub: why you use sypixsub then?!!!!")
  519.  
  520. sislumaonly = ssispmt ? c.isy() : VersionNumber() < 2.6 ? true : c.isy8()
  521. sislumaonly ? c : ssispmt ? c.converttoy() : c.converttoy8()
  522. lexp = left==-1 ? "x[-1,0] x -" : left==0 ? "" : "x x[-1,0] -" + string(left>1 ? " abs" : "")
  523. texp = top==-1 ? " x[0,-1] x -" : top==0 ? "" : " x x[0,-1] -" + string(top>1 ? " abs" : "")
  524. expr ? c.Expr(lexp + texp + (top != 0 && left != 0 ? " +" : "")) : eval("""
  525. c
  526. left != 0 ? PointResize(Width(), Height(), src_left=-1) : last
  527. leftsub1 = left != 0 ? overlay(c,last,mode="Subtract") : last
  528. leftsub2 = left == -1 || left > 1 ? overlay(last,c,mode="Subtract") : nop()
  529. left > 1 ? overlay(leftsub1,leftsub2,mode="add") : left == -1 ? leftsub2 : leftsub1
  530. h=last
  531. top != 0 ? c : last
  532. top != 0 ? PointResize(Width(), Height(), src_top=-1) : last
  533. topsub1 = top != 0 ? overlay(c,last,mode="Subtract") : last
  534. topsub2 = top == -1 || top > 1 ? overlay(last,c,mode="Subtract") : nop()
  535. top > 1 ? overlay(topsub1,topsub2,mode="add") : top == -1 ? topsub2 : topsub1
  536.  
  537. top != 0 && left != 0 ? overlay(h,last,mode="add") : last
  538. """)
  539. sislumaonly ? last : ssispmt ? CombinePlanes(last,c,planes="YUV",sample_clip=c) : YToUV(c.UToY8(),c.VToY8(),last)
  540. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement