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

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Jan 27 00:06:37 CET 2025


Hi Milan,

Thank you for the patch.

On Mon, Jan 13, 2025 at 02:51:01PM +0100, 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.

I would like if I said I like this, as the code gets hader to read in my
opinion, but I also understand that efficiency is more important here.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> 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[])

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list