Selur's Little Message Board
My video - Printable Version

+- Selur's Little Message Board (https://forum.selur.net)
+-- Forum: Hybrid - Support (https://forum.selur.net/forum-1.html)
+--- Forum: Problems & Questions (https://forum.selur.net/forum-3.html)
+--- Thread: My video (/thread-4482.html)

Pages: 1 2 3


RE: My video - Selur - 14.09.2026

Will look at it when I'm back home.
Cu
Selur


RE: My video - Vhs-Digital-Buddy - 14.09.2026

Really appreciate all your help.


RE: My video - Vhs-Digital-Buddy - 14.09.2026

(14.09.2026, 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.


RE: My video - Selur - 14.09.2026

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. Sad
I'm looking at it to see whether I can come up with something, but no promisses.

Cu Selur


RE: My video - Selur - 14.09.2026

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


RE: My video - Vhs-Digital-Buddy - 14.09.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.


RE: My video - Selur - 14.09.2026

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. Smile
(got 13hr work days atm., so not much time to tinker with it)

Cu Selur


RE: My video - Vhs-Digital-Buddy - 14.09.2026

Really appreciate your efforts. Thanks so far.


RE: My video - Selur - 15.09.2026

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


RE: My video - Selur - 15.09.2026

Just looking at the average luma compared to the neighbors
# Separate branch used only to calculate properties. stats = core.std.PlaneStats(clip, plane=0) def set_interp_flag(n, f): f = f.copy() use = False if 0 < n < clip.num_frames - 1: cur = f.props["PlaneStatsAverage"] prev = stats.get_frame(n - 1).props["PlaneStatsAverage"] nxt = stats.get_frame(n + 1).props["PlaneStatsAverage"] use = cur > prev and cur > nxt f.props["_UseInterp"] = int(use) return f # Input = original frames, prop source = stats flagged = core.std.ModifyFrame(clip, stats, set_interp_flag) org = flagged import filldrops clip = filldrops.ReplaceFlagged(flagged, method="mv")
seems to work better.
clip3

Cu Selur