一、YV12格式说明
二、NV12格式说明
三、YUV420格式一览
四、 NV12转RGB24kernel函数实现
/*
* pYdata:Y分量数据起始地址
* pUVdata:UV分量数据起始地址
* stepY:Y分量一行的宽度,等于图像一行的像素点数
* stepUV:UV分量一行的宽度,等于图像一行的像素点数
* pImgData:输出的RGB数据
* channels:rgb共3个channel,所以这个参数是3
*/
__global__ void YCrCb2RGBConver(uchar *pYdata, uchar *pUVdata,int stepY, int stepUV, uchar *pImgData, int width, int height, int channels)
{
const int tidx = blockIdx.x * blockDim.x + threadIdx.x;
const int tidy = blockIdx.y * blockDim.y + threadIdx.y;
if (tidx < width && tidy < height)
{
int indexY, indexU, indexV;
uchar Y, U, V;
indexY = tidy * stepY + tidx;
Y = pYdata[indexY]; /* Y分量的值 */
/* 偶数列UV分量的值 */
if (tidx % 2 == 0)
{
indexU = tidy / 2 * stepUV + tidx;
indexV = tidy / 2 * stepUV + tidx + 1;
U = pUVdata[indexU]; /* U分量的值 */
V = pUVdata[indexV]; /* V分量的值 */
}
else if (tidx % 2 == 1) /* 奇数列UV分量的值 */
{
indexV = tidy / 2 * stepUV + tidx;
indexU = tidy / 2 * stepUV + tidx - 1;
U = pUVdata[indexU];
V = pUVdata[indexV];
}
pImgData[(tidy*width + tidx) * channels + 2] = uchar (Y + 1.402 * (V - 128));
pImgData[(tidy*width + tidx) * channels + 1] = uchar (Y - 0.34413 * (U - 128) - 0.71414*(V - 128));
pImgData[(tidy*width + tidx) * channels + 0] = uchar (Y + 1.772*(U - 128));
}
}
参考资料: