AVIL
11th February 2009, 23:00
Hi all,
I like yadifmod results but somewhere it produces artifacts. To enhance the bobbed clip I've write a script (useable after any bobber). It uses my new plugin WAverage :
http://forum.doom9.org/showthread.php?t=144940
Can be used with YUY2 or YV12 clips.
Basic usage: x.bob_enhance()
function bob_enhance(clip x0, int "degrain",int "enlarge",int "preserve",bool "tm",int "blksize",int "blksizev",int "overlap",int "searchparam",int "thsad",int "search"){
preserve = default( preserve , 0 )#Retain more of the interlaced clip
enlarge = default( enlarge , 0 )#Use internally expanded clip
degrain = default( degrain , 0 )#Makes a last average to kill some grain
tm = default( tm , true )#Parameters for mvtools
blksize = default( blksize , 16 )
blksizev = default( blksizev , blksize )
searchparam = default( searchparam, 2 )
search = default( search , 2 )
thsad = default( thsad , 350 )
overlap = default( overlap , blksize / 2 )
overlapv = overlap * blksizev / blksize
#overlap=0
xn=x0.nnedi(field=1,dh=true).assumeframebased().assumetff()
x=(enlarge==0.0) ? xn : xn.spline36resize(2 * xn.width(),xn.height())
ox = x.width()
oy = x.height()
xs=x.separatefields().assumeframebased().assumetff().separatefields()
xp0=xs.selectevery(8,0,5) #Real
xp1=xs.selectevery(8,2,7) #2 interpolated
xp2=xs.selectevery(8,1,4) #Interpolated
xp3=xs.selectevery(8,3,6) #2 interpolated
s=x.MSuper(pel=1)
vf1y=s.MAnalyse(delta=1,isb=false,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
vb1y=s.MAnalyse(delta=1,isb= true,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
vf2y=s.MAnalyse(delta=2,isb=false,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
vb2y=s.MAnalyse(delta=2,isb= true,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
xf1=x.mcompensate(s,vf1y,thSAD=thsad)
xf2=x.mcompensate(s,vf2y,thSAD=thsad)
xb1=x.mcompensate(s,vb1y,thSAD=thsad)
xb2=x.mcompensate(s,vb2y,thSAD=thsad)
xf1s=xf1.separatefields().assumeframebased().assumetff().separatefields()
xf2s=xf2.separatefields().assumeframebased().assumetff().separatefields()
xb1s=xb1.separatefields().assumeframebased().assumetff().separatefields()
xb2s=xb2.separatefields().assumeframebased().assumetff().separatefields()
xf10=xf1s.selectevery(8,0,5)
xf20=xf2s.selectevery(8,0,5)
xb10=xb1s.selectevery(8,0,5)
xb20=xb2s.selectevery(8,0,5)
xf11=xf1s.selectevery(8,2,7)
xf21=xf2s.selectevery(8,2,7)
xb11=xb1s.selectevery(8,2,7)
xb21=xb2s.selectevery(8,2,7)
xf12=xf1s.selectevery(8,1,4)
xf22=xf2s.selectevery(8,1,4)
xb12=xb1s.selectevery(8,1,4)
xb22=xb2s.selectevery(8,1,4)
xf13=xf1s.selectevery(8,3,6)
xf23=xf2s.selectevery(8,3,6)
xb13=xb1s.selectevery(8,3,6)
xb23=xb2s.selectevery(8,3,6)
mf1s=x.mmask(vf1y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
mf2s=x.mmask(vf2y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
mb1s=x.mmask(vb1y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
mb2s=x.mmask(vb2y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
if10=mf1s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 2 == 124 x 4 % 0 == 32 16 ? ?",chroma="process").planar2interleaved()
ib10=mb1s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 2 == 124 x 4 % 0 == 32 16 ? ?",chroma="process").planar2interleaved()
if20=mf2s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 0 == 112 x 4 % 2 == 24 12 ? ?",chroma="process").planar2interleaved()
ib20=mb2s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 0 == 112 x 4 % 2 == 24 12 ? ?",chroma="process").planar2interleaved()
if11=mf1s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 1 == 124 x 4 % 3 == 64 16 ? ?",chroma="process").planar2interleaved()
ib11=mb1s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 1 == 124 x 4 % 3 == 64 16 ? ?",chroma="process").planar2interleaved()
if21=mf2s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 3 == 112 x 4 % 1 == 56 12 ? ?",chroma="process").planar2interleaved()
ib21=mb2s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 3 == 112 x 4 % 1 == 56 12 ? ?",chroma="process").planar2interleaved()
if12=mf1s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 0 == 124 x 4 % 2 == 32 12 ? ?",chroma="process").planar2interleaved()
ib12=mb1s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 0 == 124 x 4 % 2 == 32 12 ? ?",chroma="process").planar2interleaved()
if22=mf2s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 2 == 112 x 4 % 0 == 24 10 ? ?",chroma="process").planar2interleaved()
ib22=mb2s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 2 == 112 x 4 % 0 == 24 10 ? ?",chroma="process").planar2interleaved()
if13=mf1s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 3 == 124 x 4 % 1 == 64 16 ? ?",chroma="process").planar2interleaved()
ib13=mb1s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 3 == 124 x 4 % 1 == 64 16 ? ?",chroma="process").planar2interleaved()
if23=mf2s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 1 == 112 x 4 % 3 == 56 12 ? ?",chroma="process").planar2interleaved()
ib23=mb2s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 1 == 112 x 4 % 3 == 56 12 ? ?",chroma="process").planar2interleaved()
final=interleave(
\xp0.WAverage(xf10,if10,xf20,if20,xb10,ib10,xb20,ib20,base=256+preserve),
\xp1.WAverage(xf11,if11,xf21,if21,xb11,ib11,xb21,ib21,base=16),
\xp2.WAverage(xf12,if12,xf22,if22,xb12,ib12,xb22,ib22,base=32),
\xp3.WAverage(xf13,if13,xf23,if23,xb13,ib13,xb23,ib23,base=16)
\).selectevery(8,0,2,1,3,6,4,7,5).assumefieldbased().assumetff().weave().assumefieldbased().assumetff().weave()
z=(degrain==0.0) ? final : corrector(final,final,x,xf1,xf2,xb1,xb2,x,xf1,xf2,xb1,xb2,mode=0,th=degrain)
z.spline36resize(x0.width() , x0.height,src_top=-0.5)
}
I like yadifmod results but somewhere it produces artifacts. To enhance the bobbed clip I've write a script (useable after any bobber). It uses my new plugin WAverage :
http://forum.doom9.org/showthread.php?t=144940
Can be used with YUY2 or YV12 clips.
Basic usage: x.bob_enhance()
function bob_enhance(clip x0, int "degrain",int "enlarge",int "preserve",bool "tm",int "blksize",int "blksizev",int "overlap",int "searchparam",int "thsad",int "search"){
preserve = default( preserve , 0 )#Retain more of the interlaced clip
enlarge = default( enlarge , 0 )#Use internally expanded clip
degrain = default( degrain , 0 )#Makes a last average to kill some grain
tm = default( tm , true )#Parameters for mvtools
blksize = default( blksize , 16 )
blksizev = default( blksizev , blksize )
searchparam = default( searchparam, 2 )
search = default( search , 2 )
thsad = default( thsad , 350 )
overlap = default( overlap , blksize / 2 )
overlapv = overlap * blksizev / blksize
#overlap=0
xn=x0.nnedi(field=1,dh=true).assumeframebased().assumetff()
x=(enlarge==0.0) ? xn : xn.spline36resize(2 * xn.width(),xn.height())
ox = x.width()
oy = x.height()
xs=x.separatefields().assumeframebased().assumetff().separatefields()
xp0=xs.selectevery(8,0,5) #Real
xp1=xs.selectevery(8,2,7) #2 interpolated
xp2=xs.selectevery(8,1,4) #Interpolated
xp3=xs.selectevery(8,3,6) #2 interpolated
s=x.MSuper(pel=1)
vf1y=s.MAnalyse(delta=1,isb=false,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
vb1y=s.MAnalyse(delta=1,isb= true,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
vf2y=s.MAnalyse(delta=2,isb=false,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
vb2y=s.MAnalyse(delta=2,isb= true,truemotion=tm,blksize=blksize,blksizev=blksizev,overlap=overlap,overlapv=overlapv,search=search,searchparam=searchparam,chroma=false)
xf1=x.mcompensate(s,vf1y,thSAD=thsad)
xf2=x.mcompensate(s,vf2y,thSAD=thsad)
xb1=x.mcompensate(s,vb1y,thSAD=thsad)
xb2=x.mcompensate(s,vb2y,thSAD=thsad)
xf1s=xf1.separatefields().assumeframebased().assumetff().separatefields()
xf2s=xf2.separatefields().assumeframebased().assumetff().separatefields()
xb1s=xb1.separatefields().assumeframebased().assumetff().separatefields()
xb2s=xb2.separatefields().assumeframebased().assumetff().separatefields()
xf10=xf1s.selectevery(8,0,5)
xf20=xf2s.selectevery(8,0,5)
xb10=xb1s.selectevery(8,0,5)
xb20=xb2s.selectevery(8,0,5)
xf11=xf1s.selectevery(8,2,7)
xf21=xf2s.selectevery(8,2,7)
xb11=xb1s.selectevery(8,2,7)
xb21=xb2s.selectevery(8,2,7)
xf12=xf1s.selectevery(8,1,4)
xf22=xf2s.selectevery(8,1,4)
xb12=xb1s.selectevery(8,1,4)
xb22=xb2s.selectevery(8,1,4)
xf13=xf1s.selectevery(8,3,6)
xf23=xf2s.selectevery(8,3,6)
xb13=xb1s.selectevery(8,3,6)
xb23=xb2s.selectevery(8,3,6)
mf1s=x.mmask(vf1y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
mf2s=x.mmask(vf2y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
mb1s=x.mmask(vb1y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
mb2s=x.mmask(vb2y,kind=4).separatefields().assumeframebased().assumetff().separatefields()
if10=mf1s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 2 == 124 x 4 % 0 == 32 16 ? ?",chroma="process").planar2interleaved()
ib10=mb1s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 2 == 124 x 4 % 0 == 32 16 ? ?",chroma="process").planar2interleaved()
if20=mf2s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 0 == 112 x 4 % 2 == 24 12 ? ?",chroma="process").planar2interleaved()
ib20=mb2s.selectevery(8,0,5).interleaved2planar().mt_lut(expr="x 4 % 0 == 112 x 4 % 2 == 24 12 ? ?",chroma="process").planar2interleaved()
if11=mf1s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 1 == 124 x 4 % 3 == 64 16 ? ?",chroma="process").planar2interleaved()
ib11=mb1s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 1 == 124 x 4 % 3 == 64 16 ? ?",chroma="process").planar2interleaved()
if21=mf2s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 3 == 112 x 4 % 1 == 56 12 ? ?",chroma="process").planar2interleaved()
ib21=mb2s.selectevery(8,2,7).interleaved2planar().mt_lut(expr="x 4 % 3 == 112 x 4 % 1 == 56 12 ? ?",chroma="process").planar2interleaved()
if12=mf1s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 0 == 124 x 4 % 2 == 32 12 ? ?",chroma="process").planar2interleaved()
ib12=mb1s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 0 == 124 x 4 % 2 == 32 12 ? ?",chroma="process").planar2interleaved()
if22=mf2s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 2 == 112 x 4 % 0 == 24 10 ? ?",chroma="process").planar2interleaved()
ib22=mb2s.selectevery(8,1,4).interleaved2planar().mt_lut(expr="x 4 % 2 == 112 x 4 % 0 == 24 10 ? ?",chroma="process").planar2interleaved()
if13=mf1s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 3 == 124 x 4 % 1 == 64 16 ? ?",chroma="process").planar2interleaved()
ib13=mb1s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 3 == 124 x 4 % 1 == 64 16 ? ?",chroma="process").planar2interleaved()
if23=mf2s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 1 == 112 x 4 % 3 == 56 12 ? ?",chroma="process").planar2interleaved()
ib23=mb2s.selectevery(8,3,6).interleaved2planar().mt_lut(expr="x 4 % 1 == 112 x 4 % 3 == 56 12 ? ?",chroma="process").planar2interleaved()
final=interleave(
\xp0.WAverage(xf10,if10,xf20,if20,xb10,ib10,xb20,ib20,base=256+preserve),
\xp1.WAverage(xf11,if11,xf21,if21,xb11,ib11,xb21,ib21,base=16),
\xp2.WAverage(xf12,if12,xf22,if22,xb12,ib12,xb22,ib22,base=32),
\xp3.WAverage(xf13,if13,xf23,if23,xb13,ib13,xb23,ib23,base=16)
\).selectevery(8,0,2,1,3,6,4,7,5).assumefieldbased().assumetff().weave().assumefieldbased().assumetff().weave()
z=(degrain==0.0) ? final : corrector(final,final,x,xf1,xf2,xb1,xb2,x,xf1,xf2,xb1,xb2,mode=0,th=degrain)
z.spline36resize(x0.width() , x0.height,src_top=-0.5)
}