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