From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: linux-media@vger.kernel.org
Cc: Jacopo Mondi <jacopo.mondi@ideasonboard.com>,
Mehdi Djait <mehdi.djait@linux.intel.com>,
Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>,
laurent.pinchart@ideasonboard.com
Subject: [raw2rgbpnm PATCH 2/2] Add 10-bit CSI-2 packed format support
Date: Tue, 17 Feb 2026 23:44:35 +0200 [thread overview]
Message-ID: <20260217214435.2431864-3-sakari.ailus@linux.intel.com> (raw)
In-Reply-To: <20260217214435.2431864-1-sakari.ailus@linux.intel.com>
Add support for the 10-bit CSI-2 packed raw formats.
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
raw2rgbpnm.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/raw2rgbpnm.c b/raw2rgbpnm.c
index baeb8efc863a..eb711ce5ba6c 100644
--- a/raw2rgbpnm.c
+++ b/raw2rgbpnm.c
@@ -25,6 +25,7 @@
#include <ctype.h>
#include <stdio.h>
+#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
@@ -56,6 +57,7 @@ static const struct format_info {
unsigned int cb_pos;
unsigned int cr_pos;
unsigned int planes;
+ __u32 compat_fmt;
} v4l2_pix_fmt_str[] = {
{ V4L2_PIX_FMT_RGB332, 8, 0, "RGB332 (8 RGB-3-3-2)", 0, 0, 0, 1 },
{ V4L2_PIX_FMT_RGB555, 16, 5, "RGB555 (16 RGB-5-5-5)", 0, 0, 0, 1 },
@@ -98,6 +100,10 @@ static const struct format_info {
{ V4L2_PIX_FMT_SGBRG10, 16, 10, "SGBRG10 (10 GBGB.. RGRG..)", 0, 0, 0, 1 },
{ V4L2_PIX_FMT_SGRBG10, 16, 10, "SGRBG10 (10 GRGR.. BGBG..)", 0, 0, 0, 1 },
{ V4L2_PIX_FMT_SRGGB10, 16, 10, "SRGGB10 (10 RGRG.. GBGB..)", 0, 0, 0, 1 },
+ { V4L2_PIX_FMT_SBGGR10P, 10, 10, "SBGGR10P (10 BGBG.. GRGR..)", 0, 0, 0, 1, V4L2_PIX_FMT_SBGGR10 },
+ { V4L2_PIX_FMT_SGBRG10P, 10, 10, "SGBRG10P (10 GBGB.. RGRG..)", 0, 0, 0, 1, V4L2_PIX_FMT_SGBRG10 },
+ { V4L2_PIX_FMT_SGRBG10P, 10, 10, "SGRBG10P (10 GRGR.. BGBG..)", 0, 0, 0, 1, V4L2_PIX_FMT_SGRBG10 },
+ { V4L2_PIX_FMT_SRGGB10P, 10, 10, "SRGGB10P (10 RGRG.. GBGB..)", 0, 0, 0, 1, V4L2_PIX_FMT_SRGGB10 },
{ V4L2_PIX_FMT_SBGGR12, 16, 12, "SBGGR12 (12 BGBG.. GRGR..)", 0, 0, 0, 1 },
{ V4L2_PIX_FMT_SGBRG12, 16, 12, "SGBRG12 (12 GBGB.. RGRG..)", 0, 0, 0, 1 },
{ V4L2_PIX_FMT_SGRBG12, 16, 12, "SGRBG12 (12 GRGR.. BGBG..)", 0, 0, 0, 1 },
@@ -186,6 +192,45 @@ static unsigned char *read_raw_data(char *filename, int width, int height,
return b;
}
+static inline uint16_t raw_get(uint8_t bpp, uint8_t bpc, unsigned char *ptr,
+ unsigned int stride, unsigned int x, unsigned int y)
+{
+ switch ((bpp << 8) | bpc) {
+ case 0x0a0a: {
+ unsigned char *base = ptr + y * stride + (x & ~3U) / 4 * 5;
+ unsigned int idx = x & 3U;
+
+ return (base[idx] << 2) | ((base[4] >> (idx << 1)) & 3U);
+ }
+ default:
+ error("getting %u/%u not supported", bpp, bpc);
+ }
+
+ return 0;
+}
+
+static inline void raw_put(uint8_t bpp, uint8_t bpc, unsigned char *ptr,
+ unsigned int stride, unsigned int x, unsigned int y,
+ uint16_t value)
+{
+ switch ((bpp << 8) | bpc) {
+ case 0x100a: {
+ unsigned char *base = ptr + y * stride + (x & ~3U) / 4 * 5;
+ unsigned int idx = x & 3U;
+
+ base[idx] = value >> 2;
+ base[4] &= ~(3 << (idx << 1));
+ base[4] |= (value & 3) << (idx << 1);
+ break;
+ }
+ case 0x1010:
+ *(uint16_t *)&ptr[y * stride + x * 2] = value;
+ break;
+ default:
+ error("putting %u/%u not supported", bpp, bpc);
+ }
+}
+
static int raw_layout_to_grbg(const struct format_info *info, unsigned char *src,
int src_width, int src_height, unsigned int src_stride)
{
@@ -283,6 +328,7 @@ static int raw_layout_to_grbg(const struct format_info *info, unsigned char *src
static void raw_to_rgb(const struct format_info *info,
unsigned char *src, int src_width, int src_height, unsigned char *rgb)
{
+ unsigned char *tmp_src = NULL;
unsigned int src_stride = src_width * info->bpp / 8;
unsigned int rgb_stride = src_width * 3;
unsigned char *src_luma, *src_chroma;
@@ -298,6 +344,37 @@ static void raw_to_rgb(const struct format_info *info,
int cr_pos;
int shift;
+ switch (info->fmt) {
+ case V4L2_PIX_FMT_SBGGR10P:
+ case V4L2_PIX_FMT_SGBRG10P:
+ case V4L2_PIX_FMT_SRGGB10P:
+ case V4L2_PIX_FMT_SGRBG10P: {
+ unsigned int new_stride = src_width * 2;
+
+ tmp_src = malloc(new_stride * src_height);
+ if (!tmp_src)
+ error("can't allocate memory for the temporary buffer");
+
+ for (src_y = 0; src_y < src_height; src_y++)
+ for (src_x = 0; src_x < src_width; src_x++)
+ raw_put(16, 16, tmp_src, new_stride, src_x, src_y,
+ raw_get(info->bpp, info->bpc, src, src_stride, src_x, src_y));
+
+ src_stride = new_stride;
+ src = tmp_src;
+
+ for (unsigned int i = 0; i < SIZE(v4l2_pix_fmt_str); i++) {
+ if (v4l2_pix_fmt_str[i].fmt == info->compat_fmt) {
+ info = &v4l2_pix_fmt_str[i];
+ break;
+ }
+ }
+
+ if (info->compat_fmt)
+ error("no supported format found");
+ }
+ }
+
switch (info->fmt) {
case V4L2_PIX_FMT_VYUY:
case V4L2_PIX_FMT_YVYU:
@@ -734,6 +811,8 @@ static void raw_to_rgb(const struct format_info *info,
}
break;
}
+
+ free(tmp_src);
}
static int parse_format(const char *p, int *w, int *h)
--
2.47.3
prev parent reply other threads:[~2026-02-17 21:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-17 21:44 [raw2rgbpnm PATCH 0/2] 10-bit packed raw support Sakari Ailus
2026-02-17 21:44 ` [raw2rgbpnm PATCH 1/2] Add compiler options to avoid warnings Sakari Ailus
2026-02-17 23:59 ` Laurent Pinchart
2026-02-18 8:18 ` Sakari Ailus
2026-02-17 21:44 ` Sakari Ailus [this message]
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=20260217214435.2431864-3-sakari.ailus@linux.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=jacopo.mondi@ideasonboard.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=mehdi.djait@linux.intel.com \
--cc=tomi.valkeinen@ideasonboard.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