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