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