Posts: 13.199
Threads: 73
Joined: May 2017
Will look at it when I'm back home.
Cu
Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Posts: 10
Threads: 1
Joined: Sep 2026
Really appreciate all your help.
Posts: 10
Threads: 1
Joined: Sep 2026
(Yesterday, 04:11)Selur Wrote: What happens if you tell Hybrid, that your source is tff instead of progressive?
(Filtering->(De-)Interlace/Telecine->Overwrite input scan type to->top field first)
I can look at it after work this evening. (Preparing to go to work atm.)
A sample where the horizontal movement of objects isn't mainly in the dark would be better.
Cu Selur
The figures still look ghostly, and it added some extra flashes about in the middle to slight below middle of the screen, which were not there before.
Posts: 13.199
Threads: 73
Joined: May 2017
Okay, the source seems to be field-shifted not interlaced. (so a field matcher like tfm or vfm should be used)
Also, this probably needs some custom scripting.

I'm looking at it to see whether I can come up with something, but no promisses.
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Posts: 13.199
Threads: 73
Joined: May 2017
Yesterday, 20:38
(This post was last modified: Yesterday, 20:41 by Selur.)
Try the following:
- Load your clip into Hybrid
- set "Filtering->(De-)Interlace/Telecine->Overwrite input scan type to" to "field-shifted"
- switch to the Filtering->Vapoursynth tab, press "Show Vapoursynth script view" to see the generated script
It should contain
clip = core.tivtc.TFM(clip, mChroma=False)
- enable "Compare view" and "Synth auto refresh"
- switch to the Filtering->Vapoursynth->Custom tab, select "Grayworld" check the checkbox and enter:
core.std.LoadPlugin(path="%FILTERPATH%/../Vapoursynth/Lib/site-packages/vapoursynth/plugins2/akarin/libakarin.dll")
def set_interp_flag(n, f):
f = f.copy()
mics = f.props.get("TFMMics")
use = (mics is not None and len(mics) >= 3
and (mics[0] == 256 or mics[1] == 256))
f.props._UseInterp = 1 if use else 0
return f
# Keep this clip purely as a prop source for _UseInterp.
flagged = core.std.ModifyFrame(clip, clip, set_interp_flag)
clip = flagged
MAX_RUN = 8 # bigger than the longest run you actually expect
for _ in range(MAX_RUN):
prev = core.std.BlankClip(clip, length=1) + \
core.std.Trim(clip, 0, clip.num_frames - 2)
clip = core.akarin.Select([clip, prev], flagged, "x._UseInterp 1 0 ?")
- enable Filtering->Vapoursynth->Denoise->QTGMC
Now open the "Vapoursynth Preview" and check the preview, if it worked.
(the full script I used:
https://pastebin.com/qtGMck0Z ; you can compare it to your Vapoursynth Script View)
Here's the clip I got as output for segment3.
It probably should also take scene changes into account, but I really like the result.
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Posts: 10
Threads: 1
Joined: Sep 2026
Hi Cu Selur,
I just had a look at the clip. First 24 seconds looks really good, but then at 25 seconds onwards it stutters here and there and it flashes.
Posts: 13.199
Threads: 73
Joined: May 2017
Yeah, not perfect; the scene changes are the problematic part.
Will look at it some more tomorrow, and think about on how scene changes need to be considered.

(got 13hr work days atm., so not much time to tinker with it)
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Posts: 10
Threads: 1
Joined: Sep 2026
Really appreciate your efforts. Thanks so far.
Posts: 13.199
Threads: 73
Joined: May 2017
try:
clip = core.std.PlaneStats(clip, plane=0)
def set_interp_flag(n, f):
f = f.copy()
mics = f.props.get("TFMMics")
use = (
mics is not None
and len(mics) >= 4
and (mics[4] < 256 or f.props.get("PlaneStatsMax") > 250)
and (mics[0] == 256 or mics[1] == 256 or (mics[3] == 256)
and (f.props.get("PlaneStatsMax") > 236))
)
f.props["_UseInterp"] = 1 if use else 0
return f
flagged = core.std.ModifyFrame(clip, clip, set_interp_flag)
clip = flagged
import filldrops
clip = filldrops.ReplaceFlagged(flagged,method="mv")
seems somewhat better, but still not 'perfect'.
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.