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

📄 umc_color_space_conversion.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      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 + -