diff --git a/Symphogear/XV [BD]/01/ep1.vpy b/Symphogear/XV [BD]/01/ep1.vpy index 5ce9698..d92375c 100644 --- a/Symphogear/XV [BD]/01/ep1.vpy +++ b/Symphogear/XV [BD]/01/ep1.vpy @@ -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() \ No newline at end of file +final.set_output() diff --git a/Symphogear/XV [BD]/02/ep2.vpy b/Symphogear/XV [BD]/02/ep2.vpy index 2ec3902..808db6a 100644 --- a/Symphogear/XV [BD]/02/ep2.vpy +++ b/Symphogear/XV [BD]/02/ep2.vpy @@ -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() diff --git a/Symphogear/XV [BD]/03/ep3.vpy b/Symphogear/XV [BD]/03/ep3.vpy index 01bccf9..c37ab66 100644 --- a/Symphogear/XV [BD]/03/ep3.vpy +++ b/Symphogear/XV [BD]/03/ep3.vpy @@ -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() diff --git a/Symphogear/XV [BD]/04/ep4.vpy b/Symphogear/XV [BD]/04/ep4.vpy index 4ff6e22..4ef0141 100644 --- a/Symphogear/XV [BD]/04/ep4.vpy +++ b/Symphogear/XV [BD]/04/ep4.vpy @@ -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() diff --git a/Symphogear/XV [BD]/05/ep5.vpy b/Symphogear/XV [BD]/05/ep5.vpy index 5eb2fd0..5af0f1d 100644 --- a/Symphogear/XV [BD]/05/ep5.vpy +++ b/Symphogear/XV [BD]/05/ep5.vpy @@ -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] = [] diff --git a/Symphogear/XV [BD]/06/ep6.vpy b/Symphogear/XV [BD]/06/ep6.vpy index 4fa4ae4..82c9ec3 100644 --- a/Symphogear/XV [BD]/06/ep6.vpy +++ b/Symphogear/XV [BD]/06/ep6.vpy @@ -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 diff --git a/Symphogear/XV [BD]/xv_common/scale.py b/Symphogear/XV [BD]/xv_common/scale.py index ad8b212..508733a 100644 --- a/Symphogear/XV [BD]/xv_common/scale.py +++ b/Symphogear/XV [BD]/xv_common/scale.py @@ -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)