【发布时间】:2015-10-20 04:05:06
【问题描述】:
我不熟悉 YUV 以及数据是如何打包的。鉴于我有以下代码...
int width = 1920;
int height = 1080;
BYTE* yuvData = GetFrame();
...我如何将yuvData 解压缩到具有以下签名的方法中...
Display(BYTE* pYplane, BYTE* pVplane, BYTE* pUplane)
YUV 缓冲区是平面格式。
【问题讨论】:
我不熟悉 YUV 以及数据是如何打包的。鉴于我有以下代码...
int width = 1920;
int height = 1080;
BYTE* yuvData = GetFrame();
...我如何将yuvData 解压缩到具有以下签名的方法中...
Display(BYTE* pYplane, BYTE* pVplane, BYTE* pUplane)
YUV 缓冲区是平面格式。
【问题讨论】:
这取决于您在问题中未指定的 YUV 格式类型。以下链接对各种 YUV 类型有很好的解释和说明:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750%28v=vs.85%29.aspx
例如,一种常用的 YUV 类型是 YUV420 平面。在这种格式中,色度分量水平下采样 2:1,垂直下采样 2:1。这意味着对于每 4 个亮度 (Y) 值,您有一个色度 (1U + 1V) 分量(请参阅链接中的插图以获得视觉效果)。 planar 告诉您首先拥有所有亮度分量,然后是所有 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
【讨论】: