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