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