]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
media: imx: Set capture compose rectangle in capture_device_set_format
authorSteve Longerbeam <slongerbeam@gmail.com>
Thu, 7 Feb 2019 23:42:55 +0000 (18:42 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 18 Feb 2019 15:55:30 +0000 (10:55 -0500)
The capture compose rectangle was not getting updated when setting
the source subdevice's source pad format. This causes the compose window
to be zero (or not updated) at stream start unless the capture device
format was set explicitly at the capture device node.

Fix by moving the calculation of the capture compose rectangle to
imx_media_mbus_fmt_to_pix_fmt(), and pass the rectangle to
imx_media_capture_device_set_format().

Fixes: 439d8186fb23 ("media: imx: add capture compose rectangle")
Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/staging/media/imx/imx-ic-prpencvf.c
drivers/staging/media/imx/imx-media-capture.c
drivers/staging/media/imx/imx-media-csi.c
drivers/staging/media/imx/imx-media-utils.c
drivers/staging/media/imx/imx-media.h

index 376b504e8a423fe98494750ae5b1c3c1ae0783ae..5c8e6ad8c025a370a6d0acd71468e9d6d5e2d17c 100644 (file)
@@ -912,6 +912,7 @@ static int prp_set_fmt(struct v4l2_subdev *sd,
        const struct imx_media_pixfmt *cc;
        struct v4l2_pix_format vdev_fmt;
        struct v4l2_mbus_framefmt *fmt;
+       struct v4l2_rect vdev_compose;
        int ret = 0;
 
        if (sdformat->pad >= PRPENCVF_NUM_PADS)
@@ -953,11 +954,11 @@ static int prp_set_fmt(struct v4l2_subdev *sd,
        priv->cc[sdformat->pad] = cc;
 
        /* propagate output pad format to capture device */
-       imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt,
+       imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt, &vdev_compose,
                                      &priv->format_mbus[PRPENCVF_SRC_PAD],
                                      priv->cc[PRPENCVF_SRC_PAD]);
        mutex_unlock(&priv->lock);
-       imx_media_capture_device_set_format(vdev, &vdev_fmt);
+       imx_media_capture_device_set_format(vdev, &vdev_fmt, &vdev_compose);
 
        return 0;
 out:
index f92edee63aa6520ccefac7645d878b1aa72c101d..9703c85b19c4378abe04ac2632de909c5006f330 100644 (file)
@@ -205,7 +205,8 @@ static int capture_g_fmt_vid_cap(struct file *file, void *fh,
 
 static int __capture_try_fmt_vid_cap(struct capture_priv *priv,
                                     struct v4l2_subdev_format *fmt_src,
-                                    struct v4l2_format *f)
+                                    struct v4l2_format *f,
+                                    struct v4l2_rect *compose)
 {
        const struct imx_media_pixfmt *cc, *cc_src;
 
@@ -245,7 +246,8 @@ static int __capture_try_fmt_vid_cap(struct capture_priv *priv,
                }
        }
 
-       imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix, &fmt_src->format, cc);
+       imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix, compose,
+                                     &fmt_src->format, cc);
 
        return 0;
 }
@@ -263,7 +265,7 @@ static int capture_try_fmt_vid_cap(struct file *file, void *fh,
        if (ret)
                return ret;
 
-       return __capture_try_fmt_vid_cap(priv, &fmt_src, f);
+       return __capture_try_fmt_vid_cap(priv, &fmt_src, f, NULL);
 }
 
 static int capture_s_fmt_vid_cap(struct file *file, void *fh,
@@ -271,6 +273,7 @@ static int capture_s_fmt_vid_cap(struct file *file, void *fh,
 {
        struct capture_priv *priv = video_drvdata(file);
        struct v4l2_subdev_format fmt_src;
+       struct v4l2_rect compose;
        int ret;
 
        if (vb2_is_busy(&priv->q)) {
@@ -284,17 +287,14 @@ static int capture_s_fmt_vid_cap(struct file *file, void *fh,
        if (ret)
                return ret;
 
-       ret = __capture_try_fmt_vid_cap(priv, &fmt_src, f);
+       ret = __capture_try_fmt_vid_cap(priv, &fmt_src, f, &compose);
        if (ret)
                return ret;
 
        priv->vdev.fmt.fmt.pix = f->fmt.pix;
        priv->vdev.cc = imx_media_find_format(f->fmt.pix.pixelformat,
                                              CS_SEL_ANY, true);
-       priv->vdev.compose.left = 0;
-       priv->vdev.compose.top = 0;
-       priv->vdev.compose.width = fmt_src.format.width;
-       priv->vdev.compose.height = fmt_src.format.height;
+       priv->vdev.compose = compose;
 
        return 0;
 }
@@ -655,7 +655,8 @@ static struct video_device capture_videodev = {
 };
 
 void imx_media_capture_device_set_format(struct imx_media_video_dev *vdev,
-                                        struct v4l2_pix_format *pix)
+                                        const struct v4l2_pix_format *pix,
+                                        const struct v4l2_rect *compose)
 {
        struct capture_priv *priv = to_capture_priv(vdev);
 
@@ -663,6 +664,7 @@ void imx_media_capture_device_set_format(struct imx_media_video_dev *vdev,
        priv->vdev.fmt.fmt.pix = *pix;
        priv->vdev.cc = imx_media_find_format(pix->pixelformat, CS_SEL_ANY,
                                              true);
+       priv->vdev.compose = *compose;
        mutex_unlock(&priv->mutex);
 }
 EXPORT_SYMBOL_GPL(imx_media_capture_device_set_format);
@@ -768,10 +770,8 @@ int imx_media_capture_device_register(struct imx_media_video_dev *vdev)
        }
 
        vdev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       imx_media_mbus_fmt_to_pix_fmt(&vdev->fmt.fmt.pix,
+       imx_media_mbus_fmt_to_pix_fmt(&vdev->fmt.fmt.pix, &vdev->compose,
                                      &fmt_src.format, NULL);
-       vdev->compose.width = fmt_src.format.width;
-       vdev->compose.height = fmt_src.format.height;
        vdev->cc = imx_media_find_format(vdev->fmt.fmt.pix.pixelformat,
                                         CS_SEL_ANY, false);
 
index fb5307e2ca4375b9a187d62c1c846e6f06bdd2af..5265a2cc93bc5eeda6b030df76504dae5c667d3e 100644 (file)
@@ -1502,6 +1502,7 @@ static int csi_set_fmt(struct v4l2_subdev *sd,
        struct v4l2_pix_format vdev_fmt;
        struct v4l2_mbus_framefmt *fmt;
        struct v4l2_rect *crop, *compose;
+       struct v4l2_rect vdev_compose;
        int ret;
 
        if (sdformat->pad >= CSI_NUM_PADS)
@@ -1557,11 +1558,11 @@ static int csi_set_fmt(struct v4l2_subdev *sd,
        priv->cc[sdformat->pad] = cc;
 
        /* propagate IDMAC output pad format to capture device */
-       imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt,
+       imx_media_mbus_fmt_to_pix_fmt(&vdev_fmt, &vdev_compose,
                                      &priv->format_mbus[CSI_SRC_PAD_IDMAC],
                                      priv->cc[CSI_SRC_PAD_IDMAC]);
        mutex_unlock(&priv->lock);
-       imx_media_capture_device_set_format(vdev, &vdev_fmt);
+       imx_media_capture_device_set_format(vdev, &vdev_fmt, &vdev_compose);
 
        return 0;
 out:
index 5f110d90a4ef81cd25a847134f8fbcd72e871855..e6f544528d317b85bc84df7c2fc63a3092f4abf8 100644 (file)
@@ -577,7 +577,8 @@ void imx_media_fill_default_mbus_fields(struct v4l2_mbus_framefmt *tryfmt,
 EXPORT_SYMBOL_GPL(imx_media_fill_default_mbus_fields);
 
 int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
-                                 struct v4l2_mbus_framefmt *mbus,
+                                 struct v4l2_rect *compose,
+                                 const struct v4l2_mbus_framefmt *mbus,
                                  const struct imx_media_pixfmt *cc)
 {
        u32 width;
@@ -624,6 +625,17 @@ int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
        pix->sizeimage = cc->planar ? ((stride * pix->height * cc->bpp) >> 3) :
                         stride * pix->height;
 
+       /*
+        * set capture compose rectangle, which is fixed to the
+        * source subdevice mbus format.
+        */
+       if (compose) {
+               compose->left = 0;
+               compose->top = 0;
+               compose->width = mbus->width;
+               compose->height = mbus->height;
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(imx_media_mbus_fmt_to_pix_fmt);
@@ -635,13 +647,11 @@ int imx_media_mbus_fmt_to_ipu_image(struct ipu_image *image,
 
        memset(image, 0, sizeof(*image));
 
-       ret = imx_media_mbus_fmt_to_pix_fmt(&image->pix, mbus, NULL);
+       ret = imx_media_mbus_fmt_to_pix_fmt(&image->pix, &image->rect,
+                                           mbus, NULL);
        if (ret)
                return ret;
 
-       image->rect.width = mbus->width;
-       image->rect.height = mbus->height;
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(imx_media_mbus_fmt_to_ipu_image);
index 7a0e658753f062db72bb0847ed2ce4ae23f46e87..195e858913a340c4eec988236a35b6d434f77c42 100644 (file)
@@ -180,7 +180,8 @@ void imx_media_fill_default_mbus_fields(struct v4l2_mbus_framefmt *tryfmt,
                                        struct v4l2_mbus_framefmt *fmt,
                                        bool ic_route);
 int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
-                                 struct v4l2_mbus_framefmt *mbus,
+                                 struct v4l2_rect *compose,
+                                 const struct v4l2_mbus_framefmt *mbus,
                                  const struct imx_media_pixfmt *cc);
 int imx_media_mbus_fmt_to_ipu_image(struct ipu_image *image,
                                    struct v4l2_mbus_framefmt *mbus);
@@ -261,7 +262,8 @@ void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev);
 struct imx_media_buffer *
 imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev);
 void imx_media_capture_device_set_format(struct imx_media_video_dev *vdev,
-                                        struct v4l2_pix_format *pix);
+                                        const struct v4l2_pix_format *pix,
+                                        const struct v4l2_rect *compose);
 void imx_media_capture_device_error(struct imx_media_video_dev *vdev);
 
 /* subdev group ids */