Resize8

From Avisynth wiki
Revision as of 06:52, 10 September 2015 by Raffriff42 (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Abstract
Author mawen1250
Version 1.2
Download Web page (Japanese)
Alt. Download (Google Translation)
Documentation
Category Resizers
License
Discussion doom9.org

Description

Fixes chroma shift issues of AviSynth's resizers. Required by Xaa








Script

###### Resize8 v1.2        ######        by mawen1250        ######       2015.02.23       ######
###### Requirements: AviSynth v2.6+, RgTools 0.92.1 or Repair v1.0pre                      ######
###### Accept Y8, YV12, YV16, YV24, RGB24, RGB32 input, use AviSynth resizers for scaling  ######
###### Resize8() is the same as normal resizer with some extra features.                   ######
######     Chroma placement is correctly handled by it, while AviSynth resizers doesn't.   ######
###### Resize8_Separate() processes each plane's source position separately,               ######
######     mainly designed for fixing center shift caused by nnedi3, eedi3, eedi2, etc.    ######
######     Note that it doesn't correct chroma placement, so usually the result should be  ######
######     resized back to the original size, such as what many AA functions do.           ######
###### Adaptive anti-ringing algorithm is supported                                        ######
###### Scaling kernel for luma and chroma can be adjusted separately                       ######
######
###### All the parameters with "_c" represents U/V plane in YV12/YV16/YV24 or Alpha plane in RGB32.
###### The ones without "_c" represents Y plane in Y8/YV12/YV16/YV24 or R/G/B plane in RGB24/RGB32.


Function Resize8(clip input, int "target_width", int "target_height", float "src_left", float "src_top",
\                float "src_width", float "src_height",
\                string "kernel", string "kernel_c", float "a1", float "a2", float "a1_c", float "a2_c",
\                val "noring", val "noring_c", string "cplace", bool "Y", bool "U", bool "V", bool "Alpha")
{
    # Properties of input clip
    sCSP     = input.GetCSP()
    IsY8     = sCSP == "Y8"
    IsRGB    = LeftStr(sCSP, 3) == "RGB"
    oCSP     = IsY8 || IsRGB ? "YV24" : sCSP
    Assert(sCSP=="Y8" || sCSP=="YV12" || sCSP=="YV16" || sCSP=="YV24" || sCSP=="RGB24" || sCSP=="RGB32", """Resize8: only accept Y8, YV12, YV16, YV24, RGB24, RGB32 input""")
    
    sw       = input.Width ()
    sh       = input.Height()
    swc      = oCSP=="YV24" ? sw   : sw/2
    shc      = oCSP=="YV12" ? sh/2 : sh
    
    
    # Parameters for size transform
    ow       = Default(target_width,  sw)
    oh       = Default(target_height, sh)
    owc      = oCSP=="YV24" ? ow   : ow/2
    ohc      = oCSP=="YV12" ? oh/2 : oh
    Assert(!(oCSP=="YV16" && ow!=owc*2), """Resize8: width  of YV16 output clip must be MOD2!""")
    Assert(!(oCSP=="YV12" && ow!=owc*2), """Resize8: width  of YV12 output clip must be MOD2!""")
    Assert(!(oCSP=="YV12" && oh!=ohc*2), """Resize8: height of YV12 output clip must be MOD2!""")
    
    src_l    = Default(src_left,   0    )
    src_t    = Default(src_top,    0    )
    src_w    = Default(src_width,  sw   )
    src_h    = Default(src_height, sh   )
    
    src_w    = src_w<=0 ? sw-src_l+src_w : src_w
    src_h    = src_h<=0 ? sh-src_t+src_h : src_h
    src_lc   = oCSP=="YV24" ? src_l    : src_l/2.
    src_tc   = oCSP=="YV12" ? src_t/2. : src_t
    src_wc   = oCSP=="YV24" ? src_w    : src_w/2.
    src_hc   = oCSP=="YV12" ? src_h/2. : src_h
    
    
    # Process
    return Resize8_main(input, ow, oh, owc, ohc, src_l, src_t, src_lc, src_tc, src_w, src_h, src_wc, src_hc,
    \                   kernel, kernel_c, a1, a2, a1_c, a2_c, noring, noring_c, cplace, Y, U, V, Alpha)
}


Function Resize8_Separate(clip input, int "target_width", int "target_height", float "src_left", float "src_top",
\                float "src_width", float "src_height",
\                string "kernel", string "kernel_c", float "a1", float "a2", float "a1_c", float "a2_c",
\                val "noring", val "noring_c", bool "Y", bool "U", bool "V", bool "Alpha")
{
    # Properties of input clip
    sCSP     = input.GetCSP()
    IsY8     = sCSP == "Y8"
    IsRGB    = LeftStr(sCSP, 3) == "RGB"
    oCSP     = IsY8 || IsRGB ? "YV24" : sCSP
    Assert(sCSP=="Y8" || sCSP=="YV12" || sCSP=="YV16" || sCSP=="YV24" || sCSP=="RGB24" || sCSP=="RGB32", """Resize8: only accept Y8, YV12, YV16, YV24, RGB24, RGB32 input""")
    
    sw       = input.Width ()
    sh       = input.Height()
    swc      = oCSP=="YV24" ? sw   : sw/2
    shc      = oCSP=="YV12" ? sh/2 : sh
    
    
    # Parameters for size transform
    ow       = Default(target_width,  sw)
    oh       = Default(target_height, sh)
    owc      = oCSP=="YV24" ? ow   : ow/2
    ohc      = oCSP=="YV12" ? oh/2 : oh
    Assert(!(oCSP=="YV16" && ow!=owc*2), """Resize8: width  of YV16 output clip must be MOD2!""")
    Assert(!(oCSP=="YV12" && ow!=owc*2), """Resize8: width  of YV12 output clip must be MOD2!""")
    Assert(!(oCSP=="YV12" && oh!=ohc*2), """Resize8: height of YV12 output clip must be MOD2!""")
    
    src_l    = Default(src_left,   0    )
    src_t    = Default(src_top,    0    )
    src_w    = Default(src_width,  sw   )
    src_h    = Default(src_height, sh   )
    
    src_w    = src_w<=0 ? sw-src_l+src_w : src_w
    src_h    = src_h<=0 ? sh-src_t+src_h : src_h
    src_r    = sw - src_w - src_l
    src_b    = sh - src_h - src_t
    src_lc   = src_l
    src_tc   = src_t
    src_wc   = swc - src_l - src_r
    src_hc   = shc - src_t - src_b
    
    
    # Process
    return Resize8_main(input, ow, oh, owc, ohc, src_l, src_t, src_lc, src_tc, src_w, src_h, src_wc, src_hc,
    \                   kernel, kernel_c, a1, a2, a1_c, a2_c, noring, noring_c, "MPEG1", Y, U, V, Alpha)
}


Function Resize8_main(clip input, int "ow", int "oh", int "owc", int "ohc",
\                float "src_l", float "src_t", float "src_lc", float "src_tc",
\                float "src_w", float "src_h", float "src_wc", float "src_hc",
\                string "kernel", string "kernel_c", float "a1", float "a2", float "a1_c", float "a2_c",
\                val "noring", val "noring_c", string "cplace", bool "Y", bool "U", bool "V", bool "Alpha")
{
    # All the parameters with "_c" affects U/V plane in YV12/YV16/YV24 or Alpha plane in RGB32.
    # The ones without "_c" affects Y plane in Y8/YV12/YV16/YV24 or R/G/B plane in RGB24/RGB32.
    
    # Properties of input clip
    sCSP     = input.GetCSP()
    IsY8     = sCSP == "Y8"
    IsRGB    = LeftStr(sCSP, 3) == "RGB"
    oCSP     = IsY8 || IsRGB ? "YV24" : sCSP
    Assert(sCSP=="Y8" || sCSP=="YV12" || sCSP=="YV16" || sCSP=="YV24" || sCSP=="RGB24" || sCSP=="RGB32", """Resize8: only accept Y8, YV12, YV16, YV24, RGB24, RGB32 input""")
    
    sw       = input.Width ()
    sh       = input.Height()
    swc      = oCSP=="YV24" ? sw   : sw/2
    shc      = oCSP=="YV12" ? sh/2 : sh
    
    
    # Parameters for resampler
    yhratio  = float(ow ) / float(src_w )
    yvratio  = float(oh ) / float(src_h )
    chratio  = float(owc) / float(src_wc)
    cvratio  = float(ohc) / float(src_hc)
    yup      = yhratio * yvratio>1
    cup      = chratio * cvratio>1
    
    kernel   = Default(kernel,   yup ? "Lanczos4" : "Spline36")
    kernel_c = Default(kernel_c, cup ? "Lanczos"  : "Spline36")
    # "kernel" sets resizing kernel for luma, "kernel_c" sets resizing kernel for chroma
    # Supported kernels: Bicubic, Catmull-Rom, Hermite, Mitchell-Netravali, Robidoux, SoftCubic, SoftCubicXX (XX represents softness:[50-100])
    #                    Point, Bilinear, Gauss/Gaussian, Sinc
    #                    Blankman, Blankman2, Blankman3, Blankman4
    #                    Lanczos, Lanczos2, Lanczos3, Lanczos4
    #                    Spline16, Spline36, Spline64
    # By default, "Lanczos4" is set for luma upscaling, "Lanczos" is set for chroma upscaling, "Spline36" is set for luma/chroma downscaling.
    kernel   = RightStr(kernel  , 6) == "Resize" ? LeftStr(kernel  , StrLen(kernel  )-6) : kernel
    kernel_c = RightStr(kernel_c, 6) == "Resize" ? LeftStr(kernel_c, StrLen(kernel_c)-6) : kernel_c
    
    defa1    = Defined(a1)
    defa2    = Defined(a2)
    a1       = defa1 ? a1 : Resize8_undef()
    a2       = defa2 ? a2 : Resize8_undef()
    a1_c     = Defined(a1_c) ? a1_c : defa1 && kernel==kernel_c ? a1 : Resize8_undef()
    a2_c     = Defined(a2_c) ? a2_c : defa2 && kernel==kernel_c ? a2 : Resize8_undef()
    # "a1",   "a2",  sets parameters for resizer used in luma
    # "a1_c", "a2_c" sets parameters for resizer used in chroma
    # "a1" represents "b" and "a2" represents "c" for kernel "Bicubic"   (default: b = 1/3.,     c = 1/3.)
    # "a1" represents "taps" and "a2" do nothing  for kernel "Blackman"  (default: taps=4,   1<=taps<=100)
    # "a1" represents "taps" and "a2" do nothing  for kernel "Lanczos"   (default: taps=3,   1<=taps<=100)
    # "a1" represents "taps" and "a2" do nothing  for kernel "Sinc"      (default: taps=4,   1<=taps<= 20)
    # "a1" represents "p"    and "a2" do nothing  for kernel "Gauss"     (default:   p=30,   1<=  p <=100)
    # "a1" represents "soft" and "a2" do nothing  for kernel "SoftCubic" (default: soft=75, 50<=soft<=100)
    # for kernel "SoftCubicXX", "XX" represents "soft" and "a1"/"a2" do nothing
    # "a1" do nothing and "a2" do nothing for the rest kernels supported by Resize8:
    # "Catmull-Rom", "Hermite", "Mitchell-Netravali", "Robidoux", "Bilinear", "Point", "Spline16", "Spline36", "Spline64"
    
    
    # Parameters for anti-ringing algorithm
    nrkn     = kernel   == "Point" || kernel   == "Bilinear" || kernel   == "Gauss" || kernel   == "Gaussian" || kernel   == "Hermite" || LeftStr(kernel  , 9) == "SoftCubic"
    nrkn_c   = kernel_c == "Point" || kernel_c == "Bilinear" || kernel_c == "Gauss" || kernel_c == "Gaussian" || kernel_c == "Hermite" || LeftStr(kernel_c, 9) == "SoftCubic"
    noring   = Default(noring,   nrkn   ? False : True  )
    noring_c = Default(noring_c, nrkn_c ? False : noring)
    # "noring" & "noring_c" can be Bool or Float
    # By default, we don't use anti-ringing algorithm for kernels "Point","Bilinear","Gauss"/"Gaussian","Hermite","SoftCubic".
    # When "noring" or "noring_c" is True, adaptive anti-ringing is enabled, when no upscaling is applied, anti-ringing is also automatically disabled.
    # For the default kernel of   upscaling, kernel="Lanczos4"+noring=True is applied for luma, kernel_c="Lanczos"+noring_c=True is applied for chroma.
    # For the default kernel of downscaling, kernel="Spline36"+noring=True is applied for luma/chroma, but the adaptive anti-ringing will turn off anti-ringing.
    #
    # Use repair to remove ringing introduced from resizer
    # noring >= 1          : completely use non-ringing repaired clip
    # 0 < noring < 1       : noring is the weight of non-ringing repaired clip for merging with normally upscaled clip
    # noring <= 0 or False : do not use non-ringing repaired clip
    # noring == True       : adapt the weight of non-ringing repaired clip according to input and output resolution
    Assert(IsFloat(noring  ) || IsBool(noring  ), """Resize8: "noring"   should be either bool or float!""")
    Assert(IsFloat(noring_c) || IsBool(noring_c), """Resize8: "noring_c" should be either bool or float!""")
    
    
    # Parameters for colorspace
    cplace   = Default(cplace,   "MPEG2")
    # Placement of the chroma subsamples. Can be one of these strings:
    # "MPEG1": 4:2:0 subsampling used in MPEG-1. Chroma samples are located on the center of each group of 4 pixels.
    # "MPEG2": Subsampling used in MPEG-2 4:2:x. Chroma samples are located on the left pixel column of the group.
    
    Yt       = Default(Y,        True   )
    Ut       = Default(U,        True   )
    Vt       = Default(V,        True   )
    At       = Default(Alpha,    True   )
    # Control whether to process Y/U/V plane(or R/G/B/A plane for RGB24/RGB32 input)
    Ut       = IsY8 ? False : Ut
    Vt       = IsY8 ? False : Vt
    At       = sCSP=="RGB32" ? At : False
    
    
    # Chroma placement of MPEG-2 YV12(4:2:0) and YV16(4:2:2) is left-aligned,
    #     thus center-aligned resizer can cause chroma shift after scaling.
    # Positive value means left-shift/top-shift, negetive value means right-shift/bottom-shift.
    # chshifta = oCSP=="YV24" || cplace=="MPEG1" ? 0 : 0.25-0.25*chratio # Chroma horizontal shift after scaling
    # cvshifta = oCSP=="YV24" || cplace=="MPEG1" ? 0 : 0                 # Chroma vertical   shift after scaling
    # chshiftb = oCSP=="YV24" || cplace=="MPEG1" ? 0 : 0.25/chratio-0.25 # Chroma horizontal shift before scaling equivalent to that after scaling
    # cvshiftb = oCSP=="YV24" || cplace=="MPEG1" ? 0 : 0                 # Chroma vertical   shift before scaling equivalent to that after scaling
    
    # So we apply shift before scaling to fix the chroma shift
    chfix    = oCSP=="YV24" || cplace=="MPEG1" ? 0 : 0.25-0.25/chratio # Chroma horizontal shift fixing before scaling
    cvfix    = oCSP=="YV24" || cplace=="MPEG1" ? 0 : 0                 # Chroma vertical   shift fixing before scaling
    
    
    # Weight calculation of adaptive anti-ringing algorithm
    res_mul   = yhratio * yvratio
    res_mul   = min(max(res_mul  , 1), 2.25)
    nr_wght   = IsFloat(noring  ) ? noring
    \         : noring   == True  ? Spline(res_mul  , 1, 0, 2.25, 1, 3.5, 0, True)
    \         :                     0
    nr_wght   = min(max(nr_wght  , 0), 1)
    
    res_mul_c = chratio * cvratio
    res_mul_c = min(max(res_mul_c, 1), 2.25)
    nr_wght_c = IsFloat(noring_c) ? noring_c
    \         : noring_c == True  ? Spline(res_mul_c, 1, 0, 2.25, 1, 3.5, 0, True)
    \         :                     0
    nr_wght_c = min(max(nr_wght_c, 0), 1)
    
    
    # Apply resize
    IsY8 ? \
    Eval("""
        Ys   = input
        
        Yo   = Yt                   ? Ys."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , kernel  , a1  , a2  )+""" : NOP()
        
        Yg   = Yt && nr_wght   >  0 ? Ys."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , "Gauss" , 100       )+""" : NOP()
        
        Yr   = Yt && nr_wght   >  0 ? Yo.Resize8_Repair(Yg, 1, -1) : NOP()
        
        Ym   = Yt ?  nr_wght   == 1 ? Yr : nr_wght   >  0 ? Yo.Merge(Yr, nr_wght  ) : Yo : Ys.BlankClip(width=ow , height=oh , color_yuv=$808080)
        
        res  = Ym
    """) : \
    IsRGB ? \
    Eval("""
        As   = At ? input.ShowAlpha("Y8") : NOP()
        Rs   = input.ShowRed  ("Y8")
        Gs   = input.ShowGreen("Y8")
        Bs   = input.ShowBlue ("Y8")
        
        Ao   = At                   ? As."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , kernel_c, a1_c, a2_c)+""" : NOP()
        Ro   = Yt                   ? Rs."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , kernel  , a1  , a2  )+""" : NOP()
        Go   = Ut                   ? Gs."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , kernel  , a1  , a2  )+""" : NOP()
        Bo   = Vt                   ? Bs."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , kernel  , a1  , a2  )+""" : NOP()
        
        Ag   = At && nr_wght_c >  0 ? As."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , "Gauss" , 100       )+""" : NOP()
        Rg   = Yt && nr_wght   >  0 ? Rs."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , "Gauss" , 100       )+""" : NOP()
        Gg   = Ut && nr_wght   >  0 ? Gs."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , "Gauss" , 100       )+""" : NOP()
        Bg   = Vt && nr_wght   >  0 ? Bs."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , "Gauss" , 100       )+""" : NOP()
        
        Ar   = At && nr_wght_c >  0 ? Ao.Resize8_Repair(Ag, 1, -1) : NOP()
        Rr   = Yt && nr_wght   >  0 ? Ro.Resize8_Repair(Rg, 1, -1) : NOP()
        Gr   = Ut && nr_wght   >  0 ? Go.Resize8_Repair(Gg, 1, -1) : NOP()
        Br   = Vt && nr_wght   >  0 ? Bo.Resize8_Repair(Bg, 1, -1) : NOP()
        
        Am   = At ?  nr_wght_c == 1 ? Ar : nr_wght_c >  0 ? Ao.Merge(Ar, nr_wght_c) : Ao : NOP()
        Rm   = Yt ?  nr_wght   == 1 ? Rr : nr_wght   >  0 ? Ro.Merge(Rr, nr_wght  ) : Ro : Rs.BlankClip(width=ow , height=oh , color_yuv=$008080)
        Gm   = Ut ?  nr_wght   == 1 ? Gr : nr_wght   >  0 ? Go.Merge(Gr, nr_wght  ) : Go : Gs.BlankClip(width=ow , height=oh , color_yuv=$008080)
        Bm   = Vt ?  nr_wght   == 1 ? Br : nr_wght   >  0 ? Bo.Merge(Br, nr_wght  ) : Bo : Bs.BlankClip(width=ow , height=oh , color_yuv=$008080)
        
        res  = At ? MergeARGB(Am, Rm, Gm, Bm) : MergeRGB(Rm, Gm, Bm, sCSP)
    """) : \
    Eval("""
        Ys   = input.ConvertToY8()
        Us   = input.UtoY8()
        Vs   = input.VtoY8()
        
        Yo   = Yt                   ? Ys."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , kernel  , a1  , a2  )+""" : NOP()
        Uo   = Ut                   ? Us."""+Resize8_resstr(owc, ohc, src_lc+chfix, src_tc+cvfix, src_wc, src_hc, kernel_c, a1_c, a2_c)+""" : NOP()
        Vo   = Vt                   ? Vs."""+Resize8_resstr(owc, ohc, src_lc+chfix, src_tc+cvfix, src_wc, src_hc, kernel_c, a1_c, a2_c)+""" : NOP()
        
        Yg   = Yt && nr_wght   >  0 ? Ys."""+Resize8_resstr(ow , oh , src_l       , src_t       , src_w , src_h , "Gauss" , 100       )+""" : NOP()
        Ug   = Ut && nr_wght_c >  0 ? Us."""+Resize8_resstr(owc, ohc, src_lc+chfix, src_tc+cvfix, src_wc, src_hc, "Gauss" , 100       )+""" : NOP()
        Vg   = Vt && nr_wght_c >  0 ? Vs."""+Resize8_resstr(owc, ohc, src_lc+chfix, src_tc+cvfix, src_wc, src_hc, "Gauss" , 100       )+""" : NOP()
        
        Yr   = Yt && nr_wght   >  0 ? Yo.Resize8_Repair(Yg, 1, -1) : NOP()
        Ur   = Ut && nr_wght_c >  0 ? Uo.Resize8_Repair(Ug, 1, -1) : NOP()
        Vr   = Vt && nr_wght_c >  0 ? Vo.Resize8_Repair(Vg, 1, -1) : NOP()
        
        Ym   = Yt ?  nr_wght   == 1 ? Yr : nr_wght   >  0 ? Yo.Merge(Yr, nr_wght  ) : Yo : Ys.BlankClip(width=ow , height=oh , color_yuv=$808080)
        Um   = Ut ?  nr_wght_c == 1 ? Ur : nr_wght_c >  0 ? Uo.Merge(Ur, nr_wght_c) : Uo : Us.BlankClip(width=owc, height=ohc, color_yuv=$808080)
        Vm   = Vt ?  nr_wght_c == 1 ? Vr : nr_wght_c >  0 ? Vo.Merge(Vr, nr_wght_c) : Vo : Vs.BlankClip(width=owc, height=ohc, color_yuv=$808080)
        
        res  = YtoUV(Um, Vm, Ym)
    """)
    
    
    return res
}


Function Resize8_resstr(int "ow", int "oh", float "src_l", float "src_t", float "src_w", float "src_h",
\                      string "kernel", float "a1", float "a2")
{
    ow       = string(ow)
    oh       = string(oh)
    src_l    = string(src_l)
    src_t    = string(src_t)
    src_w    = string(src_w)
    src_h    = string(src_h)
    
    
    resstr   = kernel == "Catmull-Rom"           ? "BicubicResize ("+ow+", "+oh+", 0.0   , 0.5   , "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Hermite"               ? "BicubicResize ("+ow+", "+oh+", 0.0   , 0.0   , "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Mitchell-Netravali"    ? "BicubicResize ("+ow+", "+oh+", 1/3.  , 1/3.  , "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Robidoux"              ? "BicubicResize ("+ow+", "+oh+", 0.3782, 0.3109, "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Bicubic"               ? "BicubicResize ("+ow+", "+oh+", "+string(Default(a1, 1/3.))+", "+string(Default(a2, 1/3.))+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "SoftCubic"             ? "BicubicResize ("+ow+", "+oh+", "+string(Default(a1/100., 0.75))+", "+string(Default(1-a1/100., 0.25))+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "SoftCubic100"          ? "BicubicResize ("+ow+", "+oh+", 1.0   , 0.0   , "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : LeftStr(kernel, 9) == "SoftCubic" ? "BicubicResize ("+ow+", "+oh+", "+RightStr(kernel, 2)+"/100., 1-"+RightStr(kernel, 2)+"/100., "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Bilinear"              ? "BilinearResize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Blankman"              ? "BlackmanResize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", "+string(int(Default(a1,  4)))+")"
    \        : kernel == "Blankman2"             ? "BlackmanResize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", 2)"
    \        : kernel == "Blankman3"             ? "BlackmanResize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", 3)"
    \        : kernel == "Blankman4"             ? "BlackmanResize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", 4)"
    \        : kernel == "Gauss"                 ? "GaussResize   ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", "+string(int(Default(a1, 30)))+")"
    \        : kernel == "Gaussian"              ? "GaussResize   ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", "+string(int(Default(a1, 30)))+")"
    \        : kernel == "Lanczos"               ? "LanczosResize ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", "+string(int(Default(a1,  3)))+")"
    \        : kernel == "Lanczos2"              ? "LanczosResize ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", 2)"
    \        : kernel == "Lanczos3"              ? "LanczosResize ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", 3)"
    \        : kernel == "Lanczos4"              ? "Lanczos4Resize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Point"                 ? "PointResize   ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Sinc"                  ? "SincResize    ("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+", "+string(int(Default(a1,  4)))+")"
    \        : kernel == "Spline16"              ? "Spline16Resize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Spline36"              ? "Spline36Resize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        : kernel == "Spline64"              ? "Spline64Resize("+ow+", "+oh+", "+src_l+", "+src_t+", "+src_w+", "+src_h+")"
    \        :                                     "Unknown Kernel"
    Assert(resstr!="Unknown Kernel", """Resize8: Unsupported "kernel" or "kernel_c"!""")
    
    
    return resstr
}


Function Resize8_Repair(clip input, clip source, int "mode", int "modeU", int "modeV")
{
    try
    {
        return input.Repair(source, mode, modeU, modeV)
    }
    catch(error_msg)
    {
        return input.ConvertToYV12().Repair(source.ConvertToYV12(), mode, modeU, modeV).ConvertToY8()
    }
}


Function Resize8_undef() {}


Function GetCSP(clip c)
{
    return c.IsPlanar ? c.IsYV12 ? "YV12" :
    \                   c.IsYV16 ? "YV16" :
    \                   c.IsYV24 ? "YV24" : c.GetCSP_Y8_YV411() :
    \      c.IsYUY2   ? "YUY2"   :
    \      c.IsRGB32  ? "RGB32"  :
    \      c.IsRGB24  ? "RGB24"  : "Unknown"
    
    
    Function GetCSP_Y8_YV411(clip c)
    {
        try
        {
            c.UtoY()
            csp = "YV411"
        }
        catch ( error_msg )
        {
            csp = "Y8"
        }
        
        return csp
    }
}
Personal tools