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