Thread: Avisynth+
View Single Post
Old 15th November 2017, 13:05   #3748  |  Link
edcrfv94
Registered User
 
Join Date: Apr 2015
Posts: 84
Quote:
Originally Posted by pinterf View Post
Could you specify your calling parameters and what should I look for in the results?
The result is very different.

Code:
	SetMemoryMax(3000)
	
	#colorbars(width=1920, height=1080, pixel_type="yv12").killaudio().assumefps(25, 1)
	ImageSource("1.png", end=0).Dither_convert_rgb_to_yuv(lsb=true,output="YV12").DitherPost(mode=6)
	
	ConvertToY8()
	trim(0, 5000)
	#Limiter()
	#InvertNeg()
	#VToY()
	
	src = last.ConvertBits(bits=16)
	
	sharp = src.Sharpen(1.0).Sharpen(1.0)
	
	kf_limit_dif8_mt_test(sharp, src, thr=1, elast=42, y=3, u=1, v=1)
	#kf_limit_dif8_expr_test(sharp, src, thr=1, elast=42, y=3, u=1, v=1)
	
	ConvertToStacked().DitherPost(mode=6, ampo=1)
	
	Function kf_limit_dif8_expr_test(clip filtered, clip original, bool "smooth", float "thr", float "elast", float "darkthr", int "Y", int "U", int "V")
	{
		sCSP = filtered.kf_GetCSP()
		IsY8 = sCSP == "Y8"
		
		smooth   = Default(smooth, True    )
		thr      = Default(thr,    1.0     )
		elast    = Default(elast,  smooth ? 3.0 : 255./thr)
		darkthr  = Default(darkthr,thr     )
		Y        = Default(Y,      3       )
		U        = Default(U,      3       )
		V        = Default(V,      3       )
		
		Y        = min(Y,     4)
		U        = min(U,     4)
		V        = min(V,     4)
		
		thr      = max(min(    thr, 255.0), 0.0)
		darkthr  = max(min(darkthr, 255.0), 0.0)
		elast    = max(elast, 1.0)
		mode     = thr == 0 && darkthr == 0 ? 4 : thr == 255 && darkthr == 255 ? 2 : 3
		smooth   = elast==1 ? False : smooth
		
		diffstr  = " x y - "
		elaststr = " "+string(elast)+" "
		
		thrstr   = diffstr+" 0 > "+string(darkthr)+" scalef "+string(thr)+" scalef ? "
		alphastr = elaststr+" 1 <= 0 1 "+elaststr+" 1 - "+thrstr+" * / ? "
		betastr  = thrstr+elaststr+" * "
		sexpr    = smooth   ? alphastr+diffstr+" * "+betastr+diffstr+" abs - * y + "
		\                   : thrstr+diffstr+diffstr+" abs / * y + "
		expr     = diffstr+" abs "+thrstr+" <= x "+diffstr+" abs "+betastr+" >= y "+sexpr+" ? ? "
		
		thrstrc  = " "+string(thr)+" scalef "
		alphastrc= elaststr+" 1 <= 0 1 "+elaststr+" 1 - "+thrstrc+" * / ? "
		betastrc = thrstrc+elaststr+" * "
		sexprc   = smooth   ? alphastrc+diffstr+" * "+betastrc+diffstr+" abs - * y + "
		\                   : thrstrc+diffstr+diffstr+" abs / * y + "
		exprc    = diffstr+" abs "+thrstrc+" <= x "+diffstr+" abs "+betastrc+" >= y "+sexprc+" ? ? "
		
		# diff   = filtered - original
		# alpha  = 1 / (thr * (elast - 1))
		# beta   = elast * thr
		# When smooth=True  :
		# output = diff <= thr  ? filtered : \
		#          diff >= beta ? original : \
		#                         original + alpha * diff * (beta - abs(diff))
		# When smooth=False :
		# output = diff <= thr  ? filtered : \
		#          diff >= beta ? original : \
		#                         original + thr * (diff / abs(diff))
		
		expry = (Y == 3) ? expr : ""
		expru = (U == 3) ? exprc : ""
		exprv = (V == 3) ? exprc : ""
		
		return   (mode == 4)    ? original
		\      : (mode == 2)    ? filtered
		\      : IsY8           ? Expr(filtered, original, expry, optSSE2=true, optSingleMode=false, optAvx2=true)
		\      :                  Expr(filtered, original, expry, expru, exprv, optSSE2=true, optSingleMode=false, optAvx2=true)
	}
	
	Function kf_limit_dif8_mt_test(clip filtered, clip original, bool "smooth", float "thr", float "elast", float "darkthr", int "Y", int "U", int "V")
	{
		
		smooth   = Default(smooth, True    )
		thr      = Default(thr,    1.0     )
		elast    = Default(elast,  smooth ? 3.0 : 255./thr)
		darkthr  = Default(darkthr,thr     )
		Y        = Default(Y,      3       )
		U        = Default(U,      3       )
		V        = Default(V,      3       )
		
		Y        = min(Y,     4)
		U        = min(U,     4)
		V        = min(V,     4)
		
		thr      = max(min(    thr, 255.0), 0.0)
		darkthr  = max(min(darkthr, 255.0), 0.0)
		elast    = max(elast, 1.0)
		mode     = thr == 0 && darkthr == 0 ? 4 : thr == 255 && darkthr == 255 ? 2 : 3
		smooth   = elast==1 ? False : smooth
		
		diffstr  = " x y - "
		elaststr = " "+string(elast)+" "
		
		thrstr   = diffstr+" 0 > "+string(darkthr)+" scalef "+string(thr)+" scalef ? "
		alphastr = elaststr+" 1 <= 0 1 "+elaststr+" 1 - "+thrstr+" * / ? "
		betastr  = thrstr+elaststr+" * "
		sexpr    = smooth   ? alphastr+diffstr+" * "+betastr+diffstr+" abs - * y + "
		\                   : thrstr+diffstr+diffstr+" abs / * y + "
		expr     = diffstr+" abs "+thrstr+" <= x "+diffstr+" abs "+betastr+" >= y "+sexpr+" ? ? "
		
		thrstrc  = " "+string(thr)+" scalef "
		alphastrc= elaststr+" 1 <= 0 1 "+elaststr+" 1 - "+thrstrc+" * / ? "
		betastrc = thrstrc+elaststr+" * "
		sexprc   = smooth   ? alphastrc+diffstr+" * "+betastrc+diffstr+" abs - * y + "
		\                   : thrstrc+diffstr+diffstr+" abs / * y + "
		exprc    = diffstr+" abs "+thrstrc+" <= x "+diffstr+" abs "+betastrc+" >= y "+sexprc+" ? ? "
		
		# diff   = filtered - original
		# alpha  = 1 / (thr * (elast - 1))
		# beta   = elast * thr
		# When smooth=True  :
		# output = diff <= thr  ? filtered : \
		#          diff >= beta ? original : \
		#                         original + alpha * diff * (beta - abs(diff))
		# When smooth=False :
		# output = diff <= thr  ? filtered : \
		#          diff >= beta ? original : \
		#                         original + thr * (diff / abs(diff))
		
		return   mode == 4    ? original
		\      : mode == 2    ? filtered
		\      :                mt_lutxy(filtered, original, yExpr=expr, uExpr=exprc, vExpr=exprc, Y=Y, U=U, V=V)
	}
	
	Function kf_GetCSP(clip c)
	{
		try {
			csp = c.kf_GetCSP_avsPlus()
		} catch (error_msg) {
			csp = c.kf_GetCSP_avs()
		}
		return csp
	}


	Function kf_GetCSP_avs(clip c)
	{
		return c.IsPlanar ? c.IsYV12 ? "YV12" :
		\                   c.IsYV16 ? "YV16" :
		\                   c.IsYV24 ? "YV24" : c.kf_GetCSP_Y8_YV411() :
		\      c.IsYUY2   ? "YUY2"   :
		\      c.IsRGB32  ? "RGB32"  :
		\      c.IsRGB24  ? "RGB24"  : "Unknown"

		Function kf_GetCSP_Y8_YV411(clip c) {
		    try {
			c.UtoY
			csp = "YV411"
		    } catch (error_msg) {
			csp = "Y8"
		    }
		    return csp
		}
	}

	Function kf_GetCSP_avsPlus(clip c)
	{
		return c.Is420   ? "YV12"  :
		\      c.IsY     ? "Y8"    :
		\      c.Is422   ? "YV16"  :
		\      c.Is444   ? "YV24"  : 
		\      c.IsYUVA  ? "YUVA"  :
		\      c.IsYV411 ? "YV411" :
		\      c.IsYUY2  ? "YUY2"  :
		\      c.IsRGB32      ? "RGB32"       :
		\      c.IsRGB24      ? "RGB24"       :
		\      c.IsPackedRGB  ? "RGB32/RGB24" :
		\      c.IsPlanarRGB  ? "RGB48"       :
		\      c.IsPlanarRGBA ? "RGB64"       : "Unknown"
	}

Last edited by edcrfv94; 15th November 2017 at 13:09.
edcrfv94 is offline