CoreVideo / IOSurface:未知像素格式



我正在尝试使用CVPixelBufferCreateWithIOSurface和从IOSurfaceGetBaseAddressOfPlane读取像素来捕获IOSurface。

但是,在较新的设备(iPhone XS(上,我得到了一个未知的像素格式&wq2(再次使用IOSurfaceGetPixelFormatCVPixelBufferGetPixelFormatType(。

CVPixelFormatDescriptionCreateWithPixelFormatType返回以下内容:

@"{n    BitsPerComponent = 10;n    ComponentRange = FullRange;n    ContainsAlpha = 1;n    ContainsGrayscale = 0;n    ContainsRGB = 1;n    ContainsYCbCr = 0;n    PixelFormat = 645346401;n    Planes =     (n                {n            BitsPerBlock = 64;n            CompressionType = 2;n            TileHeight = 16;n            TileWidth = 16;n        }n    );n}"

我的代码在较旧的设备上完美运行(它返回BGRA作为像素格式(,但在我认为是较新的设备上分解。如何从这种未记录的格式中解组像素。

我有一个回答自己问题的坏习惯。

要将此IOSurface转换为具有已知像素类型的IOSurface,应使用IOAccelerator

    CFMutableDictionary dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);;
    char pixelFormat[4] = {'A', 'R', 'G', 'B'};
    CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bytesPerRow));
    CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bytesPerElement));
    CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &width));
    CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &height));
    CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat));
    CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bufferSize));
    IOSurfaceRef surface = IOSurfaceCreate(dict);
    auto const didCreateAccelerator = IOSurfaceAcceleratorCreate(kCFAllocatorDefault, 0, &accelerator);

相关内容

  • 没有找到相关文章

最新更新