NVIDIA CUDA YUV (NV12)到RGB转换算法分解



我正在尝试修改NVIDIA Video SDK样例代码中提供的原始YUV->RGB内核,我需要帮助来理解其中的一些部分。

内核代码:

template<class YuvUnitx2, class Rgb, class RgbIntx2>
__global__ static void YuvToRgbKernel(uint8_t* pYuv, int nYuvPitch, uint8_t* pRgb, int nRgbPitch, int nWidth, int nHeight) {
int x = (threadIdx.x + blockIdx.x * blockDim.x) * 2;
int y = (threadIdx.y + blockIdx.y * blockDim.y) * 2;
if (x + 1 >= nWidth || y + 1 >= nHeight) {
return;
}
uint8_t* pSrc = pYuv + x * sizeof(YuvUnitx2) / 2 + y * nYuvPitch;
uint8_t* pDst = pRgb + x * sizeof(Rgb) + y * nRgbPitch;
YuvUnitx2 l0 = *(YuvUnitx2*)pSrc;
YuvUnitx2 l1 = *(YuvUnitx2*)(pSrc + nYuvPitch);
YuvUnitx2 ch = *(YuvUnitx2*)(pSrc + (nHeight - y / 2) * nYuvPitch);
//YuvToRgbForPixel - returns rgba encoded in uint32_t (.d)
*(RgbIntx2*)pDst = RgbIntx2{
YuvToRgbForPixel<Rgb>(l0.x, ch.x, ch.y).d,
YuvToRgbForPixel<Rgb>(l0.y, ch.x, ch.y).d,
};
*(RgbIntx2*)(pDst + nRgbPitch) = RgbIntx2{
YuvToRgbForPixel<Rgb>(l1.x, ch.x, ch.y).d,
YuvToRgbForPixel<Rgb>(l1.y, ch.x, ch.y).d,
};
}

以下是我的基本假设,其中一些可能是错误的:

  1. NV12有两个平面,1用于亮度,2用于交错色度。
  2. 内核尝试一次写4个像素。

如果假设2是正确的,问题是为什么相同的色度(ch)值用于所有4个像素?如果我错了,请解释一下这里到底发生了什么。

对NV12或NV21上的色度面进行2倍的次采样。

对于输出中的每个2x2宏像素,有4个luma (Y)通道,1个Cb和1个Cr元素。

相关内容

  • 没有找到相关文章

最新更新