[{"id":1,"web_url":"https://patchwork.libcamera.org/comment/1/","msgid":"<20181120005939.GD28299@w540>","date":"2018-11-20T00:59:39","subject":"Re: [libcamera-devel] [PATCH] utils: ipu3: Add IPU3 raw capture\n\tunpack utility","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Mon, Nov 19, 2018 at 07:53:06PM +0200, Laurent Pinchart wrote:\n> The IPU3 captures Bayer data in a 25-pixels-in-32-bytes packed format,\n> which no standard tool can process. Add a quick implementation of data\n> unpacking to turn raw binary files into 16 bits per pixel unpacked Bayer\n> data.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n> ---\n>  meson.build              |  3 +-\n>  utils/ipu3/ipu3-unpack.c | 93 ++++++++++++++++++++++++++++++++++++++++\n>  utils/ipu3/meson.build   |  1 +\n>  utils/meson.build        |  1 +\n>  4 files changed, 97 insertions(+), 1 deletion(-)\n>  create mode 100644 utils/ipu3/ipu3-unpack.c\n>  create mode 100644 utils/ipu3/meson.build\n>  create mode 100644 utils/meson.build\n>\n> diff --git a/meson.build b/meson.build\n> index d1e186adb356..4b3d528c8932 100644\n> --- a/meson.build\n> +++ b/meson.build\n> @@ -1,4 +1,4 @@\n> -project('libcamera - supporting complex camera pipelines', 'cpp',\n> +project('libcamera - supporting complex camera pipelines', 'c', 'cpp',\n>    version : '0.1',\n>    license : 'LGPL 2.1+')\n>\n> @@ -6,6 +6,7 @@ inc = include_directories('include')\n>\n>  subdir('lib')\n>  subdir('test')\n> +subdir('utils')\n>\n>  pkg_mod = import('pkgconfig')\n>  pkg_mod.generate(libraries : libcamera,\n> diff --git a/utils/ipu3/ipu3-unpack.c b/utils/ipu3/ipu3-unpack.c\n> new file mode 100644\n> index 000000000000..2dce10385add\n> --- /dev/null\n> +++ b/utils/ipu3/ipu3-unpack.c\n> @@ -0,0 +1,93 @@\n> +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> +/*\n> + * ipu3-unpack - Unpack IPU3 raw Bayer format to 16-bit Bayer\n> + *\n> + * Copyright 2018 Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> + */\n> +#define _GNU_SOURCE\n> +\n> +#include <errno.h>\n> +#include <fcntl.h>\n> +#include <stdint.h>\n> +#include <stdio.h>\n> +#include <string.h>\n> +#include <sys/stat.h>\n> +#include <sys/types.h>\n> +#include <unistd.h>\n> +\n> +static void usage(const char *argv0)\n> +{\n> +\tprintf(\"Usage: %s input-file output-file\\n\", basename(argv0));\n> +\tprintf(\"Unpack the IPU3 raw Bayer format to 16-bit Bayer\\n\");\n> +}\n> +\n> +int main(int argc, char *argv[])\n> +{\n> +\tint in_fd;\n> +\tint out_fd;\n> +\tint ret;\n> +\n> +\tif (argc != 3) {\n> +\t\tusage(argv[0]);\n> +\t\treturn 1;\n> +\t}\n> +\n> +\tin_fd = open(argv[1], O_RDONLY);\n> +\tif (in_fd == -1) {\n> +\t\tfprintf(stderr, \"Failed to open input file '%s': %s\\n\",\n> +\t\t\targv[1], strerror(errno));\n> +\t\treturn 1;\n> +\t}\n> +\n> +\tout_fd = open(argv[2], O_WRONLY | O_TRUNC | O_CREAT, 0644);\n> +\tif (out_fd == -1) {\n> +\t\tfprintf(stderr, \"Failed to open output file '%s': %s\\n\",\n> +\t\t\targv[2], strerror(errno));\n> +\t\treturn 1;\n> +\t}\n> +\n> +\twhile (1) {\n> +\t\tuint8_t in_data[32];\n> +\t\tuint8_t out_data[50];\n> +\t\tunsigned int i;\n> +\n> +\t\tret = read(in_fd, in_data, 32);\n> +\t\tif (ret == -1) {\n> +\t\t\tfprintf(stderr, \"Failed to read input data: %s\\n\",\n> +\t\t\t\tstrerror(errno));\n> +\t\t\tgoto done;\n> +\t\t}\n> +\n> +\t\tif (ret < 32) {\n> +\t\t\tif (ret != 0)\n> +\t\t\t\tfprintf(stderr, \"%u bytes of stray data at end of input\\n\",\n> +\t\t\t\t\tret);\n> +\t\t\tbreak;\n> +\t\t}\n> +\n> +\t\tfor (i = 0; i < 25; ++i) {\n> +\t\t\tunsigned int index = (i * 10) / 8;\n> +\t\t\tunsigned int lsb_shift = (i * 10) % 8;\n> +\t\t\tunsigned int msb_shift = 8 - lsb_shift;\n> +\t\t\tuint16_t pixel;\n> +\n> +\t\t\tpixel = ((in_data[index+1] << msb_shift) & 0x3ff)\n> +\t\t\t      | ((in_data[index+0] >> lsb_shift) & 0x3ff);\n> +\t\t\tout_data[i*2+0] = (pixel >> 0) & 0xff;\n> +\t\t\tout_data[i*2+1] = (pixel >> 8) & 0xff;\n> +\t\t}\n> +\n> +\t\tret = write(out_fd, out_data, 50);\n> +\t\tif (ret < -1) {\n> +\t\t\tfprintf(stderr, \"Failed to read input data: %s\\n\",\n> +\t\t\t\tstrerror(errno));\n> +\t\t\tgoto done;\n> +\t\t}\n> +\t}\n> +\n> +done:\n> +\tclose(in_fd);\n> +\tclose(out_fd);\n> +\n> +\treturn ret ? 1 : 0;\n> +}\n> diff --git a/utils/ipu3/meson.build b/utils/ipu3/meson.build\n> new file mode 100644\n> index 000000000000..49c45856eea6\n> --- /dev/null\n> +++ b/utils/ipu3/meson.build\n> @@ -0,0 +1 @@\n> +ipu3_unpack = executable('ipu3-unpack', 'ipu3-unpack.c')\n> diff --git a/utils/meson.build b/utils/meson.build\n> new file mode 100644\n> index 000000000000..f434c79c0ae3\n> --- /dev/null\n> +++ b/utils/meson.build\n> @@ -0,0 +1 @@\n> +subdir('ipu3')\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[217.70.183.194])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AE86260B0B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 20 Nov 2018 01:59:43 +0100 (CET)","from w540 (d23-16-28-166.bchsia.telus.net [23.16.28.166])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay2-d.mail.gandi.net (Postfix) with ESMTPSA id AF98240008;\n\tTue, 20 Nov 2018 00:59:42 +0000 (UTC)"],"X-Originating-IP":"23.16.28.166","Date":"Tue, 20 Nov 2018 01:59:39 +0100","From":"jacopo mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20181120005939.GD28299@w540>","References":"<20181119175306.4729-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"zjcmjzIkjQU2rmur\"","Content-Disposition":"inline","In-Reply-To":"<20181119175306.4729-1-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.5.24 (2015-08-30)","Subject":"Re: [libcamera-devel] [PATCH] utils: ipu3: Add IPU3 raw capture\n\tunpack utility","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Tue, 20 Nov 2018 00:59:43 -0000"}}]