Advertisement
Guest User

SMDegrain

a guest
Apr 1st, 2017
901
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ################################################################################################
  2. ###                                                                                          ###
  3. ###                           Simple MDegrain Mod - SMDegrain()                              ###
  4. ###                                                                                          ###
  5. ###                       Mod by Dogway - Original idea by Caroliano                         ###
  6. ###                                                                                          ###
  7. ###          Special Thanks: Sagekilla, Didée, cretindesalpes, Gavino and MVtools people     ###
  8. ###                                                                                          ###
  9. ###                       v3.1.2d (Dogway's mod) - 21 July 2015                              ###
  10. ###    v3.1.2.92s mod for v3.1.2d to fix subpixel=3 and add Prefilter auto 16 (lsb) support  ###
  11. ###                     and yuy2 support in avs 2.6 with masktools 2.6                       ###
  12. ### and medianblur2 now will be used in Minblur instead of Quantile RemoveGrainHD in avs 2.6 ###
  13. ###                                    and add TV_range bool                                 ###
  14. ###               less lsb if not use lsb things and get ready for yv16 and yv24             ###
  15. ###              add dct, device_id and move all prefilters to external function             ###
  16. ###                                some cleanup and others                                   ###
  17. ###                        add MDegrain4 and MDegrain5 and MDegrain6                         ###
  18. ###                               add always_MDegrainN bool                                  ###
  19. ###                                  SMDegrain_KNLMeansCL                                    ###
  20. ###                 masktools 2.2.5 or up now required in avs26 and avs+                     ###
  21. ###                  now work basically with new high bit depth in avs+                      ###
  22. ###                                                                                          ###
  23. ################################################################################################
  24. ###
  25. ### General purpose simple degrain function. Pure temporal denoiser. Basically a wrapper(function)/frontend of mvtools2+mdegrain
  26. ### with some added common related options. Goal is accessibility and quality but not targeted to any specific kind of source.
  27. ### The reason behind is to keep it simple so aside masktools2 you will only need MVTools2.
  28. ###
  29. ### Check documentation for deep explanation on settings and defaults.
  30. ###
  31. ################################################################################################
  32.  
  33. function SMDegrain (clip input   , int "tr"      , int "thSAD"    , int  "thSADC" , bool "RefineMotion",  val  "contrasharp", clip "CClip"      , bool "interlaced" ,  int   "plane" ,  int   "Globals",                                  \
  34.                      int "pel"   , int "subpixel", val "prefilter", clip "mfilter", int  "blksize"     , int  "overlap"     ,  int  "search"    , bool "truemotion" , int  "limit"   ,  int   "limitc" ,  int   "thSCD1" , int "thSCD2",  \
  35.                     bool "chroma", int "hpad"    , int "vpad"     , bool "lsb"    , bool "lsb_in"      ,  bool "lsb_out"    , int  "mode"       , bool  "slices"    , val  "Show"    ,  float "Str"    ,  float "Amp" , bool "TV_range", int "dct", int "device_id", int "searchparam", int "pelsearch", bool "trymany", bool "always_MDegrainN"){
  36.  
  37.  
  38.  
  39. # Defaults & Conditionals
  40.  
  41.  
  42. tr           = default( tr,       2 )
  43. thSAD        = default( thSAD,  300 )
  44. thSAD2=int(thSAD/2)
  45. thSADC       = default( thSADC, thSAD2)
  46. RefineMotion = default( RefineMotion, false)
  47. alway_grainN = default( always_MDegrainN, false)
  48.  
  49. lsb_in       = default( lsb_in,  false)
  50. lsb_out      = default( lsb_out, false)
  51. lsb          = default( lsb    , lsb_in || lsb_out)
  52. mode         = default( mode, 0 )
  53. mode         = mode != 9 ? mode : -1
  54. ampn         = mode != 9 ? 0.0  : 1.0
  55. slices       = default(slices, true)
  56.  
  57. Globals      = default( Globals,  0 )
  58. GlobalR = Globals == 1
  59. GlobalO = Globals == 3
  60. if1     = Defined(CClip)
  61.  
  62. Contrasharp  = default( Contrasharp, !GlobalO && if1)
  63. Interlaced   = default( Interlaced,  false)
  64.  
  65. w       = input.width ()
  66. h       = input.height()
  67. sShow   = IsString(show)
  68. preclip = IsClip(prefilter)
  69. planar  = IsYUY2(input)
  70. ifC     = IsBool(Contrasharp)
  71. if0     = ifC ? (Contrasharp  ? true : false) : (Contrasharp > 0.0 ? true : false)
  72. if2     = if0 && lsb && !GlobalO
  73. avs26   = VersionNumber() < 2.60 ? false : true
  74. if3     = alway_grainN ? true : !avs26 ? tr > 3 : tr > 6
  75. if4     = (w > 1099 ||  h > (lsb_in ? 1199 : 599))
  76. if5     = interlaced ? (GetParity(input)                            ? true : false) : nop()
  77.  
  78.  
  79. pel          = default( pel, if4 ? 1 : 2 )
  80. subpixel     = default( subpixel,  2 )
  81. prefilter    = default( prefilter, -1 )
  82. MFilterB     = defined(mfilter)
  83. pelclip      = pel>1 && subpixel == 3
  84. Str          = default( Str, 1.0 )
  85. Amp          = default( Amp, 0.0625 )
  86. TV_range     = default( TV_range, !(Isrgb(input)))
  87.  
  88. blksize      = default( blksize,  if4 ? 16 : 8 )
  89. blk2=blksize/2
  90. overlap      = default( overlap,  blk2 )
  91. ovl2=overlap/2
  92. search       = default( search,   4 )
  93. truemotion   = default( truemotion, !if4)
  94. dct          = default( dct,   0 )
  95. thSCD1       = default( thSCD1,  int(pow((blksize*2.5),2)))
  96. thSCD2       = default( thSCD2,  130 )
  97.  
  98.  
  99. plane        = default( plane,    4 )
  100. chroma       = default( chroma, true)
  101. Chr          = chroma ? 3 : 1
  102. Chr2         = chroma ? 3 : preclip ? 1 : (prefilter==3 ? 2 : 1)
  103. plane0       = plane!=0
  104. U            = plane0 && plane!=2 ? 3 : 2
  105. V            = plane0 && plane!=1 ? 3 : 2
  106. Uin          = lsb_in ? 3 : u
  107. Vin          = lsb_in ? 3 : v
  108.  
  109.  
  110. hpad         = blksize
  111. vpad         = blksize
  112. limit        = default( limit,  255 )
  113. limitc       = default( limitc,limit)
  114.  
  115. Show         = default( Show,  false)
  116.  
  117.  
  118.  
  119.  
  120. # Error Report
  121.  
  122.                   Assert(blksize==4 || blksize==8 || blksize==16 || blksize==32,"MAnalyse: Block's size must be 4x4, 8x4, 8x8, 16x2, 16x8, 16x16, 32x16, 32x32")
  123.                   Assert(overlap <= blk2,              "Overlap must be at least half blksize or less")
  124.                   Assert(overlap == overlap-overlap%2, "MAnalyse: overlap must be an even figure")
  125.                   Assert(IsBool(Show) || sShow,        "'Show' only accepts bool inputs (true,false), or string modes ('Speed','Memory',Quality')")
  126.                   Assert(preclip || IsInt(prefilter),  "'prefilter' only accepts integers and clip inputs")
  127.                   Assert(ifC     || IsInt(Contrasharp),"'Contrasharp' only accepts integers and bool inputs")
  128. MFilterB        ? Assert(IsClip(mfilter),              "'mfilter' only accepts clip inputs")                        : nop()
  129. interlaced      ? Assert(h%4==0,                       "Interlaced sources require mod 4 height sizes")             : nop()
  130. lsb_in          ? Assert(!interlaced,                  "Interlaced 16 bit stacked clip is not a recognized format") : nop()
  131. planar && if0   ? Assert(ifC,                          "LSFmod doesn't support YUY2 sources")                       : nop()
  132. RefineMotion    ? Assert(blksize > 7,                  "For RefineMotion you need a blksize of at least 8")         : nop()
  133. lsb_in          ? Assert(lsb,                          "lsb_in  requires: lsb=true")                                : nop()
  134. lsb_out         ? Assert(lsb,                          "lsb_out requires: lsb=true")                                : nop()
  135.  
  136.  
  137.  
  138. # RefineMotion Variables
  139.  
  140. halfblksize  = RefineMotion ?  blk2                                     : nop() # MRecalculate works with half block size
  141. halfoverlap  = RefineMotion ? (overlap == 2 ? overlap : ovl2+ovl2%2)    : nop() # Halve the overlap to suit the halved block size
  142. halfthSAD    = RefineMotion || if3 ?     thSAD2                         : nop() # MRecalculate uses a more strict thSAD, which defaults to 150 (half of function's default of 300)
  143. halfthSADC   =                 if3 ? int(thSADC/2)                      : nop() # For MDegrainN()
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150. # Input preparation for: LSB_IN, Interlacing, Planar and MSuper optimization when pel=2
  151.  
  152. inputY  = planar      ? (lsb_in   ? Dither_YUY2toPlanar16(input)          : Interleaved2planar(input))                          : input
  153.  
  154. inputP  = !interlaced ? (pel == 2 ? inputY.AssumeFrameBased()             : inputY)                                             : \
  155.                         (if5      ? inputY.AssumeTFF().SeparateFields()   : inputY.AssumeBFF().SeparateFields())
  156.  
  157. input8h = lsb_in      ?             inputP. Ditherpost(mode=6, slice=slices)                                                    : nop()
  158. input8y = planar      ? (lsb_in   ? input8h.Dither_YUY2toInterleaved()    : inputP)                                             : inputP
  159. input8  = lsb_in      ? (planar   ? input8y.Interleaved2planar()                                                                : \
  160.                                     input8h)                                                                                    : input8y
  161.  
  162.  
  163. # Prefilter & Motion Filter
  164.  
  165. Mfilter = MFilterB ? Mfilter : input8
  166.  
  167. bug_wa = interlaced && planar && chroma && !avs26 ? 2 : Chr # bug: crash prevention workaround
  168.  
  169. pref   = !GlobalR ? preclip ? prefilter                                                                                                                                   : \
  170.                               input.SMDegrain_prefilters(inputP=inputP,input8=input8,input8y=input8y\
  171.                                                                       ,inputY=inputY,input8h=input8h,prefilter=prefilter,chroma=chroma\
  172.                                                                       ,Chr=Chr,Chr2=Chr2,bug_wa=bug_wa,lsb=lsb,lsb_in=lsb_in,Interlaced=Interlaced\
  173.                                                                       ,if5=if5,pel=pel,device_type="GPU",device_id=device_id,a=1,d=1,h=7.0,slices=slices,planar=planar)   : \
  174.                     input8
  175.  
  176.  
  177.  
  178.  
  179.  
  180. # Default Auto-Prefilter - Luma expansion TV->PC (up to 16% more values for motion estimation)
  181.  
  182. pref16 = (Height(pref)) == (Height(input8)*2) ? true : false
  183. pref   = !GlobalR ? (!planar && lsb ? ((!preclip ? ((lsb_in && prefilter==-1) || prefilter==3 || prefilter==4 ) : false)          ? \
  184.                      !TV_range ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2)                                      : \
  185.                      pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb_in=true,uv=Chr2)                                      : \
  186.                      !TV_range ? pref16 ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2) : pref                                      : \
  187.                      pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb=true,lsb_in=pref16,uv=Chr2))                       : \
  188.                                       ((!preclip ?  (lsb_in && prefilter==-1)                                   : false)                                 ? \
  189.                      !TV_range ? !planar ? pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr) : pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma)   : \
  190.                                  !planar ? pref.Dither_Luma_Rebuild(S0=Str,c=Amp,uv=chr, lsb_in=true) : pref.Dither_Luma_Rebuild(S0=Str,c=Amp,uv=chr, lsb_in=true).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : \
  191.                      !TV_range ? pref16 ? !planar ? pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr) : pref.planar2Interleaved(!chroma).Dither_YUY2toPlanar16().Ditherpost(mode=6,slice=slices,u=chr,v=chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : pref                                  : \
  192.                      pref.Dither_Luma_Rebuild(S0=Str,lsb=lsb,lsb_in=pref16,slice=slices,c=Amp,uv=bug_wa)))                                  : \
  193.                      pref
  194.  
  195.  
  196.  
  197.  
  198.  
  199. (sShow ? false : !Show) ? eval("""
  200.  
  201.  
  202. # Subpixel 3
  203.  
  204. pclip  = pelclip              ?    pel==4 ? pref.nnedi3_rpow2(rfactor=2,nns=4).nnedi3_rpow2(rfactor=2,nns=4) :   pref.nnedi3_rpow2(rfactor=2,nns=4)  : nop()
  205. pclip2 = pelclip && !GlobalR  ?  pel==4 ? input8.nnedi3_rpow2(rfactor=2,nns=4).nnedi3_rpow2(rfactor=2,nns=4) : input8.nnedi3_rpow2(rfactor=2,nns=4)  : nop()
  206.  
  207.  
  208.  
  209.  
  210. # Motion vectors search
  211.  
  212.  
  213. super_search =                             pelclip ? MSuper(pref,     pel=pel,               chroma=chroma, hpad=hpad, vpad=vpad,          pelclip=pclip,  rfilter=4, planar=planar) : \
  214.                                                     MSuper(pref,     pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad                        ,  rfilter=4, planar=planar)
  215. super_render = !GlobalR ?                 (pelclip ? MSuper(input8,   pel=pel,               chroma=plane0, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip2           , planar=planar) : \
  216.                                                     MSuper(input8,   pel=pel,sharp=subpixel,chroma=plane0, hpad=hpad, vpad=vpad,levels=1                           , planar=planar)): super_search
  217. Recalculate  = !GlobalR && RefineMotion ? (pelclip ? MSuper(pref,     pel=pel,               chroma=chroma, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip            , planar=planar) : \
  218.                                                     MSuper(pref,     pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad,levels=1                           , planar=planar)): nop()
  219. !if3  ? eval("
  220. t2 = interlaced ? tr > 1 ? tr*2 : tr : tr
  221. bv12 =   interlaced && (tr > 5)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta =12,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv12) : nop()
  222. bv12 =   interlaced && (tr > 5) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate,bv12,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv12
  223. bv10 =   interlaced && (tr > 4)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta =10,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv10) : nop()
  224. bv10 =   interlaced && (tr > 4) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate,bv10,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv10
  225. bv8  =   interlaced && (tr > 3)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 8,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv8)  : nop()
  226. bv8  =   interlaced && (tr > 3) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv8,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv8
  227. bv6  =                  t2 > 5                   ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 6,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv6)  : nop()
  228. bv6  =                  t2 > 5  && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv6,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv6
  229. bv5  =  !interlaced ? ((tr > 4)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 5,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv5)  : nop()) : nop()
  230. bv5  =  !interlaced ? ((tr > 4  && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, bv5,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv5)  : nop()
  231. bv4  =                  t2 > 3                   ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 4,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv4)  : nop()
  232. bv4  =                  t2 > 3  && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv4,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv4
  233. bv3  =  !interlaced ? ((tr > 2)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 3,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv3)  : nop()) : nop()
  234. bv3  =  !interlaced ? ((tr > 2  && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, bv3,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv3)  : nop()
  235. bv2  =  (interlaced ||  tr > 1)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 2,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv2)  : nop()
  236. bv2  = ((interlaced ||  tr > 1) && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, bv2,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv2
  237. bv1  =  !interlaced ?                              (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 1,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv1)  : nop()
  238. bv1  =  !interlaced ?            ( RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv1,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              bv1)  : nop()
  239.  
  240. fv1  =  !interlaced ?                              (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 1, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv1)  : nop()
  241. fv1  =  !interlaced ?            ( RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv1,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv1)  : nop()
  242. fv2  =  (interlaced ||  tr > 1)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 2, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv2)  : nop()
  243. fv2  = ((interlaced ||  tr > 1) && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, fv2,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv2
  244. fv3  =  !interlaced ? ((tr > 2)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 3, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv3)  : nop()) : nop()
  245. fv3  =  !interlaced ? ((tr > 2  && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, fv3,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv3)  : nop()
  246. fv4  =                  t2 > 3                   ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 4, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv4)  : nop()
  247. fv4  =                  t2 > 3  && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv4,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv4
  248. fv5  =  !interlaced ? ((tr > 4)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 5, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv5)  : nop()) : nop()
  249. fv5  =  !interlaced ? ((tr > 4  && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, fv5,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv5)  : nop()
  250. fv6  =                  t2 > 5                   ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 6, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv6)  : nop()
  251. fv6  =                  t2 > 5  && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv6,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv6
  252. fv8  =   interlaced && (tr > 3)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 8, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv8)  : nop()
  253. fv8  =   interlaced && (tr > 3) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv8,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv8
  254. fv10 =   interlaced && (tr > 4)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta =10, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv10) : nop()
  255. fv10 =   interlaced && (tr > 4) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate,fv10,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv10
  256. fv12 =   interlaced && (tr > 5)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta =12, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv12) : nop()
  257. fv12 =   interlaced && (tr > 5) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate,fv12,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) :                                                              fv12              
  258.               ") : eval("
  259. tr2    = tr*2
  260. vmulti =                   !GlobalR ? super_search.MAnalyse( multi=true,overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma,truemotion=truemotion, delta = interlaced ? tr2 : tr, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : vmulti
  261. vmulti = RefineMotion   ? (!GlobalR ? MRecalculate (Recalculate, vmulti,overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma,truemotion=truemotion,    tr = interlaced ? tr2 : tr, dct=dct) :                                                    vmulti) : vmulti
  262. vmulti =                   !GlobalR ? (interlaced ? vmulti.SelectEvery (4, 2, 3) : vmulti) : vmulti.SelectRangeEvery (Rtr*2, tr2, 0, false)
  263.                          ")
  264.  
  265.  
  266.  
  267. # Finally, MDegrain
  268.  
  269.  
  270. output  = !GlobalO ? (interlaced ?
  271. \        ((lsb ?     ( if3  ? mfilter.MDegrainN(super_render, vmulti, tr, thSAD2=halfthSAD, thSADC2=halfthSADC,   thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  272. \                 (tr == 6) ? mfilter.MDegrain6(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, bv10, fv10, bv12, fv12, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  273. \                 (tr == 5) ? mfilter.MDegrain5(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, bv10, fv10,             thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  274. \                 (tr == 4) ? mfilter.MDegrain4(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8,                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  275. \                 (tr == 3) ? mfilter.MDegrain3(super_render, bv2, fv2, bv4, fv4, bv6, fv6,                                   thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  276. \                 (tr == 2) ? mfilter.MDegrain2(super_render, bv2, fv2, bv4, fv4,                                             thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  277. \                             mfilter.MDegrain1(super_render, bv2, fv2,                                                       thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true)):
  278. \                    ( if3  ? mfilter.MDegrainN(super_render, vmulti, tr, thSAD2=halfthSAD, thSADC2=halfthSADC,               thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=false):
  279. \                 (tr == 6) ? mfilter.MDegrain6(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, bv10, fv10, bv12, fv12, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  280. \                 (tr == 5) ? mfilter.MDegrain5(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, bv10, fv10,             thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  281. \                 (tr == 4) ? mfilter.MDegrain4(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8,                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  282. \                 (tr == 3) ? mfilter.MDegrain3(super_render, bv2, fv2, bv4, fv4, bv6, fv6,                                   thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  283. \                 (tr == 2) ? mfilter.MDegrain2(super_render, bv2, fv2, bv4, fv4,                                             thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  284. \                             mfilter.MDegrain1(super_render, bv2, fv2,                                                       thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar))))       :
  285. \         (lsb ?     ( if3  ? mfilter.MDegrainN(super_render, vmulti, tr, thSAD2=halfthSAD, thSADC2=halfthSADC,               thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  286. \                 (tr == 6) ? mfilter.MDegrain6(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, bv5, fv5, bv6, fv6,     thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  287. \                 (tr == 5) ? mfilter.MDegrain5(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, bv5, fv5,               thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  288. \                 (tr == 4) ? mfilter.MDegrain4(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4,                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  289. \                 (tr == 3) ? mfilter.MDegrain3(super_render, bv1, fv1, bv2, fv2, bv3, fv3,                                   thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  290. \                 (tr == 2) ? mfilter.MDegrain2(super_render, bv1, fv1, bv2, fv2,                                             thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true) :
  291. \                             mfilter.MDegrain1(super_render, bv1, fv1,                                                       thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true)):
  292. \                    ( if3  ? mfilter.MDegrainN(super_render, vmulti, tr, thSAD2=halfthSAD, thSADC2=halfthSADC,               thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=false):
  293. \                 (tr == 6) ? mfilter.MDegrain6(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, bv5, fv5, bv6, fv6,     thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  294. \                 (tr == 5) ? mfilter.MDegrain5(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, bv5, fv5,               thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  295. \                 (tr == 4) ? mfilter.MDegrain4(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4,                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  296. \                 (tr == 3) ? mfilter.MDegrain3(super_render, bv1, fv1, bv2, fv2, bv3, fv3,                                   thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  297. \                 (tr == 2) ? mfilter.MDegrain2(super_render, bv1, fv1, bv2, fv2,                                             thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)          :
  298. \                             mfilter.MDegrain1(super_render, bv1, fv1,                                                       thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar))))       :    nop()
  299.  
  300.  
  301. # LSB_IN merging
  302.  
  303. type  = avs26 ? input.PixelType() : "YV12"
  304.  
  305. outputI= !GlobalO && planar && (lsb || ifC) ? output.Planar2Interleaved()                                                                                             : nop()
  306. !GlobalO && lsb   ? eval("
  307. blnkclp= lsb_in  || (if2 && !planar) ? BlankClip (lsb_in?input8h:input8, pixel_type=type, color_yuv=0)                                          : nop()
  308. output = lsb && planar               ? Dither_YUY2toPlanar16(outputI)                                                                                                 : output
  309. output = lsb_in                      ? inputY.Dither_add16 (Dither_sub16(output, planar?inputY:input8.Dither_convert_8_to_16 (), dif=true,u=u,v=v), dif=true,u=u,v=v) : output") : nop()
  310.  
  311.  
  312.  
  313.  
  314. # Contrasharp (only sharpens luma)
  315.  
  316. ifC && if0 && if4 ? eval("
  317. global Super           = super_render
  318. global cb1             = !if3 ? (interlaced ? bv2 : bv1) : vmulti.SelectEvery (tr2, 0)
  319. global cf1             = !if3 ? (interlaced ? fv2 : fv1) : vmulti.SelectEvery (tr2, 1)") : nop()
  320.  
  321. !GlobalO && if0   ? eval("
  322.  
  323. CCh   =       if1 ? CClip.height() : nop()
  324. ref8  =       if1 ? (h == CCh*2)   : nop()
  325. ref16 =       if1 ? (h == CCh/2)   : nop()
  326.  
  327. interlaced && if1 ? Assert(!ref16, "+Chr(34)+"Interlaced 16 bit stacked CClip is not a recognized format"+Chr(34)+")         : nop()
  328.  
  329. CClip = planar ?  (if1 ?  (lsb_in ? (ref8 ? CClip.Interleaved2planar(true) : CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true))                         : \
  330.                                      (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields().Interleaved2planar(true) : CClip.AssumeBFF().SeparateFields().Interleaved2planar(true))                                : \
  331.                                      (ref16 ? CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true) : CClip.Interleaved2planar(true))))                     : \
  332.                           (lsb_in ?  inputY.DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true)                                                                                         : \
  333.                                      inputP))                                                                                                                                                                       : \
  334.                   (if1 ?  (lsb_in ? (ref8 ? CClip : CClip.DitherPost(mode=-1,u=1,v=1))                                                                                                                              : \
  335.                                      (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields()                          : CClip.AssumeBFF().SeparateFields()) : (ref16 ? CClip.DitherPost(mode=-1,u=1,v=1) : CClip))) : \
  336.                           (lsb_in ?  input.DitherPost(mode=-1,u=1,v=1)                                                                                                                                              : \
  337.                                      inputP))")                                                                                                                                                                     : nop()
  338.  
  339.  
  340. !GlobalO && if2   ? eval("
  341. OutTO8  = output.DitherPost(mode=-1,u=1,v=1)
  342. OutTO8P = planar  ? OutTO8.Dither_YUY2toInterleaved()                                                                                               : nop()
  343. ctr16   = ifC     ? ContrasharpeningHD (planar ? OutTO8P.Interleaved2planar(true):OutTO8, CClip, planar=planar, HD=if4)                             : \
  344.                     LSFmod(OutTO8,source=CClip,defaults="+Chr(34)+"slow"+Chr(34)+",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0)
  345.  
  346.  
  347. ctr16P  = planar  ? ctr16.Planar2Interleaved(true)  : ctr16
  348. ctr16   = StackVertical (ctr16P, planar ? BlankClip  (ctr16P, pixel_type="+Chr(34)+"YUY2"+Chr(34)+", color_yuv=0,length=1) : blnkclp )
  349. ctr16   = Dither_add16 (output,mt_makediff(!planar?ctr16P:ctr16P.Dither_YUY2toPlanar(), OutTO8,u=2,v=2).Dither_convert_8_to_16(), dif=true,u=2,v=2)
  350. ctr16   = MergeChroma(ctr16, output)                                                                                                     ")         : nop()
  351.  
  352.  
  353.  
  354. # Globals Output
  355.  
  356. GlobalO || Globals == 2  ? (!if3 ? eval("
  357. global Super           = super_render
  358. global bv12            = bv12
  359. global bv10            = bv10
  360. global bv8             = bv8
  361. global bv6             = bv6
  362. global bv5             = bv5
  363. global bv4             = bv4
  364. global bv3             = bv3
  365. global bv2             = bv2
  366. global bv1             = bv1
  367.  
  368. global fv1             = fv1
  369. global fv2             = fv2
  370. global fv3             = fv3
  371. global fv4             = fv4
  372. global fv5             = fv5
  373. global fv6             = fv6
  374. global fv8             = fv8
  375. global fv10            = fv10
  376. global fv12            = fv12
  377. ") : avs26 ? eval("
  378. global bv1             =                                             vmulti.SelectEvery (tr2,  0)
  379. global bv2             = interlaced ? bv1                          : vmulti.SelectEvery (tr2,  2)
  380. global bv3             =                                             vmulti.SelectEvery (tr2,  4)
  381. global bv4             = interlaced ? vmulti.SelectEvery (tr2,  2) : vmulti.SelectEvery (tr2,  6)
  382. global bv5             =                                             vmulti.SelectEvery (tr2,  8)
  383. global bv6             = interlaced ? bv3                          : vmulti.SelectEvery (tr2, 10)
  384. global bv8             = interlaced ? vmulti.SelectEvery (tr2,  6) : nop()
  385. global bv10            = interlaced ? bv5                          : nop()
  386. global bv12            = interlaced ? vmulti.SelectEvery (tr2, 10) : nop()
  387.  
  388. global fv1             =                                             vmulti.SelectEvery (tr2,  1)
  389. global fv2             = interlaced ? fv1                          : vmulti.SelectEvery (tr2,  3)
  390. global fv3             =                                             vmulti.SelectEvery (tr2,  5)
  391. global fv4             = interlaced ? vmulti.SelectEvery (tr2,  3) : vmulti.SelectEvery (tr2,  7)
  392. global fv5             =                                             vmulti.SelectEvery (tr2,  9)
  393. global fv6             = interlaced ? fv3                          : vmulti.SelectEvery (tr2, 11)
  394. global fv8             = interlaced ? vmulti.SelectEvery (tr2,  7) : nop()
  395. global fv10            = interlaced ? fv5                          : nop()
  396. global fv12            = interlaced ? vmulti.SelectEvery (tr2, 11) : nop()
  397. global Super           = super_render
  398. global vmulti          = vmulti
  399. global Rtr             = tr
  400. ") : eval("
  401. global bv1             =                                            vmulti.SelectEvery (tr2, 0)
  402. global bv2             = interlaced ? bv1                         : vmulti.SelectEvery (tr2, 2)
  403. global bv3             =                                            vmulti.SelectEvery (tr2, 4)
  404. global bv4             = interlaced ? vmulti.SelectEvery (tr2, 2) : nop()
  405. global bv6             = interlaced ? bv3                         : nop()
  406.  
  407. global fv1             =                                            vmulti.SelectEvery (tr2, 1)
  408. global fv2             = interlaced ? fv1                         : vmulti.SelectEvery (tr2, 3)
  409. global fv3             =                                            vmulti.SelectEvery (tr2, 5)
  410. global fv4             = interlaced ? vmulti.SelectEvery (tr2, 3) : nop()
  411. global fv6             = interlaced ? fv3                         : nop()
  412. global Super           = super_render
  413. global vmulti          = vmulti
  414. global Rtr             = tr")) : nop()
  415.  
  416.  
  417.  
  418. # Output
  419.  
  420. !GlobalO ? (lsb_out ? (if0 ? ctr16 : output)  : \
  421.                      (if0 ? (lsb ?  (interlaced ?  ctr16.weave().DitherPost(u=u,v=v,mode=6,slice=slices,interlaced=true)               :  ctr16.DitherPost(mode=mode,slice=slices,ampn=ampn,u=Uin,v=Vin))                                              : \
  422.                                     (interlaced ? (ifC ? ContraSharpeningHD(output, CClip, planar=planar, HD=if4).weave()              : LSFmod(output,source=CClip,defaults="slow",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0).weave()) : \
  423.                                                   (ifC ? ContraSharpeningHD(output, CClip, planar=planar, HD=if4)                      : LSFmod(output,source=CClip,defaults="slow",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0))))       : \
  424.                             (lsb ?  (interlaced ? output.weave().DitherPost(u=u,v=v,mode=6,slice=slices,interlaced=true)               : output.DitherPost(mode=mode,slice=slices,ampn=ampn,u=Uin,v=Vin)) : (interlaced ? output.weave() : output))))    \
  425.         :  input
  426.  
  427. !GlobalO ? (planar ? (lsb ? Dither_YUY2toInterleaved() : (if0 ? MergeChroma(Planar2Interleaved(true), interlaced ? outputI.weave() : outputI) : Planar2Interleaved())) : last) : last """) : \
  428.  \
  429.  \
  430.  \
  431.  \
  432.  \
  433. eval("""
  434.  
  435. ##############
  436. # SHOW PANEL #
  437. ##############
  438.  
  439.  
  440.  # Common Variables
  441.  
  442. h     = lsb_in ? h/2 : h
  443. w2    = w*1.0
  444. h2    = h*1.0
  445. hi    = interlaced ? round(h/2.0) : h
  446. AR    = w2/h2
  447. lsp   = interlaced?15:30
  448. lsp   = AR < 1.9 ? lsp : floor(AR < 1.9 ? lsp : ((AR>2.4) ? 0 : lsp-((AR-1.9)*(lsp/(2.4-1.9)))))
  449. ys    = round(lsb_in ? h2/6 : (interlaced?h2/15:h2/6))
  450. s     = floor(((interlaced?w2/1.6:w2)/720.0)*16.0)
  451. type  = avs26 ? input.PixelType() : planar?"YUY2":"YV12"
  452.  
  453. Wadd  = w2/40
  454. Wadd2 = Wadd/2
  455. w1    = round(w2+Wadd+Wadd2)
  456. w3    = (w2/3)+Wadd/2.1
  457. w2    = round(w1+w3)
  458. w3    = round(w1+(w3+Wadd2)*1.96)
  459. w3sq  = string(round(w3*1.01))
  460. w3s   = string(w3)
  461.  
  462.  # Panel Separator
  463.  
  464. blkclp = BlankClip(interlaced?assumeframebased(pref):pref,length=1,pixel_type=type,color=$161616)
  465.         \.crop(0,interlaced?h/2%8:h%8,0,0).separatefields().assumeframebased().separatefields()
  466.  
  467. Interleave(selecteven(blkclp).addborders(2,0,0,0,color=$7f7f7f).crop(0,0,-2,0),selectodd(blkclp))
  468.  
  469. WOut=weave().assumefieldbased().weave()
  470. sep=round((hi-height(WOut))/2.0)
  471.  
  472. StackHorizontal(planar? pref.Planar2Interleaved() : pref,WOut.addborders(0,sep-sep%2,0,hi-(height(WOut)+(sep-sep%2)),color=$161616))
  473.  
  474.  
  475.  
  476.  # Color Guide Squares
  477.  
  478. a=interlaced?h*0.37:h*0.74
  479. b=interlaced?h*0.40:h*0.80
  480. c=interlaced?h*0.43:h*0.86
  481.  
  482. !planar ? avs26 ? mt_merge(mt_lut(yexpr="127 scalef",uexpr="183 scalef",vexpr="47 scalef" ,u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(a)+" >= y "+string(interlaced?h*0.3835:h*0.767)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true)
  483.          \     : mt_merge(mt_lut(yexpr="127",uexpr="183",vexpr="47" ,u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(a)+" >= y "+string(interlaced?h*0.3835:h*0.767)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true) : nop()
  484. !planar ? avs26 ? mt_merge(mt_lut(yexpr="81 scalef" ,uexpr="91 scalef" ,vexpr="240 scalef",u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(b)+" >= y "+string(interlaced?h*0.4135:h*0.827)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true)
  485.          \     : mt_merge(mt_lut(yexpr="81" ,uexpr="91" ,vexpr="240",u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(b)+" >= y "+string(interlaced?h*0.4135:h*0.827)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true) : nop()
  486. !planar ? avs26 ? mt_merge(mt_lut(yexpr="210 scalef",uexpr="16 scalef" ,vexpr="146 scalef",u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(c)+" >= y "+string(interlaced?h*0.4435:h*0.887)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true)
  487.          \     : mt_merge(mt_lut(yexpr="210",uexpr="16" ,vexpr="146",u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(c)+" >= y "+string(interlaced?h*0.4435:h*0.887)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true) : nop()
  488.  
  489.  
  490.  # Parameters List
  491.  
  492. blue  = sShow ? (show=="Speed"   ? true : false) : false
  493. red   = sShow ? (show=="Memory"  ? true : false) : false
  494. yellow= sShow ? (show=="Quality" ? true : false) : false
  495.  
  496. Color = sShow ? (blue   ? $00aef0 : \
  497.                 red    ? $ff0000 : \
  498.                 yellow ? $ffff00 : \
  499.                 Assert(false,    "Revise typo for possible color guide modes: 'Speed','Memory','Quality'")) : nop()
  500.  
  501.  
  502.  
  503. varn = "\n\n\n\n\n"
  504. sp   = !GlobalR && str==1.0 ? "  " : ""
  505.  
  506. Subtitle("SMDegrain Mod v3.1.2",text_color=red||blue||yellow?Color:$7f7f7f,halo_color=$000000,font="VERDANA",size=s*2,x=w1,y=lsb_in?h/40:(interlaced?h/50:h/20))
  507.  
  508. Subtitle("BASIC"   ,lsp=lsp,text_color=$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  509. Subtitle(            "\n\ntr           = " + string(tr)                                                                              + \
  510.         varn+varn+      "chroma       = " + string(chroma)                                                                          ,lsp=lsp,text_color=red||blue               ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  511. Subtitle(          "\n\n\nthSAD(C)     = " + string( GlobalO?"bypass":string(thSAD)     + "(" + string(plane0?thSADC:"bypass") + ")")+ \
  512.         varn+           "CClip        = " + string( GlobalO?"bypass":(defined(CClip)?"defined":"undefined"))                        + \
  513.                     "\n\nInterlaced   = " + string(interlaced)                                                                      ,lsp=lsp,text_color=                               $ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  514. Subtitle(varn+           "RefineMotion = " + string( GlobalO?"bypass":RefineMotion)                                                  ,lsp=lsp,text_color=yellow                  ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  515. Subtitle(varn+       "\n\nContrasharp  = " + string( GlobalO?"bypass":contrasharp)                                                   ,lsp=lsp,text_color=yellow&&!GlobalO        ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  516. Subtitle(varn+varn+    "\nplane        = " + string( GlobalO?"bypass":(plane==0?"0 (Luma)":plane==1?"1 (U plane)":plane==2?"2 (V plane)":plane==3?"3 (Chroma)":"4(Luma+Chroma)")),lsp=lsp,text_color=(red||blue)&&!GlobalO?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  517. Subtitle("<-- "+string(IsClip(prefilter)||prefilter!=-1?"Prefiltered clip converted\n    to PC levels":"Clip converted to PC levels\n   ")+" for the motion search",lsp=lsp,text_color=$ffffff,font="COURIER NEW",size=s,x=w1-10,y=(interlaced?h/2:h)-int(ys/1.5))
  518.  
  519. Subtitle("ADVANCED",lsp=lsp,text_color=$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  520. Subtitle(              "\n\npel        = " + string(pel)                                                                             ,lsp=lsp,text_color=red                     ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  521. Subtitle(            "\n\n\nsubpixel   = " + string( pel==1 ?"bypass":subpixel)                                                      ,lsp=lsp,text_color=(yellow||blue)&&pel!=1  ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  522. Subtitle(varn+varn+  "\n\n\ntruemotion = " + string( GlobalR?"bypass":truemotion)                                                    ,lsp=lsp,text_color=(yellow||blue)&&!GlobalR?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  523. Subtitle(varn+             "mfilter    = " + string( GlobalR?"bypass":MFilterB?"Clip"+sp+" Variable":"OFF")                          ,lsp=lsp,text_color=                               $7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  524. Subtitle(varn+         "\n\nStr        = " + (GlobalR?string("bypass"):string(Str,"%1.2f"))+sp+" Brightness"                         + \
  525.         varn+             "search     = " + string( GlobalR?"bypass":search)                                                        ,lsp=lsp,text_color=yellow&&!GlobalR        ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  526. Subtitle(varn+varn+        "blksize    = " + string( GlobalR?"bypass":blksize)                                                       + \
  527.                         "\noverlap    = " + string( GlobalR?"bypass":overlap)                                                       ,lsp=lsp,text_color=(red||blue)&&!GlobalR   ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  528. Subtitle(varn+           "\nprefilter  = " + (GlobalR?string("bypass"):(preclip?"Clip"+sp+" Variable":(prefilter==0?"0"+sp+"    MinBlur(0)":prefilter==1?"1"+sp+"    MinBlur(1)":prefilter==2?"2"+sp+"    MinBlur(2)":prefilter==3?"3"+sp+"    Dfttest":prefilter==4?"4"+sp+"    KNLmeans":"OFF"+sp+"    (-1)"))) + \
  529.                       "\n\nAmp        = " + (GlobalR||str==1.0?string("bypass"):string(Amp,"%1.2f"))+" Amplitude"                   + \
  530.         varn+           "\nlimit(C)   = " + (GlobalO?string("bypass"):string(limit)     + "(" + string(limitc) + ")")               ,lsp=lsp,text_color=                               $7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  531.  
  532. Subtitle("OTHERS"  ,lsp=lsp,text_color=$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  533. Subtitle(             "\n\n\nthSCD1(2) = " + (GlobalO?string("bypass"):string(thSCD1) + "(" + string(thSCD2) + ")")                  + \
  534.                   varn+"\n\nGlobals   = " + string(Globals==0 ? "0 (OFF)" : Globals==1 ? "1 (Import)" : Globals==2 ? "2 (Export)" : "3 (E.Only)"),lsp=lsp,text_color=                  $494949,font="COURIER NEW",size=s,x=w3,y=ys)
  535. Subtitle(          varn+"\n\nslices    = " + string(slices)                                                                          ,lsp=lsp,text_color=blue                    ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  536. Subtitle(               "\n\nhpad(v)   = " + string(hpad)   + "(" + string(vpad)   + ")"                                             ,lsp=lsp,text_color=red||blue               ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  537. Subtitle(varn+              "lsb       = " + string(lsb)                                                                             ,lsp=lsp,text_color=yellow                  ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  538. Subtitle(varn+            "\nlsb_in/out= " + string(lsb_in) +"/"+ string(lsb_out)                                                    ,lsp=lsp,text_color=red&&lsb_in             ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  539. Subtitle(varn+        "\n\n\nmode      = " + (GlobalO||(lsb_out||!lsb)?string("bypass"):interlaced?"6 (locked)":string(mode))        ,lsp=lsp,text_color=yellow&&!GlobalO&&lsb   ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  540.  
  541. Subtitle("   Speed"   ,lsp=interlaced?15:30,text_color=planar?$00aef0:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(a-1))
  542. Subtitle("   Memory"  ,lsp=interlaced?17:34,text_color=planar?$ff0000:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(b-1))
  543. Subtitle("   Quality" ,lsp=interlaced?19:38,text_color=planar?$ffff00:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(c-1))
  544.  
  545. lsb_out ? StackVertical (last, BlankClip (last, pixel_type=type, color_yuv=0,length=1)) : last""")}
  546.  
  547.  
  548.  
  549.  
  550.  
  551. ########################################################
  552. #                                                      #
  553. # HELPER FUNCTIONS: For Contrasharp and YUY2 handling  #
  554. #                                                      #
  555. ########################################################
  556.  
  557. ########################################
  558. ## Didée's functions:
  559.  
  560.  # contra-sharpening: sharpen the denoised clip, but don't add more to any pixel than what was removed previously.
  561.  # script function from Didée, at the VERY GRAINY thread
  562.  
  563.  # In final version 2.0d ContraHD() was merged, to allow proper HD sharpening.
  564.  # In this case global variables of (before denoising) source MSuper and forward and backward
  565.  # compensated motion vectors are necessary as: Super, cb1 and cf1, if used as a stand alone function.
  566.  # Don't know who made (mod) it, so I can't give proper credits, sorry.
  567.  
  568. FUNCTION ContraSharpeningHD(clip denoised, clip original, bool "HD", bool "planar", int "overshoot"){
  569. HD        = default(HD    ,false)
  570. planar    = default(planar,false)
  571. overshoot = default(overshoot,0)
  572. avs26 = VersionNumber() < 2.60 ? false : true
  573. yuy26 = avs26 && Isyuy2(denoised) && planar
  574.  
  575. HD ? eval("""
  576. cb1=original.MCompensate(Super, cb1, planar=planar)
  577. cf1=original.MCompensate(Super, cf1, planar=planar)
  578. pmax = yuy26 ? original.Planar2Interleaved().ConvertToYV16().mt_logic(cb1.Planar2Interleaved().ConvertToYV16(), "max").mt_logic(cf1.Planar2Interleaved().ConvertToYV16(), "max") : original.mt_logic(cb1, "max").mt_logic(cf1, "max")
  579. pmin = yuy26 ? original.Planar2Interleaved().ConvertToYV16().mt_logic(cb1.Planar2Interleaved().ConvertToYV16(), "min").mt_logic(cf1.Planar2Interleaved().ConvertToYV16(), "min") : original.mt_logic(cb1, "min").mt_logic(cf1, "min")""") : nop()
  580.  
  581. s    = denoised.MinBlur(HD?2:1,1,planar=planar)                                   # Damp down remaining spots of the denoised clip.
  582. s    = yuy26 ? s.Planar2Interleaved().ConvertToYV16() : s
  583. original = yuy26 ? original.Planar2Interleaved().ConvertToYV16() : original
  584. denoised = yuy26 ? denoised.Planar2Interleaved().ConvertToYV16() : denoised
  585. allD = mt_makediff(original,denoised)                                             # The difference achieved by the denoising.
  586. ssD  = mt_makediff(s,HD?s.removegrain(20,-1,planar=planar).\
  587.                           removegrain(20,-1,planar=planar):\
  588.                         s.removegrain(11,-1,planar=planar))                       # The difference of a simple kernel blur.
  589. allD = yuy26 ? allD.ConvertToYUY2().Interleaved2planar(true) : allD
  590. ssD  = yuy26 ? ssD.ConvertToYUY2().Interleaved2planar(true) : ssD
  591. ssDD = ssD.repair(HD?ssD.repair(allD,1,planar=planar):allD,HD?12:1,planar=planar) # Limit the difference to the max of what the denoising removed locally.
  592. ssDD = yuy26 ? ssDD.Planar2Interleaved().ConvertToYV16() : ssDD
  593. ssD  = yuy26 ? ssD.Planar2Interleaved().ConvertToYV16() : ssD
  594. ssDD = avs26 ? SSDD.mt_lutxy(ssD,"x range_half - abs y range_half - abs < x y ?")
  595.        \     : SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?")                       # abs(diff) after limiting may not be bigger than before.
  596.  
  597. denoised.mt_adddiff(ssDD,U=2,V=2)                                                 # Apply the limited difference. (Sharpening is just inverse blurring)
  598. HD ? mt_clamp(last,pmax,pmin,overshoot,overshoot,chroma="copy first") : last
  599. yuy26 ? last.ConvertToYUY2().Interleaved2planar() : last
  600. }
  601.  
  602.  # MinBlur   by Didée
  603.  # Nifty Gauss/Median combination (Modified for Planar input)
  604.  
  605. function MinBlur(clip clp, int "r", int "uv", bool "planar"){
  606.  
  607. r      = default(r,1)
  608. uv     = default(uv,3)
  609. planar = default(planar,false)
  610. avs26 = VersionNumber() < 2.60 ? false : true
  611. yuy26 = avs26 && Isyuy2(clp) && planar
  612.  
  613. uv2    = (uv==2) ? 1  : uv
  614. rg4    = (uv==3) ? 4  : -1
  615. rg11   = (uv==3) ? 11 : -1
  616. rg20   = (uv==3) ? 20 : -1
  617. uvm2   = r==2 ? (uv==3?2:uv==2?0:-1) : nop()
  618. uvm3   = r==3 ? (uv==3?3:uv==2?0:-1) : nop()
  619. medf   = (uv==3) ? 1 : -200
  620.  
  621. RG11D = (r==0) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.sbr(planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.sbr(planar=planar),U=uv2,V=uv2)
  622.  \    : (r==1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar),U=uv2,V=uv2)
  623.  \    : (r==2) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2)
  624.  \    :          yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2)
  625. RG4D  = (r<=1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(4,rg4,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(4,rg4,planar=planar),U=uv2,V=uv2)
  626.  \    : (r==2) ? avs26 ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.Planar2Interleaved(uv2==1).ConvertToYV16().medianblur(2,2*medf,2*medf),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2) : mt_makediff(clp,clp.Quantile(radius_y=2, radius_u=uvm2, radius_v=uvm2, planar=planar), U=uv2,V=uv2)
  627.  \    :          avs26 ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.Planar2Interleaved(uv2==1).ConvertToYV16().medianblur(3,3*medf,3*medf),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2) : mt_makediff(clp,clp.Quantile(radius_y=3, radius_u=uvm3, radius_v=uvm3, planar=planar), U=uv2,V=uv2)
  628. DD    = yuy26 ? mt_lutxy(RG11D.Planar2Interleaved(uv2==1).ConvertToYV16(),RG4D.Planar2Interleaved(uv2==1).ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv==1)
  629.     \ : avs26 ? mt_lutxy(RG11D,RG4D,"x range_half - y range_half - * 0 < range_half x range_half - abs y range_half - abs < x y ? ?",U=uv2,V=uv2)
  630.     \         : mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
  631. return (yuy26 ? clp.Planar2Interleaved(uv==1).ConvertToYV16().mt_makediff(DD.Planar2Interleaved(uv==1).ConvertToYV16(),U=uv,V=uv).ConvertToYUY2().Interleaved2planar(uv==1) : clp.mt_makediff(DD,U=uv,V=uv)) }
  632.  
  633.  
  634.  # helper function: make a highpass on a blur's difference (well, kind of that)
  635.  # Highpass of spatial r=1 Gaussian (like blur(1.0)) (Modified for Planar input)
  636.  
  637. function sbr(clip c, bool "planar") {
  638.  
  639. planar = default(planar,false)
  640. avs26 = VersionNumber() < 2.60 ? false : true
  641. yuy26 = avs26 && Isyuy2(c) && planar
  642.  
  643. rg11   = c.removegrain(11,-1,planar=planar)
  644. rg11D  = yuy26 ? mt_makediff(c.Planar2Interleaved(true).ConvertToYV16(),rg11.Planar2Interleaved(true).ConvertToYV16()).ConvertToYUY2().Interleaved2planar(true) : mt_makediff(c,rg11)
  645. rg11DD = yuy26 ? mt_makediff(rg11D.Planar2Interleaved(true).ConvertToYV16(),rg11D.removegrain(11,-1,planar=planar).Planar2Interleaved(true).ConvertToYV16()).mt_lutxy(rg11D.Planar2Interleaved(true).ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?").ConvertToYUY2().Interleaved2planar(true)
  646.      \ : avs26 ? mt_makediff(rg11D,rg11D.removegrain(11,-1,planar=planar)).mt_lutxy(rg11D,"x range_half - y range_half - * 0 < range_half x range_half - abs y range_half - abs < x y ? ?")
  647.      \         : mt_makediff(rg11D,rg11D.removegrain(11,-1,planar=planar)).mt_lutxy(rg11D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?")
  648. yuy26 ? c.Planar2Interleaved().ConvertToYV16().mt_makediff(rg11DD.Planar2Interleaved().ConvertToYV16(),U=2,V=2).ConvertToYUY2().Interleaved2planar() : c.mt_makediff(rg11DD,U=2,V=2) }
  649.  
  650. ########################################
  651. ## cretindesalpes' functions
  652.  
  653. # Converts 16 bit interleaved YUY2 to 16bit planar YUY2 suitable for Ditherpost. (Use right before Ditherpost; this format is not suitable for filtering)
  654.  
  655. function Dither_YUY2toPlanar16(c){c
  656. yuy26   = !(VersionNumber() < 2.60) && isyuy2(c)
  657. my = !yuy26 ? Dither_get_msb().ConvertToYV12() : nop()
  658. ly = !yuy26 ? Dither_get_lsb().ConvertToYV12() : nop()
  659. u = !yuy26 ? UToY ().ConvertToYV12 () : nop()
  660. v = !yuy26 ? VToY ().ConvertToYV12 () : nop()
  661. yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (StackVertical (my, my), StackVertical (ly, ly)))}
  662.  
  663.  
  664. # Converts 8 bit interleaved YUY2 to 8 bit planar YUY2 ready for either 8 or 16 bit processing also suitable for Ditherpost
  665.  
  666. function Dither_YUY2toPlanar(c){c
  667. yuy26   = !(VersionNumber() < 2.60) && isyuy2(c)
  668. y = !yuy26 ? ConvertToYV12 () : nop()
  669. u = !yuy26 ? UToY ().ConvertToYV12 () : nop()
  670. v = !yuy26 ? VToY ().ConvertToYV12 () : nop()
  671. yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (y, y))}
  672.  
  673.  
  674. # Converts back the above special planar formats to normal interleaved 16 bit YUY2
  675.  
  676. function Dither_YUY2toInterleaved16(c){c
  677. yuy26   = !(VersionNumber() < 2.60)
  678. y = !yuy26 ? StackVertical (Crop (0, 0, 0, (Height () /(4))), Crop (0, (Height () /(2))+(Height () /(4)), 0, 0)).ConvertToYUY2 () : nop()
  679. u = !yuy26 ? UToY ().ConvertToYUY2 () : nop()
  680. v = !yuy26 ? VToY ().ConvertToYUY2 () : nop()
  681. yuy26 ? ConvertToYUY2() : YToUV (u, v, y)}
  682.  
  683. # Converts back the above special planar formats to normal interleaved YUY2
  684.  
  685. function Dither_YUY2toInterleaved(c){c
  686. yuy26   = !(VersionNumber() < 2.60)
  687. y = !yuy26 ? Crop (0, 0, 0, Height () /(2)).ConvertToYUY2 () : nop()
  688. u = !yuy26 ? UToY ().ConvertToYUY2 () : nop()
  689. v = !yuy26 ? VToY ().ConvertToYUY2 () : nop()
  690. yuy26 ? ConvertToYUY2() : YToUV (u, v, y)}
  691.  
  692.  
  693.  
  694. # Converts luma (and chroma) to PC levels, and optionally allows tweaking for pumping up the darks. (for the clip to be fed to motion search only)
  695. # By courtesy of cretindesalpes.
  696.  
  697. function Dither_Luma_Rebuild (clip src, float "s0", float "c",int "uv", bool "lsb", bool "lsb_in", bool "lsb_out", int "mode", float "ampn", bool "slice"){
  698. lsb_in  = Default( lsb_in  ,false)
  699. lsb_out = Default( lsb_out ,false)
  700. lsb     = Default( lsb     ,lsb_in || lsb_out)
  701. lsb     = !lsb && (lsb_in || lsb_out) ? true : lsb
  702. mode    = Default( mode ,6)
  703. uv      = Default(uv,    3)
  704. s0      = Default(s0,  2.0)
  705. c       = Default(c,  1.0/16)
  706. ampn    = Default(ampn, 0.0)
  707. slice   = Default(slice, true)
  708. yuy2    = isyuy2(src)
  709. avs26   = VersionNumber() < 2.60 ? false : true
  710. ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  711. lsb_native = ssispmt ? !(src.BitsPerComponent() > 8 && (lsb)) : true
  712. ssispmt ? Assert(lsb_native, "lsb hack is not Compatible with native high bit depth" ) : nop()
  713. ssispmt ? Assert(!(src.isYUVA() && lsb), "lsb hack is not Compatible with YUVA" ) : nop()
  714. Assert(!(src.isrgb()), "Dither_Luma_Rebuild: RGB Color formats is not supported" )
  715. src     = yuy2 ? lsb_in ? src.Planar2Interleaved(uv==1).Dither_YUY2toPlanar16() : avs26 ? src.Planar2Interleaved(uv==1).ConvertToYV16() : lsb ? src.Planar2Interleaved(uv==1).Dither_YUY2toPlanar() : src : src
  716.  
  717.     k = (s0 - 1) * c
  718.     t = lsb_in ? "x 4096 - 56064 / 0 1 clip"
  719.      \ : avs26 ? "x 16 scalef - 219 scalef / 0 1 clip"
  720.              \ : "x 16 - 219 / 0 1 clip"
  721.     e = String(k)+" "+String(1+c)+" "+String((1+c)*c)+" "+t+" "+String(c)
  722. \       +" + / - * "+t+" 1 "+String(k)+" - * + "+String(lsb?65536:avs26?"range_size":255)+" *"
  723. src
  724. lsb ? (lsb_in ? Dither_lut16  (yexpr=e,expr="x 32768 - 32768 * 28672 / 32768 +",y=3, u=uv, v=uv)                 : \
  725.                 Dither_lut8   (yexpr=e,expr="x 128 - 32768 * 112 / 32768 +"    ,y=3, u=uv, v=uv))                : \
  726.                 avs26 ? mt_lut(yexpr=e,expr="x range_half - range_half * 112 scalef / range_half +",y=3, u=uv, v=uv) : \
  727.                         mt_lut(yexpr=e,expr="x 128 - 128 * 112 / 128 +"        ,y=3, u=uv, v=uv)
  728.  
  729. lsb_out && !yuy2 ? last : (lsb && !lsb_out ? yuy2 ? Ditherpost(mode=mode,ampn=ampn,slice=slice,staticnoise=ampn!=0.0?true:false,u=uv,v=uv).Dither_YUY2toInterleaved().Interleaved2planar(uv==1) : Ditherpost(mode=mode,ampn=ampn,slice=slice,staticnoise=ampn!=0.0?true:false,u=uv,v=uv) : last)
  730. return yuy2 && lsb_out ? last.Dither_YUY2toInterleaved16().Interleaved2planar(uv==1) : yuy2 && avs26 && !lsb ? converttoyuy2().Interleaved2planar(uv==1) : last
  731. }
  732.  
  733.  
  734.  
  735. # SMDegrain prefilters
  736.  
  737. function SMDegrain_prefilters (clip input, int "prefilter", bool "chroma", int "Chr", int "Chr2", int "bug_wa", bool "lsb", bool "lsb_in", bool "Interlaced", val "if5", int "pel", String "device_type", int "device_id", int "d", int "a", bool "slices", bool "planar", clip "inputP", clip "input8", clip "input8y", clip "inputY", val "input8h", float "h", String "knlm_params")
  738. {
  739. Interlaced   = Default( Interlaced  ,false)
  740. slices       = default(slices, true)
  741. if5          = Default( if5  ,interlaced ? (GetParity(input)                            ? true : false) : nop())
  742. lsb_in       = Default( lsb_in  ,false)
  743. lsb          = Default( lsb     ,lsb_in)
  744. pel          = default( pel, (input.width () > 1099 ||  input.height() > (lsb_in ? 1199 : 599)) ? 1 : 2 )
  745. ssispmt      = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  746. chroma       = default( chroma, true)
  747. planar       = Default( planar , input.isyuy2())
  748. prefilter    = Default( prefilter, 3)
  749.  
  750. Chr          = Default(Chr,     chroma ? 3 : 1)
  751. Chr2         = Default(Chr2,    chroma ? 3 : (prefilter==3 ? 2 : 1))
  752. avs26        = !(VersionNumber() < 2.60)
  753.  
  754. Assert(!(!defined(inputP) && prefilter==-1), "prefilter must be between 0~4: "+string(prefilter))
  755. lsb_native = ssispmt ? !(Input.BitsPerComponent() > 8 && (lsb)) : true
  756. ssispmt ? Assert(lsb_native, "lsb hack is not Compatible with native high bit depth" ) : nop()
  757.  
  758. # Input preparation for: LSB_IN, Interlacing, Planar and MSuper optimization when pel=2
  759.  
  760. inputY  = defined(inputY )                    ? inputY  : planar      ? (lsb_in   ? Dither_YUY2toPlanar16(input)         : Interleaved2planar(input))                           : input
  761.  
  762. inputP  = defined(inputP )                    ? inputP  : !interlaced ? (pel == 2 ? inputY.AssumeFrameBased()            : inputY)                                             : \
  763.                                                                         (if5      ? inputY.AssumeTFF().SeparateFields()  : inputY.AssumeBFF().SeparateFields())
  764.  
  765. input8h = defined(input8h) && isclip(input8h) ? input8h : lsb_in      ?             inputP. Ditherpost(mode=6, slice=slices)                                                    : nop()
  766. input8y = defined(input8y)                    ? input8y : planar      ? (lsb_in   ? input8h.Dither_YUY2toInterleaved()   :  inputP)                                             : inputP
  767. input8  = defined(input8 )                    ? input8  : lsb_in      ? (planar   ? input8y.Interleaved2planar()         : input8h)                                             : input8y
  768.  
  769. inputd  = (prefilter == 3 || prefilter == 4)  ? Interlaced ? if5 ? input.AssumeTFF().SeparateFields() : \
  770.                                                                    input.AssumeBFF().SeparateFields() : \
  771.                                                              input : nop()
  772.  
  773. bug_wa    = defined(bug_wa) ? bug_wa : interlaced && planar && chroma && !avs26 ? 2 : Chr # bug: crash prevention workaround
  774.  
  775. # The mt_merge() line for prefilter=3 should be swapped with a high bitdepth variant (Dither_merge16_8() ?) due to a 1 point limited range
  776. # in both range ends, but then it won't work with planar sources. This isn't as critical since we are only trying to find motion vectors.
  777.                      (prefilter==-1) ?  inputP                                                                                                                                      : \
  778.                      (prefilter==0)  ?  input8.MinBlur(0,Chr,planar)                                               : \
  779.                      (prefilter==1)  ?  input8.MinBlur(1,Chr,planar)                                               : \
  780.                      (prefilter==2)  ?  input8.MinBlur(2,Chr,planar)                                               : \
  781.                      (prefilter==3)  ?  (!planar && lsb ? Dither_merge16_8( inputd.Dfttest(sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,lsb=true,lsb_in=lsb_in,quiet=true), lsb_in?inputP:inputP.Dither_convert_8_to_16(),                                \
  782.                                                                    lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 4.338916843220339 * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr,   v=Chr)                                           \
  783.                                                                          :inputd.mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=chroma,                       u=Chr2,  v=Chr2)                                                       : \
  784.                                  avs26 && planar && lsb ? Dither_merge16_8( inputd.Dfttest(sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,lsb=true,lsb_in=lsb_in,quiet=true).ConvertToYV16(), lsb_in?inputP:inputd.ConvertToYV16().Dither_convert_8_to_16(),                                \
  785.                                                                    lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 4.338916843220339 * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr,   v=Chr)                                           \
  786.                                                                          :inputd.ConvertToYV16().mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=chroma,                       u=Chr2,  v=Chr2).ConvertToYUY2().Interleaved2planar(!chroma)                                                       : \
  787.                                            avs26 && planar ? mt_merge     (        Dfttest(!lsb_in?inputd:input8y,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1).ConvertToYV16(),!lsb_in?input8y.Planar2Interleaved(!chroma).ConvertToYV16():input8y.ConvertToYV16(),                                                   \
  788.                                                                           input8.Planar2Interleaved(!chroma).ConvertToYV16().mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 4.322033898305085 * - ? ?",u=1,v=1), luma=planar?false:chroma,          u=bug_wa,v=bug_wa).ConvertToYUY2().Interleaved2planar(!chroma)                                                    : \
  789.                                                      avs26 ? mt_merge     (Dfttest(inputd,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1),input8,   \
  790.                                                                           input8.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), luma=chroma, u=chr,v=chr)                                                   : \
  791.                                                              mt_merge     (planar ? Dfttest(!lsb_in?inputd:input8y,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1).Interleaved2planar(!chroma)                          : \
  792.                                                                                     Dfttest(!lsb_in?inputd:input8 ,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1),input8,   \
  793.                                                                           input8.mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 4.322033898305085 * - ? ?",u=1,v=1), luma=chroma,          u=bug_wa,v=bug_wa))                                                   : \
  794.                      (prefilter==4)  ?  planar ? inputd.SMDegrain_KNLMeansCL(lsb=lsb, lsb_in=lsb_in, device_type=device_type, device_id=device_id, chroma=chroma, h=h, d=d, a=a, knlm_params=knlm_params).Interleaved2planar(!chroma) : \
  795.                                                  inputd.SMDegrain_KNLMeansCL(lsb=lsb, lsb_in=lsb_in, device_type=device_type, device_id=device_id, chroma=chroma, h=h, d=d, a=a, knlm_params=knlm_params) : \
  796.                                          Assert(false,    "prefilter must be between -1~4: "+string(prefilter))
  797. }
  798.  
  799.  
  800.  
  801. # SMDegrain_KNLMeansCL
  802.  
  803. function SMDegrain_KNLMeansCL (clip input, String "device_type", int "device_id", bool "chroma", bool "lsb", bool "lsb_in", float "h", int "d", int "a", String "knlm_params")
  804. {
  805. d            = Default( d ,0)
  806. a            = Default( a ,1)
  807. h            = Default( h ,7.0)
  808. deviceid     = Default( device_id ,0)
  809. knlm_params  = default(knlm_params, "")
  810. chroma       = Default( chroma  ,true)
  811. lsb_in       = Default( lsb_in  ,false)
  812. lsb          = Default( lsb     ,lsb_in)
  813.  
  814.                                               avspmt  = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
  815.                                               fullchr = avspmt ? input.is444() : input.isyv24()
  816.                                               chr420  = avspmt ? input.is420() : input.isyv12()
  817.                                               nochr   = avspmt ?   input.isy() : input.isy8()
  818.                                               chrlsb  = chroma && !fullchr && !nochr
  819.                                               NL_in   = lsb && !lsb_in ? input.Dither_convert_8_to_16() : input
  820.                                               cnl     = chrlsb ? "Y" : input.isrgb() ? "auto" : chroma ? "YUV" : "Y"
  821.  
  822. NL_in = !chrlsb && input.isyuy2() ? NL_in.converttoyv16() : NL_in
  823.  
  824.                                chrlsb ? eval("""
  825.                                              # In a more lucid state I could probably have laid out this block much better... or not...
  826.  
  827.                                              NL_W    = width(NL_in)
  828.                                              Uclip   = avspmt ? ExtractU(NL_in) : UToY8(NL_in)
  829.                                              Vclip   = avspmt ? ExtractV(NL_in) : VToY8(NL_in)
  830.                                              NL_lsb  = (chr420 ? StackVertical(  lsb ? StackVertical(Dither_get_msb(uclip),Dither_get_msb(vclip)) : uclip,\
  831.                                                                                  lsb ? StackVertical(Dither_get_lsb(uclip),Dither_get_lsb(vclip)) : vclip) : \
  832.                                                                  StackHorizontal(uclip,vclip))
  833.  
  834.                                              nlc     = StackHorizontal(avspmt ? ConvertToY(NL_in) : ConvertToY8(NL_in),NL_lsb)
  835.  
  836.                                              nlc     = Eval("nlc.KNLMeansCL(D=d, A=a, h=h,lsb_inout=lsb_in || lsb,device_type=device_type,device_id=deviceid,channels=cnl" + knlm_params + ")")
  837.  
  838.                                              uvh = lsb_in || lsb ? uclip.height()/2 : uclip.height()
  839.                                              uvw = uclip.width()
  840.  
  841.                                              nly = nlc.crop(0,0,chr420 ? -uvw : -(uvw+uvw),0)
  842.  
  843.                                              nlu = chr420 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,0,0,-uvh),Dither_get_lsb(nlc).crop(NL_W,0,0,-uvh)) : nlc.crop(NL_W,0,0,-uvh)                : \
  844.                                                              nlc.crop(NL_W    ,0,-uvw,0)
  845.                                              nlv = chr420 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,uvh, 0,0),Dither_get_lsb(nlc).crop(NL_W,uvh, 0,0)) : nlc.crop(NL_W,uvh, 0,0)                : \
  846.                                                              nlc.crop(NL_W+uvw,0,   0,0)
  847.                                              YToUV(nlu, nlv, nly)
  848.                                             """) :   Eval("NL_in.KNLMeansCL(D=d, A=a, h=h,lsb_inout=lsb_in || lsb,device_type=device_type,device_id=deviceid,channels=cnl" + knlm_params + ")")
  849.  
  850. !lsb && lsb_in ? Ditherpost(mode=6,slice=false) : last
  851. input.isyuy2() ? converttoyuy2() : last
  852. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement