[v3,4/9] libcamera: software_isp: Use common code to store debayered pixels
diff mbox series

Message ID 20241210153440.1007470-5-mzamazal@redhat.com
State Superseded
Headers show
Series
  • Software ISP support for CCM
Related show

Commit Message

Milan Zamazal Dec. 10, 2024, 3:34 p.m. UTC
The debayering macros use the same pattern, let's extract it to a common
macro.  This reduces code duplication a bit now and it'll make changes
of debayering easier when color correction matrix is introduced.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
---
 src/libcamera/software_isp/debayer_cpu.cpp | 56 +++++++++++-----------
 1 file changed, 28 insertions(+), 28 deletions(-)

Comments

Kieran Bingham Jan. 9, 2025, 4:57 p.m. UTC | #1
Quoting Milan Zamazal (2024-12-10 15:34:34)
> The debayering macros use the same pattern, let's extract it to a common
> macro.  This reduces code duplication a bit now and it'll make changes
> of debayering easier when color correction matrix is introduced.
> 
> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>

I'm fine with this - it looks correct to me - but I'm probably keen on
hearing what Hans or others think.



Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> ---
>  src/libcamera/software_isp/debayer_cpu.cpp | 56 +++++++++++-----------
>  1 file changed, 28 insertions(+), 28 deletions(-)
> 
> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp
> index 31ab96ab..0eabced2 100644
> --- a/src/libcamera/software_isp/debayer_cpu.cpp
> +++ b/src/libcamera/software_isp/debayer_cpu.cpp
> @@ -62,57 +62,57 @@ DebayerCpu::~DebayerCpu() = default;
>         const pixel_t *curr = (const pixel_t *)src[1] + xShift_; \
>         const pixel_t *next = (const pixel_t *)src[2] + xShift_;
>  
> +#define STORE_PIXEL(b, g, r)        \
> +       *dst++ = blue_[b];          \
> +       *dst++ = green_[g];         \
> +       *dst++ = red_[r];           \
> +       if constexpr (addAlphaByte) \
> +               *dst++ = 255;       \
> +       x++;
> +
>  /*
>   * RGR
>   * GBG
>   * RGR
>   */
> -#define BGGR_BGR888(p, n, div)                                                                \
> -       *dst++ = blue_[curr[x] / (div)];                                                      \
> -       *dst++ = green_[(prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div))];       \
> -       *dst++ = red_[(prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div))]; \
> -       if constexpr (addAlphaByte)                                                           \
> -               *dst++ = 255;                                                                 \
> -       x++;
> +#define BGGR_BGR888(p, n, div)                                                 \
> +       STORE_PIXEL(                                                           \
> +               curr[x] / (div),                                               \
> +               (prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div)), \
> +               (prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div)))
>  
>  /*
>   * GBG
>   * RGR
>   * GBG
>   */
> -#define GRBG_BGR888(p, n, div)                                    \
> -       *dst++ = blue_[(prev[x] + next[x]) / (2 * (div))];        \
> -       *dst++ = green_[curr[x] / (div)];                         \
> -       *dst++ = red_[(curr[x - p] + curr[x + n]) / (2 * (div))]; \
> -       if constexpr (addAlphaByte)                               \
> -               *dst++ = 255;                                     \
> -       x++;
> +#define GRBG_BGR888(p, n, div)                     \
> +       STORE_PIXEL(                               \
> +               (prev[x] + next[x]) / (2 * (div)), \
> +               curr[x] / (div),                   \
> +               (curr[x - p] + curr[x + n]) / (2 * (div)))
>  
>  /*
>   * GRG
>   * BGB
>   * GRG
>   */
> -#define GBRG_BGR888(p, n, div)                                     \
> -       *dst++ = blue_[(curr[x - p] + curr[x + n]) / (2 * (div))]; \
> -       *dst++ = green_[curr[x] / (div)];                          \
> -       *dst++ = red_[(prev[x] + next[x]) / (2 * (div))];          \
> -       if constexpr (addAlphaByte)                                \
> -               *dst++ = 255;                                      \
> -       x++;
> +#define GBRG_BGR888(p, n, div)                             \
> +       STORE_PIXEL(                                       \
> +               (curr[x - p] + curr[x + n]) / (2 * (div)), \
> +               curr[x] / (div),                           \
> +               (prev[x] + next[x]) / (2 * (div)))
>  
>  /*
>   * BGB
>   * GRG
>   * BGB
>   */
> -#define RGGB_BGR888(p, n, div)                                                                 \
> -       *dst++ = blue_[(prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div))]; \
> -       *dst++ = green_[(prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div))];        \
> -       *dst++ = red_[curr[x] / (div)];                                                        \
> -       if constexpr (addAlphaByte)                                                            \
> -               *dst++ = 255;                                                                  \
> -       x++;
> +#define RGGB_BGR888(p, n, div)                                                         \
> +       STORE_PIXEL(                                                                   \
> +               (prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div)), \
> +               (prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div)),         \
> +               curr[x] / (div))
>  
>  template<bool addAlphaByte>
>  void DebayerCpu::debayer8_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])
> -- 
> 2.44.2
>

Patch
diff mbox series

diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp
index 31ab96ab..0eabced2 100644
--- a/src/libcamera/software_isp/debayer_cpu.cpp
+++ b/src/libcamera/software_isp/debayer_cpu.cpp
@@ -62,57 +62,57 @@  DebayerCpu::~DebayerCpu() = default;
 	const pixel_t *curr = (const pixel_t *)src[1] + xShift_; \
 	const pixel_t *next = (const pixel_t *)src[2] + xShift_;
 
+#define STORE_PIXEL(b, g, r)        \
+	*dst++ = blue_[b];          \
+	*dst++ = green_[g];         \
+	*dst++ = red_[r];           \
+	if constexpr (addAlphaByte) \
+		*dst++ = 255;       \
+	x++;
+
 /*
  * RGR
  * GBG
  * RGR
  */
-#define BGGR_BGR888(p, n, div)                                                                \
-	*dst++ = blue_[curr[x] / (div)];                                                      \
-	*dst++ = green_[(prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div))];       \
-	*dst++ = red_[(prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div))]; \
-	if constexpr (addAlphaByte)                                                           \
-		*dst++ = 255;                                                                 \
-	x++;
+#define BGGR_BGR888(p, n, div)                                                 \
+	STORE_PIXEL(                                                           \
+		curr[x] / (div),                                               \
+		(prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div)), \
+		(prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div)))
 
 /*
  * GBG
  * RGR
  * GBG
  */
-#define GRBG_BGR888(p, n, div)                                    \
-	*dst++ = blue_[(prev[x] + next[x]) / (2 * (div))];        \
-	*dst++ = green_[curr[x] / (div)];                         \
-	*dst++ = red_[(curr[x - p] + curr[x + n]) / (2 * (div))]; \
-	if constexpr (addAlphaByte)                               \
-		*dst++ = 255;                                     \
-	x++;
+#define GRBG_BGR888(p, n, div)                     \
+	STORE_PIXEL(                               \
+		(prev[x] + next[x]) / (2 * (div)), \
+		curr[x] / (div),                   \
+		(curr[x - p] + curr[x + n]) / (2 * (div)))
 
 /*
  * GRG
  * BGB
  * GRG
  */
-#define GBRG_BGR888(p, n, div)                                     \
-	*dst++ = blue_[(curr[x - p] + curr[x + n]) / (2 * (div))]; \
-	*dst++ = green_[curr[x] / (div)];                          \
-	*dst++ = red_[(prev[x] + next[x]) / (2 * (div))];          \
-	if constexpr (addAlphaByte)                                \
-		*dst++ = 255;                                      \
-	x++;
+#define GBRG_BGR888(p, n, div)                             \
+	STORE_PIXEL(                                       \
+		(curr[x - p] + curr[x + n]) / (2 * (div)), \
+		curr[x] / (div),                           \
+		(prev[x] + next[x]) / (2 * (div)))
 
 /*
  * BGB
  * GRG
  * BGB
  */
-#define RGGB_BGR888(p, n, div)                                                                 \
-	*dst++ = blue_[(prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div))]; \
-	*dst++ = green_[(prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div))];        \
-	*dst++ = red_[curr[x] / (div)];                                                        \
-	if constexpr (addAlphaByte)                                                            \
-		*dst++ = 255;                                                                  \
-	x++;
+#define RGGB_BGR888(p, n, div)                                                         \
+	STORE_PIXEL(                                                                   \
+		(prev[x - p] + prev[x + n] + next[x - p] + next[x + n]) / (4 * (div)), \
+		(prev[x] + curr[x - p] + curr[x + n] + next[x]) / (4 * (div)),         \
+		curr[x] / (div))
 
 template<bool addAlphaByte>
 void DebayerCpu::debayer8_BGBG_BGR888(uint8_t *dst, const uint8_t *src[])