I have the best show in the world, Invader Zim, as a DVD box-set. Since I am not happy with the results of real-time deinterlacing of the DVD playback in MPC-HC and VLC, or on my TV from my PC through HDMI, I wanted to try my hand with encoding it all to the finest possible quality, deinterlaced, to put in my media library. This is also because the DVD box-set is shaped like a small house, and I'm afraid it'll break if I keep opening it.
I tried Handbrake. Did not get good results. You can see the test videos and my description of the results, in the Google Drive folder linked further down.
From these tests, I learned that I probably need to detelecine, in order to get the smoothest playback.
Then I read up on it quite a lot, and found a lot of helpful posts. But as I read on, I understood that the solution is often very specific to each DVD, due to encoding settings, NTSC/PAL, etc..
These readings led me to a program called MeGUI (v. 2808), which basically tries to wrap the usage of AviSynth. After tinkering a lot with it, and trying different settings, I'm just not happy with anything I can make it spit out. See the Google Drive folder linked further down, to see what I mean.
I've installed quite a few plugins, such as QTGMC and SRestore, as mentioned in this post. They do produce MUCH better results when it comes to deinterlacing/decombing, but I just can't get smooth playback at the same time.
I am really hoping some of you can help me. I have tried to supply you with all the information usually requested in threads like these.
General DVD information:
Top Field First
29.970 (30000/1001) fps
23.976 (24000/1001) fps OR WHATEVER IS RIGHT FOR PAL (not sure if this is needed, really. My computer screen is running 60Hz and my TV is running 200Hz, but I live in Europe where PAL is the standard, and 29.970 fps videos do not play smoothly on my TV).
I am not against frame doubling, if that helps. As long as my players will be able to play it back.
Link to Google Drive folder, which holds:
- a short sample of the original .VOB.
- a Mediainfo output for the original file, and also one for the sample.
- all the test sample videos, each with the AviSynth script and a description of the result, in a text file next to them.
Will I need to use pulldown? I've read that some NTSC DVDs need that.
Any help is GREATLY appreciated!
Sincerely, Ultroman the Tacoman
+ Reply to Thread
Results 1 to 17 of 17
Last edited by Ultroman; 10th Feb 2018 at 18:04.
Will 24 fps work on your TV withoput stuttering?
I used DGindex manually to create a d2v file and demux ac3 audio. (honor pulldown flags set)
and the following script, encoded in Ripbit264.
For a quick and dirty demo, I re-encoded the audio probably not necessary, you can mux it in after.
LoadPlugin("f:\yourpath\DGDecode.dll") LoadCPlugin("f:\yourpath\ffms2.dll") import("F:\yourpath\srestore.avs") Load_Stdcall_plugin("f:\yourpath\yadif.dll") Audio = directshowsource("F:\yourpath\SAMPLE T80 2_0ch 192Kbps DELAY -59ms.ac3",video=no) video=mpeg2source("F:\yourpath\SAMPLE.d2v") video=video.assumetff().yadif(mode=1) video=video.SRestore(24) Audio = Audio.DelayAudio(-0.059) audiodub(video,audio) #AssumeFPS(25, sync_audio=true).ResampleAudio(48000)
I would really appreciate any pointers, if you remember anything about your experience with the series. Is there anything in particular I should look at, when diving into AviSynth? Or is it "just" trudging through tutorials and playing around?
Nonetheless, I thank you very much for your time and effort!
As I expected. The last line of the script I commented out. If uncommented it will increase the fps to 25 and adjust the audio
But jagabo's result is more sophisticated and leaves the audio as-is
Mpeg2Source("SAMPLE.d2v", CPU2="xxxxxx", Info=3) # deblocking and deringing filters activated Interleave(TFM(field=1, pp=0), TFM(field=0, pp=0)) # double frame rate field matching to 59.94 fps vInverse() # eliminate some horizontal line artifacts # stop here for 60p #TDecimate(mode=2, rate=23.976) # back to 23.976 fps film frames # stop here for 24p #AssumeFPS(25) # speed up to 25 fps
I went with 60p partly because I live in the USA and all TVs are now 60p, and because some of the problems in the source left jerky shots when reduced to 24p. Using 60p meant that the encoded video wouldn't be any jerkier than the original DVD (especially during those odd cadence shots). I used interleaved TFMs as my base clip and substituted problematic frames with frames from other methods of deinterlacing and sometimes replacing individual bad frames with the frame before or the frame after. Each episode took many hours because I had to examine the video frame by frame. I used a few other filters to clean the video and upscale it. Here's a sample script:
Mpeg2Source("Invader Zim E2.d2v", CPU=6, Info=3) # deblocking and deringing AssumeTFF() qtg=QTGMC(preset="fast", sharpness=0.7) qtge=SelectEven(qtg) qtgo=SelectOdd(qtg) clean=Interleave(TFM(field=1,mode=1,pp=1),TFM(field=0,mode=1,pp=1)) deint=Interleave(TFM(field=1,mode=1,pp=5,cthresh=0,clip2=qtge),TFM(field=0,mode=1,pp=5,cthresh=0,clip2=qtgo)) Interleave(TFM(field=1,mode=1,pp=5,cthresh=12,clip2=qtge),TFM(field=0,mode=1,pp=5,cthresh=12,clip2=qtgo)) ReplaceFramesSimple(last, clean, Mappings="[44101 44393] [51312 51551]") ReplaceFramesSimple(last, deint, Mappings="[22238 22238] [22644 22644] [23423 23423] [26557 26557]") ReplaceFramesSimple(last, deint, Mappings="[26744 26744] [27323 27323] [27375 27375] [27390 27390]") ReplaceFramesSimple(last, deint, Mappings="[33505 33505]") ReplaceFramePrev(34115) ReplaceFramePrev(34141) ReplaceFrameNext(34156) ReplaceFrameNext(34209) ReplaceFramePrev(34894) ReplaceFrameNext(34921) ReplaceFrameNext(34947) ReplaceFramePrev(34962) ReplaceFramePrev(34973) ReplaceFramePrev(34988) ReplaceFramePrev(35001) ReplaceFrameNext(35014) ReplaceFrameNext(35027) ReplaceFramePrev(35042) ReplaceFrameNext(35053) ReplaceFramePrev(35068) ReplaceFramePrev(35094) ReplaceFramePrev(35112) ReplaceFramePrev(35138) ReplaceFrameNext(35165) ReplaceFramePrev(35206) ReplaceFrameNext(35217) ReplaceFrameNext(35232) ReplaceFrameNext(35245) ReplaceFrameNext(35258) ReplaceFrameNext(35271) ReplaceFramePrev(35286) ReplaceFramePrev(37062) ReplaceFrameNext(37063) ReplaceFramePrev(37088) ReplaceFrameNext(37089) ReplaceFramePrev(37093) ReplaceFrameNext(37094) ReplaceFrameNext(37098) ReplaceFrameNext(37097) ReplaceFramesSimple(last, deint, Mappings="[38884 38884] [38923 38923] [38964 38964]") ReplaceFramesSimple(last, deint, Mappings="[60554 60554]") UnDot() ColorMatrix(mode="Rec.601->Rec.709") MergeChroma(aWarpSharp2(depth=5),aWarpSharp2(depth=10)) TTempSmooth(maxr=2,strength=2) FastLineDarken(thinning=0) nnedi3_rpow2(2,cshift="Spline64Resize", fwidth=960, fheight=720) Sharpen(0.2) FastLineDarken(thinning=0) Dehalo_alpha(rx=2.0, ry=2.0) nnedi3_rpow2(2,cshift="Spline64Resize", fwidth=1440, fheight=1080) Sharpen(0.2) Toon(0.5)
That's some great stuff, jagabo. I'm kind of amazed at how good the upscaling looks using just nnedi3 and some sharpening.
Oh my GOD, jagabo. That's some dedication to a series right there! And a brilliant approach. From your naming and my albeit lacking understanding of the different filters and parameters, I get what you're doing.
First, to answer your question, it seems that there isn't much difference in your three video files. The 24p one has a tiny bit of lag each second, but that's it.
I spent all of yesterday playing around (still in MeGUI), and got to what I thought was just about acceptable, aside from a bunch of noise, which I just couldn't get rid of. I ended up with this:
mpeg2source("path\01 YG_VTS_02_1_1.d2v") tfm(d2v="path\01 YG_VTS_02_1_1.d2v") tdecimate(mode=1) Spline36Resize(656,480) Dehalo_alpha(darkstr=0.5,brightstr=0.5,rx=3,ry=3) Edgecleaner(strength=50) FFT3DFilter(bt=0, sigma=2.0, beta=1.35, kratio=1.5, wintype=1)
But the FFT3DFilter seems to group noise, rather than wash it out, though it seems to wash out thin lines (e.g. on the grey space station), which is a shame, and also why I set the beta parameter to let 35% noise through, so it wouldn't be too evident.
I also played for an hour or two with QTGMC, both with and without the deinterlacing part (after I found tfm and tdecimate, which seem to do a great job with that), but it seemed I could never get the right balance.
I also didn't like the results of the default settings of Deen(), and I didn't have time to go into detail with it. I also tried TBilateral, which is really good, but not for this project I think.
I'm going to try messing with the filters and process chain you've got going on in the larger script. You have been invaluable already. Thank you SO much for this!
I hadn't even considered upscaling, either. I thought "why mess with the source more than I have to", but what you showed in the first upscaled clip looks jawdroppingly good.
I also read up a lot on x264 encoding settings, and have been experimenting with those, as the initial results I was seeing, looked nothing like what I saw in MeGUI. It's pretty close now, but I must admit, some things might be turned up farther than they need to ^^
I will return when I've played around with the settings you've posted. Thanks again! This was much more than I could have hoped for
Last edited by Ultroman; 12th Feb 2018 at 14:12.
Man, I am learning SO much doing this!
I've been playing around with these AWESOME filters you've shown me, jagabo, and they have improved everything tremendously! I did tweak a bit, though. Most prominently, I disabled the luma deblocking on Mpeg2Source, because it just smudged the hell out of faint lines when the camera panned at slow to medium speed. More comments about changes in the script.
Mpeg2Source("path\01 YG_VTS_02_1_1.d2v", cpu2="ooxxxx") # No luma H/V deblocking (oo) / H/V chroma deblocking (xx) / luma and chroma deringing (xx) AssumeTFF() # Did tests using tfm/tdecimate, and tests with QTGMC. # tfm/tdecimate deinterlacing START #tfm(d2v="E:\Download\Invader Zim The Complete Box Set (2001-2003) DVD-9 NTSC Latino YG\DVD1 Rip\01 YG_VTS_02_1_1.d2v") #tdecimate(mode=1) # tfm/tdecimate deinterlacing END # QTGMC deinterlacing START qtg=QTGMC(preset="fast", sharpness=0.7) qtge=SelectEven(qtg) qtgo=SelectOdd(qtg) ##clean=Interleave(TFM(field=1,mode=1,pp=1),TFM(field=0,mode=1,pp=1)) ##deint=Interleave(TFM(field=1,mode=1,pp=5,cthresh=0,clip2=qtge),TFM(field=0,mode=1,pp=5,cthresh=0,clip2=qtgo)) Interleave(TFM(field=1,mode=1,pp=5,cthresh=12,clip2=qtge),TFM(field=0,mode=1,pp=5,cthresh=12,clip2=qtgo)) # QTGMC deinterlacing END UnDot() ColorMatrix(mode="Rec.601->Rec.709") FFT3DFilter(bt=0, sigma=2.0, beta=1.3, kratio=1.5, wintype=1) # kinda makes the noise stand still, so the image is less noisy MergeChroma(aWarpSharp2(depth=5),aWarpSharp2(depth=10)) # oh my God, where have you been all my life, MergeChroma? TTempSmooth(maxr=2,strength=2, LThresh=2, CThresh=5) Edgecleaner(strength=75) # removes some residual noise around edges, for a more cartooney feel FastLineDarkenMOD(thinning=0, strength=24) # kept the first line darkening (love this filter), but decreased strength to half, which is 24 # UPSCALING START nnedi3_rpow2(2,cshift="Spline64Resize", fwidth=960, fheight=720) Sharpen(0.2) #FastLineDarkenMOD(thinning=0, strength=24) # disabled the last extra darkening of lines, since there is already plenty to my taste Dehalo_alpha(rx=2.0, ry=2.0) nnedi3_rpow2(2,cshift="Spline64Resize", fwidth=1440, fheight=1080) Sharpen(0.2) # UPSCALING END Toon(0.5)
Here are the QTGMC 60 fps versions of the same two clips.
Invader Zim sample (enhanced and upscaled and 60 fps)
Invader Zim sample (enhanced and 60 fps)
Do you have a strong argument why I should use QTGMC, aside from your frame replacement system, and the 60 fps output? Because for me, the 23.976 fps output runs pretty damn smooth. If it's just the two arguments I mentioned, then it's a toss-up for me. I might just do 60 fps (QTGMC) for the hell of it, so I don't have to ever go back to this
I did very minor noise reduction with UnDot and TTempSmooth. I rarely use any strong spacial noise reduction filters as I don't like the results.
I didn't exactly analyze every frame when I did those conversions. I ran a partial script and watched as I held down the right arrow in VirtualDub (15 fps?). When I noticed a bad frame I went back to get the exact frame number and replaced it with another.
Here's an example of QTGMC screwing up on the simulated raster scan. The dual TVM screws up here and there because there are orphaned fields (fields for which there is no complimentary field to complete the original film frame) because the scene was sped up after being telecined. On some of those I went back and replaced the bad frames with a copy of the frame before or the frame after.
I've also seen a few frames being very noisy, right after a camera view change, but those are also present in the source. I guess many of those can also be replaced with one of the following frames, if I'm lucky.
I know I keep saying this, but I REALLY appreciate your insights and help. I feel like I'm on the fast-track here
Thanks a lot for your time and your tools. I have my work cut out for me, but I feel like you've provided me with the right tools for the job. I really cannot thank you enough. Seeing my favorite show in such splendor, all but brings a tear to my eye.
Is there any way I could maybe throw a donation your way?
When I watched the first episode of Zim (DVD from the library) I had mixed feelings about the show. All the characters were annoying. But I decided to continue watching. It quickly grew on me and became one of my favorite shows! Most of the discs were stolen from the local libraries so I eventually bought the entire series. Too bad the show was so short lived.
Oh, and I forgot that I never finished the 1080p upscaling. I originally did a less extensive upscale to 720p without all the hand patching. It looks like I need to update several more episodes.