Advertisement
Seedmanc

bssim attempt

Feb 2nd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Avisynth 10.67 KB | None | 0 0
  1. # video file https://mega.nz/#!R9x2SKQI!t8S1SX5DghZ-r-L83cJXnJvncd6gnnPQEFVivr06skg
  2.  
  3. TEST_FRAMES = 10
  4. MIDDLE_FRAME = 4
  5.  
  6. # original framerate
  7. FPS_NUM = 30
  8. FPS_DEN = 1
  9.  
  10. # source clip
  11.   FFmpegSource2("f:\avsoptim\24-1200.mkv"  )  .selecteven
  12. AssumeFPS(FPS_NUM, FPS_DEN)
  13.  
  14. #return last
  15.  
  16. orig = last
  17.  
  18. mt=true
  19.  
  20. super_pel = 4               # optimize super_pel = _n_ | 1,2,4 ; min:super_sharp 0 > 2 1 ? | super_pel
  21. super_sharp = 1             # optimize super_sharp = _n_ | 0..2 ; max:super_pel 1 > 2 0 ? | super_sharp
  22. super_rfilter = 3               # optimize super_rfilter = _n_ | 0..4 | super_rfilter      
  23.  
  24. blockSize = 24              # optimize blockSize = _n_ | 4,6,8,12,16,24,32,48,64 ; min:divide 0 > 8 2 ? ; max: dct 1 == 24 64 ? ; filter:overlap 2 * x <= | blockSize
  25. searchAlgo = 4              # optimize searchAlgo = _n_ | 0..5 D | searchAlgo
  26. searchRange = 12                # optimize searchRange = _n_ | 1..30 | searchRange
  27. searchRangeFinest = 40          # optimize searchRangeFinest = _n_ | 1..40 | searchRangeFinest
  28. divide=2                    # optimize divide=_n_ | 0..2 D ; max:blockSize 8 >= 2 0 ? overlap 4 % 0 == 2 0 ? min | divide
  29. overlap=12                      # optimize overlap=_n_ | 0,2,4,6,8,12,16,20,24,28,32 ; max:blockSize 2 / ; filter:x divide 0 > 4 2 ? % 0 == | overlap
  30. truemotion = false          # optimize truemotion = _n_ | false,true | truemotion
  31. badSAD = 5689               # optimize badSAD = _n_ | 4..16320 | badSAD
  32. badRange = 4                # optimize badRange = _n_ | 2..50 | badRange
  33. negBadRange = false         # optimize negBadRange = _n_ | false,true | negBadRange
  34. meander = true              # optimize meander = _n_ | false,true | meander
  35. trymany = false             # optimize trymany = _n_ | false,true | trymany
  36. dct = 10                    # optimize dct = _n_ | 0,1,2,3,4,5,6,7,8,9,10 D ; filter:blockSize 24 > 1 -1 ? x != | dct
  37. scaleCSAD = 1               # optimize scaleCSAD = _n_ | -2..2 | scaleCSAD
  38.  
  39. delta = 1
  40. useChroma = true
  41.  
  42. super_render = MSuper(pel=super_pel, sharp=super_sharp, rfilter=super_rfilter, orig, mt=mt, hpad=blockSize, vpad=blockSize )
  43. resultBadRange = (negBadRange ? -1 : 1)*badRange
  44. bv = MAnalyse(super_render, isb = true, blksize=blockSize, search=searchAlgo, searchparam=searchRange, pelsearch=searchRangeFinest,
  45. \ chroma=useChroma, delta=delta, truemotion=truemotion, overlap=overlap , scaleCSAD=scaleCSAD,
  46. \ divide=divide, badSAD=badSAD, badrange=resultBadRange , meander=meander,   trymany=trymany, dct=dct, mt=mt)
  47. fv = MAnalyse(super_render, isb = false, blksize=blockSize, search=searchAlgo, searchparam=searchRange, pelsearch=searchRangeFinest,
  48. \ chroma=useChroma, delta=delta, truemotion=truemotion,  overlap=overlap , scaleCSAD=scaleCSAD,
  49. \ divide=divide, badSAD=badSAD, badrange=resultBadRange , meander=meander,    trymany=trymany, dct=dct, mt=mt)
  50.    
  51. threshold = 16320
  52. maskScale = 249                 # optimize maskScale = _n_ | 1..300 | maskScale
  53. mask = 2                    # optimize mask = _n_ | 0,1,2 D | mask
  54. inter = orig.MFlowFPS(super_render, bv, fv, num=FPS_NUM*2, den=FPS_DEN, mask=mask, ml=maskScale, thSCD1=threshold )
  55.  
  56.  
  57. Clevel = 8/10.0              # optimize Clevel = _n_/10.0 | 0..10 ; min:super_pel2 1 > 2 0 ? super_sharp2 0 > 2 0 ? super_rfilter2 0 > 2 0 ? blockSize2 4 > 2 0 ? searchAlgo2 0 > 2 0 ? searchRange2 1 > 2 0 ? searchRangeFinest2 1 > 2 0 ? divide2 0 > 2 0 ? overlap2 0 > 2 0 ? CdoRecalc true == 2 0 ? truemotion2 true == 2 0 ? max max max max max max max max max max | Clevel
  58.  
  59.  dct2 0 > 2 0 ? scaleCSAD2 -2 > 2 0 ?
  60.  
  61. super_pel2 = 4              # optimize super_pel2 = _n_ | 1,2,4 ; min:super_sharp2 0 > 2 1 ? ; max:Clevel 1 > 4 1 ? | super_pel2
  62. super_sharp2 = 0                # optimize super_sharp2 = _n_ | 0..2 ; max:super_pel2 1 > 2 0 ? Clevel 1 > 2 0 ? min | super_sharp2
  63. super_rfilter2 = 4              # optimize super_rfilter2 = _n_ | 0..4 ; max:Clevel 1 > 4 1 ? | super_rfilter2     
  64.  
  65. blockSize2 = 16             # optimize blockSize2 = _n_ | 4,6,8,12,16,24,32,48,64 ; min:divide2 0 > 8 2 ? ; max: dct2 1 == 24 64 ? Clevel 1 > 64 4 ? min; filter:overlap2 2 * x <= | blockSize2
  66. searchAlgo2 = 0             # optimize searchAlgo2 = _n_ | 0..5 D ; max:Clevel 1 > 5 0 ? | searchAlgo2
  67. searchRange2 = 2                # optimize searchRange2 = _n_ | 1..30 ; max:Clevel 1 > 30 1 ? | searchRange2
  68. searchRangeFinest2 = 31         # optimize searchRangeFinest2 = _n_ | 1..40 ; max:Clevel 1 > 40 1 ? | searchRangeFinest2
  69. divide2=0                   # optimize divide2=_n_ | 0..2 D ; max:blockSize2 8 >= 2 0 ? overlap2 4 % 0 == 2 0 ? Clevel 1 > 2 0 ? min | divide2
  70. overlap2=8                      # optimize overlap2=_n_ | 0,2,4,6,8,12,16,20,24,28,32 ; max:blockSize2 2 / Clevel 1 > 32 0 ? min ; filter:x divide2 0 > 4 2 ? % 0 == | overlap2
  71. truemotion2 = true          # optimize truemotion2 = _n_ | false,true ; filter:Clevel 1 > x false == or | truemotion2
  72. badSAD2 = 16169             # optimize badSAD2 = _n_ | 4..16320 ; max:Clevel 1 > 16320 4 ? | badSAD2
  73. badRange2 = 17              # optimize badRange2 = _n_ | 2..50 ; max:Clevel 1 > 50 2 ? | badRange2
  74. negBadRange2 = true         # optimize negBadRange2 = _n_ | false,true ; filter:Clevel 1 > x false == or | negBadRange2
  75. meander2 = false                # optimize meander2 = _n_ | false,true ; filter:Clevel 1 > x false == or | meander2
  76. trymany2 = false                # optimize trymany2 = _n_ | false,true ; filter:Clevel 1 > x false == or | trymany2
  77. dct2 = 9                    # optimize dct2 = _n_ | 0,1,2,3,4,5,6,7,8,9,10 D ; filter:blockSize2 24 > 1 -1 ? x != ; max:Clevel 1 > 10 0 ? | dct2
  78. scaleCSAD2 = 1              # optimize scaleCSAD2 = _n_ | -2..2 ; max:Clevel 1 > 2 -2 ? | scaleCSAD2
  79.  
  80.  super_render2 = MSuper(pel=super_pel2, sharp=super_sharp2, rfilter=super_rfilter2, inter, mt=mt, hpad=blockSize2, vpad=blockSize2 )
  81. resultBadRange2 = (negBadRange2 ? -1 : 1)*badRange2
  82. bv2 = MAnalyse(super_render2, isb = true, blksize=blockSize2, search=searchAlgo2, searchparam=searchRange2, pelsearch=searchRangeFinest2,
  83. \ chroma=true,   truemotion=truemotion2, overlap=overlap2 , scaleCSAD=scaleCSAD2,
  84. \ divide=divide2, badSAD=badSAD2, badrange=resultBadRange2 , meander=meander2, trymany=trymany2, dct=dct2, mt=mt)
  85. fv2 = MAnalyse(super_render2, isb = false, blksize=blockSize2, search=searchAlgo2, searchparam=searchRange2, pelsearch=searchRangeFinest2,
  86. \ chroma=true,   truemotion=truemotion2,  overlap=overlap2 , scaleCSAD=scaleCSAD2,
  87. \ divide=divide2, badSAD=badSAD2, badrange=resultBadRange2 , meander=meander2,   trymany=trymany2, dct=dct2, mt=mt)
  88.  
  89. CdoRecalc=true      # optimize CdoRecalc=_n_ | false,true ; filter:Clevel 1 > Csmooth 0 > CRsearchAlgo 0 > CRsearchRange 1 > CRdivide 0 > CRoverlap 0 > Cthsad 0 > CRtruemotion true == CRmeander true == x false == or or or or or or or or | CdoRecalc
  90.  
  91. Csmooth=1           # optimize Csmooth=_n_ | 0,1 ; max:CdoRecalc 1 0 ? | Csmooth
  92. CRblockSize = 16    # optimize CRblockSize = _n_ | 4,6,8,12,16,24,32,48,64 ; min:CRdivide 0 > 8 2 ? ; max:CRdct 1 == 24 64 ? CdoRecalc 64 4 ? min ; filter:CRoverlap 2 * x <= | CRblockSize
  93. CRsearchAlgo = 5    # optimize CRsearchAlgo = _n_ | 0..5 D ; max:CdoRecalc 5 0 ? | CRsearchAlgo
  94. CRsearchRange = 4   # optimize CRsearchRange = _n_ | 1..30 ; max:CdoRecalc 30 1 ? | CRsearchRange
  95. CRdivide=2          # optimize CRdivide=_n_ | 0..2 D ; max:CRblockSize 8 >= 2 0 ? CRoverlap 4 % 0 == 2 0 ? CdoRecalc 2 0 ? min | CRdivide
  96. CRoverlap=8         # optimize CRoverlap=_n_ | 0,2,4,8,12,16,20,24,28,32 ; max:CRblockSize 2 / CdoRecalc 32 0 ? min ; filter:x CRdivide 0 > 4 2 ? % 0 == | CRoverlap
  97. CRdct = 10          # optimize CRdct = _n_ | 0,1,2,3,4,5,6,7,8,9,10 D ; max:CdoRecalc 10 0 ? ; filter:CRblockSize 24 > 1 -1 ? x != | CRdct
  98. CRtruemotion = false # optimize CRtruemotion = _n_ | false,true ; filter:CdoRecalc x false == or | CRtruemotion
  99. CRmeander = true    # optimize CRmeander = _n_ | false,true ; filter:CdoRecalc x false == or | CRmeander
  100. CRscaleCSAD = 1     # optimize CRscaleCSAD = _n_ | -2..2 ; max:CdoRecalc 2 -2 ? | CRscaleCSAD
  101. Cthsad = 1500       # optimize Cthsad = _n_ | 0..16320 ; max:CdoRecalc 16320 0 ? | Cthsad
  102.  
  103. bv2 = CdoRecalc && (Clevel > 0.1) ? MRecalculate(super_render2, bv2, thsad=Cthsad, smooth=Csmooth, blksize=CRblockSize, search=CRsearchAlgo, searchparam=CRsearchRange, truemotion=CRtruemotion, overlap=CRoverlap, dct=CRdct, divide=CRdivide, meander=CRmeander, scaleCSAD=CRscaleCSAD, mt=mt) : bv2
  104. fv2 = CdoRecalc && (Clevel > 0.1) ? MRecalculate(super_render2, fv2, thsad=Cthsad, smooth=Csmooth, blksize=CRblockSize, search=CRsearchAlgo, searchparam=CRsearchRange, truemotion=CRtruemotion, overlap=CRoverlap, dct=CRdct, divide=CRdivide, meander=CRmeander, scaleCSAD=CRscaleCSAD, mt=mt) : fv2
  105.  
  106.  
  107. merged =  overlay(inter.MCompensate(super_render2, bv2,    thSCD1=threshold,mt=mt ), inter.MCompensate(super_render2, fv2,       thSCD1=threshold,mt=mt ),opacity=0.5)
  108. inter2 = inter.overlay(merged, opacity=Clevel)
  109.  
  110. inter = Clevel > 0 ? inter2 : inter
  111.  
  112. fps_only = inter.SelectOdd()
  113.  
  114.  
  115. delimiter = "; "
  116.  
  117. inter_yv12 = fps_only  .trim(1,0)
  118. orig_yv12 = FFmpegSource2("f:\avsoptim\24-1200.mkv"  )  .selectodd
  119.  
  120. # for comparison original must be forwarded one frame
  121.  orig_yv12 = trim(orig_yv12,1,0)
  122.  
  123. #inter_yv12 = inter_yv12.Trim(MIDDLE_FRAME - TEST_FRAMES/2 + (TEST_FRAMES%2==0?1:0), MIDDLE_FRAME + TEST_FRAMES/2)
  124. orig_yv12 = orig_yv12.Trim(MIDDLE_FRAME - TEST_FRAMES/2 + (TEST_FRAMES%2==0?1:0), MIDDLE_FRAME + TEST_FRAMES/2)
  125. last = inter_yv12
  126.  
  127. global total = 0.0
  128. global ssim_total = 0.0
  129. global avstimer = 0.0
  130. frame_count = FrameCount()
  131.  #divisor = 1
  132. #scaled_orig = orig_yv12.bilinearresize(orig_yv12.width/divisor,orig_yv12.height/divisor)
  133. #scaled_inter = inter_yv12.bilinearresize( inter_yv12.width/divisor, inter_yv12.height/divisor)
  134.  
  135. blurred = orig_yv12.GaussianBlur(1.5)
  136.  
  137. scharr_orig = scharr(orig_yv12)
  138. scharr_blurred = scharr(blurred)
  139.  
  140. FrameEvaluate(last, """
  141.     #global ssim = SSIM_FRAME(scaled_orig, scaled_inter)
  142.     global ssim = SSIM_FRAME(orig_yv12, blurred)
  143.     global bssim = BSSIM_MOD(scharr_orig, scharr_blurred, ssim)
  144.     global ssim_total = ssim_total + (bssim == 1.0 ? 0.0 : bssim)  
  145.    
  146. """)
  147.  
  148. # NOTE: AvsTimer call should be before the WriteFile call
  149. AvsTimer(frames=1, type=0, total=false, name="Optimizer")
  150.  
  151. # per frame logging (ssim, time)
  152. resultFile = "f:\avsoptim\results\perFrameResults.txt"  # output out1="ssim: MAX(float)" out2="time: MIN(time) ms" file="f:\avsoptim\results\perFrameResults.txt"
  153. WriteFile(resultFile, "current_frame", "delimiter", "bssim", "delimiter", "avstimer")
  154. WriteFileIf(resultFile, "current_frame == frame_count-1", """ "stop " """, "ssim_total", append=true)
  155.  
  156. return last
  157.  
  158. function scharr(clip c) {
  159.     scharr_x = c.mt_edge("3 0 -3 10 0 -10 3 0 -3", thY1 = 0, thY2 = 255, y=3, u=1, v=1)
  160.     scharr_y = c.mt_edge("3 10 3 0 0 0 -3 -10 -3", thY1 = 0, thY2 = 255, y=3, u=1, v=1)
  161.     scharr = mt_lutxy(scharr_x, scharr_y, yexpr=mt_polish("((x*x)+(y*y))^0.5"), u=1, v=1)
  162.     return scharr
  163. }
  164.  
  165. function BSSIM_MOD(clip scharr_orig, clip scharr_alt, float ssim) {
  166.     stddev_orig = RT_YPlaneStdev(scharr_orig)
  167.     stddev_alt = RT_YPlaneStdev(scharr_alt)
  168.    
  169.     mul = (2*stddev_orig*stddev_alt) / (stddev_orig*stddev_orig + stddev_alt*stddev_alt)
  170.     return mul*ssim
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement