📄 umc_color_space_conversion.cpp
字号:
status = ippiBGRToYCrCb420_8u_AC4P3R(pSrc[0], pSrcStep[0], pDstYVU, pDstStepYVU, srcSize);
break;
case YUY2:
status = ippiBGRToYCbCr422_8u_AC4C2R(pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
case UYVY:
status = ippiBGRToCbYCr422_8u_AC4C2R(pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
case RGB24:
status = cc_BGRAToBGR(pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
default:
return UMC_ERR_NOT_IMPLEMENTED;
}
break;
case RGB555:
switch (dstFormat) {
case YUV420:
status = ippiBGR555ToYCrCb420_16u8u_C3P3R((const Ipp16u*)pSrc[0], pSrcStep[0], pDstYVU, pDstStepYVU, srcSize);
break;
case YUY2:
status = ippiBGR555ToYCbCr422_16u8u_C3C2R((const Ipp16u*)pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
case RGB24:
status = cc_BGR555ToBGR((const Ipp16u*)pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
default:
return UMC_ERR_NOT_IMPLEMENTED;
}
break;
case RGB565:
switch (dstFormat) {
case YUV420:
status = ippiBGR565ToYCrCb420_16u8u_C3P3R((const Ipp16u*)pSrc[0], pSrcStep[0], pDstYVU, pDstStepYVU, srcSize);
break;
case YUY2:
status = ippiBGR565ToYCbCr422_16u8u_C3C2R((const Ipp16u*)pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
case RGB24:
status = cc_BGR565ToBGR((const Ipp16u*)pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize);
break;
default:
return UMC_ERR_NOT_IMPLEMENTED;
}
break;
case Y41P:
switch (dstFormat) {
case YUV420:
status = cc_Y41P_to_I420(pSrc[0], pSrcStep[0], pDst, pDstStep, srcSize);
break;
default:
return UMC_ERR_NOT_IMPLEMENTED;
}
break;
default:
return UMC_ERR_NOT_IMPLEMENTED;
}
return (status == ippStsNoErr) ? UMC_OK : UMC_ERR_INVALID_PARAMS;
}
////////////////////////////////////////////////////////////////////////
static void ConvertImage_16s8u_C1R(const Ipp16s *pSrc,
Ipp32s iSrcStride,
Ipp32s iSrcBitsPerSample,
Ipp8u *pDst,
Ipp32s iDstStride,
IppiSize size)
{
int iWidth = size.width;
int iHeight = size.height;
int rnd = (1 << (iSrcBitsPerSample - 8 - 1));
Ipp32s x, y;
for (y = 0; y < iHeight; y += 1) {
for (x = 0; x < iWidth; x += 1) {
pDst[x] = (Ipp8u) ((pSrc[x] + rnd) >> (iSrcBitsPerSample - 8));
}
pSrc = (Ipp16s *) ((Ipp8u *) pSrc + iSrcStride);
pDst = pDst + iDstStride;
}
}
IppStatus cc_BGRAToBGR(const Ipp8u *pSrc,
Ipp32s iSrcStride,
Ipp8u *pDst,
Ipp32s iDstStride,
IppiSize srcSize)
{
int i, j ;
for (i = 0; i < srcSize.height; i++) {
for (j = 0; j < srcSize.width; j++) {
pDst[3*j + 0] = pSrc[4*j + 0];
pDst[3*j + 1] = pSrc[4*j + 1];
pDst[3*j + 2] = pSrc[4*j + 2];
}
pSrc += iSrcStride;
pDst += iDstStride;
}
return ippStsNoErr;
}
IppStatus cc_BGRToBGRA(const Ipp8u *pSrc,
Ipp32s iSrcStride,
Ipp8u *pDst,
Ipp32s iDstStride,
IppiSize srcSize)
{
int i, j ;
for (i = 0; i < srcSize.height; i++) {
for (j = 0; j < srcSize.width; j++) {
pDst[4*j + 0] = pSrc[3*j + 0];
pDst[4*j + 1] = pSrc[3*j + 1];
pDst[4*j + 2] = pSrc[3*j + 2];
pDst[4*j + 3] = 0;
}
pSrc += iSrcStride;
pDst += iDstStride;
}
return ippStsNoErr;
}
IppStatus cc_BGR555ToBGR(const Ipp16u *pSrc,
Ipp32s iSrcStride,
Ipp8u *pDst,
Ipp32s iDstStride,
IppiSize srcSize)
{
int i, j;
for (i = 0; i < srcSize.height; i++) {
for (j = 0; j < srcSize.width; j++) {
Ipp16u pix = pSrc[j];
//pDst[3*j + 0] = (Ipp8u)((pix >> 10) & 0x1f);
//pDst[3*j + 1] = (Ipp8u)((pix >> 5) & 0x1f);
//pDst[3*j + 2] = (Ipp8u)((pix & 0x1f) << 3);
pDst[3*j + 2] = (Ipp8u)((pix & 0x7c00) >> 7);
pDst[3*j + 1] = (Ipp8u)((pix & 0x03e0) >> 2);
pDst[3*j + 0] = (Ipp8u)((pix & 0x001f) << 3);
}
pSrc = (Ipp16u *) ((Ipp8u *) pSrc + iSrcStride);
pDst += iDstStride;
}
return ippStsNoErr;
}
IppStatus cc_BGR565ToBGR(const Ipp16u *pSrc,
Ipp32s iSrcStride,
Ipp8u *pDst,
Ipp32s iDstStride,
IppiSize srcSize)
{
int i, j;
for (i = 0; i < srcSize.height; i++) {
for (j = 0; j < srcSize.width; j++) {
Ipp16u pix = pSrc[j];
pDst[3*j + 2] = (Ipp8u)((pix & 0xf800) >> 8);
//pDst[3*j + 0] = (Ipp8u)((pix & 0x001f) << 3);
pDst[3*j + 1] = (Ipp8u)((pix & 0x07e0) >> 3);
pDst[3*j + 0] = (Ipp8u)((pix & 0x001f) << 3);
//pDst[3*j + 2] = (Ipp8u)((pix & 0xf800) >> 8);
}
pSrc = (Ipp16u *) ((Ipp8u *) pSrc + iSrcStride);
pDst += iDstStride;
}
return ippStsNoErr;
}
IppStatus cc_Y41P_to_I420(const Ipp8u *pSrc,
Ipp32s iSrcStride,
Ipp8u **pDst,
Ipp32s *iDstStride,
IppiSize srcSize)
{
Ipp8u *Y = pDst[0];
Ipp8u *U = pDst[1];
Ipp8u *V = pDst[2];
int Y_stride = iDstStride[0];
int U_stride = iDstStride[1];
int V_stride = iDstStride[2];
int i, j;
for (j = 0; j < srcSize.height; j++) {
for (i = 0; i < srcSize.width/8; i++) {
int U0 = pSrc[12*i + 0];
int Y0 = pSrc[12*i + 1];
int V0 = pSrc[12*i + 2];
int Y1 = pSrc[12*i + 3];
int U4 = pSrc[12*i + 4];
int Y2 = pSrc[12*i + 5];
int V4 = pSrc[12*i + 6];
int Y3 = pSrc[12*i + 7];
int Y4 = pSrc[12*i + 8];
int Y5 = pSrc[12*i + 9];
int Y6 = pSrc[12*i + 10];
int Y7 = pSrc[12*i + 11];
Y[8*i + 0] = (Ipp8u)Y0;
Y[8*i + 1] = (Ipp8u)Y1;
Y[8*i + 2] = (Ipp8u)Y2;
Y[8*i + 3] = (Ipp8u)Y3;
Y[8*i + 4] = (Ipp8u)Y4;
Y[8*i + 5] = (Ipp8u)Y5;
Y[8*i + 6] = (Ipp8u)Y6;
Y[8*i + 7] = (Ipp8u)Y7;
if (!(j & 1)) {
U[4*i + 0] = (Ipp8u)U0;
U[4*i + 1] = (Ipp8u)U0;
U[4*i + 2] = (Ipp8u)U4;
U[4*i + 3] = (Ipp8u)U4;
V[4*i + 0] = (Ipp8u)V0;
V[4*i + 1] = (Ipp8u)V0;
V[4*i + 2] = (Ipp8u)V4;
V[4*i + 3] = (Ipp8u)V4;
}
}
pSrc += iSrcStride;
Y += Y_stride;
if (j & 1) {
U += U_stride;
V += V_stride;
}
}
return (IppStatus)0;
}
IppStatus cc_I420_to_Y41P(const Ipp8u **pSrc,
Ipp32s *iSrcStride,
Ipp8u *pDst,
Ipp32s iDstStride,
IppiSize srcSize)
{
const Ipp8u *Y = pSrc[0];
const Ipp8u *U = pSrc[1];
const Ipp8u *V = pSrc[2];
int Y_stride = iSrcStride[0];
int U_stride = iSrcStride[1];
int V_stride = iSrcStride[2];
int i, j;
for (j = 0; j < srcSize.height; j++) {
for (i = 0; i < srcSize.width/8; i++) {
int Y0 = Y[8*i + 0];
int Y1 = Y[8*i + 1];
int Y2 = Y[8*i + 2];
int Y3 = Y[8*i + 3];
int Y4 = Y[8*i + 4];
int Y5 = Y[8*i + 5];
int Y6 = Y[8*i + 6];
int Y7 = Y[8*i + 7];
int U0 = U[4*i + 0];
int U4 = U[4*i + 2];
int V0 = V[4*i + 0];
int V4 = V[4*i + 2];
pDst[12*i + 0] = (Ipp8u)U0;
pDst[12*i + 1] = (Ipp8u)Y0;
pDst[12*i + 2] = (Ipp8u)V0;
pDst[12*i + 3] = (Ipp8u)Y1;
pDst[12*i + 4] = (Ipp8u)U4;
pDst[12*i + 5] = (Ipp8u)Y2;
pDst[12*i + 6] = (Ipp8u)V4;
pDst[12*i + 7] = (Ipp8u)Y3;
pDst[12*i + 8] = (Ipp8u)Y4;
pDst[12*i + 9] = (Ipp8u)Y5;
pDst[12*i + 10] = (Ipp8u)Y6;
pDst[12*i + 11] = (Ipp8u)Y7;
}
pDst += iDstStride;
Y += Y_stride;
if (j & 1) {
U += U_stride;
V += V_stride;
}
}
return (IppStatus)0;
}
IppStatus cc_YUV411_to_YUV420(const Ipp8u *pSrc[3],
Ipp32s pSrcStep[3],
Ipp8u *pDst[3],
Ipp32s pDstStep[3],
IppiSize srcSize)
{
Ipp32s h,w;
Ipp32s srcStepU , srcStepV ;
Ipp32s dstStepU , dstStepV ;
int width ;
int height ;
const Ipp8u* srcu;
const Ipp8u* srcv;
Ipp8u* dstu;
Ipp8u* dstv;
srcu = pSrc[1];
srcv = pSrc[2];
dstu = pDst[1];
dstv = pDst[2];
srcStepU = pSrcStep[1];
srcStepV = pSrcStep[2];
dstStepU = pDstStep[1];
dstStepV = pDstStep[2];
width = srcSize.width ;
height = srcSize.height;
/* Y plane */
ippiCopy_8u_C1R( pSrc[0], pSrcStep[0], pDst[0], pDstStep[0], srcSize );
for( h = 0; h < height ; h +=2)
{
for( w = 0; w < (width/4 -1) ;w ++ )
{
dstu[w*2] = srcu[w];
dstu[w*2+1] = (srcu[w] + srcu[w+1]) / 2;
dstv[w*2] = srcv[w];
dstv[w*2+1] = (srcv[w] + srcv[w+1]) / 2;
}
dstu[w*2] = dstu[w*2 + 1] = srcu[w];
dstv[w*2] = dstv[w*2 + 1] = srcv[w];
srcu += 2*srcStepU;
dstu += dstStepU;
srcv += 2*srcStepV;
dstv += dstStepV;
}
return (IppStatus)0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -