Почему видео в формате v210 не показывается как таковое через петлевое устройство V4L?
В приложении пользовательского пространства я записываю видеоданные в формате v210 на устройство обратной связи V4L2. Когда я смотрю видео в VLC или другом средстве просмотра, я просто получаю clownbarf и заявляю, что поток является UYUV или другим, а не v210. Я подозреваю, что мне нужно сказать устройству обратной связи нечто большее, чем то, что у меня есть, чтобы поток выглядел как v210 для зрителя. Есть ли еще одно место / способ сказать, что он будет обрабатывать определенный формат?
Что я делаю сейчас:
int frame_w, frame_h = ((some sane values))
outputfd = open("/dev/video4", O_RDWR);
// check VIDIOC_QUERYCAPS, ...
struct v4l2_format fmt;
memset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
fmt.fmt.pix.width = frame_w;
fmt.fmt.pix.height = frame_h;
fmt.fmt.pix.bytesperline = inbpr; // no padding
fmt.fmt.pix.field = 1;
fmt.fmt.pix.sizeimage = frame_h * fmt.fmt.pix.bytesperline;
fmt.fmt.pix.colorspace = V4L2_COLORSPACE_SRGB;
v210width = (((frame_w+47)/48)*48); // round up to mult of 48 px
byte_per_row = (v210width*8)/3;
fmt.fmt.pix.pixelformat = 'v' | '2' << 8 | '1' << 16 | '0' << 24;
fmt.fmt.pix.width = v210width;
fmt.fmt.pix.bytesperline = byte_per_row ;
ioctl(outputfd, VIDIOC_S_FMT, &fmt);
// later, in some inner loop...
... write stuff to uint8_t buffer[] ...
write(outputfd, buffer, buffersize);
Если я напишу формат UYVY, или RGB или другие, это может быть сделано для работы. Зрители показывают видео и сообщают правильный формат.
Этот код основан на примерах, чтении документов V4L и некотором рабочем внутреннем коде. Здесь никто точно не знает, что нужно сделать, чтобы открыть и записать видеоустройство.
Несмотря на то, что в Интернете легко найти пример, как читать видео с устройства V4L, я не смог найти аналогичный пример качества для записи. Если такой существует, он может показать недостающую часть.