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