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