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