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