Message ID | a9af304793a38b6001c9155f36e370002926841c.1555487650.git-series.maxime.ripard@bootlin.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm: Split out the formats API and move it to a common place | expand |
Hi Maxime, On 4/17/19 9:54 AM, Maxime Ripard wrote: > V4L2 uses different fourcc's than DRM, and has a different set of formats. > For now, let's add the v4l2 fourcc's for the already existing formats. For this lib to be more useful for V4L2, would it be a good idea to add Bayer formats as well? This can be done in a separate patch. Those formats are V4L specific, but are very common. Regards, Hans > > Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> > --- > include/linux/image-formats.h | 9 +++++- > lib/image-formats.c | 62 ++++++++++++++++++++++++++++++++++++- > 2 files changed, 71 insertions(+) > > diff --git a/include/linux/image-formats.h b/include/linux/image-formats.h > index ec43d9f9a527..b78b8e861fc9 100644 > --- a/include/linux/image-formats.h > +++ b/include/linux/image-formats.h > @@ -50,6 +50,13 @@ struct image_format_info { > }; > > /** > + * @v4l2_fmt: > + * > + * V4L2 4CC format identifier (V4L2_PIX_FMT_*) > + */ > + u32 v4l2_fmt; > + > + /** > * @depth: > * > * Color depth (number of bits per pixel excluding padding bits), > @@ -382,6 +389,8 @@ uint64_t image_format_info_min_pitch(const struct image_format_info *info, > } > > const struct image_format_info *__image_format_drm_lookup(u32 drm); > +const struct image_format_info *__image_format_v4l2_lookup(u32 v4l2); > const struct image_format_info *image_format_drm_lookup(u32 drm); > +const struct image_format_info *image_format_v4l2_lookup(u32 v4l2); > > #endif /* _IMAGE_FORMATS_H_ */ > diff --git a/lib/image-formats.c b/lib/image-formats.c > index 1e52a7410222..25fa22d243fb 100644 > --- a/lib/image-formats.c > +++ b/lib/image-formats.c > @@ -25,12 +25,14 @@ > #include <linux/image-formats.h> > #include <linux/kernel.h> > #include <linux/math64.h> > +#include <linux/videodev2.h> > > #include <uapi/drm/drm_fourcc.h> > > static const struct image_format_info formats[] = { > { > .drm_fmt = DRM_FORMAT_C8, > + .v4l2_fmt = V4L2_PIX_FMT_GREY, > .depth = 8, > .num_planes = 1, > .cpp = { 1, 0, 0 }, > @@ -38,6 +40,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_RGB332, > + .v4l2_fmt = V4L2_PIX_FMT_RGB332, > .depth = 8, > .num_planes = 1, > .cpp = { 1, 0, 0 }, > @@ -172,6 +175,7 @@ static const struct image_format_info formats[] = { > .has_alpha = true, > }, { > .drm_fmt = DRM_FORMAT_RGB565, > + .v4l2_fmt = V4L2_PIX_FMT_RGB565X, > .depth = 16, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -186,6 +190,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_RGB888, > + .v4l2_fmt = V4L2_PIX_FMT_BGR24, > .depth = 24, > .num_planes = 1, > .cpp = { 3, 0, 0 }, > @@ -193,6 +198,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_BGR888, > + .v4l2_fmt = V4L2_PIX_FMT_RGB24, > .depth = 24, > .num_planes = 1, > .cpp = { 3, 0, 0 }, > @@ -200,6 +206,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_XRGB8888, > + .v4l2_fmt = V4L2_PIX_FMT_XBGR32, > .depth = 24, > .num_planes = 1, > .cpp = { 4, 0, 0 }, > @@ -304,6 +311,7 @@ static const struct image_format_info formats[] = { > .has_alpha = true, > }, { > .drm_fmt = DRM_FORMAT_ARGB8888, > + .v4l2_fmt = V4L2_PIX_FMT_ABGR32, > .depth = 32, > .num_planes = 1, > .cpp = { 4, 0, 0 }, > @@ -384,6 +392,7 @@ static const struct image_format_info formats[] = { > .has_alpha = true, > }, { > .drm_fmt = DRM_FORMAT_YUV410, > + .v4l2_fmt = V4L2_PIX_FMT_YUV410, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -392,6 +401,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YVU410, > + .v4l2_fmt = V4L2_PIX_FMT_YVU410, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -416,6 +426,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUV420, > + .v4l2_fmt = V4L2_PIX_FMT_YUV420, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -424,6 +435,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YVU420, > + .v4l2_fmt = V4L2_PIX_FMT_YVU420, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -432,6 +444,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUV422, > + .v4l2_fmt = V4L2_PIX_FMT_YUV422P, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -448,6 +461,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUV444, > + .v4l2_fmt = V4L2_PIX_FMT_YUV444, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -464,6 +478,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_NV12, > + .v4l2_fmt = V4L2_PIX_FMT_NV12, > .depth = 0, > .num_planes = 2, > .cpp = { 1, 2, 0 }, > @@ -472,6 +487,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_NV21, > + .v4l2_fmt = V4L2_PIX_FMT_NV21, > .depth = 0, > .num_planes = 2, > .cpp = { 1, 2, 0 }, > @@ -480,6 +496,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_NV16, > + .v4l2_fmt = V4L2_PIX_FMT_NV16, > .depth = 0, > .num_planes = 2, > .cpp = { 1, 2, 0 }, > @@ -488,6 +505,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_NV61, > + .v4l2_fmt = V4L2_PIX_FMT_NV61, > .depth = 0, > .num_planes = 2, > .cpp = { 1, 2, 0 }, > @@ -496,6 +514,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_NV24, > + .v4l2_fmt = V4L2_PIX_FMT_NV24, > .depth = 0, > .num_planes = 2, > .cpp = { 1, 2, 0 }, > @@ -504,6 +523,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_NV42, > + .v4l2_fmt = V4L2_PIX_FMT_NV42, > .depth = 0, > .num_planes = 2, > .cpp = { 1, 2, 0 }, > @@ -512,6 +532,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUYV, > + .v4l2_fmt = V4L2_PIX_FMT_YUYV, > .depth = 0, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -520,6 +541,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YVYU, > + .v4l2_fmt = V4L2_PIX_FMT_YVYU, > .depth = 0, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -528,6 +550,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_UYVY, > + .v4l2_fmt = V4L2_PIX_FMT_UYVY, > .depth = 0, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -536,6 +559,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_VYUY, > + .v4l2_fmt = V4L2_PIX_FMT_VYUY, > .depth = 0, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -653,3 +677,41 @@ const struct image_format_info *image_format_drm_lookup(u32 drm) > return format; > } > EXPORT_SYMBOL(image_format_drm_lookup); > + > +/** > + * __image_format_v4l2_lookup - query information for a given format > + * @v4l2: V4L2 fourcc pixel format (V4L2_PIX_FMT_*) > + * > + * 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_v4l2_lookup(u32 v4l2) > +{ > + return __image_format_lookup(v4l2_fmt, v4l2); > +} > +EXPORT_SYMBOL(__image_format_v4l2_lookup); > + > +/** > + * image_format_v4l2_lookup - query information for a given format > + * @v4l2: V4L2 fourcc pixel format (V4L2_PIX_FMT_*) > + * > + * 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_v4l2_lookup(u32 v4l2) > +{ > + const struct image_format_info *format; > + > + format = __image_format_v4l2_lookup(v4l2); > + > + WARN_ON(!format); > + return format; > +} > +EXPORT_SYMBOL(image_format_v4l2_lookup); >
Hi Hans On Thu, May 02, 2019 at 10:24:00AM +0200, Hans Verkuil wrote: > On 4/17/19 9:54 AM, Maxime Ripard wrote: > > V4L2 uses different fourcc's than DRM, and has a different set of formats. > > For now, let's add the v4l2 fourcc's for the already existing formats. > > For this lib to be more useful for V4L2, would it be a good idea to add > Bayer formats as well? This can be done in a separate patch. > > Those formats are V4L specific, but are very common. Yeah, this was mostly to support the formats that are already supported as of today, but eventually more are going to be supported, and the bayer formats seems like a natural choice :) Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
diff --git a/include/linux/image-formats.h b/include/linux/image-formats.h index ec43d9f9a527..b78b8e861fc9 100644 --- a/include/linux/image-formats.h +++ b/include/linux/image-formats.h @@ -50,6 +50,13 @@ struct image_format_info { }; /** + * @v4l2_fmt: + * + * V4L2 4CC format identifier (V4L2_PIX_FMT_*) + */ + u32 v4l2_fmt; + + /** * @depth: * * Color depth (number of bits per pixel excluding padding bits), @@ -382,6 +389,8 @@ uint64_t image_format_info_min_pitch(const struct image_format_info *info, } const struct image_format_info *__image_format_drm_lookup(u32 drm); +const struct image_format_info *__image_format_v4l2_lookup(u32 v4l2); const struct image_format_info *image_format_drm_lookup(u32 drm); +const struct image_format_info *image_format_v4l2_lookup(u32 v4l2); #endif /* _IMAGE_FORMATS_H_ */ diff --git a/lib/image-formats.c b/lib/image-formats.c index 1e52a7410222..25fa22d243fb 100644 --- a/lib/image-formats.c +++ b/lib/image-formats.c @@ -25,12 +25,14 @@ #include <linux/image-formats.h> #include <linux/kernel.h> #include <linux/math64.h> +#include <linux/videodev2.h> #include <uapi/drm/drm_fourcc.h> static const struct image_format_info formats[] = { { .drm_fmt = DRM_FORMAT_C8, + .v4l2_fmt = V4L2_PIX_FMT_GREY, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, @@ -38,6 +40,7 @@ static const struct image_format_info formats[] = { .vsub = 1, }, { .drm_fmt = DRM_FORMAT_RGB332, + .v4l2_fmt = V4L2_PIX_FMT_RGB332, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, @@ -172,6 +175,7 @@ static const struct image_format_info formats[] = { .has_alpha = true, }, { .drm_fmt = DRM_FORMAT_RGB565, + .v4l2_fmt = V4L2_PIX_FMT_RGB565X, .depth = 16, .num_planes = 1, .cpp = { 2, 0, 0 }, @@ -186,6 +190,7 @@ static const struct image_format_info formats[] = { .vsub = 1, }, { .drm_fmt = DRM_FORMAT_RGB888, + .v4l2_fmt = V4L2_PIX_FMT_BGR24, .depth = 24, .num_planes = 1, .cpp = { 3, 0, 0 }, @@ -193,6 +198,7 @@ static const struct image_format_info formats[] = { .vsub = 1, }, { .drm_fmt = DRM_FORMAT_BGR888, + .v4l2_fmt = V4L2_PIX_FMT_RGB24, .depth = 24, .num_planes = 1, .cpp = { 3, 0, 0 }, @@ -200,6 +206,7 @@ static const struct image_format_info formats[] = { .vsub = 1, }, { .drm_fmt = DRM_FORMAT_XRGB8888, + .v4l2_fmt = V4L2_PIX_FMT_XBGR32, .depth = 24, .num_planes = 1, .cpp = { 4, 0, 0 }, @@ -304,6 +311,7 @@ static const struct image_format_info formats[] = { .has_alpha = true, }, { .drm_fmt = DRM_FORMAT_ARGB8888, + .v4l2_fmt = V4L2_PIX_FMT_ABGR32, .depth = 32, .num_planes = 1, .cpp = { 4, 0, 0 }, @@ -384,6 +392,7 @@ static const struct image_format_info formats[] = { .has_alpha = true, }, { .drm_fmt = DRM_FORMAT_YUV410, + .v4l2_fmt = V4L2_PIX_FMT_YUV410, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, @@ -392,6 +401,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YVU410, + .v4l2_fmt = V4L2_PIX_FMT_YVU410, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, @@ -416,6 +426,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YUV420, + .v4l2_fmt = V4L2_PIX_FMT_YUV420, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, @@ -424,6 +435,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YVU420, + .v4l2_fmt = V4L2_PIX_FMT_YVU420, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, @@ -432,6 +444,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YUV422, + .v4l2_fmt = V4L2_PIX_FMT_YUV422P, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, @@ -448,6 +461,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YUV444, + .v4l2_fmt = V4L2_PIX_FMT_YUV444, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, @@ -464,6 +478,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_NV12, + .v4l2_fmt = V4L2_PIX_FMT_NV12, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, @@ -472,6 +487,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_NV21, + .v4l2_fmt = V4L2_PIX_FMT_NV21, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, @@ -480,6 +496,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_NV16, + .v4l2_fmt = V4L2_PIX_FMT_NV16, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, @@ -488,6 +505,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_NV61, + .v4l2_fmt = V4L2_PIX_FMT_NV61, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, @@ -496,6 +514,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_NV24, + .v4l2_fmt = V4L2_PIX_FMT_NV24, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, @@ -504,6 +523,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_NV42, + .v4l2_fmt = V4L2_PIX_FMT_NV42, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, @@ -512,6 +532,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YUYV, + .v4l2_fmt = V4L2_PIX_FMT_YUYV, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, @@ -520,6 +541,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_YVYU, + .v4l2_fmt = V4L2_PIX_FMT_YVYU, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, @@ -528,6 +550,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_UYVY, + .v4l2_fmt = V4L2_PIX_FMT_UYVY, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, @@ -536,6 +559,7 @@ static const struct image_format_info formats[] = { .is_yuv = true, }, { .drm_fmt = DRM_FORMAT_VYUY, + .v4l2_fmt = V4L2_PIX_FMT_VYUY, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, @@ -653,3 +677,41 @@ const struct image_format_info *image_format_drm_lookup(u32 drm) return format; } EXPORT_SYMBOL(image_format_drm_lookup); + +/** + * __image_format_v4l2_lookup - query information for a given format + * @v4l2: V4L2 fourcc pixel format (V4L2_PIX_FMT_*) + * + * 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_v4l2_lookup(u32 v4l2) +{ + return __image_format_lookup(v4l2_fmt, v4l2); +} +EXPORT_SYMBOL(__image_format_v4l2_lookup); + +/** + * image_format_v4l2_lookup - query information for a given format + * @v4l2: V4L2 fourcc pixel format (V4L2_PIX_FMT_*) + * + * 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_v4l2_lookup(u32 v4l2) +{ + const struct image_format_info *format; + + format = __image_format_v4l2_lookup(v4l2); + + WARN_ON(!format); + return format; +} +EXPORT_SYMBOL(image_format_v4l2_lookup);
V4L2 uses different fourcc's than DRM, and has a different set of formats. For now, let's add the v4l2 fourcc's for the already existing formats. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> --- include/linux/image-formats.h | 9 +++++- lib/image-formats.c | 62 ++++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+)