[PATCH 3/5] libcamera: format: Extend plane size calculation to accept scanline alignment

Harvey Yang chenghaoyang at chromium.org
Wed Oct 9 09:41:21 CEST 2024


From: Han-Lin Chen <hanlinchen at chromium.org>

As some platforms need alignment on scanline, this patch extends the
format::planeSize() method to accept scanline alignment.

Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
---
 include/libcamera/internal/formats.h |  5 +++--
 src/libcamera/formats.cpp            | 17 +++++++++++++----
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
index 6a3e9c16a..143ab1dce 100644
--- a/include/libcamera/internal/formats.h
+++ b/include/libcamera/internal/formats.h
@@ -40,10 +40,11 @@ public:
 	unsigned int stride(unsigned int width, unsigned int plane,
 			    unsigned int align = 1) const;
 	unsigned int planeSize(const Size &size, unsigned int plane,
-			       unsigned int align = 1) const;
+			       unsigned int align = 1, unsigned scanAlign = 1) const;
 	unsigned int planeSize(unsigned int height, unsigned int plane,
 			       unsigned int stride) const;
-	unsigned int frameSize(const Size &size, unsigned int align = 1) const;
+	unsigned int frameSize(const Size &size, unsigned int align = 1,
+			       unsigned scanAlign = 1) const;
 	unsigned int frameSize(const Size &size,
 			       const std::array<unsigned int, 3> &strides) const;
 
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index dbefb0947..7643a5a23 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -1093,6 +1093,7 @@ unsigned int PixelFormatInfo::stride(unsigned int width, unsigned int plane,
  * \param[in] size The size of the frame, in pixels
  * \param[in] plane The plane index
  * \param[in] align The stride alignment, in bytes (1 for default alignment)
+ * \param[in] scanAlign The scanline alignment, in bytes (1 for default alignment)
  *
  * The plane size is computed by multiplying the line stride and the frame
  * height, taking subsampling and other format characteristics into account.
@@ -1105,13 +1106,19 @@ unsigned int PixelFormatInfo::stride(unsigned int width, unsigned int plane,
  * format
  */
 unsigned int PixelFormatInfo::planeSize(const Size &size, unsigned int plane,
-					unsigned int align) const
+					unsigned int align, unsigned scanAlign) const
 {
 	unsigned int stride = PixelFormatInfo::stride(size.width, plane, align);
 	if (!stride)
 		return 0;
 
-	return planeSize(size.height, plane, stride);
+	unsigned int vertSubSample = planes[plane].verticalSubSampling;
+	if (!vertSubSample)
+		return 0;
+
+	unsigned int planeHeight = (size.height + vertSubSample - 1) / vertSubSample;
+
+	return stride * ((planeHeight + scanAlign - 1) / scanAlign * scanAlign);
 }
 
 /**
@@ -1143,6 +1150,7 @@ unsigned int PixelFormatInfo::planeSize(unsigned int height, unsigned int plane,
  * \brief Compute the number of bytes necessary to store a frame
  * \param[in] size The size of the frame, in pixels
  * \param[in] align The stride alignment, in bytes (1 for default alignment)
+ * \param[in] scanAlign The scanline alignment, in bytes (1 for default alignment)
  *
  * The frame size is computed by adding the size of all planes, as computed by
  * planeSize(), using the specified alignment constraints for all planes. For
@@ -1154,7 +1162,8 @@ unsigned int PixelFormatInfo::planeSize(unsigned int height, unsigned int plane,
  * \return The number of bytes necessary to store the frame, or 0 if the
  * PixelFormatInfo instance is not valid
  */
-unsigned int PixelFormatInfo::frameSize(const Size &size, unsigned int align) const
+unsigned int PixelFormatInfo::frameSize(const Size &size, unsigned int align,
+					unsigned scanAlign) const
 {
 	unsigned int sum = 0;
 
@@ -1162,7 +1171,7 @@ unsigned int PixelFormatInfo::frameSize(const Size &size, unsigned int align) co
 		if (plane.bytesPerGroup == 0)
 			break;
 
-		sum += planeSize(size, i, align);
+		sum += planeSize(size, i, align, scanAlign);
 	}
 
 	return sum;
-- 
2.47.0.rc0.187.ge670bccf7e-goog



More information about the libcamera-devel mailing list