libcamera: software_isp: Pass correct y-coordinate to stats

The window set by SwStatsCpu::setWindow is relative to the processed
image area.  But debayering passes the processed line y-coordinate to
the stats relative to the whole image area.  This can result in
gathering stats from a wrong image area or in not gathering stats at
all.

Let's pass the correct y-coordinate to the stats processing methods.

Bug: https://bugs.libcamera.org/show_bug.cgi?id=280
Signed-off-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>
Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Hans de Goede <hansg@kernel.org>
Tested-by: Hans de Goede <hansg@kernel.org>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Milan Zamazal
2025-09-29 22:19:20 +02:00
committed by Kieran Bingham
parent 4ec1d75fdd
commit 6a48f382e0

View File

@@ -661,7 +661,7 @@ void DebayerCpu::memcpyNextLine(const uint8_t *linePointers[])
void DebayerCpu::process2(uint32_t frame, const uint8_t *src, uint8_t *dst)
{
unsigned int yEnd = window_.y + window_.height;
unsigned int yEnd = window_.height;
/* Holds [0] previous- [1] current- [2] next-line */
const uint8_t *linePointers[3];
@@ -676,13 +676,16 @@ void DebayerCpu::process2(uint32_t frame, const uint8_t *src, uint8_t *dst)
/* window_.y == 0, use the next line as prev line */
linePointers[1] = src + inputConfig_.stride;
linePointers[2] = src;
/* Last 2 lines also need special handling */
/*
* Last 2 lines also need special handling.
* (And configure() ensures that yEnd >= 2.)
*/
yEnd -= 2;
}
setupInputMemcpy(linePointers);
for (unsigned int y = window_.y; y < yEnd; y += 2) {
for (unsigned int y = 0; y < yEnd; y += 2) {
shiftLinePointers(linePointers, src);
memcpyNextLine(linePointers);
stats_->processLine0(frame, y, linePointers);
@@ -716,7 +719,6 @@ void DebayerCpu::process2(uint32_t frame, const uint8_t *src, uint8_t *dst)
void DebayerCpu::process4(uint32_t frame, const uint8_t *src, uint8_t *dst)
{
const unsigned int yEnd = window_.y + window_.height;
/*
* This holds pointers to [0] 2-lines-up [1] 1-line-up [2] current-line
* [3] 1-line-down [4] 2-lines-down.
@@ -734,7 +736,7 @@ void DebayerCpu::process4(uint32_t frame, const uint8_t *src, uint8_t *dst)
setupInputMemcpy(linePointers);
for (unsigned int y = window_.y; y < yEnd; y += 4) {
for (unsigned int y = 0; y < window_.height; y += 4) {
shiftLinePointers(linePointers, src);
memcpyNextLine(linePointers);
stats_->processLine0(frame, y, linePointers);