@@ -783,6 +783,7 @@ struct v4l2_pix_format {
#define V4L2_META_FMT_VSP1_HGT v4l2_fourcc('V', 'S', 'P', 'T') /* R-Car VSP1 2-D Histogram */
#define V4L2_META_FMT_UVC v4l2_fourcc('U', 'V', 'C', 'H') /* UVC Payload Header metadata */
#define V4L2_META_FMT_D4XX v4l2_fourcc('D', '4', 'X', 'X') /* D4XX Payload Header metadata */
+#define V4L2_META_FMT_VIVID v4l2_fourcc('V', 'I', 'V', 'D') /* Vivid Metadata */
/* priv field value to indicates that subsequent fields are valid. */
#define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe
@@ -749,6 +749,7 @@ struct v4l2_pix_format {
#define V4L2_META_FMT_VSP1_HGT v4l2_fourcc('V', 'S', 'P', 'T') /* R-Car VSP1 2-D Histogram */
#define V4L2_META_FMT_UVC v4l2_fourcc('U', 'V', 'C', 'H') /* UVC Payload Header metadata */
#define V4L2_META_FMT_D4XX v4l2_fourcc('D', '4', 'X', 'X') /* D4XX Payload Header metadata */
+#define V4L2_META_FMT_VIVID v4l2_fourcc('V', 'I', 'V', 'D') /* Vivid Metadata */
/* priv field value to indicates that subsequent fields are valid. */
#define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe
@@ -139,10 +139,18 @@ struct vivid_uvc_meta_buf {
#define UVC_STREAM_SCR (1 << 3)
#define UVC_STREAM_PTS (1 << 2)
+struct vivid_meta_out_buf {
+ __u16 brightness;
+ __u16 contrast;
+ __u16 saturation;
+ __s16 hue;
+};
+
void print_meta_buffer(FILE *f, cv4l_buffer &buf, cv4l_fmt &fmt, cv4l_queue &q)
{
struct vivid_uvc_meta_buf *vbuf;
int buf_off = 0;
+ struct vivid_meta_out_buf *vbuf_out;
switch (fmt.g_pixelformat()) {
case V4L2_META_FMT_UVC:
@@ -164,5 +172,28 @@ void print_meta_buffer(FILE *f, cv4l_buffer &buf, cv4l_fmt &fmt, cv4l_queue &q)
le16toh(*(__u16*)(vbuf->buf + buf_off + 4)));
fprintf(f, "\n");
break;
+ case V4L2_META_FMT_VIVID:
+ fprintf(f, "VIVID:");
+ vbuf_out = (vivid_meta_out_buf *)q.g_dataptr(buf.g_index(), 0);
+
+ fprintf(f, " brightness: %u contrast: %u saturation: %u hue: %d\n",
+ vbuf_out->brightness, vbuf_out->contrast,
+ vbuf_out->saturation, vbuf_out->hue);
+ break;
+ }
+}
+
+void meta_fillbuffer(cv4l_buffer &buf, cv4l_fmt &fmt, cv4l_queue &q)
+{
+ struct vivid_meta_out_buf *vbuf;
+
+ switch (fmt.g_pixelformat()) {
+ case V4L2_META_FMT_VIVID:
+ vbuf = (vivid_meta_out_buf *)q.g_dataptr(buf.g_index(), 0);
+ vbuf->brightness = buf.g_sequence() % 192 + 64;
+ vbuf->contrast = (buf.g_sequence() + 10) % 192 + 64;
+ vbuf->saturation = (buf.g_sequence() + 20) % 256;
+ vbuf->hue = buf.g_sequence() % 257 - 128;
+ break;
}
}
@@ -1146,6 +1146,7 @@ static int do_setup_out_buffers(cv4l_fd &fd, cv4l_queue &q, FILE *fin, bool qbuf
bool can_fill = false;
bool is_video = q.g_type() == V4L2_BUF_TYPE_VIDEO_OUTPUT ||
q.g_type() == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ bool is_meta = q.g_type() == V4L2_BUF_TYPE_META_OUTPUT;
if (q.obtain_bufs(&fd))
return QUEUE_ERROR;
@@ -1241,6 +1242,9 @@ static int do_setup_out_buffers(cv4l_fd &fd, cv4l_queue &q, FILE *fin, bool qbuf
tpg_fillbuffer(&tpg, stream_out_std, j, (u8 *)q.g_dataptr(i, j));
}
}
+ if (is_meta)
+ meta_fillbuffer(buf, fmt, q);
+
if (fin && !fill_buffer_from_file(fd, q, buf, fmt, fin))
return QUEUE_STOPPED;
@@ -1480,6 +1484,7 @@ static int do_handle_out(cv4l_fd &fd, cv4l_queue &q, FILE *fin, cv4l_buffer *cap
bool stopped, bool ignore_count_skip)
{
cv4l_buffer buf(q);
+ bool is_meta = q.g_type() == V4L2_BUF_TYPE_META_OUTPUT;
int ret = 0;
if (cap) {
@@ -1542,6 +1547,8 @@ static int do_handle_out(cv4l_fd &fd, cv4l_queue &q, FILE *fin, cv4l_buffer *cap
tpg_fillbuffer(&tpg, stream_out_std, j,
(u8 *)q.g_dataptr(buf.g_index(), j));
}
+ if (is_meta)
+ meta_fillbuffer(buf, fmt, q);
if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS) {
if (ioctl(buf.g_request_fd(), MEDIA_REQUEST_IOC_REINIT, NULL)) {
@@ -2039,7 +2046,7 @@ static void streaming_set_out(cv4l_fd &fd, cv4l_fd &exp_fd)
if (!(capabilities & (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE |
V4L2_CAP_VBI_OUTPUT | V4L2_CAP_SLICED_VBI_OUTPUT |
- V4L2_CAP_SDR_OUTPUT |
+ V4L2_CAP_SDR_OUTPUT | V4L2_CAP_META_OUTPUT |
V4L2_CAP_VIDEO_M2M | V4L2_CAP_VIDEO_M2M_MPLANE))) {
fprintf(stderr, "unsupported stream type\n");
return;
@@ -409,6 +409,7 @@ void meta_set(cv4l_fd &fd);
void meta_get(cv4l_fd &fd);
void meta_list(cv4l_fd &fd);
void print_meta_buffer(FILE *f, cv4l_buffer &buf, cv4l_fmt &fmt, cv4l_queue &q);
+void meta_fillbuffer(cv4l_buffer &buf, cv4l_fmt &fmt, cv4l_queue &q);
// v4l2-ctl-subdev.cpp
void subdev_usage(void);