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

Robert Mader robert.mader at collabora.com
Sun Nov 24 17:10:15 CET 2024


This temporarily introduces a red <-> blue color swap, see below.

On 20.11.24 19:00, Milan Zamazal wrote:
> 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>
> ---
>   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 cf5ecdf7a..b9497d574 100644
> --- a/src/libcamera/software_isp/debayer_cpu.cpp
> +++ b/src/libcamera/software_isp/debayer_cpu.cpp
> @@ -61,57 +61,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_[r];          \
> +	*dst++ = green_[g];         \
> +	*dst++ = red_[b];           \

blue_[r] -> blue_[b] and red_[b] -> 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[])


More information about the libcamera-devel mailing list