Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import vapoursynth as vs
- import functools
- import numpy as np
- import nnedi3_resample
- import fag3kdb
- import havsfunc as haf
- import adaptivegrain as adg
- import kagefunc as kgf
- import vsTAAmbk as taa
- import fvsfunc as fvf
- import mvsfunc as mvf
- import knnfunc
- import debandshit
- import BMToolkit
- import hysteria
- core = vs.get_core()
- clip1 = core.d2v.Source(r"I:\[Kare Kano]\vol1.d2v")
- clip2=haf.QTGMC(clip1,Preset="placebo", MatchPreset="placebo", MatchPreset2="placebo", EdiMode="nnedi3", Lossless=0, SourceMatch=3, TR2=3, ChromaMotion=False, NNSize=3, NNeurons=2, EdiQual=1, MatchTR2=2, Border=True, TFF=True)#.std.Trim(46540)
- #clip2=core.wwxd.WWXD(clip=clip2)
- Top2 = clip2.std.SelectEvery(cycle=2,offsets=0)
- Bottom2 = clip2.std.SelectEvery(cycle=2,offsets=1)
- clip2=core.misc.SCDetect(core.std.Merge(Top2,Bottom2),threshold=0.1)
- def transfer_property(n, f):
- fout = f[1].copy()
- fout.props['_SceneChangePrev'] = f[0].props['_SceneChangePrev']
- fout.props['_SceneChangeNext'] = f[0].props['_SceneChangeNext']
- return fout
- Top2=core.std.ModifyFrame(clip=Top2, clips=[clip2, Top2], selector=transfer_property)
- Bottom2 = core.std.ModifyFrame(clip=Bottom2, clips=[clip2, Bottom2], selector=transfer_property)
- clip2 = core.std.Interleave([Top2,Bottom2])
- OPPColourspace = core.std.PlaneStats(kgf.retinex_edgemask(core.fmtc.resample(clip2, csp=vs.YUV444P16)))#core.std.PlaneStats(core))
- Top = OPPColourspace.std.SelectEvery(cycle=2,offsets=0)
- Bottom = OPPColourspace.std.SelectEvery(cycle=2,offsets=1)
- Top2 = clip2.std.SelectEvery(cycle=2,offsets=0)
- Bottom2 = clip2.std.SelectEvery(cycle=2,offsets=1)
- #Diff = core.std.PlaneStats(kgf.getY(core.std.Expr([Top2,Bottom2], ["x 128 - abs y 128 - abs < x 128 - abs x y + 256 - abs < and x 128 - abs x 128 - abs 0.5 pow - 2 pow y 128 - abs x y + 256 - abs < y 128 - abs y 128 - abs 0.5 pow - 2 pow x y + 256 - abs x y + 256 - abs 0.5 pow - 2 pow ? ? x 128 - y 128 - * 0 > -1 1 ? * 128 +"])))
- #Top = core.std.PlaneStats(core.std.Expr([Top, Diff.std.Binarize(threshold=1,v1=1).std.Maximum()],"x y *").rgvs.RemoveGrain(mode=4))
- #Bottom = core.std.PlaneStats(core.std.Expr([Bottom, Diff.std.Binarize(threshold=1,v1=1).std.Maximum()],"x y *").rgvs.RemoveGrain(mode=4))
- def Selector(n, Top, Bottom, clip2):
- #Eventually upgrade the script to be multithreaded
- global AAABB
- global BAAAB
- global BBAAA
- global ABBAA
- global AABBA
- global BBXAA
- global ABBXA
- global AABBX
- global XAABB
- global BXAAB
- global i
- clip2 = core.std.SetFrameProp(clip2,"myRatio",floatval=((Top.get_frame(n/2).props.PlaneStatsAverage+ 6.10351562*10**-5) / (Bottom.get_frame((n - 1) / 2).props.PlaneStatsAverage)+ 6.10351562*10**-5))
- if clip2.get_frame(n*2).props._SceneChangePrev==1 or n==0:
- i = 1
- Diff = 0.001#abs(1-clip2.get_frame(n).props.myRatio)
- Field = 0 if clip2.get_frame(n).props.myRatio < 1 else 1 #0 is top, 1 is bottom
- AAABB = Diff if Field == 0 else 0
- BAAAB = 0 if Field == 0 else Diff
- BBAAA = 0 if Field == 0 else Diff
- ABBAA = Diff if Field == 0 else 0
- AABBA = Diff if Field == 0 else 0
- BBXAA = 0 if Field == 0 else Diff
- ABBXA = Diff if Field == 0 else 0
- AABBX = Diff if Field == 0 else 0
- XAABB = 0
- BXAAB = 0 if Field == 0 else Diff
- while clip2.get_frame(n+i).props._SceneChangePrev != 1:
- if((n+i)%5)==0:
- AAABB = AAABB + Diff if Field == 0 else AAABB
- BAAAB = BAAAB if Field == 0 else BAAAB + Diff
- BBAAA = BBAAA if Field == 0 else BBAAA + Diff
- ABBAA = ABBAA + Diff if Field == 0 else ABBAA
- AABBA = AABBA + Diff if Field == 0 else AABBA
- #New
- BBXAA = BBXAA if Field == 0 else BBXAA + Diff
- ABBXA = ABBXA + Diff if Field == 0 else ABBXA
- AABBX = AABBX + Diff if Field == 0 else AABBX
- XAABB = XAABB
- BXAAB = BXAAB if Field == 0 else BXAAB + Diff
- if((n+i)%5)==1:
- AAABB = AAABB + Diff if Field == 0 else AAABB
- BAAAB = BAAAB + Diff if Field == 0 else BAAAB
- BBAAA = BBAAA if Field == 0 else BBAAA + Diff
- ABBAA = ABBAA if Field == 0 else ABBAA + Diff
- AABBA = AABBA + Diff if Field == 0 else AABBA
- #New
- BBXAA = BBXAA if Field == 0 else BBXAA + Diff
- ABBXA = ABBXA if Field == 0 else ABBXA + Diff
- AABBX = AABBX + Diff if Field == 0 else AABBX
- XAABB = XAABB + Diff if Field == 0 else XAABB
- BXAAB = BXAAB
- if((n+i)%5)==2:
- AAABB = AAABB + Diff if Field == 0 else AAABB
- BAAAB = BAAAB + Diff if Field == 0 else BAAAB
- BBAAA = BBAAA + Diff if Field == 0 else BBAAA
- ABBAA = ABBAA if Field == 0 else ABBAA + Diff
- AABBA = AABBA if Field == 0 else AABBA + Diff
- #New
- BBXAA = BBXAA
- ABBXA = ABBXA if Field == 0 else ABBXA + Diff
- AABBX = AABBX if Field == 0 else AABBX + Diff
- XAABB = XAABB + Diff if Field == 0 else XAABB
- BXAAB = BXAAB + Diff if Field == 0 else BXAAB
- if((n+i)%5)==3:
- AAABB = AAABB if Field == 0 else AAABB + Diff
- BAAAB = BAAAB + Diff if Field == 0 else BAAAB
- BBAAA = BBAAA + Diff if Field == 0 else BBAAA
- ABBAA = ABBAA + Diff if Field == 0 else ABBAA
- AABBA = AABBA if Field == 0 else AABBA + Diff
- #New
- BBXAA = BBXAA + Diff if Field == 0 else BBXAA
- ABBXA = ABBXA
- AABBX = AABBX if Field == 0 else AABBX + Diff
- XAABB = XAABB if Field == 0 else XAABB + Diff
- BXAAB = BXAAB + Diff if Field == 0 else BXAAB
- if((n+i)%5)==4:
- AAABB = AAABB if Field == 0 else AAABB + Diff
- BAAAB = BAAAB if Field == 0 else BAAAB + Diff
- BBAAA = BBAAA + Diff if Field == 0 else BBAAA
- ABBAA = ABBAA + Diff if Field == 0 else ABBAA
- AABBA = AABBA + Diff if Field == 0 else AABBA
- #New
- BBXAA = BBXAA + Diff if Field == 0 else BBXAA
- ABBXA = ABBXA + Diff if Field == 0 else ABBXA
- AABBX = AABBX
- XAABB = XAABB if Field == 0 else XAABB + Diff
- BXAAB = BXAAB if Field == 0 else BXAAB + Diff
- i = i + 1
- BBXAA = BBXAA * 1.2
- ABBXA = ABBXA * 1.2
- AABBX = AABBX * 1.2
- XAABB = XAABB * 1.2
- BXAAB = BXAAB * 1.2
- maxValue = max(AAABB,BAAAB,BBAAA,ABBAA,AABBA,BBXAA,ABBXA,AABBX,XAABB,BXAAB)
- if AAABB==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[0, 2, 4, 7, 9]),"AAABB")
- elif BAAAB==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[1, 2, 4, 6, 9]),"BAAAB")
- elif BBAAA==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[1, 3, 4, 6, 8]),"BBAAA")
- elif ABBAA==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[0, 3, 5, 6, 8]),"ABBAA")
- elif AABBA==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[0, 2, 5, 7, 8]),"AABBA")
- elif BBXAA==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[1, 3, 3, 6, 8]),"BBXAA")
- elif ABBXA==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[0, 3, 5, 5, 8]),"ABBXA")
- elif AABBX==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[0, 2, 5, 7, 7]),"AABBX")
- elif XAABB==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[2, 4, 7, 9, 9]),"XAABB")
- elif BXAAB==maxValue:
- return core.text.Text(clip2.std.SelectEvery(cycle=10, offsets=[1, 1, 4, 6, 9]),"BXAAB")
- else:
- return clip2.std.SelectEvery(cycle=10, offsets=[0, 2, 4, 7, 9])
- #Make sure the calculations for AAABB etc are using both fields, not half
- #Make sure scene detection occurs in both fields, however in the case of two scene changes in a row, second one is ignored
- #Account for when we have Top Field First and Bottom Field First changing during a scene
- #Optimise for multithreading
- #Make sure metrics are being calculated properly by applying them as frame props
- #Use Better scene detection, something more sensitive to scene changes
- if abs(Top.get_frame(n).props.PlaneStatsAverage - Bottom.get_frame(n).props.PlaneStatsAverage) < 0:
- return haf.srestore(clip2,frate=30000/1001,speed=-25)
- else:
- if Top.get_frame(n).props.PlaneStatsAverage > Bottom.get_frame(n).props.PlaneStatsAverage:
- return core.text.Text(clip2.std.SelectEvery(cycle=2,offsets=1),"Bottom")
- else:
- return core.text.Text(clip2.std.SelectEvery(cycle=2,offsets=0),"Top")
- decimated = core.std.FrameEval(clip2.std.SelectEvery(cycle=2,offsets=0), functools.partial(Selector, Top=Top, Bottom=Bottom, clip2=clip2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement