YUV帧层计算 - 需要概念性理解

时间:2017-04-19 10:48:21

标签: c++ c video framebuffer yuv

我正在使用独立的硬件开发板来执行计算机视觉操作。这是一个例子,为了存储和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];

以下是他们使用这些概念但以不同方式使用的一个示例:

YUV

我的问题不是关于代码理解,但我不明白为什么需要这个计算(概念上)。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您似乎处理平面YCbCr。平面意味着每个颜色分量存储在单独的阵列(也称为平面)中。这与打包格式相反,其中颜色分量全部存储在一个阵列中(Y Y Y Y Cb Cr或类似图案)。 所以inBuffer.p1将包含一个指向包含width x height个Y值的数组的指针。 inBuffer.p2inBuffer.p3将包含指向分别包含width x height / 4 Cb和Cr值的数组的指针。 / 4是因为每4个Y值使用一个Cb和Cr值。