StainlessS
17th February 2020, 22:03
ResizeMin.avs, Avs v2.58/v2.60 + GScript, OR AVS+
#ResizerMin.avs : Script to show minimum allowed Resizer Upsize Source, or DownSize Destination, clip size.
# Req RT_Stats v1.43+, AVS+ OR GScript, DebugView[google].
########## CONFIG ################
TST_SRC = True # True, test Upsize source minimum, else Downsize dest minimum.
DO_258_ONLY = True # If true, test ONLY avs v2.58 ColorSpaces/Resizers
#####################################
SIZERS="""Dummy
Point
Bilinear
Bicubic
Spline16
Spline36
Spline64
Gauss
Lanczos4
Lanczos
Blackman
sinc
"""
CSS="""Dummy
RGB24
RGB32
YUY2
YV12
YV16
YV24
Y8
YV411
RGB48
RGB64
RGBP8
RGBAP8
YUV420P8
YUV422P8
YUV444P8
YUVA420P8
YUVA422P8
YUVA444P8
"""
Is26=IsAvs26
IsPlus=IsAvsPlus
HasGScript=GScriptExists
SzEnd=(DO_258_ONLY || !Is26) ? 10 : 11
CsEnd=(DO_258_ONLY || !Is26) ? 4 : (!IsPlus) ? 8 : 18
myName="ResizerMin: "
RT_DebugF("\n%s\nMinimum Resizer %s clip size\n",VersionString,(TST_SRC)?"Upsize Source":"Downsize Dest",name=myName)
GSTRING="""
For(Sz=1,SzEnd) {
Sizer = SIZERS.RT_TxtGetLine(Sz)
RT_DebugF("%d/%d] SIZER='%sResize'",Sz,SzEnd,Sizer,name=myName)
For(csi=1,CsEnd) {
CSP=CSS.RT_TxtGetLine(csi)
XMod=CSP.X_CsXMod ValidW=-1
for(W=XMod,XMod*100,XMod) {
if(TST_SRC) { # Upsize Src Width
Blankclip(Length=1,Width=W,height=480,Pixel_type=CSP)
try { Eval(Sizer+"Resize(256,256)") ValidW=W W=XMod*1000} # W=XMod*1000 == Break
catch (msg) {}
} Else { # Downsize Dest Width
Blankclip(Length=1,Width=640,height=480,Pixel_type=CSP)
try { Eval(Sizer+"Resize("+String(W,"%.0f")+",480)") ValidW=W W=XMod*1000 }
catch (msg) {}
}
}
YMod=CSP.X_CsYMod ValidH=-1
for(H=YMod,YMod*100,YMod) {
if(TST_SRC) { # Upsize Src Height
Blankclip(Length=1,Width=640,height=H,Pixel_type=CSP)
try { Eval(Sizer+"Resize(256,256)") ValidH=H H=YMod*1000}
catch (msg) {}
} Else { # Downsize Dest Height
Blankclip(Length=1,Width=640,height=480,Pixel_type=CSP)
try { Eval(Sizer+"Resize(640,"+String(H,"%.0f")+")") ValidH=H H=YMod*1000 }
catch (msg) {}
}
}
RT_DebugF(" %8s %d,%d",CSP,ValidW,ValidH,name=myName)
CHKW = X_MinResize(Sizer,CSP,Wid=True, Src=TST_SRC)
CHKH = X_MinResize(Sizer,CSP,Wid=False,Src=TST_SRC)
Assert(CHKW==ValidW && CHKH==ValidH,RT_string("Error: RSZ=%s CSP=%s %d,%d CHK= %d,%d",Sizer,CSP,ValidW,ValidH,CHKW,CHKH)) # CHECK X_MinResize() returns correct numbers
}
}
"""
HasGScript ? GSCRIPT(GSTRING) : Eval(GSTRING)
Return MessageClip("Done")
##################################################
Function GScriptExists() { Return RT_FunctionExist("GScript")}
# Below, No Requirements
Function IsAvs26() { VersionNumber>=2.6}
Function IsAvsNeo() { FindStr(VersionString," Neo")!=0}
Function IsAvsPlus() { FindStr(VersionString,"AviSynth+")!=0||IsAvsNeo}
### AVS version agnostic functions
Function X_YMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Height/ExtractU.Height):(IsYV12 ?2:1) } # Y Min crop multiple for Progressive
Function X_XMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Width/ExtractU.Width):IsAvs26?(IsYV411?4:IsYUY2||IsYV16||IsYV12?2:1):(IsRGB?1:2)} # X Min crop multiple
Function X_CsXMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsXMod: CSP Clip or Pixel_Type string ONLY") Return X_XMod }
Function X_CsYMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsYMod: CSP Clip or Pixel_Type string ONLY") Return X_YMod }
Function X_MinResize(String Resizer,Val CSP,Bool "Wid",Bool "Src",Int "Taps") { # Minimum required Width or Height, Source or Dest, for Resizer and Colorspace, CSP can be Clip or String eg "RGB32"
S=Resizer.UCase I=FindStr(S,"RESIZE") S=(I==0) ? S : S.LeftStr(I-1) # Can use eg Resizer either "BiLinearResize or just BiLinear"
Ix=(S=="POINT")?0:(S=="BILINEAR")?1:(S=="BICUBIC")?2:(S=="SPLINE16")?3:(S=="SPLINE36")?4:(S=="SPLINE64")?5:(S=="GAUSS")?6:(S=="LANCZOS4")?7:(S=="LANCZOS")?8:(S=="BLACKMAN")?9:(S=="SINC")?10:-1
Assert(0 <= IX <= (IsAvs26?10:9), "X_MinResize: No such Resizer filter (" + S + "Resize)")
defT=Select(Ix, 0,-1,-2,-2,-3,-4,-4,-4,3,4,4)
Wid=Default(Wid,True) # True = Inquire Width, else Height
Src=Default(Src,True) # True = Inquire Upscale Src, else DownScale Dest
Assert(defT>0 || !Taps.Defined,"X_MinResize: "+S+"RESIZE Does not have a Taps arg")
Taps=(defT>0) ? Default(Taps,defT) : Abs(defT)
Assert(CSP.IsClip || CSP.IsString,"X_MinResize: CSP clip or Pixel_Type string ONLY")
Return (Wid) ? (Taps+1) * CSP.X_CsXMod : (IsAvs26) ? (Taps+1) * CSP.X_CsYMod
\ : (Src) ? (Taps+1) * 2 : Max((Taps+1)*2,4) # Fix for v2.58 Peculiarities
}
EDIT: Updated. Now Configurable Upsize src min, or downsize dest min.
EDIT: These can be used alone
# Below, No Requirements
Function IsAvs26() { VersionNumber>=2.6}
Function IsAvsNeo() { FindStr(VersionString," Neo")!=0}
Function IsAvsPlus() { FindStr(VersionString,"AviSynth+")!=0||IsAvsNeo}
### AVS version agnostic functions
Function X_YMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Height/ExtractU.Height):(IsYV12 ?2:1) } # Y Min crop multiple for Progressive
Function X_XMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Width/ExtractU.Width):IsAvs26?(IsYV411?4:IsYUY2||IsYV16||IsYV12?2:1):(IsRGB?1:2)} # X Min crop multiple
Function X_CsXMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsXMod: CSP Clip or Pixel_Type string ONLY") Return X_XMod }
Function X_CsYMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsYMod: CSP Clip or Pixel_Type string ONLY") Return X_YMod }
Function X_MinResize(String Resizer,Val CSP,Bool "Wid",Bool "Src",Int "Taps") { # Minimum required Width or Height, Source or Dest, for Resizer and Colorspace, CSP can be Clip or String eg "RGB32"
S=Resizer.UCase I=FindStr(S,"RESIZE") S=(I==0) ? S : S.LeftStr(I-1) # Can use eg Resizer either "BiLinearResize or just BiLinear"
Ix=(S=="POINT")?0:(S=="BILINEAR")?1:(S=="BICUBIC")?2:(S=="SPLINE16")?3:(S=="SPLINE36")?4:(S=="SPLINE64")?5:(S=="GAUSS")?6:(S=="LANCZOS4")?7:(S=="LANCZOS")?8:(S=="BLACKMAN")?9:(S=="SINC")?10:-1
Assert(0 <= IX <= (IsAvs26?10:9), "X_MinResize: No such Resizer filter (" + S + "Resize)")
defT=Select(Ix, 0,-1,-2,-2,-3,-4,-4,-4,3,4,4)
Wid=Default(Wid,True) # True = Inquire Width, else Height
Src=Default(Src,True) # True = Inquire Upscale Src, else DownScale Dest
Assert(defT>0 || !Taps.Defined,"X_MinResize: "+S+"RESIZE Does not have a Taps arg")
Taps=(defT>0) ? Default(Taps,defT) : Abs(defT)
Assert(CSP.IsClip || CSP.IsString,"X_MinResize: CSP clip or Pixel_Type string ONLY")
Return (Wid) ? (Taps+1) * CSP.X_CsXMod : (IsAvs26) ? (Taps+1) * CSP.X_CsYMod
\ : (Src) ? (Taps+1) * 2 : Max((Taps+1)*2,4) # Fix for v2.58 Peculiarities
}
#ResizerMin.avs : Script to show minimum allowed Resizer Upsize Source, or DownSize Destination, clip size.
# Req RT_Stats v1.43+, AVS+ OR GScript, DebugView[google].
########## CONFIG ################
TST_SRC = True # True, test Upsize source minimum, else Downsize dest minimum.
DO_258_ONLY = True # If true, test ONLY avs v2.58 ColorSpaces/Resizers
#####################################
SIZERS="""Dummy
Point
Bilinear
Bicubic
Spline16
Spline36
Spline64
Gauss
Lanczos4
Lanczos
Blackman
sinc
"""
CSS="""Dummy
RGB24
RGB32
YUY2
YV12
YV16
YV24
Y8
YV411
RGB48
RGB64
RGBP8
RGBAP8
YUV420P8
YUV422P8
YUV444P8
YUVA420P8
YUVA422P8
YUVA444P8
"""
Is26=IsAvs26
IsPlus=IsAvsPlus
HasGScript=GScriptExists
SzEnd=(DO_258_ONLY || !Is26) ? 10 : 11
CsEnd=(DO_258_ONLY || !Is26) ? 4 : (!IsPlus) ? 8 : 18
myName="ResizerMin: "
RT_DebugF("\n%s\nMinimum Resizer %s clip size\n",VersionString,(TST_SRC)?"Upsize Source":"Downsize Dest",name=myName)
GSTRING="""
For(Sz=1,SzEnd) {
Sizer = SIZERS.RT_TxtGetLine(Sz)
RT_DebugF("%d/%d] SIZER='%sResize'",Sz,SzEnd,Sizer,name=myName)
For(csi=1,CsEnd) {
CSP=CSS.RT_TxtGetLine(csi)
XMod=CSP.X_CsXMod ValidW=-1
for(W=XMod,XMod*100,XMod) {
if(TST_SRC) { # Upsize Src Width
Blankclip(Length=1,Width=W,height=480,Pixel_type=CSP)
try { Eval(Sizer+"Resize(256,256)") ValidW=W W=XMod*1000} # W=XMod*1000 == Break
catch (msg) {}
} Else { # Downsize Dest Width
Blankclip(Length=1,Width=640,height=480,Pixel_type=CSP)
try { Eval(Sizer+"Resize("+String(W,"%.0f")+",480)") ValidW=W W=XMod*1000 }
catch (msg) {}
}
}
YMod=CSP.X_CsYMod ValidH=-1
for(H=YMod,YMod*100,YMod) {
if(TST_SRC) { # Upsize Src Height
Blankclip(Length=1,Width=640,height=H,Pixel_type=CSP)
try { Eval(Sizer+"Resize(256,256)") ValidH=H H=YMod*1000}
catch (msg) {}
} Else { # Downsize Dest Height
Blankclip(Length=1,Width=640,height=480,Pixel_type=CSP)
try { Eval(Sizer+"Resize(640,"+String(H,"%.0f")+")") ValidH=H H=YMod*1000 }
catch (msg) {}
}
}
RT_DebugF(" %8s %d,%d",CSP,ValidW,ValidH,name=myName)
CHKW = X_MinResize(Sizer,CSP,Wid=True, Src=TST_SRC)
CHKH = X_MinResize(Sizer,CSP,Wid=False,Src=TST_SRC)
Assert(CHKW==ValidW && CHKH==ValidH,RT_string("Error: RSZ=%s CSP=%s %d,%d CHK= %d,%d",Sizer,CSP,ValidW,ValidH,CHKW,CHKH)) # CHECK X_MinResize() returns correct numbers
}
}
"""
HasGScript ? GSCRIPT(GSTRING) : Eval(GSTRING)
Return MessageClip("Done")
##################################################
Function GScriptExists() { Return RT_FunctionExist("GScript")}
# Below, No Requirements
Function IsAvs26() { VersionNumber>=2.6}
Function IsAvsNeo() { FindStr(VersionString," Neo")!=0}
Function IsAvsPlus() { FindStr(VersionString,"AviSynth+")!=0||IsAvsNeo}
### AVS version agnostic functions
Function X_YMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Height/ExtractU.Height):(IsYV12 ?2:1) } # Y Min crop multiple for Progressive
Function X_XMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Width/ExtractU.Width):IsAvs26?(IsYV411?4:IsYUY2||IsYV16||IsYV12?2:1):(IsRGB?1:2)} # X Min crop multiple
Function X_CsXMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsXMod: CSP Clip or Pixel_Type string ONLY") Return X_XMod }
Function X_CsYMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsYMod: CSP Clip or Pixel_Type string ONLY") Return X_YMod }
Function X_MinResize(String Resizer,Val CSP,Bool "Wid",Bool "Src",Int "Taps") { # Minimum required Width or Height, Source or Dest, for Resizer and Colorspace, CSP can be Clip or String eg "RGB32"
S=Resizer.UCase I=FindStr(S,"RESIZE") S=(I==0) ? S : S.LeftStr(I-1) # Can use eg Resizer either "BiLinearResize or just BiLinear"
Ix=(S=="POINT")?0:(S=="BILINEAR")?1:(S=="BICUBIC")?2:(S=="SPLINE16")?3:(S=="SPLINE36")?4:(S=="SPLINE64")?5:(S=="GAUSS")?6:(S=="LANCZOS4")?7:(S=="LANCZOS")?8:(S=="BLACKMAN")?9:(S=="SINC")?10:-1
Assert(0 <= IX <= (IsAvs26?10:9), "X_MinResize: No such Resizer filter (" + S + "Resize)")
defT=Select(Ix, 0,-1,-2,-2,-3,-4,-4,-4,3,4,4)
Wid=Default(Wid,True) # True = Inquire Width, else Height
Src=Default(Src,True) # True = Inquire Upscale Src, else DownScale Dest
Assert(defT>0 || !Taps.Defined,"X_MinResize: "+S+"RESIZE Does not have a Taps arg")
Taps=(defT>0) ? Default(Taps,defT) : Abs(defT)
Assert(CSP.IsClip || CSP.IsString,"X_MinResize: CSP clip or Pixel_Type string ONLY")
Return (Wid) ? (Taps+1) * CSP.X_CsXMod : (IsAvs26) ? (Taps+1) * CSP.X_CsYMod
\ : (Src) ? (Taps+1) * 2 : Max((Taps+1)*2,4) # Fix for v2.58 Peculiarities
}
EDIT: Updated. Now Configurable Upsize src min, or downsize dest min.
EDIT: These can be used alone
# Below, No Requirements
Function IsAvs26() { VersionNumber>=2.6}
Function IsAvsNeo() { FindStr(VersionString," Neo")!=0}
Function IsAvsPlus() { FindStr(VersionString,"AviSynth+")!=0||IsAvsNeo}
### AVS version agnostic functions
Function X_YMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Height/ExtractU.Height):(IsYV12 ?2:1) } # Y Min crop multiple for Progressive
Function X_XMod(clip c) { c IsAvsPlus ? (NumComponents==1||IsRGB?1:Width/ExtractU.Width):IsAvs26?(IsYV411?4:IsYUY2||IsYV16||IsYV12?2:1):(IsRGB?1:2)} # X Min crop multiple
Function X_CsXMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsXMod: CSP Clip or Pixel_Type string ONLY") Return X_XMod }
Function X_CsYMod(Val CSP) { (CSP.IsClip)?CSP:(CSP.IsString)?Blankclip(Length=1,Width=16,height=16,Pixel_type=CSP):Assert(False,"X_CsYMod: CSP Clip or Pixel_Type string ONLY") Return X_YMod }
Function X_MinResize(String Resizer,Val CSP,Bool "Wid",Bool "Src",Int "Taps") { # Minimum required Width or Height, Source or Dest, for Resizer and Colorspace, CSP can be Clip or String eg "RGB32"
S=Resizer.UCase I=FindStr(S,"RESIZE") S=(I==0) ? S : S.LeftStr(I-1) # Can use eg Resizer either "BiLinearResize or just BiLinear"
Ix=(S=="POINT")?0:(S=="BILINEAR")?1:(S=="BICUBIC")?2:(S=="SPLINE16")?3:(S=="SPLINE36")?4:(S=="SPLINE64")?5:(S=="GAUSS")?6:(S=="LANCZOS4")?7:(S=="LANCZOS")?8:(S=="BLACKMAN")?9:(S=="SINC")?10:-1
Assert(0 <= IX <= (IsAvs26?10:9), "X_MinResize: No such Resizer filter (" + S + "Resize)")
defT=Select(Ix, 0,-1,-2,-2,-3,-4,-4,-4,3,4,4)
Wid=Default(Wid,True) # True = Inquire Width, else Height
Src=Default(Src,True) # True = Inquire Upscale Src, else DownScale Dest
Assert(defT>0 || !Taps.Defined,"X_MinResize: "+S+"RESIZE Does not have a Taps arg")
Taps=(defT>0) ? Default(Taps,defT) : Abs(defT)
Assert(CSP.IsClip || CSP.IsString,"X_MinResize: CSP clip or Pixel_Type string ONLY")
Return (Wid) ? (Taps+1) * CSP.X_CsXMod : (IsAvs26) ? (Taps+1) * CSP.X_CsYMod
\ : (Src) ? (Taps+1) * 2 : Max((Taps+1)*2,4) # Fix for v2.58 Peculiarities
}