将YUV的单个BYTE *解包为每个平面的3个BYTE *指针

时间:2015-10-19 18:52:51

标签: c++ yuv

我不熟悉YUV以及如何打包数据。鉴于我有以下代码......

int width = 1920;
int height = 1080;
BYTE* yuvData = GetFrame();

...我如何将yuvData解压缩到具有以下签名的方法中......

Display(BYTE* pYplane, BYTE* pVplane, BYTE* pUplane)

YUV缓冲区采用平面格式。

1 个答案:

答案 0 :(得分:0)

这取决于您未在问题中指定的YUV格式类型。以下链接对各种YUV类型有很好的解释和说明:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750%28v=vs.85%29.aspx

http://www.fourcc.org/yuv.php

例如,一种常用的YUV类型是YUV420平面。在这种格式中,色度分量以2:1水平下采样,2:1垂直下采样。这意味着对于每4个亮度(Y)值,您有一个色度(1U + 1V)分量(请参见视觉链接中的插图)。 plane 告诉您首先拥有所有亮度分量,然后是所有U分量,然后是所有V分量。因此

int iSizeY = width * height;
int iSizeUV = (width * height)/4;
BYTE* pY = yuvData;
BYTE* pU = yuvData + iSizeY // there are width * height Y components
BYTE* pV = pU + iSizeUV;    // skip the U components