[{"id":29380,"web_url":"https://patchwork.libcamera.org/comment/29380/","msgid":"<4c6a7jcchfpged5npkqft2ne27vduqv3gv63yud5ptzmicdomo@oip3uxt2b4e3>","date":"2024-05-02T09:15:31","subject":"Re: [PATCH v1 1/5] libcamera: formats: Add RGB48 formats","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Naush\n\nOn Thu, May 02, 2024 at 09:09:21AM +0100, Naushir Patuck wrote:\n> Add support for 16-bps (48-bpp) RGB output formats. These new formats\n> are define for the RGB and BGR ordering.\n>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  include/linux/drm_fourcc.h         |  4 ++++\n>  include/linux/videodev2.h          |  4 ++++\n>  src/libcamera/formats.cpp          | 20 ++++++++++++++++++++\n>  src/libcamera/formats.yaml         |  5 +++++\n>  src/libcamera/v4l2_pixelformat.cpp |  4 ++++\n>  5 files changed, 37 insertions(+)\n>\n> diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h\n> index d6c83d9c49f4..4ee421b95730 100644\n> --- a/include/linux/drm_fourcc.h\n> +++ b/include/linux/drm_fourcc.h\n> @@ -210,6 +210,10 @@ extern \"C\" {\n>  #define DRM_FORMAT_RGBA1010102\tfourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */\n>  #define DRM_FORMAT_BGRA1010102\tfourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */\n>\n> +/* 48 bpp RGB */\n> +#define DRM_FORMAT_RGB161616\tfourcc_code('R', 'G', '4', '8') /* [48:0] R:G:B 16:16:16 little endian */\n\ns/48/47\n\n> +#define DRM_FORMAT_BGR161616\tfourcc_code('B', 'G', '4', '8') /* [48:0] R:G:B 16:16:16 little endian */\n\ns/48/47\ns/R:G:B/B:G:R/\n\n> +\n\nI've just re-pinged DRM list on this patch\nhttps://lists.freedesktop.org/archives/dri-devel/2024-March/444319.html\n\nIn the meantime let's use what will (likely) be usptreamed\n\n/* 48 bpp RGB */\n#define DRM_FORMAT_RGB161616 fourcc_code('R', 'G', '4', '8') /* [47:0] R:G:B 16:16:16 little endian */\n#define DRM_FORMAT_BGR161616 fourcc_code('B', 'G', '4', '8') /* [47:0] B:G:R 16:16:16 little endian */\n\n\n>  /* 64 bpp RGB */\n>  #define DRM_FORMAT_XRGB16161616\tfourcc_code('X', 'R', '4', '8') /* [63:0] x:R:G:B 16:16:16:16 little endian */\n>  #define DRM_FORMAT_XBGR16161616\tfourcc_code('X', 'B', '4', '8') /* [63:0] x:B:G:R 16:16:16:16 little endian */\n> diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h\n> index 7e556911c9e1..ba48d2c89726 100644\n> --- a/include/linux/videodev2.h\n> +++ b/include/linux/videodev2.h\n> @@ -557,6 +557,10 @@ struct v4l2_pix_format {\n>  #define V4L2_PIX_FMT_BGR48_12    v4l2_fourcc('B', '3', '1', '2') /* 48  BGR 12-bit per component */\n>  #define V4L2_PIX_FMT_ABGR64_12   v4l2_fourcc('B', '4', '1', '2') /* 64  BGRA 12-bit per component */\n>\n> +/* RGB formats (6 bytes per pixel) */\n> +#define V4L2_PIX_FMT_BGR48 v4l2_fourcc('B', 'G', 'R', '6') /* 16  BGR-16-16-16 */\n> +#define V4L2_PIX_FMT_RGB48 v4l2_fourcc('R', 'G', 'B', '6') /* 16  RGB-16-16-16 */\n> +\n\nLikewise, let's use what will hit mainline to ease updating headers\nfrom a newer kernel release\nhttps://patchwork.kernel.org/project/linux-media/patch/20240313114308.51896-5-jacopo.mondi@ideasonboard.com/\n\n(iow do not create a new section, but add the two new formats between\nV4L2_PIX_FMT_BGR48_12 and V4L2_PIX_FMT_ABGR64_12\n\n>  /* Grey formats */\n>  #define V4L2_PIX_FMT_GREY    v4l2_fourcc('G', 'R', 'E', 'Y') /*  8  Greyscale     */\n>  #define V4L2_PIX_FMT_Y4      v4l2_fourcc('Y', '0', '4', ' ') /*  4  Greyscale     */\n> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp\n> index 955c3fba8b8d..21a7719e84c4 100644\n> --- a/src/libcamera/formats.cpp\n> +++ b/src/libcamera/formats.cpp\n> @@ -270,6 +270,26 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{\n>  \t\t.pixelsPerGroup = 1,\n>  \t\t.planes = {{ { 4, 1 }, { 0, 0 }, { 0, 0 } }},\n>  \t} },\n> +\t{ formats::BGR161616, {\n> +\t\t.name = \"BGR161616\",\n> +\t\t.format = formats::BGR161616,\n> +\t\t.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB48), },\n> +\t\t.bitsPerPixel = 48,\n> +\t\t.colourEncoding = PixelFormatInfo::ColourEncodingRGB,\n> +\t\t.packed = false,\n> +\t\t.pixelsPerGroup = 1,\n> +\t\t.planes = {{ { 3, 1 }, { 0, 0 }, { 0, 0 } }},\n> +\t} },\n> +\t{ formats::RGB161616, {\n> +\t\t.name = \"RGB161616\",\n> +\t\t.format = formats::RGB161616,\n> +\t\t.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGR48), },\n> +\t\t.bitsPerPixel = 48,\n> +\t\t.colourEncoding = PixelFormatInfo::ColourEncodingRGB,\n> +\t\t.packed = false,\n> +\t\t.pixelsPerGroup = 1,\n> +\t\t.planes = {{ { 3, 1 }, { 0, 0 }, { 0, 0 } }},\n> +\t} },\n>\n>  \t/* YUV packed formats. */\n>  \t{ formats::YUYV, {\n> diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml\n> index d8a379923b56..bde2cc803b98 100644\n> --- a/src/libcamera/formats.yaml\n> +++ b/src/libcamera/formats.yaml\n> @@ -43,6 +43,11 @@ formats:\n>    - BGRA8888:\n>        fourcc: DRM_FORMAT_BGRA8888\n>\n> +  - RGB161616:\n> +      fourcc: DRM_FORMAT_RGB161616\n> +  - BGR161616:\n> +      fourcc: DRM_FORMAT_BGR161616\n> +\n>    - YUYV:\n>        fourcc: DRM_FORMAT_YUYV\n>    - YVYU:\n> diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp\n> index 731dc10f1d73..efb6f2940235 100644\n> --- a/src/libcamera/v4l2_pixelformat.cpp\n> +++ b/src/libcamera/v4l2_pixelformat.cpp\n> @@ -71,6 +71,10 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{\n>  \t\t{ formats::BGRA8888, \"32-bit ARGB 8-8-8-8\" } },\n>  \t{ V4L2PixelFormat(V4L2_PIX_FMT_BGRA32),\n>  \t\t{ formats::RGBA8888, \"32-bit ABGR 8-8-8-8\" } },\n> +\t{ V4L2PixelFormat(V4L2_PIX_FMT_RGB48),\n> +\t\t{ formats::BGR161616, \"48-bit RGB 16-16-16\" } },\n> +\t{ V4L2PixelFormat(V4L2_PIX_FMT_BGR48),\n> +\t\t{ formats::RGB161616, \"48-bit BGR 16-16-16\" } },\n\nThe reset of the patch looks good!\n>\n>  \t/* YUV packed formats. */\n>  \t{ V4L2PixelFormat(V4L2_PIX_FMT_YUYV),\n> --\n> 2.34.1\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id C4E4EC3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  2 May 2024 09:15:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E2B9163418;\n\tThu,  2 May 2024 11:15:35 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0E5DA61A89\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  2 May 2024 11:15:35 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7A750BC8;\n\tThu,  2 May 2024 11:14:37 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"DGXskl3o\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1714641277;\n\tbh=+iqxV+O2SeUYEbYduhRCwT9HnA4ZHaJgBlZItn1eHec=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DGXskl3ofamvxgFL8Qtk5NHXoMJj1AlwVr49dJhwmJlCkCdW08QAhGN+Z7tHvBScA\n\tvwUjw9kf45iNW9ZiiYJTFFWX+qf8QBQsPklmcRMNmmt+nVvdDnPVSPS1ngPdXPGN4E\n\tUbOcTatHDw2z6j07qi0QdCOQknpv2mcr9bsXHRaM=","Date":"Thu, 2 May 2024 11:15:31 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1 1/5] libcamera: formats: Add RGB48 formats","Message-ID":"<4c6a7jcchfpged5npkqft2ne27vduqv3gv63yud5ptzmicdomo@oip3uxt2b4e3>","References":"<20240502080925.31730-1-naush@raspberrypi.com>\n\t<20240502080925.31730-2-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240502080925.31730-2-naush@raspberrypi.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]