git: d5016a820414 - main - video: add V4L2 cropping, control menu and overlay symbols
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 27 Aug 2026 19:05:06 UTC
The branch main has been updated by seuros:
URL: https://cgit.FreeBSD.org/src/commit/?id=d5016a82041402844ce3701f6255958fa21d4f21
commit d5016a82041402844ce3701f6255958fa21d4f21
Author: Abdelkader Boudih <seuros@FreeBSD.org>
AuthorDate: 2026-08-27 17:31:29 +0000
Commit: Abdelkader Boudih <seuros@FreeBSD.org>
CommitDate: 2026-08-27 19:04:47 +0000
video: add V4L2 cropping, control menu and overlay symbols
Adds missing structs symbols for V4L2.
video(4) capture devices do not crop, expose menu controls or support
overlay, and return ENOTTY for the new ioctls.
Applications enumerate these unconditionally and degrade gracefully
at run time, but fail to build when the declarations are missing.
Reviewed by: adrian
Differential Revision: https://reviews.freebsd.org/D59203
---
sys/sys/videoio.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/sys/sys/videoio.h b/sys/sys/videoio.h
index 775ff68d699a..714a95fa5810 100644
--- a/sys/sys/videoio.h
+++ b/sys/sys/videoio.h
@@ -165,6 +165,13 @@ struct v4l2_fract {
u_int32_t denominator;
};
+struct v4l2_rect {
+ int32_t left;
+ int32_t top;
+ u_int32_t width;
+ u_int32_t height;
+};
+
struct v4l2_capability {
u_int8_t driver[16];
u_int8_t card[32];
@@ -228,11 +235,27 @@ struct v4l2_pix_format_mplane {
((type) == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE || \
(type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+struct v4l2_clip {
+ struct v4l2_rect c;
+ struct v4l2_clip *next;
+};
+
+struct v4l2_window {
+ struct v4l2_rect w;
+ u_int32_t field;
+ u_int32_t chromakey;
+ struct v4l2_clip *clips;
+ u_int32_t clipcount;
+ void *bitmap;
+ u_int8_t global_alpha;
+};
+
struct v4l2_format {
u_int32_t type;
union {
struct v4l2_pix_format pix;
struct v4l2_pix_format_mplane pix_mp;
+ struct v4l2_window win;
void *_align;
u_int8_t raw_data[200];
} fmt;
@@ -361,6 +384,28 @@ struct v4l2_queryctrl {
u_int32_t reserved[2];
};
+struct v4l2_querymenu {
+ u_int32_t id;
+ u_int32_t index;
+ union {
+ u_int8_t name[32];
+ int64_t value;
+ };
+ u_int32_t reserved;
+} __packed;
+
+struct v4l2_cropcap {
+ u_int32_t type;
+ struct v4l2_rect bounds;
+ struct v4l2_rect defrect;
+ struct v4l2_fract pixelaspect;
+};
+
+struct v4l2_crop {
+ u_int32_t type;
+ struct v4l2_rect c;
+};
+
struct v4l2_frmsize_discrete {
u_int32_t width; /* Frame width [pixel] */
u_int32_t height; /* Frame height [pixel] */
@@ -511,6 +556,7 @@ struct v4l2_frmivalenum {
/*
* Input types
*/
+#define V4L2_INPUT_TYPE_TUNER 1
#define V4L2_INPUT_TYPE_CAMERA 2
/*
@@ -544,11 +590,14 @@ struct v4l2_frmivalenum {
#define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE + 15)
#define V4L2_CID_GAMMA (V4L2_CID_BASE + 16)
#define V4L2_CID_GAIN (V4L2_CID_BASE + 19)
+#define V4L2_CID_HFLIP (V4L2_CID_BASE + 20)
+#define V4L2_CID_VFLIP (V4L2_CID_BASE + 21)
#define V4L2_CID_POWER_LINE_FREQUENCY (V4L2_CID_BASE + 24)
#define V4L2_CID_HUE_AUTO (V4L2_CID_BASE + 25)
#define V4L2_CID_WHITE_BALANCE_TEMPERATURE (V4L2_CID_BASE + 26)
#define V4L2_CID_SHARPNESS (V4L2_CID_BASE + 27)
#define V4L2_CID_BACKLIGHT_COMPENSATION (V4L2_CID_BASE + 28)
+#define V4L2_CID_LASTP1 (V4L2_CID_BASE + 44)
#define V4L2_CID_CAMERA_CLASS_BASE 0x009a0000
#define V4L2_CID_EXPOSURE_AUTO (V4L2_CID_CAMERA_CLASS_BASE + 1)
@@ -563,6 +612,23 @@ struct v4l2_frmivalenum {
#define V4L2_CID_ZOOM_CONTINUOUS (V4L2_CID_CAMERA_CLASS_BASE + 15)
#define V4L2_CID_PRIVACY (V4L2_CID_CAMERA_CLASS_BASE + 16)
+/*
+ * IDs reserved for driver specific controls
+ */
+#define V4L2_CID_PRIVATE_BASE 0x08000000
+
+/*
+ * Control flags
+ */
+#define V4L2_CTRL_FLAG_DISABLED 0x0001
+#define V4L2_CTRL_FLAG_GRABBED 0x0002
+#define V4L2_CTRL_FLAG_READ_ONLY 0x0004
+#define V4L2_CTRL_FLAG_UPDATE 0x0008
+#define V4L2_CTRL_FLAG_INACTIVE 0x0010
+#define V4L2_CTRL_FLAG_SLIDER 0x0020
+#define V4L2_CTRL_FLAG_WRITE_ONLY 0x0040
+#define V4L2_CTRL_FLAG_VOLATILE 0x0080
+
/*
* V4L2 ioctl definitions
*/
@@ -585,8 +651,12 @@ struct v4l2_frmivalenum {
#define VIDIOC_G_CTRL _IOWR('V', 27, struct v4l2_control)
#define VIDIOC_S_CTRL _IOWR('V', 28, struct v4l2_control)
#define VIDIOC_QUERYCTRL _IOWR('V', 36, struct v4l2_queryctrl)
+#define VIDIOC_QUERYMENU _IOWR('V', 37, struct v4l2_querymenu)
#define VIDIOC_G_INPUT _IOR('V', 38, int)
#define VIDIOC_S_INPUT _IOWR('V', 39, int)
+#define VIDIOC_CROPCAP _IOWR('V', 58, struct v4l2_cropcap)
+#define VIDIOC_G_CROP _IOWR('V', 59, struct v4l2_crop)
+#define VIDIOC_S_CROP _IOW('V', 60, struct v4l2_crop)
#define VIDIOC_G_PRIORITY _IOR('V', 67, u_int32_t)
#define VIDIOC_S_PRIORITY _IOW('V', 68, u_int32_t)
#define VIDIOC_TRY_FMT _IOWR('V', 64, struct v4l2_format)
@@ -597,6 +667,9 @@ _Static_assert(sizeof(struct v4l2_pix_format) == 48, "v4l2_pix_format layout");
_Static_assert(sizeof(struct v4l2_capability) == 104, "v4l2_capability layout");
_Static_assert(sizeof(struct v4l2_requestbuffers) == 20,
"v4l2_requestbuffers layout");
+_Static_assert(sizeof(struct v4l2_querymenu) == 44, "v4l2_querymenu layout");
+_Static_assert(sizeof(struct v4l2_cropcap) == 44, "v4l2_cropcap layout");
+_Static_assert(sizeof(struct v4l2_crop) == 20, "v4l2_crop layout");
#ifdef __LP64__
_Static_assert(__offsetof(struct v4l2_format, fmt) == 8, "v4l2_format layout");
_Static_assert(sizeof(struct v4l2_format) == 208, "v4l2_format layout");