| From f6177f90bec4f70a45b0157a51cb863ae502771a Mon Sep 17 00:00:00 2001 |
| From: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Date: Wed, 23 Jun 2021 12:08:36 +0900 |
| Subject: [PATCH] CHROMIUM: FROMLIST: media: uvcvideo: add ROI auto controls |
| |
| This patch adds support for Region of Interest bmAutoControls. |
| |
| ROI control is a compound data type: |
| Control Selector CT_REGION_OF_INTEREST_CONTROL |
| Mandatory Requests SET_CUR, GET_CUR, GET_MIN, GET_MAX, GET_DEF |
| wLength 10 |
| Offset Field Size |
| 0 wROI_Top 2 |
| 2 wROI_Left 2 |
| 4 wROI_Bottom 2 |
| 6 wROI_Right 2 |
| 8 bmAutoControls 2 (Bitmap) |
| |
| uvc_control_mapping, however, can handle only s32 data type at the |
| moment: ->get() returns s32 value, ->set() accepts s32 value; while |
| v4l2_ctrl maximum/minimum/default_value can hold only s64 values. |
| |
| Hence ROI control handling is split into two patches: |
| a) bmAutoControls is handled via uvc_control_mapping as V4L2_CTRL_TYPE_BITMASK |
| b) ROI rectangle (SET_CUR, GET_CUR, GET_DEF, etc.) handling is implemented |
| separately, by the means of selection API. |
| |
| [senozhatsky: this patch includes an extra change that uses SHRT_MAX as |
| CID value, see crrev.com/c/2984868] |
| |
| (am from https://lore.kernel.org/lkml/20210501082001.100533-4-senozhatsky@chromium.org) |
| |
| BUG=b:186835892 |
| TEST=backport of a series that was tested on v4.19 kernel |
| TEST=v4l2-ctl on hatch and drallion |
| |
| Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org> |
| Change-Id: Ibe3194dca45bf6746b2475e0b5d9f0b9856c4846 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2981316 |
| Reviewed-by: Ricardo Ribalda <ribalda@chromium.org> |
| |
| [rebase61(tzungbi): |
| Squashed: |
| FIXUP: CHROMIUM: FROMLIST: media: uvcvideo: add ROI auto controls |
| ] |
| Signed-off-by: Tzung-Bi Shih <tzungbi@chromium.org> |
| --- |
| drivers/media/usb/uvc/uvc_ctrl.c | 19 +++++++++++++++++++ |
| drivers/media/v4l2-core/v4l2-ctrls-defs.c | 1 + |
| include/uapi/linux/usb/video.h | 1 + |
| include/uapi/linux/v4l2-controls.h | 19 +++++++++++++++++++ |
| 4 files changed, 40 insertions(+) |
| |
| diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c |
| index c7af3e08b2c6baaff45346b0fb6af526085c4371..690c832b61541c62898de090b8575a5a01a67e97 100644 |
| --- a/drivers/media/usb/uvc/uvc_ctrl.c |
| +++ b/drivers/media/usb/uvc/uvc_ctrl.c |
| @@ -356,6 +356,15 @@ static const struct uvc_control_info uvc_ctrls[] = { |
| .flags = UVC_CTRL_FLAG_GET_CUR |
| | UVC_CTRL_FLAG_AUTO_UPDATE, |
| }, |
| + { |
| + .entity = UVC_GUID_UVC_CAMERA, |
| + .selector = UVC_CT_REGION_OF_INTEREST_CONTROL, |
| + .index = 21, |
| + .size = 10, |
| + .flags = UVC_CTRL_FLAG_SET_CUR | UVC_CTRL_FLAG_GET_CUR |
| + | UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
| + | UVC_CTRL_FLAG_GET_DEF |
| + }, |
| }; |
| |
| static const u32 uvc_control_classes[] = { |
| @@ -719,6 +728,16 @@ static const struct uvc_control_mapping uvc_ctrl_mappings[] = { |
| .v4l2_type = V4L2_CTRL_TYPE_BOOLEAN, |
| .data_type = UVC_CTRL_DATA_TYPE_BOOLEAN, |
| }, |
| + { |
| + .id = V4L2_CID_REGION_OF_INTEREST_AUTO, |
| + .name = "Region of Interest (auto)", |
| + .entity = UVC_GUID_UVC_CAMERA, |
| + .selector = UVC_CT_REGION_OF_INTEREST_CONTROL, |
| + .size = 16, |
| + .offset = 64, |
| + .v4l2_type = V4L2_CTRL_TYPE_BITMASK, |
| + .data_type = UVC_CTRL_DATA_TYPE_BITMASK, |
| + }, |
| }; |
| |
| static const struct uvc_control_mapping uvc_ctrl_mappings_uvc11[] = { |
| diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c |
| index 564fedee2c88ed3ad5d9480df05f1bc1d09f78f4..3a50c6459c8db1ff35596356cee794c10fa87908 100644 |
| --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c |
| +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c |
| @@ -793,6 +793,7 @@ const char *v4l2_ctrl_get_name(u32 id) |
| case V4L2_CID_ALPHA_COMPONENT: return "Alpha Component"; |
| case V4L2_CID_COLORFX_CBCR: return "Color Effects, CbCr"; |
| case V4L2_CID_COLORFX_RGB: return "Color Effects, RGB"; |
| + case V4L2_CID_REGION_OF_INTEREST_AUTO: return "Region Of Interest Auto Controls"; |
| |
| /* |
| * Codec controls |
| diff --git a/include/uapi/linux/usb/video.h b/include/uapi/linux/usb/video.h |
| index 6e8e572c2980afa8828559e18742a62d912a4195..4a8b37ad0d3bf601502d12b0e8afbeb5d32ade99 100644 |
| --- a/include/uapi/linux/usb/video.h |
| +++ b/include/uapi/linux/usb/video.h |
| @@ -104,6 +104,7 @@ |
| #define UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f |
| #define UVC_CT_ROLL_RELATIVE_CONTROL 0x10 |
| #define UVC_CT_PRIVACY_CONTROL 0x11 |
| +#define UVC_CT_REGION_OF_INTEREST_CONTROL 0x14 |
| |
| /* A.9.5. Processing Unit Control Selectors */ |
| #define UVC_PU_CONTROL_UNDEFINED 0x00 |
| diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h |
| index b73a8ba7df6cb035b642b46f99f09ba7a947ea61..16725a0934f6745cf540282e9fd3a6a72f006686 100644 |
| --- a/include/uapi/linux/v4l2-controls.h |
| +++ b/include/uapi/linux/v4l2-controls.h |
| @@ -989,6 +989,25 @@ enum v4l2_auto_focus_range { |
| |
| #define V4L2_CID_HDR_SENSOR_MODE (V4L2_CID_CAMERA_CLASS_BASE+36) |
| |
| +/* |
| + * senozhatsky@ b:191930245 |
| + * |
| + * These are FROMLIST defines. Use very high value to avoid collisions |
| + * with upstream patches. Controls classes are USHRT_MAX apart from each |
| + * other, but the lower 0x900 are not being used. This leaves us with the |
| + * USHRT_MAX - 0x900 values. Use SHRT_MAX. |
| + */ |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO \ |
| + (V4L2_CID_CAMERA_CLASS_BASE + SHRT_MAX) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_EXPOSURE (1 << 0) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_IRIS (1 << 1) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_WHITE_BALANCE (1 << 2) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_FOCUS (1 << 3) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_FACE_DETECT (1 << 4) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_DETECT_AND_TRACK (1 << 5) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_IMAGE_STABILIZATION (1 << 6) |
| +#define V4L2_CID_REGION_OF_INTEREST_AUTO_HIGHER_QUALITY (1 << 7) |
| + |
| /* FM Modulator class control IDs */ |
| |
| #define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900) |
| -- |
| 2.39.0.314.g84b9a713c41-goog |
| |