29 case MEDIA_BUS_FMT_FIXED:
return "FIXED";
30 case MEDIA_BUS_FMT_RGB444_1X12:
return "RGB444_1X12";
35 case MEDIA_BUS_FMT_RGB565_1X16:
return "RGB565_1X16";
36 case MEDIA_BUS_FMT_BGR565_2X8_BE:
return "BGR565_2X8_BE";
37 case MEDIA_BUS_FMT_BGR565_2X8_LE:
return "BGR565_2X8_LE";
38 case MEDIA_BUS_FMT_RGB565_2X8_BE:
return "RGB565_2X8_BE";
39 case MEDIA_BUS_FMT_RGB565_2X8_LE:
return "RGB565_2X8_LE";
40 case MEDIA_BUS_FMT_RGB666_1X18:
return "RGB666_1X18";
41 case MEDIA_BUS_FMT_RBG888_1X24:
return "RBG888_1X24";
43 case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
return "RGB666_1X7X3_SPWG";
44 case MEDIA_BUS_FMT_BGR888_1X24:
return "BGR888_1X24";
45 case MEDIA_BUS_FMT_GBR888_1X24:
return "GBR888_1X24";
46 case MEDIA_BUS_FMT_RGB888_1X24:
return "RGB888_1X24";
47 case MEDIA_BUS_FMT_RGB888_2X12_BE:
return "RGB888_2X12_BE";
48 case MEDIA_BUS_FMT_RGB888_2X12_LE:
return "RGB888_2X12_LE";
49 case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
return "RGB888_1X7X4_SPWG";
51 case MEDIA_BUS_FMT_ARGB8888_1X32:
return "ARGB8888_1X32";
52 case MEDIA_BUS_FMT_RGB888_1X32_PADHI:
return "RGB888_1X32_PADHI";
56 case MEDIA_BUS_FMT_Y8_1X8:
return "Y8_1X8";
57 case MEDIA_BUS_FMT_UV8_1X8:
return "UV8_1X8";
58 case MEDIA_BUS_FMT_UYVY8_1_5X8:
return "UYVY8_1_5X8";
59 case MEDIA_BUS_FMT_VYUY8_1_5X8:
return "VYUY8_1_5X8";
60 case MEDIA_BUS_FMT_YUYV8_1_5X8:
return "YUYV8_1_5X8";
61 case MEDIA_BUS_FMT_YVYU8_1_5X8:
return "YVYU8_1_5X8";
62 case MEDIA_BUS_FMT_UYVY8_2X8:
return "UYVY8_2X8";
63 case MEDIA_BUS_FMT_VYUY8_2X8:
return "VYUY8_2X8";
64 case MEDIA_BUS_FMT_YUYV8_2X8:
return "YUYV8_2X8";
65 case MEDIA_BUS_FMT_YVYU8_2X8:
return "YVYU8_2X8";
66 case MEDIA_BUS_FMT_Y10_1X10:
return "Y10_1X10";
67 case MEDIA_BUS_FMT_UYVY10_2X10:
return "UYVY10_2X10";
68 case MEDIA_BUS_FMT_VYUY10_2X10:
return "VYUY10_2X10";
69 case MEDIA_BUS_FMT_YUYV10_2X10:
return "YUYV10_2X10";
70 case MEDIA_BUS_FMT_YVYU10_2X10:
return "YVYU10_2X10";
71 case MEDIA_BUS_FMT_Y12_1X12:
return "Y12_1X12";
72 case MEDIA_BUS_FMT_UYVY12_2X12:
return "UYVY12_2X12";
73 case MEDIA_BUS_FMT_VYUY12_2X12:
return "VYUY12_2X12";
74 case MEDIA_BUS_FMT_YUYV12_2X12:
return "YUYV12_2X12";
75 case MEDIA_BUS_FMT_YVYU12_2X12:
return "YVYU12_2X12";
76 case MEDIA_BUS_FMT_UYVY8_1X16:
return "UYVY8_1X16";
77 case MEDIA_BUS_FMT_VYUY8_1X16:
return "VYUY8_1X16";
78 case MEDIA_BUS_FMT_YUYV8_1X16:
return "YUYV8_1X16";
79 case MEDIA_BUS_FMT_YVYU8_1X16:
return "YVYU8_1X16";
80 case MEDIA_BUS_FMT_YDYUYDYV8_1X16:
return "YDYUYDYV8_1X16";
81 case MEDIA_BUS_FMT_UYVY10_1X20:
return "UYVY10_1X20";
82 case MEDIA_BUS_FMT_VYUY10_1X20:
return "VYUY10_1X20";
83 case MEDIA_BUS_FMT_YUYV10_1X20:
return "YUYV10_1X20";
84 case MEDIA_BUS_FMT_YVYU10_1X20:
return "YVYU10_1X20";
85 case MEDIA_BUS_FMT_VUY8_1X24:
return "VUY8_1X24";
86 case MEDIA_BUS_FMT_YUV8_1X24:
return "YUV8_1X24";
88 case MEDIA_BUS_FMT_UYVY12_1X24:
return "UYVY12_1X24";
89 case MEDIA_BUS_FMT_VYUY12_1X24:
return "VYUY12_1X24";
90 case MEDIA_BUS_FMT_YUYV12_1X24:
return "YUYV12_1X24";
91 case MEDIA_BUS_FMT_YVYU12_1X24:
return "YVYU12_1X24";
92 case MEDIA_BUS_FMT_YUV10_1X30:
return "YUV10_1X30";
94 case MEDIA_BUS_FMT_AYUV8_1X32:
return "AYUV8_1X32";
99 case MEDIA_BUS_FMT_SBGGR8_1X8:
return "SBGGR8_1X8";
100 case MEDIA_BUS_FMT_SGBRG8_1X8:
return "SGBRG8_1X8";
101 case MEDIA_BUS_FMT_SGRBG8_1X8:
return "SGRBG8_1X8";
102 case MEDIA_BUS_FMT_SRGGB8_1X8:
return "SRGGB8_1X8";
103 case MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8:
return "SBGGR10_ALAW8_1X8";
104 case MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8:
return "SGBRG10_ALAW8_1X8";
105 case MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8:
return "SGRBG10_ALAW8_1X8";
106 case MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8:
return "SRGGB10_ALAW8_1X8";
107 case MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8:
return "SBGGR10_DPCM8_1X8";
108 case MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8:
return "SGBRG10_DPCM8_1X8";
109 case MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8:
return "SGRBG10_DPCM8_1X8";
110 case MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8:
return "SRGGB10_DPCM8_1X8";
115 case MEDIA_BUS_FMT_SBGGR10_1X10:
return "SBGGR10_1X10";
116 case MEDIA_BUS_FMT_SGBRG10_1X10:
return "SGBRG10_1X10";
117 case MEDIA_BUS_FMT_SGRBG10_1X10:
return "SGRBG10_1X10";
118 case MEDIA_BUS_FMT_SRGGB10_1X10:
return "SRGGB10_1X10";
119 case MEDIA_BUS_FMT_SBGGR12_1X12:
return "SBGGR12_1X12";
120 case MEDIA_BUS_FMT_SGBRG12_1X12:
return "SGBRG12_1X12";
121 case MEDIA_BUS_FMT_SGRBG12_1X12:
return "SGRBG12_1X12";
122 case MEDIA_BUS_FMT_SRGGB12_1X12:
return "SRGGB12_1X12";
123 case MEDIA_BUS_FMT_SBGGR14_1X14:
return "SBGGR14_1X14";
124 case MEDIA_BUS_FMT_SGBRG14_1X14:
return "SGBRG14_1X14";
125 case MEDIA_BUS_FMT_SGRBG14_1X14:
return "SGRBG14_1X14";
126 case MEDIA_BUS_FMT_SRGGB14_1X14:
return "SRGGB14_1X14";
127 case MEDIA_BUS_FMT_SBGGR16_1X16:
return "SBGGR16_1X16";
128 case MEDIA_BUS_FMT_SGBRG16_1X16:
return "SGBRG16_1X16";
129 case MEDIA_BUS_FMT_SGRBG16_1X16:
return "SGRBG16_1X16";
130 case MEDIA_BUS_FMT_SRGGB16_1X16:
return "SRGGB16_1X16";
131 case MEDIA_BUS_FMT_JPEG_1X8:
return "JPEG_1X8";
132 case MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8:
return "S5C_UYVY_JPEG_1X8";
133 case MEDIA_BUS_FMT_AHSV8888_1X32:
return "AHSV8888_1X32";
134 default:
return QString(code);
288 Q_ASSERT(size.isValid());
289 struct v4l2_format format;
290 memset(&format, 0,
sizeof(
struct v4l2_format));
291 format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
292 if (ioctl(m_subdevFd, VIDIOC_G_FMT, &format) == -1) {
293 qErrnoWarning(
"VIDIOC_G_FMT for capture device failed");
297 format.fmt.pix_mp.width =
static_cast<uint>(size.width());
298 format.fmt.pix_mp.height =
static_cast<uint>(size.height());
299 format.fmt.pix_mp.field = V4L2_FIELD_NONE;
300 format.fmt.pix_mp.pixelformat = pixelFormat;
301 format.fmt.pix_mp.num_planes = 1;
302 format.fmt.pix_mp.flags = 0;
303 format.fmt.pix_mp.plane_fmt[0].bytesperline = 0;
304 format.fmt.pix_mp.plane_fmt[0].sizeimage = 0;
306 if (ioctl(m_subdevFd, VIDIOC_S_FMT, &format) == -1) {
307 qWarning() <<
"Capture device" << m_subdevFd <<
"VIDIOC_S_FMT with format" << format.fmt.pix_mp
308 <<
"failed:" << strerror(errno);
312 qCDebug(qLcEglfsKmsDebug) <<
"Capture device" << m_subdevFd <<
"format set:" << format.fmt.pix_mp;
318 struct v4l2_requestbuffers requestBuffers;
319 memset(&requestBuffers, 0,
sizeof(requestBuffers));
320 requestBuffers.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
321 requestBuffers.memory = V4L2_MEMORY_DMABUF;
322 requestBuffers.count = 0;
323 if (ioctl(m_subdevFd, VIDIOC_REQBUFS, &requestBuffers) == -1) {
324 qWarning(
"Capture device %d: VIDIOC_REQBUFS clear failed: %s", m_subdevFd, strerror(errno));
327 qCDebug(qLcEglfsKmsDebug,
"Capture device %d: Deallocced buffers with REQBUF, now has %d buffers", m_subdevFd, requestBuffers.count);
328 Q_ASSERT(requestBuffers.count == 0);
351 const uint numPlanes = 1;
352 struct v4l2_buffer buffer;
353 memset(&buffer, 0,
sizeof(buffer));
354 buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
355 buffer.memory = V4L2_MEMORY_DMABUF;
358 struct v4l2_plane planes[VIDEO_MAX_PLANES];
359 buffer.m.planes = planes;
360 buffer.length = numPlanes;
361 memset(planes, 0,
sizeof(planes));
362 for (uint i = 0; i < numPlanes; i++) {
363 buffer.m.planes[i].m.fd = dmabufFd;
364 buffer.m.planes[i].length =
static_cast<uint>(bufferSize.width() * bufferSize.height() * 4);
365 buffer.m.planes[i].bytesused =
static_cast<uint>(bufferSize.width() * bufferSize.height() * 4);
368 if (ioctl(m_subdevFd, VIDIOC_QBUF, &buffer) == -1) {
369 qWarning(
"Capture device %d: VIDIOC_QBUF failed for dma buffer with fd %d: %s",
370 m_subdevFd, dmabufFd, strerror(errno));
416 Q_ASSERT(size.isValid());
417 struct v4l2_format format;
418 memset(&format, 0,
sizeof(
struct v4l2_format));
419 format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
420 if (ioctl(m_subdevFd, VIDIOC_G_FMT, &format) == -1) {
421 qErrnoWarning(
"VIDIOC_G_FMT for output device failed");
425 format.fmt.pix_mp.width =
static_cast<uint>(size.width());
426 format.fmt.pix_mp.height =
static_cast<uint>(size.height());
427 format.fmt.pix_mp.field = V4L2_FIELD_NONE;
428 format.fmt.pix_mp.pixelformat = pixelFormat;
429 format.fmt.pix_mp.num_planes = 1;
430 format.fmt.pix_mp.flags = 0;
431 format.fmt.pix_mp.plane_fmt[0].bytesperline = bytesPerLine;
432 format.fmt.pix_mp.plane_fmt[0].sizeimage = 0;
434 if (ioctl(m_subdevFd, VIDIOC_S_FMT, &format) == -1) {
435 qWarning() <<
"Output device" << m_subdevFd <<
"VIDIOC_S_FMT with format" << format.fmt.pix_mp
436 <<
"failed:" << strerror(errno);
440 qCDebug(qLcEglfsKmsDebug) <<
"Output device device" << m_subdevFd <<
"format set:" << format.fmt.pix_mp;
446 struct v4l2_requestbuffers requestBuffers;
447 memset(&requestBuffers, 0,
sizeof(requestBuffers));
448 requestBuffers.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
449 requestBuffers.memory = V4L2_MEMORY_DMABUF;
450 requestBuffers.count = 0;
451 if (ioctl(m_subdevFd, VIDIOC_REQBUFS, &requestBuffers) == -1) {
452 qWarning(
"Output device %d: VIDIOC_REQBUFS clear failed: %s", m_subdevFd, strerror(errno));
455 qCDebug(qLcEglfsKmsDebug,
"Output device %d: Deallocced buffers with REQBUF, now has %d buffers", m_subdevFd, requestBuffers.count);
456 Q_ASSERT(requestBuffers.count == 0);
479 const int numPlanes = 1;
480 struct v4l2_buffer buffer;
481 memset(&buffer, 0,
sizeof(buffer));
482 buffer.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
483 buffer.memory = V4L2_MEMORY_DMABUF;
485 buffer.length = numPlanes;
486 buffer.bytesused = bytesUsed;
487 buffer.field = V4L2_FIELD_NONE;
489 struct v4l2_plane planes[numPlanes];
490 memset(planes, 0,
sizeof(planes));
491 buffer.m.planes = planes;
493 for (
int i = 0; i < numPlanes; i++) {
494 buffer.m.planes[i].m.fd = dmabufFd;
495 buffer.m.planes[i].length = length;
496 buffer.m.planes[i].bytesused = bytesUsed;
499 if (ioctl(m_subdevFd, VIDIOC_QBUF, &buffer) == -1) {
500 qWarning(
"Output device %d: VIDIOC_QBUF failed for dmabuf %d: %s", m_subdevFd, dmabufFd, strerror(errno));
504 if (!(buffer.flags & V4L2_BUF_FLAG_QUEUED)) {
505 qWarning() <<
"Queued flag not set on buffer for output device";