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