将 YUV 的单个 BYTE* 解包为每个平面的 3 BYTE* 指针
Unpacking a single BYTE* of a YUV into 3 BYTE* pointers for each plane
我不熟悉 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 planar。在这种格式中,色度分量在水平方向下采样 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
我不熟悉 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 planar。在这种格式中,色度分量在水平方向下采样 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