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