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