Guest User

Untitled

a guest
Oct 16th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ###
  3. ### Pass 1
  4. ### Deinterlacing, blending removal and conversion to 24p
  5. ###
  6.  
  7.  
  8. # ep_str must be defined at this point.
  9.  
  10. SetMemoryMax (1100)
  11.  
  12. Import ("cut.avsi")
  13. Import ("merge-seg.avsi")
  14. Import ("fslg_blend.avsi")
  15.  
  16.  
  17. (seg_str == "")
  18. \   ? fslg_cat_seg_undet_end (ep_str, "0", 0, threads=2)
  19. \   : fslg_load_seg (ep_str, "0", seg_str, 30*60*1, threads=2)
  20.  
  21.  
  22.  
  23. ##################################################
  24.  
  25.     debug = false
  26.     compa = 0
  27.  
  28. ##################################################
  29.  
  30.  
  31.  
  32.  
  33. c_org = last
  34. w = Width ()
  35. h = Height ()
  36.  
  37. # -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  38.  
  39. c_mask_3f = find_3field_mask ()
  40. c_dw      = DoubleWeave ()
  41. c_deint60 = QTGMC (lossless=2, tr0=1, tr1=1, tr2=1, EdiThreads=2)
  42. len_2x    = c_dw.FrameCount ()
  43.  
  44. c_deint60_x = StackVertical (c_deint60, c_deint60.BlankClip (height=4, color_yuv=$FF8080), c_mask_3f)
  45. c_dw_x      = StackVertical (c_dw,      c_dw     .BlankClip (height=4, color_yuv=$008080), c_mask_3f)
  46.  
  47. tfm60_x = c_dw_x.Loop (-1).TFM (
  48. \   y0=h,
  49. \   y1=c_dw_x.Height () - 1,
  50. \   clip2=c_deint60_x.Loop (-1),
  51. \   PP=4,
  52. \   MI=60,
  53. \   ovr="ep-"+ep_str+"-tfm-override.txt",
  54. \   display=debug
  55. \ ).Trim (0, -len_2x)
  56.  
  57. tfm60      = tfm60_x.Crop (0, 0, 0, h)
  58. c_aa       = tfm60.daa_mod (threads=3, nns=4)
  59.  
  60.  
  61. # -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  62.  
  63. c_all = StackVertical (c_aa, tfm60_x)
  64.  
  65. c_blend24 = c_all.SRestore (frate=24000.0/1001.0, dclip=c_aa, cache=-1)
  66. c_blend24 = c_blend24.RequestLinear (elim=20)
  67. c_ivtc24  = c_org.TFM (PP=0).TDecimate (mode=1, clip2=c_all.SelectEven ())
  68.  
  69. c_blend24.ReplaceFramesSimple_oor (c_ivtc24, mappings=stdivtc_str)
  70. AssumeFps (24000, 1001)
  71. c_all24 = last
  72.  
  73.  
  74. # -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  75.  
  76. c_aa24      = Crop (0, 0,         0, h)
  77. c_n24       = Crop (0, h,         0, h)
  78. c_mask_di24 = Crop (0, h * 2    , 0, 4).PointResize (w, h)
  79. c_mask_3f24 = Crop (0, h * 2 + 4, 0, 4)
  80.  
  81. c_vinv24    = c_n24.Vinverse ()
  82. c_vinv24    = mt_merge (c_vinv24, c_n24, c_mask_di24, luma=true)
  83. c_blur      = c_aa24.RemoveGrain (11, -1)
  84. c_mmo_soft  = c_blur.find_motion_mask (true)
  85. c_mmo_hard  = c_blur.find_motion_mask (false)
  86. c_mmo_aa    = c_mmo_hard.ReplaceFramesSimple_oor (c_mmo_soft, mappings=lessmoaa_str)
  87. c_mmo_vi    = c_mmo_hard
  88.  
  89. clean_frames_new (c_n24, c_aa24, c_vinv24, c_mask_3f24, c_mmo_aa, c_mmo_vi, comb_str, disexmask_str, forceaa_str, disableaa_str, disablevi_str)
  90.  
  91. c_24p = last
  92.  
  93.  
  94. # -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  95.  
  96.  
  97.  
  98.     (debug     ) ? tfm60_x
  99. \ : (compa == 1) ? Interleave (c_n24.Subtitle ("c_n24"), c_24p.Subtitle ("c_24p"))
  100. \ :                last
  101.  
  102.  
  103.  
  104. # -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  105.  
  106. Function fix_ep01_manual (clip src, clip c_aa)
  107. {
  108.     src
  109.  
  110.     fix1 = StackVertical (
  111. \       src.Crop (0, 0, 0, 256),
  112. \       StackHorizontal (
  113. \           src.Crop (0, 256, 400, 0),
  114. \           c_aa.Crop (400, 256, 0, 0)
  115. \       )
  116. \   )
  117.  
  118.     src.ReplaceFramesSimple_oor (fix1, mappings="[102235 102314]")
  119. }
  120.  
  121.  
  122. # -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  123.  
  124.  
  125. # Modification : nnedi3
  126. function daa_mod (clip c, int "nns", int "threads")
  127. {
  128.     nn  = c.nnedi3(field=-2, nns=nns, threads=threads)
  129.     dbl     = mt_average(selecteven(nn),selectodd(nn),U=3,V=3)
  130.     dblD    = mt_makediff(c,dbl,U=3,V=3)
  131.     shrpD   = mt_makediff(dbl,dbl.removegrain((width(c)>1100) ? 20 : 11),U=3,V=3)
  132.     DD  = shrpD.repair(dblD,13)
  133.     return dbl.mt_adddiff(DD,U=3,V=3)
  134. }
  135.  
  136.  
  137.  
  138. Function ReplaceFramesSimple_oor (clip base, clip src, string "filename", string "mappings", int "maxtime")
  139. {
  140.     maxtime = Default (maxtime, 30) # Minutes
  141.  
  142.     lsec = Int (base.FrameRate () * maxtime * 60)
  143.     len  = base.FrameCount ()
  144.     ladd = Max (lsec - len, 0)
  145.     base = base + base.BlankClip (length=ladd)
  146.     src  = src + src.BlankClip (length=ladd)
  147.     base.ReplaceFramesSimple (src, filename=filename, mappings=mappings)
  148.     Trim (0, -len)
  149. }
  150.  
  151.  
  152.  
  153. Function find_motion_mask (clip c_blur, bool lessen)
  154. {
  155.     c_blur
  156.     (lessen) ? RemoveGrain (20, -1)             : last
  157.     (lessen) ? TemporalSoften (1, 32, 255, 255) : last
  158.     mt_makediff (last, last.SelectEvery (1, 1))
  159.     mt_lut ("x 128 - abs 5 - 16 *")
  160.     mt_expand ()
  161.     mt_logic (last, last.SelectEvery (1, -1), mode="max")
  162.     RemoveGrain (20, -1)
  163. }
  164.  
  165.  
  166.  
  167. # Principe:
  168. #
  169. # En cas de mouvement, les images tenant sur 3 fields dans le pattern 3:2
  170. # ont une IVTC bizarre, qu'on pourrait décrire sous forme : (A-B-A)-(C-C)
  171. # Les 3 types de field A, B et C sont exposés différemment. Le C est moyen,
  172. # l'A est plus flou et le B est plus net. Notons que les fields A et B
  173. # appartiennent à la même image. Cet écart d'exposition semble n'apparaître
  174. # qu'en cas de mouvement, et il est très prononcé sur les pans à 24 fps.
  175. #
  176. # On commence donc par chercher les A-B-A en mouvement, qui nécessitent
  177. # un traitement particulier. En fait, on cherche la position d'un field B.
  178. # D'une part, on compare le field précédent au suivant (les A potentiels) :
  179. # ils doivent être très similaires, leur différence absolue proche de zéro.
  180. # D'autre part, on compare le field central aux deuxièmes suivant et
  181. # précédents : ils doivent être différents, si les 3 frames auquels ils
  182. # sont rattachés sont différentes.
  183. #
  184. # Une fois qu'on a trouvé et masqué le field B, on étale le masque sur
  185. # les fields A associés.
  186.  
  187. Function find_3field_mask (clip c_org)
  188. {
  189.     c_org
  190.     SeparateFields ()
  191.     RemoveGrain (20, -1)
  192.  
  193.     ScriptClip ("""
  194.  
  195.         dif_11 = mt_makediff (SelectEvery (1, -1), SelectEvery (1, +1))
  196.         dif_11 = dif_11.mt_lut ("x 128 - abs 16 *")
  197.  
  198.         dif_20 = dif_11.SelectEvery (1, -1)
  199.         dif_02 = dif_11.SelectEvery (1, +1)
  200.  
  201.         al_mid  = dif_11.AverageLuma ()
  202.         al_prev = dif_20.AverageLuma () - al_mid
  203.         al_next = dif_02.AverageLuma () - al_mid
  204.         #cmp_prev = mt_lutxy (dif_20, dif_11, expr="x y -").mt_inpand ()
  205.         #cmp_next = mt_lutxy (dif_02, dif_11, expr="x y -").mt_inpand ()
  206.         #al_prev = cmp_prev.AverageLuma ()
  207.         #al_next = cmp_next.AverageLuma ()
  208.  
  209.         (al_prev > 5 && al_next > 5) ? mt_lut (y=-255) : mt_lut (y=0)
  210.  
  211.     """)
  212.  
  213.     Crop (0, 0, 0, 4)
  214.  
  215.     frame_mask = last
  216.     frame_mask = mt_logic (frame_mask, SelectEvery (1, -1), mode="or")
  217.     frame_mask = mt_logic (frame_mask, SelectEvery (1, +1), mode="or", u=-128, v=-128)
  218.  
  219.     return (frame_mask)
  220. }
  221.  
  222. Function clean_frames_new (clip tfmout, clip c_aa, clip c_vinv, clip c_mask_3f, clip c_mmo_aa, clip c_mmo_vi, string comb_str, string disexmask_str, string forceaa_str, string disableaa_str, string disablevi_str)
  223. {
  224.     mask_sc = c_aa.ScriptClip ("""
  225.         YDifferenceFromPrevious () > 30 ? mt_lut (y=-255) : mt_lut (y=0)
  226.     """)
  227.  
  228.     w = tfmout.Width ()
  229.     h = tfmout.Height ()
  230.     c_mask_3f
  231.     ReplaceFramesSimple_oor (mt_lut (y=-255), mappings=forceaa_str)
  232.     PointResize (w, h)
  233.     frame_mask = last
  234.  
  235.     frame_mask = mt_logic (frame_mask, mask_sc, mode="max")
  236.  
  237.     edge_mask = c_aa.mt_edge (mode="prewitt", thY1=0, thY2=255) # edge_vert_only ()
  238.     edge_mask = edge_mask.RemoveGrain (20, -1)
  239.     edge_mask = edge_mask.mt_lut ("x 8 - 8 *")
  240.  
  241.     aa_mask = mt_logic (frame_mask, edge_mask, mode="and")
  242.     aa_mask = mt_logic (aa_mask, c_mmo_aa, mode="min")
  243.  
  244.     mask_hor1 = c_vinv.mt_edge ("1 1 1 0 0 0 -1 -1 -1 1", thY1=0, thY2=255)
  245.     mask_ver  = c_aa.mt_edge ("1 0 -1 1 0 -1 1 0 -1 1", thY1=0, thY2=255)
  246.     mask_hor  = mt_lutxy (mask_hor1, mask_ver, "x y -")
  247.     mask_excl = mask_hor
  248.     mask_excl = mask_excl.mt_expand ()
  249.     mask_excl = mask_excl.mt_inpand_multi (sw=2, sh=3)
  250.     mask_excl = mask_excl.mt_expand_multi (sw=3, sh=4)
  251.     mask_excl = mask_excl.mt_inpand_multi (sw=1, sh=1)
  252.     mask_excl = mask_excl.RemoveGrain (20, -1)
  253.     mask_excl = mask_excl.mt_lut ("x 32 - 6 *")
  254.     mask_excl = mask_excl.RemoveGrain (20, -1)
  255.  
  256.     mask_excl = mt_logic (mask_sc, mask_excl, "andn")
  257.  
  258.     mt_lutxy (aa_mask, mask_excl, expr="x y -")
  259.     ReplaceFramesSimple_oor (aa_mask, mappings=disexmask_str)
  260.     aa_mask = last
  261.  
  262.     mt_lutxy (c_mmo_vi, mask_excl, expr="x y -")
  263.     ReplaceFramesSimple_oor (c_mmo_vi, mappings=disexmask_str)
  264.     c_mmo_vi = last
  265.  
  266.     tfmout
  267.     mt_merge (last, c_vinv, c_mmo_vi, luma=true)
  268.     ReplaceFramesSimple_oor (c_vinv, mappings=comb_str)
  269.     ReplaceFramesSimple_oor (tfmout, mappings=disablevi_str)
  270.  
  271.     c_noaa = last
  272.     mt_merge (last, c_aa,   aa_mask, luma=true)
  273.     ReplaceFramesSimple_oor (c_noaa, mappings=disableaa_str)
  274.  
  275. #TEST#  aa_mask.GreyScale ().Levels (0,1,255, 16,235)
  276. #TEST#  mask_excl.GreyScale ().Levels (0,1,255, 16,235)
  277. #TEST#  mask_hor.GreyScale ().Levels (0,1,255, 16,235)
  278. #TEST#  mask_sc.GreyScale ().Levels (0,1,255, 16,235)
  279. #TEST#  c_mmo_aa.GreyScale ().Levels (0,1,255, 16,235)
  280. #TEST#  c_mmo_vi.GreyScale ().Levels (0,1,255, 16,235)
  281. #TEST#  mt_merge (last, last.Subtitle ("_______________xxxx"), frame_mask, luma=true)
  282.  
  283. }
  284.  
  285. Function edge_vert_only (clip src)
  286. {
  287.     src
  288.     mt_edge ("1 0 -1 1 0 -1 1 0 -1 1", thY1=0, thY2=255)
  289. }
  290.  
  291. # Not used
  292. Function edge_prewitt_no_hor (clip src)
  293. {
  294.     src
  295.     mt_logic (
  296. \       mt_edge ("1 1 0 1 0 -1 0 -1 -1 1", thY1=0, thY2=255),
  297. \       mt_logic (
  298. \           mt_edge ("1 0 -1 1 0 -1 1 0 -1 1", thY1=0, thY2=255),
  299. \           mt_edge ("0 -1 -1 1 0 -1 1 1 0 1", thY1=0, thY2=255),
  300. \           mode="max"
  301. \       ),
  302. \       mode="max"
  303. \   )
  304. }
Add Comment
Please, Sign In to add comment