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