Cdeint
From Avisynth wiki
Bad telecined sources with blended fields seems to be normal in my country. The possible solutions for this problems are really rare. For example matchbob or tdeint(mode=1, tryweave=true) with unblend and a decimater or the the great but totally complex function restore24. So I tried to create a alternative for restore24 and this is the result.
Discussion can be found here.
Function
function Cdeint(clip clp, clip "bob", int "bmode", float "nlv", float "hv") { ###### PREPARATION ###### global noisel = default(nlv,0) global x = default(hv,0.9) ord = clp.getparity() ? 1 : 0 tmpp = isyv12(clp) ? clp.leakkernelbob(order=ord, sharp=false, twoway=false, threshold=5).duplicateframe(0) : \ clp.leakkernelbob(order=ord, sharp=false, twoway=false, threshold=5).duplicateframe(0).ConvertToYV12() one = tmpp.crop(8,8,-8,-8) two = tmpp.crop(8,8,-8,-8).BilinearResize(640,352) three = tmpp.crop(8,8,-8,-8).BilinearResize(352,192) global testclip = (bmode==1 ? one : (bmode==3 ? three : two)) ###### FRAMES FOR BLENDPARAMETERS ###### global combing_n0 = testclip.selecteven() global combing_n1 = testclip.selectodd() global combing_n2 = combing_n0.trim(1,0) global combing_n3 = combing_n1.trim(1,0) ###### POSSIBLE OUTPUTS ###### out = bob.selecteven() out_1 = bob.selectodd() ###### Conditional Function Chain, evaluated from bottom to top (!) ###### c99=ConditionalFilter(clp, out_1, out, "btest/Min(combl_0, combl_1)", "lessthan", "btest_2/Min(combl_1, combl_2)") c9=FrameEvaluate(c99, "global btest_2 = LumaDifference(blendmade_test, blendpic_test) - (0.8 * noisel)") c8=FrameEvaluate(c9, "Evaluate_test()") c7=FrameEvaluate(c8, "global blendl_test = combl_1 < combl_2 ? 0.5 * Exp(x * Log(combl_1 / combl_2)) : \ 1 - 0.5 * Exp(x * Log(combl_2 / combl_1))") c6=FrameEvaluate(c7, "global btest = LumaDifference(blendmade, blendpic) - (0.8 * noisel)") c5=FrameEvaluate(c6, "Evaluate()") c4=FrameEvaluate(c5, "global blendl = combl_0 < combl_1 ? 0.5 * Exp(x * Log(combl_0 / combl_1)) : \ 1 - 0.5 * Exp(x * Log(combl_1 / combl_0))") c3=FrameEvaluate(c4, "global combl_2 = LumaDifference(combing_n2, combing_n3) - noisel") c2=FrameEvaluate(c3, "global combl_1 = LumaDifference(combing_n1, combing_n2) - noisel") c1=FrameEvaluate(c2, "global combl_0 = LumaDifference(combing_n0, combing_n1) - noisel") return(c1) } # (running inside of the Conditional Environment) function Evaluate() { vid = testclip.selecteven() vid_1 = vid.trim(1,0) global blendmade = MergeLuma(vid,vid_1,blendl) global blendpic = testclip.selectodd() } function Evaluate_test() { vid_2 = testclip.selectodd() vid_3 = vid_2.trim(1,0) global blendmade_test = MergeLuma(vid_2,vid_3,blendl_test) global blendpic_test = testclip.selecteven().trim(1,0) } function Min(float a, float b) { temp = a < b ? a :b return(temp) }
Usage
LoadPlugin("C:\program_me\dgmpgdec\DGDecode.dll") LoadPlugin("C:\program_me\filters\TIVTC.dll") LoadPlugin("C:\program_me\filters\FDecimate.dll") #LoadPlugin("C:\program_me\filters\TDeint.dll") LoadPlugin("C:\program_me\filters\leakkerneldeint.dll") #AVISource("D:\video\inu\[Ingow] Pirates Of Japan (Trailer).avi") #OpenDMLSource("C:\Dokumente und Einstellungen\Benutzername\Eigene Dateien\Eigene Videos\film.avi") #DirectShowSource("D:\video\inu\[Ingow] Pirates Of Japan (Trailer).avi") MPEG2Source("D:\dvd.d2v",cpu=4) #trim(0,0) crop(8,8,-8,-8) ord = last.getparity() ? 1 : 0 a = leakkernelbob(order=ord, sharp=true, twoway=true, threshold=7) deint = Cdeint(bob=a, bmode=2, nlv=0) tfm(order=-1, mode=0, cthresh=6, MI=64, display=false, mChroma=true, slow=false, pp=2, clip2=deint) fdecimate(rate=23.976,threshold=1.0,metrics=false) # or another decimater