Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp8485img; Tue, 19 Mar 2019 16:30:14 -0700 (PDT) X-Google-Smtp-Source: APXvYqwPTXrAJVPc4QPA5PrUsYFxUnemFxQp3ULpeYG7Obc0jh4JqT48J2+a6Z4l+BuijioD4QTk X-Received: by 2002:a63:6cc1:: with SMTP id h184mr4332344pgc.151.1553038214124; Tue, 19 Mar 2019 16:30:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553038214; cv=none; d=google.com; s=arc-20160816; b=v6Tz3EnSf1jtHLdCijlFwUrlNuR00EU/RsA1K4sVJKViaYky/m+IZXpia4wOLa4sHG rm3Jy7fAfeeomtlD4myoLmtj3niip33mGHlzgT+Jw2Rd7eiI0UvgzuYAdbXvwz8aucJH 1CXmbGkpuXWXKij9YeIjOkFtWWqCq91KpVwekLTTbmfY0AKGAUdOow7NTBKZ4rKjMoGV q7KL9J5bSYPcFAOSii0//ahAATwYnYLfmS3ESno5P2iVuY0ukkosiZj4o5maD7YlOdX7 +rizrMI2fTI7ofFR2iX83sJPqFw/j/xn3mzHtW8gtC0hr/rYQbSKouZSwAz4fWhxHbom 9RGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id:dkim-signature; bh=RUjlhJ3AI4Px16kd0yzP8X+Scq0e8C+0X9AmUVyOZtI=; b=zljVDII7qL3yLceYC4bCm3dy9QYxIZORr6doTlOAuOeipc4JFVpsSiNOfS6DwZJ83s bQqmTTZcD5extcwUIfcFKZ9dRTwSs82kxPQU2G2u6b1kVs6JOaFOoyV1zXuT7FjWvgjL noEcRNZN9msmv3TuKn2m2f4i1Cysz+2Ko7ovLv3IoumdZQxS/47SjnpvM9qjO0zeWfGe D+Pk9/DcKyANO9ftbXb7J42b9GdqjOXfs2pYYP5wViAyUV7gUairkk64HO7IPfCZqxvR FJ6SEOWg6dCEcSu5iMaxO3rQ6JHGzOGNyY2Pf6kmvyWW+/dbf2MxSChIcubobsj78xbc IPfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ndufresne-ca.20150623.gappssmtp.com header.s=20150623 header.b=ujQVjbS2; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t23si190305pfa.64.2019.03.19.16.29.57; Tue, 19 Mar 2019 16:30:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ndufresne-ca.20150623.gappssmtp.com header.s=20150623 header.b=ujQVjbS2; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726912AbfCSX3W (ORCPT + 99 others); Tue, 19 Mar 2019 19:29:22 -0400 Received: from mail-qk1-f195.google.com ([209.85.222.195]:40918 "EHLO mail-qk1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726686AbfCSX3V (ORCPT ); Tue, 19 Mar 2019 19:29:21 -0400 Received: by mail-qk1-f195.google.com with SMTP id w20so4812998qka.7 for ; Tue, 19 Mar 2019 16:29:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ndufresne-ca.20150623.gappssmtp.com; s=20150623; h=message-id:subject:from:to:cc:date:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=RUjlhJ3AI4Px16kd0yzP8X+Scq0e8C+0X9AmUVyOZtI=; b=ujQVjbS23YQRcts64Ox3wXbhqSZvQEGttoKa1Qpjvfqvy7A43LxFw5DOrcZOLg4gsr f7Iy+v0J2hYyPe/tRGoQWkL7aqyp3knqQXJoGXJ0ar0naeA4Cgq6XFE37xKv1ZHw64ka W46Rg/mtnh5dXyAQy5BVRSnAn/EgTRAOhhzeX9KjCareo0tVlAq1W1xNdozwVJ1EOoFx vOSu3ni2COfgm8vckgGfqieuZ0kxHqu7O3SzICbUWTdSm3rAQSEXL61ceEwm37Wds+Py mTom+JClDexAHqe7LDIo42LwDFbHGhX++rFnqgjTCkz3KoPLlIHvB1nnYHTGeEXc6h/1 iR0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=RUjlhJ3AI4Px16kd0yzP8X+Scq0e8C+0X9AmUVyOZtI=; b=aoultgKsKvGEDXgffF0iRv54zmQNu+3HC0XFjalqeJU9mDbY+6AxeUHcxZ6U8kCnNn 0TCl/xeScf/JgE+SL7atpkpzvplQ4MCPyKZmBsNZQeFAAkrBUghee0+AJUR6yfylHjSY 0ERtFAqhUhhKdMCBRCc7Zu9CxcjCOq+mFCwqafvIQNHmwucvRyjmM7QVHPo2Sam1ZcYP 9LCjoyPSMlPFMNFq3nfax4cF0IrsznVXEhf1AIxJ+lFHMtKnkJYR9X7npSfJjjqpw2H1 R5cHDj38E7cl1+NGYN4JnhkFhbbefVuCnBpIllujKjVZshQSza8pYJNjVDFOmBtWYVbb CjXw== X-Gm-Message-State: APjAAAURXszdpu3yk6tjv/+IXFSq1Ez2Z6cP6Nn0lyFw4/+KXodb0qCd Cl92+Sf9wdH49WB5IXtGPh1pqw== X-Received: by 2002:a37:4c85:: with SMTP id z127mr4098216qka.180.1553038160394; Tue, 19 Mar 2019 16:29:20 -0700 (PDT) Received: from skullcanyon ([192.222.193.21]) by smtp.gmail.com with ESMTPSA id o8sm169816qtg.1.2019.03.19.16.29.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Mar 2019 16:29:19 -0700 (PDT) Message-ID: Subject: Re: [RFC PATCH 18/20] lib: image-formats: Add v4l2 formats support From: Nicolas Dufresne To: Maxime Ripard , Daniel Vetter , David Airlie , Maarten Lankhorst , Sean Paul , Mauro Carvalho Chehab Cc: Sakari Ailus , Hans Verkuil , Laurent Pinchart , Thomas Petazzoni , Paul Kocialkowski , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org Date: Tue, 19 Mar 2019 19:29:18 -0400 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.30.5 (3.30.5-1.fc29) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le mardi 19 mars 2019 à 22:57 +0100, Maxime Ripard a écrit : > 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 > --- > include/linux/image-formats.h | 9 +++++- > lib/image-formats.c | 67 ++++++++++++++++++++++++++++++++++++- > 2 files changed, 76 insertions(+) > > diff --git a/include/linux/image-formats.h b/include/linux/image-formats.h > index 53fd73a71b3d..fbc3a4501ebd 100644 > --- a/include/linux/image-formats.h > +++ b/include/linux/image-formats.h > @@ -26,6 +26,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), > @@ -222,6 +229,8 @@ image_format_info_is_yuv_sampling_444(const struct image_format_info *info) > > const struct image_format_info *__image_format_drm_lookup(u32 drm); > 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_v4l2_lookup(u32 v4l2); > unsigned int image_format_plane_cpp(const struct image_format_info *format, > int plane); > unsigned int image_format_plane_width(int width, > diff --git a/lib/image-formats.c b/lib/image-formats.c > index 9b9a73220c5d..39f1d38ae861 100644 > --- a/lib/image-formats.c > +++ b/lib/image-formats.c > @@ -8,6 +8,7 @@ > 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 }, > @@ -15,6 +16,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 }, > @@ -29,6 +31,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_XRGB4444, > + .v4l2_fmt = V4L2_PIX_FMT_XRGB444, > .depth = 0, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -57,6 +60,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_ARGB4444, > + .v4l2_fmt = V4L2_PIX_FMT_ARGB444, > .depth = 0, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -89,6 +93,7 @@ static const struct image_format_info formats[] = { > .has_alpha = true, > }, { > .drm_fmt = DRM_FORMAT_XRGB1555, > + .v4l2_fmt = V4L2_PIX_FMT_XRGB555, > .depth = 15, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -117,6 +122,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_ARGB1555, > + .v4l2_fmt = V4L2_PIX_FMT_ARGB555, > .depth = 15, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -149,6 +155,7 @@ static const struct image_format_info formats[] = { > .has_alpha = true, > }, { > .drm_fmt = DRM_FORMAT_RGB565, > + .v4l2_fmt = V4L2_PIX_FMT_RGB565, > .depth = 16, > .num_planes = 1, > .cpp = { 2, 0, 0 }, > @@ -163,6 +170,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_RGB888, > + .v4l2_fmt = V4L2_PIX_FMT_RGB24, > .depth = 24, > .num_planes = 1, > .cpp = { 3, 0, 0 }, > @@ -170,6 +178,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_BGR888, > + .v4l2_fmt = V4L2_PIX_FMT_BGR24, > .depth = 24, > .num_planes = 1, > .cpp = { 3, 0, 0 }, > @@ -177,6 +186,7 @@ static const struct image_format_info formats[] = { > .vsub = 1, > }, { > .drm_fmt = DRM_FORMAT_XRGB8888, > + .v4l2_fmt = V4L2_PIX_FMT_XRGB32, All RGB mapping should be surrounded by ifdef, because many (not all) DRM formats represent the order of component when placed in a CPU register, unlike V4L2 which uses memory order. I've pick this one randomly, but this one on most system, little endian, will match V4L2_PIX_FMT_XBGR32. This type of complex mapping can be found in multiple places, notably in GStreamer: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/blob/master/sys/kms/gstkmsutils.c#L45 > .depth = 24, > .num_planes = 1, > .cpp = { 4, 0, 0 }, > @@ -281,6 +291,7 @@ static const struct image_format_info formats[] = { > .has_alpha = true, > }, { > .drm_fmt = DRM_FORMAT_ARGB8888, > + .v4l2_fmt = V4L2_PIX_FMT_ARGB32, > .depth = 32, > .num_planes = 1, > .cpp = { 4, 0, 0 }, > @@ -361,6 +372,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 }, > @@ -369,6 +381,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 }, > @@ -393,6 +406,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUV420, > + .v4l2_fmt = V4L2_PIX_FMT_YUV420M, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -401,6 +415,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YVU420, > + .v4l2_fmt = V4L2_PIX_FMT_YVU420M, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -409,6 +424,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUV422, > + .v4l2_fmt = V4L2_PIX_FMT_YUV422M, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -417,6 +433,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YVU422, > + .v4l2_fmt = V4L2_PIX_FMT_YVU422M, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -425,6 +442,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YUV444, > + .v4l2_fmt = V4L2_PIX_FMT_YUV444M, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -433,6 +451,7 @@ static const struct image_format_info formats[] = { > .is_yuv = true, > }, { > .drm_fmt = DRM_FORMAT_YVU444, > + .v4l2_fmt = V4L2_PIX_FMT_YVU444M, > .depth = 0, > .num_planes = 3, > .cpp = { 1, 1, 1 }, > @@ -441,6 +460,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 }, > @@ -449,6 +469,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 }, > @@ -457,6 +478,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 }, > @@ -465,6 +487,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 }, > @@ -473,6 +496,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 }, > @@ -481,6 +505,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 }, > @@ -489,6 +514,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 }, > @@ -497,6 +523,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 }, > @@ -505,6 +532,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 }, > @@ -513,6 +541,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 }, > @@ -632,6 +661,44 @@ const struct image_format_info *image_format_drm_lookup(u32 drm) > 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); > + > +/** > * image_format_plane_cpp - determine the bytes per pixel value > * @format: pointer to the image_format > * @plane: plane index