Re: AdaptDBMC - Luma/Fade/Blue自适应debanding脚本(公测,各种待优化)
发表于 : 2011-12-16 14:45
其实1/3为单位floor的话精度也差不多足够了,反正x factor后还是会取整,实际上用到的精度可能差不多就是1/3左右……不过其实目前速度影响最大的估计还是在MVtools里,f3kdb好快好快的-v-
代码: 全选
--- AdaptDBMC_beta.avsi 2011-12-15 05:49:50.000000000 +0800
+++ AdaptDBMC_beta_Mod.avsi 2011-12-16 15:19:43.000000000 +0800
@@ -128,16 +128,41 @@
### Mix all factors and calculate final factor of strength
global strFact = "( " + AdaptLuma + " * ( 1 + " + AdaptFade + " ) * ( 1 + " + AdaptBlue + " ) )"
-global f3kdb_eval = "f3kdb( Y=int("+String(Y)+"*"+strFact+
-\ "), Cb=int("+String(Cb)+"*"+strFact+
-\ "), Cr=int("+String(Cr)+"*"+strFact+
-\ "), ditherY=int("+String(ditherY)+"*"+strFact+
-\ "), ditherC=int("+String(ditherC)+"*"+strFact+
+global f3kdb_eval = "f3kdb( Y=int("+String(Y)+"*f3kdb_rfact"+
+\ "), Cb=int("+String(Cb)+"*f3kdb_rfact"+
+\ "), Cr=int("+String(Cr)+"*f3kdb_rfact"+
+\ "), ditherY=int("+String(ditherY)+"*f3kdb_rfact"+
+\ "), ditherC=int("+String(ditherC)+"*f3kdb_rfact"+
\ ( Defined(f3k_param) ? "), "+f3k_param+" )"
-\ : ") )" )
+\ : ") )" ) +
+\ ( Info ? """.Subtitle("Real Final factor: "+String(f3kdb_rfact), x = 8, y = 28)""" : "")
-Info ? ScriptClip( f3kdb_eval+""".Subtitle( "Final factor: "+String( Eval(strFact) ), x=8, y=8 ).Subtitle( "Luma adaptive factor: "+String( Eval(AdaptLuma) ), x=8, y=38 ).Subtitle( "Fade adaptive factor: "+String( 1+Eval(AdaptFade) ), x=8, y=58 ).Subtitle( "Blue adaptive factor: "+String( 1+Eval(AdaptBlue) ), x=8, y=78 ).Subtitle( "Frame complexity: "+String( Eval(c_Complex) ), x=8, y=108 )""" )
-\ : ScriptClip( f3kdb_eval )
+global f3kdb_rfact = 1.00
+global f3kdb1 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 1.33
+global f3kdb2 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 1.67
+global f3kdb3 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 2.00
+global f3kdb4 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 2.33
+global f3kdb5 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 2.66
+global f3kdb6 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 3.00
+global f3kdb7 = Eval(f3kdb_eval)
+
+global f3kdb_eval2 = """vStrFact = Eval(strFact)""" + chr(13)+"""f3kdbRet = (vStrFact < 1.33) ? f3kdb1:(vStrFact < 1.66) ? f3kdb2:(vStrFact < 2.0) ? f3kdb3:(vStrFact < 2.33) ? f3kdb4:(vStrFact < 2.66) ? f3kdb5: (vStrFact < 3) ? f3kdb6 : f3kdb7"""
+eClip = last
+sClip = BlankClip(f3kdb1)
+Info ? ScriptClip( f3kdb_eval2+chr(13)+"""f3kdbRet.Subtitle( "Final factor: "+String( Eval(strFact) ), x=8, y=8 ).Subtitle( "Luma adaptive factor: "+String( Eval(AdaptLuma) ), x=8, y=58 ).Subtitle( "Fade adaptive factor: "+String( 1+Eval(AdaptFade) ), x=8, y=78 ).Subtitle( "Blue adaptive factor: "+String( 1+Eval(AdaptBlue) ), x=8, y=98 ).Subtitle( "Frame complexity: "+String( Eval(c_Complex) ), x=8, y=128 )""" )
+\ : Eval("""ScriptClip(sClip, "Eval(f3kdbRet)")"""+chr(13)+"""FrameEvaluate(eClip, f3kdb_eval2 )""")
return SelectEvery( 1 + radius * 2, radius)
}
代码: 全选
LoadCPlugin("ScriptTrick.dll")
XXXSource()
feClip = FrameEvaluate( last.Spline36Resize(1280,720).ColorYUV(gain_y=50), "Text = String(AverageLuma)")
scClip = ScriptClip( last.Spline36Resize(1920,1080), "Subtitle(Text).Subtitle(String(AverageLuma),y=20)")
SCTri(scClip,EvalClip=feClip)
代码: 全选
--- AdaptDBMC_beta.avsi 2011-12-15 05:49:51 +0800
+++ AdaptDBMC_beta_mod.avsi 2011-12-17 07:08:31 +0800
@@ -1,4 +1,4 @@
-FUNCTION AdaptDBMC(clip i,
+FUNCTION AdaptDBMC_Mod(clip i,
\ float "Y", float "Cb", float "Cr",
\ float "ditherY", float "ditherC", string "f3k_param",
\ float "Luma_Cpst", float "Fade_Cpst", float "Blue_Cpst",
@@ -49,49 +49,45 @@
Assert( Blue_Cpst>=0, "AdaptDBMC: Blue_Cpst can't be negative!" )
Assert( radius>0 && radius <=6, "AdaptDBMC: radius ranges from 1 to 6!" )
-nullclip = BlankClip()
-
MVS = MSuper(hpad=0, vpad=0, pel=pel, sharp=0, chroma=false)
-f1v = (radius<1) ? nullclip
+f1v = (radius<1) ? nop
\ : MVS.MAnalyse(isb=false, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-f2v = (radius<2) ? nullclip
+f2v = (radius<2) ? nop
\ : MVS.MAnalyse(isb=false, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-f3v = (radius<3) ? nullclip
+f3v = (radius<3) ? nop
\ : MVS.MAnalyse(isb=false, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-f4v = (radius<4) ? nullclip
+f4v = (radius<4) ? nop
\ : MVS.MAnalyse(isb=false, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-f5v = (radius<5) ? nullclip
+f5v = (radius<5) ? nop
\ : MVS.MAnalyse(isb=false, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-f6v = (radius<6) ? nullclip
+f6v = (radius<6) ? nop
\ : MVS.MAnalyse(isb=false, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-b1v = (radius<1) ? nullclip
+b1v = (radius<1) ? nop
\ : MVS.MAnalyse(isb=true, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-b2v = (radius<2) ? nullclip
+b2v = (radius<2) ? nop
\ : MVS.MAnalyse(isb=true, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-b3v = (radius<3) ? nullclip
+b3v = (radius<3) ? nop
\ : MVS.MAnalyse(isb=true, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-b4v = (radius<4) ? nullclip
+b4v = (radius<4) ? nop
\ : MVS.MAnalyse(isb=true, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-b5v = (radius<5) ? nullclip
+b5v = (radius<5) ? nop
\ : MVS.MAnalyse(isb=true, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-b6v = (radius<6) ? nullclip
+b6v = (radius<6) ? nop
\ : MVS.MAnalyse(isb=true, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
-SAD_f1m = MMask(f1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
-SAD_b1m = MMask(b1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
f1c = MCompensate(MVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
b1c = MCompensate(MVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
-b2c = (radius>=2) ? i.MCompensate(MVS, b2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-b3c = (radius>=3) ? i.MCompensate(MVS, b3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-b4c = (radius>=4) ? i.MCompensate(MVS, b4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-b5c = (radius>=5) ? i.MCompensate(MVS, b5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-b6c = (radius>=6) ? i.MCompensate(MVS, b6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-f2c = (radius>=2) ? i.MCompensate(MVS, f2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-f3c = (radius>=3) ? i.MCompensate(MVS, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-f4c = (radius>=4) ? i.MCompensate(MVS, f4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-f5c = (radius>=5) ? i.MCompensate(MVS, f5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
-f6c = (radius>=6) ? i.MCompensate(MVS, f6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
+b2c = (radius>=2) ? i.MCompensate(MVS, b2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+b3c = (radius>=3) ? i.MCompensate(MVS, b3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+b4c = (radius>=4) ? i.MCompensate(MVS, b4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+b5c = (radius>=5) ? i.MCompensate(MVS, b5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+b6c = (radius>=6) ? i.MCompensate(MVS, b6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+f2c = (radius>=2) ? i.MCompensate(MVS, f2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+f3c = (radius>=3) ? i.MCompensate(MVS, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+f4c = (radius>=4) ? i.MCompensate(MVS, f4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+f5c = (radius>=5) ? i.MCompensate(MVS, f5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
+f6c = (radius>=6) ? i.MCompensate(MVS, f6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
c = (radius==6) ? interleave(f6c, f5c, f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c, b5c, b6c)
\ : (radius==5) ? interleave( f5c, f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c, b5c )
@@ -105,40 +101,92 @@
### Luma adaptive factor
global AdaptLuma = (Luma_Cpst==0) ? "1"
-\ : "( ( ( AverageLuma > 160 ) ? Pow( ( 256.0 - AverageLuma ) / 96, "+String(Luma_Cpst)+" ) : Log( ( 256.0 - AverageLuma ) / 96 ) * "+String(Luma_Cpst)+" + 1 ) / "+String(Luma_Cpst)+" / 2 + 1 )"
-
+\ : "( ( ( vAverageLuma > 160 ) ? Pow( ( 256.0 - vAverageLuma ) / 96, "+String(Luma_Cpst)+" ) : Log( ( 256.0 - vAverageLuma ) / 96 ) * "+String(Luma_Cpst)+" + 1 ) / "+String(Luma_Cpst)+" / 2 + 1 )"
+global CRGB32Clip = CRGB32
+global CRGB32Clip = CRGB32Clip.ShowBlue("YV12").Overlay(CRGB32Clip.ShowRed("YV12"), mode="subtract")
### Blue compensate value
-global AdaptBlue = """( AverageLuma( CRGB32.ShowBlue("YV12").Overlay(CRGB32.ShowRed("YV12"), mode="subtract") ) / 96.0 * """+String(Blue_Cpst)+" )"
+global AdaptBlue = """( AverageLuma( CRGB32Clip ) / 96.0 * """+String(Blue_Cpst)+" )"
### Fade compensate value
global FadeDenom = ( radius==0 ) ? 1 : 384.0 * radius
+global cLoop1 = (radius>=2)? loop(2,0,-1) : nop
+global cLoop2 = (radius>=2)? loop(0,0,-1) : nop
+global cLoop3 = (radius>=3)? loop(3,0,-1) : nop
+global cLoop4 = (radius>=3)? loop(0,0,1) : nop
+global cLoop5 = (radius>=4)? loop(4,0,-1) : nop
+global cLoop6 = (radius>=4)? loop(0,0,2) : nop
+global cLoop7 = (radius>=5)? loop(5,0,-1) : nop
+global cLoop8 = (radius>=5)? loop(0,0,3) : nop
+global cLoop9 = (radius>=6)? loop(6,0,-1) : nop
+global cLoop10 = (radius>=6)? loop(0,0,4) : nop
+
global AdaptFade = (Fade_Cpst==0) ? "0"
\ : (radius==1) ? "( log( (YDifferenceFromPrevious+YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
-\ : (radius==2) ? "( log( (loop(2,0,-1).YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+loop(0,0,-1).YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
-\ : (radius==3) ? "( log( (loop(3,0,-1).YDifferenceFromPrevious+loop(2,0,-1).YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+loop(0,0,-1).YDifferenceToNext+loop(0,0,1).YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
-\ : (radius==4) ? "( log( (loop(4,0,-1).YDifferenceFromPrevious+loop(3,0,-1).YDifferenceFromPrevious+loop(2,0,-1).YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+loop(0,0,-1).YDifferenceToNext+loop(0,0,1).YDifferenceToNext+loop(0,0,2).YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
-\ : (radius==5) ? "( log( (loop(5,0,-1).YDifferenceFromPrevious+loop(4,0,-1).YDifferenceFromPrevious+loop(3,0,-1).YDifferenceFromPrevious+loop(2,0,-1).YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+loop(0,0,-1).YDifferenceToNext+loop(0,0,1).YDifferenceToNext+loop(0,0,2).YDifferenceToNext+loop(0,0,3).YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
-\ : (radius==6) ? "( log( (loop(6,0,-1).YDifferenceFromPrevious+loop(5,0,-1).YDifferenceFromPrevious+loop(4,0,-1).YDifferenceFromPrevious+loop(3,0,-1).YDifferenceFromPrevious+loop(2,0,-1).YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+loop(0,0,-1).YDifferenceToNext+loop(0,0,1).YDifferenceToNext+loop(0,0,2).YDifferenceToNext+loop(0,0,3).YDifferenceToNext+loop(0,0,4).YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
+\ : (radius==2) ? "( log( (cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
+\ : (radius==3) ? "( log( (cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
+\ : (radius==4) ? "( log( (cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
+\ : (radius==5) ? "( log( (cLoop7.YDifferenceFromPrevious+cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext+cLoop8.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
+\ : (radius==6) ? "( log( (cLoop9.YDifferenceFromPrevious+cLoop7.YDifferenceFromPrevious+cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext+cLoop8.YDifferenceToNext+cLoop10.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : "0"
+global rgclip = RemoveGrain(24, 0, 0)
### Calculate complexity of a frame
-global c_Complex = "Exp( LumaDifference( RemoveGrain(24, 0, 0) ) + 1 )"
+global c_Complex = "Exp( LumaDifference( rgclip ) + 1 )"
### Fading frames should have comparatively low luma value and low complexity
-global AdaptFade = "Exp( " + AdaptLuma + " * 7 ) / 200 * " + AdaptFade + " / " + c_Complex
+global AdaptFade = "Exp( vAdaptLuma * 7 ) / 200 * " + AdaptFade + " / vc_Complex"
### Mix all factors and calculate final factor of strength
-global strFact = "( " + AdaptLuma + " * ( 1 + " + AdaptFade + " ) * ( 1 + " + AdaptBlue + " ) )"
+global strFact = "( vAdaptLuma * ( 1 + vAdaptFade ) * ( 1 + vAdaptBlue ) )"
-global f3kdb_eval = "f3kdb( Y=int("+String(Y)+"*"+strFact+
-\ "), Cb=int("+String(Cb)+"*"+strFact+
-\ "), Cr=int("+String(Cr)+"*"+strFact+
-\ "), ditherY=int("+String(ditherY)+"*"+strFact+
-\ "), ditherC=int("+String(ditherC)+"*"+strFact+
+global f3kdb_eval = "f3kdb( Y=int("+String(Y)+"*f3kdb_rfact"+
+\ "), Cb=int("+String(Cb)+"*f3kdb_rfact"+
+\ "), Cr=int("+String(Cr)+"*f3kdb_rfact"+
+\ "), ditherY=int("+String(ditherY)+"*f3kdb_rfact"+
+\ "), ditherC=int("+String(ditherC)+"*f3kdb_rfact"+
\ ( Defined(f3k_param) ? "), "+f3k_param+" )"
-\ : ") )" )
+\ : ") )" ) +
+\ ( Info ? """.Subtitle("Real Final factor: "+String(f3kdb_rfact), x = 8, y = 28)""" : "")
+
+global f3kdb_rfact = 1.00
+global f3kdb1 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 1.33
+global f3kdb2 = Eval(f3kdb_eval)
-Info ? ScriptClip( f3kdb_eval+""".Subtitle( "Final factor: "+String( Eval(strFact) ), x=8, y=8 ).Subtitle( "Luma adaptive factor: "+String( Eval(AdaptLuma) ), x=8, y=38 ).Subtitle( "Fade adaptive factor: "+String( 1+Eval(AdaptFade) ), x=8, y=58 ).Subtitle( "Blue adaptive factor: "+String( 1+Eval(AdaptBlue) ), x=8, y=78 ).Subtitle( "Frame complexity: "+String( Eval(c_Complex) ), x=8, y=108 )""" )
-\ : ScriptClip( f3kdb_eval )
+global f3kdb_rfact = 1.66
+global f3kdb3 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 2.00
+global f3kdb4 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 2.33
+global f3kdb5 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 2.66
+global f3kdb6 = Eval(f3kdb_eval)
+
+global f3kdb_rfact = 3.00
+global f3kdb7 = Eval(f3kdb_eval)
+
+global eClip = last
+sClip = BlankClip(f3kdb1)
+
+global f3kdb_eval2 = "eClip" + chr(13)
+\ + "vAverageLuma = AverageLuma" + chr(13)
+\ + "vAdaptLuma = Eval(AdaptLuma)" + chr(13)
+\ + "vAdaptBlue = Eval(AdaptBlue)" + chr(13)
+\ + "vc_Complex = Eval(c_Complex)" + chr(13)
+\ + "vAdaptFade = Eval(AdaptFade)" + chr(13)
+\ + "vStrFact = Eval(strFact)" + chr(13)
+\ + "f3kdbRet = (vStrFact < 1.166) ? f3kdb1:"
+\ + "(vStrFact < 1.500) ? f3kdb2:"
+\ + "(vStrFact < 1.833) ? f3kdb3:"
+\ + "(vStrFact < 2.166) ? f3kdb4:"
+\ + "(vStrFact < 2.500) ? f3kdb5:"
+\ + "(vStrFact < 2.833) ? f3kdb6:"
+\ + "f3kdb7"
+Info ? ScriptClip(sClip, f3kdb_eval2+chr(13)+"""f3kdbRet.Subtitle( "Final factor: "+String( vstrFact ), x=8, y=8 ).Subtitle( "Luma adaptive factor: "+String( vAdaptLuma ), x=8, y=58 ).Subtitle( "Fade adaptive factor: "+String( 1+vAdaptFade ), x=8, y=78 ).Subtitle( "Blue adaptive factor: "+String( 1+vAdaptBlue ), x=8, y=98 ).Subtitle( "Frame complexity: "+String( vc_Complex ), x=8, y=128 )""" )
+\ :ScriptClip(sClip, f3kdb_eval2+chr(13)+"""f3kdbRet""")
return SelectEvery( 1 + radius * 2, radius)
}
代码: 全选
FUNCTION AdaptDBMC_Mod(clip i,
\ float "Y", float "Cb", float "Cr",
\ float "ditherY", float "ditherC", string "f3k_param",
\ float "Luma_Cpst", float "Fade_Cpst", float "Blue_Cpst",
\ int "radius", int "blksize", int "overlap", bool "truemotion", bool "MVGlobal",
\ int "pel", int "pelsearch", int "search", int "searchparam",
\ int "thSAD", int "thSAD2", int "thSCD1", int "thSCD2",
\ bool "info")
{
last = i
res = width * height
Y = Default( Y, 24 )
Cb = Default( Cb, 24 )
Cr = Default( Cr, 24 )
ditherY = Default( ditherY, 24 )
ditherC = Default( ditherC, 24 )
Luma_Cpst = Default( Luma_Cpst, 2 ) # Luma compensate factor
Fade_Cpst = Default( Fade_Cpst, 1 ) # Fade compensate addition
Blue_Cpst = Default( Blue_Cpst, 1 ) # Blue compensate addition
radius = Default( radius, 2 )
blksize = ( res <= 589824 ) ? Default( blksize, 8 ) :
\ Default( blksize, 16 )
overlap = ( res <= 589824 ) ? Default( overlap, 4 ) :
\ Default( overlap, 8 )
pel = Default( pel, 2 )
pelsearch = Default( pelsearch, 2 )
search = Default( search, 2 )
searchparam = Default( searchparam, 2 )
MVGlobal = Default( MVGlobal, true )
truemotion = Default( truemotion, false )
thSAD = Default( thSAD, 300 )
thSAD2 = Default( thSAD2, 300 )
thSCD1 = Default( thSCD1, 300 )
thSCD2 = Default( thSCD2, 100 )
info = Default( info, false )
Assert( Y>=0, "AdaptDBMC: Y can't be negative!" )
Assert( Cb>=0, "AdaptDBMC: Cb can't be negative!" )
Assert( Cr>=0, "AdaptDBMC: Cr can't be negative!" )
Assert( ditherY>=0, "AdaptDBMC: ditherY can't be negative!" )
Assert( ditherC>=0, "AdaptDBMC: ditherC can't be negative!" )
Assert( Luma_Cpst>=0, "AdaptDBMC: Luma_Cpst can't be negative!" )
Assert( Fade_Cpst>=0, "AdaptDBMC: Fade_Cpst can't be negative!" )
Assert( Blue_Cpst>=0, "AdaptDBMC: Blue_Cpst can't be negative!" )
Assert( radius>0 && radius <=6, "AdaptDBMC: radius ranges from 1 to 6!" )
MVS = MSuper(hpad=0, vpad=0, pel=pel, sharp=0, chroma=false)
f1v = (radius<1) ? nop
\ : MVS.MAnalyse(isb=false, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f2v = (radius<2) ? nop
\ : MVS.MAnalyse(isb=false, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f3v = (radius<3) ? nop
\ : MVS.MAnalyse(isb=false, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f4v = (radius<4) ? nop
\ : MVS.MAnalyse(isb=false, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f5v = (radius<5) ? nop
\ : MVS.MAnalyse(isb=false, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f6v = (radius<6) ? nop
\ : MVS.MAnalyse(isb=false, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b1v = (radius<1) ? nop
\ : MVS.MAnalyse(isb=true, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b2v = (radius<2) ? nop
\ : MVS.MAnalyse(isb=true, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b3v = (radius<3) ? nop
\ : MVS.MAnalyse(isb=true, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b4v = (radius<4) ? nop
\ : MVS.MAnalyse(isb=true, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b5v = (radius<5) ? nop
\ : MVS.MAnalyse(isb=true, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b6v = (radius<6) ? nop
\ : MVS.MAnalyse(isb=true, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f1c = MCompensate(MVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
b1c = MCompensate(MVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
b2c = (radius>=2) ? i.MCompensate(MVS, b2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b3c = (radius>=3) ? i.MCompensate(MVS, b3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b4c = (radius>=4) ? i.MCompensate(MVS, b4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b5c = (radius>=5) ? i.MCompensate(MVS, b5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b6c = (radius>=6) ? i.MCompensate(MVS, b6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f2c = (radius>=2) ? i.MCompensate(MVS, f2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f3c = (radius>=3) ? i.MCompensate(MVS, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f4c = (radius>=4) ? i.MCompensate(MVS, f4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f5c = (radius>=5) ? i.MCompensate(MVS, f5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f6c = (radius>=6) ? i.MCompensate(MVS, f6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
c = (radius==6) ? interleave(f6c, f5c, f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c, b5c, b6c)
\ : (radius==5) ? interleave( f5c, f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c, b5c )
\ : (radius==4) ? interleave( f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c )
\ : (radius==3) ? interleave( f3c, f2c, f1c, i, b1c, b2c, b3c )
\ : (radius==2) ? interleave( f2c, f1c, i, b1c, b2c )
\ : (radius==1) ? interleave( f1c, i, b1c )
\ : i
last = c
### Luma adaptive factor
global AdaptLuma = (Luma_Cpst==0) ? "1"
\ : "( ( ( vAverageLuma > 160 ) ? Pow( ( 256.0 - vAverageLuma ) / 96, "+String(Luma_Cpst)+" ) : Log( ( 256.0 - vAverageLuma ) / 96 ) * "+String(Luma_Cpst)+" + 1 ) / "+String(Luma_Cpst)+" / 2 + 1 )"
global CRGB32Clip = CRGB32
global CRGB32Clip = CRGB32Clip.ShowBlue("YV12").Overlay(CRGB32Clip.ShowRed("YV12"), mode="subtract")
### Blue compensate value
global AdaptBlue = """( AverageLuma( CRGB32Clip ) / 96.0 * """+String(Blue_Cpst)+" )"
### Fade compensate value
global FadeDenom = ( radius==0 ) ? 1 : 384.0 * radius
global cLoop1 = (radius>=2)? loop(2,0,-1) : nop
global cLoop2 = (radius>=2)? loop(0,0,-1) : nop
global cLoop3 = (radius>=3)? loop(3,0,-1) : nop
global cLoop4 = (radius>=3)? loop(0,0,1) : nop
global cLoop5 = (radius>=4)? loop(4,0,-1) : nop
global cLoop6 = (radius>=4)? loop(0,0,2) : nop
global cLoop7 = (radius>=5)? loop(5,0,-1) : nop
global cLoop8 = (radius>=5)? loop(0,0,3) : nop
global cLoop9 = (radius>=6)? loop(6,0,-1) : nop
global cLoop10 = (radius>=6)? loop(0,0,4) : nop
global AdaptFade = (Fade_Cpst==0) ? "0"
\ : (radius==1) ? "( log( (YDifferenceFromPrevious+YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==2) ? "( log( (cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==3) ? "( log( (cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==4) ? "( log( (cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==5) ? "( log( (cLoop7.YDifferenceFromPrevious+cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext+cLoop8.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==6) ? "( log( (cLoop9.YDifferenceFromPrevious+cLoop7.YDifferenceFromPrevious+cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext+cLoop8.YDifferenceToNext+cLoop10.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : "0"
global rgclip = RemoveGrain(24, 0, 0)
### Calculate complexity of a frame
global c_Complex = "Exp( LumaDifference( rgclip ) + 1 )"
### Fading frames should have comparatively low luma value and low complexity
global AdaptFade = "Exp( vAdaptLuma * 7 ) / 200 * " + AdaptFade + " / vc_Complex"
### Mix all factors and calculate final factor of strength
global strFact = "( vAdaptLuma * ( 1 + vAdaptFade ) * ( 1 + vAdaptBlue ) )"
global f3kdb_eval = "f3kdb( Y=int("+String(Y)+"*f3kdb_rfact"+
\ "), Cb=int("+String(Cb)+"*f3kdb_rfact"+
\ "), Cr=int("+String(Cr)+"*f3kdb_rfact"+
\ "), ditherY=int("+String(ditherY)+"*f3kdb_rfact"+
\ "), ditherC=int("+String(ditherC)+"*f3kdb_rfact"+
\ ( Defined(f3k_param) ? "), "+f3k_param+" )"
\ : ") )" ) +
\ ( Info ? """.Subtitle("Real Final factor: "+String(f3kdb_rfact), x = 8, y = 28)""" : "")
global f3kdb_rfact = 1.00
global f3kdb1 = Eval(f3kdb_eval)
global f3kdb_rfact = 1.33
global f3kdb2 = Eval(f3kdb_eval)
global f3kdb_rfact = 1.66
global f3kdb3 = Eval(f3kdb_eval)
global f3kdb_rfact = 2.00
global f3kdb4 = Eval(f3kdb_eval)
global f3kdb_rfact = 2.33
global f3kdb5 = Eval(f3kdb_eval)
global f3kdb_rfact = 2.66
global f3kdb6 = Eval(f3kdb_eval)
global f3kdb_rfact = 3.00
global f3kdb7 = Eval(f3kdb_eval)
global eClip = last
sClip = BlankClip(f3kdb1)
global f3kdb_eval2 = "eClip" + chr(13)
\ + "vAverageLuma = AverageLuma" + chr(13)
\ + "vAdaptLuma = Eval(AdaptLuma)" + chr(13)
\ + "vAdaptBlue = Eval(AdaptBlue)" + chr(13)
\ + "vc_Complex = Eval(c_Complex)" + chr(13)
\ + "vAdaptFade = Eval(AdaptFade)" + chr(13)
\ + "vStrFact = Eval(strFact)" + chr(13)
\ + "f3kdbRet = (vStrFact < 1.166) ? f3kdb1:"
\ + "(vStrFact < 1.500) ? f3kdb2:"
\ + "(vStrFact < 1.833) ? f3kdb3:"
\ + "(vStrFact < 2.166) ? f3kdb4:"
\ + "(vStrFact < 2.500) ? f3kdb5:"
\ + "(vStrFact < 2.833) ? f3kdb6:"
\ + "f3kdb7"
Info ? ScriptClip(sClip, f3kdb_eval2+chr(13)+"""f3kdbRet.Subtitle( "Final factor: "+String( vstrFact ), x=8, y=8 ).Subtitle( "Luma adaptive factor: "+String( vAdaptLuma ), x=8, y=58 ).Subtitle( "Fade adaptive factor: "+String( 1+vAdaptFade ), x=8, y=78 ).Subtitle( "Blue adaptive factor: "+String( 1+vAdaptBlue ), x=8, y=98 ).Subtitle( "Frame complexity: "+String( vc_Complex ), x=8, y=128 )""" )
\ :ScriptClip(sClip, f3kdb_eval2+chr(13)+"""f3kdbRet""")
return SelectEvery( 1 + radius * 2, radius)
}
### Fixed ConvertToRGB32 ###
function CRGB32(clip c, string "matrix", bool "interlaced") {
matrix = ( c.width>1024 || c.height>576 ) ? Default(matrix, "Rec709") : Default(matrix, "Rec601")
interlaced = Default(interlaced, false)
return
\ c.IsRGB32 ? c :
\ c.IsRGB ? c.ConvertToRGB32(interlaced=interlaced) :
\ c.ConvertToRGB32(interlaced=interlaced, matrix=matrix)
}
代码: 全选
FUNCTION AdaptDBMC_Mod(clip i,
\ float "Y", float "Cb", float "Cr",
\ float "ditherY", float "ditherC", string "f3k_param",
\ float "Luma_Cpst", float "Fade_Cpst", float "Blue_Cpst",
\ int "radius", int "blksize", int "overlap", bool "truemotion", bool "MVGlobal",
\ int "pel", int "pelsearch", int "search", int "searchparam",
\ int "thSAD", int "thSAD2", int "thSCD1", int "thSCD2",
\ bool "info", clip "mvp")
{
mvpClip = Defined(mvp)? mvp : i
last = mvpClip
res = width * height
Y = Default( Y, 24 )
Cb = Default( Cb, 24 )
Cr = Default( Cr, 24 )
ditherY = Default( ditherY, 24 )
ditherC = Default( ditherC, 24 )
Luma_Cpst = Default( Luma_Cpst, 2 ) # Luma compensate factor
Fade_Cpst = Default( Fade_Cpst, 1 ) # Fade compensate addition
Blue_Cpst = Default( Blue_Cpst, 1 ) # Blue compensate addition
radius = Default( radius, 2 )
blksize = ( res <= 589824 ) ? Default( blksize, 8 ) :
\ Default( blksize, 16 )
overlap = ( res <= 589824 ) ? Default( overlap, 4 ) :
\ Default( overlap, 8 )
pel = Default( pel, 2 )
pelsearch = Default( pelsearch, 2 )
search = Default( search, 2 )
searchparam = Default( searchparam, 2 )
MVGlobal = Default( MVGlobal, true )
truemotion = Default( truemotion, false )
thSAD = Default( thSAD, 300 )
thSAD2 = Default( thSAD2, 300 )
thSCD1 = Default( thSCD1, 300 )
thSCD2 = Default( thSCD2, 100 )
info = Default( info, false )
Assert( Y>=0, "AdaptDBMC: Y can't be negative!" )
Assert( Cb>=0, "AdaptDBMC: Cb can't be negative!" )
Assert( Cr>=0, "AdaptDBMC: Cr can't be negative!" )
Assert( ditherY>=0, "AdaptDBMC: ditherY can't be negative!" )
Assert( ditherC>=0, "AdaptDBMC: ditherC can't be negative!" )
Assert( Luma_Cpst>=0, "AdaptDBMC: Luma_Cpst can't be negative!" )
Assert( Fade_Cpst>=0, "AdaptDBMC: Fade_Cpst can't be negative!" )
Assert( Blue_Cpst>=0, "AdaptDBMC: Blue_Cpst can't be negative!" )
Assert( radius>0 && radius <=6, "AdaptDBMC: radius ranges from 1 to 6!" )
MVS = MSuper(hpad=0, vpad=0, pel=pel, sharp=0, chroma=false)
f1v = (radius<1) ? nop
\ : MVS.MAnalyse(isb=false, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f2v = (radius<2) ? nop
\ : MVS.MAnalyse(isb=false, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f3v = (radius<3) ? nop
\ : MVS.MAnalyse(isb=false, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f4v = (radius<4) ? nop
\ : MVS.MAnalyse(isb=false, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f5v = (radius<5) ? nop
\ : MVS.MAnalyse(isb=false, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f6v = (radius<6) ? nop
\ : MVS.MAnalyse(isb=false, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b1v = (radius<1) ? nop
\ : MVS.MAnalyse(isb=true, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b2v = (radius<2) ? nop
\ : MVS.MAnalyse(isb=true, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b3v = (radius<3) ? nop
\ : MVS.MAnalyse(isb=true, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b4v = (radius<4) ? nop
\ : MVS.MAnalyse(isb=true, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b5v = (radius<5) ? nop
\ : MVS.MAnalyse(isb=true, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
b6v = (radius<6) ? nop
\ : MVS.MAnalyse(isb=true, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=0, global=MVglobal, chroma=false)
f1c = MCompensate(MVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
b1c = MCompensate(MVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
b2c = (radius>=2) ? mvpClip.MCompensate(MVS, b2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b3c = (radius>=3) ? mvpClip.MCompensate(MVS, b3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b4c = (radius>=4) ? mvpClip.MCompensate(MVS, b4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b5c = (radius>=5) ? mvpClip.MCompensate(MVS, b5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
b6c = (radius>=6) ? mvpClip.MCompensate(MVS, b6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f2c = (radius>=2) ? mvpClip.MCompensate(MVS, f2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f3c = (radius>=3) ? mvpClip.MCompensate(MVS, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f4c = (radius>=4) ? mvpClip.MCompensate(MVS, f4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f5c = (radius>=5) ? mvpClip.MCompensate(MVS, f5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
f6c = (radius>=6) ? mvpClip.MCompensate(MVS, f6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nop
c = (radius==6) ? interleave(f6c, f5c, f4c, f3c, f2c, f1c, mvpClip, b1c, b2c, b3c, b4c, b5c, b6c)
\ : (radius==5) ? interleave( f5c, f4c, f3c, f2c, f1c, mvpClip, b1c, b2c, b3c, b4c, b5c )
\ : (radius==4) ? interleave( f4c, f3c, f2c, f1c, mvpClip, b1c, b2c, b3c, b4c )
\ : (radius==3) ? interleave( f3c, f2c, f1c, mvpClip, b1c, b2c, b3c )
\ : (radius==2) ? interleave( f2c, f1c, mvpClip, b1c, b2c )
\ : (radius==1) ? interleave( f1c, mvpClip, b1c )
\ : mvpClip
last = c
### Luma adaptive factor
global AdaptLuma = (Luma_Cpst==0) ? "1"
\ : "( ( ( vAverageLuma > 160 ) ? Pow( ( 256.0 - vAverageLuma ) / 96, "+String(Luma_Cpst)+" ) : Log( ( 256.0 - vAverageLuma ) / 96 ) * "+String(Luma_Cpst)+" + 1 ) / "+String(Luma_Cpst)+" / 2 + 1 )"
global CRGB32Clip = CRGB32
global CRGB32Clip = CRGB32Clip.ShowBlue("YV12").Overlay(CRGB32Clip.ShowRed("YV12"), mode="subtract")
### Blue compensate value
global AdaptBlue = """( AverageLuma( CRGB32Clip ) / 96.0 * """+String(Blue_Cpst)+" )"
### Fade compensate value
global FadeDenom = ( radius==0 ) ? 1 : 384.0 * radius
global cLoop1 = (radius>=2)? loop(2,0,-1) : nop
global cLoop2 = (radius>=2)? loop(0,0,-1) : nop
global cLoop3 = (radius>=3)? loop(3,0,-1) : nop
global cLoop4 = (radius>=3)? loop(0,0,1) : nop
global cLoop5 = (radius>=4)? loop(4,0,-1) : nop
global cLoop6 = (radius>=4)? loop(0,0,2) : nop
global cLoop7 = (radius>=5)? loop(5,0,-1) : nop
global cLoop8 = (radius>=5)? loop(0,0,3) : nop
global cLoop9 = (radius>=6)? loop(6,0,-1) : nop
global cLoop10 = (radius>=6)? loop(0,0,4) : nop
global AdaptFade = (Fade_Cpst==0) ? "0"
\ : (radius==1) ? "( log( (YDifferenceFromPrevious+YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==2) ? "( log( (cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==3) ? "( log( (cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==4) ? "( log( (cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==5) ? "( log( (cLoop7.YDifferenceFromPrevious+cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext+cLoop8.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : (radius==6) ? "( log( (cLoop9.YDifferenceFromPrevious+cLoop7.YDifferenceFromPrevious+cLoop5.YDifferenceFromPrevious+cLoop3.YDifferenceFromPrevious+cLoop1.YDifferenceFromPrevious+YDifferenceFromPrevious+YDifferenceToNext+cLoop2.YDifferenceToNext+cLoop4.YDifferenceToNext+cLoop6.YDifferenceToNext+cLoop8.YDifferenceToNext+cLoop10.YDifferenceToNext)/"+String(FadeDenom)+"+1 ) * "+String(Fade_Cpst)+" )"
\ : "0"
global rgclip = RemoveGrain(24, 0, 0)
### Calculate complexity of a frame
global c_Complex = "Exp( LumaDifference( rgclip ) + 1 )"
### Fading frames should have comparatively low luma value and low complexity
global AdaptFade = "Exp( vAdaptLuma * 7 ) / 200 * " + AdaptFade + " / vc_Complex"
### Mix all factors and calculate final factor of strength
global strFact = "( vAdaptLuma * ( 1 + vAdaptFade ) * ( 1 + vAdaptBlue ) )"
global eClip = last
last = (radius==6) ? i.SelectEvery(1,0,0,0,0,0,0,0,0,0,0,0,0,0)
\ : (radius==5) ? i.SelectEvery(1, 0,0,0,0,0,0,0,0,0,0,0 )
\ : (radius==4) ? i.SelectEvery(1, 0,0,0,0,0,0,0,0,0 )
\ : (radius==3) ? i.SelectEvery(1, 0,0,0,0,0,0,0 )
\ : (radius==2) ? i.SelectEvery(1, 0,0,0,0,0 )
\ : (radius==1) ? i.SelectEvery(1, 0,0,0 )
\ : i
global f3kdb_eval = "f3kdb( Y=int("+String(Y)+"*f3kdb_rfact"+
\ "), Cb=int("+String(Cb)+"*f3kdb_rfact"+
\ "), Cr=int("+String(Cr)+"*f3kdb_rfact"+
\ "), ditherY=int("+String(ditherY)+"*f3kdb_rfact"+
\ "), ditherC=int("+String(ditherC)+"*f3kdb_rfact)"+
\ ( Defined(f3k_param) ? ", "+f3k_param+" )"
\ : " )" ) +
\ ( Info ? """.Subtitle("Real Final factor: "+String(f3kdb_rfact), x = 8, y = 28)""" : "")
global f3kdb_rfact = 1.00
global f3kdb1 = Eval(f3kdb_eval)
global f3kdb_rfact = 1.33
global f3kdb2 = Eval(f3kdb_eval)
global f3kdb_rfact = 1.66
global f3kdb3 = Eval(f3kdb_eval)
global f3kdb_rfact = 2.00
global f3kdb4 = Eval(f3kdb_eval)
global f3kdb_rfact = 2.33
global f3kdb5 = Eval(f3kdb_eval)
global f3kdb_rfact = 2.66
global f3kdb6 = Eval(f3kdb_eval)
global f3kdb_rfact = 3.00
global f3kdb7 = Eval(f3kdb_eval)
sClip = BlankClip(f3kdb1)
global f3kdb_eval2 = "eClip" + chr(13)
\ + "vAverageLuma = AverageLuma" + chr(13)
\ + "vAdaptLuma = Eval(AdaptLuma)" + chr(13)
\ + "vAdaptBlue = Eval(AdaptBlue)" + chr(13)
\ + "vc_Complex = Eval(c_Complex)" + chr(13)
\ + "vAdaptFade = Eval(AdaptFade)" + chr(13)
\ + "vStrFact = Eval(strFact)" + chr(13)
\ + "f3kdbRet = (vStrFact < 1.166) ? f3kdb1:"
\ + "(vStrFact < 1.500) ? f3kdb2:"
\ + "(vStrFact < 1.833) ? f3kdb3:"
\ + "(vStrFact < 2.166) ? f3kdb4:"
\ + "(vStrFact < 2.500) ? f3kdb5:"
\ + "(vStrFact < 2.833) ? f3kdb6:"
\ + "f3kdb7"
Info ? ScriptClip(sClip, f3kdb_eval2+chr(13)+"""f3kdbRet.Subtitle( "Final factor: "+String( vstrFact ), x=8, y=8 ).Subtitle( "Luma adaptive factor: "+String( vAdaptLuma ), x=8, y=58 ).Subtitle( "Fade adaptive factor: "+String( 1+vAdaptFade ), x=8, y=78 ).Subtitle( "Blue adaptive factor: "+String( 1+vAdaptBlue ), x=8, y=98 ).Subtitle( "Frame complexity: "+String( vc_Complex ), x=8, y=128 )""" )
\ :ScriptClip(sClip, f3kdb_eval2+chr(13)+"""f3kdbRet""")
return SelectEvery( 1 + radius * 2, radius)
}
### Fixed ConvertToRGB32 ###
function CRGB32(clip c, string "matrix", bool "interlaced") {
matrix = ( c.width>1024 || c.height>576 ) ? Default(matrix, "Rec709") : Default(matrix, "Rec601")
interlaced = Default(interlaced, false)
return
\ c.IsRGB32 ? c :
\ c.IsRGB ? c.ConvertToRGB32(interlaced=interlaced) :
\ c.ConvertToRGB32(interlaced=interlaced, matrix=matrix)
}