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