CoreVideo / IOSurface: неизвестный формат пикселей

#ios #core-video #iosurface

#iOS #ядро-видео #iosurface

Вопрос:

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

Однако на более новых устройствах (iPhone XS) я получаю неизвестный формат пикселей amp;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:

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

Чтобы преобразовать это, IOSurface скажем, в IOSurface с известным типом пикселей, IOAccelerator следует использовать.

     CFMutableDictionary dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, amp;kCFTypeDictionaryKeyCallBacks, amp;kCFTypeDictionaryValueCallBacks);;
    char pixelFormat[4] = {'A', 'R', 'G', 'B'};

    CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;bytesPerRow));
    CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;bytesPerElement));
    CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;width));
    CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;height));
    CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat));
    CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;bufferSize));
    IOSurfaceRef surface = IOSurfaceCreate(dict);

    auto const didCreateAccelerator = IOSurfaceAcceleratorCreate(kCFAllocatorDefault, 0, amp;accelerator);