View difference between Paste ID: PNue6Uwa and HJSQNPnj
SHOW: | | - or go back to the newest paste.
1
# AnimeIVTC() by thetoof
2-
# v2.00 2015-5-07 mod
2+
# v2.00 2015-6-11 mod
3
# last update by AmjadSONY was:- make "precision=1" use "nnedi3" only for "Toriko Anime" by using it like this:- AnimeIVTC(1, precision=1)
4
# add mode22 bool to use it in mode 2 for Spatial field-blend (field-blend in a part of the picture), ex:- AnimeIVTC(2, bbob=1, mode22=true)
5
# TC file now will out in V2 ;) , add ediext clip to use it with QTGMC and add bob4p to change QTGMC Preset , add extbob clip to use an External bobber with bbob/cbob=5 , chrfix in mode 1 and other things fixed by doom9 member
6
# make chrfix work. add dchr bool, can help chrfix with some source, add palf bool for no decimate in mode 1 and make fps 24 instead of 25 for mode 2 in pal source, add tcfv1 bool to made TC file v1 and make it true by default
7
# add nvfr bool for VFR noisy sources, add real30p bool to not use daa with 30p, and some fix in for PAL cases and other things
8
# add TFM (mode, cthresh, blockx, blocky, MI) and some fix
9
# add extbobf string to use external bob function, old external bob clip (extbob) still exist, and if you use both the old extbob will win
10
# make precision=0 use pp=0 in tfm for speed and quality too, add precision=4 same as precision=3 but no blend, add precision=5 to use yadifmod (usefull for very old anime)
11
# add precision=6 to use extbobf\extbob with ConvertFPS to back to original fps, add precision=7 to use extbobf\extbob with SelectEven to back to original fps (no blend), and precision=8 for already half bob fps
12
# add autoAssuf to auto set field to match from in tfm to help with noisy old telecined source, add tfm pp and metric
13
# tweak autoAssuf with another method, others modifications
14
15
# Read the documentation for all the required info to know how to use this function, With note that there are some things have changed in this MOD
16
17
function AnimeIVTC (clip i, int "mode", int "aa", int "precision", int "killcomb", int "cache", bool "ifade", float "sfthr", bool "sfshow"\
18
		, bool "chrfix"\
19
		, bool "blend"\  
20
		, bool "normconv"\
21
		, int "pattern"\
22
		, int "pass", bool "rendering" \
23
		, int "bbob", int "cbob", string "edimode", int "degrain", int "omode", int "cthresh", int "blockx", int "blocky", int "MI", int "tfmm", int "pp", int "metric"\
24
		, int "i1", int "i2", int "e1", int "e2", int "e3", int "p1", int "p2", bool "dchr", bool "palf", bool "tcfv1", bool "nvfr", bool "real30p", bool "autoAssuf" \
25
		, int "overlap", int "pel", int "search", bool "nnedi3pel", string "credconv", bool "mode22", clip "ediext", string "bob4p", clip "extbob", string "extbobf"\
26
		, float "dark", int "thin", int "sharp", int "smooth", bool "stabilize", int "tradius", int "aapel", int "aaov", int "aablk", string "aatype"){
27
28
###General arguments###
29
Assert(defined(mode), "Specify a mode... please read the documentation.")
30
31
#Highest quality by default
32
precision 	= default ( precision, 		  3 ) 
33
34
#change pal fps
35
palf	= default ( palf,         false )
36
37
#VFR default optional
38
tcfv1	= default ( tcfv1,        true  )
39
nvfr	= default ( nvfr,         false )
40
41
#boolean "creds" is set to true if any of the i/p arguments are defined (i.e. if there's a 30i or 30p section to process)
42
creds = defined(i1) ? true : false
43
creds = defined(i2) ? true : creds
44
creds = defined(p1) ? true : creds
45
creds = defined(p2) ? true : creds
46
creds = defined(e1) ? true : creds
47
creds = defined(e2) ? true : creds
48
creds = defined(e3) ? true : creds
49
50
# real30p
51
real30p	 = default( real30p,        false)
52
53
# auto set field to match from to help with noisy old telecined source
54
autoAssuf= default( autoAssuf,      false)
55
56
###Framerate preparation###
57
normconv = default( normconv, false)
58
#Determine source region by analysing framerate
59
Ifrate 	= round(framerate(i))==30 ? 1 : framerate(i)==25 ? 2 : 3
60
assert(ifrate!=3, "What is your input clip?? It's not 30fps NTSC nor 25fps PAL... maybe you're using the function for a purpose it was not meant to. Please post in the AnimeIVTC thread.")
61
62
#Set the output to the other region if normconv (norm-conversion) is set to true, use same as input if not
63
Ofrate 	= Ifrate==1 && normconv ? 2 : Ifrate==2 && normconv ? 1 : Ifrate
64
65
#prepare arguments for srestore and tdecimate based on user settings (as seen previously)
66
frate  	= Ofrate==1 ? 23.976 : palf ? 24 : 25
67
tnum	= Ofrate==1 ? (mode==1 && palf) ? 30000 : 24000 : (mode==2 && palf) ? 24 : ((mode==1 && palf) || mode==2) ? 25 : 20
68
tden	= Ofrate==1 ? 1001 : 1
69
70
71
72
#Set pattern=0 (tdecimate) for DHT (safest)
73
pattern		= default ( pattern,		  0 )
74
75
#Set defaults of bobbing filters to use to general optimal quality
76
bbob		= default ( bbob, 	          3 )
77
cbob		= default ( cbob, 	          4 )
78
bob4p		= default ( bob4p, 	   "Slower" )
79
bob5_with_extbob= (cbob >= 5 || bbob >= 5 || precision >= 6) ? (defined(extbobf) || defined(extbob)) ? 1 : 0 : 2
80
Assert(bob5_with_extbob!=0 , "please specify extbobf or extbob if you use bbob=5 or cbob=5.")
81
82
#Sets output mode to 1 (23.976fps for NTSC and 25fps for PAL) when no 30i or 30p sections are specified and sets it to 0 to use NOP() for every operation where it needs to be specified by the user
83
omode = (creds==false && mode!=4) || ofrate==2 || normconv ? 1 : default (omode, 0)
84
Assert(omode!=0, "Specify an output mode (omode)... please read the documentation.")
85
normconv ? assert(mode==2, "Why would you use normconv=true with a telecined source?") : nop()
86
87
###Framerate conversion arguments###
88
bs		= (i.width>1100) ? 16 : 8
89
overlap 	= default ( overlap,	       bs/2 )
90
pel       	= default ( pel, 		  2 )
91
search 		= default ( search, 		  4 )
92
assert(search >= 2, "Using a lower search than 2 will most probably lead to weird artifacts")
93
nnedi3pel 	= default ( nnedi3pel, 	      false )
94
credconv	= default ( credconv, 	    omode==2 ? "a" : "blah" )
95
creds ? assert(credconv!= "blah", "Please specify credconv. Check in the docs to see which is more appropriate to your source.") : nop()
96
97
#VFR - If this is pass=2 and that the user made a rendering pass out of pass=1, use input directly for decimation instead of recomputing everything
98
pass		= default (pass,		  1 )
99
rendering 	= default ( rendering,	      false )
100
101
#Ask if hard telecine (mode=1) is actually blend telecine (patter = 3 clean frames followed by 2 blended ones)
102
blend		= default ( blend, 	      false )
103
104
#Ask if double chroma blend removal is needed (see guide for more info about this problem)
105
chrfix	= default ( chrfix,       false )
106
dchr	= default ( dchr,       false )
107
108
#mode22 for Spatial field-blend
109
mode22	= default ( mode22,       false )
110
111
#Set cache to 10 frames for all functions using scriptclip to prevent seeking issues + frame order mess-up with temporal filters
112
cache		= default ( cache,		 10 )
113
114
#Let the user decide which edimode (optimal varies greatly depending on source) and degrain (++ affects quality vs speed) settings to use in qTGMC
115
edimode		= default ( edimode, 	   "nnedi3" )
116
degrain		= default ( degrain, 		  1 ) 
117
118
#Set decombing and antialiasing filters to off by default
119
killcomb	= default ( killcomb,		  0 )
120
aa		= default ( aa,			  0 )
121
aa = killcomb==3 && aa==2 ? 0 : aa
122
123
#Set interlaced fade ins detection (and correction to off by default)
124
ifade		= default ( ifade,	       false )
125
#Also turn it off if aa=2 (use daa()), since it applies the same operation on the whole clip as ifade would have had selectively)
126
ifade		= aa==2 || killcomb==3 ? false : ifade
127
sfthr	= default ( sfthr,  0.4 ) 
128
sfshow = default ( sfshow, false )
129
130
###Alright, let's start doing something :p ###
131
132
133
#########
134
#Bobbing#
135
#########
136
137
#Assign clip to prevent double computation
138
edeint= i.nnedi3(-2)
139
emask = i.tmm(1)
140
141
#For later NOP() use if blendbob is not needed
142
usebbob = chrfix && blend || mode==2
143
144
145
#Use non-motion-compensated bobber for blended clips since blends have a negative impact on motion detection (if blends are averaged with frames, they can be harder to detect/remove) (mode=2 and mode=1 with blend and chrfix because blend telecine... well has a lot of blends)
146
blendbob 	= usebbob ?	bbob<=0 ? i.tdeint(1) 			 		 	                : 
147
\				bbob==1 ? i.tdeint(1,		edeint=edeint	) 	 	                : 
148
\				bbob==2 ? i.tdeint(1,		edeint=edeint,emask=emask)	 	        : 
149
\				bbob==3 ? i.yadifmod(mode=1,	edeint=edeint)		 		        :
150
\				bbob==4 ? i.QTGMC(Preset=bob4p,edimode=edimode,tr2=degrain,ediext=ediext)	:
151
\				          defined(extbob) ? extbob : Eval("i." + extbobf)                      	: NOP()
152
153
#For later NOP() use if clearbob is not needed
154
usecbob = mode==3 || defined(i1) || chrfix && blend==false
155
156
#Allow usage of mo-comp bobber (TempGaussMC) when source is not blended. Highly recommended for stability. (mode=3, interlaced credits, used in chrfix because impact is minimal compared to bob flicker on the whole clip)
157
clearbob 	= usecbob ?	cbob<=0 ? i.tdeint(1)						                : 
158
\				cbob==1 ? i.tdeint(1,		edeint=edeint)			                : 
159
\				cbob==2 ? i.tdeint(1,		edeint=edeint,emask=emask)	                : 
160
\				cbob==3 ? i.yadifmod(mode=1,	edeint=edeint)			                :
161
\			        cbob==4 ? i.QTGMC(Preset=bob4p,edimode=edimode,tr2=degrain,ediext=ediext)	:
162
\				          defined(extbob) ? extbob : Eval("i." + extbobf)                      	: NOP()
163
164
############################
165
#Chroma swap between fields# chrfix
166
############################
167
168
#Repair double chroma blending if requested by user using xbob depending on source (known by the mode)
169
chrdeb = chrfix ? blend || mode==2 ? dchr ? blendbob.chroma_rep2(cache) : blendbob.chroma_rep(cache) : dchr ? clearbob.chroma_rep2(cache) : clearbob.chroma_rep(cache) : nop()
170
171
#Remove duplicates (like a safe selecteven/odd) for further processing before final decimation (hybrid decimation (except blend decimation to prevent having 2 calls of tdecimate) or blend telecine IVTC)
172
#Once bobbed, in mode=1 (tdecimate(1,3,5), in mode=1 + blend = back to 30fps for further deblending, in mode=2 srestore will do the job, in mode=3 tdecimate(1,3,5), in mode 4 VFR needs 30, CFR can do it (personal notes)
173
debprep = chrfix ? mode==1 && blend || mode==4 && omode==2 ? chrdeb.tdecimate(1,1,2) : chrdeb : i
174
175
################
176
#Field matching# MODE=1 AND 4
177
################
178
179
usefm = mode==1 || (mode==4 && (pass==2 || creds || omode==1))
180
181
usehfm = mode==4 && pass==1 && usefm==false
182
183
#Field match for mode 1, pass 2 of mode 4 (hybrid without tfm.txt output) or mode=4 with blend decimation (no need for txt file) or mode=4 with interlaced credits (txt file unusable)
184
185-
\	(precision==1 && ((usefm && !blend) || usehfm)) ? i.nnedi3 : 
185+
186
\	(precision==1 && ((usefm && !blend) || usehfm)) ? edeint.SelectEven() : 
187
\	(precision==2 && ((usefm && !blend) || usehfm)) ? i.tdeint(2,edeint=edeint) : 
188-
\	(precision==4 && ((usefm && !blend) || usehfm)) ? i.tdeint(0,edeint=i.nnedi3(-1),emask=i.tmm(0)) : 
188+
189-
\	(precision==5 && ((usefm && !blend) || usehfm)) ? i.yadifmod(edeint=i.nnedi3) : 
189+
\	(precision==4 && ((usefm && !blend) || usehfm)) ? i.tdeint(0,edeint=edeint.SelectEven(),emask=i.tmm(0)) : 
190
\	(precision==5 && ((usefm && !blend) || usehfm)) ? i.yadifmod(edeint=edeint.SelectEven()) : 
191
\	(precision==6 && ((usefm && !blend) || usehfm)) ? defined(extbob) ? Ifrate==1 ? extbob.ConvertFPS("ntsc_video",zone=80) : extbob.ConvertFPS(25,zone=80) : Ifrate==1 ? Eval("i." + extbobf).ConvertFPS("ntsc_video",zone=80) : Eval("i." + extbobf).ConvertFPS(25,zone=80) : 
192
\	(precision==7 && ((usefm && !blend) || usehfm)) ? defined(extbob) ? extbob.SelectEven : Eval("i." + extbobf).SelectEven : 
193
\	(precision==8 && ((usefm && !blend) || usehfm)) ? defined(extbob) ? extbob : Eval("i." + extbobf) : 
194
\	nop()
195
196
#field match for hard telecine or blend telecine restoration for mode==1
197-
fm = 	(precision==0 && usefm) ? blend ? debprep.srestore(omode="pp0") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=0) : 
197+
198-
\	(precision==1 && usefm) ? blend ? debprep.srestore(omode="pp1") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
198+
global fm=(precision==0 && usefm) ? blend ? debprep.srestore(omode="pp0") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=0) : 
199-
\	(precision==2 && usefm) ? blend ? debprep.srestore(omode="pp2") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
199+
\	  (precision==1 && usefm) ? blend ? debprep.srestore(omode="pp1") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
200-
\	(precision==3 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
200+
\	  (precision==2 && usefm) ? blend ? debprep.srestore(omode="pp2") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
201-
\	(precision==4 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
201+
\	  (precision==3 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
202-
\	(precision==5 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
202+
\	  (precision==4 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
203-
\	(precision==6 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
203+
\	  (precision==5 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
204-
\	(precision==7 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
204+
\	  (precision==6 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
205-
\	(precision==8 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
205+
\	  (precision==7 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
206
\	  (precision==8 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=pp,clip2=tfmcli2) : 
207
\	  nop()
208
209-
invfm    = usefm ? autoAssuf ? conditionalfilter(fm.crop(16,0,-16,0),i.Tfm(field=sourford==1 ? 0 : 1,slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=precision==0 ? 0 : pp,clip2=tfmcli2),fm,"IsCombedTIVTC(15,13,false,8,4,1)","=","true") : fm : nop()
209+
210-
fm       = usefm ? autoAssuf ? conditionalfilter(blankclip(fm,length=1).crop(16,0,-16,0)+invfm.crop(16,0,-16,0),fm,invfm,"IsCombedTIVTC(10,7,false,4,4,0)","=","true") : fm : nop()
210+
global iyadifmc = i.yadifmod(edeint=edeint.SelectEven())
211
212
global invfm = usefm ? autoAssuf ? i.Tfm(field=sourford==1 ? 0 : 1,slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=defined(MI) ? Int(MI*5/4) : undefined,metric=metric,pp=precision==0 ? 0 : pp,clip2=tfmcli2,mmsco=false,micmatching=0, mchroma=false) : nop() : nop()
213
fm       = usefm ? autoAssuf ? ScriptClip(Interleave(fm,fm), """
214
						invfv=Interleave(iyadifmc.DeleteFrame(0),invfm).crop(16,16,-16,-16).cFrameDiff(prevf=true, chroma=false, denoise=true, nt=1)
215
						fv   =Interleave(iyadifmc,                  fm).crop(16,16,-16,-16).cFrameDiff(prevf=true, chroma=false, denoise=true, nt=1)
216-
hybridfm = 	(usehfm && precision==0) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=0) : 
216+
						fv < 10 ? fv > invfv ? Interleave(invfm,invfm) : last : last
217
						""").Selectodd() : fm : nop()
218
219
fm = usefm ? ifade ? fm.smartfademod(sfthr, sfshow, cache) : fm : nop()
220
221
#Field match + tfm.txt output for VFR clips (mode=4, pass=1)
222
223
global hybridfm=(usehfm && precision==0) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=0) : 
224
\		(usehfm && precision==1) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=pp,clip2=tfmcli2) : 
225
\		(usehfm && precision==2) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=pp,clip2=tfmcli2) : 
226
\		(usehfm && precision==3) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=pp,clip2=tfmcli2) : 
227-
invhybridfm    = usehfm ? autoAssuf ? conditionalfilter(hybridfm.crop(16,0,-16,0),i.Tfm(field=sourford==1 ? 0 : 1,slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI,metric=metric,pp=precision==0 ? 0 : pp,clip2=tfmcli2),hybridfm,"IsCombedTIVTC(15,13,false,8,4,1)","=","true") : hybridfm : nop()
227+
228-
hybridfm       = usehfm ? autoAssuf ? conditionalfilter(blankclip(hybridfm,length=1).crop(16,0,-16,0)+invhybridfm.crop(16,0,-16,0),hybridfm,invhybridfm,"IsCombedTIVTC(10,7,false,4,4,0)","=","true") : hybridfm : nop()
228+
229
\		(usehfm && precision==6) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=pp,clip2=tfmcli2) : 
230
\		(usehfm && precision==7) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=pp,clip2=tfmcli2) : 
231
\		(usehfm && precision==8) ? i.tfm(slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=MI, output="tfm.txt",metric=metric,pp=pp,clip2=tfmcli2) : 
232
\		nop()
233
234
invhybridfm    = usehfm ? autoAssuf ? conditionalfilter(hybridfm.crop(16,16,-16,-16),i.Tfm(field=sourford==1 ? 0 : 1,slow=2,mode=tfmm,cthresh=cthresh,blockx=blockx,blocky=blocky,MI=defined(MI) ? Int(MI*5/4) : undefined,metric=metric,pp=precision==0 ? 0 : pp,clip2=tfmcli2,mmsco=false,micmatching=0, mchroma=false),hybridfm,"IsCombedTIVTC(15,13,false,8,4,1)","=","true") : hybridfm : nop()
235
hybridfm       = usehfm ? autoAssuf ? conditionalfilter(blankclip(hybridfm,length=1).crop(16,16,-16,-16)+invhybridfm.crop(16,16,-16,-16),hybridfm,invhybridfm,"IsCombedTIVTC(10,7,false,4,4,0)","=","true") : hybridfm : nop()
236
237
hybridfm = usehfm ? ifade ? hybridfm.smartfademod(sfthr, sfshow, cache) : hybridfm : nop()
238
239
###############        ######################
240
#Field blended# MODE=2 #Double hard telecine# MODE=3
241
###############	       ######################
242
243
#Since during double chroma blend removal it was checked whether to use blendbob or clearbob depending on the source (blendbob was used for field blended and clearbob was used for double hard telecine), use chrbob when chrfix=true, else use the appropriate one
244
245
fbbob = mode==2 ? chrfix ? debprep : blendbob : nop()
246
247
dhtbob = mode==3 ? chrfix ? debprep : clearbob : nop()
248
249
################
250-
fbdecim = mode==2 ? mode22 ? chrfix ? fbbob.srestore(omode=2, mode=4, thresh=44, cache=cache, dclip=fbbob.crop(16,0,-16,0)).srestore(frate=frate, mode=4, speed=-4, cache=cache) : 	fbbob.srestore(omode=2, mode=4, thresh=44, cache=cache, dclip=fbbob.crop(16,0,-16,0)).srestore(frate=frate, mode=-4, speed=-4, cache=cache) 	:
250+
251
################
252
253
#HT decimation (mode=1), remove 3 frames out of 5 when chrfix=true since the clip has been bobbed to 60fps
254
fmdecim = mode==1 ? chrfix ? debprep.tdecimate(1,3,5) : palf ? fm : fm.tdecimate() 											: nop()
255
256
#Field blended blend removal & decimation (mode=2) No need to check for chrfix since it was done in the previous step
257
fbdecim = mode==2 ? mode22 ? chrfix ? fbbob.srestore(omode=2, mode=4, thresh=44, cache=cache, dclip=fbbob.crop(16,16,-16,-16)).srestore(frate=frate, mode=4, speed=-4, cache=cache) : 	fbbob.srestore(omode=2, mode=4, thresh=44, cache=cache, dclip=fbbob.crop(16,16,-16,-16)).srestore(frate=frate, mode=-4, speed=-4, cache=cache) 	:
258
\chrfix ? fbbob.srestore(frate=frate, cache=cache) : 	fbbob.srestore(frate=frate, cache=cache, dclip=i.bob(-0.2,0.6).reduceflicker(strength=1)) 	: nop()
259
260
#Pattern finding and decimation for double hard telecine (mode=3) No need to check for chrfix since it was done in the previous step
261
a= mode==3 && (pattern==1 || pattern==-1) ? dhtbob.selectevery(5,0,3) : NOP()
262
b= mode==3 && (pattern==2 || pattern==-1) ? dhtbob.selectevery(5,1,4) : NOP()
263
c= mode==3 && (pattern==3 || pattern==-1) ? dhtbob.selectevery(5,0,2) : NOP()
264
d= mode==3 && (pattern==4 || pattern==-1) ? dhtbob.selectevery(5,1,3) : NOP()
265
e= mode==3 && (pattern==5 || pattern==-1) ? dhtbob.selectevery(5,2,4) : NOP()
266
dhtdecim = mode==3 ? 			pattern==-1 ? stackvertical(stackhorizontal(a.subtitle("pattern=1"),b.subtitle("pattern=2"),c.subtitle("pattern=3")),stackhorizontal(d.subtitle("pattern=4"),e.subtitle("pattern=5"),e.blackness())) : 
267
\					pattern==1 ? a : 
268
\					pattern==2 ? b : 
269
\					pattern==3 ? c : 
270
\					pattern==4 ? d : 
271
\					pattern==5 ? e : 
272
\					dhtbob.tdecimate(1,3,5) : nop()
273
274
#Hybrid CFR blend decimation of 30p into 24p
275
blenddecim = (mode==4 && omode==1) ? chrfix ? debprep.tdecimate(1,3,5,hybrid=1) : 	fm.tdecimate(hybrid=1) 				: nop()
276
277
#########
278
#Credits# CREDS=TRUE (USER SPECIFIES I1, I2, P1, P2, E1, E2 OR E3)
279
#########
280
281
#Interlaced : use the same smart-bobbed clip as before; we don't care if the background is blended or not since it is unrecoverable anyways (at least for now... see developments about using masking to isolate creds from background)
282
credbob = defined(i1) ? clearbob.selecteven() : nop()
283
284
#Progressive : Blend deinterlace the 24t background while doing minimal damage on the 30p credits
285
blendbg= defined(p1) ? real30p ? i : i.daa3() : nop()
286
287
###CFR conversion###
288
#######################
289
###Framerate conversion (recommended for static or low-motion backgrounds since it is prone artifacts... it reduces framerate/motion based on motion vectors)
290
291
####Convert the framerate of the interlaced credits
292
#Determine if usage of the following conversion is required
293
usemocompi = defined(i1) && credconv=="mocomp"
294
295
#External pelclip on source with nnedi, if requested
296
upsi = 		nnedi3pel && usemocompi ? 	credbob.	nnedi3_rpow2(rfactor=pel,cshift="spline36resize") 		 : nop()
297
298
#Prepare super clip for the interlaced credits
299
credbobsuper	= usemocompi ? 			credbob.	MSuper(pel=pel, levels=0) 					 : nop()
300
credbobupsuper	= usemocompi && nnedi3pel ? 	credbob.	MSuper(pel=pel, levels=0, pelclip=upsi) 			 : nop()
301
302
#Calculate vectors
303
bvi = 		usemocompi ? nnedi3pel ? 	credbobupsuper.	MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  : 
304
\						credbobsuper.	MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  : nop()
305
306
fvi = 		usemocompi ? nnedi3pel ? 	credbobupsuper.	MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) : 
307
\						credbobsuper.	MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) : nop()
308
309
#Apply framerate conversion
310
fpsconvi =  	usemocompi ? nnedi3pel ? 	credbob.	MFlowFps(credbobupsuper,bvi, fvi, tnum, tden) 			 : 
311
\						credbob.	MFlowFps(credbobsuper,  bvi, fvi, tnum, tden) 			 : nop()
312
313
###Convert the framerate of the progressive credits
314
#Determine if usage of the following conversion is required
315
usemocompp = defined(p1) && credconv=="mocomp"
316
317
#External pelclip on source with nnedi, if requested
318
upsp = 		nnedi3pel && usemocompp ? 	blendbg.	nnedi3_rpow2(rfactor=pel,cshift="spline36resize") 		 : nop()
319
320
#Prepare super clip for the progressive credits
321
blendbgsuper	= usemocompp ?			blendbg.MSuper(pel=pel, levels=0) 						 : nop()
322
blendbgsuperup	= usemocompp && nnedi3pel ? 	blendbg.MSuper(pel=pel, levels=0, pelclip=upsp) 				 : nop()
323
324
#Calculate vectors
325
bvp = 		usemocompp ? nnedi3pel ? 	blendbgsuperup.	MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  : 
326
\						blendbgsuper.	MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  : nop()
327
328
fvp = 		usemocompp ? nnedi3pel ? 	blendbgsuperup.	MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) : 
329
\						blendbgsuper.	MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) : nop()
330
331
#Apply framerate conversion
332
fpsconvp = 	usemocompp ? nnedi3pel ?	blendbg.MFlowFps(blendbgsuperup,bvp, fvp, tnum, tden) 				 : 
333
\						blendbg.MFlowFps(blendbgsuper,  bvp, fvp, tnum, tden) 				 : nop()
334
335
#######################
336
###Blend 30p creds into 24t (ugly and fast, but can lead to less disturbing artifacts when you have a high motion background)
337
blendi = defined(i1) && credconv=="blend" ? credbob.convertfps(tnum,tden) : nop()
338
339
blendp = defined(p1) && credconv=="blend" ? blendbg.convertfps(tnum,tden) : nop()
340
341
#######################
342
###Drop frames 30p creds into 24t (ugly and fast, will lead to stuttery motion)
343
drop_credconv = (credconv=="drop" && normconv) ? 1 : 0
344
345
assert(drop_credconv!=1, "Please choose another credconv. drop not compatible with normconv=true.")
346
347
dropi = defined(i1) && credconv=="drop" ? (mode==1 && palf) ? credbob : credbob.tdecimate(1) : nop()
348
349
dropp = defined(p1) && credconv=="drop" ? (mode==1 && palf) ? blendbg : blendbg.tdecimate(1) : nop()
350
351
########
352
#SPLICE# CREDS=TRUE (USER SPECIFIES I1, I2, P1, P2, E1, E2 OR E3)
353
########
354
355
#Determine the "mix" mode (how the different sections (30i, 24t, 30p) are spliced together)
356
#Also check for user error when entering the frame numbers
357
358
mix22a17	= defined(e1) && defined(e2) && defined(e3) && defined(i1) && defined(p1)	? true : false
359
mix7 		= defined(e1) && defined(e2) && defined(e3) && defined(i1) && defined(i2)	? true : false
360
mix14 		= defined(e1) && defined(e2) && defined(e3) && defined(p1) && defined(p2)	? true : false
361
362
mix21a20a16a15 	= defined(e1) && defined(e2) && defined(i1) && defined(p1) && mix22a17==false	? true : false
363
mix6a3 		= defined(e1) && defined(e2) && defined(i1) && defined(i2) && mix7==false	? true : false
364
mix13a10	= defined(e1) && defined(e2) && defined(p1) && defined(p2) && mix14==false	? true : false
365
366
mix19a18	= defined(e1) && defined(p1) && defined(i1) && mix21a20a16a15==false	? true : false 
367
mix9 		= defined(e1) && defined(p1) && defined(p2) && mix13a10==false		? true : false
368
mix2 		= defined(e1) && defined(i1) && defined(i2) && mix6a3==false		? true : false
369
mix4 		= defined(e1) && defined(e2) && defined(i1) && mix21a20a16a15==false && mix6a3==false	? true : false
370
mix11 		= defined(e1) && defined(e2) && defined(p1) && mix21a20a16a15==false && mix13a10==false	? true : false
371
372
mix1a5 	= defined(e1) && defined(i1) && mix19a18==false && mix2==false && mix4==false		? true : false
373
mix8a12 = defined(e1) && defined(p1) && mix19a18==false && mix11==false && mix9==false		? true : false
374
375
376
#Getting the "mix" mode based on user input
377
mix = 0
378
mix = mix1a5 		&& i1<e1 		? 1 : mix
379
mix = mix2 		&& i1<e1<i2 		? 2 : mix
380
mix = mix6a3 		&& i1<e1<i2<e2 		? 3 : mix
381
mix = mix4 		&& e1<i1<e2 		? 4 : mix
382
mix = mix1a5 		&& e1<i1 		? 5 : mix
383
mix = mix6a3 		&& e1<i1<e2<i2 		? 6 : mix
384
mix = mix7 		&& e1<i1<e2<i2<e3 	? 7 : mix
385
mix = mix8a12 		&& p1<e1 		? 8 : mix
386
mix = mix9 		&& p1<e1<p2 		? 9 : mix
387
mix = mix13a10 		&& p1<e1<p2<e2 		? 10 : mix
388
mix = mix11 		&& e1<p1<e2 		? 11 : mix
389
mix = mix8a12 		&& e1<p1 		? 12 : mix
390
mix = mix13a10 		&& e1<p1<e2<p2 		? 13 : mix
391
mix = mix14 		&& e1<p1<e2<p2<e3 	? 14 : mix
392
mix = mix21a20a16a15 	&& e1<i1<e2<p1 		? 15 : mix
393
mix = mix21a20a16a15 	&& i1<e1<p1<e2 		? 16 : mix
394
mix = mix22a17 		&& e1<i1<e2<p1<e3 	? 17 : mix
395
mix = mix19a18 		&& i1<e1<p1 		? 18 : mix
396
mix = mix19a18 		&& p1<e1<i1 		? 19 : mix
397
mix = mix21a20a16a15 	&& e1<p1<e2<i1 		? 20 : mix
398
mix = mix21a20a16a15 	&& p1<e1<i1<e2 		? 21 : mix
399
mix = mix22a17 		&& e1<p1<e2<i1<e3 	? 22 : mix
400
mix = defined(i2) && defined(i1)==false ? 0 : mix
401
mix = defined(p2) && defined(p1)==false ? 0 : mix
402
mix = defined(e2) && defined(e1)==false ? 0 : mix
403
mix = defined(e3) && defined(e2)==false ? 0 : mix
404
mix = defined(e3) && defined(e1)==false ? 0 : mix
405
mix = defined(i1) && defined(e1)==false ? 0 : mix
406
mix = defined(p1) && defined(e1)==false ? 0 : mix
407
creds ? assert(mix!=0, "Mistake in entering i1, e1.... parameters. Please check.") : nop()
408
409
#Determine frame numbers based on mix mode and user input of i/p/e1/2/3
410
istart1=mix==1 || mix==2 || mix==3 || mix==16 || mix==18 					? 0 	: \
411
	mix==4 || mix==5 || mix==6 || mix==7 || mix==15 || mix==17 || mix==19 || mix==21  	? e1+1 	: \
412
	mix==20	|| mix==22									? e2+1  : nop()
413
414
istart2=mix==2 || mix==3 ? e1+1 : mix==6 || mix==7 ? e2+1 : nop()
415
416
pstart1=mix==8 || mix==9 || mix==10 || mix==19 || mix==21 					? 0 	: \
417
	mix==11 || mix==12 || mix==13 || mix==14 || mix==16 || mix==18 || mix==20 || mix==22  	? e1+1 	: \
418
	mix==15	|| mix==17									? e2+1  : nop()
419
420
pstart2=mix==9 || mix==10 ? e1+1 : mix==13 || mix==14 ? e2+1 : nop()
421
422
estart1=mix==4 || mix==5 || mix==6 || mix==7 || mix==11 || mix==12 || mix==13 || mix==14 || mix==15 || mix==17 || mix==20 || mix==22	? 0 	: \
423
	mix==1 || mix==2 || mix==3 || mix==16 || mix==18  										? i1+1 	: \
424
	mix==8 || mix==9 || mix==10 || mix==19 || mix==21										? p1+1  : nop()
425
426
estart2=mix==4 || mix==6 || mix==7 || mix==15 || mix==17 || mix==21  	? i1+1 	: \
427
	mix==3 								? i2+1  : \
428
	mix==11 || mix==13 || mix==14 || mix==16 || mix==20 || mix==22 	? p1+1 	: \
429
	mix==10								? p2+1  : nop()
430
431
estart3=mix==7 ? i2+1 : mix==14 ? p2+1 : mix==17 ? p1+1 : mix==22 ? i1+1 : nop()
432
433
maxfps = defined(i1) ? framerate(i) : defined(p1) ? framerate(i) : nop()
434
435
#Final 24fps ivtced clip and deinterlaced + framerate converted for CFR (omode=1)
436
tocfrfinalt = omode==1 ? (mode==1) ? fmdecim : (mode==2) ? fbdecim : (mode==3) ? dhtdecim : (mode==4 && omode==1) ? blenddecim : nop() : nop()
437
tocfrfinali = omode==1 && creds ? (credconv=="mocomp") ? fpsconvi : (credconv=="blend") ? blendi : credconv=="drop" ? dropi : nop() : nop()
438
tocfrfinalp = omode==1 && creds ? (credconv=="mocomp") ? fpsconvp : (credconv=="blend") ? blendp : credconv=="drop" ? dropp : nop() : nop()
439
440
#Final 30fps clips (prepare for hybrid decimation, make everything 30fps) for hybrid use fm since it will be spliced (txt file will be useless) (used when creds=true)
441
tovfrfinalt = omode==2 && creds ? (mode==1) ? fm : (mode==2) ? fbdecim.changefps(maxfps) : (mode==3) ? dhtdecim.changefps(maxfps) : (mode==4 && omode==2) ? fm : nop() : nop()
442
tovfrfinali = omode==2 && creds ? credbob : nop()
443
tovfrfinalp = omode==2 && creds ? blendbg : nop()
444
445
#Final clip to splice
446
spliceprept = mix!=0 ? omode==1 ? tocfrfinalt : omode==2 ? tovfrfinalt : nop() : nop()
447
spliceprepi = mix!=0 ? omode==1 ? tocfrfinali : omode==2 ? tovfrfinali : nop() : nop()
448
spliceprepp = mix!=0 ? omode==1 ? tocfrfinalp : omode==2 ? tovfrfinalp : nop() : nop()
449
450
#######################
451
###Trim
452
#Factor to get the proper trim values after decimating
453
factor = omode==1 ? defined(i1) ? float(framerate(tocfrfinali)/framerate(i)) : defined(p1) ? float(framerate(tocfrfinalp)/framerate(i)) : nop() : nop()
454
455
et1 = 	defined(e1) ? omode==2 ? spliceprept.trim(estart1,e1) : spliceprept.trim(int(estart1*factor),int(e1*factor)) : nop()
456
et2 = 	defined(e2) ? omode==2 ? spliceprept.trim(estart2,e2) : spliceprept.trim(int(estart2*factor),int(e2*factor)) : nop()
457
et3 = 	defined(e3) ? omode==2 ? spliceprept.trim(estart3,e3) : spliceprept.trim(int(estart3*factor),int(e3*factor)) : nop()
458
459
ci1 = 	defined(i1) ? omode==2 ? spliceprepi.trim(istart1,i1) : spliceprepi.trim(int(istart1*factor),int(i1*factor)) : nop()
460
ci2 = 	defined(i2) ? omode==2 ? spliceprepi.trim(istart2,i2) : spliceprepi.trim(int(istart2*factor),int(i2*factor)) : nop()
461
462
#Prepare 30p sections for splicing
463
cp1 = 	defined(p1) ? omode==2 ? spliceprepp.trim(pstart1,p1) : spliceprepp.trim(int(pstart1*factor),int(p1*factor)) : nop()
464
cp2 = 	defined(p2) ? omode==2 ? spliceprepp.trim(pstart2,p2) : spliceprepp.trim(int(pstart2*factor),int(p2*factor)) : nop()
465
466
spliced=(mix==1) ? 	ci1 + 	et1 : \
467
	(mix==2) ? 	ci1 + 	et1 + 	ci2 : \
468
	(mix==3) ? 	ci1 + 	et1 + 	ci2 + 	et2 : \ 
469
	(mix==4) ? 	et1 + 	ci1 + 	et2 : \
470
	(mix==5) ? 	et1 + 	ci1 : \ 
471
	(mix==6) ? 	et1 + 	ci1 + 	et2 + 	ci2 : \
472
	(mix==7) ? 	et1 + 	ci1 + 	et2 + 	ci2 + 	et3 : \
473
	(mix==8) ? 	cp1 + 	et1 : \
474
	(mix==9) ? 	cp1 + 	et1 + 	cp2 : \
475
	(mix==10) ? 	cp1 + 	et1 + 	cp2 + 	et2 : \ 
476
	(mix==11) ? 	et1 + 	cp1 + 	et2 : \
477
	(mix==12) ? 	et1 + 	cp1 : \ 
478
	(mix==13) ? 	et1 + 	cp1 + 	et2 + 	cp2 : \
479
	(mix==14) ? 	et1 + 	cp1 + 	et2 + 	cp2 + 	et3 : \
480
	(mix==15) ? 	et1 + 	ci1 + 	et2 + 	cp1 : \
481
	(mix==16) ? 	ci1 + 	et1 + 	cp1 + 	et2 : \
482
	(mix==17) ?	et1 + 	ci1 + 	et2 + 	cp1 +	et3 : \
483
	(mix==18) ? 	ci1 + 	et1 + 	cp1 : \
484
	(mix==19) ? 	cp1 + 	et1 + 	ci1 : \ 
485
	(mix==20) ? 	et1 + 	cp1 + 	et2 + 	ci1 : \
486
	(mix==21) ? 	cp1 + 	et1 + 	ci1 + 	et2 : \
487
	(mix==22) ? 	et1 + 	cp1 + 	et2 + 	ci1 +	et3 : \
488
	NOP()
489
490
finalcfr =  omode==1 ? creds ? spliced : tocfrfinalt : nop()
491
tovfrdec1 = omode==2 ? creds ? spliced : chrfix ? debprep : hybridfm : nop()
492
tovfrdec2 = omode==2 ? rendering ? i : creds ? spliced : chrfix ? debprep : fm : nop()
493
494
finalvfr = 	omode==2 && pass==1 ? nvfr ? tovfrdec1.TDecimate(4, output="stats.txt",denoise=true,vidThresh=0.8,dupThresh=0.9) : tovfrdec1.TDecimate(4, output="stats.txt") :
495
\		omode==2 && pass==2 ? nvfr ? tovfrdec2.TDecimate(5,hybrid=2,tfmin=creds ? "" : "tfm.txt",input="stats.txt",mkvout="timecodes.txt",tcfv1=tcfv1,batch=true,vidThresh=0.4,dupThresh=0.6) : tovfrdec2.TDecimate(5,hybrid=2,tfmin=creds ? "" : "tfm.txt",input="stats.txt",mkvout="timecodes.txt",tcfv1=tcfv1,batch=true) : nop()
496
497
topp = omode==1 ? finalcfr : omode==2 ? finalvfr : nop()
498
499
#Kill combing depending on user settings
500
dec = 	killcomb==0 ? topp : 
501
\	killcomb==1 ? topp.vinverse() : 
502
\	killcomb==2 ? topp.vinverseD() : 
503
\	killcomb==3 ? topp.daa3() : 
504
\		interleave(	topp.		 subtitle("killcomb=0",align=9),
505
\				topp.vinverse(). subtitle("killcomb=1",align=9),
506
\				topp.vinverseD().subtitle("killcomb=2",align=9),
507
\				topp.daa3().subtitle("killcomb=3",align=9))
508
509
aaed = 	aa==0 ? dec : 
510
\	aa==1 ? dec.ediaa() : 
511
\	aa==2 ? dec.daa3() : 
512
\	aa==3 ? dec.maa() : 
513
\	aa==4 ? dec.sharpaamcmod(dark,thin,sharp,smooth,stabilize,tradius,aapel,aaov,aablk,aatype) : 
514
\			interleave(	dec.		subtitle("aa=0",align=9),
515
\					dec.ediaa().	subtitle("aa=1",align=9),
516
\					dec.daa3().	subtitle("aa=2",align=9),
517
\					dec.maa().	subtitle("aa=3",align=9),
518
\					dec.sharpaamcmod(dark,thin,sharp,smooth,stabilize,tradius,aapel,aaov,aablk,aatype).subtitle("aa=4",align=9))
519
520
return omode==2 && pass==1 ? finalvfr : aaed
521
}
522
523
524
function chroma_rep(clip source, int "cache")
525
{
526
###### parameters & other necessary vars ######
527
    cache   = default(cache,-1)
528
529
530
###### source preparation & lut ######
531
global  out1    = source
532
global  out2    = mergechroma(source,mt_adddiff(source.trim(1,0),mt_makediff(source.trim(1,0),source.trim(2,0),y=1,u=3,v=3),y=1,u=3,v=3).blur(1))
533
534
535
###### initialise variables ######
536
global  alfr     = -100
537
538
539
###### evaluation call & output calculation ######
540
scriptclip( source, """
541
542
 ### preparation ###
543
        cfr = current_frame
544
        ajmp = alfr+1==cfr
545
        
546
    global  alfr = cfr
547
548
        al_v = LumaDifference(out1.trim(1,0),out1.trim(2,0))
549
        ac_v = ChromaUDifference(out1.trim(1,0),out1.trim(2,0)) + ChromaVDifference(out1.trim(1,0),out1.trim(2,0))
550
551
  ## luma value shifting ##
552
    l10 = ajmp ? l01 : al_v
553
global 		l01	= ajmp ? l12 : al_v
554
global 		l12	= al_v
555
  
556
  ## chroma value shifting ##
557
    c10 = ajmp ? c01 : ac_v
558
global 		c01 = ajmp ? c12 : ac_v
559
global 		c12 = ac_v
560
	
561
 ### condition ###
562
    change  = l12*3<l01 && c01*1.5<c12
563
    chango  = l01*3<l10 && c10*1.5<c01
564
    
565
    change ? out2 : chango ? out1.trim(1,0) : out1
566
567
""")
568
569
570
###### final decimation & caching ######
571
cache<0 ? last : last.RequestLinear(8, cache, 5, false, false)
572
573
return last
574
}
575
576
577
function chroma_rep2(clip source, int "cache")
578
{
579
###### parameters & other necessary vars ######
580
    cache   = default(cache,-1)
581
582
583
###### source preparation & lut ######
584
global  out1    = source
585
global  out2    = mergechroma(source,mt_adddiff(source.trim(1,0),mt_makediff(source.trim(1,0),source.trim(2,0),y=1,u=3,v=3),y=1,u=3,v=3).blur(1))
586
587
588
###### initialise variables ######
589
global  alfr     = -100
590
591
592
###### evaluation call & output calculation ######
593
chrixout = scriptclip( source, """
594
595
 ### preparation ###
596
        cfr = current_frame
597
        ajmp = alfr+1==cfr
598
        
599
    global  alfr = cfr
600
601
        al_v = LumaDifference(out1,out1.trim(1,0))
602
        ac_v = ChromaUDifference(out1,out1.trim(1,0)) + ChromaVDifference(out1,out1.trim(1,0))
603
604
  ## luma value shifting ##
605
    l10 = ajmp ? l01 : al_v
606
global 		l01	= ajmp ? l12 : al_v
607
global 		l12	= al_v
608
  
609
  ## chroma value shifting ##
610
    c10 = ajmp ? c01 : ac_v
611
global 		c01 = ajmp ? c12 : ac_v
612
global 		c12 = ac_v
613
	
614
 ### condition ###
615
    change  = l12*3<l01 && c01*1.5<c12
616
    chango  = l01*3<l10 && c10*1.5<c01
617
    
618
    change ? out2 : chango ? out1.trim(1,0) : out1
619
620
""")
621
622
623
###### final decimation & caching ######
624
chrixout2 = cache<0 ? source.mergechroma(chrixout) : source.mergechroma(chrixout).RequestLinear(8, cache, 5, false, false)
625
626
return chrixout2
627
}
628
629
630
#based on smartfade v0.2 by martino - Aimed at removing interlaced fades in anime. Uses luma difference between two fields as activation threshold.
631
#mod by thetoof : removed degrainmedian post-processing, 
632
#		changed how the fields are blended together (average of 2 nnedi interpolations + contra-sharpening to retain more detail) and 
633
#		added cache parameter to forward the setting of animeivtc to this function
634
#		renamed global parameter to something less general than "threshold"
635
636
function smartfademod(clip c, float "sfthr", bool "sfshow", int "cache") {
637
    
638
global sfthr	= default ( sfthr,  0.4 ) # Threshold for fade detection.
639
show		= default ( sfshow, false ) # Displays luma difference between fields without processing anything.
640
cache		= default ( cache,   10 ) # Cache the frames to help seeking and other functions requesting many frames
641
642
show ? scriptclip(c, "subtitle(string(abs(	  separatefields().selectodd().averageluma() \
643
            				- separatefields().selecteven().averageluma())))") : \
644
       scriptclip(c, "sep = separatefields() \
645
       avg = sep.selectodd().averageluma() - sep.selecteven().averageluma() \
646
       abs(avg) > sfthr ? interleave(sep.selecteven(),sep.selectodd()).weave().daa3() : last")
647
648
cache<0 ? last : last.RequestLinear(8, cache, 5, false, false)
649
650
    return last
651
652
}
653
654
#Suggested by Mystery Keeper in "Denoise of tv-anime" thread
655
function ediaa(clip a) {return a.EEDI2(field=1).TurnRight().EEDI2(field=1).TurnLeft().spline36resize(a.width,a.height,-0.5,-0.5)}
656
657
#Anti-aliasing with contra-sharpening by Didée
658
function daa(clip c) {
659
nn	= c.nnedi2(field=-2)
660
dbl   	= mt_average(selecteven(nn),selectodd(nn),U=3,V=3)
661
dblD 	= mt_makediff(c,dbl,U=3,V=3)
662
shrpD 	= mt_makediff(dbl,dbl.removegrain((width(c)>1100) ? 20 : 11),U=3,V=3)
663
DD 	= shrpD.repair(dblD,13)
664
return dbl.mt_adddiff(DD,U=3,V=3) }
665
666
#Anti-aliasing with edge masking by martino, mask using "sobel" taken from Kintaro's useless filterscripts and modded by thetoof for spline36
667
function maa(clip input, int "mask") {
668
mask = input.mt_edge("sobel",7,7,5,5).mt_inflate()
669
aa_clip=input.spline36Resize(width(input)*2,height(input)*2).TurnLeft().SangNom().TurnRight().SangNom().spline36Resize(width(input),height(input)).MergeChroma(input) 
670
return mt_merge(input,aa_clip,mask) }
671
672
#Developped in the "fine anime antialiasing thread"
673
function SharpAAMCmod(clip orig, float "dark", int "thin", int "sharp", int "smooth", bool "stabilize", int "tradius", int "aapel", int "aaov", int "aablk", string "aatype")
674
{
675
dark	= default ( dark,     0.2 ) # strokes darkening strength
676
thin	= default ( thin,      10 ) # Presharpening
677
sharp	= default ( sharp,    150 ) # Postsharpening
678
smooth	= default ( smooth,    -1 ) # Postsmoothing
679
stabilize= default ( stabilize,false ) # Use post stabilization with Motion Compensation
680
Tradius	= default ( Tradius,    2 ) # 2 = MDegrain2 / 3 = MDegrain3 
681
aapel	= default ( aapel,      1 ) # accuracy of the motion estimation (Value can only be 1, 2 or 4. 1 means a precision to the pixel. 2 means a precision to half a pixel, 4 means a precision to quarter a pixel, produced by spatial interpolation (better but slower).)
682
aaov	= default ( aaov,       (orig.width>1100) ? 8 : 4 ) # block overlap value (horizontal). Must be even and less than block size. (Higher = more precise & slower)
683
aablk	= default ( aablk,      (orig.width>1100) ? 16 : 8 ) # Size of a block (horizontal). It's either 4, 8 or 16 ( default is 8 ). Larger blocks are less sensitive to noise, are faster, but also less accurate.
684
aatype	= default ( aatype, "Sangnom" ) # Use Sangnom() or EEDI2() for anti-aliasing
685
686
w=width(orig)
687
h=height(orig)
688
m=mt_logic( orig.DEdgeMask(0,255,0,255,"5 10 5 0 0 0 -5 -10 -5", divisor=4,Y=3,U=3,V=3)
689
 \       ,orig.DEdgeMask(0,255,0,255,"5 0 -5 10 0 -10 5 0 -5", divisor=4,Y=3,U=3,V=3)
690
 \       ,"max").mt_lut("x 128 / 0.86 ^ 255 *")
691
preaa=(thin==0 && dark==0) ? orig : (thin==0) ? orig.Toon(dark) : (dark==0) ? orig.awarpsharp2(depth=thin) : orig.Toon(dark).awarpsharp2(depth=thin)
692
aa= (aatype=="Sangnom") ? preaa.spline36resize(w*2,h*2).TurnLeft().SangNom().TurnRight().SangNom().spline36resize(w,h) : (aatype=="EEDI2") ? preaa.ediaa() : blankclip(pixel_type="YV12").subtitle("Please use Sangnom or EEDI2 for aatype")
693
postsh=(sharp==0 && smooth==0) ? aa : aa.lsfmod(edgemode=1,strength=sharp,overshoot=1,soft=smooth)
694
merged=mt_merge(orig,postsh,m,Y=3,U=3,V=3)
695
696
sD=mt_makediff(orig,merged)
697
698
origsuper= orig.MSuper(pel=aapel)
699
sDsuper  = sD.  MSuper(pel=aapel, levels=1)
700
701
702
fv3 = tradius==3 ? origsuper.MAnalyse(isb=false,delta=3,overlap=aaov,blksize=aablk) : nop()
703
fv2 = tradius>=2 ? origsuper.MAnalyse(isb=false,delta=2,overlap=aaov,blksize=aablk) : nop()
704
fv1 = tradius>=1 ? origsuper.MAnalyse(isb=false,delta=1,overlap=aaov,blksize=aablk) : nop()
705
bv1 = tradius>=1 ? origsuper.MAnalyse(isb=true, delta=1,overlap=aaov,blksize=aablk) : nop()
706
bv2 = tradius>=2 ? origsuper.MAnalyse(isb=true, delta=2,overlap=aaov,blksize=aablk) : nop()
707
bv3 = tradius==3 ? origsuper.MAnalyse(isb=true, delta=3,overlap=aaov,blksize=aablk) : nop()
708
sDD = tradius==1 ? sD.MDegrain1(sDsuper,bv1,fv1) : tradius==2 ? sD.MDegrain2(sDsuper,bv1,fv1,bv2,fv2) : sD.MDegrain3(sDsuper,bv1,fv1,bv2,fv2,bv3,fv3)
709
710
reduc = 0.4
711
sDD = mt_lutxy(sD,sDD,"x 128 - abs y 128 - abs < x y ?").mergeluma(sDD,1.0-reduc)
712
713
return stabilize ? orig.mt_makediff(sDD,U=2,V=2) : merged
714
}
715
716
# Kill Combing Function from mcbob
717
function VinverseD(clip clp, float "sstr", int "amnt", int "uv")
718
{
719
uv   = default(uv,3)
720
sstr = default(sstr,2.7)
721
amnt = default(amnt,255)
722
uv2  = (uv==2) ? 1 : uv
723
STR  = string(sstr)
724
AMN  = string(amnt)
725
vblur  = clp.mt_convolution("1","50 99 50",U=uv,V=uv)
726
vblurD = mt_makediff(clp,vblur,U=uv2,V=uv2)
727
Vshrp  = mt_lutxy(vblur,vblur.mt_convolution("1","1 4 6 4 1",U=uv2,V=uv2),expr="x x y - "+STR+" * +",U=uv2,V=uv2)
728
VshrpD = mt_makediff(Vshrp,vblur,U=uv2,V=uv2)
729
VlimD  = mt_lutxy(VshrpD,VblurD,expr="x 128 - y 128 - * 0 < x 128 - abs y 128 - abs < x y ? 128 - 0.25 * 128 + x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
730
mt_adddiff(Vblur,VlimD,U=uv,V=uv)
731
(amnt>254) ? last : (amnt==0) ? clp : mt_lutxy(clp,last,expr="x "+AMN+" + y < x "+AMN+" + x "+AMN+" - y > x "+AMN+" - y ? ?",U=uv,V=uv) 
732
return(last)
733
}