Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###
- ### Pass 1
- ### Deinterlacing, blending removal and conversion to 24p
- ###
- # ep_str must be defined at this point.
- SetMemoryMax (1100)
- Import ("cut.avsi")
- Import ("merge-seg.avsi")
- Import ("fslg_blend.avsi")
- (seg_str == "")
- \ ? fslg_cat_seg_undet_end (ep_str, "0", 0, threads=2)
- \ : fslg_load_seg (ep_str, "0", seg_str, 30*60*1, threads=2)
- ##################################################
- debug = false
- compa = 0
- ##################################################
- c_org = last
- w = Width ()
- h = Height ()
- # - - - - - - - - - - - - - - - - - - - - - - - - - -
- c_mask_3f = find_3field_mask ()
- c_dw = DoubleWeave ()
- c_deint60 = QTGMC (lossless=2, tr0=1, tr1=1, tr2=1, EdiThreads=2)
- len_2x = c_dw.FrameCount ()
- c_deint60_x = StackVertical (c_deint60, c_deint60.BlankClip (height=4, color_yuv=$FF8080), c_mask_3f)
- c_dw_x = StackVertical (c_dw, c_dw .BlankClip (height=4, color_yuv=$008080), c_mask_3f)
- tfm60_x = c_dw_x.Loop (-1).TFM (
- \ y0=h,
- \ y1=c_dw_x.Height () - 1,
- \ clip2=c_deint60_x.Loop (-1),
- \ PP=4,
- \ MI=60,
- \ ovr="ep-"+ep_str+"-tfm-override.txt",
- \ display=debug
- \ ).Trim (0, -len_2x)
- tfm60 = tfm60_x.Crop (0, 0, 0, h)
- c_aa = tfm60.daa_mod (threads=3, nns=4)
- # - - - - - - - - - - - - - - - - - - - - - - - - - -
- c_all = StackVertical (c_aa, tfm60_x)
- c_blend24 = c_all.SRestore (frate=24000.0/1001.0, dclip=c_aa, cache=-1)
- c_blend24 = c_blend24.RequestLinear (elim=20)
- c_ivtc24 = c_org.TFM (PP=0).TDecimate (mode=1, clip2=c_all.SelectEven ())
- c_blend24.ReplaceFramesSimple_oor (c_ivtc24, mappings=stdivtc_str)
- AssumeFps (24000, 1001)
- c_all24 = last
- # - - - - - - - - - - - - - - - - - - - - - - - - - -
- c_aa24 = Crop (0, 0, 0, h)
- c_n24 = Crop (0, h, 0, h)
- c_mask_di24 = Crop (0, h * 2 , 0, 4).PointResize (w, h)
- c_mask_3f24 = Crop (0, h * 2 + 4, 0, 4)
- c_vinv24 = c_n24.Vinverse ()
- c_vinv24 = mt_merge (c_vinv24, c_n24, c_mask_di24, luma=true)
- c_blur = c_aa24.RemoveGrain (11, -1)
- c_mmo_soft = c_blur.find_motion_mask (true)
- c_mmo_hard = c_blur.find_motion_mask (false)
- c_mmo_aa = c_mmo_hard.ReplaceFramesSimple_oor (c_mmo_soft, mappings=lessmoaa_str)
- c_mmo_vi = c_mmo_hard
- 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)
- c_24p = last
- # - - - - - - - - - - - - - - - - - - - - - - - - - -
- (debug ) ? tfm60_x
- \ : (compa == 1) ? Interleave (c_n24.Subtitle ("c_n24"), c_24p.Subtitle ("c_24p"))
- \ : last
- # - - - - - - - - - - - - - - - - - - - - - - - - - -
- Function fix_ep01_manual (clip src, clip c_aa)
- {
- src
- fix1 = StackVertical (
- \ src.Crop (0, 0, 0, 256),
- \ StackHorizontal (
- \ src.Crop (0, 256, 400, 0),
- \ c_aa.Crop (400, 256, 0, 0)
- \ )
- \ )
- src.ReplaceFramesSimple_oor (fix1, mappings="[102235 102314]")
- }
- # - - - - - - - - - - - - - - - - - - - - - - - - - -
- # Modification : nnedi3
- function daa_mod (clip c, int "nns", int "threads")
- {
- nn = c.nnedi3(field=-2, nns=nns, threads=threads)
- dbl = mt_average(selecteven(nn),selectodd(nn),U=3,V=3)
- dblD = mt_makediff(c,dbl,U=3,V=3)
- shrpD = mt_makediff(dbl,dbl.removegrain((width(c)>1100) ? 20 : 11),U=3,V=3)
- DD = shrpD.repair(dblD,13)
- return dbl.mt_adddiff(DD,U=3,V=3)
- }
- Function ReplaceFramesSimple_oor (clip base, clip src, string "filename", string "mappings", int "maxtime")
- {
- maxtime = Default (maxtime, 30) # Minutes
- lsec = Int (base.FrameRate () * maxtime * 60)
- len = base.FrameCount ()
- ladd = Max (lsec - len, 0)
- base = base + base.BlankClip (length=ladd)
- src = src + src.BlankClip (length=ladd)
- base.ReplaceFramesSimple (src, filename=filename, mappings=mappings)
- Trim (0, -len)
- }
- Function find_motion_mask (clip c_blur, bool lessen)
- {
- c_blur
- (lessen) ? RemoveGrain (20, -1) : last
- (lessen) ? TemporalSoften (1, 32, 255, 255) : last
- mt_makediff (last, last.SelectEvery (1, 1))
- mt_lut ("x 128 - abs 5 - 16 *")
- mt_expand ()
- mt_logic (last, last.SelectEvery (1, -1), mode="max")
- RemoveGrain (20, -1)
- }
- # Principe:
- #
- # En cas de mouvement, les images tenant sur 3 fields dans le pattern 3:2
- # ont une IVTC bizarre, qu'on pourrait décrire sous forme : (A-B-A)-(C-C)
- # Les 3 types de field A, B et C sont exposés différemment. Le C est moyen,
- # l'A est plus flou et le B est plus net. Notons que les fields A et B
- # appartiennent à la même image. Cet écart d'exposition semble n'apparaître
- # qu'en cas de mouvement, et il est très prononcé sur les pans à 24 fps.
- #
- # On commence donc par chercher les A-B-A en mouvement, qui nécessitent
- # un traitement particulier. En fait, on cherche la position d'un field B.
- # D'une part, on compare le field précédent au suivant (les A potentiels) :
- # ils doivent être très similaires, leur différence absolue proche de zéro.
- # D'autre part, on compare le field central aux deuxièmes suivant et
- # précédents : ils doivent être différents, si les 3 frames auquels ils
- # sont rattachés sont différentes.
- #
- # Une fois qu'on a trouvé et masqué le field B, on étale le masque sur
- # les fields A associés.
- Function find_3field_mask (clip c_org)
- {
- c_org
- SeparateFields ()
- RemoveGrain (20, -1)
- ScriptClip ("""
- dif_11 = mt_makediff (SelectEvery (1, -1), SelectEvery (1, +1))
- dif_11 = dif_11.mt_lut ("x 128 - abs 16 *")
- dif_20 = dif_11.SelectEvery (1, -1)
- dif_02 = dif_11.SelectEvery (1, +1)
- al_mid = dif_11.AverageLuma ()
- al_prev = dif_20.AverageLuma () - al_mid
- al_next = dif_02.AverageLuma () - al_mid
- #cmp_prev = mt_lutxy (dif_20, dif_11, expr="x y -").mt_inpand ()
- #cmp_next = mt_lutxy (dif_02, dif_11, expr="x y -").mt_inpand ()
- #al_prev = cmp_prev.AverageLuma ()
- #al_next = cmp_next.AverageLuma ()
- (al_prev > 5 && al_next > 5) ? mt_lut (y=-255) : mt_lut (y=0)
- """)
- Crop (0, 0, 0, 4)
- frame_mask = last
- frame_mask = mt_logic (frame_mask, SelectEvery (1, -1), mode="or")
- frame_mask = mt_logic (frame_mask, SelectEvery (1, +1), mode="or", u=-128, v=-128)
- return (frame_mask)
- }
- 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)
- {
- mask_sc = c_aa.ScriptClip ("""
- YDifferenceFromPrevious () > 30 ? mt_lut (y=-255) : mt_lut (y=0)
- """)
- w = tfmout.Width ()
- h = tfmout.Height ()
- c_mask_3f
- ReplaceFramesSimple_oor (mt_lut (y=-255), mappings=forceaa_str)
- PointResize (w, h)
- frame_mask = last
- frame_mask = mt_logic (frame_mask, mask_sc, mode="max")
- edge_mask = c_aa.mt_edge (mode="prewitt", thY1=0, thY2=255) # edge_vert_only ()
- edge_mask = edge_mask.RemoveGrain (20, -1)
- edge_mask = edge_mask.mt_lut ("x 8 - 8 *")
- aa_mask = mt_logic (frame_mask, edge_mask, mode="and")
- aa_mask = mt_logic (aa_mask, c_mmo_aa, mode="min")
- mask_hor1 = c_vinv.mt_edge ("1 1 1 0 0 0 -1 -1 -1 1", thY1=0, thY2=255)
- mask_ver = c_aa.mt_edge ("1 0 -1 1 0 -1 1 0 -1 1", thY1=0, thY2=255)
- mask_hor = mt_lutxy (mask_hor1, mask_ver, "x y -")
- mask_excl = mask_hor
- mask_excl = mask_excl.mt_expand ()
- mask_excl = mask_excl.mt_inpand_multi (sw=2, sh=3)
- mask_excl = mask_excl.mt_expand_multi (sw=3, sh=4)
- mask_excl = mask_excl.mt_inpand_multi (sw=1, sh=1)
- mask_excl = mask_excl.RemoveGrain (20, -1)
- mask_excl = mask_excl.mt_lut ("x 32 - 6 *")
- mask_excl = mask_excl.RemoveGrain (20, -1)
- mask_excl = mt_logic (mask_sc, mask_excl, "andn")
- mt_lutxy (aa_mask, mask_excl, expr="x y -")
- ReplaceFramesSimple_oor (aa_mask, mappings=disexmask_str)
- aa_mask = last
- mt_lutxy (c_mmo_vi, mask_excl, expr="x y -")
- ReplaceFramesSimple_oor (c_mmo_vi, mappings=disexmask_str)
- c_mmo_vi = last
- tfmout
- mt_merge (last, c_vinv, c_mmo_vi, luma=true)
- ReplaceFramesSimple_oor (c_vinv, mappings=comb_str)
- ReplaceFramesSimple_oor (tfmout, mappings=disablevi_str)
- c_noaa = last
- mt_merge (last, c_aa, aa_mask, luma=true)
- ReplaceFramesSimple_oor (c_noaa, mappings=disableaa_str)
- #TEST# aa_mask.GreyScale ().Levels (0,1,255, 16,235)
- #TEST# mask_excl.GreyScale ().Levels (0,1,255, 16,235)
- #TEST# mask_hor.GreyScale ().Levels (0,1,255, 16,235)
- #TEST# mask_sc.GreyScale ().Levels (0,1,255, 16,235)
- #TEST# c_mmo_aa.GreyScale ().Levels (0,1,255, 16,235)
- #TEST# c_mmo_vi.GreyScale ().Levels (0,1,255, 16,235)
- #TEST# mt_merge (last, last.Subtitle ("_______________xxxx"), frame_mask, luma=true)
- }
- Function edge_vert_only (clip src)
- {
- src
- mt_edge ("1 0 -1 1 0 -1 1 0 -1 1", thY1=0, thY2=255)
- }
- # Not used
- Function edge_prewitt_no_hor (clip src)
- {
- src
- mt_logic (
- \ mt_edge ("1 1 0 1 0 -1 0 -1 -1 1", thY1=0, thY2=255),
- \ mt_logic (
- \ mt_edge ("1 0 -1 1 0 -1 1 0 -1 1", thY1=0, thY2=255),
- \ mt_edge ("0 -1 -1 1 0 -1 1 1 0 1", thY1=0, thY2=255),
- \ mode="max"
- \ ),
- \ mode="max"
- \ )
- }
Add Comment
Please, Sign In to add comment