[PATCH v3 4/9] libcamera: software_isp: Use common code to store debayered pixels

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Jan 9 17:57:27 CET 2025


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 at 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 at 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
>


More information about the libcamera-devel mailing list