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