⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tomsmocomp.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 4 页
字号:
       // 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 + -