Почему видео в формате 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, я не смог найти аналогичный пример качества для записи. Если такой существует, он может показать недостающую часть.

0 ответов

Другие вопросы по тегам