From: Boris Brezillon <boris.brezillon@collabora.com>
To: Maxime Ripard <maxime.ripard@bootlin.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>,
David Airlie <airlied@linux.ie>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Sean Paul <seanpaul@chromium.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
Hans Verkuil <hans.verkuil@cisco.com>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
linux-media@vger.kernel.org
Subject: Re: [RFC PATCH 06/20] lib: Add video format information library
Date: Wed, 20 Mar 2019 14:39:44 +0100 [thread overview]
Message-ID: <20190320143944.10454b3b@collabora.com> (raw)
In-Reply-To: <a2ecd9e599e0b536c2a005e5feb140463566788e.1553032382.git-series.maxime.ripard@bootlin.com>
On Tue, 19 Mar 2019 22:57:11 +0100
Maxime Ripard <maxime.ripard@bootlin.com> wrote:
> Move the DRM formats API to turn this into a more generic image formats API
> to be able to leverage it into some other places of the kernel, such as
> v4l2 drivers.
>
> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
> ---
> include/linux/image-formats.h | 240 +++++++++++-
> lib/Kconfig | 7 +-
> lib/Makefile | 3 +-
> lib/image-formats-selftests.c | 326 +++++++++++++++-
> lib/image-formats.c | 760 +++++++++++++++++++++++++++++++++++-
> 5 files changed, 1336 insertions(+)
> create mode 100644 include/linux/image-formats.h
> create mode 100644 lib/image-formats-selftests.c
> create mode 100644 lib/image-formats.c
>
[...]
> --- /dev/null
> +++ b/lib/image-formats.c
> @@ -0,0 +1,760 @@
> +#include <linux/bug.h>
> +#include <linux/image-formats.h>
> +#include <linux/kernel.h>
> +#include <linux/math64.h>
> +
> +#include <uapi/drm/drm_fourcc.h>
> +
> +static const struct image_format_info formats[] = {
> + {
...
> + },
> +};
> +
> +#define __image_format_lookup(_field, _fmt) \
> + ({ \
> + const struct image_format_info *format = NULL; \
> + unsigned i; \
> + \
> + for (i = 0; i < ARRAY_SIZE(formats); i++) \
> + if (formats[i]._field == _fmt) \
> + format = &formats[i]; \
> + \
> + format; \
> + })
> +
> +/**
> + * __image_format_drm_lookup - query information for a given format
> + * @drm: DRM fourcc pixel format (DRM_FORMAT_*)
> + *
> + * The caller should only pass a supported pixel format to this function.
> + *
> + * Returns:
> + * The instance of struct image_format_info that describes the pixel format, or
> + * NULL if the format is unsupported.
> + */
> +const struct image_format_info *__image_format_drm_lookup(u32 drm)
> +{
> + return __image_format_lookup(drm_fmt, drm);
> +}
> +EXPORT_SYMBOL(__image_format_drm_lookup);
> +
> +/**
> + * image_format_drm_lookup - query information for a given format
> + * @drm: DRM fourcc pixel format (DRM_FORMAT_*)
> + *
> + * The caller should only pass a supported pixel format to this function.
> + * Unsupported pixel formats will generate a warning in the kernel log.
> + *
> + * Returns:
> + * The instance of struct image_format_info that describes the pixel format, or
> + * NULL if the format is unsupported.
> + */
> +const struct image_format_info *image_format_drm_lookup(u32 drm)
> +{
> + const struct image_format_info *format;
> +
> + format = __image_format_drm_lookup(drm);
> +
> + WARN_ON(!format);
> + return format;
> +}
> +EXPORT_SYMBOL(image_format_drm_lookup);
I think this function and the DRM formats table should be moved in
drivers/gpu/drm/drm_image_format.c since they are DRM specific. The
remaining functions can IMHO be placed in include/linux/image-formats.h
as static inline funcs. This way you can get rid of lib/image-formats.c
and the associated Kconfig entry.
> +
> +/**
> + * image_format_plane_cpp - determine the bytes per pixel value
> + * @format: pointer to the image_format
> + * @plane: plane index
> + *
> + * Returns:
> + * The bytes per pixel value for the specified plane.
> + */
> +unsigned int image_format_plane_cpp(const struct image_format_info *format,
> + int plane)
> +{
> + if (!format || plane >= format->num_planes)
> + return 0;
> +
> + return format->cpp[plane];
> +}
> +EXPORT_SYMBOL(image_format_plane_cpp);
> +
> +/**
> + * image_format_plane_width - width of the plane given the first plane
> + * @format: pointer to the image_format
> + * @width: width of the first plane
> + * @plane: plane index
> + *
> + * Returns:
> + * The width of @plane, given that the width of the first plane is @width.
> + */
> +unsigned int image_format_plane_width(int width,
> + const struct image_format_info *format,
> + int plane)
> +{
> + if (!format || plane >= format->num_planes)
> + return 0;
> +
> + if (plane == 0)
> + return width;
> +
> + return width / format->hsub;
> +}
> +EXPORT_SYMBOL(image_format_plane_width);
> +
> +/**
> + * image_format_plane_height - height of the plane given the first plane
> + * @format: pointer to the image_format
> + * @height: height of the first plane
> + * @plane: plane index
> + *
> + * Returns:
> + * The height of @plane, given that the height of the first plane is @height.
> + */
> +unsigned int image_format_plane_height(int height,
> + const struct image_format_info *format,
> + int plane)
> +{
> + if (!format || plane >= format->num_planes)
> + return 0;
> +
> + if (plane == 0)
> + return height;
> +
> + return height / format->vsub;
> +}
> +EXPORT_SYMBOL(image_format_plane_height);
> +
> +/**
> + * image_format_block_width - width in pixels of block.
> + * @format: pointer to the image_format
> + * @plane: plane index
> + *
> + * Returns:
> + * The width in pixels of a block, depending on the plane index.
> + */
> +unsigned int image_format_block_width(const struct image_format_info *format,
> + int plane)
> +{
> + if (!format || plane < 0 || plane >= format->num_planes)
> + return 0;
> +
> + if (!format->block_w[plane])
> + return 1;
> +
> + return format->block_w[plane];
> +}
> +EXPORT_SYMBOL(image_format_block_width);
> +
> +/**
> + * image_format_block_height - height in pixels of a block
> + * @info: pointer to the image_format
> + * @plane: plane index
> + *
> + * Returns:
> + * The height in pixels of a block, depending on the plane index.
> + */
> +unsigned int image_format_block_height(const struct image_format_info *format,
> + int plane)
> +{
> + if (!format || plane < 0 || plane >= format->num_planes)
> + return 0;
> +
> + if (!format->block_h[plane])
> + return 1;
> +
> + return format->block_h[plane];
> +}
> +EXPORT_SYMBOL(image_format_block_height);
> +
> +/**
> + * image_format_min_pitch - computes the minimum required pitch in bytes
> + * @info: pixel format info
> + * @plane: plane index
> + * @buffer_width: buffer width in pixels
> + *
> + * Returns:
> + * The minimum required pitch in bytes for a buffer by taking into consideration
> + * the pixel format information and the buffer width.
> + */
> +uint64_t image_format_min_pitch(const struct image_format_info *info,
> + int plane, unsigned int buffer_width)
> +{
> + if (!info || plane < 0 || plane >= info->num_planes)
> + return 0;
> +
> + return DIV_ROUND_UP_ULL((u64)buffer_width * info->char_per_block[plane],
> + image_format_block_width(info, plane) *
> + image_format_block_height(info, plane));
> +}
> +EXPORT_SYMBOL(image_format_min_pitch);
next prev parent reply other threads:[~2019-03-20 13:39 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-19 21:57 [RFC PATCH 00/20] drm: Split out the formats API and move it to a common place Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 01/20] drm: Remove users of drm_format_num_planes Maxime Ripard
2019-03-20 14:16 ` Paul Kocialkowski
2019-04-02 9:43 ` Emil Velikov
2019-04-02 14:51 ` Maxime Ripard
2019-04-04 16:24 ` Emil Velikov
2019-03-19 21:57 ` [RFC PATCH 02/20] drm: Remove users of drm_format_(horz|vert)_chroma_subsampling Maxime Ripard
2019-03-20 14:19 ` Paul Kocialkowski
2019-03-19 21:57 ` [RFC PATCH 03/20] drm/fourcc: Pass the format_info pointer to drm_format_plane_cpp Maxime Ripard
2019-03-20 14:24 ` Paul Kocialkowski
2019-03-21 10:13 ` Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 04/20] drm/fourcc: Pass the format_info pointer to drm_format_plane_width/height Maxime Ripard
2019-03-20 14:26 ` Paul Kocialkowski
2019-03-19 21:57 ` [RFC PATCH 05/20] drm: Replace instances of drm_format_info by drm_get_format_info Maxime Ripard
2019-03-20 14:27 ` Paul Kocialkowski
2019-03-19 21:57 ` [RFC PATCH 06/20] lib: Add video format information library Maxime Ripard
2019-03-20 13:39 ` Boris Brezillon [this message]
2019-03-21 8:20 ` Maxime Ripard
2019-03-21 8:40 ` Boris Brezillon
2019-03-19 21:57 ` [RFC PATCH 07/20] drm/fb: Move from drm_format_info to image_format_info Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 08/20] drm/malidp: Convert to generic image format library Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 09/20] drm/client: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 10/20] drm/exynos: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 11/20] drm/i915: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 12/20] drm/ipuv3: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 13/20] drm/msm: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 14/20] drm/omap: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 15/20] drm/rockchip: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 16/20] drm/tegra: " Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 17/20] drm/fourcc: Remove old DRM format API Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 18/20] lib: image-formats: Add v4l2 formats support Maxime Ripard
2019-03-19 23:29 ` Nicolas Dufresne
2019-03-20 14:27 ` Ville Syrjälä
2019-03-20 15:51 ` Nicolas Dufresne
2019-03-20 16:09 ` Ville Syrjälä
2019-03-20 16:30 ` Nicolas Dufresne
2019-03-20 16:41 ` Ville Syrjälä
2019-03-20 18:27 ` Nicolas Dufresne
2019-03-20 18:39 ` Ville Syrjälä
2019-03-21 16:04 ` Paul Kocialkowski
2019-03-21 16:35 ` Ville Syrjälä
2019-03-21 19:14 ` Nicolas Dufresne
2019-03-21 21:44 ` Ville Syrjälä
2019-03-22 18:24 ` Nicolas Dufresne
2019-03-22 18:44 ` Ville Syrjälä
2019-03-22 19:25 ` Nicolas Dufresne
2019-03-22 14:42 ` Ville Syrjälä
2019-03-22 18:11 ` Nicolas Dufresne
2019-03-20 18:15 ` Brian Starkey
2019-03-21 15:47 ` Maxime Ripard
2019-03-22 19:55 ` Nicolas Dufresne
2019-04-01 14:44 ` Maxime Ripard
2019-04-11 7:24 ` Hans Verkuil
2019-04-11 7:38 ` Hans Verkuil
2019-04-11 15:55 ` Maxime Ripard
2019-04-11 7:12 ` Hans Verkuil
2019-04-11 7:15 ` Hans Verkuil
2019-03-19 21:57 ` [RFC PATCH 19/20] lib: image-formats: Add more functions Maxime Ripard
2019-03-19 21:57 ` [RFC PATCH 20/20] media: sun6i: Convert to the image format API Maxime Ripard
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=20190320143944.10454b3b@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=airlied@linux.ie \
--cc=daniel.vetter@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=hans.verkuil@cisco.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=maxime.ripard@bootlin.com \
--cc=mchehab@kernel.org \
--cc=paul.kocialkowski@bootlin.com \
--cc=sakari.ailus@linux.intel.com \
--cc=seanpaul@chromium.org \
--cc=thomas.petazzoni@bootlin.com \
/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).