5
0

xv: bd: port vol 1 and 2 to common module

this probably won't really matter because they won't be re-encoded
but it makes it easier to check things
This commit is contained in:
louis f 2020-05-15 23:12:13 -04:00
parent 007b91c6b5
commit cbbf8091c3
Signed by: louis
GPG Key ID: 44D7E1DE4E23D6F2
7 changed files with 199 additions and 325 deletions

View File

@ -1,64 +1,49 @@
import vapoursynth as vs import vapoursynth as vs
import lvsfunc as lvf
import kagefunc as kgf
import mvsfunc as mvf
import vsutil
from ytttfunc.adaptivegrain import adaptive_grain from toolz.functoolz import compose
from ytttfunc.replace_ranges import replace_ranges from typing import List, Optional, Tuple
from functools import partial
import sys
sys.path.append("..")
from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
mask_logo, finalize) # noqa: E402
core = vs.core core = vs.core
core.max_cache_size = 1024 core.max_cache_size = 1024
LOGO = [(20777, 20942)] OP: Optional[Tuple[int, int]] = None
NO_SCALE = [(30836, 33230), (34463, 34553)] ED: Optional[Tuple[int, int]] = None
FORCE_SCALE = [(4015, 5159)] LOGO: Range = (20777, 20942)
NO_SCALE: List[Range] = [(30836, 33230), (34463, 34553)]
FORCE_SCALE: List[Range] = [(4015, 5159)]
DETAIL_MASK: List[Range] = [(256, 1546)]
FADE_RANGES: List[FadeRange] = [
FadeRange(ref=960, range_=(943, 1026)),
]
src_ep = core.lsmas.LWLibavSource("bdmv/KIXA_90888/BDMV/STREAM/00003.m2ts") W2X_DENOISE: List[Range] = []
src_pv = core.lsmas.LWLibavSource("bdmv/KIXA_90888/BDMV/STREAM/00004.m2ts")[:-24] if OP is not None:
W2X_DENOISE.append(
(OP[0]+1859, OP[0]+1896), # flashy OP scene
)
DEBAND_HARD: List[Range] = [(4120, 4210)]
DEBAND_HARDER: List[Range] = [(4138, 4174)]
src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90888/BDMV/STREAM/00003.m2ts")
src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90888/BDMV/STREAM/00004.m2ts")[:-24]
src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416]
src = src_ep + src_pv src = src_ep + src_pv
src = src.fmtc.bitdepth(bits=16) src = src.fmtc.bitdepth(bits=16)
den = denoise(src)
denoisechroma = core.knlm.KNLMeansCL(src, d=1, a=2, h=0.45, channels="UV", device_type='gpu', device_id=0) final = compose(
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0) finalize,
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV) mask_logo(src=den, src_logo=src_logo, range=LOGO),
deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
w2x(w2x_range=W2X_DENOISE),
descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES, detail_ranges=DETAIL_MASK)
)(den)
logo_mask = core.imwri.Read("mask_2.png")
logo_mask = logo_mask.resize.Bilinear(format=src.format.id, matrix_s="709")
Y = vsutil.get_y(denoise)
def sraa_frameeval(n, clip):
frame = clip.get_frame(n)
if frame.height < 1080:
rfactor = 2.5
else:
rfactor = 1.5
return lvf.upscaled_sraa(clip.resize.Bicubic(frame.width, frame.height), rfactor=rfactor, h=1080, ar=16/9)
edge = kgf.retinex_edgemask(Y, .0001).std.Binarize(10000)
Ys = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0.003)
Yf = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0)
Yd = replace_ranges(Ys, Yf, FORCE_SCALE)
Yd = Yd.resize.Bicubic(format=vs.GRAY16)
Ysraa = Yd.std.FrameEval(partial(sraa_frameeval, clip=Yd))
Ysraa = Ysraa.resize.Spline36(1920, 1080, format=vs.GRAY16)
Yline = core.std.MaskedMerge(Y, Ysraa, edge)
scaled = core.std.ShufflePlanes([Yline, denoise], planes=[0, 1, 2], colorfamily=vs.YUV)
logo_merge = core.std.MaskedMerge(scaled, denoise, logo_mask)
scaled = replace_ranges(scaled, denoise, NO_SCALE)
scaled = replace_ranges(scaled, logo_merge, LOGO)
line = kgf.retinex_edgemask(scaled).std.Binarize(9500).rgvs.RemoveGrain(3).std.Inflate()
deband = scaled.neo_f3kdb.Deband(range=18, y=32, cb=24, cr=24, grainy=24, grainc=0, output_depth=16, sample_mode=4)
deband = core.std.MaskedMerge(deband, scaled, line)
final = deband
final = adaptive_grain(final, 0.3)
final = core.fmtc.bitdepth(final, bits=10, dmode=3)
final.set_output() final.set_output()

View File

@ -1,98 +1,58 @@
import vapoursynth as vs import vapoursynth as vs
import lvsfunc as lvf
import kagefunc as kgf
import mvsfunc as mvf
import vardefunc as vrdf
import vsutil
from ytttfunc.adaptivegrain import adaptive_grain from toolz.functoolz import compose
from ytttfunc.replace_ranges import replace_ranges from typing import List, Optional, Tuple
from functools import partial
import sys
sys.path.append("..")
from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
mask_oped, mask_logo, finalize) # noqa: E402
core = vs.core core = vs.core
core.max_cache_size = 1024 core.max_cache_size = 1024
OP = (1750, 4148) OP: Optional[Tuple[int, int]] = (1750, 4148)
ED = (31339, 33495) ED: Optional[Tuple[int, int]] = (31339, 33495)
LOGO = [(17724, 17874)] LOGO: Range = (17724, 17874)
NO_SCALE = [(34477, 34563)] NO_SCALE: List[Range] = [(34477, 34563)]
FORCE_SCALE = [(8369, 9325)] FORCE_SCALE: List[Range] = [(8369, 9325)]
FADE_TEXT_REF = 4211 FADE_RANGES: List[FadeRange] = [
DESCALE_MASK = [(4150, 4231)] FadeRange(ref=4211, range_=(4150, 4231)),
W2X_DENOISE = [
(21562, 21729), # noise from the pink shit
(21882, 21951), # more pink shit
(23087, 23252), # big zoom with lots of lights
(OP[0]+1859, OP[0]+1896) # flashy OP scene
] ]
W2X_DENOISE: List[Range] = [
(21562, 21729), # noise from the pink shit
(21882, 21951), # more pink shit
(23087, 23252), # big zoom with lots of lights
]
if OP is not None:
W2X_DENOISE.append(
(OP[0]+1859, OP[0]+1896), # flashy OP scene
)
DEBAND_HARD: List[Range] = []
DEBAND_HARDER: List[Range] = []
# ep2 has the wrong OP, stolen from varde # ep2 has the wrong OP, stolen from varde
src_ep = core.lsmas.LWLibavSource("bdmv/KIXA_90888/BDMV/STREAM/00005.m2ts") src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90888/BDMV/STREAM/00005.m2ts")
src_pv = core.lsmas.LWLibavSource("bdmv/KIXA_90888/BDMV/STREAM/00006.m2ts")[:-24] src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90888/BDMV/STREAM/00006.m2ts")[:-24]
src_oped = core.lsmas.LWLibavSource("../bd2/bdmv/KIXA_90889/BDMV/STREAM/00003.m2ts") src_oped = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00003.m2ts")
src_ncop = core.lsmas.LWLibavSource("../bd2/bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24]
src_nced = core.lsmas.LWLibavSource("../bd2/bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24]
src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416]
op = src_oped[744:3141] op = src_oped[744:3141]
src = src_ep[:1750] + op + src_ep[4147:4150] + src_ep[4149+1:] + src_pv src = src_ep[:1750] + op + src_ep[4147:4150] + src_ep[4149+1:] + src_pv
src = src.fmtc.bitdepth(bits=16) src = src.fmtc.bitdepth(bits=16)
den = denoise(src)
denoisechroma = core.knlm.KNLMeansCL(src, d=1, a=2, h=0.45, channels="UV", device_type='gpu', device_id=0) final = compose(
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0) finalize,
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV) mask_logo(src=den, src_logo=src_logo, range=LOGO),
mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed),
deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
w2x(w2x_range=W2X_DENOISE),
descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
)(den)
logo_mask = core.imwri.Read("mask_2.png")
logo_mask = logo_mask.resize.Bilinear(format=src.format.id, matrix_s="709")
Y = vsutil.get_y(denoise)
def sraa_frameeval(n, clip):
frame = clip.get_frame(n)
if frame.height < 1080:
rfactor = 2.5
else:
rfactor = 1.5
return lvf.upscaled_sraa(clip.resize.Bicubic(frame.width, frame.height), rfactor=rfactor, h=1080, ar=16/9)
edge = kgf.retinex_edgemask(Y, .0001).std.Binarize(10000)
Ys = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0.003)
Yf = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0)
Yd = replace_ranges(Ys, Yf, FORCE_SCALE)
Yd = Yd.resize.Bicubic(format=vs.GRAY16)
Ysraa = Yd.std.FrameEval(partial(sraa_frameeval, clip=Yd))
Ysraa = Ysraa.resize.Spline36(1920, 1080, format=vs.GRAY16)
Yline = core.std.MaskedMerge(Y, Ysraa, edge)
text_mask = core.std.Expr([Y[FADE_TEXT_REF], Yd[FADE_TEXT_REF].resize.Bicubic(1920, 1080, filter_param_a=1/3, filter_param_b=1/3)], 'x y - abs')
text_mask = vsutil.iterate(text_mask, core.std.Maximum, 4)
text_mask = text_mask.std.Binarize(4000)
Ydmask = core.std.MaskedMerge(Yline, Y, text_mask)
Yfinal = replace_ranges(Yline, Ydmask, DESCALE_MASK)
scaled = core.std.ShufflePlanes([Yfinal, denoise], planes=[0, 1, 2], colorfamily=vs.YUV)
logo_merge = core.std.MaskedMerge(scaled, denoise, logo_mask)
scaled = replace_ranges(scaled, denoise, NO_SCALE)
scaled = replace_ranges(scaled, logo_merge, LOGO)
rgb = scaled.resize.Bicubic(1920, 1080, format=vs.RGBS, matrix_in_s="709")
w2x = rgb.w2xnvk.Waifu2x(noise=1, scale=1, model=2).resize.Bicubic(format=scaled.format.id, matrix_s="709")
bm3d = mvf.BM3D(scaled, sigma=[0, 5], ref=w2x)
bm3d = core.std.ShufflePlanes([w2x, bm3d], planes=[0, 1, 2], colorfamily=vs.YUV)
denoise_2 = replace_ranges(scaled, bm3d, W2X_DENOISE)
line = kgf.retinex_edgemask(denoise_2).std.Binarize(9500).rgvs.RemoveGrain(3).std.Inflate()
deband = denoise_2.neo_f3kdb.Deband(range=18, y=32, cb=24, cr=24, grainy=24, grainc=0, output_depth=16, sample_mode=4)
deband = core.std.MaskedMerge(deband, denoise_2, line)
# mask OP/ED credits, stolen from varde
credit_op_m = vrdf.DCM(deband, src[OP[0]:OP[1]+1], src_ncop[:OP[1]-OP[0]+1], OP[0], OP[1], 2, 2)
credit_ed_m = vrdf.DCM(deband, src[ED[0]:ED[1]+1], src_nced[:ED[1]-ED[0]+1], ED[0], ED[1], 2, 2)
credit_m = core.std.Expr([credit_op_m, credit_ed_m], 'x y +')
credit = core.std.MaskedMerge(deband, denoise, credit_m)
final = credit
final = adaptive_grain(final, 0.3)
final = core.fmtc.bitdepth(final, bits=10, dmode=3)
final.set_output() final.set_output()

View File

@ -1,91 +1,51 @@
import vapoursynth as vs import vapoursynth as vs
import lvsfunc as lvf
import kagefunc as kgf
import mvsfunc as mvf
import vardefunc as vrdf
import vsutil
from ytttfunc.replace_ranges import replace_ranges from toolz.functoolz import compose
from functools import partial from typing import List, Optional, Tuple
import sys
sys.path.append("..")
from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
mask_oped, mask_logo, finalize) # noqa: E402
core = vs.core core = vs.core
core.max_cache_size = 32768 core.max_cache_size = 1024
OP = (744, 3140) OP: Optional[Tuple[int, int]] = (744, 3140)
ED = (31888, 34045) ED: Optional[Tuple[int, int]] = (31888, 34045)
LOGO = [(15813, 15978)] LOGO: Range = (15813, 15978)
NO_SCALE = [(34478, 34573)] NO_SCALE: List[Range] = [(34478, 34573)]
FORCE_SCALE = [(8732, 9815), (23429, 24735)] FORCE_SCALE: List[Range] = [(8732, 9815), (23429, 24735)]
FADE_TEXT_REF = 3161 FADE_RANGES: List[FadeRange] = [
DESCALE_MASK = [(3142, 3223)] FadeRange(ref=3161, range_=(3142, 3223)),
W2X_DENOISE = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene
] ]
src_ep = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00003.m2ts") W2X_DENOISE: List[Range] = []
src_pv = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00004.m2ts")[:-24] if OP is not None:
src_ncop = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] W2X_DENOISE.append(
src_nced = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] (OP[0]+1859, OP[0]+1896), # flashy OP scene
)
DEBAND_HARD: List[Range] = []
DEBAND_HARDER: List[Range] = []
src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00003.m2ts")
src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00004.m2ts")[:-24]
src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24]
src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24]
src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416]
src = src_ep + src_pv src = src_ep + src_pv
src = src.fmtc.bitdepth(bits=16) src = src.fmtc.bitdepth(bits=16)
den = denoise(src)
denoisechroma = core.knlm.KNLMeansCL(src, d=1, a=2, h=0.45, channels="UV", device_type='gpu', device_id=0) final = compose(
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0) finalize,
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV) mask_logo(src=den, src_logo=src_logo, range=LOGO),
mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed),
deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
w2x(w2x_range=W2X_DENOISE),
descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
)(den)
logo_mask = core.imwri.Read("../common/mask_2.png")
logo_mask = logo_mask.resize.Bilinear(format=src.format.id, matrix_s="709")
Y = vsutil.get_y(denoise)
def sraa_frameeval(n, clip):
frame = clip.get_frame(n)
if frame.height < 1080:
rfactor = 2.5
else:
rfactor = 1.5
return lvf.upscaled_sraa(clip.resize.Bicubic(frame.width, frame.height), rfactor=rfactor, h=1080, ar=16/9)
edge = kgf.retinex_edgemask(Y, .0001).std.Binarize(10000)
Ys = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0.003)
Yf = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0)
Yd = replace_ranges(Ys, Yf, FORCE_SCALE)
Yd = Yd.resize.Bicubic(format=vs.GRAY16)
Ysraa = Yd.std.FrameEval(partial(sraa_frameeval, clip=Yd))
Ysraa = Ysraa.resize.Spline36(1920, 1080, format=vs.GRAY16)
Yline = core.std.MaskedMerge(Y, Ysraa, edge)
text_mask = core.std.Expr([Y[FADE_TEXT_REF], Yd[FADE_TEXT_REF].resize.Bicubic(1920, 1080, filter_param_a=1/3, filter_param_b=1/3)], 'x y - abs')
text_mask = vsutil.iterate(text_mask, core.std.Maximum, 4)
text_mask = text_mask.std.Binarize(4000)
Ydmask = core.std.MaskedMerge(Yline, Y, text_mask)
Yfinal = replace_ranges(Yline, Ydmask, DESCALE_MASK)
scaled = core.std.ShufflePlanes([Yfinal, denoise], planes=[0, 1, 2], colorfamily=vs.YUV)
logo_merge = core.std.MaskedMerge(scaled, denoise, logo_mask)
scaled = replace_ranges(scaled, denoise, NO_SCALE)
scaled = replace_ranges(scaled, logo_merge, LOGO)
rgb = scaled.resize.Bicubic(1920, 1080, format=vs.RGBS, matrix_in_s="709")
w2x = rgb.w2xnvk.Waifu2x(noise=1, scale=1, model=2).resize.Bicubic(format=scaled.format.id, matrix_s="709")
bm3d = mvf.BM3D(scaled, sigma=[0, 5], ref=w2x)
bm3d = core.std.ShufflePlanes([w2x, bm3d], planes=[0, 1, 2], colorfamily=vs.YUV)
denoise_2 = replace_ranges(scaled, bm3d, W2X_DENOISE)
line = kgf.retinex_edgemask(denoise_2).std.Binarize(9500).rgvs.RemoveGrain(3).std.Inflate()
deband = denoise_2.neo_f3kdb.Deband(range=18, y=32, cb=24, cr=24, grainy=24, grainc=0, output_depth=16, sample_mode=4, keep_tv_range=True)
deband = core.std.MaskedMerge(deband, denoise_2, line)
# mask OP/ED credits, stolen from varde
credit_op_m = vrdf.dcm(deband, src[OP[0]:OP[1]+1], src_ncop[:OP[1]-OP[0]+1], OP[0], OP[1], 2, 2)
credit_ed_m = vrdf.dcm(deband, src[ED[0]:ED[1]+1], src_nced[:ED[1]-ED[0]+1], ED[0], ED[1], 2, 2)
credit_m = core.std.Expr([credit_op_m, credit_ed_m], 'x y +')
credit = core.std.MaskedMerge(deband, denoise, credit_m)
final = credit
final = kgf.adaptive_grain(final, 0.3)
final = core.fmtc.bitdepth(final, bits=10, dmode=3)
final.set_output() final.set_output()

View File

@ -1,98 +1,51 @@
import vapoursynth as vs import vapoursynth as vs
import lvsfunc as lvf
import kagefunc as kgf
import mvsfunc as mvf
import vardefunc as vrdf
import vsutil
from ytttfunc.adaptivegrain import adaptive_grain from toolz.functoolz import compose
from ytttfunc.replace_ranges import replace_ranges from typing import List, Optional, Tuple
from functools import partial
import sys
sys.path.append("..")
from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
mask_oped, mask_logo, finalize) # noqa: E402
core = vs.core core = vs.core
core.max_cache_size = 32768 core.max_cache_size = 1024
OP = (1248, 3644) OP: Optional[Tuple[int, int]] = (1248, 3644)
ED = (31889, 34046) ED: Optional[Tuple[int, int]] = (31889, 34046)
LOGO = [(14927, 15092)] LOGO: Range = (14927, 15092)
NO_SCALE = [(34461, 34547)] NO_SCALE: List[Range] = [(34461, 34547)]
FORCE_SCALE = [(10225, 11425), (19811, 20954)] FORCE_SCALE: List[Range] = [(10225, 11425), (19811, 20954)]
FADE_TEXT_REF = 3676 FADE_RANGES: List[FadeRange] = [
DESCALE_MASK = [(3646, 3726)] FadeRange(ref=3676, range_=(3646, 3726)), # title
W2X_DENOISE = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene
] ]
DEBAND_HARD = [(19916, 20006)] # bikki's henshin banding
DEBAND_HARDER = [(19934, 19970)]
src_ep = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00005.m2ts") W2X_DENOISE: List[Range] = []
src_pv = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00006.m2ts")[:-24] if OP is not None:
src_ncop = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] W2X_DENOISE.append(
src_nced = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] (OP[0]+1859, OP[0]+1896), # flashy OP scene
)
DEBAND_HARD: List[Range] = [(19916, 20006)] # bikki's henshin banding
DEBAND_HARDER: List[Range] = [(19934, 19970)]
src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00005.m2ts")
src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00006.m2ts")[:-24]
src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24]
src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24]
src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416]
src = src_ep + src_pv src = src_ep + src_pv
src = src.fmtc.bitdepth(bits=16) src = src.fmtc.bitdepth(bits=16)
den = denoise(src)
denoisechroma = core.knlm.KNLMeansCL(src, d=1, a=2, h=0.45, channels="UV", device_type='gpu', device_id=0) final = compose(
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0) finalize,
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV) mask_logo(src=den, src_logo=src_logo, range=LOGO),
mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed),
deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
w2x(w2x_range=W2X_DENOISE),
descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
)(den)
logo_mask = core.imwri.Read("../common/mask_2.png")
logo_mask = logo_mask.resize.Bilinear(format=src.format.id, matrix_s="709")
Y = vsutil.get_y(denoise)
def sraa_frameeval(n, clip):
frame = clip.get_frame(n)
if frame.height < 1080:
rfactor = 2.5
else:
rfactor = 1.5
return lvf.upscaled_sraa(clip.resize.Bicubic(frame.width, frame.height), rfactor=rfactor, h=1080, ar=16/9)
edge = kgf.retinex_edgemask(Y, .0001).std.Binarize(10000)
Ys = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0.003)
Yf = lvf.smart_descale(Y, [871, 872, 873], kernel="bicubic", b=1/3, c=1/3, thr=0)
Yd = replace_ranges(Ys, Yf, FORCE_SCALE)
Yd = Yd.resize.Bicubic(format=vs.GRAY16)
Ysraa = Yd.std.FrameEval(partial(sraa_frameeval, clip=Yd))
Ysraa = Ysraa.resize.Spline36(1920, 1080, format=vs.GRAY16)
Yline = core.std.MaskedMerge(Y, Ysraa, edge)
text_mask = core.std.Expr([Y[FADE_TEXT_REF], Yd[FADE_TEXT_REF].resize.Bicubic(1920, 1080, filter_param_a=1/3, filter_param_b=1/3)], 'x y - abs')
text_mask = vsutil.iterate(text_mask, core.std.Maximum, 4)
text_mask = text_mask.std.Binarize(4000)
Ydmask = core.std.MaskedMerge(Yline, Y, text_mask)
Yfinal = replace_ranges(Yline, Ydmask, DESCALE_MASK)
scaled = core.std.ShufflePlanes([Yfinal, denoise], planes=[0, 1, 2], colorfamily=vs.YUV)
logo_merge = core.std.MaskedMerge(scaled, denoise, logo_mask)
scaled = replace_ranges(scaled, denoise, NO_SCALE)
scaled = replace_ranges(scaled, logo_merge, LOGO)
rgb = scaled.resize.Bicubic(1920, 1080, format=vs.RGBS, matrix_in_s="709")
w2x = rgb.w2xnvk.Waifu2x(noise=1, scale=1, model=2).resize.Bicubic(format=scaled.format.id, matrix_s="709")
bm3d = mvf.BM3D(scaled, sigma=[0, 5], ref=w2x)
bm3d = core.std.ShufflePlanes([w2x, bm3d], planes=[0, 1, 2], colorfamily=vs.YUV)
denoise_2 = replace_ranges(scaled, bm3d, W2X_DENOISE)
line = kgf.retinex_edgemask(denoise_2).std.Binarize(9500).rgvs.RemoveGrain(3).std.Inflate()
nf3kdb = denoise_2.neo_f3kdb.Deband(range=18, y=32, cb=24, cr=24, grainy=24, grainc=0, output_depth=16, sample_mode=4, keep_tv_range=True)
nf3kdb = core.std.MaskedMerge(nf3kdb, denoise_2, line)
placebo = denoise_2.placebo.Deband(iterations=3, threshold=3, radius=24, grain=4)
placebo2 = denoise_2.placebo.Deband(iterations=3, threshold=5, radius=32, grain=4)
deband = replace_ranges(nf3kdb, placebo, DEBAND_HARD)
deband = replace_ranges(deband, placebo2, DEBAND_HARDER)
# mask OP/ED credits, stolen from varde
credit_op_m = vrdf.dcm(deband, src[OP[0]:OP[1]+1], src_ncop[:OP[1]-OP[0]+1], OP[0], OP[1], 2, 2)
credit_ed_m = vrdf.dcm(deband, src[ED[0]:ED[1]+1], src_nced[:ED[1]-ED[0]+1], ED[0], ED[1], 2, 2)
credit_m = core.std.Expr([credit_op_m, credit_ed_m], 'x y +')
credit = core.std.MaskedMerge(deband, denoise, credit_m)
final = credit
final = kgf.adaptive_grain(final, 0.3)
final = core.fmtc.bitdepth(final, bits=10, dmode=3)
final.set_output() final.set_output()

View File

@ -1,7 +1,7 @@
import vapoursynth as vs import vapoursynth as vs
from toolz.functoolz import compose from toolz.functoolz import compose
from typing import List from typing import List, Optional, Tuple
import sys import sys
sys.path.append("..") sys.path.append("..")
@ -12,17 +12,21 @@ from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
core = vs.core core = vs.core
core.max_cache_size = 1024 core.max_cache_size = 1024
OP = (1272, 3668) OP: Optional[Tuple[int, int]] = (1272, 3668)
ED = (31889, 34046) ED: Optional[Tuple[int, int]] = (31889, 34046)
LOGO: Range = (17300, 17436) LOGO: Range = (17300, 17436)
NO_SCALE: List[Range] = [(34514, 34600)] NO_SCALE: List[Range] = [(34514, 34600)]
FORCE_SCALE: List[Range] = [(22384, 23376)] FORCE_SCALE: List[Range] = [(22384, 23376)]
FADE_RANGES: List[FadeRange] = [ FADE_RANGES: List[FadeRange] = [
FadeRange(ref=3700, range_=(3670, 3751)), # title FadeRange(ref=3700, range_=(3670, 3751)), # title
] ]
W2X_DENOISE: List[Range] = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene W2X_DENOISE: List[Range] = []
] if OP is not None:
W2X_DENOISE.append(
(OP[0]+1859, OP[0]+1896), # flashy OP scene
)
DEBAND_HARD: List[Range] = [] DEBAND_HARD: List[Range] = []
DEBAND_HARDER: List[Range] = [] DEBAND_HARDER: List[Range] = []

View File

@ -1,7 +1,7 @@
import vapoursynth as vs import vapoursynth as vs
from toolz.functoolz import compose from toolz.functoolz import compose
from typing import List from typing import List, Optional, Tuple
import sys import sys
sys.path.append("..") sys.path.append("..")
@ -12,17 +12,21 @@ from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
core = vs.core core = vs.core
core.max_cache_size = 1024 core.max_cache_size = 1024
OP = (1726, 4124) OP: Optional[Tuple[int, int]] = (1726, 4124)
ED = (31890, 34047) ED: Optional[Tuple[int, int]] = (31890, 34047)
LOGO: Range = (18333, 18498) LOGO: Range = (18333, 18498)
NO_SCALE: List[Range] = [(34495, 34590)] NO_SCALE: List[Range] = [(34495, 34590)]
FORCE_SCALE: List[Range] = [(25196, 26501)] FORCE_SCALE: List[Range] = [(25196, 26501)]
FADE_RANGES: List[FadeRange] = [ FADE_RANGES: List[FadeRange] = [
FadeRange(ref=4179, range_=(4126, 4207)), # title FadeRange(ref=4179, range_=(4126, 4207)), # title
] ]
W2X_DENOISE: List[Range] = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene W2X_DENOISE: List[Range] = []
] if OP is not None:
W2X_DENOISE.append(
(OP[0]+1859, OP[0]+1896), # flashy OP scene
)
DEBAND_HARD: List[Range] = [(25301, 25403)] # chris henshin DEBAND_HARD: List[Range] = [(25301, 25403)] # chris henshin
DEBAND_HARDER: List[Range] = [(25347, 25361)] # chris henshin DEBAND_HARDER: List[Range] = [(25347, 25361)] # chris henshin

View File

@ -6,6 +6,7 @@ from lvsfunc.aa import upscaled_sraa
from lvsfunc.kernels import Bicubic from lvsfunc.kernels import Bicubic
from lvsfunc.misc import replace_ranges from lvsfunc.misc import replace_ranges
from lvsfunc.scale import descale as ldescale from lvsfunc.scale import descale as ldescale
from lvsfunc.scale import descale_detail_mask
from toolz.functoolz import curry from toolz.functoolz import curry
from typing import List, NamedTuple, Tuple from typing import List, NamedTuple, Tuple
@ -43,10 +44,8 @@ def _fade_ranges_with_refs(clip: vs.VideoNode, reupscaled: vs.VideoNode,
ranges: List[FadeRange]) -> vs.VideoNode: ranges: List[FadeRange]) -> vs.VideoNode:
mask = core.std.BlankClip(clip) mask = core.std.BlankClip(clip)
for r in ranges: for r in ranges:
rmask = core.std.Expr([clip[r.ref], reupscaled[r.ref]], "x y - abs") rmask = descale_detail_mask(clip[r.ref], reupscaled[r.ref],
rmask = rmask.std.Binarize(1500) threshold=1500)
rmask = vsutil.iterate(rmask, core.std.Maximum, 4)
rmask = vsutil.iterate(rmask, core.std.Inflate, 2)
rmask = core.std.Expr([mask, rmask], "x y +") rmask = core.std.Expr([mask, rmask], "x y +")
mask = replace_ranges(mask, rmask, [r.range_]) mask = replace_ranges(mask, rmask, [r.range_])
@ -55,30 +54,39 @@ def _fade_ranges_with_refs(clip: vs.VideoNode, reupscaled: vs.VideoNode,
@curry @curry
def _inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode, def _inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode,
ranges: List[FadeRange] = []) -> vs.VideoNode: franges: List[FadeRange] = [], dranges: List[Range] = []
) -> vs.VideoNode:
reupscaled = reupscaled.resize.Bicubic(format=clip.format.id) reupscaled = reupscaled.resize.Bicubic(format=clip.format.id)
line_mask = retinex_edgemask(clip, 0.0001).std.Binarize(10000) line_mask = retinex_edgemask(clip, 0.0001).std.Binarize(10000)
fade_mask = _fade_ranges_with_refs(clip, reupscaled, ranges) fade_mask = _fade_ranges_with_refs(clip, reupscaled, franges)
mask = core.std.Expr([fade_mask, line_mask.std.Invert()], "x y +") mask = core.std.Expr([fade_mask, line_mask.std.Invert()], "x y +")
if dranges:
detail_mask = descale_detail_mask(clip, reupscaled, threshold=1500)
mask_with_detail = core.std.Expr([mask, detail_mask], "x y +")
mask = replace_ranges(mask, mask_with_detail, dranges)
return mask.resize.Bicubic(format=clip.format.id) return mask.resize.Bicubic(format=clip.format.id)
@curry @curry
def descale(clip: vs.VideoNode, force_scale: List[Range], def descale(clip: vs.VideoNode, force_scale: List[Range] = [],
no_scale: List[Range], fade_ranges: List[FadeRange], no_scale: List[Range] = [], fade_ranges: List[FadeRange] = [],
show_mask: bool = False) -> vs.VideoNode: detail_ranges: List[Range] = [], show_mask: bool = False
) -> vs.VideoNode:
kernel = Bicubic(b=1/3, c=1/3) kernel = Bicubic(b=1/3, c=1/3)
heights = [871, 872, 873] heights = [871, 872, 873]
y = vsutil.get_y(clip) y = vsutil.get_y(clip)
ys = ldescale(y, upscaler=_sraa_reupscale, height=heights, ys = ldescale(y, upscaler=_sraa_reupscale, height=heights,
kernel=kernel, threshold=0.003, kernel=kernel, threshold=0.003,
mask=_inverse_mask(ranges=fade_ranges), show_mask=show_mask) mask=_inverse_mask(franges=fade_ranges,
dranges=detail_ranges),
show_mask=show_mask)
if show_mask: if show_mask:
return ys return ys
yf = ldescale(y, upscaler=_sraa_reupscale, height=heights, yf = ldescale(y, upscaler=_sraa_reupscale, height=heights,
kernel=kernel, threshold=0, kernel=kernel, threshold=0,
mask=_inverse_mask(ranges=fade_ranges)) mask=_inverse_mask(franges=fade_ranges,
dranges=detail_ranges))
yd = replace_ranges(ys, yf, force_scale) yd = replace_ranges(ys, yf, force_scale)
scaled = core.std.ShufflePlanes([yd, clip], planes=[0, 1, 2], scaled = core.std.ShufflePlanes([yd, clip], planes=[0, 1, 2],
colorfamily=vs.YUV) colorfamily=vs.YUV)
@ -87,7 +95,7 @@ def descale(clip: vs.VideoNode, force_scale: List[Range],
@curry @curry
def descale720(clip: vs.VideoNode, src: vs.VideoNode, ranges: List[Range] def descale720(clip: vs.VideoNode, src: vs.VideoNode, ranges: List[Range] = []
) -> vs.VideoNode: ) -> vs.VideoNode:
y = ldescale(vsutil.get_y(src), upscaler=_sraa_reupscale, height=720, y = ldescale(vsutil.get_y(src), upscaler=_sraa_reupscale, height=720,
kernel=Bicubic(b=1/3, c=1/3), threshold=0, mask=_inverse_mask) kernel=Bicubic(b=1/3, c=1/3), threshold=0, mask=_inverse_mask)