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