git: d5016a820414 - main - video: add V4L2 cropping, control menu and overlay symbols

From: Abdelkader Boudih <seuros_at_FreeBSD.org>
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");