-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathEDIResample.py
230 lines (195 loc) · 12.2 KB
/
EDIResample.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
import vapoursynth as vs
import math
import Dither
def EDIResample (src, w=None, h=None, sx=0, sy=0, sw=None, sh=None, kernel_u="spline64", kernel_d="spline36", taps=4, a1=None, a2=None, a3=None, css=None, fulls=False, fulld=None, cplace="mpeg2", nsize=0, nns=4, qual=2, etype=0, pscrn=1, noring=False, ratiothr=1.125, thr=1.0, elast=1.5, curve="linear", gcor=1.0, sigmoid=True, sigmoidthr=0.5, cont=6.5):
core = vs.get_core ()
scss = GetCSS (src)
css = scss if css is None else css
fulld = fulls if fulld is None else fulld
Gray = scss == "GRAY" or css == "GRAY"
scss = "444" if Gray else scss
ocss = "444" if Gray else css
InterK = Dither.Resize16nr if noring else core.fmtc.resample
Y = 3
U = 1 if Gray else 3
V = 1 if Gray else 3
Ut = U == 3
Vt = V == 3
cw = src.width
ch = src.height
cwc = cw if scss == "444" else cw // 2
chc = ch // 2 if scss == "420" else ch
ow = cw if w is None else w
oh = ch if h is None else h
owc = ow if ocss == "444" else ow // 2
ohc = oh // 2 if ocss == "420" else oh
sw = cw if sw is None else sw
sh = ch if sh is None else sh
prel = int (sx / 2) * 2
pret = int (sy / 2) * 2
prer = int ((-cw + sx + sw if sw > 0 else sw) / 2) * 2
preb = int ((-ch + sy + sh if sh > 0 else sh) / 2) * 2
prew = cw - prel + prer
preh = ch - pret + preb
if scss == "444":
cwmod2 = int (cw / 2) * 2 == cw
pwmod2 = int (prew / 2) * 2 == prew
wpre = prew < cw
prel = prel if wpre else 0
prer = (prer if pwmod2 else prer + 1) if wpre else (0 if cwmod2 else 1)
prew = cw - prel + prer
wpre = prew < cw or cwmod2 == False
else:
cwmod4 = int (cw / 4) * 4 == cw
pwmod4 = int (prew / 4) * 4 == prew
wpre = prew < cw
prel = prel if wpre else 0
prer = (prer if pwmod4 else prer + 2) if wpre else (0 if cwmod4 else 2)
prew = cw - prel + prer
wpre = prew < cw or cwmod4 == False
if scss == "420":
chmod4 = int (ch / 4) * 4 == ch
phmod4 = int (preh / 4) * 4 == preh
hpre = preh < ch
pret = pret if hpre else 0
preb = (preb if phmod4 else preb + 2) if hpre else (0 if chmod4 else 2)
preh = ch - pret + preb
hpre = preh < ch or chmod4 == False
else:
chmod2 = int (ch / 2) * 2 == ch
phmod2 = int (preh / 2) * 2 == preh
hpre = preh < ch
pret = pret if hpre else 0
preb = (preb if phmod2 else preb + 1) if hpre else (0 if chmod2 else 1)
preh = ch - pret + preb
hpre = preh < ch or chmod2 == False
sw = cw - sx + sw if sw <= 0 else sw
sh = ch - sy + sh if sh <= 0 else sh
sx = sx - prel if wpre else sx
sy = sy - pret if hpre else sy
sxc = sx if scss == "444" else float (sx / 2)
syc = float (sy / 2) if scss == "420" else sy
swc = sw if scss == "444" else float (sw / 2)
shc = float (sh / 2) if scss == "420" else sh
yhratio = float (ow / sw)
yvratio = float (oh / sh)
chratio = float (owc / swc)
cvratio = float (ohc / shc)
enable = yhratio != 1 or yvratio != 1 or chratio != 1 or cvratio != 1 or sw != int (sw) or sh != int (sh) or swc != int (swc) or shc != int (shc) or sx != int (sx) or sy != int (sy) or sxc != int (sxc) or syc != int (syc)
yhct = math.ceil ((math.log (yhratio / ratiothr)) / math.log (2)) if yhratio > ratiothr else 0
yhrf = int (math.pow (2, yhct))
yrhratio = yhratio / yhrf
yvct = math.ceil ((math.log (yvratio / ratiothr)) / math.log (2)) if yvratio > ratiothr else 0
yvrf = int (math.pow (2, yvct))
yrvratio = yvratio / yvrf
chct = math.ceil ((math.log (chratio / ratiothr)) / math.log (2)) if chratio > ratiothr else 0
chrf = int (math.pow (2, chct))
crhratio = chratio / chrf
cvct = math.ceil ((math.log (cvratio / ratiothr)) / math.log (2)) if cvratio > ratiothr else 0
cvrf = int (math.pow (2, cvct))
crvratio = cvratio / cvrf
noediy = yhct <= 0 and yvct <= 0
noedic = chct <= 0 and cvct <= 0
noedi = noediy or noedic
Yedit = noediy == False
Uedit = Ut and noedic == False
Vedit = Vt and noedic == False
edit = Yedit or Uedit or Vedit
mixed = False if edit == False or enable == False else True
yhchift = 0.5 if yhrf >= 2 else 0
yvchift = 0.5 if yvrf >= 2 else 0
yhfix = -yhchift
yvfix = -yvchift
chshift = ((0.5 if chrf >= 2 else 0) if scss == "444" else ((0.5 if chrf >= 2 else 0) if cplace == "mpeg1" else (0.5 - float (chrf / 4) if chrf >= 2 else -0.25))) if ocss == "444" else (((0.5 if chrf >= 2 else 0) if cplace == "mpeg1" else (0.75 if chrf >= 2 else 0.25)) if scss == "444" else ((0.5 if chrf >= 2 else 0) if cplace == "mpeg1" else (0.75 - float (chrf / 4) if chrf >= 2 else 0)))
cvshift = 0.5 if cvrf >= 2 else 0
chfix = -chshift
cvfix = -cvshift
cphfixe = 0 if ocss == "444" else (0 if cplace == "mpeg1" else 0.25 - float (0.25 / crhratio))
cphfix = (0 if scss == "444" else (0 if cplace == "mpeg1" else 0.25)) if ocss=="444" else ((0 if cplace == "mpeg1" else -0.5) if scss == "444" else (0 if cplace == "mpeg1" else 0.25 - float (0.25 / chratio)))
Luma = core.std.ShufflePlanes (src, planes=0, colorfamily=vs.GRAY) if GetCSS (src) != "GRAY" else src
LumaL = Dither.gamma_to_linear (Luma, fulls=fulls, fulld=fulls, curve=curve, gcor=gcor, sigmoid=sigmoid, thr=sigmoidthr, cont=cont) if curve != "linear" else Luma
ChromaU = core.std.ShufflePlanes (src, planes=1, colorfamily=vs.GRAY) if Gray == False else 0
ChromaV = core.std.ShufflePlanes (src, planes=2, colorfamily=vs.GRAY) if Gray == False else 0
Linear = core.std.ShufflePlanes ([LumaL, ChromaU, ChromaV], planes=[0, 0, 0], colorfamily=vs.YUV) if Gray == False else LumaL
input = core.fmtc.resample (Linear, (prew if wpre else cw), (preh if hpre else ch), (prel if wpre else 0), (pret if hpre else 0), (prew if wpre else cw), (preh if hpre else ch), kernel="point", fulls=fulls, fulld=fulls) if wpre or hpre else Linear
if enable == False and edit == False:
0
elif yhct == chct and yvct == cvct and scss == "420":
edgeedi = EDInter (input, yvct, yhct, 1, 1, True, True, True, nsize, nns, qual, etype, pscrn)
edgeediU = core.std.ShufflePlanes (edgeedi, planes=1, colorfamily=vs.GRAY)
edgeediV = core.std.ShufflePlanes (edgeedi, planes=2, colorfamily=vs.GRAY)
edgeediY = core.std.ShufflePlanes (edgeedi, planes=0, colorfamily=vs.GRAY)
else:
edgeediY = core.std.ShufflePlanes (input, planes=0, colorfamily=vs.GRAY) if GetCSS (src) != "GRAY" else input
edgeediY = edgeediY if Yedit == False else EDInter (edgeediY, yvct, yhct, 1, 1, True, False, False, nsize, nns, qual, etype, pscrn)
edgeediU = core.std.ShufflePlanes (input, planes=1, colorfamily=vs.GRAY) if Gray == False else 0
edgeediU = 0 if Uedit == False else EDInter (edgeediU, cvct, chct, 1, 1, Ut, False, False, nsize, nns, qual, etype, pscrn)
edgeediV = core.std.ShufflePlanes (input, planes=2, colorfamily=vs.GRAY) if Gray == False else 0
edgeediV = 0 if Vedit == False else EDInter (edgeediV, cvct, chct, 1, 1, Vt, False, False, nsize, nns, qual, etype, pscrn)
yrh = yrhratio > ratiothr
yrv = yrvratio > ratiothr
crh = crhratio > ratiothr
crv = crvratio > ratiothr
if enable == False and edit == False:
0
else:
edgeY = edgeediY if Yedit == False else core.fmtc.resample (edgeediY, ow, oh, (sx * yhrf + yhfix), (sy * yvrf + yvfix), (sw * yhrf), (sh * yvrf), kernelh=(kernel_u if yrh else kernel_d), kernelv=(kernel_u if yrv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls)
edgeU = 0 if Uedit == False else core.fmtc.resample (edgeediU, owc, ohc, (sxc * chrf + chfix + cphfixe), (syc * cvrf + cvfix), (swc * chrf), (shc * cvrf), kernelh=(kernel_u if crh else kernel_d), kernelv=(kernel_u if crv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls)
edgeV = 0 if Vedit == False else core.fmtc.resample (edgeediV, owc, ohc, (sxc * chrf + chfix + cphfixe), (syc * cvrf + cvfix), (swc * chrf), (shc * cvrf), kernelh=(kernel_u if crh else kernel_d), kernelv=(kernel_u if crv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls)
edge = edgeY if Gray or Uedit == False or Vedit == False else core.std.ShufflePlanes ([edgeY, edgeU, edgeV], planes=[0, 0, 0], colorfamily=vs.YUV)
yh = yhratio > ratiothr
yv = yvratio > ratiothr
ch = chratio > ratiothr
cv = cvratio > ratiothr
if enable == False and (mixed == False or (Yedit and Uedit and Vedit)):
0
elif yhratio == chratio and yvratio == cvratio and (mixed == False or (Yedit and Uedit and Vedit)):
flat = InterK (input, ow, oh, sx, sy, sw, sh, cplace=cplace, kernelh=(kernel_u if yh else kernel_d), kernelv=(kernel_u if yv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls)
else:
flatY = core.std.ShufflePlanes (input, planes=0, colorfamily=vs.GRAY) if GetCSS (src) != "GRAY" else input
flatY = InterK (flatY, ow, oh, sx, sy, sw, sh, kernelh=(kernel_u if yh else kernel_d), kernelv=(kernel_u if yv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls) if mixed or Yedit == False else flatY
flatU = core.std.ShufflePlanes (input, planes=1, colorfamily=vs.GRAY) if (mixed or Uedit == False) and Ut else 0
flatU = InterK (flatU, owc, ohc, (sxc + cphfix), syc, swc, shc, kernelh=(kernel_u if ch else kernel_d), kernelv=(kernel_u if cv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls) if (mixed or Uedit == False) and Ut else 0
flatV = core.std.ShufflePlanes (input, planes=2, colorfamily=vs.GRAY) if (mixed or Vedit == False) and Vt else 0
flatV = InterK (flatV, owc, ohc, (sxc + cphfix), syc, swc, shc, kernelh=(kernel_u if ch else kernel_d), kernelv=(kernel_u if cv else kernel_d), taps=taps, a1=a1, a2=a2, a3=a3, fulls=fulls, fulld=fulls) if (mixed or Vedit == False) and Vt else 0
flat = flatY if Gray else core.std.ShufflePlanes ([flatY, flatU, flatV], planes=[0, 0, 0], colorfamily=vs.YUV)
merge = (Dither.limit_dif16 (flat, edge, thr=thr, elast=elast) if mixed else edge) if edit else flat
mergeY = core.std.ShufflePlanes (merge, planes=0, colorfamily=vs.GRAY)
mergeY = Dither.linear_to_gamma (mergeY, fulls=fulls, fulld=fulls, curve=curve, gcor=gcor, sigmoid=sigmoid, thr=sigmoidthr, cont=cont) if curve != "linear" else mergeY
mergeU = core.std.ShufflePlanes (merge, planes=1, colorfamily=vs.GRAY) if Gray == False else 0
mergeV = core.std.ShufflePlanes (merge, planes=2, colorfamily=vs.GRAY) if Gray == False else 0
mergeF = core.std.ShufflePlanes ([mergeY, mergeU, mergeV], planes=[0, 0, 0], colorfamily=vs.YUV) if css != "GRAY" else mergeY
Range = core.fmtc.bitdepth (mergeF, fulls=fulls, fulld=fulld) if fulls != fulld else mergeF
return Range
def EDInter (src, vct=1, hct=1, vfield=1, hfield=1, Y=True, U=False, V=False, nsize=0, nns=4, qual=2, etype=0, pscrn=1, honly=False):
core = vs.get_core ()
clip = src
if hct >= 1:
clip = clip if honly else core.std.Transpose (clip).std.FlipHorizontal ()
clip = core.nnedi3.nnedi3 (clip, hfield, True, Y, U, V, nsize, nns, qual, etype, pscrn)
hct = hct - 1
honly = hct >= 1
hfield = 0
clip = clip if honly else core.std.FlipHorizontal (clip).std.Transpose ()
else:
0
if vct >= 1 and honly == False:
clip = core.nnedi3.nnedi3(clip, vfield, True, Y, U, V, nsize, nns, qual, etype, pscrn)
vct = vct - 1
vfield = 0
else:
0
clip = (clip if vct <= 0 and hct <= 0 else EDInter (clip, vct, hct, vfield, hfield, Y, U, V, nsize, nns, qual, etype, pscrn, honly)) if Y or U or V else src
return clip
def GetCSS (src):
if src.format.id == vs.YUV420P16:
css = "420"
elif src.format.id == vs.YUV422P16:
css = "422"
elif src.format.id == vs.YUV444P16:
css = "444"
elif src.format.id == vs.GRAY16:
css = "GRAY"
else:
css = 0
return css