View difference between Paste ID: SMiMiaUi and gHhr3bUD
SHOW: | | - or go back to the newest paste.
1
# Motion-compensated dfttest by twc
2
# Aka: Really Really Really Slow
3
#
4
# v2 by BakaProxy
5
# Aka: Even more Really Really Really slow
6
# Added: Recalculate, (proper) 16 bit input handling, dither_luma_rebuild and some masking to prevent 16 bit data loss from 8 bit Mdegrain and Mcompensate
7
#
8
#
9-
# v3 by A.SONY
9+
# v3.1 by A.SONY
10
# make it work in normal avs again and some fix, and not that slow if you use it without lsb/lsb_in
11
# add slice bool to use it to avoid artifacts with avstp
12
#
13
# Requirements:
14
# dfttest
15
# MVTools2
16
# 
17
# Suggested:
18
# Dither (for stack16 processing)
19
#
20
# Description of function parameters:
21
#
22
# pp = Clip to calculate vectors from (default input)
23
# mc = Number of frames in each direction to compensate (default 2, max 5)
24
# mdg = Run MDeGrain before dfttest (default false)
25
# mdgSAD = thSAD for MDeGrain (default undefined)
26
# lsb = stack16 output and processing (default false)
27
#
28
# dfttest Y, U, V, sigma, sbsize, sosize, tbsize, and dither are supported.
29
# Extra dfttest parameters may be passed via dfttest_params.
30
# MVTools2 pel, thSCD, thSAD, blksize, overlap, dct, search, and 
31
# searchparam are also supported. 
32
#
33
# sigma is the main control of dfttest strength.
34
# tbsize should not be set higher than mc * 2 + 1.
35
36
function dfttestMC(clip input, clip "pp", int "mc", bool "mdg", bool "Y", bool "U", bool "V", float "sigma", int "sbsize", int "sosize", int "tbsize", int "dither", bool "lsb",bool "lsb_in",bool "pp_lsb_in",int "super_filter",
37-
		\ int "dct")
37+
38
		\ int "dct", bool "slices", bool "luma_rebuild")
39
{
40
	# Set default options. Most external parameters are passed valueless.
41
	
42
	mc = default(mc, 2).min(5)
43
	mdg = default(mdg, false)
44
	lsb = default(lsb, false)
45-
	input8 = lsb_in ? input.ditherpost(mode=7) : input
45+
46
	input8 = lsb_in ? input.ditherpost(mode=7,slice=slices) : input
47
	super_filter = default(super_filter,4)
48
	pp_enabled = defined(pp)
49
	pp_lsb_in = default(pp_lsb_in,(pp_enabled ? lsb_in ? (height(input) == height(pp)) ? true : false : false : false ))
50
	lsb_enable = false
51
	recalculate = default(recalculate,true)
52
	truemotion = default(truemotion,true)
53
	Y = default(Y, true)
54
	U = default(U, true)
55
	V = default(V, true)
56
	tbsize = default(tbsize, mc * 2 + 1)
57
	dfttest_params = default(dfttest_params, "")
58
	blksize = default(blksize,16)
59
	blksize2 = int(blksize/2) + (int(blksize/2)%2)
60
	overlap = default(overlap,blksize2)
61
	overlap2 = int(overlap/2) + (int(overlap/2)%2)
62
	rStr          = default( rStr, 1.0 )
63
	Amp          = default( Amp, 0.0625 )
64
	slices       = default(slices, true)
65
	luma_rebuild = default(luma_rebuild, true)
66
	# Set chroma parameters.
67
	chroma = U || V
68
	plane = U && !Y && !V ? 1 : V && !Y && !U ? 2 : chroma && !Y ? 3 : Y && chroma ? 4 : 0
69-
	pp = (pp_enabled) ? pp.dither_luma_rebuild(S0=rStr,c=Amp,lsb_in=pp_lsb_in,lsb_out=false,uv=((U&&v)?3:1)) : nop()
69+
70
	# Prepare supersampled clips.
71
	
72
	pp = (pp_enabled) ? luma_rebuild ? pp.dither_luma_rebuild(S0=rStr,c=Amp,slice=slices,lsb_in=pp_lsb_in,lsb_out=false,uv=((U&&v)?3:1)) : pp : nop()
73
	pp_super = pp_enabled ? MSuper(pp, pel=pel, chroma=chroma,rfilter=super_filter) : MSuper(input8, pel=pel, chroma=chroma)
74
	super = pp_enabled ? input8.MSuper(pel=pel, levels=1, chroma=chroma) : pp_super
75
	recalc_sup =  pp_enabled ? MSuper(pp,pel=pel, levels=1, chroma=chroma) : pp_super
76
	
77
	# Motion vector search.
78
	b5vec = MAnalyse(pp_super, delta=5, isb=true, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
79
	b4vec = MAnalyse(pp_super, delta=4, isb=true, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
80
	b3vec = MAnalyse(pp_super, delta=3, isb=true, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
81
	b2vec = MAnalyse(pp_super, delta=2, isb=true, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
82
	b1vec = MAnalyse(pp_super, delta=1, isb=true, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
83
	f1vec = MAnalyse(pp_super, delta=1, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
84
	f2vec = MAnalyse(pp_super, delta=2, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
85
	f3vec = MAnalyse(pp_super, delta=3, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
86
	f4vec = MAnalyse(pp_super, delta=4, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
87
	f5vec = MAnalyse(pp_super, delta=5, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap, blksize=blksize, dct=dct,truemotion=truemotion)
88
89
	
90
	recalculate ? Eval("""
91
	b5vec = MRecalculate(recalc_sup,b5vec , chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
92
	b4vec = MRecalculate(recalc_sup,b4vec , chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
93
	b3vec = MRecalculate(recalc_sup,b3vec , chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
94
	b2vec = MRecalculate(recalc_sup,b2vec , chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
95
	b1vec = MRecalculate(recalc_sup,b1vec , chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
96
	f1vec = MRecalculate(recalc_sup,f1vec, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
97
	f2vec = MRecalculate(recalc_sup,f2vec, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
98
	f3vec = MRecalculate(recalc_sup,f3vec, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
99
	f4vec = MRecalculate(recalc_sup,f4vec, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
100
	f5vec = MRecalculate(recalc_sup,f5vec, chroma=chroma, search=search, searchparam=searchparam, overlap=overlap2, blksize=blksize2, dct=dct,thSAD=defined(mdgSAD) ? int(mdgSAD/2) : 200,truemotion=truemotion)
101
	""") : nop()
102
	# Optional MDegrain.
103
	Eval("""
104
	try {
105
		degrained = lsb || lsb_in ? mc >= 3 && mdg ? MDeGrain3(input8, super, b1vec, f1vec, b2vec, f2vec, b3vec, f3vec, thSAD=mdgSAD, plane=plane, thSCD1=thSCD1, thSCD2=thSCD2, lsb=true) :
106-
			degrained8 = lsb ? degrained.dither_get_msb() : degrained.ditherpost(mode=7)
106+
107
			\ mdg ? MDeGrain1(input8, super, b1vec, f1vec, thSAD=mdgSAD, plane=plane, thSCD1=thSCD1, thSCD2=thSCD2, lsb=true) : lsb_in ? input : input.Dither_convert_8_to_16 :
108
			\ errmsggonext
109
			degrained8 = lsb ? degrained.dither_get_msb() : degrained.ditherpost(mode=7,slice=slices)
110
			lsb_enable = true
111
		} catch(err_msg)
112
		{
113
		degrained8 = mc >= 3 && mdg ? MDeGrain3(input8, super, b1vec, f1vec, b2vec, f2vec, b3vec, f3vec, thSAD=mdgSAD, plane=plane, thSCD1=thSCD1, thSCD2=thSCD2) :
114
			\ mc == 2 && mdg ? MDeGrain2(input8, super, b1vec, f1vec, b2vec, f2vec, thSAD=mdgSAD, plane=plane, thSCD1=thSCD1, thSCD2=thSCD2) :
115
			\ mdg ? MDeGrain1(input8, super, b1vec, f1vec, thSAD=mdgSAD, plane=plane, thSCD1=thSCD1, thSCD2=thSCD2) : input8
116
		lsb_enable = false
117
		}
118
	""")
119
	degrained_super = mdg ? MSuper(degrained8, pel=pel, levels=1, chroma=chroma) : super
120
	b5clip = MCompensate(degrained8, degrained_super, b5vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
121
	b4clip = MCompensate(degrained8, degrained_super, b4vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
122
	b3clip = MCompensate(degrained8, degrained_super, b3vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
123
	b2clip = MCompensate(degrained8, degrained_super, b2vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
124
	b1clip = MCompensate(degrained8, degrained_super, b1vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
125
	f1clip = MCompensate(degrained8, degrained_super, f1vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
126
	f2clip = MCompensate(degrained8, degrained_super, f2vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
127
	f3clip = MCompensate(degrained8, degrained_super, f3vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
128
	f4clip = MCompensate(degrained8, degrained_super, f4vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
129
	f5clip = MCompensate(degrained8, degrained_super, f5vec, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
130
131
	# Create compensated clip.
132
	interleaved = mc >= 5 ? Interleave(f5clip, f4clip, f3clip, f2clip, f1clip, degrained8, b1clip, b2clip, b3clip, b4clip, b5clip) :
133
		\ mc == 4 ? Interleave(f4clip, f3clip, f2clip, f1clip, degrained8, b1clip, b2clip, b3clip, b4clip) :
134
		\ mc == 3 ? Interleave(f3clip, f2clip, f1clip, degrained8, b1clip, b2clip, b3clip) :
135
		\ mc == 2 ? Interleave(f2clip, f1clip, degrained8, b1clip, b2clip) :
136
		\ Interleave(f1clip, degrained8, b1clip)
137-
		#interleaved = lsb_enable ? dither_merge16_8(degrainedmc,interleaved.dither_convert_8_to_16(),mt_Lutxy(degrainedmc.ditherpost(mode=7),interleaved,"x y - 0 != 255 0 ?",u=3,v=3),u=3,v=3) : interleaved
137+
138
		mask= lsb_enable ? mt_logic(interleaved,degrainedmc.dither_get_msb(), "xor",y=3,u=3,v=3).mt_binarize(0,y=3,u=3,v=3) : mt_logic(interleaved,degrainedmc, "xor",y=3,u=3,v=3).mt_binarize(0,y=3,u=3,v=3)
139
		interleaved = lsb_enable || lsb ? dither_merge16(degrainedmc,interleaved.dither_convert_8_to_16(),stackvertical(mask,mask),u=3,v=3) : interleaved #more optimized version than the one below
140
		#interleaved = lsb_enable ? dither_merge16_8(degrainedmc,interleaved.dither_convert_8_to_16(),mt_Lutxy(degrainedmc.ditherpost(mode=7,slice=slices),interleaved,"x y - 0 != 255 0 ?",u=3,v=3),u=3,v=3) : interleaved
141
142
		
143
	# Perform dfttest. Exception handling required for official dfttest.
144
	Eval("""
145
	try {
146
		filtered = Eval("dfttest(interleaved, Y=Y, U=U, V=V, sigma=sigma, sbsize=sbsize, sosize=sosize, tbsize=tbsize, dither=dither, lsb=lsb,lsb_in=lsb_enable" + dfttest_params + ")")
147
		} catch(err_msg)
148
		{
149
		filtered = Eval("dfttest(interleaved, Y=Y, U=U, V=V, sigma=sigma, sbsize=sbsize, sosize=sosize, tbsize=tbsize, dither=dither" + dfttest_params + ")")
150
		}
151-
}
151+
152
		
153-
# Converts luma (and chroma) to PC levels, and optionally allows tweaking for pumping up the darks. (for the clip to be fed to motion search only)
153+
154-
# By courtesy of cretindesalpes. (http://forum.doom9.org/showthread.php?p=1548318#post1548318)
154+
}