View difference between Paste ID: PgnSUB2E and 0Eqv56dP
SHOW: | | - or go back to the newest paste.
1-
###### srestore v2.77 ######
1+
###### srestore v2.78 ######
2
# ==================================================================================================================================
3
# Change List
4
#
5
# 06/15/2017 AmjadSONY
6
# - Update v2.77 -> v2.78
7
#  some fix
8
#
9
# 05/25/2017 AmjadSONY
10
# - Update v2.76 -> v2.77
11
#  fix high bit depth
12
#
13
# 03/31/2017 AmjadSONY
14
# - Update v2.75 -> v2.76
15
#  update to masktools 2.2.5
16
#
17
# 03/09/2017 AmjadSONY
18
# - Update v2.7i -> v2.75
19
#  now work with all high bit depth in avs+
20
#
21
# 02/09/2017 AmjadSONY
22
# - Update v2.7h -> v2.7i
23
#  clean up and add YUY2 and other format
24
#
25
# 03/23/2014 AmjadSONY
26
# - Update v2.7g -> v2.7h
27
#  update to use new Average by tp7
28
#
29
# 11/12/2013 martin53
30
# - Update v2.7f -> v2.7g
31
#  Refactored to use a single line ScriptClip() call like v2.7e - Neccessary to save AviSynth string heap space when RTE is called
32
#
33
# 10/28/2013 martin53
34
# - Update v2.7e -> v2.7f
35
# Callable more than once from the same script with help of unique global variables per instance.
36
# Moderate reformatting to re-establish readability with the new variable names.
37
# Needs GRunT plugin
38
#
39
# ==================================================================================================================================
40
41
function Srestore(clip sourceo, float "frate", "omode", float "speed", float "blocks", int "mode", float "thresh", int "cache", clip "dclip")
42
{
43-
sislumaonly = ssispmt ? sourceo.isy() : VersionNumber() < 2.6 ? false : sourceo.isy8()
43+
44
nonyuy2=avs26 && sourceo.isyuy2()
45
source=nonyuy2 ? sourceo.nonyuy2clipin(true) : sourceo
46
ssispmt   = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
47
sislumaonly = ssispmt ? sourceo.isy() : !avs26 ? false : sourceo.isy8()
48
###### parameters & other necessary vars ######
49
    srad  = isfloat(speed) && abs(speed)>=1 ? sqrt(abs(speed))*4 : 12
50
    cache = default(cache, -1)
51
    irate = framerate(source)
52
    bsize = isfloat(speed) && speed>0 ? 16 : 32
53
54
	dm      = default(mode, 2)
55
	om      = default(omode, 6)
56
	bom     = isstring(om)
57
	thr     = abs(default(thresh, 16))+0.01
58
	frfac   = bom || abs(om-3)<2.5 ? 1 : isfloat(frate) ? frate*5<irate || frate>irate ? 1 :
59
			\ abs(frate)/irate : round(irate*10010)%30000==0 ? 1001./2400. : 480./1001.
60
61
	numr    = abs(frfac*1001-round(frfac*1001))<0.01 ? round(frfac*1001) :
62
			\ abs(1001/frfac-round(1001/frfac))<0.01 ? 1001 : round(frfac*9000)
63
	numr    = isfloat(frate) && abs(irate*numr/float(round(numr/frfac))-frate) >
64
			\ abs(irate*round(frate*100)/float(round(irate*100))-frate) ? round(frate*100) : numr
65
	denm    = round(numr/frfac)
66
67-
	det	= dm<0 || sislumaonly || VersionNumber() < 2.6 ? det : ssispmt ? det.converttoy() : avs26 ? det.converttoy8() : det.converttoyv16()
67+
68
	out = source
69
	mec = abs(dm)<2 || bom ? nop() : mergeluma(mergechroma(out, out.trim(1, 0), 0.5), out.trim(1, 0), 0.5)
70
	det	= default(dclip, source).killaudio()
71-
	det	= !sislumaonly && dm<0 && !sis420 ? stackvertical(stackvertical(ssispmt ? det.ExtractU() : avs26 ? det.utoy8() : det.utoy(), ssispmt ? det.ExtractV() : avs26 ? det.vtoy8() : det.vtoy()), ssispmt ? det.converttoy() : avs26 ? det.converttoy8() : det) : det
71+
	det	= dm<0 || sislumaonly ? det : ssispmt ? det.converttoy() : avs26 ? det.converttoy8() : det.converttoyv12()
72-
	det = bom ? VersionNumber() < 2.6 ? det.mt_lut("x 0.5 * 64 +", y=3, u=1, v=1) : det.mt_lut("x 0.5 * 64 scalef +", y=3, u=1, v=1) : det
72+
73
  	sis420  = ssispmt ? det.is420() : det.isyv12()
74-
		code0   = VersionNumber() < 2.6 ? "x 128 - y 128 - * 0 > x 128 - abs y 128 - abs < x 128 - 128 x - * y 128 - 128 y - * ? x y + 256 - x y + 256 - * ? 0.25 * 128 +"
74+
75-
			  \			: "x range_half - y range_half - * 0 > x range_half - abs y range_half - abs < x range_half - range_half x - * y range_half - range_half y - * ? x y + range_size - dup * ? 0.25 * range_half +"
75+
	det	= !sislumaonly && dm<0 && !sis420 ? stackhorizontal(stackhorizontal(ssispmt ? det.ExtractU() : avs26 ? det.utoy8() : det.utoy(), ssispmt ? det.ExtractV() : avs26 ? det.vtoy8() : det.vtoy()), ssispmt ? det.converttoy() : avs26 ? det.converttoy8() : det) : det
76-
		code1   = VersionNumber() < 2.6 ? "x y - 2 ^ 3 * x y + 256 - 2 ^ - 128 +" : "x y - dup * 3 * x y + range_size - 2 ^ - range_half +"
76+
	det = bom ? !avs26 ? det.mt_lut("x 0.5 * 64 +", y=3, u=1, v=1) : det.mt_lut("x 0.5 * 64 scalef +", y=3, u=1, v=1) : det
77
78-
	bclp    = bom==false ? mt_lutxy(diff, diff.trim(1, 0), expr=code0, y=3, u=1, v=1).bilinearresize(bsize, bsize) :
78+
		code0   = !avs26 ? "x 128 - y 128 - * 0 > x 128 - abs y 128 - abs < x 128 - 128 x - * y 128 - 128 y - * ? x y + 256 - x y + 256 - * ? 0.25 * 128 +"
79-
			\ mt_lutxy(diff.trim(1, 0), mt_adddiff(diff, diff.trim(2, 0), y=3, u=1, v=1), expr=code1, y=3, u=1, v=1).bilinearresize(bsize, bsize)
79+
			  \	 : "x range_half - y range_half - * 0 > x range_half - abs y range_half - abs < x range_half - range_half x - * y range_half - range_half y - * ? x y + range_size - dup * ? 0.25 * range_half +"
80-
	dclp    = VersionNumber() < 2.6 ? diff.trim(1, 0).mt_lut("x 128 - abs 1.1 ^ 1 -", y=3, u=1, v=1).bilinearresize(bsize, bsize)
80+
		code1   = !avs26 ? "x y - 2 ^ 3 * x y + 256 - 2 ^ - 128 +" : "x y - dup * 3 * x y + range_size - 2 ^ - range_half +"
81-
		  \			: diff.trim(1, 0).mt_lut("x range_half - abs 1.1 ^ 1 scalef -", y=3, u=1, v=1).bilinearresize(bsize, bsize)
81+
82
	bclp    = !bom ? mt_lutxy(diff, diff.trim(1, 0), expr=code0, y=3, u=1, v=1).bilinearresize(bsize, bsize) :
83
		       \ mt_lutxy(diff.trim(1, 0), mt_adddiff(diff, diff.trim(2, 0), y=3, u=1, v=1), expr=code1, y=3, u=1, v=1).bilinearresize(bsize, bsize)
84
	dclp    = !avs26 ? diff.trim(1, 0).mt_lut("x 128 - abs 1.1 ^ 1 -", y=3, u=1, v=1).bilinearresize(bsize, bsize)
85
		  \	 : diff.trim(1, 0).mt_lut("x range_half - abs 1.1 ^ 1 scalef -", y=3, u=1, v=1).bilinearresize(bsize, bsize)
86
87
	###### POSTPROCESSING ######
88
    unblend1    = bom ? average(out, 2.0, out.loop(2, 0, 0), -1.0) : nop()
89
    unblend2    = bom ? average(out.trim(2, 0), -1.0, out.trim(1, 0), 2.0) : nop()
90
91-
    bmask	= bom ? VersionNumber() < 2.6 ? mt_lutxy(qmask1, qmask2, expr="x y - == 128 x 128 - 2 ^ x 128 - 2 ^ y 128 - 2 ^ + / 255 *", y=3, u=1, v=1)
91+
92-
			\		      : mt_lutxy(qmask1, qmask2, expr="clamp_f_i8 x range_half - dup * dup y range_half - dup * + / range_max *", y=3, u=1, v=1) : nop()
92+
93-
    dmask	= bom ? VersionNumber() < 2.6 ? mt_lutxy(diffm, diffm.trim(2, 0), expr="x 2 * y < x 4 < & 0 y 2 * x < y 4 < & 255 x x y + / 200 * 28 + ? ?", y=3, u=1, v=1)
93+
94-
			\		      : mt_lutxy(diffm, diffm.trim(2, 0), expr="x 2 * y < x 4 scalef < & 0 y 2 * x < y 4 scalef < & range_max x x y + / 200 scalef * 28 scalef + ? ?", y=3, u=1, v=1) : nop()
94+
95-
    pmask	= bom ? VersionNumber() < 2.6 ? mt_lutxy(dmask, bmask, expr="y 0 > y 255 < & x 0 == x 255 == | & x y ?", y=3, u=1, v=1)
95+
    bmask	= bom ? !avs26 ? mt_lutxy(qmask1, qmask2, expr="x y - == 128 x 128 - 2 ^ x 128 - 2 ^ y 128 - 2 ^ + / 255 *", y=3, u=1, v=1)
96-
			\		      : mt_lutxy(dmask, bmask, expr="y 0 > y range_max < & x 0 == x range_max == | & x y ?", y=3, u=1, v=1) : nop()
96+
			\      : mt_lutxy(qmask1, qmask2, expr="clamp_f_i8 x range_half - dup * dup y range_half - dup * + / range_max *", y=3, u=1, v=1) : nop()
97
    dmask	= bom ? !avs26 ? mt_lutxy(diffm, diffm.trim(2, 0), expr="x 2 * y < x 4 < & 0 y 2 * x < y 4 < & 255 x x y + / 200 * 28 + ? ?", y=3, u=1, v=1)
98
			\      : mt_lutxy(diffm, diffm.trim(2, 0), expr="x 2 * y < x 4 scalef < & 0 y 2 * x < y 4 scalef < & range_max x x y + / 200 scalef * 28 scalef + ? ?", y=3, u=1, v=1) : nop()
99
    pmask	= bom ? !avs26 ? mt_lutxy(dmask, bmask, expr="y 0 > y 255 < & x 0 == x 255 == | & x y ?", y=3, u=1, v=1)
100
			\      : mt_lutxy(dmask, bmask, expr="y 0 > y range_max < & x 0 == x range_max == | & x y ?", y=3, u=1, v=1) : nop()
101
102
    pp0 = bom ? average(out.trim(2, 0), -0.5, out.trim(1, 0), 1.0, out, 1.0, out.loop(2, 0, 0), -0.5) : nop()
103
    pp1 = bom ? mt_merge(unblend1, unblend2, dmask.removegrain(mode=12, modeU=-1, modeV=-1).greyscale(), y=3, u=sislumaonly ? 1 : 3, v=sislumaonly ? 1 : 3) : nop()
104
    pp2 = bom ? mt_merge(unblend1, unblend2, bmask.removegrain(mode=12, modeU=-1, modeV=-1), luma=!sislumaonly) : nop()
105
    pp3 = bom ? mt_merge(unblend1, unblend2, pmask.removegrain(mode=12, modeU=-1, modeV=-1), luma=!sislumaonly).removegrain(mode=0, modeU=12, modeV=12) : nop()
106
107
	fin  = bom ? eval(om) : nop()
108
109
	#######################################
110
    # Unique Identifier Definition
111
    #######################################
112
	Try { global Srestore_InstanceNumber = Srestore_InstanceNumber+1 } catch(err) { global Srestore_InstanceNumber = 1 }
113
114
	# Runtime Environment Preparation & Call
115
	Eval(StrReplace("""	#"
116
        #######################################
117
        # 1) Unique Global Variables Initialization
118
        #######################################
119
		global  Srestore_lfr%%%     = -100
120
		global  Srestore_offs%%%    = 0
121
		global  Srestore_ldet%%%    = -100
122
		global  Srestore_lpos%%%    = 0
123
124-
		ARGS = "dm, om, bom, thr, frfac, numr, denm, mec, det, bclp, dclp, fin"
124+
125
        # 2) Unique Runtime Call
126-
		GScriptClip("srestore_inside_%%%(last, dm, om, bom, thr, frfac, numr, denm, mec, det, bclp, dclp, fin)", local=true, args=ARGS)
126+
127
		###### evaluation call & output calculation ######
128
		ARGS = "dm, om, bom, thr, frfac, numr, denm, mec, det, bclp, dclp, fin, ssispmt"
129
		source
130
		GScriptClip("srestore_inside_%%%(last, dm, om, bom, thr, frfac, numr, denm, mec, det, bclp, dclp, fin, ssispmt)", local=true, args=ARGS)
131
132
		###### final decimation & caching ######
133
		nonyuy2 ? nonyuy2clipout(true) : last
134
		cache<0 ? last : last.RequestLinear(8, cache, 5, false, false)
135
136
		temp    = frameratenumerator(det)*float(numr)>2147483600. ? det.assumescaledfps(numr, denm) : nop()
137
		isclip(temp) ? last.changefps(temp, linear=true) : last.changefps(frameratenumerator(source)*numr, frameratedenominator(source)*denm, linear=true)
138
139
		return last
140-
		function srestore_inside_%%%(clip source, dm, om, bom, thr, frfac, numr, denm, mec, det, bclp, dclp, fin) {
140+
141-
			ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0
141+
142
        # 3) Unique Runtime Function Definition
143-
			sIsbhd  = ssispmt ? source.BitsPerComponent() > 8 : false
143+
144-
			sdoscal = !ssIsVF && sIsbhd
144+
		function srestore_inside_%%%(clip source, dm, om, bom, thr, frfac, numr, denm, mec, det, bclp, dclp, fin, ssispmt) {
145-
			sbhdbpc = sdoscal ? source.BitsPerComponent() : 8
145+
146-
			sscalva = sdoscal ? sbhdbpc == 10 ? 4 : sbhdbpc == 12 ? 8 : sbhdbpc == 14 ? 64 : 256 : 1
146+
			shbdbpc = ssispmt ? source.BitsPerComponent() : 8
147-
			v015625 = ssIsVF ? .0000612745098039 : .015625
147+
			sIshbd  = shbdbpc > 8
148-
			vp125   = ssIsVF ? .0004901960784314 : .125
148+
			sdoscal = !ssIsVF && sIshbd
149-
			vp01    = ssIsVF ? .0000392156862745 : .01
149+
			sscalva = sdoscal ? shbdbpc == 10 ? 4 : shbdbpc == 12 ? 8 : shbdbpc == 14 ? 64 : 256 : 1
150-
			vp45    = ssIsVF ? .0017647058823529 : .45
150+
				ssIsVF ? eval("
151-
			vp55    = ssIsVF ? .002156862745098 : .55
151+
			v015625 = .0000612745098039
152-
			vp51    = ssIsVF ? .002 : .51
152+
			vp125   = .0004901960784314
153-
			vp35    = ssIsVF ? .0013725490196078 : .35
153+
			vp01    = .0000392156862745
154-
			v0p5    = ssIsVF ? 0.0019607843137255 : 0.5
154+
			vp45    = .0017647058823529
155-
			v1      = ssIsVF ? 0.003921568627451 : sdoscal ? sscalva : 1
155+
			vp55    = .002156862745098
156-
			v125    = ssIsVF ? 0.4901960784313725 : sdoscal ? 125*sscalva : 125
156+
			vp51    = .002
157-
			svhalf  = ssIsVF ? 0.5 : sdoscal ? sbhdbpc == 10 ? 512 : sbhdbpc == 12 ? 1024 : sbhdbpc == 14 ? 8192 : 32768 : 128
157+
			vp35    = .0013725490196078
158
			v0p5    = 0.0019607843137255
159-
			out = source
159+
			v1      = 0.003921568627451
160
			v125    = 0.4901960784313725
161
						") : \
162
							eval("
163
			v015625 = .015625
164
			vp125   = .125
165
			vp01    = .01
166
			vp45    = .45
167
			vp55    = .55
168
			vp51    = .51
169
			vp35    = .35
170
			v0p5    = 0.5
171
			v1      = 1
172
			v125    = sdoscal ? 125*sscalva : 125
173
								")
174
			svhalf  = ssIsVF ? 0.5 : sdoscal ? shbdbpc == 10 ? 512 : shbdbpc == 12 ? 1024 : shbdbpc == 14 ? 8192 : 32768 : 128
175
			thr     = ssIsVF ? thr/255 : sdoscal ? thr*sscalva : thr
176
177
			### preparation ###
178
			cfr = current_frame
179
			jmp = Srestore_lfr%%%+1==cfr
180
			cfo = (((cfr%denm)*numr*2+denm+(versionnumber()>2.575 ? numr : 0))%(2*denm))-denm
181
			bfo = cfo>-numr && cfo<=numr
182
183
			global	Srestore_lfr%%%     = cfr
184
			global	Srestore_offs%%%    = bfo && Srestore_offs%%%<=-4*numr
185
												\? Srestore_offs%%%+2*denm
186
												\: bfo && Srestore_offs%%%>=4*numr
187
													\? Srestore_offs%%%-2*denm
188
													\: Srestore_offs%%%
189
190
			pos = frfac==1 ? 0 : bfo ? -round((cfo+Srestore_offs%%%)/(2.*numr)) : Srestore_lpos%%%
191
			cof = cfo+Srestore_offs%%%+2*numr*pos
192
193
			global	Srestore_ldet%%%    = cfr+pos==Srestore_ldet%%% ? -1 : cfr+pos
194
195
			## diff value shifting ##
196
			d_v = yplanemax(dclp)+v015625
197
			Srestore_d43%%% = jmp ? Srestore_d32%%% : d_v
198
			global 	Srestore_d32%%% = jmp ? Srestore_d21%%% : d_v
199
			global	Srestore_d21%%% = jmp ? Srestore_d10%%% : d_v
200
			global	Srestore_d10%%% = jmp ? Srestore_d01%%% : d_v
201
			global	Srestore_d01%%% = jmp ? Srestore_d12%%% : d_v
202
			global	Srestore_d12%%% = jmp ? Srestore_d23%%% : d_v
203
			global	Srestore_d23%%% = jmp ? Srestore_d34%%% : d_v
204
			global  Srestore_d34%%% = d_v
205
206
			## diff value shifting ##
207
			m_v = isfloat(om) && abs(om)>5 ? lumadifference(det, det.trim(2, 0))+v015625 : v1
208
			Srestore_m53%%% = jmp ? Srestore_m42%%% : m_v
209
			global 	Srestore_m42%%% = jmp ? Srestore_m31%%% : m_v
210
			global  Srestore_m31%%% = jmp ? Srestore_m20%%% : m_v
211
			global	Srestore_m20%%% = jmp ? Srestore_m11%%% : m_v
212
			global	Srestore_m11%%% = jmp ? Srestore_m02%%% : m_v
213
			global	Srestore_m02%%% = jmp ? Srestore_m13%%% : m_v
214
			global	Srestore_m13%%% = jmp ? Srestore_m24%%% : m_v
215
			global  Srestore_m24%%% = m_v
216
217
			## get blend and clear values ##
218
			b_v = svhalf-yplanemin(bclp)
219
			b_v = b_v<v1 ? vp125 : b_v
220
			c_v = yplanemax(bclp)-svhalf
221
			c_v = c_v<v1 ? vp125 : c_v
222
223
			## blend value shifting ##
224
			Srestore_bp3%%% = jmp ? Srestore_bp2%%% : bom ? b_v-c_v : b_v
225
			global 	Srestore_bp2%%% = jmp ? Srestore_bp1%%% : Srestore_bp3%%%
226
			global	Srestore_bp1%%% = jmp ? Srestore_bn0%%% : Srestore_bp3%%%
227
			global	Srestore_bn0%%% = jmp ? Srestore_bn1%%% : Srestore_bp3%%%
228
			global	Srestore_bn1%%% = jmp ? Srestore_bn2%%% : Srestore_bp3%%%
229
			global	Srestore_bn2%%% = jmp ? Srestore_bn3%%% : Srestore_bp3%%%
230
			global	Srestore_bn3%%% = bom ? b_v-c_v : b_v
231
232
			## clear value shifting ##
233
			Srestore_cp3%%% = jmp ? Srestore_cp2%%% : c_v
234
			global	Srestore_cp2%%% = jmp ? Srestore_cp1%%% : c_v
235
			global	Srestore_cp1%%% = jmp ? Srestore_cn0%%% : c_v
236
			global	Srestore_cn0%%% = jmp ? Srestore_cn1%%% : c_v
237
			global	Srestore_cn1%%% = jmp ? Srestore_cn2%%% : c_v
238
			global	Srestore_cn2%%% = jmp ? Srestore_cn3%%% : c_v
239
			global	Srestore_cn3%%% = c_v
240
241
			## used detection values ##
242
			bb  = select(pos+2, Srestore_bp3%%%, Srestore_bp2%%%, Srestore_bp1%%%, Srestore_bn0%%%, Srestore_bn1%%%)
243
			bc  = select(pos+2, Srestore_bp2%%%, Srestore_bp1%%%, Srestore_bn0%%%, Srestore_bn1%%%, Srestore_bn2%%%)
244
			bn  = select(pos+2, Srestore_bp1%%%, Srestore_bn0%%%, Srestore_bn1%%%, Srestore_bn2%%%, Srestore_bn3%%%)
245
246
			cb  = select(pos+2, Srestore_cp3%%%, Srestore_cp2%%%, Srestore_cp1%%%, Srestore_cn0%%%, Srestore_cn1%%%)
247
			cc  = select(pos+2, Srestore_cp2%%%, Srestore_cp1%%%, Srestore_cn0%%%, Srestore_cn1%%%, Srestore_cn2%%%)
248
			cn  = select(pos+2, Srestore_cp1%%%, Srestore_cn0%%%, Srestore_cn1%%%, Srestore_cn2%%%, Srestore_cn3%%%)
249
250
			dbb = select(pos+2, Srestore_d43%%%, Srestore_d32%%%, Srestore_d21%%%, Srestore_d10%%%, Srestore_d01%%%)
251
			dbc = select(pos+2, Srestore_d32%%%, Srestore_d21%%%, Srestore_d10%%%, Srestore_d01%%%, Srestore_d12%%%)
252
			dcn = select(pos+2, Srestore_d21%%%, Srestore_d10%%%, Srestore_d01%%%, Srestore_d12%%%, Srestore_d23%%%)
253
			dnn = select(pos+2, Srestore_d10%%%, Srestore_d01%%%, Srestore_d12%%%, Srestore_d23%%%, Srestore_d34%%%)
254
			dn2 = select(pos+2, Srestore_d01%%%, Srestore_d12%%%, Srestore_d23%%%, Srestore_d34%%%, Srestore_d34%%%)
255
256
			mb1 = select(pos+2, Srestore_m53%%%, Srestore_m42%%%, Srestore_m31%%%, Srestore_m20%%%, Srestore_m11%%%)
257
			mb  = select(pos+2, Srestore_m42%%%, Srestore_m31%%%, Srestore_m20%%%, Srestore_m11%%%, Srestore_m02%%%)
258
			mc  = select(pos+2, Srestore_m31%%%, Srestore_m20%%%, Srestore_m11%%%, Srestore_m02%%%, Srestore_m13%%%)
259
			mn  = select(pos+2, Srestore_m20%%%, Srestore_m11%%%, Srestore_m02%%%, Srestore_m13%%%, Srestore_m24%%%)
260
			mn1 = select(pos+2, Srestore_m11%%%, Srestore_m02%%%, Srestore_m13%%%, Srestore_m24%%%, vp01)
261
262
263
			### basic calculation ###
264
			bbool   = .8*bc*cb>bb*cc && .8*bc*cn>bn*cc && bc*bc>cc
265
			blend   = bbool && bc*5>cc && dbc+dcn>1.5*thr && (dbb<7*dbc || dbb<8*dcn) && (dnn<8*dcn || dnn<7*dbc) &&
266
					\ (mb<mb1 && mb<mc || mn<mn1 && mn<mc || (dbb+dnn)*4<dbc+dcn || (bb*cc*5<bc*cb || mb>thr) && (bn*cc*5<bc*cn || mn>thr) && bc>thr)
267
268
			clear   = dbb+dbc>thr && dcn+dnn>thr && (bc<2*bb || bc<2*bn) && (dbb+dnn)*2>dbc+dcn && (mc<.96*mb && mc<.96*mn && (bb*2>cb || bn*2>cn) &&
269
					\ cc>cb && cc>cn || frfac>vp45 && frfac<vp55 && .8*mc>mb1 && .8*mc>mn1 && mb>.8*mn && mn>.8*mb)
270
271
			highd   = dcn>5*dbc && dcn>5*dnn && dcn>thr && dbc<thr && dnn<thr
272
273
			lowd    = dcn*5<dbc && dcn*5<dnn && dbc>thr && dnn>thr && dcn<thr && frfac>vp35 && (frfac<vp51 || dcn*5<dbb)
274
275
			res     = (Srestore_d43%%%<thr
276
					  \&& Srestore_d32%%%<thr
277
					  \&& Srestore_d21%%%<thr
278
					  \&& Srestore_d10%%%<thr
279
					  \&& Srestore_d01%%%<thr
280
					  \&& Srestore_d12%%%<thr
281
					  \&& Srestore_d23%%%<thr
282
					  \&& Srestore_d34%%%<thr)
283
					  \|| (dbc*4<dbb && dcn*4<dbb && dnn*4<dbb && dn2*4<dbb)
284
					  \|| (dcn*4<dbc && dnn*4<dbc && dn2*4<dbc)
285
286
287
			### offset calculation ###
288
			odm     = blend ? denm : clear ? 0 : highd ? denm-numr : lowd ? 2*denm-numr : cof
289
			odm     = odm+round((cof-odm)/(2.*denm))*2*denm
290
			odr     = (blend ? denm-numr : clear ? numr : highd ? numr : frfac<v0p5 ? 2*numr : 2*(denm-numr)) * .9
291
292
			cof     = Srestore_ldet%%%<0
293
						\? cof
294
						\: cof>odm+odr
295
							\? cof-Srestore_offs%%%-odm-odr>denm && res
296
								\? odm+2*denm-odr
297
								\: odm+odr
298
							\: cof<odm-odr
299
								\? Srestore_offs%%%>denm && res
300
									\? odm-2*denm+odr
301
									\: odm-odr
302
								\: Srestore_offs%%%<-1.15*denm && res
303
									\? cof+2*denm
304
									\: Srestore_offs%%%>1.25*denm && res
305
										\? cof-2*denm
306
										\: cof
307
308-
			mer     = bom==false && opos==pos && dup==0 && abs(dm)>2 && (dbc*8<dcn || dbc*8<dbb || dcn*8<dbc || dcn*8<dnn || dbc*2<thr ||
308+
309
			global	Srestore_lpos%%%    = pos
310
			opos    = frfac==1 ? 0 : -round((cfo+Srestore_offs%%%+(bfo && Srestore_offs%%%<=-4*numr ? denm : 0))/(2.*numr))
311
			pos     = opos<-2 ? -2 : opos>2 ? 2 : opos
312
313
			### frame output calculation - resync - dup ###
314
			dbb = select(pos+2, Srestore_d43%%%, Srestore_d32%%%, Srestore_d21%%%, Srestore_d10%%%, Srestore_d01%%%)
315
			dbc = select(pos+2, Srestore_d32%%%, Srestore_d21%%%, Srestore_d10%%%, Srestore_d01%%%, Srestore_d12%%%)
316
			dcn = select(pos+2, Srestore_d21%%%, Srestore_d10%%%, Srestore_d01%%%, Srestore_d12%%%, Srestore_d23%%%)
317
			dnn = select(pos+2, Srestore_d10%%%, Srestore_d01%%%, Srestore_d12%%%, Srestore_d23%%%, Srestore_d34%%%)
318
319
			## dup_hq - merge ##
320
			dup     = opos!=pos || abs(dm)<2 || abs(dm)==3 ? 0 : dcn*5<dbc && dnn*5<dbc && (dcn<1.25*thr || bn<bc && pos==Srestore_lpos%%%) ||
321
					\ (dcn*dcn<dbc || dcn*5<dbc) && bn<bc && pos==Srestore_lpos%%% && dnn<.9*dbc || dnn*9<dbc && dcn*3<dbc ? 1 :
322
					\ (dbc*dbc<dcn || dbc*5<dcn) && bb<bc && pos==Srestore_lpos%%% && dbb<.9*dcn || dbb*9<dcn && dbc*3<dcn ||
323
					\ dbb*5<dcn && dbc*5<dcn && (dbc<1.25*thr || bb<bc && pos==Srestore_lpos%%%) ? -1 : 0
324
			mer     = !bom && opos==pos && dup==0 && abs(dm)>2 && (dbc*8<dcn || dbc*8<dbb || dcn*8<dbc || dcn*8<dnn || dbc*2<thr ||
325
					\ dcn*2<thr || dnn*9<dbc && dcn*3<dbc || dbb*9<dcn && dbc*3<dcn)
326
327
			## deblend - doubleblend removal - postprocessing ##
328
			add     = Srestore_bp1%%%*Srestore_cn2%%%>Srestore_bn2%%%*Srestore_cp1%%%*(v1+thr*.01)
329
					  \&& Srestore_bn0%%%*Srestore_cn2%%%>Srestore_bn2%%%*Srestore_cn0%%%*(v1+thr*.01)
330
					  \&& Srestore_cn2%%%*Srestore_bn1%%%>Srestore_cn1%%%*Srestore_bn2%%%*(v1+thr*.01)
331
			dup     = bom
332
						\? (Srestore_bn0%%%>Srestore_bp2%%%
333
							\&& Srestore_bn0%%%>=Srestore_bp1%%%
334
							\&& Srestore_bn0%%%>Srestore_bn1%%%
335
							\&& Srestore_bn0%%%>Srestore_bn2%%%
336
							\&& Srestore_cn0%%%<v125
337
							\? (Srestore_d12%%%*Srestore_d12%%%<Srestore_d10%%%
338
								\|| Srestore_d12%%%*9<Srestore_d10%%%)
339
								\? 1
340
								\: (Srestore_d10%%%*Srestore_d10%%%<Srestore_d12%%%
341
									\|| Srestore_d10%%%*9<Srestore_d12%%%)
342
									\? 0
343
									\: 4
344
							\: Srestore_bp1%%%>Srestore_bp3%%%
345
								\&& Srestore_bp1%%%>=Srestore_bp2%%%
346
								\&& Srestore_bp1%%%>Srestore_bn0%%%
347
								\&& Srestore_bp1%%%>Srestore_bn1%%%
348
								\? 1
349
								\: 0)
350
						\: dup!=0
351
							\? dup
352
							\: om>0 && om<5
353
								\? (bbool==false
354
									\? 0
355
									\: (om==4 && Srestore_bp1%%%*Srestore_cn1%%%<Srestore_bn1%%%*Srestore_cp1%%%)
356
										\|| (om==3 && Srestore_d10%%%<Srestore_d01%%%)
357
										\|| om==1
358
										\? -1
359
										\: 1)
360
								\: om==5
361
									\? (Srestore_bp1%%%*Srestore_cp2%%%>Srestore_bp2%%%*Srestore_cp1%%%*(v1+thr*.01)
362-
			oclp    = mer && dup==0 ? mec : out
362+
363
										\&& Srestore_cp2%%%*Srestore_bn1%%%>Srestore_cn1%%%*Srestore_bp2%%%*(v1+thr*.01)
364
										\&& (add==false || Srestore_cp2%%%*Srestore_bn2%%%>Srestore_cn2%%%*Srestore_bp2%%%)
365
										\? -2
366
										\: add
367
											\? 2
368
											\: Srestore_bn0%%%*Srestore_cp1%%%>Srestore_bp1%%%*Srestore_cn0%%%
369
												\&& (Srestore_bn0%%%*Srestore_cn1%%%<Srestore_bn1%%%*Srestore_cn0%%%
370
												\|| Srestore_cp1%%%*Srestore_bn1%%%>Srestore_cn1%%%*Srestore_bp1%%%)
371
												\? -1
372
												\: Srestore_bn0%%%*Srestore_cn1%%%>Srestore_bn1%%%*Srestore_cn0%%%
373
													\? 1
374
													\: 0)
375
									\: 0
376
377
			### output clip ###
378
			oclp    = mer && dup==0 ? mec : source
379
			opos    = opos + dup - (dup==0 && mer && dbc<dcn ? 1 : 0)
380
			dup==4 ? fin : opos<0 ? oclp.loop(1-opos, 0, 0) : oclp.trim(opos, 0)
381
382
		}
383
	""", "%%%", string(Srestore_InstanceNumber)))	#"
384
}
385
386
387
388
# Original:- By Vampiredom, Gavino, IanB
389
# Repeated, string replacements
390
391
Function StrReplace(string s, string find, string replace)
392
{ i = s.FindStr(find) return (i==0 ? s : (s.LeftStr(i-1)+replace+s.MidStr(Strlen(find)+i)).StrReplace(find, replace)) }