5
0

vivy: tv: 06

This commit is contained in:
louis f 2021-05-02 23:20:01 -04:00
parent 4ec7b184b9
commit dcceb54d4c
Signed by: louis
GPG Key ID: 44D7E1DE4E23D6F2
3 changed files with 162 additions and 12 deletions

139
Vivy/06/06.vpy Normal file
View File

@ -0,0 +1,139 @@
import vapoursynth as vs
from vivy_common import (VivyConfig, VivySource, antialias, deband, denoise,
finalize, fsrcnnx_rescale, letterbox_edgefix, regrain)
from yt_common.automation import SelfRunner
from yt_common.source import waka_replace
from lvsfunc.types import Range
from lvsfunc.dehardsub import HardsubLineFade, HardsubLine, HardsubSignFade, HardsubMask, bounded_dehardsub
from vsutil import Range as CRange
from typing import List
import os
core = vs.core
EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
CONFIG: VivyConfig = VivyConfig(EPNUM)
SOURCE: VivySource = VivySource(CONFIG)
WAKA_REPLACE: List[List[Range]] = [
[],
[],
]
SIGNS_RU: List[HardsubMask] = [
HardsubLine([
(1878, 2034),
(2045, 2230),
(2342, 2493),
(2716, 2840),
(3102, 3220),
(3225, 3360),
(3366, 3483),
(3487, 3634),
(3673, 3716),
(3740, 3890),
(3899, 3943),
(3947, 4090),
(4094, 4206),
(4211, 4348),
(4359, 4468),
(4480, 4599),
(4605, 4709),
(4713, 4830),
(8722, 8825),
(8831, 9017),
(9036, 9087),
(18822, 18885),
(19935, 19992),
(21046, 21138),
(21801, 21867),
(25730, 25847),
(25851, 25994),
(25999, 26124),
(26128, 26243),
(26249, 26290),
(26314, 26358),
(26379, 26539),
(26544, 26596),
(26605, 26741),
(26747, 26865),
(26870, 27010),
(27016, 27143),
(27147, 27262),
(27268, 27380),
(27385, 27492),
(28681, 28802),
(28806, 28974),
(28978, 29067),
(29076, 29219),
(29223, 29371),
(29376, 29523),
(29527, 29652),
(29656, 29774),
(29779, 29891),
(29896, 30018),
], ((300, 840), (1313, 185))),
HardsubLineFade([
(30519, 30541),
(30541, 30589),
(30590, 30637),
(30638, 30685),
(30686, 30733),
(30734, 30781),
(30782, 30829),
(30830, 30901),
(30902, 30973),
(30974, 31045),
], ((333, 50), (1361, 167))),
HardsubLineFade([
(31046, 31117),
(31118, 31189),
], ((9, 70), (1239, 149))),
HardsubSignFade([
(4890, 5010),
(15951, 16054),
(16055, 16120),
(16121, 16202),
(29617, 29628),
(33949, 34045),
]),
]
NOSCALE: List[Range] = []
AA_NONE: List[Range] = [(33870, 33873)]
LETTERBOX: List[Range] = [(0, 2150), (8791, 10693), (13427, 15153), (27878, 28006)]
def filter_basic() -> vs.VideoNode:
wakas, ref = SOURCE.source()
wakas = [w[:33669] + w.std.BlankClip(length=17) + w[33669:] for w in wakas]
ref = ref.resize.Point(range_in=CRange.FULL, range=CRange.LIMITED) if SOURCE.ref_is_funi else ref
waka = wakas[0]
waka, wakas = waka_replace(waka, wakas[1:], WAKA_REPLACE)
src = bounded_dehardsub(waka, ref, SIGNS_RU, wakas)
src.set_output(1)
return src
def filter() -> vs.VideoNode:
src = filter_basic()
rescale = fsrcnnx_rescale(src, NOSCALE)
den = denoise(rescale)
deb = deband(den)
aa = antialias(deb, noaa=AA_NONE)
grain = regrain(aa)
edgefix = letterbox_edgefix(grain, LETTERBOX)
final = finalize(edgefix)
final.set_output()
return final
if __name__ == "__main__":
SelfRunner(CONFIG, filter, filter_basic)
else:
filter()

View File

@ -43,7 +43,7 @@ def letterbox_edgefix(clip: vs.VideoNode, ranges: List[Range]) -> vs.VideoNode:
return lvf.misc.replace_ranges(clip, edgefix, ranges) return lvf.misc.replace_ranges(clip, edgefix, ranges)
def denoise(clip: vs.VideoNode, sigma: Union[float, List[float]] = 0.75) -> vs.VideoNode: def denoise(clip: vs.VideoNode, sigma: Union[float, List[float]] = 1.5) -> vs.VideoNode:
return bm3d(clip, sigma=sigma) return bm3d(clip, sigma=sigma)
@ -51,11 +51,11 @@ def deband(clip: vs.VideoNode) -> vs.VideoNode:
grad_mask, yrangebig = morpho_mask(clip.dfttest.DFTTest(sigma=14, sigma2=10, sbsize=1, sosize=0) grad_mask, yrangebig = morpho_mask(clip.dfttest.DFTTest(sigma=14, sigma2=10, sbsize=1, sosize=0)
.rgvs.RemoveGrain(3)) .rgvs.RemoveGrain(3))
y = vsutil.get_y(clip) y = vsutil.get_y(clip)
mask = lvf.mask.detail_mask(clip) mask = lvf.mask.detail_mask(clip, brz_b=0.03)
deband_dumb: vs.VideoNode = vdf.dumb3kdb(clip) deband_dumb: vs.VideoNode = vdf.dumb3kdb(clip, radius=16, threshold=24)
deband_weak: vs.VideoNode = core.std.MaskedMerge(vsutil.get_y(deband_dumb), y, mask) deband_weak: vs.VideoNode = core.std.MaskedMerge(vsutil.get_y(deband_dumb), y, mask)
deband_norm: vs.VideoNode = f3kbilateral(y, y=36) deband_norm: vs.VideoNode = vsutil.get_y(vdf.dumb3kdb(clip, radius=16, threshold=30))
deband_strong: vs.VideoNode = f3kbilateral(y, y=65) deband_strong: vs.VideoNode = f3kbilateral(y, range=12, y=50)
deband = core.std.MaskedMerge(deband_strong, deband_norm, grad_mask) deband = core.std.MaskedMerge(deband_strong, deband_norm, grad_mask)
deband = core.std.MaskedMerge(deband, deband_weak, yrangebig) deband = core.std.MaskedMerge(deband, deband_weak, yrangebig)
deband = core.std.ShufflePlanes([deband, deband_dumb], planes=[0, 1, 2], colorfamily=vs.YUV) deband = core.std.ShufflePlanes([deband, deband_dumb], planes=[0, 1, 2], colorfamily=vs.YUV)
@ -63,11 +63,13 @@ def deband(clip: vs.VideoNode) -> vs.VideoNode:
def antialias(clip: vs.VideoNode, weak: Optional[List[Range]] = None, strong: Optional[List[Range]] = None, def antialias(clip: vs.VideoNode, weak: Optional[List[Range]] = None, strong: Optional[List[Range]] = None,
noaa: Optional[List[Range]] = None) -> vs.VideoNode: stronger: Optional[List[Range]] = None, noaa: Optional[List[Range]] = None) -> vs.VideoNode:
mask = antialiasing.combine_mask(clip, weak or []) mask = antialiasing.combine_mask(clip, weak or [])
clamp = antialiasing.sraa_clamp(clip, mask=mask) clamp = antialiasing.sraa_clamp(clip, mask=mask)
sraa = core.std.MaskedMerge(clip, upscaled_sraa(clip, rfactor=2, downscaler=Bicubic(b=0, c=1/2).scale), mask) sraa = core.std.MaskedMerge(clip, upscaled_sraa(clip, rfactor=2, downscaler=Bicubic(b=0, c=1/2).scale), mask)
return replace_ranges(replace_ranges(clamp, clip, noaa or []), sraa, strong or []) sraa_13 = core.std.MaskedMerge(clip, upscaled_sraa(clip, rfactor=1.3, downscaler=Bicubic(b=0, c=1/2).scale), mask)
return replace_ranges(replace_ranges(replace_ranges(clamp, clip, noaa or []), sraa, strong or []), sraa_13,
stronger or [])
def regrain(clip: vs.VideoNode) -> vs.VideoNode: def regrain(clip: vs.VideoNode) -> vs.VideoNode:

View File

@ -9,7 +9,7 @@ import glob
import os import os
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from typing import List, Tuple from typing import Any, List, Tuple
from .config import Config from .config import Config
from .logging import log from .logging import log
@ -26,8 +26,6 @@ def waka_replace(src: vs.VideoNode, wakas: List[vs.VideoNode], ranges: List[List
) -> Tuple[vs.VideoNode, List[vs.VideoNode]]: ) -> Tuple[vs.VideoNode, List[vs.VideoNode]]:
if len(wakas) == 0: if len(wakas) == 0:
return src, wakas return src, wakas
if len(ranges) != len(wakas):
raise ValueError("waka_replace: 'Different number of range sets and wakas supplied'!")
new_wakas = [] new_wakas = []
for waka, r in zip(wakas, ranges): for waka, r in zip(wakas, ranges):
tmp = src tmp = src
@ -59,13 +57,23 @@ class DehardsubFileFinder(ABC):
pass pass
def source(self) -> Tuple[List[vs.VideoNode], vs.VideoNode]: def source(self) -> Tuple[List[vs.VideoNode], vs.VideoNode]:
wakas = [vsutil.depth(core.ffms2.Source(self.config.format_filename(f)), 16) wakas: List[vs.VideoNode] = []
for f in self.get_waka_filenames()] for f in [self.config.format_filename(f) for f in self.get_waka_filenames()]:
if not os.path.isfile(f):
log.warn("Missing a waka!")
continue
wakas.append(vsutil.depth(core.ffms2.Source(f), 16))
ref = vsutil.depth(self.get_ref(), 16) ref = vsutil.depth(self.get_ref(), 16)
return wakas, ref return wakas, ref
class FunimationSource(DehardsubFileFinder): class FunimationSource(DehardsubFileFinder):
ref_is_funi: bool
def __init__(self, *args: Any, **kwargs: Any) -> None:
self.ref_is_funi = False
super().__init__(*args, **kwargs)
def get_amazon(self) -> vs.VideoNode: def get_amazon(self) -> vs.VideoNode:
if not os.path.isfile(self.config.format_filename(AMAZON_FILENAME)): if not os.path.isfile(self.config.format_filename(AMAZON_FILENAME)):
log.warn("Amazon not found, falling back to Funimation") log.warn("Amazon not found, falling back to Funimation")
@ -92,4 +100,5 @@ class FunimationSource(DehardsubFileFinder):
try: try:
return self.get_amazon() return self.get_amazon()
except FileNotFoundError: except FileNotFoundError:
self.ref_is_funi = True
return self.get_funi() return self.get_funi()