将YUV的单个BYTE*拆分成每个平面的3个BYTE*指针

Unpacking a single BYTE* of a YUV into 3 BYTE* pointers for each plane

本文关键字:BYTE 平面 3个 指针 拆分 YUV 单个      更新时间:2023-10-16

我不熟悉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

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

例如,一种常用的YUV类型是YUV420平面。在这种格式中,色度组件水平向下采样2:1,垂直向下采样2:1。这意味着对于每4个亮度(Y)值,你有一个色度(1U + 1V)组件(参见链接中的图示)。平面告诉你,你首先有所有的亮度分量,然后是所有的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