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