CoreVideo / IOSurface:未知像素格式
CoreVideo / IOSurface: unknown pixel format
我正在尝试使用 CVPixelBufferCreateWithIOSurface
和从 IOSurfaceGetBaseAddressOfPlane
中读取像素来捕获 IOSurface。
但是,在较新的设备 (iPhone XS) 上,我得到一个未知的像素格式 &wq2
(同样,同时使用 IOSurfaceGetPixelFormat
和 CVPixelBufferGetPixelFormatType
)。
CVPixelFormatDescriptionCreateWithPixelFormatType
returns 如下:
@"{\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}"
我的代码在旧设备上运行良好(它 returns 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);
我正在尝试使用 CVPixelBufferCreateWithIOSurface
和从 IOSurfaceGetBaseAddressOfPlane
中读取像素来捕获 IOSurface。
但是,在较新的设备 (iPhone XS) 上,我得到一个未知的像素格式 &wq2
(同样,同时使用 IOSurfaceGetPixelFormat
和 CVPixelBufferGetPixelFormatType
)。
CVPixelFormatDescriptionCreateWithPixelFormatType
returns 如下:
@"{\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}"
我的代码在旧设备上运行良好(它 returns 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);