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