Guest User

SMDegrain

a guest
Jun 30th, 2016
337
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. ###          mod in 2016-06-30 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. ###                                                                                          ###
  16. ################################################################################################
  17. ###
  18. ### General purpose simple degrain function. Pure temporal denoiser. Basically a wrapper(function)/frontend of mvtools2+mdegrain
  19. ### with some added common related options. Goal is accessibility and quality but not targeted to any specific kind of source.
  20. ### The reason behind is to keep it simple so aside masktools2 you will only need MVTools2.
  21. ###
  22. ### Check documentation for deep explanation on settings and defaults.
  23. ### VideoHelp thread: (http://forum.videohelp.com/threads/369142)
  24. ###
  25. ################################################################################################
  26.  
  27. function SMDegrain (clip input   , int "tr"      , int "thSAD"    , int  "thSADC" , bool "RefineMotion",  val  "contrasharp", clip "CClip"      , bool "interlaced" ,  int   "plane" ,  int   "Globals",                                  \
  28.                      int "pel"   , int "subpixel", val "prefilter", clip "mfilter", int  "blksize"     , int  "overlap"     ,  int  "search"    , bool "truemotion" , int  "limit"   ,  int   "limitc" ,  int   "thSCD1" , int "thSCD2",  \
  29.                     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"){
  30.  
  31.  
  32.  
  33. # Defaults & Conditionals
  34.  
  35.  
  36. tr           = default( tr,       2 )
  37. thSAD        = default( thSAD,  300 )
  38. thSAD2=int(thSAD/2)
  39. thSADC       = default( thSADC, thSAD2)
  40. RefineMotion = default( RefineMotion,false)
  41.  
  42. lsb_in       = default( lsb_in,  false)
  43. lsb_out      = default( lsb_out, false)
  44. lsb          = default( lsb    , lsb_in || lsb_out)
  45. mode         = default( mode, 0 )
  46. mode         = mode != 9 ? mode : -1
  47. ampn         = mode != 9 ? 0.0  : 1.0
  48. slices       = default(slices, true)
  49.  
  50. Globals      = default( Globals,  0 )
  51. GlobalR = Globals == 1        ? true : false
  52. GlobalO = Globals == 3        ? true : false
  53. if1     = Defined(CClip)      ? true : false
  54.  
  55. Contrasharp  = default( Contrasharp, !GlobalO && if1 ? true : false)
  56. Interlaced   = default( Interlaced,  false)
  57.  
  58. w       = input.width ()
  59. h       = input.height()
  60. sShow   = IsString(show)      ? true : false
  61. preclip = IsClip(prefilter)   ? true : false
  62. planar  = IsYUY2(input)       ? true : false
  63. ifC     = IsBool(Contrasharp) ? true : false
  64. if0     = ifC ? (Contrasharp  ? true : false) : (Contrasharp > 0.0 ? true : false)
  65. if2     = if0 && lsb && !GlobalO                                    ? true : false
  66. if3     = tr > 3                                                    ? true : false
  67. if4     = (w > 1099 ||  h > (lsb_in ? 1199 : 599))                  ? true : false
  68. if5     = interlaced ? (GetParity(input)                            ? true : false) : nop()
  69. avs26   = VersionNumber() < 2.60 ? false : true
  70. yuy25   = !avs26 && planar
  71.  
  72.  
  73. pel          = default( pel, if4 ? 1 : 2 )
  74. subpixel     = default( subpixel,  2 )
  75. prefilter    = default( prefilter, -1 )
  76. MFilterB     = defined(mfilter) ? true : false
  77. pelclip      = pel>1 && subpixel == 3 ? true : false
  78. Str          = default( Str, 1.0 )
  79. Amp          = default( Amp, 0.0625 )
  80. TV_range     = default( TV_range, true)
  81.  
  82. blksize      = default( blksize,  if4 ? 16 : 8 )
  83. blk2=blksize/2
  84. overlap      = default( overlap,  blk2 )
  85. ovl2=overlap/2
  86. search       = default( search,   4 )
  87. truemotion   = default( truemotion, !if4)
  88. thSCD1       = default( thSCD1,  int(pow((blksize*2.5),2)))
  89. thSCD2       = default( thSCD2,  130 )
  90.  
  91.  
  92. plane        = default( plane,    4 )
  93. chroma       = default( chroma,    true)
  94. Chr          = chroma ? 3 : 1
  95. Chr2         = chroma ? 3 : (prefilter==3 ? 2 : 1)
  96. plane0       = plane!=0        ? true : false
  97. U            = plane0 && plane!=2 ? 3 : 2
  98. V            = plane0 && plane!=1 ? 3 : 2
  99. Uin          = lsb_in ? 3 : u
  100. Vin          = lsb_in ? 3 : v
  101.  
  102.  
  103. hpad         = blksize
  104. vpad         = blksize
  105. limit        = default( limit,  255 )
  106. limitc       = default( limitc,limit)
  107.  
  108. Show         = default( Show,  false)
  109.  
  110.  
  111.  
  112.  
  113. # Error Report
  114.  
  115.                   Assert(blksize==4 || blksize==8 || blksize==16 || blksize==32,"MAnalyse: Block's size must be 4x4, 8x4, 8x8, 16x2, 16x8, 16x16, 32x16, 32x32")
  116.                   Assert(overlap <= blk2,              "Overlap must be at least half blksize or less")
  117.                   Assert(overlap == overlap-overlap%2, "MAnalyse: overlap must be an even figure")
  118.                   Assert(IsBool(Show) || sShow,        "'Show' only accepts bool inputs (true,false), or string modes ('Speed','Memory',Quality')")
  119.                   Assert(preclip || IsInt(prefilter),  "'prefilter' only accepts integers and clip inputs")
  120.                   Assert(ifC     || IsInt(Contrasharp),"'Contrasharp' only accepts integers and bool inputs")
  121. !chroma         ? Assert(plane==0,                     "Denoising chroma with luma only vectors is bugged in mvtools and thus unsupported") : nop()
  122. MFilterB        ? Assert(IsClip(mfilter),              "'mfilter' only accepts clip inputs")                        : nop()
  123. interlaced      ? Assert(h%4==0,                       "Interlaced sources require mod 4 height sizes")             : nop()
  124. lsb_in          ? Assert(!interlaced,                  "Interlaced 16 bit stacked clip is not a recognized format") : nop()
  125. planar && if0   ? Assert(ifC,                          "LSFmod doesn't support YUY2 sources")                       : nop()
  126. RefineMotion    ? Assert(blksize > 7,                  "For RefineMotion you need a blksize of at least 8")         : nop()
  127. lsb_in          ? Assert(lsb,                          "lsb_in  requires: lsb=true")                                : nop()
  128. lsb_out         ? Assert(lsb,                          "lsb_out requires: lsb=true")                                : nop()
  129.  
  130.  
  131.  
  132. # RefineMotion Variables
  133.  
  134. halfblksize  = RefineMotion ?  blk2                                     : nop() # MRecalculate works with half block size
  135. halfoverlap  = RefineMotion ? (overlap == 2 ? overlap : ovl2+ovl2%2)    : nop() # Halve the overlap to suit the halved block size
  136. halfthSAD    = RefineMotion || if3 ?     thSAD2                         : nop() # MRecalculate uses a more strict thSAD, which defaults to 150 (half of function's default of 300)
  137. halfthSADC   =                 if3 ? int(thSADC/2)                      : nop() # For MDegrainN()
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144. # Input preparation for: LSB_IN, Interlacing, Planar and MSuper optimization when pel=2
  145.  
  146. inputY  = planar      ? (lsb_in   ? Dither_YUY2toPlanar16(input)          : Interleaved2planar(input))                          : input
  147.  
  148. inputP  = !interlaced ? (pel == 2 ? inputY.AssumeFrameBased()             : inputY)                                             : \
  149.                         (if5      ? inputY.AssumeTFF().SeparateFields()   : inputY.AssumeBFF().SeparateFields())
  150.  
  151. input8h = lsb_in      ?             inputP. Ditherpost(mode=6, slice=slices)                                                    : nop()
  152. input8y = planar      ? (lsb_in   ? input8h.Dither_YUY2toInterleaved()    : inputP)                                             : inputP
  153. input8  = lsb_in      ? (planar   ? input8y.Interleaved2planar()                                                                : \
  154.                                     input8h)                                                                                    : input8y
  155.  
  156.  
  157. # Prefilter & Motion Filter
  158.  
  159. Mfilter = MFilterB ? Mfilter : input8
  160.  
  161. bug_wa = interlaced && planar && chroma && !avs26 ? 2 : Chr # bug: crash prevention workaround (http://forum.doom9.org/showthread.php?p=1546684#post1546684)
  162.  
  163. # 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
  164. # 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.
  165. pref   = !GlobalR ? ( preclip        ?  prefilter                                                                  : \
  166.                     ((prefilter==-1) ?  inputP                                                                     : \
  167.                      (prefilter==0)  ?  input8.MinBlur(0,Chr,planar)                                               : \
  168.                      (prefilter==1)  ?  input8.MinBlur(1,Chr,planar)                                               : \
  169.                      (prefilter==2)  ?  input8.MinBlur(2,Chr,planar)                                               : \
  170.                      (prefilter==3)  ?  (!planar && lsb ? Dither_merge16_8(inputP.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(),                                \
  171.                                                                    lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 65535 19200 4096 - / * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr,   v=Chr)                                           \
  172.                                                                          :inputP.mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=chroma,                       u=Chr2,  v=Chr2)                                                       : \
  173.                                  avs26 && planar && lsb ? Dither_merge16_8(inputP.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(),                                \
  174.                                                                    lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 65535 19200 4096 - / * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr,   v=Chr)                                           \
  175.                                                                          :inputP.Planar2Interleaved().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()                                                       : \
  176.                                            planar && avs26 ? mt_merge(           Dfttest(!lsb_in?inputP.Planar2Interleaved(!chroma):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().ConvertToYV16():input8y.ConvertToYV16(),                                                   \
  177.                                                                           input8y.Planar2Interleaved().ConvertToYV16().mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=planar?false:chroma,          u=bug_wa,v=bug_wa).ConvertToYUY2().Interleaved2planar()                                                    : \
  178.                                                              mt_merge( planar ?  Dfttest(!lsb_in?inputP.Planar2Interleaved(!chroma):input8y,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1).Interleaved2planar(!chroma)                          : \
  179.                                                                                  Dfttest(        inputP,                                    sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1),!lsb_in?input8y:input8y.Interleaved2planar(!chroma),   \
  180.                                                                           input8y.mt_lut(      "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=planar?false:chroma,          u=bug_wa,v=bug_wa))                                                   : \
  181.                      (prefilter==4)  ?  eval("""
  182.                                              # In a more lucid state I could probably have laid out this block much better... or not...
  183.                                              fullchr = inputP.isyv24()
  184.                                              chr422 = inputP.isyv16() || planar
  185.                                              NL_in   = !chr422 ? (lsb_in || !lsb ? inputP : input8.Dither_convert_8_to_16()) : Interlaced ? (if5 ? lsb ? input.AssumeTFF().SeparateFields().Dither_convert_8_to_16() : input.AssumeTFF().SeparateFields() : lsb ? input.AssumeBFF().SeparateFields().Dither_convert_8_to_16() : input.AssumeBFF().SeparateFields()) : (lsb_in || !lsb ? input : input.Dither_convert_8_to_16())
  186.                                              NL_W    = !fullchr ? width(NL_in) : nop()
  187.                                              U8      = (chroma || chr422) && !fullchr ? UToY8(NL_in) : nop()
  188.                                              V8      = (chroma || chr422) && !fullchr ? VToY8(NL_in) : nop()
  189.                                              NL_lsb  = chroma && !fullchr ? (!chr422 ?           StackVertical(StackVertical(Dither_get_msb(u8),Dither_get_msb(v8)),\
  190.                                                                                      StackVertical(Dither_get_lsb(u8),Dither_get_lsb(v8)))              :\
  191.                                                                                      StackHorizontal(u8,v8)) : nop()
  192.  
  193.                                              nlc      = chroma && !fullchr ? (!chr422 ? StackHorizontal(ConvertToY8(NL_in),NL_lsb) : \
  194.                                                                            StackHorizontal(StackVertical(Dither_get_msb(ConvertToY8(NL_in)),Dither_get_lsb(ConvertToY8(NL_in))),NL_lsb)) : \
  195.                                                                 (!chr422 ? NL_in : NL_in.converttoYV16())
  196.  
  197.                                              nlc      = nlc.KNLMeansCL(D=1, A=1, h=7.0,lsb_inout=lsb_in || lsb,device_type="GPU",cmode=chroma && fullchr)
  198.  
  199.                                              my      = chr422 ? lsb_in || lsb ? nlc.Dither_get_msb().crop(0,0,chroma && !fullchr ? -NL_W:0,0) : nlc.crop(0,0,chroma && !fullchr ? -NL_W:0,0) : nop()
  200.                                              ly      = chr422 && (lsb_in || lsb) ? nlc.Dither_get_lsb().crop(0,0,chroma && !fullchr ? -NL_W:0,0) : nop()
  201.  
  202.                                              chroma && !fullchr ? eval ("
  203.                                               u_h = lsb_in || lsb ? u8.height()/2 : u8.height()
  204.                                               v_h = lsb_in || lsb ? v8.height()/2 : v8.height()
  205.  
  206.                                               u16 = !chr422 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,0,0,-v_h),Dither_get_lsb(nlc).crop(NL_W,0,0,-v_h)) : nlc.crop(NL_W,0,0,-v_h)                : \
  207.                                                               lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,0,-NL_W/2 ,0),Dither_get_lsb(nlc).crop(NL_W,0,-NL_W/2 ,0)) : nlc.crop(NL_W,0,-NL_W/2 ,0)
  208.                                               v16 = !chr422 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,u_h, 0,0),Dither_get_lsb(nlc).crop(NL_W,u_h, 0,0)) : nlc.crop(NL_W,u_h, 0,0)                : \
  209.                                                               lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W+NL_W/2,0,0,0),Dither_get_lsb(nlc).crop(NL_W+NL_W/2,0,0,0)) : nlc.crop(NL_W+NL_W/2,0,0,0)
  210.  
  211.                                               !chr422 ? YToUV(u16,v16,nlc.crop(0,0,-u8.width(),0)) : planar ? YToUV(u16, v16, lsb_in || lsb ? StackVertical(my, ly) : my).converttoyuy2() : YToUV(u16, v16, lsb_in || lsb ? StackVertical(my, ly) : my) ") : \
  212.                                            planar ? nlc.converttoyuy2() : nlc  """)                                   : \
  213.                       Assert(false,    "Mode must be between -1~3: "+string(prefilter))))                                                                                           : \
  214.                       input8
  215.  
  216.  
  217.  
  218.  
  219.  
  220. # Default Auto-Prefilter - Luma expansion TV->PC (up to 16% more values for motion estimation)
  221.  
  222. pref   = avs26 && planar && ((lsb_in && prefilter==-1)) ? pref.Dither_YUY2toInterleaved16().Interleaved2planar() : pref
  223. pref16 = (Height(pref)) == (Height(input8)*2) ? true : false
  224. pref   = !GlobalR ? (!yuy25 && lsb ? ((!preclip ? ((lsb_in && prefilter==-1) || prefilter==3 || prefilter==4 ) : false)          ? \
  225.                      !TV_range ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2)                                      : \
  226.                      pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb_in=true,uv=Chr2)                                      : \
  227.                      !TV_range ? pref16 ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2) : pref                                      : \
  228.                      pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb   =lsb,lsb_in=pref16,uv=Chr2))                       : \
  229.                                       ((!preclip ?  (lsb_in && prefilter==-1)                                   : false)                                 ? \
  230.                      !TV_range ? pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma)   : \
  231.                      pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma).Dither_Luma_Rebuild(S0=Str,c=Amp,uv=Chr   )   : \
  232.                      !TV_range ? pref16 ? pref.Dither_YUY2toPlanar16().Ditherpost(mode=6,slice=slices,u=bug_wa,v=bug_wa).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : pref                                  : \
  233.                      pref.                                                    Dither_Luma_Rebuild(S0=Str,lsb_in=pref16,slice=slices,c=Amp,uv=bug_wa)))                                  : \
  234.                      pref
  235.  
  236.  
  237.  
  238.  
  239.  
  240. (sShow ? false : !Show) ? eval("""
  241.  
  242.  
  243. # Subpixel 3
  244.  
  245. 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()
  246. 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()
  247.  
  248.  
  249.  
  250.  
  251. # Motion vectors search
  252.  
  253.  
  254. super_search =                             pelclip ? MSuper(pref,     pel=pel,               chroma=chroma, hpad=hpad, vpad=vpad,          pelclip=pclip,  rfilter=4, planar=planar) : \
  255.                                                     MSuper(pref,     pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad                        ,  rfilter=4, planar=planar)
  256. super_render = !GlobalR ?                 (pelclip ? MSuper(input8,   pel=pel,               chroma=plane0, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip2           , planar=planar) : \
  257.                                                     MSuper(input8,   pel=pel,sharp=subpixel,chroma=plane0, hpad=hpad, vpad=vpad,levels=1                           , planar=planar)): super_search
  258. Recalculate  = !GlobalR && RefineMotion ? (pelclip ? MSuper(pref,     pel=pel,               chroma=chroma, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip            , planar=planar) : \
  259.                                                     MSuper(pref,     pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad,levels=1                           , planar=planar)): nop()
  260. !if3  ? eval("
  261. bv6  =   interlaced && (tr > 2)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 6,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         bv6) :  nop()
  262. bv6  =   interlaced && (tr > 2) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv6,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  bv6
  263. bv4  =   interlaced && (tr > 1)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 4,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         bv4) :  nop()
  264. bv4  =   interlaced && (tr > 1) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv4,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  bv4
  265. bv3  =  !interlaced ? ((tr > 2)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 3,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         bv3) :  nop()) : nop()
  266. bv3  =  !interlaced ? ((tr > 2  && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, bv3,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  bv3               )   : nop()
  267. bv2  =  (interlaced ||  tr > 1)                  ? (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 2,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         bv2) :  nop()
  268. bv2  = ((interlaced ||  tr > 1) && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, bv2,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  bv2
  269. bv1  =  !interlaced ?                              (!GlobalR  ? super_search.MAnalyse(isb = true, delta = 1,  overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         bv1        ) : nop()
  270. bv1  =  !interlaced ?            ( RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, bv1,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  bv1               ) : nop()
  271.  
  272. fv1  =  !interlaced ?                              (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 1, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         fv1        ) : nop()
  273. fv1  =  !interlaced ?            ( RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv1,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  fv1               ) : nop()
  274. fv2  =  (interlaced ||  tr > 1)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 2, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         fv2) :  nop()
  275. fv2  = ((interlaced ||  tr > 1) && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, fv2,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  fv2
  276. fv3  =  !interlaced ? ((tr > 2)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 3, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         fv3) :  nop()) : nop()
  277. fv3  =  !interlaced ? ((tr > 2  && RefineMotion &&  !GlobalR) ?   MRecalculate           (Recalculate, fv3,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  fv3               )   : nop()
  278. fv4  =   interlaced && (tr > 1)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 4, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         fv4) :  nop()
  279. fv4  =   interlaced && (tr > 1) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv4,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  fv4
  280. fv6  =   interlaced && (tr > 2)                  ? (!GlobalR  ? super_search.MAnalyse(isb = false, delta = 6, overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma, truemotion=truemotion) :         fv6) :  nop()
  281. fv6  =   interlaced && (tr > 2) && RefineMotion &&  !GlobalR  ?   MRecalculate           (Recalculate, fv6,   overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) :  fv6 " )     : \
  282. \
  283. eval("
  284. tr2    = tr*2
  285. vmulti =                   !GlobalR ? super_search.MAnalyse( multi=true,overlap=    overlap,blksize=    blksize,   search=search,chroma=chroma,truemotion=truemotion, delta = interlaced ? tr2 : tr) : vmulti
  286. vmulti = RefineMotion   ? (!GlobalR ? MRecalculate (Recalculate, vmulti,overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma,truemotion=truemotion,    tr = interlaced ? tr2 : tr) : vmulti) : vmulti
  287. vmulti =                   !GlobalR ? (interlaced ? vmulti.SelectEvery (4, 2, 3) : vmulti) : vmulti.SelectRangeEvery (Rtr*2, tr2, 0, false)")
  288.  
  289.  
  290.  
  291. # Finally, MDegrain
  292.  
  293.  
  294. output  = !GlobalO ? (interlaced ?
  295. \        ((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) :
  296. \                 (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) :
  297. \                 (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) :
  298. \                             mfilter.MDegrain1(super_render, bv2, fv2,                                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true)):
  299. \                    ( 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):
  300. \                 (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)          :
  301. \                 (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)          :
  302. \                             mfilter.MDegrain1(super_render, bv2, fv2,                                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar))))       :
  303. \         (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) :
  304. \                 (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) :
  305. \                 (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) :
  306. \                             mfilter.MDegrain1(super_render, bv1, fv1,                                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true)):
  307. \                    ( 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):
  308. \                 (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)          :
  309. \                 (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)          :
  310. \                             mfilter.MDegrain1(super_render, bv1, fv1,                                         thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar))))       : nop()
  311.  
  312.  
  313. # LSB_IN merging
  314.  
  315. outputI= !GlobalO && planar && (lsb || ifC) ? output.Planar2Interleaved()                                                                                             : nop()
  316. !GlobalO && lsb   ? eval("
  317. blnkclp= lsb_in  || (if2 && !planar) ? BlankClip (lsb_in?input8h:input8, pixel_type="+Chr(34)+"YV12"+Chr(34)+", color_yuv=0)                                          : nop()
  318. output = lsb && planar               ? Dither_YUY2toPlanar16(outputI)                                                                                                 : output
  319. 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()
  320.  
  321.  
  322.  
  323.  
  324. # Contrasharp (only sharpens luma)
  325.  
  326. ifC && if0 && if4 ? eval("
  327. global Super           = super_render
  328. global cb1             = !if3 ? (interlaced ? bv2 : bv1) : vmulti.SelectEvery (tr2, 0)
  329. global cf1             = !if3 ? (interlaced ? fv2 : fv1) : vmulti.SelectEvery (tr2, 1)") : nop()
  330.  
  331. !GlobalO && if0   ? eval("
  332.  
  333. CCh   =       if1 ? CClip.height() : nop()
  334. ref8  =       if1 ? (h == CCh*2)   : nop()
  335. ref16 =       if1 ? (h == CCh/2)   : nop()
  336.  
  337. interlaced && if1 ? Assert(!ref16, "+Chr(34)+"Interlaced 16 bit stacked CClip is not a recognized format"+Chr(34)+")         : nop()
  338.  
  339. CClip = planar ?  (if1 ?  (lsb_in ? (ref8 ? CClip.Interleaved2planar(true) : CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true))                         : \
  340.                                      (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields().Interleaved2planar(true) : CClip.AssumeBFF().SeparateFields().Interleaved2planar(true))                                : \
  341.                                      (ref16 ? CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true) : CClip.Interleaved2planar(true))))                     : \
  342.                           (lsb_in ?  inputY.DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true)                                                                                         : \
  343.                                      inputP))                                                                                                                                                                       : \
  344.                   (if1 ?  (lsb_in ? (ref8 ? CClip : CClip.DitherPost(mode=-1,u=1,v=1))                                                                                                                              : \
  345.                                      (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields()                          : CClip.AssumeBFF().SeparateFields()) : (ref16 ? CClip.DitherPost(mode=-1,u=1,v=1) : CClip))) : \
  346.                           (lsb_in ?  input.DitherPost(mode=-1,u=1,v=1)                                                                                                                                              : \
  347.                                      inputP))")                                                                                                                                                                     : nop()
  348.  
  349.  
  350. !GlobalO && if2   ? eval("
  351. OutTO8  = output.DitherPost(mode=-1,u=1,v=1)
  352. OutTO8P = planar  ? OutTO8.Dither_YUY2toInterleaved()                                                                                               : nop()
  353. ctr16   = ifC     ? ContrasharpeningHD (planar ? OutTO8P.Interleaved2planar(true):OutTO8, CClip, planar=planar, HD=if4)                             : \
  354.                     LSFmod(OutTO8,source=CClip,defaults="+Chr(34)+"slow"+Chr(34)+",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0)
  355.  
  356.  
  357. ctr16P  = planar  ? ctr16.Planar2Interleaved(true)  : ctr16
  358. ctr16   = StackVertical (ctr16P, planar ? BlankClip  (ctr16P, pixel_type="+Chr(34)+"YUY2"+Chr(34)+", color_yuv=0,length=1) : blnkclp )
  359. 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)
  360. ctr16   = MergeChroma(ctr16, output)                                                                                                     ")         : nop()
  361.  
  362.  
  363.  
  364. # Globals Output
  365.  
  366. GlobalO || Globals == 2  ? (!if3 ? eval("
  367. global Super           = super_render
  368. global bv6             = bv6
  369. global bv4             = bv4
  370. global bv3             = bv3
  371. global bv2             = bv2
  372. global bv1             = bv1
  373.  
  374. global fv1             = fv1
  375. global fv2             = fv2
  376. global fv3             = fv3
  377. global fv4             = fv4
  378. global fv6             = fv6
  379. ") : eval("
  380. global bv1             =                                            vmulti.SelectEvery (tr2, 0)
  381. global bv2             = interlaced ? bv1                         : vmulti.SelectEvery (tr2, 2)
  382. global bv3             =                                            vmulti.SelectEvery (tr2, 4)
  383. global bv4             = interlaced ? vmulti.SelectEvery (tr2, 2) : nop()
  384. global bv6             = interlaced ? bv3                         : nop()
  385.  
  386. global fv1             =                                            vmulti.SelectEvery (tr2, 1)
  387. global fv2             = interlaced ? fv1                         : vmulti.SelectEvery (tr2, 3)
  388. global fv3             =                                            vmulti.SelectEvery (tr2, 5)
  389. global fv4             = interlaced ? vmulti.SelectEvery (tr2, 3) : nop()
  390. global fv6             = interlaced ? fv3                         : nop()
  391. global Super           = super_render
  392. global vmulti          = vmulti
  393. global Rtr             = tr")) : nop()
  394.  
  395.  
  396.  
  397. # Output
  398.  
  399. !GlobalO ? (lsb_out ? (if0 ? ctr16 : output)  : \
  400.                      (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))                                              : \
  401.                                     (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()) : \
  402.                                                   (ifC ? ContraSharpeningHD(output, CClip, planar=planar, HD=if4)                      : LSFmod(output,source=CClip,defaults="slow",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0))))       : \
  403.                             (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))))    \
  404.         :  input
  405.  
  406. !GlobalO ? (planar ? (lsb ? Dither_YUY2toInterleaved() : (if0 ? MergeChroma(Planar2Interleaved(true), interlaced ? outputI.weave() : outputI) : Planar2Interleaved())) : last) : last """) : \
  407.  \
  408.  \
  409.  \
  410.  \
  411.  \
  412. eval("""
  413.  
  414. ##############
  415. # SHOW PANEL #
  416. ##############
  417.  
  418.  
  419.  # Common Variables
  420.  
  421. h     = lsb_in ? h/2 : h
  422. w2    = w*1.0
  423. h2    = h*1.0
  424. hi    = interlaced ? round(h/2.0) : h
  425. AR    = w2/h2
  426. lsp   = interlaced?15:30
  427. lsp   = AR < 1.9 ? lsp : floor(AR < 1.9 ? lsp : ((AR>2.4) ? 0 : lsp-((AR-1.9)*(lsp/(2.4-1.9)))))
  428. ys    = round(lsb_in ? h2/6 : (interlaced?h2/15:h2/6))
  429. s     = floor(((interlaced?w2/1.6:w2)/720.0)*16.0)
  430. type  = planar?"YUY2":"YV12"
  431.  
  432. Wadd  = w2/40
  433. Wadd2 = Wadd/2
  434. w1    = round(w2+Wadd+Wadd2)
  435. w3    = (w2/3)+Wadd/2.1
  436. w2    = round(w1+w3)
  437. w3    = round(w1+(w3+Wadd2)*1.96)
  438. w3sq  = string(round(w3*1.01))
  439. w3s   = string(w3)
  440.  
  441.  # Panel Separator
  442.  
  443. blkclp = BlankClip(interlaced?assumeframebased(pref):pref,length=1,pixel_type=type,color=$161616)
  444.         \.crop(0,interlaced?h/2%8:h%8,0,0).separatefields().assumeframebased().separatefields()
  445.  
  446. Interleave(selecteven(blkclp).addborders(2,0,0,0,color=$7f7f7f).crop(0,0,-2,0),selectodd(blkclp))
  447.  
  448. WOut=weave().assumefieldbased().weave()
  449. sep=round((hi-height(WOut))/2.0)
  450.  
  451. StackHorizontal(planar? pref.Planar2Interleaved() : pref,WOut.addborders(0,sep-sep%2,0,hi-(height(WOut)+(sep-sep%2)),color=$161616))
  452.  
  453.  
  454.  
  455.  # Color Guide Squares
  456.  
  457. a=interlaced?h*0.37:h*0.74
  458. b=interlaced?h*0.40:h*0.80
  459. c=interlaced?h*0.43:h*0.86
  460.  
  461. !planar ? 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()
  462. !planar ? 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()
  463. !planar ? 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()
  464.  
  465.  
  466.  # Parameters List
  467.  
  468. blue  = sShow ? (show=="Speed"   ? true : false) : false
  469. red   = sShow ? (show=="Memory"  ? true : false) : false
  470. yellow= sShow ? (show=="Quality" ? true : false) : false
  471.  
  472. Color = sShow ? (blue   ? $00aef0 : \
  473.                 red    ? $ff0000 : \
  474.                 yellow ? $ffff00 : \
  475.                 Assert(false,    "Revise typo for possible color guide modes: 'Speed','Memory','Quality'")) : nop()
  476.  
  477.  
  478.  
  479. varn = "\n\n\n\n\n"
  480. sp   = !GlobalR && str==1.0 ? "  " : ""
  481.  
  482. 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))
  483.  
  484. Subtitle("BASIC"   ,lsp=lsp,text_color=$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  485. Subtitle(            "\n\ntr           = " + string(tr)                                                                              + \
  486.         varn+varn+      "chroma       = " + string(chroma)                                                                          ,lsp=lsp,text_color=red||blue               ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  487. Subtitle(          "\n\n\nthSAD(C)     = " + string( GlobalO?"bypass":string(thSAD)     + "(" + string(plane0?thSADC:"bypass") + ")")+ \
  488.         varn+           "CClip        = " + string( GlobalO?"bypass":(defined(CClip)?"defined":"undefined"))                        + \
  489.                     "\n\nInterlaced   = " + string(interlaced)                                                                      ,lsp=lsp,text_color=                               $ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  490. Subtitle(varn+           "RefineMotion = " + string( GlobalO?"bypass":RefineMotion)                                                  ,lsp=lsp,text_color=yellow                  ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
  491. 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)
  492. 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)
  493. 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))
  494.  
  495. Subtitle("ADVANCED",lsp=lsp,text_color=$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  496. Subtitle(              "\n\npel        = " + string(pel)                                                                             ,lsp=lsp,text_color=red                     ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  497. 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)
  498. 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)
  499. 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)
  500. Subtitle(varn+         "\n\nStr        = " + (GlobalR?string("bypass"):string(Str,"%1.2f"))+sp+" Brightness"                         + \
  501.         varn+             "search     = " + string( GlobalR?"bypass":search)                                                        ,lsp=lsp,text_color=yellow&&!GlobalR        ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  502. Subtitle(varn+varn+        "blksize    = " + string( GlobalR?"bypass":blksize)                                                       + \
  503.                         "\noverlap    = " + string( GlobalR?"bypass":overlap)                                                       ,lsp=lsp,text_color=(red||blue)&&!GlobalR   ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  504. 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)"))) + \
  505.                       "\n\nAmp        = " + (GlobalR||str==1.0?string("bypass"):string(Amp,"%1.2f"))+" Amplitude"                   + \
  506.         varn+           "\nlimit(C)   = " + (GlobalO?string("bypass"):string(limit)     + "(" + string(limitc) + ")")               ,lsp=lsp,text_color=                               $7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
  507.  
  508. Subtitle("OTHERS"  ,lsp=lsp,text_color=$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  509. Subtitle(             "\n\n\nthSCD1(2) = " + (GlobalO?string("bypass"):string(thSCD1) + "(" + string(thSCD2) + ")")                  + \
  510.                   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)
  511. Subtitle(          varn+"\n\nslices    = " + string(slices)                                                                          ,lsp=lsp,text_color=blue                    ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  512. 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)
  513. Subtitle(varn+              "lsb       = " + string(lsb)                                                                             ,lsp=lsp,text_color=yellow                  ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
  514. 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)
  515. 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)
  516.  
  517. Subtitle("   Speed"   ,lsp=interlaced?15:30,text_color=planar?$00aef0:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(a-1))
  518. Subtitle("   Memory"  ,lsp=interlaced?17:34,text_color=planar?$ff0000:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(b-1))
  519. Subtitle("   Quality" ,lsp=interlaced?19:38,text_color=planar?$ffff00:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(c-1))
  520.  
  521. lsb_out ? StackVertical (last, BlankClip (last, pixel_type=type, color_yuv=0,length=1)) : last""")}
  522.  
  523.  
  524.  
  525.  
  526.  
  527. ########################################################
  528. #                                                      #
  529. # HELPER FUNCTIONS: For Contrasharp and YUY2 handling  #
  530. #                                                      #
  531. ########################################################
  532.  
  533. ########################################
  534. ## Didée's functions:
  535.  
  536.  # contra-sharpening: sharpen the denoised clip, but don't add more to any pixel than what was removed previously.
  537.  # script function from Didée, at the VERY GRAINY thread (http://forum.doom9.org/showthread.php?p=1076491#post1076491)
  538.  
  539.  # In final version 2.0d ContraHD() was merged, to allow proper HD sharpening.
  540.  # In this case global variables of (before denoising) source MSuper and forward and backward
  541.  # compensated motion vectors are necessary as: Super, cb1 and cf1, if used as a stand alone function.
  542.  # Don't know who made (mod) it, so I can't give proper credits, sorry.
  543.  
  544. FUNCTION ContraSharpeningHD(clip denoised, clip original, bool "HD", bool "planar", int "overshoot"){
  545. HD        = default(HD    ,false)
  546. planar    = default(planar,false)
  547. overshoot = default(overshoot,0)
  548. avs26 = VersionNumber() < 2.60 ? false : true
  549. yuy26 = avs26 && Isyuy2(denoised) && planar
  550.  
  551. HD ? eval("""
  552. cb1=original.MCompensate(Super, cb1, planar=planar)
  553. cf1=original.MCompensate(Super, cf1, planar=planar)
  554. 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")
  555. 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()
  556.  
  557. s    = denoised.MinBlur(HD?2:1,1,planar=planar)                                   # Damp down remaining spots of the denoised clip.
  558. s    = yuy26 ? s.Planar2Interleaved().ConvertToYV16() : s
  559. original = yuy26 ? original.Planar2Interleaved().ConvertToYV16() : original
  560. denoised = yuy26 ? denoised.Planar2Interleaved().ConvertToYV16() : denoised
  561. allD = mt_makediff(original,denoised)                                             # The difference achieved by the denoising.
  562. ssD  = mt_makediff(s,HD?s.removegrain(20,-1,planar=planar).\
  563.                           removegrain(20,-1,planar=planar):\
  564.                         s.removegrain(11,-1,planar=planar))                       # The difference of a simple kernel blur.
  565. allD = yuy26 ? allD.ConvertToYUY2().Interleaved2planar() : allD
  566. ssD  = yuy26 ? ssD.ConvertToYUY2().Interleaved2planar() : ssD
  567. 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.
  568. ssDD = yuy26 ? ssDD.Planar2Interleaved().ConvertToYV16() : ssDD
  569. ssD  = yuy26 ? ssD.Planar2Interleaved().ConvertToYV16() : ssD
  570. ssDD = SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?")                       # abs(diff) after limiting may not be bigger than before.
  571.  
  572. denoised.mt_adddiff(ssDD,U=2,V=2)                                                 # Apply the limited difference. (Sharpening is just inverse blurring)
  573. HD ? mt_clamp(last,pmax,pmin,overshoot,overshoot,chroma="copy first") : last
  574. yuy26 ? last.ConvertToYUY2().Interleaved2planar() : last
  575. }
  576.  
  577.  # MinBlur   by Didée (http://avisynth.org/mediawiki/MinBlur)
  578.  # Nifty Gauss/Median combination (Modified for Planar input)
  579.  
  580. function MinBlur(clip clp, int "r", int "uv", bool "planar"){
  581.  
  582. r      = default(r,1)
  583. uv     = default(uv,3)
  584. planar = default(planar,false)
  585. avs26 = VersionNumber() < 2.60 ? false : true
  586. yuy26 = avs26 && Isyuy2(clp) && planar
  587.  
  588. uv2    = (uv==2) ? 1  : uv
  589. rg4    = (uv==3) ? 4  : -1
  590. rg11   = (uv==3) ? 11 : -1
  591. rg20   = (uv==3) ? 20 : -1
  592. uvm2   = r==2 ? (uv==3?2:uv==2?0:-1) : nop()
  593. uvm3   = r==3 ? (uv==3?3:uv==2?0:-1) : nop()
  594. medf   = (uv==3) ? 1 : -200
  595.  
  596. RG11D = (r==0) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.sbr(planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.sbr(planar=planar),U=uv2,V=uv2)
  597.  \    : (r==1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar),U=uv2,V=uv2)
  598.  \    : (r==2) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2)
  599.  \    :          yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2)
  600. RG4D  = (r<=1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(4,rg4,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(4,rg4,planar=planar),U=uv2,V=uv2)
  601.  \    : (r==2) ? avs26 ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.Planar2Interleaved().ConvertToYV16().medianblur(2,2*medf,2*medf),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : 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)
  602.  \    :          avs26 ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.Planar2Interleaved().ConvertToYV16().medianblur(3,3*medf,3*medf),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : 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)
  603. DD    = yuy26 ? mt_lutxy(RG11D.Planar2Interleaved().ConvertToYV16(),RG4D.Planar2Interleaved().ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
  604. return (yuy26 ? clp.Planar2Interleaved().ConvertToYV16().mt_makediff(DD.Planar2Interleaved().ConvertToYV16(),U=uv,V=uv).ConvertToYUY2().Interleaved2planar() : clp.mt_makediff(DD,U=uv,V=uv)) }
  605.  
  606.  
  607.  # helper function: make a highpass on a blur's difference (well, kind of that)
  608.  # Highpass of spatial r=1 Gaussian (like blur(1.0)) (Modified for Planar input)
  609.  
  610. function sbr(clip c, bool "planar") {
  611.  
  612. planar = default(planar,false)
  613. avs26 = VersionNumber() < 2.60 ? false : true
  614. yuy26 = avs26 && Isyuy2(c) && planar
  615.  
  616. rg11   = c.removegrain(11,-1,planar=planar)
  617. rg11D  = yuy26 ? mt_makediff(c.Planar2Interleaved().ConvertToYV16(),rg11.Planar2Interleaved().ConvertToYV16()).ConvertToYUY2().Interleaved2planar() : mt_makediff(c,rg11)
  618. rg11DD = yuy26 ? mt_makediff(rg11D.Planar2Interleaved().ConvertToYV16(),rg11D.removegrain(11,-1,planar=planar).Planar2Interleaved().ConvertToYV16()).mt_lutxy(rg11D.Planar2Interleaved().ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?").ConvertToYUY2().Interleaved2planar() : 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 ? ?")
  619. yuy26 ? c.Planar2Interleaved().ConvertToYV16().mt_makediff(rg11DD.Planar2Interleaved().ConvertToYV16(),U=2,V=2).ConvertToYUY2().Interleaved2planar() : c.mt_makediff(rg11DD,U=2,V=2) }
  620.  
  621. ########################################
  622. ## cretindesalpes' functions: (http://forum.doom9.org/showthread.php?p=1505297#post1505297)
  623.  
  624. # Converts 16 bit interleaved YUY2 to 16bit planar YUY2 suitable for Ditherpost. (Use right before Ditherpost; this format is not suitable for filtering)
  625.  
  626. function Dither_YUY2toPlanar16(c){c
  627. yuy26   = !(VersionNumber() < 2.60) && isyuy2(c)
  628. my = !yuy26 ? Dither_get_msb().ConvertToYV12() : nop()
  629. ly = !yuy26 ? Dither_get_lsb().ConvertToYV12() : nop()
  630. u = !yuy26 ? UToY ().ConvertToYV12 () : nop()
  631. v = !yuy26 ? VToY ().ConvertToYV12 () : nop()
  632. yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (StackVertical (my, my), StackVertical (ly, ly)))}
  633.  
  634.  
  635. # Converts 8 bit interleaved YUY2 to 8 bit planar YUY2 ready for either 8 or 16 bit processing also suitable for Ditherpost
  636.  
  637. function Dither_YUY2toPlanar(c){c
  638. yuy26   = !(VersionNumber() < 2.60) && isyuy2(c)
  639. y = !yuy26 ? ConvertToYV12 () : nop()
  640. u = !yuy26 ? UToY ().ConvertToYV12 () : nop()
  641. v = !yuy26 ? VToY ().ConvertToYV12 () : nop()
  642. yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (y, y))}
  643.  
  644.  
  645. # Converts back the above special planar formats to normal interleaved 16 bit YUY2
  646.  
  647. function Dither_YUY2toInterleaved16(c){c
  648. yuy26   = !(VersionNumber() < 2.60)
  649. y = !yuy26 ? StackVertical (Crop (0, 0, 0, (Height () /(4))), Crop (0, (Height () /(2))+(Height () /(4)), 0, 0)).ConvertToYUY2 () : nop()
  650. u = !yuy26 ? UToY ().ConvertToYUY2 () : nop()
  651. v = !yuy26 ? VToY ().ConvertToYUY2 () : nop()
  652. yuy26 ? ConvertToYUY2() : YToUV (u, v, y)}
  653.  
  654. # Converts back the above special planar formats to normal interleaved YUY2
  655.  
  656. function Dither_YUY2toInterleaved(c){c
  657. yuy26   = !(VersionNumber() < 2.60)
  658. y = !yuy26 ? Crop (0, 0, 0, Height () /(2)).ConvertToYUY2 () : nop()
  659. u = !yuy26 ? UToY ().ConvertToYUY2 () : nop()
  660. v = !yuy26 ? VToY ().ConvertToYUY2 () : nop()
  661. yuy26 ? ConvertToYUY2() : YToUV (u, v, y)}
  662.  
  663.  
  664.  
  665. # 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)
  666. # By courtesy of cretindesalpes. (http://forum.doom9.org/showthread.php?p=1548318#post1548318)
  667.  
  668. 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"){
  669. lsb_in  = Default( lsb_in  ,false)
  670. lsb_out = Default( lsb_out ,false)
  671. lsb     = Default( lsb     ,lsb_in || lsb_out)
  672. mode    = Default( mode ,6)
  673. uv      = Default(uv,    3)
  674. s0      = Default(s0,  2.0)
  675. c       = Default(c,  1.0/16)
  676. ampn    = Default(ampn, 0.0)
  677. slice   = Default(slice, true)
  678. yuy26   = !(VersionNumber() < 2.60) && isyuy2(src)
  679. src     = yuy26 ? src.Planar2Interleaved().ConvertToYV16() : src
  680.  
  681.     k = (s0 - 1) * c
  682.     t = lsb_in ? "x 4096 - 56064 / 0 1 clip" : "x 16 - 219 / 0 1 clip"
  683.     e = String(k)+" "+String(1+c)+" "+String((1+c)*c)+" "+t+" "+String(c)
  684. \       +" + / - * "+t+" 1 "+String(k)+" - * + "+String(lsb?65536:255)+" *"
  685. src
  686. lsb ? (lsb_in ? Dither_lut16 (yexpr=e,expr="x 32768 - 32768 * 28672 / 32768 +",y=3, u=uv, v=uv)   : \
  687.                 Dither_lut8  (yexpr=e,expr="x 128 - 32768 * 112 / 32768 +"    ,y=3, u=uv, v=uv))  : \
  688.                 mt_lut       (yexpr=e,expr="x 128 - 128 * 112 / 128 +"        ,y=3, u=uv, v=uv)
  689. lsb_out ? last : (lsb ? Ditherpost(mode=mode,ampn=ampn,slice=slice,staticnoise=ampn!=0.0?true:false,u=uv,v=uv) : last)
  690. return yuy26 ? last.ConvertToYUY2().Interleaved2planar() : last
  691. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×