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