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