Commit d1dc4937 authored by Ricardo Ribalda's avatar Ricardo Ribalda Committed by Mauro Carvalho Chehab
Browse files

media: add V4L2_CTRL_TYPE_AREA control type



This type contains the width and the height of a rectangular area.

Reviewed-by: default avatarJacopo Mondi <jacopo@jmondi.org>
Signed-off-by: default avatarRicardo Ribalda Delgado <ribalda@kernel.org>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent f7fe9f95
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -1677,6 +1677,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
{
	struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params;
	struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;
	struct v4l2_area *area;
	void *p = ptr.p + idx * ctrl->elem_size;

	switch ((u32)ctrl->type) {
@@ -1753,6 +1754,11 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
		zero_padding(p_vp8_frame_header->entropy_header);
		zero_padding(p_vp8_frame_header->coder_state);
		break;
	case V4L2_CTRL_TYPE_AREA:
		area = p;
		if (!area->width || !area->height)
			return -EINVAL;
		break;
	default:
		return -EINVAL;
	}
@@ -2427,6 +2433,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
	case V4L2_CTRL_TYPE_VP8_FRAME_HEADER:
		elem_size = sizeof(struct v4l2_ctrl_vp8_frame_header);
		break;
	case V4L2_CTRL_TYPE_AREA:
		elem_size = sizeof(struct v4l2_area);
		break;
	default:
		if (type < V4L2_CTRL_COMPOUND_TYPES)
			elem_size = sizeof(s32);
@@ -4116,6 +4125,18 @@ int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
}
EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_string);

int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
			    const struct v4l2_area *area)
{
	lockdep_assert_held(ctrl->handler->lock);

	/* It's a driver bug if this happens. */
	WARN_ON(ctrl->type != V4L2_CTRL_TYPE_AREA);
	*ctrl->p_new.p_area = *area;
	return set_ctrl(NULL, ctrl, 0);
}
EXPORT_SYMBOL(__v4l2_ctrl_s_ctrl_area);

void v4l2_ctrl_request_complete(struct media_request *req,
				struct v4l2_ctrl_handler *main_hdl)
{
+42 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ struct poll_table_struct;
 * @p_h264_slice_params:	Pointer to a struct v4l2_ctrl_h264_slice_params.
 * @p_h264_decode_params:	Pointer to a struct v4l2_ctrl_h264_decode_params.
 * @p_vp8_frame_header:		Pointer to a VP8 frame header structure.
 * @p_area:			Pointer to an area.
 * @p:				Pointer to a compound value.
 */
union v4l2_ctrl_ptr {
@@ -68,6 +69,7 @@ union v4l2_ctrl_ptr {
	struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
	struct v4l2_ctrl_h264_decode_params *p_h264_decode_params;
	struct v4l2_ctrl_vp8_frame_header *p_vp8_frame_header;
	struct v4l2_area *p_area;
	void *p;
};

@@ -1087,6 +1089,46 @@ static inline int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
	return rval;
}

/**
 * __v4l2_ctrl_s_ctrl_area() - Unlocked variant of v4l2_ctrl_s_ctrl_area().
 *
 * @ctrl:	The control.
 * @area:	The new area.
 *
 * This sets the control's new area safely by going through the control
 * framework. This function assumes the control's handler is already locked,
 * allowing it to be used from within the &v4l2_ctrl_ops functions.
 *
 * This function is for area type controls only.
 */
int __v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
			    const struct v4l2_area *area);

/**
 * v4l2_ctrl_s_ctrl_area() - Helper function to set a control's area value
 *	 from within a driver.
 *
 * @ctrl:	The control.
 * @area:	The new area.
 *
 * This sets the control's new area safely by going through the control
 * framework. This function will lock the control's handler, so it cannot be
 * used from within the &v4l2_ctrl_ops functions.
 *
 * This function is for area type controls only.
 */
static inline int v4l2_ctrl_s_ctrl_area(struct v4l2_ctrl *ctrl,
					const struct v4l2_area *area)
{
	int rval;

	v4l2_ctrl_lock(ctrl);
	rval = __v4l2_ctrl_s_ctrl_area(ctrl, area);
	v4l2_ctrl_unlock(ctrl);

	return rval;
}

/* Internal helper functions that deal with control events. */
extern const struct v4l2_subscribed_event_ops v4l2_ctrl_sub_ev_ops;

+6 −0
Original line number Diff line number Diff line
@@ -422,6 +422,11 @@ struct v4l2_fract {
	__u32   denominator;
};

struct v4l2_area {
	__u32   width;
	__u32   height;
};

/**
  * struct v4l2_capability - Describes V4L2 device caps returned by VIDIOC_QUERYCAP
  *
@@ -1720,6 +1725,7 @@ enum v4l2_ctrl_type {
	V4L2_CTRL_TYPE_U8	     = 0x0100,
	V4L2_CTRL_TYPE_U16	     = 0x0101,
	V4L2_CTRL_TYPE_U32	     = 0x0102,
	V4L2_CTRL_TYPE_AREA          = 0x0106,
};

/*  Used in the VIDIOC_QUERYCTRL ioctl for querying controls */