git: 8bc06ffbbd80 - main - uvideo: add missing formats to be in par with webcamd's uvcvideo

From: Baptiste Daroussin <bapt_at_FreeBSD.org>
Date: Tue, 16 Jun 2026 11:23:05 UTC
The branch main has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=8bc06ffbbd80533eda0784d2a6f5a1476f9d550c

commit 8bc06ffbbd80533eda0784d2a6f5a1476f9d550c
Author:     Baptiste Daroussin <bapt@FreeBSD.org>
AuthorDate: 2026-05-18 20:17:34 +0000
Commit:     Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2026-06-16 11:21:03 +0000

    uvideo: add missing formats to be in par with webcamd's uvcvideo
---
 sys/dev/usb/video/uvideo.c      | 19 +++++++++++++++++++
 sys/dev/usb/video/uvideo.h      | 24 ++++++++++++++++++++++++
 sys/dev/usb/video/uvideo_v4l2.h |  6 ++++++
 3 files changed, 49 insertions(+)

diff --git a/sys/dev/usb/video/uvideo.c b/sys/dev/usb/video/uvideo.c
index 52998fbc9b40..b35561ff6a24 100644
--- a/sys/dev/usb/video/uvideo.c
+++ b/sys/dev/usb/video/uvideo.c
@@ -493,12 +493,18 @@ static const struct {
 	uint32_t	pixelformat;
 } uvideo_map_fmts[] = {
 	{ UVIDEO_FORMAT_GUID_YUY2, V4L2_PIX_FMT_YUYV },
+	{ UVIDEO_FORMAT_GUID_NV12, V4L2_PIX_FMT_NV12 },
+	{ UVIDEO_FORMAT_GUID_NV21, V4L2_PIX_FMT_NV21 },
 	{ UVIDEO_FORMAT_GUID_YV12, V4L2_PIX_FMT_YVU420 },
 	{ UVIDEO_FORMAT_GUID_I420, V4L2_PIX_FMT_YUV420 },
+	{ UVIDEO_FORMAT_GUID_M420, V4L2_PIX_FMT_M420 },
+	{ UVIDEO_FORMAT_GUID_UYVY, V4L2_PIX_FMT_UYVY },
 	{ UVIDEO_FORMAT_GUID_Y800, V4L2_PIX_FMT_GREY },
 	{ UVIDEO_FORMAT_GUID_Y8, V4L2_PIX_FMT_GREY },
 	{ UVIDEO_FORMAT_GUID_D3DFMT_L8, V4L2_PIX_FMT_GREY },
 	{ UVIDEO_FORMAT_GUID_KSMEDIA_L8_IR, V4L2_PIX_FMT_GREY },
+	{ UVIDEO_FORMAT_GUID_Y12, V4L2_PIX_FMT_Y12 },
+	{ UVIDEO_FORMAT_GUID_Y16, V4L2_PIX_FMT_Y16 },
 	{ UVIDEO_FORMAT_GUID_BY8, V4L2_PIX_FMT_SBGGR8 },
 	{ UVIDEO_FORMAT_GUID_BA81, V4L2_PIX_FMT_SBGGR8 },
 	{ UVIDEO_FORMAT_GUID_GBRG, V4L2_PIX_FMT_SGBRG8 },
@@ -2939,9 +2945,16 @@ static const struct {
 } uvideo_fmt_names[] = {
 	{ V4L2_PIX_FMT_MJPEG,		"Motion-JPEG",		V4L2_FMT_FLAG_COMPRESSED },
 	{ V4L2_PIX_FMT_YUYV,		"YUYV 4:2:2",		0 },
+	{ V4L2_PIX_FMT_UYVY,		"UYVY 4:2:2",		0 },
+	{ V4L2_PIX_FMT_NV12,		"Y/UV 4:2:0",		0 },
+	{ V4L2_PIX_FMT_NV21,		"Y/VU 4:2:0",		0 },
 	{ V4L2_PIX_FMT_YVU420,		"Planar YVU 4:2:0",	0 },
 	{ V4L2_PIX_FMT_YUV420,		"Planar YUV 4:2:0",	0 },
+	{ V4L2_PIX_FMT_M420,		"M420 YUV 4:2:0",	0 },
 	{ V4L2_PIX_FMT_GREY,		"8-bit Greyscale",	0 },
+	{ V4L2_PIX_FMT_Y10,		"10-bit Greyscale",	0 },
+	{ V4L2_PIX_FMT_Y12,		"12-bit Greyscale",	0 },
+	{ V4L2_PIX_FMT_Y16,		"16-bit Greyscale",	0 },
 	{ V4L2_PIX_FMT_RGB565,		"16-bit RGB 5-6-5",	0 },
 	{ V4L2_PIX_FMT_BGR24,		"24-bit BGR 8-8-8",	0 },
 	{ V4L2_PIX_FMT_XBGR32,	"32-bit BGRX 8-8-8-8",	0 },
@@ -2951,6 +2964,12 @@ static const struct {
 	{ V4L2_PIX_FMT_SGBRG8,		"8-bit Bayer GBGB/RGRG", 0 },
 	{ V4L2_PIX_FMT_SGRBG8,		"8-bit Bayer GRGR/BGBG", 0 },
 	{ V4L2_PIX_FMT_SRGGB8,		"8-bit Bayer RGRG/GBGB", 0 },
+	{ V4L2_PIX_FMT_SBGGR16,	"16-bit Bayer BGBG/GRGR", 0 },
+	{ V4L2_PIX_FMT_SGBRG16,	"16-bit Bayer GBGB/RGRG", 0 },
+	{ V4L2_PIX_FMT_SGRBG16,	"16-bit Bayer GRGR/BGBG", 0 },
+	{ V4L2_PIX_FMT_SRGGB16,	"16-bit Bayer RGRG/GBGB", 0 },
+	{ V4L2_PIX_FMT_SRGGB10P,	"10-bit Bayer RGRG/GBGB Packed", 0 },
+	{ V4L2_PIX_FMT_Z16,		"16-bit Depth",		0 },
 	{ 0, NULL, 0 }
 };
 
diff --git a/sys/dev/usb/video/uvideo.h b/sys/dev/usb/video/uvideo.h
index 00e5118a65ae..fc811c5d65fa 100644
--- a/sys/dev/usb/video/uvideo.h
+++ b/sys/dev/usb/video/uvideo.h
@@ -312,6 +312,14 @@ struct usb_video_probe_commit {
     'Y',  'U',  'Y',  '2',  0x00, 0x00, 0x10, 0x00,	\
     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
 
+#define	UVIDEO_FORMAT_GUID_NV12	{			\
+    'N',  'V',  '1',  '2',  0x00, 0x00, 0x10, 0x00,	\
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+
+#define	UVIDEO_FORMAT_GUID_NV21	{			\
+    'N',  'V',  '2',  '1',  0x00, 0x00, 0x10, 0x00,	\
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+
 #define	UVIDEO_FORMAT_GUID_YV12	{			\
     'Y',  'V',  '1',  '2',  0x00, 0x00, 0x10, 0x00,	\
     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
@@ -320,6 +328,14 @@ struct usb_video_probe_commit {
     'I',  '4',  '2',  '0',  0x00, 0x00, 0x10, 0x00,	\
     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
 
+#define	UVIDEO_FORMAT_GUID_M420	{			\
+    'M',  '4',  '2',  '0',  0x00, 0x00, 0x10, 0x00,	\
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+
+#define	UVIDEO_FORMAT_GUID_UYVY	{			\
+    'U',  'Y',  'V',  'Y',  0x00, 0x00, 0x10, 0x00,	\
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+
 #define	UVIDEO_FORMAT_GUID_Y800	{			\
     'Y',  '8',  '0',  '0',  0x00, 0x00, 0x10, 0x00,	\
     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
@@ -336,6 +352,14 @@ struct usb_video_probe_commit {
     0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00,	\
     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
 
+#define	UVIDEO_FORMAT_GUID_Y12	{			\
+    'Y',  '1',  '2',  ' ',  0x00, 0x00, 0x10, 0x00,	\
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+
+#define	UVIDEO_FORMAT_GUID_Y16	{			\
+    'Y',  '1',  '6',  ' ',  0x00, 0x00, 0x10, 0x00,	\
+    0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
+
 #define	UVIDEO_FORMAT_GUID_BY8	{			\
     'B',  'Y',  '8',  ' ',  0x00, 0x00, 0x10, 0x00,	\
     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
diff --git a/sys/dev/usb/video/uvideo_v4l2.h b/sys/dev/usb/video/uvideo_v4l2.h
index 6192ada9fbb6..7e0aa2eda097 100644
--- a/sys/dev/usb/video/uvideo_v4l2.h
+++ b/sys/dev/usb/video/uvideo_v4l2.h
@@ -364,6 +364,10 @@ struct v4l2_frmivalenum {
 
 /* Luminance+Chrominance formats */
 #define V4L2_PIX_FMT_YUYV	v4l2_fourcc('Y', 'U', 'Y', 'V')
+#define V4L2_PIX_FMT_UYVY	v4l2_fourcc('U', 'Y', 'V', 'Y')
+#define V4L2_PIX_FMT_NV12	v4l2_fourcc('N', 'V', '1', '2')
+#define V4L2_PIX_FMT_NV21	v4l2_fourcc('N', 'V', '2', '1')
+#define V4L2_PIX_FMT_M420	v4l2_fourcc('M', '4', '2', '0')
 #define V4L2_PIX_FMT_YVU420	v4l2_fourcc('Y', 'V', '1', '2')
 #define V4L2_PIX_FMT_YUV420	v4l2_fourcc('Y', 'U', '1', '2')
 
@@ -375,6 +379,8 @@ struct v4l2_frmivalenum {
 /* Grey formats */
 #define V4L2_PIX_FMT_GREY	v4l2_fourcc('G', 'R', 'E', 'Y')
 #define V4L2_PIX_FMT_Y10	v4l2_fourcc('Y', '1', '0', ' ')
+#define V4L2_PIX_FMT_Y12	v4l2_fourcc('Y', '1', '2', ' ')
+#define V4L2_PIX_FMT_Y16	v4l2_fourcc('Y', '1', '6', ' ')
 
 /* RGB formats */
 #define V4L2_PIX_FMT_RGB565	v4l2_fourcc('R', 'G', 'B', 'P')