我正在使用独立的硬件开发板来执行计算机视觉操作。这是一个例子,为了存储和YUV帧到DDR存储器。但我对YUV帧缓冲区代码感到困惑,该代码声明如下:
extern U8 inputFrame
void InitTestBuffers(int width, int height)
{
testFrameSpec.width = width;
testFrameSpec.height = height;
testFrameSpec.stride = width;
testFrameSpec.type = YUV420p;
testFrameSpec.bytesPP = 1;
inBuffer.spec = testFrameSpec;
//******************NEED TO KNOW THE BELOW PART***************
inBuffer.p1 = (u8*)(&inputFrame);
inBuffer.p2 = (u8*)((u32)(&inputFrame) + width * height);
inBuffer.p3 = (u8*)((u32)(&inputFrame) + width * height + width * height / 4);
//p1,p2,p3 are pointers to 1,2 and 3 image plane
//*************************************************************
return;
}
即使在某些地方,它也会在下面列出缓冲帧
static u8 FRAMES outputFrame[FRAME_WIDTH * FRAME_HEIGHT * 3 / 2];
以下是他们使用这些概念但以不同方式使用的一个示例:
我的问题不是关于代码理解,但我不明白为什么需要这个计算(概念上)。
答案 0 :(得分:0)
在这种情况下,您似乎处理平面YCbCr。平面意味着每个颜色分量存储在单独的阵列(也称为平面)中。这与打包格式相反,其中颜色分量全部存储在一个阵列中(Y Y Y Y Cb Cr或类似图案)。
所以inBuffer.p1
将包含一个指向包含width x height
个Y值的数组的指针。 inBuffer.p2
和inBuffer.p3
将包含指向分别包含width x height / 4
Cb和Cr值的数组的指针。 / 4
是因为每4个Y值使用一个Cb和Cr值。