From 007b91c6b5d134a1dd185f7091a77b7bbdec5d47 Mon Sep 17 00:00:00 2001
From: louis <louis@poweris.moe>
Date: Fri, 15 May 2020 22:13:37 -0400
Subject: [PATCH] xv: bd: add vol 4 and 5; update common module

---
 Symphogear/XV [BD]/05/ep5pv_ac.py        |  2 +-
 Symphogear/XV [BD]/06/ep6.vpy            |  4 +-
 Symphogear/XV [BD]/06/ep6pv_ac.py        |  2 +-
 Symphogear/XV [BD]/07/ep7.vpy            | 62 ++++++++++++++++++++++++
 Symphogear/XV [BD]/07/ep7pv_ac.py        | 12 +++++
 Symphogear/XV [BD]/08/ep8.vpy            | 55 +++++++++++++++++++++
 Symphogear/XV [BD]/08/ep8pv_ac.py        | 12 +++++
 Symphogear/XV [BD]/09/ep9.vpy            | 59 ++++++++++++++++++++++
 Symphogear/XV [BD]/09/ep9pv_ac.py        | 12 +++++
 Symphogear/XV [BD]/10/ep10.vpy           | 55 +++++++++++++++++++++
 Symphogear/XV [BD]/10/ep10pv_ac.py       | 12 +++++
 Symphogear/XV [BD]/xv_common/__init__.py |  2 +-
 Symphogear/XV [BD]/xv_common/filter.py   | 22 +++++----
 Symphogear/XV [BD]/xv_common/scale.py    | 33 +++++++++----
 14 files changed, 320 insertions(+), 24 deletions(-)
 create mode 100644 Symphogear/XV [BD]/07/ep7.vpy
 create mode 100755 Symphogear/XV [BD]/07/ep7pv_ac.py
 create mode 100644 Symphogear/XV [BD]/08/ep8.vpy
 create mode 100755 Symphogear/XV [BD]/08/ep8pv_ac.py
 create mode 100644 Symphogear/XV [BD]/09/ep9.vpy
 create mode 100755 Symphogear/XV [BD]/09/ep9pv_ac.py
 create mode 100644 Symphogear/XV [BD]/10/ep10.vpy
 create mode 100755 Symphogear/XV [BD]/10/ep10pv_ac.py

diff --git a/Symphogear/XV [BD]/05/ep5pv_ac.py b/Symphogear/XV [BD]/05/ep5pv_ac.py
index efbbef1..78235f9 100755
--- a/Symphogear/XV [BD]/05/ep5pv_ac.py	
+++ b/Symphogear/XV [BD]/05/ep5pv_ac.py	
@@ -7,6 +7,6 @@ import vapoursynth as vs
 core = vs.core
 
 ac = acsuite.AC()
-path = r"bdmv/KIXA_90889/BDMV/STREAM/00004.m2ts"
+path = r"../bdmv/KIXA_90889/BDMV/STREAM/00004.m2ts"
 src = core.lsmas.LWLibavSource(path)
 ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep5pv.wav")
diff --git a/Symphogear/XV [BD]/06/ep6.vpy b/Symphogear/XV [BD]/06/ep6.vpy
index 87aa9cf..4fa4ae4 100644
--- a/Symphogear/XV [BD]/06/ep6.vpy	
+++ b/Symphogear/XV [BD]/06/ep6.vpy	
@@ -23,8 +23,8 @@ FADE_RANGES: List[FadeRange] = [
 W2X_DENOISE: List[Range] = [
     (OP[0]+1859, OP[0]+1896)  # flashy OP scene
 ]
-DEBAND_HARD: List[Range] = []
-DEBAND_HARDER: List[Range] = []
+DEBAND_HARD: List[Range] = [(25301, 25403)]  # chris henshin
+DEBAND_HARDER: List[Range] = [(25347, 25361)]  # chris henshin
 
 src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")
 src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00006.m2ts")[:-24]
diff --git a/Symphogear/XV [BD]/06/ep6pv_ac.py b/Symphogear/XV [BD]/06/ep6pv_ac.py
index e68c243..02d7a3b 100755
--- a/Symphogear/XV [BD]/06/ep6pv_ac.py	
+++ b/Symphogear/XV [BD]/06/ep6pv_ac.py	
@@ -7,6 +7,6 @@ import vapoursynth as vs
 core = vs.core
 
 ac = acsuite.AC()
-path = r"bdmv/KIXA_90889/BDMV/STREAM/00006.m2ts"
+path = r"../bdmv/KIXA_90889/BDMV/STREAM/00006.m2ts"
 src = core.lsmas.LWLibavSource(path)
 ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep6pv.wav")
diff --git a/Symphogear/XV [BD]/07/ep7.vpy b/Symphogear/XV [BD]/07/ep7.vpy
new file mode 100644
index 0000000..feb9662
--- /dev/null
+++ b/Symphogear/XV [BD]/07/ep7.vpy	
@@ -0,0 +1,62 @@
+import vapoursynth as vs
+
+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: Optional[Tuple[int, int]] = (2566, 4962)
+ED: Optional[Tuple[int, int]] = None
+LOGO: Range = (17059, 17236)
+NO_SCALE: List[Range] = [
+    (31876, 34045),  # credits
+    (34516, 34587),  # next episode title
+]
+FORCE_SCALE: List[Range] = [
+    (7692, 8889),  # kiri henshin
+    (30734, 31260),  # carol henshin
+]
+FADE_RANGES: List[FadeRange] = [
+    FadeRange(ref=5041, range_=(4976, 5057)),  # title
+]
+
+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] = [
+    (7797, 7887),  # kiri henshin
+    9062,  # ???
+]
+DEBAND_HARDER: List[Range] = [
+    (7815, 7851),  # kiri henshin
+]
+
+src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/BDMV/STREAM/00003.m2ts")
+src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/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)
+
+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)
+
+final.set_output()
diff --git a/Symphogear/XV [BD]/07/ep7pv_ac.py b/Symphogear/XV [BD]/07/ep7pv_ac.py
new file mode 100755
index 0000000..d854983
--- /dev/null
+++ b/Symphogear/XV [BD]/07/ep7pv_ac.py	
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+
+import acsuite
+import os
+import vapoursynth as vs
+
+core = vs.core
+
+ac = acsuite.AC()
+path = r"../bdmv/KIXA_90890/BDMV/STREAM/00004.m2ts"
+src = core.lsmas.LWLibavSource(path)
+ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep7pv.wav")
diff --git a/Symphogear/XV [BD]/08/ep8.vpy b/Symphogear/XV [BD]/08/ep8.vpy
new file mode 100644
index 0000000..d72a03d
--- /dev/null
+++ b/Symphogear/XV [BD]/08/ep8.vpy	
@@ -0,0 +1,55 @@
+import vapoursynth as vs
+
+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: Optional[Tuple[int, int]] = (2230, 4626)
+ED: Optional[Tuple[int, int]] = None
+LOGO: Range = (14350, 14515)
+NO_SCALE: List[Range] = [
+    (31822, 34045),  # credits
+    (34493, 34573),  # next episode title
+]
+FORCE_SCALE: List[Range] = [
+    (1797, 1955),  # carol henshin
+    (30972, 31573),  # miku henshin
+]
+FADE_RANGES: List[FadeRange] = []
+
+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_90891/BDMV/STREAM/00005.m2ts")
+src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/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)
+
+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)
+
+final.set_output()
diff --git a/Symphogear/XV [BD]/08/ep8pv_ac.py b/Symphogear/XV [BD]/08/ep8pv_ac.py
new file mode 100755
index 0000000..4e8baff
--- /dev/null
+++ b/Symphogear/XV [BD]/08/ep8pv_ac.py	
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+
+import acsuite
+import os
+import vapoursynth as vs
+
+core = vs.core
+
+ac = acsuite.AC()
+path = r"../bdmv/KIXA_90890/BDMV/STREAM/00006.m2ts"
+src = core.lsmas.LWLibavSource(path)
+ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep8pv.wav")
diff --git a/Symphogear/XV [BD]/09/ep9.vpy b/Symphogear/XV [BD]/09/ep9.vpy
new file mode 100644
index 0000000..72a827e
--- /dev/null
+++ b/Symphogear/XV [BD]/09/ep9.vpy	
@@ -0,0 +1,59 @@
+import vapoursynth as vs
+
+from toolz.functoolz import compose
+from typing import List, Optional, Tuple
+
+import sys
+sys.path.append("..")
+
+from xv_common import (FadeRange, Range, denoise, descale, descale720,
+                       w2x, deband, mask_oped, mask_logo, finalize)  # noqa: E402
+
+core = vs.core
+core.max_cache_size = 1024
+
+S1 = [(0, 69), (132, 383)]
+G = [(384, 439)]
+GX = [(70, 131), (440, 489)]
+AXZ = [(490, 682)]
+OP: Optional[Tuple[int, int]] = (1296, 3692)
+ED: Optional[Tuple[int, int]] = (31623, 33780)
+LOGO: Range = (12265, 12430)
+NO_SCALE: List[Range] = [
+    (34513, 34605),  # next episode title
+]
+FORCE_SCALE: List[Range] = []
+FORCE_SCALE = FORCE_SCALE + AXZ
+FADE_RANGES: List[FadeRange] = [
+    FadeRange(ref=3763, range_=(3694, 3775)),
+]
+
+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_90892/BDMV/STREAM/00003.m2ts")
+src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90892/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)
+
+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),
+    descale720(src=den, ranges=S1+G+GX),
+    descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
+)(den)
+
+final.set_output()
diff --git a/Symphogear/XV [BD]/09/ep9pv_ac.py b/Symphogear/XV [BD]/09/ep9pv_ac.py
new file mode 100755
index 0000000..fe8baaf
--- /dev/null
+++ b/Symphogear/XV [BD]/09/ep9pv_ac.py	
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+
+import acsuite
+import os
+import vapoursynth as vs
+
+core = vs.core
+
+ac = acsuite.AC()
+path = r"../bdmv/KIXA_90891/BDMV/STREAM/00004.m2ts"
+src = core.lsmas.LWLibavSource(path)
+ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep9pv.wav")
diff --git a/Symphogear/XV [BD]/10/ep10.vpy b/Symphogear/XV [BD]/10/ep10.vpy
new file mode 100644
index 0000000..d7d6fc7
--- /dev/null
+++ b/Symphogear/XV [BD]/10/ep10.vpy	
@@ -0,0 +1,55 @@
+import vapoursynth as vs
+
+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: Optional[Tuple[int, int]] = (5563, 7959)
+ED: Optional[Tuple[int, int]] = (31338, 33494)
+LOGO: Range = (17924, 18089)
+NO_SCALE: List[Range] = [
+    (34515, 34607),  # next episode title
+]
+FORCE_SCALE: List[Range] = [
+    (19155, 20461),  # shriabe henshin
+]
+FADE_RANGES: List[FadeRange] = [
+    FadeRange(ref=8026, range_=(7961, 8042)),
+]
+
+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_90892/BDMV/STREAM/00005.m2ts")
+src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90892/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)
+
+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)
+
+final.set_output()
diff --git a/Symphogear/XV [BD]/10/ep10pv_ac.py b/Symphogear/XV [BD]/10/ep10pv_ac.py
new file mode 100755
index 0000000..6666c69
--- /dev/null
+++ b/Symphogear/XV [BD]/10/ep10pv_ac.py	
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+
+import acsuite
+import os
+import vapoursynth as vs
+
+core = vs.core
+
+ac = acsuite.AC()
+path = r"../bdmv/KIXA_90891/BDMV/STREAM/00006.m2ts"
+src = core.lsmas.LWLibavSource(path)
+ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep10pv.wav")
diff --git a/Symphogear/XV [BD]/xv_common/__init__.py b/Symphogear/XV [BD]/xv_common/__init__.py
index 748d585..d8f03c5 100644
--- a/Symphogear/XV [BD]/xv_common/__init__.py	
+++ b/Symphogear/XV [BD]/xv_common/__init__.py	
@@ -1,2 +1,2 @@
-from .scale import FadeRange, descale
+from .scale import FadeRange, descale, descale720
 from .filter import Range, denoise, w2x, deband, mask_oped, mask_logo, finalize
diff --git a/Symphogear/XV [BD]/xv_common/filter.py b/Symphogear/XV [BD]/xv_common/filter.py
index 2834703..af5cc2f 100644
--- a/Symphogear/XV [BD]/xv_common/filter.py	
+++ b/Symphogear/XV [BD]/xv_common/filter.py	
@@ -5,7 +5,7 @@ from kagefunc import adaptive_grain, retinex_edgemask
 from lvsfunc.misc import replace_ranges
 from mvsfunc import BM3D
 from toolz.functoolz import curry
-from typing import List, Tuple, Union
+from typing import List, Optional, Tuple, Union
 from vardefunc import dcm
 
 core = vs.core
@@ -54,14 +54,18 @@ def deband(clip: vs.VideoNode, hard: List[Range],
 
 @curry
 def mask_oped(clip: vs.VideoNode, src: vs.VideoNode,
-              op: Tuple[int, int], ed: Tuple[int, int], src_op: vs.VideoNode,
-              src_ed: vs.VideoNode) -> vs.VideoNode:
-    credit_op_m = dcm(clip, src[op[0]:op[1]+1],
-                      src_op[:op[1]-op[0]+1], op[0], op[1], 2, 2)
-    credit_ed_m = dcm(clip, src[ed[0]:ed[1]+1],
-                      src_ed[:ed[1]-ed[0]+1], ed[0], ed[1], 2, 2)
-    credit_m = core.std.Expr([credit_op_m, credit_ed_m], 'x y +')
-    return core.std.MaskedMerge(clip, src, credit_m)
+              op: Optional[Tuple[int, int]], ed: Optional[Tuple[int, int]],
+              src_op: vs.VideoNode, src_ed: vs.VideoNode) -> vs.VideoNode:
+    merge = clip
+    if op is not None:
+        credit_op_m = dcm(clip, src[op[0]:op[1]+1],
+                          src_op[:op[1]-op[0]+1], op[0], op[1], 2, 2)
+        merge = core.std.MaskedMerge(merge, src, credit_op_m)
+    if ed is not None:
+        credit_ed_m = dcm(clip, src[ed[0]:ed[1]+1],
+                          src_ed[:ed[1]-ed[0]+1], ed[0], ed[1], 2, 2)
+        merge = core.std.MaskedMerge(merge, src, credit_ed_m)
+    return merge
 
 
 @curry
diff --git a/Symphogear/XV [BD]/xv_common/scale.py b/Symphogear/XV [BD]/xv_common/scale.py
index a0ac645..ad8b212 100644
--- a/Symphogear/XV [BD]/xv_common/scale.py	
+++ b/Symphogear/XV [BD]/xv_common/scale.py	
@@ -1,7 +1,6 @@
 import vapoursynth as vs
 import vsutil
 
-from functools import partial
 from kagefunc import retinex_edgemask
 from lvsfunc.aa import upscaled_sraa
 from lvsfunc.kernels import Bicubic
@@ -20,6 +19,7 @@ class FadeRange(NamedTuple):
     range_: Tuple[int, int]
 
 
+@curry
 def _sraa_frameeval(n: int, clip: vs.VideoNode, w: int, h: int
                     ) -> vs.VideoNode:
     frame = clip.get_frame(n)
@@ -33,8 +33,8 @@ def _sraa_frameeval(n: int, clip: vs.VideoNode, w: int, h: int
 
 def _sraa_reupscale(clip: vs.VideoNode, width: int, height: int
                     ) -> vs.VideoNode:
-    sraa = clip.std.FrameEval(partial(_sraa_frameeval, clip=clip, w=width,
-                                      h=height))
+    sraa = clip.std.FrameEval(_sraa_frameeval(clip=clip, w=width,
+                                              h=height))
     scale = sraa.resize.Spline36(width, height, format=vs.GRAY16)
     return scale
 
@@ -44,16 +44,18 @@ def _fade_ranges_with_refs(clip: vs.VideoNode, reupscaled: 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 = rmask.std.Binarize(4000)
+        rmask = vsutil.iterate(rmask, core.std.Inflate, 2)
         rmask = core.std.Expr([mask, rmask], "x y +")
         mask = replace_ranges(mask, rmask, [r.range_])
 
     return mask
 
 
-def _really_dumb_inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode,
-                              ranges: List[FadeRange]) -> vs.VideoNode:
+@curry
+def _inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode,
+                  ranges: List[FadeRange] = []) -> 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)
@@ -65,20 +67,31 @@ def _really_dumb_inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode,
 def descale(clip: vs.VideoNode, force_scale: List[Range],
             no_scale: List[Range], fade_ranges: List[FadeRange],
             show_mask: bool = False) -> vs.VideoNode:
-    dmask = partial(_really_dumb_inverse_mask, ranges=fade_ranges)
     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=dmask,
-                  show_mask=show_mask)
+                  kernel=kernel, threshold=0.003,
+                  mask=_inverse_mask(ranges=fade_ranges), show_mask=show_mask)
     if show_mask:
         return ys
 
     yf = ldescale(y, upscaler=_sraa_reupscale, height=heights,
-                  kernel=kernel, threshold=0, mask=dmask)
+                  kernel=kernel, threshold=0,
+                  mask=_inverse_mask(ranges=fade_ranges))
     yd = replace_ranges(ys, yf, force_scale)
     scaled = core.std.ShufflePlanes([yd, clip], planes=[0, 1, 2],
                                     colorfamily=vs.YUV)
     scaled = replace_ranges(scaled, clip, no_scale)
     return scaled
+
+
+@curry
+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)
+    scaled = core.std.ShufflePlanes([y, src], planes=[0, 1, 2],
+                                    colorfamily=vs.YUV)
+    scaled = replace_ranges(clip, scaled, ranges)
+    return scaled