CoreVideo / IOSurface: неизвестный формат пикселей - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь захватить IOSurface, используя как CVPixelBufferCreateWithIOSurface, так и считывая пиксели из IOSurfaceGetBaseAddressOfPlane.

Однако на более новых устройствах (iPhone XS) я получаю неизвестный формат пикселей &wq2(опять же, используя IOSurfaceGetPixelFormat и CVPixelBufferGetPixelFormatType).

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как формат пикселей), но ломает на том, что я предполагаю, являются более новыми устройствами.Как я могу распаковать пиксели из этого недокументированного формата.

1 Ответ

1 голос
/ 03 мая 2019

У меня плохая привычка отвечать на свои вопросы.

Чтобы преобразовать это 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);
...