Here's a recording of
cpadolf's SNES Super Metroid "any%, glitched", with some edits to keep the file size below 200 MB. Encoded with ZMBV (included with DOSBox & ffdshow), no audio:
http://www.mediafire.com/?n4q7bs4nd3d1spw
I think nanogyth's algorithm shows the best results:
AVISource("#2223 - cpadolf's SNES Super Metroid ''any%, glitched''.avi").ConvertToRGB32
v1 = TASBlend .PointResize(512, 448)
v2 = PointResize(512, 448).ConvertToYUY2.TASBlend_nanogyth.ConvertToRGB32
v3 = TASBlend_Vit.PointResize(512, 448)
StackHorizontal(v1.Subtitle("TASBlend" ),
\ v2.Subtitle("TASBlend_nanogyth"),
\ v3.Subtitle("TASBlend_Vit" ))
function TASBlend_nanogyth(clip c) {
c
Assert(!IsRGB, "TASBlend_nanogyth: clip cannot be RGB")
Interleave(SelectEven.dbz.SelectEvery(4, 0),
\ SelectOdd .dbz.SelectEvery(4, 1))
}
function dbz(clip c) {
super = c.MSuper(pel=2)
backward_vec = MAnalyse(super, isb=true)
forward_vec = MAnalyse(super, isb=false)
MFlowFps(c, super, backward_vec, forward_vec, num=60, den=1, ml=100)
}
function TASBlend_Vit(clip c, float "ratio") {
# reduces framerate to 1/2 but leaves flicker effects partly visible
# blends frame pairs with alternating opacity (default is 2/3 + 1/3;1/3 + 2/3)
# optional "ratio" is the opacity of the first frame out of the four
ratio = default(ratio, 2.0/3)
opacity = round(ratio * 257)
# blend flicker to half-rate
c.SelectEvery(4, 1, 0, 2, 3)
blend = Layer(SelectEven, SelectOdd, level=opacity)
# determine flicker is a simplistic way - compare each pixel with the previous and next two frames
similar2 = 1 # how similar current pixel must be to the same pixel 2 frames forwards and backwards
different1 = 8 # how different current pixel must be from the same pixel 1 frame forwards and backwards
mask_f2 = Overlay(c, c.SelectEvery(1, 2), mode="difference", pc_range=true).Greyscale.Levels(128 + similar2 , 1.0, 129 + similar2 , 0, 255, false).Invert
mask_f1 = Overlay(c, c.SelectEvery(1, 1), mode="difference", pc_range=true).Greyscale.Levels(128 + different1, 1.0, 129 + different1, 0, 255, false)
mask_b1 = Overlay(c, c.SelectEvery(1,-1), mode="difference", pc_range=true).Greyscale.Levels(128 + different1, 1.0, 129 + different1, 0, 255, false)
mask_b2 = Overlay(c, c.SelectEvery(1,-2), mode="difference", pc_range=true).Greyscale.Levels(128 + similar2 , 1.0, 129 + similar2 , 0, 255, false).Invert
mask_f = Overlay(mask_f1, mask_f2, mode="multiply", pc_range=true)
mask_b = Overlay(mask_b1, mask_b2, mode="multiply", pc_range=true)
mask = Overlay(mask_f, mask_b, mode="multiply", pc_range=true).SelectEven
# only use blend where detected flicker
Layer(c.SelectEven, blend.mask(mask))
}