#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);