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