【问题标题】:Unpacking a single BYTE* of a YUV into 3 BYTE* pointers for each plane将 YUV 的单个 BYTE* 解压缩为每个平面的 3 个 BYTE* 指针
【发布时间】: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 缓冲区是平面格式。

【问题讨论】:

    标签: c++ yuv


    【解决方案1】:

    这取决于您在问题中未指定的 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) 分量(请参阅链接中的插图以获得视觉效果)。 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
    

    【讨论】:

    • 这就是我想要的!我现在看到字节流是 2y 1u 1v 块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多