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