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