📄 tconvert.cpp
字号:
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 + -