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

时间:2014-04-28 12:59:05

标签: c++ objective-c macos video v4l

我需要将CVPixelBuffer.h中列举的一系列OSX CoreVideo像素格式映射到V4L中的等效格式。例如,kCVPixelFormatType_24RGB会映射到V4L2_PIX_FMT_RGB24

我尝试使用fourcc匹配,但OSX和V4L的定义不匹配。除了检查他们的确切布局并手动匹配它们之外还有一种编程方式或信息表格,例如kCVPixelFormatType_422YpCbCr8将映射到哪里?

1 个答案:

答案 0 :(得分:5)

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

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

  

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

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

您明确询问了kCVPixelFormatType_422YpCbCr8将映射到的内容。根据此信息,它应映射到V4L2_PIX_FMT_UYVY。下面是使用此信息构建的核心视频像素格式到V4L格式的映射。如果表格中没有显示格式,则表示两个库都不支持该格式。此信息不是基于任何实际测试,因此可能不正确。

请注意,两个库之间只有8位格式。即使在它们似乎支持相同的16位或32位格式的情况下,它们也不会由于字节序差异。例如,kCVPixelFormatType_16Gray不会映射到V4L2_PIX_FMT_Y16,因为前者是big-endian,后者是little-endian。

| Core Video | Video4Linux | | kCVPixelFormatType_16BE555 | V4L2_PIX_FMT_RGB555X | | kCVPixelFormatType_16LE555 | V4L2_PIX_FMT_RGB555 | | kCVPixelFormatType_16BE565 | V4L2_PIX_FMT_RGB565X | | kCVPixelFormatType_16LE565 | V4L2_PIX_FMT_RGB565 | | kCVPixelFormatType_24RGB | V4L2_PIX_FMT_RGB24 | | kCVPixelFormatType_24BGR | V4L2_PIX_FMT_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_yuvs | V4L2_PIX_FMT_YUYV |

*核心视频版本包含一个big-endian标题,包含平面所在的位置以及每个平面每行的字节数。 V4L版本没有这个,因此您必须将其从CoreVideo移至V4L,并将其添加为从V4L转为核心视频。