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