我正在尝试使用CVPixelBufferCreateWithIOSurface
和从IOSurfaceGetBaseAddressOfPlane
读取像素来捕获IOSurface。
但是,在较新的设备(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
作为像素格式(,但在我认为是较新的设备上分解。如何从这种未记录的格式中解组像素。
我有一个回答自己问题的坏习惯。
要将此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);