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