📄 tomsmocomp.cpp
字号:
// TdblResize<T3dnow>::Avisynth_DblResizeH(src_pitch, rowsize,rowsize/2, srcp, pWorkArea,FldHeight);// go H expand lines into even output lines
else
TdblResize<Tmmx>::Avisynth_DblResizeH(src_pitch, rowsize,rowsize/2, srcp, pWorkArea,FldHeight);// go H expand lines into even output lines
src_pitch = rowsize; // pretend it is wider now, and in out buffer
pWeaveSrc = pWorkArea; // pretend source is here now
pCopySrc = pWorkArea; // "
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch, src_pitch); // copy top EVEN line
}
else
{
if (SSEMMXenabled)
TdblResize<Tmmxext>::Avisynth_DblResizeH(src_pitch, 2*dst_pitch, rowsize/2, srcp, dstp, FldHeight); // go H expand lines into even output lines
//else if (_3DNOWenabled)
// TdblResize<T3dnow>::Avisynth_DblResizeH(src_pitch, 2*dst_pitch, rowsize/2, srcp, dstp, FldHeight); // go H expand lines into even output lines
else
TdblResize<Tmmx>::Avisynth_DblResizeH(src_pitch, 2*dst_pitch, rowsize/2, srcp, dstp, FldHeight); // go H expand lines into even output lines
src_pitch = 2*dst_pitch; // pretend it is wider now, and in out buffer
pWeaveSrc = dstp; // pretend source is here now
pCopySrc = dstp; // "
// Fieldcopy(pWeaveDest, pCopySrc, rowsize, 1, dst_pitch, src_pitch); // copy top ODD line
}
Fieldcopy(pWeaveDest + (height-2)*dst_pitch, pCopySrc+(FldHeight-1)*src_pitch, rowsize, 1, dst_pitch, src_pitch); // copy bottom Odd line
}
else if (SearchEffort == -1) // note - DBL_Resize carried ast TopFirst == 0 hrtrtr
{
pCopySrc = srcp; // even src lines, 0,2,4..
pWeaveSrc = srcp; // odd src lines, 1,3,5..
pCopyDest = dstp; // even dest
pWeaveDest = dstp+dst_pitch; // odd dest
if (Use_Vertical_Filter)
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch, src_pitch); // copy top EVEN line
else
Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch); // copy all EVEN lines (base 0) I don't remember why???
Fieldcopy(pWeaveDest + (height-2)*dst_pitch, pCopySrc+(FldHeight-1)*src_pitch, rowsize, 1, dst_pitch, src_pitch); // copy bottom Odd line
}
else if (TopFirst)
{
pWeaveSrc = srcp+src_pitch;
pCopySrc = srcp;
pWeaveDest = dstp+dst_pitch;
pCopyDest = dstp;
Fieldcopy(pWeaveDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2); // bob this later?
Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2, pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2);
if (Use_Vertical_Filter)
{
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2);
Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2,pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2); // copy last bob line
}
else
Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch*2);
}
else // not Top First
{
pWeaveSrc = srcp;
pCopySrc = srcp + src_pitch;
pWeaveDest = dstp;
pCopyDest = dstp + dst_pitch;
Fieldcopy(pWeaveDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2);
Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2, pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2); // bob this later
if (Use_Vertical_Filter)
{
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2); // copy first bob line
Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2, pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2); // copy last bob line
pWeaveDest += dst_pitch; // bug, adj for poor planning
}
else
Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch*2);
}
if (oldSearchEffort!=SearchEffort)
searchLoopFc=getSearchFc(SearchEffort);
searchLoopFc(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP,pWeaveDest, TopFirst, pCopySrc,pCopySrcP, FldHeight);
}
void ProcessFrame_YV12(int SearchEffort,const unsigned char *srcp,unsigned char *dstp,stride_t dst_pitch,int rowsize,int FldHeight,int height)
{
unsigned char *pWeaveDest;const unsigned char *pWeaveSrc;
unsigned char *pCopyDest;const unsigned char *pCopySrc;
if (SearchEffort < -1) SearchEffort = -1; //>>>>> temp
if (SearchEffort == -1) // note - DBL_Resize carried ast TopFirst == 0 hrtrtr
{
pCopySrc = srcp; // even src lines, 0,2,4..
pWeaveSrc = srcp; // odd src lines, 1,3,5..
pCopyDest = dstp; // even dest
pWeaveDest = dstp+dst_pitch; // odd dest
if (Use_Vertical_Filter)
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch, src_pitch);// copy top EVEN line
else
Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch); // copy all EVEN lines (base 0) I don't remember why???
Fieldcopy(pWeaveDest + (height-2)*dst_pitch, pCopySrc+(FldHeight-1)*src_pitch, rowsize, 1, dst_pitch, src_pitch); // copy bottom Odd line
}
else
if (TopFirst)
{
pWeaveSrc = srcp+src_pitch;
pCopySrc = srcp;
pWeaveDest = dstp+dst_pitch;
pCopyDest = dstp;
Fieldcopy(pWeaveDest, pCopySrc, rowsize,1, dst_pitch*2, src_pitch*2);// bob this later?
Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2,pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2);
if (Use_Vertical_Filter)
{
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2);
Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2,pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2); // copy last bob line
}
else
Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch*2);
}
else // not Top First
{
pWeaveSrc = srcp;
pCopySrc = srcp + src_pitch;
pWeaveDest = dstp;
pCopyDest = dstp + dst_pitch;
Fieldcopy(pWeaveDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2);
Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2,pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2); // bob this later
if (Use_Vertical_Filter)
{
Fieldcopy(pCopyDest, pCopySrc, rowsize, 1, dst_pitch*2, src_pitch*2); // copy first bob line
Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2,pCopySrc+(FldHeight-1)*src_pitch*2, rowsize, 1, dst_pitch*2, src_pitch*2); // copy last bob line
pWeaveDest += dst_pitch; // bug, adj for poor planning
}
else
Fieldcopy(pCopyDest, pCopySrc, rowsize, FldHeight, dst_pitch*2, src_pitch*2);
}
if (oldSearchEffort!=SearchEffort)
searchLoopFc=getSearchFc(SearchEffort);
searchLoopFc(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP,pWeaveDest, TopFirst, pCopySrc,pCopySrcP, FldHeight);
}
TsearchLoopFc getSearchFc(int searchEffort)
{
oldSearchEffort=searchEffort;
if (IsYUY2)
if (Use_Vertical_Filter)
if (SSEMMXenabled)
return TtomsMoComp<Tmmxext,false,2,false,true>::getProcess(searchEffort);
//else if (_3DNOWenabled)
// return TtomsMoComp<T3dnow,false,2,false,true>::getProcess(searchEffort);
else
return TtomsMoComp<Tmmx,false,2,false,true>::getProcess(searchEffort);
else
if (SSEMMXenabled)
return TtomsMoComp<Tmmxext,false,2,false,false>::getProcess(searchEffort);
//else if (_3DNOWenabled)
// return TtomsMoComp<T3dnow,false,2,false,false>::getProcess(searchEffort);
else
return TtomsMoComp<Tmmx,false,2,false,false>::getProcess(searchEffort);
else
if (Use_Vertical_Filter)
if (SSEMMXenabled)
return TtomsMoComp<Tmmxext,false,1,true,true>::getProcess(searchEffort);
//else if (_3DNOWenabled)
// return TtomsMoComp<T3dnow,false,1,true,true>::getProcess(searchEffort);
else
return TtomsMoComp<Tmmx,false,1,true,true>::getProcess(searchEffort);
else
if (SSEMMXenabled)
return TtomsMoComp<Tmmxext,false,1,true,false>::getProcess(searchEffort);
//else if (_3DNOWenabled)
// return TtomsMoComp<T3dnow,false,1,true,true>::getProcess(searchEffort);
else
return TtomsMoComp<Tmmx,false,1,true,false>::getProcess(searchEffort);
}
public:
TomsMoComp(void)
{
src=NULL;
dst=NULL;
prevSrc=NULL;
pWorkArea=NULL;
}
virtual ~TomsMoComp()
{
if (src) delete src;
if (dst) delete dst;
if (prevSrc) delete prevSrc;
if (pWorkArea) free(pWorkArea);
}
virtual void STDMETHODCALLTYPE destroy(void)
{
delete this;
}
virtual bool STDMETHODCALLTYPE create(bool isSSE2,bool isMMX2,bool is3dnow,bool _IsYUY2, int _TopFirst, int _Search_Effort, bool _Use_Vertical_Filter,int &width,int &height,stride_t srcStride[4],stride_t dstStride[4])
{
IsYUY2=_IsYUY2;
src=new TVideoFrame;
src->dx[0]=width;src->dx[1]=src->dx[2]=width/2;
src->stride[0]=srcStride[0];src->stride[1]=srcStride[1];src->stride[2]=srcStride[2];
src->dy[0]=height;src->dy[1]=src->dy[2]=height/2;
dst=new TVideoFrame;
memcpy(dst->dx,src->dx,sizeof(src->dx));
memcpy(dst->dy,src->dy,sizeof(src->dy));
dst->stride[0]=dstStride[0];dst->stride[1]=dstStride[1];dst->stride[2]=dstStride[2];
prevSrc=new TVideoFrame;
memcpy(prevSrc->dx,src->dx,sizeof(src->dx));
memcpy(prevSrc->dy,src->dy,sizeof(src->dy));
prevSrc->stride[0]=srcStride[0];prevSrc->stride[1]=srcStride[1];prevSrc->stride[2]=srcStride[2];
TopFirst = _TopFirst;
Use_Vertical_Filter = _Use_Vertical_Filter;
searchEffort = _Search_Effort;
PrevFrame = -2; // last frame processed, if any
PrevInFrame = -2; // last frame requested, if any
dropFrame = 1; // next frame to drop
SSE2enabled = isSSE2;
SSEMMXenabled =isMMX2;
_3DNOWenabled =is3dnow;
pWeaveSrcP=pCopySrcP=NULL;
if (width % 4)
return false;
if (searchEffort == -1)
{
height = 2 * height;
TopFirst = 0;
}
if (searchEffort == -2)
{
width = 2 * width;
height = 2 * height;
TopFirst = 0;
if (Use_Vertical_Filter)
{
pWorkArea = (BYTE*) malloc(width*height*2+128);
}
}
oldSearchEffort=-1;
return true;
}
virtual void STDMETHODCALLTYPE GetFrame(int inFrame,int tff,const uint8_t *srcs[3],uint8_t *dsts[3],const uint8_t *psrcs[3])
{
int useFrame=inFrame;
for (int i=0;i<3;i++)
{
src->ptr[i]=(unsigned char*)srcs[i];
dst->ptr[i]=dsts[i];
prevSrc->ptr[i]=(unsigned char*)psrcs[i];
}
if (TopFirst==-1)
TopFirst = tff?1: 0;
if (useFrame<0)
return;
int SearchEffortW=0;
if (useFrame)
{
SearchEffortW = searchEffort;
// prevSrc = child->GetFrame(useFrame-1, env);
pWeaveSrcP = TopFirst ? prevSrc->ptr[0] + src_pitch : prevSrc->ptr[0];
pCopySrcP = TopFirst ? prevSrc->ptr[0] + src_pitch : prevSrc->ptr[0];
}
if (IsYUY2)
{
const unsigned char *srcp = src->ptr[0];
unsigned char *dstp = dst->ptr[0];
src_pitch = src->stride[0];
stride_t dst_pitch = dst->stride[0];
int rowsize = dst->dx[0]*2;
int height = dst->dy[0];
int FldHeight = height / 2;
if (useFrame)
{
pWeaveSrcP = TopFirst ? prevSrc->ptr[0] + src_pitch : prevSrc->ptr[0];
pCopySrcP = TopFirst ? prevSrc->ptr[0] + src_pitch : prevSrc->ptr[0];
}
ProcessFrame(SearchEffortW,srcp,dstp,dst_pitch,rowsize,FldHeight,height); // table and then write the frame
}
else
{
// For YV12 we are going to cheat and deinterlace each plane separately as if it was
// the whole frame. This is a quick hack, but probably will be okay.
// First, the Y plane, pretending it is the whole frame
const unsigned char *srcp=src->GetReadPtr(PLANAR_Y);
unsigned char *dstp = dst->GetWritePtr(PLANAR_Y);
src_pitch = src->GetPitch(PLANAR_Y);
stride_t dst_pitch = dst->GetPitch(PLANAR_Y);
int rowsize = dst->GetRowSize(PLANAR_Y); // Could also be PLANAR_Y_ALIGNED which would return a mod16 row_size
int height = dst->GetHeight(PLANAR_Y);
int FldHeight = height / 2;
if (useFrame)
{
pWeaveSrcP = TopFirst ? prevSrc->GetReadPtr(PLANAR_Y) + src_pitch : prevSrc->GetReadPtr(PLANAR_Y);
pCopySrcP = TopFirst ? prevSrc->GetReadPtr(PLANAR_Y) + src_pitch : prevSrc->GetReadPtr(PLANAR_Y);
}
ProcessFrame_YV12(SearchEffortW,srcp,dstp,dst_pitch,rowsize,FldHeight,height); // table and then write the frame
// Next, the U plane
srcp = src->GetReadPtr(PLANAR_U);
dstp = dst->GetWritePtr(PLANAR_U);
src_pitch = src->GetPitch(PLANAR_U);
dst_pitch = dst->GetPitch(PLANAR_U);
rowsize = dst->GetRowSize(PLANAR_U); // Could also be PLANAR_U_ALIGNED which would return a mod8 row_size
height = dst->GetHeight(PLANAR_U);
FldHeight = height / 2;
if (useFrame)
{
pWeaveSrcP = TopFirst ? prevSrc->GetReadPtr(PLANAR_U) + src_pitch : prevSrc->GetReadPtr(PLANAR_U);
pCopySrcP = TopFirst ? prevSrc->GetReadPtr(PLANAR_U) + src_pitch : prevSrc->GetReadPtr(PLANAR_U);
}
ProcessFrame_YV12(SearchEffortW,srcp,dstp,dst_pitch,rowsize,FldHeight,height); // table and then write the frame
// And the V plane, same sizes as U, different locations
srcp = src->GetReadPtr(PLANAR_V);
dstp = dst->GetWritePtr(PLANAR_V);
if (useFrame)
{
pWeaveSrcP = TopFirst ? prevSrc->GetReadPtr(PLANAR_V) + src_pitch : prevSrc->GetReadPtr(PLANAR_V);
pCopySrcP = TopFirst ? prevSrc->GetReadPtr(PLANAR_V) + src_pitch : prevSrc->GetReadPtr(PLANAR_V);
}
ProcessFrame_YV12(SearchEffortW,srcp,dstp,dst_pitch,rowsize,FldHeight,height); // table and then write the frame
}
PrevFrame = useFrame;
PrevInFrame = inFrame;
_mm_empty();
}
};
extern "C" ItomsMoComp* createI(void)
{
return new TomsMoComp;
}
extern "C" void __stdcall getVersion(char *ver,const char* *license)
{
strcpy(ver,"1.0.1.8, build date "__DATE__" "__TIME__" ("COMPILER COMPILER_X64")");
*license="(c) 2002 Tom Barry";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -