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