linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "André Almeida" <andrealmeid@collabora.com>
To: linux-media@vger.kernel.org
Cc: mchehab@kernel.org, hverkuil@xs4all.nl,
	helen.koike@collabora.com, lucmaga@gmail.com,
	linux-kernel@vger.kernel.org, kernel@collabora.com
Subject: [PATCH 07/16] media: vimc: cap: Add handler for singleplanar fmt ioctls
Date: Fri, 15 Mar 2019 13:43:50 -0300	[thread overview]
Message-ID: <20190315164359.626-8-andrealmeid@collabora.com> (raw)
In-Reply-To: <20190315164359.626-1-andrealmeid@collabora.com>

Since multiplanar is a superset of single planar formats, instead of
having different implementations for them, treat all formats as
multiplanar. If we need to work with single planar formats, convert them to
multiplanar (with num_planes = 1), re-use the multiplanar code, and
transform them back to single planar. This is implemented with
v4l2_fmt_sp2mp_func().

Signed-off-by: André Almeida <andrealmeid@collabora.com>
---
 drivers/media/platform/vimc/vimc-capture.c | 63 +++++++++++++++++-----
 1 file changed, 50 insertions(+), 13 deletions(-)

diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c
index a93241d53953..47acf50f1ad2 100644
--- a/drivers/media/platform/vimc/vimc-capture.c
+++ b/drivers/media/platform/vimc/vimc-capture.c
@@ -127,7 +127,7 @@ static int vimc_cap_g_fmt_vid_cap(struct file *file, void *priv,
 static int vimc_cap_try_fmt_vid_cap(struct file *file, void *priv,
 				    struct v4l2_format *f)
 {
-	struct v4l2_pix_format *format = &f->fmt.pix;
+	struct v4l2_pix_format_mplane *format = &f->fmt.pix_mp;
 
 	format->width = clamp_t(u32, format->width, VIMC_FRAME_MIN_WIDTH,
 				VIMC_FRAME_MAX_WIDTH) & ~1;
@@ -145,20 +145,58 @@ static int vimc_cap_try_fmt_vid_cap(struct file *file, void *priv,
 	if (!v4l2_format_info(format->pixelformat))
 		format->pixelformat = fmt_default.fmt.pix.pixelformat;
 
-	return v4l2_fill_pixfmt(format, format->pixelformat,
+	return v4l2_fill_pixfmt_mp(format, format->pixelformat,
 				format->width, format->height);
 }
 
-static int vimc_cap_s_fmt_vid_cap(struct file *file, void *priv,
+static int vimc_cap_enum_fmt_vid_cap(struct file *file, void *priv,
+				     struct v4l2_fmtdesc *f)
+{
+	if (f->index >= ARRAY_SIZE(vimc_cap_supported_pixfmt))
+		return -EINVAL;
+
+	f->pixelformat = vimc_cap_supported_pixfmt[f->index];
+	strncpy(f->description, v4l2_get_fourcc_name(f->pixelformat), 4);
+	f->description[4] = '\0';
+
+	return 0;
+}
+
+/*
+ * VIDIOC FMT handlers for single-planar
+ */
+
+static int vimc_cap_g_fmt_vid_cap_sp(struct file *file, void *priv,
+				  struct v4l2_format *f)
+{
+	if (multiplanar)
+		return -EINVAL;
+
+	return vimc_cap_g_fmt_vid_cap(file, priv, f);
+}
+
+static int vimc_cap_try_fmt_vid_cap_sp(struct file *file, void *priv,
+				  struct v4l2_format *f)
+{
+	if (multiplanar)
+		return -EINVAL;
+
+	return v4l2_fmt_sp2mp_func(file, priv, f, vimc_cap_try_fmt_vid_cap);
+}
+
+static int vimc_cap_s_fmt_vid_cap_sp(struct file *file, void *priv,
 				  struct v4l2_format *f)
 {
 	struct vimc_cap_device *vcap = video_drvdata(file);
 
+	if (multiplanar)
+		return -EINVAL;
+
 	/* Do not change the format while stream is on */
 	if (vb2_is_busy(&vcap->queue))
 		return -EBUSY;
 
-	vimc_cap_try_fmt_vid_cap(file, priv, f);
+	v4l2_fmt_sp2mp_func(file, priv, f, vimc_cap_try_fmt_vid_cap);
 
 	dev_dbg(vcap->dev, "%s: format update: "
 		"old:%dx%d (0x%x, %d, %d, %d, %d) "
@@ -181,15 +219,13 @@ static int vimc_cap_s_fmt_vid_cap(struct file *file, void *priv,
 	return 0;
 }
 
-static int vimc_cap_enum_fmt_vid_cap(struct file *file, void *priv,
+static int vimc_cap_enum_fmt_vid_cap_sp(struct file *file, void *priv,
 				     struct v4l2_fmtdesc *f)
 {
-	if (f->index >= ARRAY_SIZE(vimc_cap_supported_pixfmt))
+	if (multiplanar)
 		return -EINVAL;
 
-	f->pixelformat = vimc_cap_supported_pixfmt[f->index];
-
-	return 0;
+	return vimc_cap_enum_fmt_vid_cap(file, priv, f);
 }
 
 static bool vimc_cap_is_pixfmt_supported(u32 pixelformat)
@@ -235,10 +271,11 @@ static const struct v4l2_file_operations vimc_cap_fops = {
 static const struct v4l2_ioctl_ops vimc_cap_ioctl_ops = {
 	.vidioc_querycap = vimc_cap_querycap,
 
-	.vidioc_g_fmt_vid_cap = vimc_cap_g_fmt_vid_cap,
-	.vidioc_s_fmt_vid_cap = vimc_cap_s_fmt_vid_cap,
-	.vidioc_try_fmt_vid_cap = vimc_cap_try_fmt_vid_cap,
-	.vidioc_enum_fmt_vid_cap = vimc_cap_enum_fmt_vid_cap,
+	.vidioc_g_fmt_vid_cap = vimc_cap_g_fmt_vid_cap_sp,
+	.vidioc_s_fmt_vid_cap = vimc_cap_s_fmt_vid_cap_sp,
+	.vidioc_try_fmt_vid_cap = vimc_cap_try_fmt_vid_cap_sp,
+	.vidioc_enum_fmt_vid_cap = vimc_cap_enum_fmt_vid_cap_sp,
+
 	.vidioc_enum_framesizes = vimc_cap_enum_framesizes,
 
 	.vidioc_reqbufs = vb2_ioctl_reqbufs,
-- 
2.21.0


  parent reply	other threads:[~2019-03-15 16:45 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-15 16:43 [PATCH 00/16] media: vimc: Add support for multiplanar formats André Almeida
2019-03-15 16:43 ` [PATCH 01/16] media: Move sp2mp functions to v4l2-common André Almeida
2019-03-15 19:30   ` Helen Koike
2019-03-15 16:43 ` [PATCH 02/16] media: vimc: Remove unnecessary stream check André Almeida
2019-03-15 16:43 ` [PATCH 03/16] media: vimc: Check if the stream is on using ved.stream André Almeida
2019-03-15 19:30   ` Helen Koike
2019-03-15 16:43 ` [PATCH 04/16] media: vimc: cap: Change vimc_cap_device.format type André Almeida
2019-03-15 16:43 ` [PATCH 05/16] media: vimc: Create multiplanar parameter André Almeida
2019-03-15 19:30   ` Helen Koike
2019-03-15 16:43 ` [PATCH 06/16] media: vimc: cap: Dynamically define stream pixelformat André Almeida
2019-03-15 16:43 ` André Almeida [this message]
2019-03-15 19:31   ` [PATCH 07/16] media: vimc: cap: Add handler for singleplanar fmt ioctls Helen Koike
2019-03-15 16:43 ` [PATCH 08/16] media: vimc: cap: Add handler for multiplanar " André Almeida
2019-03-15 19:31   ` Helen Koike
2019-03-15 16:43 ` [PATCH 09/16] media: vimc: cap: Add multiplanar formats André Almeida
2019-03-15 19:31   ` Helen Koike
2019-03-15 16:43 ` [PATCH 10/16] media: vimc: cap: Add multiplanar default format André Almeida
2019-03-15 16:43 ` [PATCH 11/16] media: vimc: cap: Allocate and verify mplanar buffers André Almeida
2019-03-15 16:43 ` [PATCH 12/16] media: vimc: Add and use new struct vimc_frame André Almeida
2019-03-15 19:31   ` Helen Koike
2019-03-15 16:43 ` [PATCH 13/16] media: vimc: sen: Add support for multiplanar formats André Almeida
2019-03-15 19:32   ` Helen Koike
2019-03-15 16:43 ` [PATCH 14/16] media: vimc: sca: " André Almeida
2019-03-15 19:32   ` Helen Koike
2019-03-15 16:43 ` [PATCH 15/16] media: vimc: cap: " André Almeida
2019-03-15 16:43 ` [PATCH 16/16] media: vimc: cap: Dynamically define device caps André Almeida
2019-03-15 17:29 ` [PATCH 00/16] media: vimc: Add support for multiplanar formats André Almeida
2019-03-15 19:32   ` Helen Koike

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190315164359.626-8-andrealmeid@collabora.com \
    --to=andrealmeid@collabora.com \
    --cc=helen.koike@collabora.com \
    --cc=hverkuil@xs4all.nl \
    --cc=kernel@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=lucmaga@gmail.com \
    --cc=mchehab@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).