C++ 将像素格式从CVPixelBuffer映射到其等效的V4L

C++ 将像素格式从CVPixelBuffer映射到其等效的V4L,c++,objective-c,macos,video,v4l,C++,Objective C,Macos,Video,V4l,我需要将CVPixelBuffer.h中列举的一系列OSX CoreVideo像素格式映射到V4L中的等效格式。例如,kCVPixelFormatType\u 24RGB将映射到V4L2\u PIX\u FMT\u RGB24 我尝试使用fourcc进行匹配,但OSX和V4L的定义不匹配。除了检查它们的精确布局并手动匹配之外,是否有一种编程方式或一个信息表可以向我显示kCVPixelFormatType_422YpCbCr8将映射到哪里?核心视频绝对不是为了与非苹果系统互操作而设计的,核心视频兼

我需要将
CVPixelBuffer.h
中列举的一系列OSX CoreVideo像素格式映射到
V4L
中的等效格式。例如,
kCVPixelFormatType\u 24RGB
将映射到
V4L2\u PIX\u FMT\u RGB24


我尝试使用
fourcc
进行匹配,但OSX和V4L的定义不匹配。除了检查它们的精确布局并手动匹配之外,是否有一种编程方式或一个信息表可以向我显示
kCVPixelFormatType_422YpCbCr8
将映射到哪里?

核心视频绝对不是为了与非苹果系统互操作而设计的,核心视频兼容性从来都不是V4L的目标,所以有些像素格式只存在于一个库中。有些格式(如RGB24)在这两种格式中都存在,因为它们是Linux和OS X/iOS都需要处理的常见格式。要确认两种像素格式相同,您需要预期它们的布局并手动匹配它们。两个库中都没有函数为您进行映射

也就是说,CVPixelBuffer.h和videodev2.h中有非常好的注释,可以让您自信地匹配像素格式。映射某些格式的关键是要理解YUV和Y'CbCr经常互换使用。根据,

术语Y'UV、YUV、YCbCr、YPbPr等的范围有时模棱两可,相互重叠。历史上,术语YUV和Y'UV用于电视系统中颜色信息的特定模拟编码,而YCbCr用于适合视频和静态图像压缩和传输(如MPEG和JPEG)的颜色信息的数字编码。今天,术语YUV在计算机行业中常用来描述使用YCbCr编码的文件格式

V4L的像素格式中也有一些注释,这有助于将CVPixelBuffer.h中的注释与V4L格式相匹配

您特别询问了
kCVPixelFormatType_422YpCbCr8
将映射到什么。根据这些信息,它应该映射到
V4L2\u PIX\u FMT\u UYVY
。下面是使用此信息构建的核心视频像素格式到V4L格式的映射。如果表中没有显示格式,则表示两个库都不支持该格式。此信息并非基于任何实际测试,因此可能不正确

请注意,两个库之间似乎只有8位格式是通用的。即使在它们似乎支持相同的16位或32位格式的情况下,它们也不支持,因为endian的差异。例如,
kCVPixelFormatType_16Gray
不映射到
V4L2_PIX_FMT_Y16
,因为前者是大端,后者是小端


|核心视频|视频4Linux|
|kCVPixelFormatType_16BE555 | V4L2_PIX_FMT_RGB555X|
|kCVPixelFormatType_16LE555 | V4L2_PIX_FMT_RGB555|
|kCVPixelFormatType_16BE565124L2_PIX_FMT_RGB565X|
|kCVPixelFormatType_16LE565|V4L2_PIX_FMT_RGB565|
|kCVPixelFormatType_24RGB|V4L2_PIX_FMT_RGB24|
|kCVPixelFormatType|U 24BGR|V4L2|U PIXUFMT|U BGR24|
|kCVPixelFormatType_32ARGB|V4L2_PIX_FMT_RGB32|
|kCVPixelFormatType_32BGRA|V4L2_PIX_FMT_BGR32|
|kCVPixelFormatType_422YpCbCr8 | V4L2_PIX_FMT_UYVY|
|kCVPixelFormatType_420YpCbCr8Planar*| V4L2_PIX_FMT_YUV420|
|kCVPixelFormatType_422YpCbCr8_YUV | V4L2_PIX_FMT_YUYV|

*核心视频版本包含一个大端头,包括平面的位置以及每个平面每行有多少字节。V4L版本没有此功能,因此您必须将其从CoreVideo删除到V4L,然后将其添加到Core Video