gpt4 book ai didi

ios - initWithCVPixelBuffer 失败,因为 CVPixelBufferRef 不是非 IOSurface 支持的

转载 作者:行者123 更新时间:2023-11-28 18:25:39 28 4
gpt4 key购买 nike

我收到 YUV 帧 (kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange),当从 CVPixelBufferRef 创建 CIImage 时,我得到:

initWithCVPixelBuffer failed because the CVPixelBufferRef is not non-IOSurface backed.

CVPixelBufferRef pixelBuffer;

size_t planeWidth[] = { width, width / 2 };
size_t planeHeight[] = { height, height / 2};
size_t planeBytesPerRow[] = { width, width / 2 };

CVReturn ret = CVPixelBufferCreateWithBytes(
kCFAllocatorDefault, width, height, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
data, bytesPerRow, 0, 0, 0, &pixelBuffer
);

if (ret != kCVReturnSuccess)
{
NSLog(@"FAILED");

CVPixelBufferRelease(pixelBuffer);

return;
}

CVPixelBufferLockBaseAddress(pixelBuffer, 0);

// fails
CIImage * image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer];

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

CVPixelBufferRelease(pixelBuffer);

[image release];

最佳答案

我假设问题是:“为什么会出现此错误?”

要使 CVPixelBuffer IOSurface 得到支持,您需要在创建 CVPixelBuffer 时设置其属性。现在,您将“0”作为 CVPixelBufferCreateWithBytes 中倒数第二个参数传递。

在 CVPixelBufferCreate 中传递带有 kCVPixelBufferIOSurfacePropertiesKey 键和值为空字典的字典(使用默认的 IOSurface 选项,其他未记录)(因为您不能将 kCVPixelBufferIOSurfacePropertiesKey 与 CVPixelBufferCreateWithBytes 一起使用),将正确的字节复制到创建的 CVPixelBuffer (不要忘记字节对齐)。这就是你如何让它支持 IOSurface。

虽然我不确定它是否会因为像素格式而为您消除所有错误。我的理解是 GPU 必须能够以该像素格式保存纹理才能用作 IOSurfaces,尽管我不是 100% 确定。

注意:可以在 this SO answer 中找到 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange 的正确复制像素字节.

关于ios - initWithCVPixelBuffer 失败,因为 CVPixelBufferRef 不是非 IOSurface 支持的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com