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

📄 tconvert.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
       if (outcsp1==FF_CSP_YUY2) // RGB24 -> YUY2
        mode=MODE_mmx_ConvertRGB24toYUY2;
       break;
      case FF_CSP_PAL8:
       switch (outcsp1)
        {
         case FF_CSP_RGB32:palette8torgb=libmplayer->palette8tobgr32;break;
         case FF_CSP_BGR32:palette8torgb=libmplayer->palette8torgb32;break;
         case FF_CSP_RGB24:palette8torgb=libmplayer->palette8tobgr24;break;
         case FF_CSP_BGR24:palette8torgb=libmplayer->palette8torgb24;break;
         case FF_CSP_RGB16:palette8torgb=libmplayer->palette8tobgr16;break;
         case FF_CSP_BGR16:palette8torgb=libmplayer->palette8torgb16;break;
         case FF_CSP_RGB15:palette8torgb=libmplayer->palette8tobgr15;break;
         case FF_CSP_BGR15:palette8torgb=libmplayer->palette8torgb15;break;
         default:palette8torgb=NULL;break;
        }
       if (palette8torgb)
        mode=MODE_palette8torgb;
       break;
      case FF_CSP_CLJR:
       if (outcsp1==FF_CSP_420P)
        mode=MODE_CLJR;
       break;
     }
   #endif
   if (mode==MODE_none)
    if (incsp1!=FF_CSP_420P && csp_supXvid(incsp1)/* && incsp1!=FF_CSP_RGB24 */&& outcsp1==FF_CSP_420P) // x -> YV12
     mode=MODE_xvidImage_input;
    else if (csp_supSWSin(incsp1) && csp_supSWSout(outcsp1))
     {
      if (!swscale) swscale=new Tswscale(libmplayer);
      swscale->init(dx,dy,incsp,outcsp);
      mode=MODE_swscale;
     }
    else
     {
      mode=MODE_fallback;
      tmpcsp=(incsp1==FF_CSP_PAL8)?FF_CSP_RGB32:FF_CSP_420P;
      if (tmpcsp==FF_CSP_RGB32)
       {
        tmpStride[0]=4*(dx/16+2)*16;
        tmp[0]=(unsigned char*)aligned_malloc(tmpStride[0]*dy);
       }
      else
       {
        tmpStride[1]=tmpStride[2]=(tmpStride[0]=(dx/16+2)*16)/2;
        tmp[0]=(unsigned char*)aligned_malloc(tmpStride[0]*dy  );
        tmp[1]=(unsigned char*)aligned_malloc(tmpStride[1]*dy/2);
        tmp[2]=(unsigned char*)aligned_malloc(tmpStride[2]*dy/2);
       }
      tmpConvert1=new Tconvert(libmplayer,avisynthYV12_RGB,dx,dy);
      tmpConvert2=new Tconvert(libmplayer,avisynthYV12_RGB,dx,dy);
      if (incsp&FF_CSP_FLAGS_INTERLACED || outcsp&FF_CSP_FLAGS_INTERLACED) tmpcsp|=FF_CSP_FLAGS_INTERLACED;
     }

   char_t incspS[256],outcspS[256];
   DPRINTF(_l("colorspace conversion: %s -> %s (%s)"),csp_getName(incsp0,incspS,256),csp_getName(outcsp0,outcspS,256),getModeName(mode));

   if (mode==MODE_xvidImage_input || mode==MODE_xvidImage_output)
    {
     static bool inited=false;
     if (!inited)
      {
       inited=true;
       xvid_colorspace_init();
      }
    }
  }
 if (outcsp==FF_CSP_NULL) return 0;

 switch (mode)
  {
   #ifdef AVISYNTH_BITBLT
   case MODE_avisynth_bitblt:
    {
     for (unsigned int i=0;i<incspInfo->numPlanes;i++)
      TffPict::copy(dst[i],dstStride[i],src[i],srcStride[i],rowsize>>incspInfo->shiftX[i],dy>>incspInfo->shiftY[i]);
     return dy;
    }
   #endif
   case MODE_avisynth_yv12_to_yuy2:
    avisynth_yv12_to_yuy2(src[0],src[1],src[2],dx,srcStride[0],srcStride[1],
                          dst[0],dstStride[0],
                          dy);
    return dy;
   case MODE_xvidImage_output:
    {
     IMAGE srcPict;srcPict.y=(unsigned char*)src[0];srcPict.u=(unsigned char*)src[1];srcPict.v=(unsigned char*)src[2];
     image_output(&srcPict,
                  dx,outdy,srcStride,
                  dst,dstStride,
                  outcsp&~FF_CSP_FLAGS_INTERLACED,outcsp&FF_CSP_FLAGS_INTERLACED,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG);
     return outdy;
    }
   case MODE_avisynth_yuy2_to_yv12:
    avisynth_yuy2_to_yv12(src[0],dx*2,srcStride[0],
                          dst[0],dst[1],dst[2],dstStride[0],dstStride[1],
                          dy);
    return dy;
   case MODE_mmx_ConvertRGB32toYUY2:
    Tmmx_ConvertRGBtoYUY2<false,false>::mmx_ConvertRGBtoYUY2(src[0],dst[0],srcStride[0],dstStride[0],dx,dy,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG?1:0);
    return dy;
   case MODE_mmx_ConvertRGB24toYUY2:
    Tmmx_ConvertRGBtoYUY2<true ,false>::mmx_ConvertRGBtoYUY2(src[0],dst[0],srcStride[0],dstStride[0],dx,dy,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG?1:0);
    return dy;
   case MODE_mmx_ConvertYUY2toRGB24:
    Tmmx_ConvertYUY2toRGB<0,0>::mmx_ConvertYUY2toRGB(src[0],dst[0],src[0]+dy*srcStride[0],srcStride[0],dstStride[0],dx*2,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG?1:0);
    return dy;
   case MODE_mmx_ConvertYUY2toRGB32:
    Tmmx_ConvertYUY2toRGB<0,1>::mmx_ConvertYUY2toRGB(src[0],dst[0],src[0]+dy*srcStride[0],srcStride[0],dstStride[0],dx*2,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG?1:0);
    return dy;
   case MODE_mmx_ConvertUYVYtoRGB24:
    Tmmx_ConvertYUY2toRGB<1,0>::mmx_ConvertYUY2toRGB(src[0],dst[0],src[0]+dy*srcStride[0],srcStride[0],dstStride[0],dx*2,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG?1:0);
    return dy;
   case MODE_mmx_ConvertUYVYtoRGB32:
    Tmmx_ConvertYUY2toRGB<1,1>::mmx_ConvertYUY2toRGB(src[0],dst[0],src[0]+dy*srcStride[0],srcStride[0],dstStride[0],dx*2,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG?1:0);
    return dy;
   case MODE_palette8torgb:
    {
     if (srcpal && srcpal->pal)
      for (unsigned int y=0;y<dy;y++)
       palette8torgb(src[0]+srcStride[0]*y,dst[0]+dstStride[0]*y,dx,srcpal->pal);
     return dy;
    }
   case MODE_CLJR:
    {
     // Copyright (c) 2003 Alex Beregszaszi
     GetBitContext gb;
     init_get_bits(&gb,src[0],int(srcStride[0]*dy*8));
     for (unsigned int y=0;y<dy;y++)
      {
       uint8_t *luma=&dst[0][y*dstStride[0]];
       uint8_t *cb  =&dst[1][(y/2)*dstStride[1]];
       uint8_t *cr  =&dst[2][(y/2)*dstStride[2]];
       for (unsigned int x=0;x<dx;x+=4)
        {
         luma[3]=uint8_t(get_bits(&gb,5)<<3);
         luma[2]=uint8_t(get_bits(&gb,5)<<3);
         luma[1]=uint8_t(get_bits(&gb,5)<<3);
         luma[0]=uint8_t(get_bits(&gb,5)<<3);
         luma+=4;
         cb[0]=cb[1]=uint8_t(get_bits(&gb,6)<<2);cb+=2;
         cr[0]=cr[1]=uint8_t(get_bits(&gb,6)<<2);cr+=2;
        }
      }
     return dy;
    }
   case MODE_xvidImage_input:
    {
     IMAGE dstPict={dst[0],dst[1],dst[2]};
     image_input(&dstPict,dx,dy,dstStride[0],dstStride[1],src[0],srcStride[0],incsp,incsp&FF_CSP_FLAGS_INTERLACED,(incsp|outcsp)&FF_CSP_FLAGS_YUV_JPEG);
     return dy;
    }
   case MODE_swscale:
    swscale->convert(src,srcStride,dst,dstStride);
    return dy;
   case MODE_fallback:
    tmpConvert1->convert(incsp,src,srcStride,tmpcsp,tmp,tmpStride,srcpal);
    tmpConvert2->convert(tmpcsp,(const uint8_t**)tmp,tmpStride,outcsp,dst,dstStride,NULL);
    return dy;
   default:
    return 0;
  }
}
int Tconvert::convert(const TffPict &pict,int outcsp,uint8_t* dst[],stride_t dstStride[])
{
 return convert(pict.csp|((pict.fieldtype&FIELD_TYPE::MASK_INT)?FF_CSP_FLAGS_INTERLACED:0),pict.data,pict.stride,outcsp,dst,dstStride,&pict.palette);
}

//================================= TffColorspaceConvert =================================
CUnknown* WINAPI TffColorspaceConvert::CreateInstance(LPUNKNOWN punk,HRESULT *phr)
{
 TffColorspaceConvert *pNewObject=new TffColorspaceConvert(punk,phr);
 if (pNewObject==NULL)
  *phr=E_OUTOFMEMORY;
 return pNewObject;
}
STDMETHODIMP TffColorspaceConvert::NonDelegatingQueryInterface(REFIID riid,void **ppv)
{
 CheckPointer(ppv, E_POINTER);
 if (riid==IID_IffColorspaceConvert)
  return GetInterface<IffColorspaceConvert>(this,ppv);
 else
  return CUnknown::NonDelegatingQueryInterface(riid,ppv);
}

TffColorspaceConvert::TffColorspaceConvert(LPUNKNOWN punk,HRESULT *phr):
 CUnknown(NAME("TffColorspaceConvert"),punk,phr),
 c(NULL),
 config(new Tconfig(g_hInst,0xff))
{
 libmplayer=new Tlibmplayer(config);libmplayer->AddRef();
}
TffColorspaceConvert::~TffColorspaceConvert()
{
 if (c) delete c;
 libmplayer->Release();
 delete config;
}

STDMETHODIMP TffColorspaceConvert::allocPicture(int csp,unsigned int dx,unsigned int dy,uint8_t *data[],stride_t stride[])
{
 if (!dx || !dy || csp==FF_CSP_NULL) return E_INVALIDARG;
 if (!data || !stride) return E_POINTER;
 Tbuffer buf;
 buf.free=false;
 TffPict pict;
 pict.alloc(dx,dy,csp,buf);
 for (unsigned int i=0;i<pict.cspInfo.numPlanes;i++)
  {
   data[i]=pict.data[i];
   stride[i]=pict.stride[i];
  }
 return S_OK;
}
STDMETHODIMP TffColorspaceConvert::freePicture(uint8_t *data[])
{
 if (!data) return E_POINTER;
 if (data[0])
  aligned_free(data[0]);
 return S_OK;
}

STDMETHODIMP TffColorspaceConvert::convert(unsigned int dx,unsigned int dy,int incsp,uint8_t *src[],const stride_t srcStride[],int outcsp,uint8_t *dst[],stride_t dstStride[])
{
 return convertPalette(dx,dy,incsp,src,srcStride,outcsp,dst,dstStride,NULL,0);
}
STDMETHODIMP TffColorspaceConvert::convertPalette(unsigned int dx,unsigned int dy,int incsp,uint8_t *src[],const stride_t srcStride[],int outcsp,uint8_t *dst[],stride_t dstStride[],const unsigned char *pal,unsigned int numcolors)
{
 if (!c || c->dx!=dx || c->dy!=dy)
  {
   if (c) delete c;
   c=new Tconvert(libmplayer,false,dx,dy);
  }
 Tpalette p(pal,numcolors);
 c->convert(incsp,src,srcStride,outcsp,dst,dstStride,&p);
 return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -