4evrplan
3rd September 2008, 19:50
I'm trying to repair dropped frames in a capture (telecined source) by using MVFowInter (of the MVTools plugin) to recreate them from the frames immediately before and after them. The example in the docs is a great resource but doesn't work as is because I have multiple bad frames in a row, not just one at a time. I've created a function to make this easier, but the generated frames have jagged egdes, even in areas where there is no motion. The image below is from frame 19230 and 19231, where the former is a good frame, and the latter is an interpolated frame.
http://farm4.static.flickr.com/3228/2824901267_95c2dc0d3c_o.jpg
The top left is part of the good frame. The top right is from the generated frame immediately after the good one. On the bottom are 4x zooms of a part of the other two.
Also, notice that the interpolated frame is shifted down slightly from the original. The other reference frame used to create the interpolated frame (the one immediately after the range of bad frames) is in the same position as the first reference frame. Does anyone know what may be causing these two problems? My script is below.
AVISource("Capture.avi")
AssumeTFF()
SeparateFields()
even=SelectEven()
even=even.InterFrames(19231,19236)
even=even.InterFrames(45354,45355)
even=even.InterFrames(119262,119266)
even=even.InterFrames(159668,159672)
odd=SelectOdd()
odd=odd.InterFrames(19231,19236)
odd=odd.InterFrames(45354,45355)
odd=odd.InterFrames(119262,119266)
odd=odd.InterFrames(159668,159672)
Interleave(even,odd)
Weave()
function InterFramesSub(clip c, float interTime, float interDelta, backward_vectors, forward_vectors)
{
return (interTime >= 99.99)
\ ? BlankClip(c, 0)
\ : c.MVFlowInter(backward_vectors, forward_vectors, time=interTime, ml=255, idx=1).Trim(0,-1)
\ ++ InterFramesSub(c, interTime+interDelta, interDelta, backward_vectors, forward_vectors)
}
function InterFrames(clip c, int begFrame, int endFrame)
{
c2 = c.Trim(begFrame-1,-1) ++ c.Trim(endFrame+1,-1)
backward_vectors = c2.MVAnalyse(isb=true, truemotion=true, pel=4, delta=1, idx=1)
forward_vectors = c2.MVAnalyse(isb=false, truemotion=true, pel=4, delta=1, idx=1)
interDelta = 100.0 / (endFrame - begFrame + 2.0)
interTime = interDelta
return (begFrame-1 == 0) ? c.Trim(0,-1) : c.Trim(0,begFrame-1)
\ ++ InterFramesSub(c2, interTime, interDelta, backward_vectors, forward_vectors)
\ ++ c.Trim(endFrame+1,0)
}
http://farm4.static.flickr.com/3228/2824901267_95c2dc0d3c_o.jpg
The top left is part of the good frame. The top right is from the generated frame immediately after the good one. On the bottom are 4x zooms of a part of the other two.
Also, notice that the interpolated frame is shifted down slightly from the original. The other reference frame used to create the interpolated frame (the one immediately after the range of bad frames) is in the same position as the first reference frame. Does anyone know what may be causing these two problems? My script is below.
AVISource("Capture.avi")
AssumeTFF()
SeparateFields()
even=SelectEven()
even=even.InterFrames(19231,19236)
even=even.InterFrames(45354,45355)
even=even.InterFrames(119262,119266)
even=even.InterFrames(159668,159672)
odd=SelectOdd()
odd=odd.InterFrames(19231,19236)
odd=odd.InterFrames(45354,45355)
odd=odd.InterFrames(119262,119266)
odd=odd.InterFrames(159668,159672)
Interleave(even,odd)
Weave()
function InterFramesSub(clip c, float interTime, float interDelta, backward_vectors, forward_vectors)
{
return (interTime >= 99.99)
\ ? BlankClip(c, 0)
\ : c.MVFlowInter(backward_vectors, forward_vectors, time=interTime, ml=255, idx=1).Trim(0,-1)
\ ++ InterFramesSub(c, interTime+interDelta, interDelta, backward_vectors, forward_vectors)
}
function InterFrames(clip c, int begFrame, int endFrame)
{
c2 = c.Trim(begFrame-1,-1) ++ c.Trim(endFrame+1,-1)
backward_vectors = c2.MVAnalyse(isb=true, truemotion=true, pel=4, delta=1, idx=1)
forward_vectors = c2.MVAnalyse(isb=false, truemotion=true, pel=4, delta=1, idx=1)
interDelta = 100.0 / (endFrame - begFrame + 2.0)
interTime = interDelta
return (begFrame-1 == 0) ? c.Trim(0,-1) : c.Trim(0,begFrame-1)
\ ++ InterFramesSub(c2, interTime, interDelta, backward_vectors, forward_vectors)
\ ++ c.Trim(endFrame+1,0)
}