In this zip file there are 2 versions, one done with avisynth "rx.mp4", and another with motion tracking guided replace "tracking.mp4" . No other filtering, just replacing
https://www.mediafire.com/?c53a9afmpticcl5
"rx" is a function I wrote a long time ago (with big help from gavino) for replacing frames using adjacent "good" frames . You write the frame number, and the number of frames to replace. For example (10,2) would replace frames 10,11 using frames 9 and 12 as guidance
If you look critically at the 2 examples, you will notice the avisynth version has a bit of slight "wobbling" or "warping" in the repaired frames . You might be able to fix by playing with blocksize or other mvtools2 settings.
The motion tracked repair is more "stable" , but motion tracked repairs are only suitable for some types of scenes. If there was other types of motion, more foreground object movement etc... you might have to resort to other types of approaches.
Global filtering (e.g. QTMGC) on all frames is a last resort IMO, because you damage all the frames. But on the other hand , it's "easier" and faster. Or another approach is you could replace select frames with QTMGC (or other filtered) . e.g. using clipclop or replaceframes functions
Code:
MPEG2Source("VTS_02_1.demuxed.d2v", cpu=0)
rx(175,3)
rx(187,1)
rx(196,1)
rx(198,3)
rx(203,1)
rx(206,4)
rx(211,2)
rx(215,1)
rx(218,1)
rx(221,1)
rx(223,1)
function RX(clip Source, int N, int X)
{
# N is number of the 1st frame in Source that needs replacing.
# X is total number of frames to replace
#e.g. RX(101, 5) would replace 101,102,103,104,105 , by using 100 and 106 as reference points for mflowfps interpolation
start=Source.trim(N-1,-1) #one good frame before, used for interpolation reference point
end=Source.trim(N+X,-1) #one good frame after, used for interpolation reference point
start+end
AssumeFPS(1) #temporarily FPS=1 to use mflowfps
super = MSuper()
backward_vec = MAnalyse(super, isb = true)
forward_vec = MAnalyse(super, isb = false)
MFlowFps(super, backward_vec, forward_vec, blend=false, num=X+1, den=1) #num=X+1
AssumeFPS(FrameRate(Source)) #return back to normal source framerate for joining
Trim(1, framecount-1) #trim ends, leaving replacement frames
Source.trim(0,-N) ++ last ++ Source.trim(N+X+1,0)
}