From: Hans Verkuil <hans.verk...@cisco.com>

Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
---
 drivers/media/platform/vivid/vivid-core.h    |  5 ++++
 drivers/media/platform/vivid/vivid-ctrls.c   | 37 ++++++++++++++++++++++++++++
 drivers/media/platform/vivid/vivid-vid-cap.c | 10 ++++++--
 drivers/media/platform/vivid/vivid-vid-cap.h |  1 +
 4 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/vivid/vivid-core.h 
b/drivers/media/platform/vivid/vivid-core.h
index 811c286..f9d6c45 100644
--- a/drivers/media/platform/vivid/vivid-core.h
+++ b/drivers/media/platform/vivid/vivid-core.h
@@ -214,6 +214,11 @@ struct vivid_dev {
                struct v4l2_ctrl        *ctrl_dv_timings_signal_mode;
                struct v4l2_ctrl        *ctrl_dv_timings;
        };
+       struct {
+               /* capture selection crop/compose cluster */
+               struct v4l2_ctrl        *ctrl_cap_crop;
+               struct v4l2_ctrl        *ctrl_cap_compose;
+       };
        struct v4l2_ctrl                *ctrl_has_crop_cap;
        struct v4l2_ctrl                *ctrl_has_compose_cap;
        struct v4l2_ctrl                *ctrl_has_scaler_cap;
diff --git a/drivers/media/platform/vivid/vivid-ctrls.c 
b/drivers/media/platform/vivid/vivid-ctrls.c
index 42376a1..04d18be 100644
--- a/drivers/media/platform/vivid/vivid-ctrls.c
+++ b/drivers/media/platform/vivid/vivid-ctrls.c
@@ -398,6 +398,25 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
                if (dev->edid_blocks > dev->edid_max_blocks)
                        dev->edid_blocks = dev->edid_max_blocks;
                break;
+       case V4L2_CID_CAPTURE_CROP: {
+               struct v4l2_selection s = { V4L2_BUF_TYPE_VIDEO_CAPTURE };
+               struct v4l2_ctrl_selection *crop = 
dev->ctrl_cap_crop->p_new.p_sel;
+               struct v4l2_ctrl_selection *compose = 
dev->ctrl_cap_compose->p_new.p_sel;
+               int ret;
+
+               if (ctrl->store)
+                       break;
+               s.target = V4L2_SEL_TGT_CROP;
+               s.r = crop->r;
+               s.flags = crop->flags;
+               ret = vivid_vid_cap_s_selection_int(dev, &s);
+               if (ret)
+                       return ret;
+               s.target = V4L2_SEL_TGT_COMPOSE;
+               s.r = compose->r;
+               s.flags = compose->flags;
+               return vivid_vid_cap_s_selection_int(dev, &s);
+       }
        }
        return 0;
 }
@@ -668,6 +687,19 @@ static const struct v4l2_ctrl_config 
vivid_ctrl_limited_rgb_range = {
        .step = 1,
 };
 
+static const struct v4l2_ctrl_config vivid_ctrl_capture_crop = {
+       .ops = &vivid_vid_cap_ctrl_ops,
+       .id = V4L2_CID_CAPTURE_CROP,
+       .dims = { 1 },
+       .can_store = true,
+};
+
+static const struct v4l2_ctrl_config vivid_ctrl_capture_compose = {
+       .ops = &vivid_vid_cap_ctrl_ops,
+       .id = V4L2_CID_CAPTURE_COMPOSE,
+       .dims = { 1 },
+       .can_store = true,
+};
 
 /* VBI Capture Control */
 
@@ -1263,6 +1295,10 @@ int vivid_create_controls(struct vivid_dev *dev, bool 
show_ccs_cap,
                dev->colorspace = v4l2_ctrl_new_custom(hdl_vid_cap,
                        &vivid_ctrl_colorspace, NULL);
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_alpha_mode, NULL);
+               dev->ctrl_cap_crop = v4l2_ctrl_new_custom(hdl_vid_cap,
+                               &vivid_ctrl_capture_crop, NULL);
+               dev->ctrl_cap_compose = v4l2_ctrl_new_custom(hdl_vid_cap,
+                               &vivid_ctrl_capture_compose, NULL);
        }
 
        if (dev->has_vid_out && show_ccs_out) {
@@ -1435,6 +1471,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool 
show_ccs_cap,
                v4l2_ctrl_add_handler(hdl_vid_cap, hdl_user_aud, NULL);
                v4l2_ctrl_add_handler(hdl_vid_cap, hdl_streaming, NULL);
                v4l2_ctrl_add_handler(hdl_vid_cap, hdl_sdtv_cap, NULL);
+               v4l2_ctrl_cluster(2, &dev->ctrl_cap_crop);
                if (hdl_vid_cap->error)
                        return hdl_vid_cap->error;
                dev->vid_cap_dev.ctrl_handler = hdl_vid_cap;
diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c 
b/drivers/media/platform/vivid/vivid-vid-cap.c
index 95eda68..934ea3d 100644
--- a/drivers/media/platform/vivid/vivid-vid-cap.c
+++ b/drivers/media/platform/vivid/vivid-vid-cap.c
@@ -831,9 +831,8 @@ int vivid_vid_cap_g_selection(struct file *file, void *priv,
        return 0;
 }
 
-int vivid_vid_cap_s_selection(struct file *file, void *fh, struct 
v4l2_selection *s)
+int vivid_vid_cap_s_selection_int(struct vivid_dev *dev, struct v4l2_selection 
*s)
 {
-       struct vivid_dev *dev = video_drvdata(file);
        struct v4l2_rect *crop = &dev->crop_cap;
        struct v4l2_rect *compose = &dev->compose_cap;
        unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1;
@@ -967,6 +966,13 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, 
struct v4l2_selection
        return 0;
 }
 
+int vivid_vid_cap_s_selection(struct file *file, void *fh, struct 
v4l2_selection *s)
+{
+       struct vivid_dev *dev = video_drvdata(file);
+
+       return vivid_vid_cap_s_selection_int(dev, s);
+}
+
 int vivid_vid_cap_cropcap(struct file *file, void *priv,
                              struct v4l2_cropcap *cap)
 {
diff --git a/drivers/media/platform/vivid/vivid-vid-cap.h 
b/drivers/media/platform/vivid/vivid-vid-cap.h
index 9407981..e7d36cb 100644
--- a/drivers/media/platform/vivid/vivid-vid-cap.h
+++ b/drivers/media/platform/vivid/vivid-vid-cap.h
@@ -39,6 +39,7 @@ int vidioc_g_fmt_vid_cap(struct file *file, void *priv, 
struct v4l2_format *f);
 int vidioc_try_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format 
*f);
 int vidioc_s_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *f);
 int vivid_vid_cap_g_selection(struct file *file, void *priv, struct 
v4l2_selection *sel);
+int vivid_vid_cap_s_selection_int(struct vivid_dev *dev, struct v4l2_selection 
*s);
 int vivid_vid_cap_s_selection(struct file *file, void *fh, struct 
v4l2_selection *s);
 int vivid_vid_cap_cropcap(struct file *file, void *priv, struct v4l2_cropcap 
*cap);
 int vidioc_enum_fmt_vid_overlay(struct file *file, void  *priv, struct 
v4l2_fmtdesc *f);
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to