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

Milan Zamazal mzamazal at redhat.com
Mon Nov 25 11:54:41 CET 2024


Hi Robert,

Robert Mader <robert.mader at collabora.com> writes:

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

Oh, thank you, I'll fix it in v2.

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