评论

收藏

[C++] YV12转RGB24

编程语言 编程语言 发布于:2021-07-11 10:40 | 阅读数:372 | 评论:0

BOOL YV12RGB24(BYTE *yuv, BYTE *rgb)
{
if (!yuv || !rgb)
    return FALSE;
 
  BYTE* yData = yuv;
  BYTE* vData = yuv + frameWidth*frameHeight*5/4;
  BYTE* uData = yuv + frameWidth*frameHeight;
  if (!uData || !vData)
return FALSE;
  for (int iRow = 0; iRow < frameHeight; iRow++)
  {
    for (int jCol = 0; jCol < frameWidth; jCol++)
    {
      int Y = yData[iRow*frameWidth + jCol];
      int U = uData[(iRow / 2)*(frameWidth / 2) + (jCol / 2)];
      int V = vData[(iRow / 2)*(frameWidth / 2) + (jCol / 2)];
      int R = Y + (U - 128) + (((U - 128) * 103) >> 8);
      int G = Y - (((V - 128) * 88) >> 8) - (((U - 128) * 183) >> 8);
      int B = Y + (V - 128) + (((V - 128) * 198) >> 8);
 
      // r分量值 
      R = R<0 ? 0 : R;
rgb[3 * (iRow*frameWidth + jCol) + 2] = R > 255 ? 255 : R;
      // g分量值
      G = G<0 ? 0 : G;
rgb[3 * (iRow*frameWidth + jCol) + 1] = G>255 ? 255 : G;
      // b分量值 
      B = B<0 ? 0 : B;
rgb[3 * (iRow*frameWidth + jCol) + 0] = B>255 ? 255 : B;
    }
  }
  return TRUE;
}
//算法优化加速
BOOL YV12RGB24(BYTE *yuv, BYTE *rgb)
{
if (!yuv || !rgb)
    return FALSE;
 
  BYTE* yData = yuv;
BYTE* vData = yuv + frameWidth*frameHeight + frameWidth/2 * frameHeight/2;
  BYTE* uData = yuv + frameWidth*frameHeight;
  if (!uData || !vData)
return FALSE;
BYTE *pRGB = rgb;
  for (int iRow = 0; iRow < frameHeight; iRow++)
  {
int iIndex = (iRow >> 1)*(frameWidth >> 1);
    for (int jCol = 0; jCol < frameWidth; jCol++)
    {
      int Y = yData[iRow*frameWidth + jCol];
int U = uData[iIndex + (jCol >> 1)];
int V = vData[iIndex + (jCol >> 1)];
      int R = Y + (U - 128) + (((U - 128) * 103) >> 8);
      int G = Y - (((V - 128) * 88) >> 8) - (((U - 128) * 183) >> 8);
      int B = Y + (V - 128) + (((V - 128) * 198) >> 8);
 
// b分量值 
if (B >= 0 && B <= 255)
*pRGB++ = B;
else *pRGB++ = B < 0 ? 0 : 255;
// g分量值
if (G >= 0 && G <= 255)
*pRGB++ = G;
else *pRGB++ = G < 0 ? 0 : 255;
      // r分量值 
if (R >= 0 && R <= 255)
*pRGB++ = R;
else *pRGB++ = R < 0 ? 0 : 255;
    }
  }
  return TRUE;
}
  
关注下面的标签,发现更多相似文章