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