From: Sylwester Nawrocki <snawrocki@kernel.org>
To: Sakari Ailus <sakari.ailus@iki.fi>, Hans Verkuil <hverkuil@xs4all.nl>
Cc: linux-media@vger.kernel.org, Hans Verkuil <hansverk@cisco.com>,
Marek Szyprowski <m.szyprowski@samsung.com>
Subject: Re: [RFC PATCH 1/2] v4l2-ioctl/exynos: fix G/S_SELECTION's type handling
Date: Sun, 18 Jun 2017 22:53:48 +0200 [thread overview]
Message-ID: <baf6fee6-3c65-5aea-f042-cfdd6698e4ba@kernel.org> (raw)
In-Reply-To: <20170616125827.GQ12407@valkosipuli.retiisi.org.uk>
Hi,
On 06/16/2017 02:58 PM, Sakari Ailus wrote:
> Hi Hans,
>
> Cc Sylwester and Marek as well.
>
> On Mon, May 08, 2017 at 04:35:05PM +0200, Hans Verkuil wrote:
>> From: Hans Verkuil <hansverk@cisco.com>
>>
>> The type field in struct v4l2_selection is supposed to never use the
>> _MPLANE variants. E.g. if the driver supports V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
>> then userspace should still pass V4L2_BUF_TYPE_VIDEO_CAPTURE.
>>
>> The reasons for this are lost in the mists of time, but it is really
>> annoying. In addition, the exynos drivers didn't follow this rule and
>> instead expected the _MPLANE type.
>>
>> To fix that code is added to the v4l2 core that maps the _MPLANE buffer
>> types to their regular equivalents before calling the driver.
>>
>> Effectively this allows for userspace to use either _MPLANE or the regular
>> buffer type. This keeps backwards compatibility while making things easier
>> for userspace.
>>
>> Since drivers now never see the _MPLANE buffer types the exynos drivers
>> had to be adapted as well.
>>
>> Signed-off-by: Hans Verkuil <hansverk@cisco.com>
>> ---
>> drivers/media/platform/exynos-gsc/gsc-core.c | 4 +-
>> drivers/media/platform/exynos-gsc/gsc-m2m.c | 8 ++--
>> drivers/media/platform/exynos4-is/fimc-capture.c | 4 +-
>> drivers/media/platform/exynos4-is/fimc-lite.c | 4 +-
>> drivers/media/v4l2-core/v4l2-ioctl.c | 53 +++++++++++++++++++++---
>> 5 files changed, 57 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
>> index 59a634201830..107faa04c947 100644
>> --- a/drivers/media/platform/exynos-gsc/gsc-core.c
>> +++ b/drivers/media/platform/exynos-gsc/gsc-core.c
>> +/*
>> + * The selection API specified originally that the _MPLANE buffer types
>> + * shouldn't be used. The reasons for this are lost in the mists of time
>> + * (or just really crappy memories). Regardless, this is really annoying
>> + * for userspace. So to keep things simple we map _MPLANE buffer types
>> + * to their 'regular' counterparts before calling the driver. And we
>> + * restore it afterwards. This way applications can use either buffer
>> + * type and drivers don't need to check for both.
I agree this is annoying the _MPLANE buffer types are excluded this way.
I suspect one of the main reasons was bias of the original author of the
selection API to the multi-planar API. Now the API got messy because I didn't
adhere to this rule of buffer type change for VIDIOC_S_SELECTION, and the
code propagated to the other driver. Sorry about that.
I checked GStreamer and AFAIU there is no change of buffer type for
S_SELECTION there:
https://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/sys/v4l2/gstv4l2object.c?id=3342d86d9b92cf60c419b728d10944968d77ecac#n3722
>> + */
>> +static int v4l_g_selection(const struct v4l2_ioctl_ops *ops,
>> + struct file *file, void *fh, void *arg)
>> +{
>> + struct v4l2_selection *p = arg;
>> + u32 old_type = p->type;
>> + int ret;
>> +
>> + if (p->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
>> + p->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>> + else if (p->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
>> + p->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
>> + ret = ops->vidioc_g_selection(file, fh, p);
>> + p->type = old_type;
>> + return ret;
>> +}
>> +
>> +static int v4l_s_selection(const struct v4l2_ioctl_ops *ops,
>> + struct file *file, void *fh, void *arg)
>> +{
>> + struct v4l2_selection *p = arg;
>> + u32 old_type = p->type;
>> + int ret;
>> +
>> + if (p->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
>> + p->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>> + else if (p->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
>> + p->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
>> + ret = ops->vidioc_s_selection(file, fh, p);
>
> Can it be that ops->vidioc_s_selection() is NULL here? I don't think it's
> checked anywhere. Same in v4l_g_selection().
I think it can't be, there is the valid_ioctls bitmap test before a call back
to the driver, to see if driver actually implements an ioctl. And the bitmap
is populated beforehand in determine_valid_ioctls().
--
Regards,
Sylwester
next prev parent reply other threads:[~2017-06-18 20:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-08 14:35 [RFC PATCH 1/2] v4l2-ioctl/exynos: fix G/S_SELECTION's type handling Hans Verkuil
2017-05-08 14:35 ` [RFC PATCH 2/2] media/uapi/v4l: clarify cropcap/crop/selection behavior Hans Verkuil
2017-06-16 13:08 ` Sakari Ailus
2017-06-18 21:25 ` Sylwester Nawrocki
2017-06-19 7:35 ` Hans Verkuil
2017-06-19 9:17 ` Sylwester Nawrocki
2017-06-16 12:58 ` [RFC PATCH 1/2] v4l2-ioctl/exynos: fix G/S_SELECTION's type handling Sakari Ailus
2017-06-18 20:53 ` Sylwester Nawrocki [this message]
2017-06-18 21:18 ` Sakari Ailus
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=baf6fee6-3c65-5aea-f042-cfdd6698e4ba@kernel.org \
--to=snawrocki@kernel.org \
--cc=hansverk@cisco.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=sakari.ailus@iki.fi \
/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