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 lvsfunc as lvf
import kagefunc as kgf
import mvsfunc as mvf
import vsutil
from ytttfunc.adaptivegrain import adaptive_grain
from ytttfunc.replace_ranges import replace_ranges
from functools import partial
from toolz.functoolz import compose
from typing import List, Optional, Tuple
import sys
sys.path.append("..")
from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
mask_logo, finalize) # noqa: E402
core = vs.core
core.max_cache_size = 1024
LOGO = [(20777, 20942)]
NO_SCALE = [(30836, 33230), (34463, 34553)]
FORCE_SCALE = [(4015, 5159)]
OP: Optional[Tuple[int, int]] = None
ED: Optional[Tuple[int, int]] = None
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")
src_pv = core.lsmas.LWLibavSource("bdmv/KIXA_90888/BDMV/STREAM/00004.m2ts")[:-24]
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] = [(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.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)
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0)
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV)
final = compose(
finalize,
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()

View File

@ -1,98 +1,58 @@
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 ytttfunc.replace_ranges import replace_ranges
from functools import partial
from toolz.functoolz import compose
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.max_cache_size = 1024
OP = (1750, 4148)
ED = (31339, 33495)
LOGO = [(17724, 17874)]
NO_SCALE = [(34477, 34563)]
FORCE_SCALE = [(8369, 9325)]
FADE_TEXT_REF = 4211
DESCALE_MASK = [(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
OP: Optional[Tuple[int, int]] = (1750, 4148)
ED: Optional[Tuple[int, int]] = (31339, 33495)
LOGO: Range = (17724, 17874)
NO_SCALE: List[Range] = [(34477, 34563)]
FORCE_SCALE: List[Range] = [(8369, 9325)]
FADE_RANGES: List[FadeRange] = [
FadeRange(ref=4211, range_=(4150, 4231)),
]
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
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_oped = core.lsmas.LWLibavSource("../bd2/bdmv/KIXA_90889/BDMV/STREAM/00003.m2ts")
src_ncop = core.lsmas.LWLibavSource("../bd2/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_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_oped = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00003.m2ts")
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]
op = src_oped[744:3141]
src = src_ep[:1750] + op + src_ep[4147:4150] + src_ep[4149+1:] + src_pv
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)
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0)
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV)
final = compose(
finalize,
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()

View File

@ -1,91 +1,51 @@
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 functools import partial
from toolz.functoolz import compose
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.max_cache_size = 32768
core.max_cache_size = 1024
OP = (744, 3140)
ED = (31888, 34045)
LOGO = [(15813, 15978)]
NO_SCALE = [(34478, 34573)]
FORCE_SCALE = [(8732, 9815), (23429, 24735)]
FADE_TEXT_REF = 3161
DESCALE_MASK = [(3142, 3223)]
W2X_DENOISE = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene
OP: Optional[Tuple[int, int]] = (744, 3140)
ED: Optional[Tuple[int, int]] = (31888, 34045)
LOGO: Range = (15813, 15978)
NO_SCALE: List[Range] = [(34478, 34573)]
FORCE_SCALE: List[Range] = [(8732, 9815), (23429, 24735)]
FADE_RANGES: List[FadeRange] = [
FadeRange(ref=3161, range_=(3142, 3223)),
]
src_ep = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00003.m2ts")
src_pv = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00004.m2ts")[:-24]
src_ncop = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24]
src_nced = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24]
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_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.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)
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0)
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV)
final = compose(
finalize,
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()

View File

@ -1,98 +1,51 @@
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 ytttfunc.replace_ranges import replace_ranges
from functools import partial
from toolz.functoolz import compose
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.max_cache_size = 32768
core.max_cache_size = 1024
OP = (1248, 3644)
ED = (31889, 34046)
LOGO = [(14927, 15092)]
NO_SCALE = [(34461, 34547)]
FORCE_SCALE = [(10225, 11425), (19811, 20954)]
FADE_TEXT_REF = 3676
DESCALE_MASK = [(3646, 3726)]
W2X_DENOISE = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene
OP: Optional[Tuple[int, int]] = (1248, 3644)
ED: Optional[Tuple[int, int]] = (31889, 34046)
LOGO: Range = (14927, 15092)
NO_SCALE: List[Range] = [(34461, 34547)]
FORCE_SCALE: List[Range] = [(10225, 11425), (19811, 20954)]
FADE_RANGES: List[FadeRange] = [
FadeRange(ref=3676, range_=(3646, 3726)), # title
]
DEBAND_HARD = [(19916, 20006)] # bikki's henshin banding
DEBAND_HARDER = [(19934, 19970)]
src_ep = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00005.m2ts")
src_pv = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00006.m2ts")[:-24]
src_ncop = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24]
src_nced = core.lsmas.LWLibavSource("../bd2/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24]
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] = [(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.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)
denoiseluma = core.knlm.KNLMeansCL(src, d=3, a=2, h=0.4, channels="Y", device_type='gpu', device_id=0)
denoise = core.std.ShufflePlanes([denoiseluma, denoisechroma], planes=[0, 1, 2], colorfamily=vs.YUV)
final = compose(
finalize,
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()

View File

@ -1,7 +1,7 @@
import vapoursynth as vs
from toolz.functoolz import compose
from typing import List
from typing import List, Optional, Tuple
import sys
sys.path.append("..")
@ -12,17 +12,21 @@ from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
core = vs.core
core.max_cache_size = 1024
OP = (1272, 3668)
ED = (31889, 34046)
OP: Optional[Tuple[int, int]] = (1272, 3668)
ED: Optional[Tuple[int, int]] = (31889, 34046)
LOGO: Range = (17300, 17436)
NO_SCALE: List[Range] = [(34514, 34600)]
FORCE_SCALE: List[Range] = [(22384, 23376)]
FADE_RANGES: List[FadeRange] = [
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_HARDER: List[Range] = []

View File

@ -1,7 +1,7 @@
import vapoursynth as vs
from toolz.functoolz import compose
from typing import List
from typing import List, Optional, Tuple
import sys
sys.path.append("..")
@ -12,17 +12,21 @@ from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
core = vs.core
core.max_cache_size = 1024
OP = (1726, 4124)
ED = (31890, 34047)
OP: Optional[Tuple[int, int]] = (1726, 4124)
ED: Optional[Tuple[int, int]] = (31890, 34047)
LOGO: Range = (18333, 18498)
NO_SCALE: List[Range] = [(34495, 34590)]
FORCE_SCALE: List[Range] = [(25196, 26501)]
FADE_RANGES: List[FadeRange] = [
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_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.misc import replace_ranges
from lvsfunc.scale import descale as ldescale
from lvsfunc.scale import descale_detail_mask
from toolz.functoolz import curry
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:
mask = core.std.BlankClip(clip)
for r in ranges:
rmask = core.std.Expr([clip[r.ref], reupscaled[r.ref]], "x y - abs")
rmask = rmask.std.Binarize(1500)
rmask = vsutil.iterate(rmask, core.std.Maximum, 4)
rmask = vsutil.iterate(rmask, core.std.Inflate, 2)
rmask = descale_detail_mask(clip[r.ref], reupscaled[r.ref],
threshold=1500)
rmask = core.std.Expr([mask, rmask], "x y +")
mask = replace_ranges(mask, rmask, [r.range_])
@ -55,30 +54,39 @@ def _fade_ranges_with_refs(clip: vs.VideoNode, reupscaled: vs.VideoNode,
@curry
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)
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 +")
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)
@curry
def descale(clip: vs.VideoNode, force_scale: List[Range],
no_scale: List[Range], fade_ranges: List[FadeRange],
show_mask: bool = False) -> vs.VideoNode:
def descale(clip: vs.VideoNode, force_scale: List[Range] = [],
no_scale: List[Range] = [], fade_ranges: List[FadeRange] = [],
detail_ranges: List[Range] = [], show_mask: bool = False
) -> vs.VideoNode:
kernel = Bicubic(b=1/3, c=1/3)
heights = [871, 872, 873]
y = vsutil.get_y(clip)
ys = ldescale(y, upscaler=_sraa_reupscale, height=heights,
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:
return ys
yf = ldescale(y, upscaler=_sraa_reupscale, height=heights,
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)
scaled = core.std.ShufflePlanes([yd, clip], planes=[0, 1, 2],
colorfamily=vs.YUV)
@ -87,7 +95,7 @@ def descale(clip: vs.VideoNode, force_scale: List[Range],
@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:
y = ldescale(vsutil.get_y(src), upscaler=_sraa_reupscale, height=720,
kernel=Bicubic(b=1/3, c=1/3), threshold=0, mask=_inverse_mask)