View difference between Paste ID: ade3wBBV and vpAnBvz7
SHOW: | | - or go back to the newest paste.
1
# pmaskmerge
2
# pinterf chroma Expr
3
# base on MasknotCL and MaskCL and smaskmerge
4
# need masktools 2.2.6 or up in avs 2.6 or avs+, will work with CLExpr if it possible
5
6
function pmaskmerge(clip src, clip overlay, clip mask, int "y", int "u", int "v", bool "luma", string "cplace") {
7
 
8
y = Default(y,3)
9
u = Default(u,2)
10
v = Default(v,2)
11
luma = Default(luma,false)
12
cplace = default(cplace, "MPEG2")
13
14
assert(cplace == "MPEG2" || cplace == "MPEG1", "smaskmerge: chroma siting must be MPEG2 or MPEG1") 
15
16
yuy2 = isyuy2(src)
17
sisavs26 = !(VersionNumber() < 2.6)
18
sisphbd  = sisavs26 ? AvsPlusVersionNumber > 2294 : false
19
sislumaonly = sisphbd ? src.isy() : sisavs26 ? src.isy8() : true
20
fullchr     = sisphbd ? src.is444() : sisavs26 ? src.isyv24() : false
21
chr420      = sisphbd ? src.is420() : src.isyv12()
22
chr411      = sisavs26 ? src.isyv411() : false
23
24
luma = (sisavs26 && sislumaonly) || (u!=3 && v!=3) ? false : luma
25
26
uc=luma ? !sislumaonly && !fullchr ? sisphbd ? ExtractU(src) : UToY8(src) : !sisavs26 ? UToY(src) : nop() : nop()
27
uvh=luma && !fullchr ? !sisavs26 || !sislumaonly ? uc.height() : nop() : nop()
28
uvw=luma && !fullchr ? !sisavs26 || !sislumaonly ? uc.width() : nop() : nop()
29
30
mask = yuy2 && luma ? mask.planar2Interleaved(true) : mask
31
32
mask26=luma && !fullchr && sisavs26 ? sisphbd ? mask.converttoy() : mask.converttoy8() : mask
33
chromalumam=luma && !fullchr ? mask.BilinearResize(uvw,uvh,src_left=chr420 && cplace == "MPEG1" ? 0 : chr411 ? -1.5 : -0.5) : nop()
34
 
35
mask = luma && !fullchr ? sisphbd ? CombinePlanes(mask,chromalumam,chromalumam,source_planes="YYY",planes="YUV",sample_clip=mask) : ytouv(chromalumam,chromalumam,mask26) : mask
36
nocl=false
37
try { cl_exprxyz(src,overlay,mask,"x y x - z 255 / * +",y=y,u=u,v=v) } catch(error_msg) { nocl=true }
38
uvexpr = nocl && sisavs26 ? "x range_max range_min - z - * y z * + range_max range_min - /" : nop()
39
nocl ? sisavs26 ? mt_lutxyz(src,overlay,yuy2 && luma ? mask.Interleaved2planar() : mask,"x y x - z range_max / * +", uvexpr, uvexpr, use_expr=3,y=y,u=u,v=v) : mt_lutxyz(src,overlay,mask,"x y x - z 255 / * +",y=y,u=u,v=v) : last
40
}
41
42-
# smaskmerge 1.24 by A.SONY
42+
# smaskmerge 1.25 by A.SONY
43
# base on MasknotCL and MaskCL
44
# need masktools 2.2.6 or up in avs 2.6 or avs+, will work with CLExpr if it possible
45
46
function smaskmerge(clip src, clip overlay, clip mask, int "y", int "u", int "v", bool "luma", string "cplace") {
47
 
48
y = Default(y,3)
49
u = Default(u,2)
50
v = Default(v,2)
51
luma = Default(luma,false)
52
cplace = default(cplace, "MPEG2")
53
54
assert(cplace == "MPEG2" || cplace == "MPEG1", "smaskmerge: chroma siting must be MPEG2 or MPEG1") 
55
56
yuy2 = isyuy2(src)
57
sisavs26 = !(VersionNumber() < 2.6)
58
sisphbd  = sisavs26 ? AvsPlusVersionNumber > 2294 : false
59
sislumaonly = sisphbd ? src.isy() : sisavs26 ? src.isy8() : true
60
fullchr     = sisphbd ? src.is444() : sisavs26 ? src.isyv24() : false
61
chr420      = sisphbd ? src.is420() : src.isyv12()
62
chr411      = sisavs26 ? src.isyv411() : false
63
64
luma = (sisavs26 && sislumaonly) || (u!=3 && v!=3) ? false : luma
65
66
uc=luma ? !sislumaonly && !fullchr ? sisphbd ? ExtractU(src) : UToY8(src) : !sisavs26 ? UToY(src) : nop() : nop()
67
uvh=luma && !fullchr ? !sisavs26 || !sislumaonly ? uc.height() : nop() : nop()
68
uvw=luma && !fullchr ? !sisavs26 || !sislumaonly ? uc.width() : nop() : nop()
69
70
mask = yuy2 && luma ? mask.planar2Interleaved(true) : mask
71
72
mask26=luma && !fullchr && sisavs26 ? sisphbd ? mask.converttoy() : mask.converttoy8() : mask
73
chromalumam=luma && !fullchr ? mask.BilinearResize(uvw,uvh,src_left=chr420 && cplace == "MPEG1" ? 0 : chr411 ? -1.5 : -0.5) : nop()
74
 
75
mask = luma && !fullchr ? sisphbd ? CombinePlanes(mask,chromalumam,chromalumam,source_planes="YYY",planes="YUV",sample_clip=mask) : ytouv(chromalumam,chromalumam,mask26) : mask
76
nocl=false
77
try { cl_exprxyz(src,overlay,mask,"x y x - z 255 / * +",y=y,u=u,v=v) } catch(error_msg) { nocl=true }
78
sisfloatuv=nocl ? sisphbd ? src.isvideofloat() && (u==3 || v==3) : false : false
79-
!sisfloatuv && nocl ? sisavs26 ? mt_lutxyz(src,overlay,yuy2 && luma ? mask.Interleaved2planar() : mask,"x y x - z range_max / * +",y=y,u=u,v=v) : mt_lutxyz(src,overlay,mask,"x y x - z 255 / * +",y=y,u=u,v=v) : last
79+
!sisfloatuv && nocl ? sisavs26 ? mt_lutxyz(src,overlay,yuy2 && luma ? mask.Interleaved2planar() : mask, use_expr=3,"x y x - z range_max / * +",y=y,u=u,v=v) : mt_lutxyz(src,overlay,mask,"x y x - z 255 / * +",y=y,u=u,v=v) : last
80
srcchr=sisfloatuv ? Interleave(src.ExtractU,src.ExtractV).mt_lut("x 0.5 +") : nop()
81
overlaychr=sisfloatuv ? Interleave(overlay.ExtractU,overlay.ExtractV).expr("x 0.5 +") : nop()
82
maskchr=sisfloatuv ? Interleave(mask.ExtractU,mask.ExtractV) : nop()
83
finialchr=sisfloatuv ? expr(srcchr,overlaychr,maskchr,"x y x - z * +").expr("x 0.5 -") : nop()
84
sisfloatuv ? CombinePlanes(smaskmerge(src, overlay, mask, y, 1, 1),finialchr.SelectEvery(2, 0),finialchr.SelectEvery(2, 1),source_planes="YYY",planes="YUV",sample_clip=src) : last
85
}