[v5,3/7] libcamera: software_isp: Pass correct y-coordinate to stats
diff mbox series

Message ID 20250929201924.45019-4-mzamazal@redhat.com
State New
Headers show
Series
  • Fix stats related problems in software ISP
Related show

Commit Message

Milan Zamazal Sept. 29, 2025, 8:19 p.m. UTC
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>
---
 src/libcamera/software_isp/debayer_cpu.cpp | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Barnabás Pőcze Sept. 30, 2025, 8:42 a.m. UTC | #1
2025. 09. 29. 22:19 keltezéssel, Milan Zamazal írta:
> 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>
> ---

Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>


>   src/libcamera/software_isp/debayer_cpu.cpp | 12 +++++++-----
>   1 file changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp
> index bcaaa5dee..09d171d6b 100644
> --- a/src/libcamera/software_isp/debayer_cpu.cpp
> +++ b/src/libcamera/software_isp/debayer_cpu.cpp
> @@ -661,7 +661,7 @@ void DebayerCpu::memcpyNextLine(const uint8_t *linePointers[])
> 
>   void DebayerCpu::process2(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(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(y, linePointers);
> @@ -716,7 +719,6 @@ void DebayerCpu::process2(const uint8_t *src, uint8_t *dst)
> 
>   void DebayerCpu::process4(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(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(y, linePointers);
> --
> 2.51.0
>

Patch
diff mbox series

diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp
index bcaaa5dee..09d171d6b 100644
--- a/src/libcamera/software_isp/debayer_cpu.cpp
+++ b/src/libcamera/software_isp/debayer_cpu.cpp
@@ -661,7 +661,7 @@  void DebayerCpu::memcpyNextLine(const uint8_t *linePointers[])
 
 void DebayerCpu::process2(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(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(y, linePointers);
@@ -716,7 +719,6 @@  void DebayerCpu::process2(const uint8_t *src, uint8_t *dst)
 
 void DebayerCpu::process4(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(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(y, linePointers);