Мне нужно отобразить ряд форматов пикселей OSX CoreVideo, перечисленных в CVPixelBuffer.h
к их эквивалентам в V4L
, Например, kCVPixelFormatType_24RGB
будет отображаться в V4L2_PIX_FMT_RGB24
,
Я пытался соответствовать, используя fourcc
, но определения для OSX и V4L не совпадают. Помимо проверки их точного расположения и сопоставления с ними вручную, есть способ программно или информационная таблица, которая покажет мне, например, где kCVPixelFormatType_422YpCbCr8
будет на карту?
Core Video определенно не был предназначен для взаимодействия с системами других производителей, а совместимость Core Video никогда не была целью для 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_PIX_FMT_UYVY
, Ниже приведена карта форматов пикселя Core Video в форматы V4L, построенная с использованием этой информации. Если формат не отображается в таблице, это означает, что он не поддерживается в обеих библиотеках. Эта информация не основана ни на каком фактическом тестировании, поэтому она может быть неверной.
Обратите внимание, что только две 8-битные форматы являются общими для двух библиотек. Даже в тех случаях, когда они поддерживают одинаковые 16- или 32-битные форматы, они не связаны с порядковыми номерами. Например, kCVPixelFormatType_16Gray
не отображается на V4L2_PIX_FMT_Y16
, потому что первый — с прямым порядком байтов, а второй — с прямым порядком байтов.
| 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 |
* Версия Core Video содержит заголовок с прямым порядком байтов, состоящий из того, где расположены плоскости и сколько байтов в строке имеет каждая плоскость. В версии V4L этого нет, поэтому вам придется удалить ее, чтобы перейти с CoreVideo на V4L, и добавить ее, чтобы перейти с V4L на Core Video.