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