CVPixelBufferGetBaseAddressOfPlane

本文关键字:CVPixelBufferGetBaseAddressOfPlane | 更新日期: 2023-09-27 18:27:24

如何在java、c#或c++等其他语言中复制CVPixelBufferGetBaseAddressOfPlane的功能?

CVPixelBufferGetBaseAddressOfPlane

YUV420SP格式由两个平面组成。第一平面包含亮度信息(Y值),第二平面包含色度值(U和V值)。此外,每个像素都有一个Y值,但每个2乘2像素块只有一个U值和一个V值。最后,U和V值在第二平面中交错。

所以你的字节数组很可能是这样组织的(每个字节都包含一个Y、U或V值):

YYYYY ... YYYYUVUV ... UVUV

让我们假设图像是400乘300像素。然后有120000个Y值,然后是30000个U/V对。

由于您使用的是Java,而Java没有可以指向数组中间的指针,因此您需要使用数组索引而不是地址。因此,CVPixelBufferGetBaseAddressOfPlane的一个或多或少等效的实现可能看起来像这样:

int GetBaseIndexOfPlane(int plane, int imageWidth, int imageHeight)
{
    if (plane == 0)
        return 0;
    else
        return imageWidth * imageHeight;
}

很可能,您的图像数据不包含任何有关图像大小的信息。因此,您必须从其他地方获得这些信息,并将其提供给该方法。另一方面,您不需要向该方法提供字节数组。不需要计算任何平面的偏移。

太棒了!但正如你所说,Java没有指针,所以我无法将平面传递给OpenGL:

// Y plane
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, bufferWidth, bufferHeight, 0, GL_LUMINANCE,
GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddressOfPlane(frame, 0));
// UV Plane
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, bufferWidth / 2, bufferHeight / 2, 0, 
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddressOfPlane(frame, 1));

如果我错了,请纠正我,但是,获得平面的开始/结束,然后创建2个新的缓冲区(Y&UV)是否正确?在iOS中,我可以传递指针,但在Java中,除了重新创建2个缓冲区,我看不到其他方法。

相关文章:
  • 没有找到相关文章