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