[libcamera-devel] [PATCH v3 4/5] libcamera: Add the transpose transformation

Sebastian Fricke sebastian.fricke at posteo.net
Tue Jan 26 19:48:53 CET 2021


To transpose a BayerFormat means to flip it over its main-diagonal.

For example:
G B    G R
    ->
R G    B G

The main-diagonal goes from the top left to the bottom right.
This means, that the only two orders affected by a transpose
are GBRG & GRBG. When a transpose is used in combination with horizontal
and/or vertical flips it is performed with the lowest priority.
Therefore add the functionality by switching GBRG (index 1) with GRBG
(index 2), after the flips have been applied.

Signed-off-by: Sebastian Fricke <sebastian.fricke at posteo.net>
---
 src/libcamera/bayer_format.cpp | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
index d4e7f142..e06cd6e8 100644
--- a/src/libcamera/bayer_format.cpp
+++ b/src/libcamera/bayer_format.cpp
@@ -272,10 +272,6 @@ BayerFormat BayerFormat::fromV4L2PixelFormat(V4L2PixelFormat v4l2Format)
  * The transformed image would have a GRBG order. The bit depth and modifiers
  * are not affected.
  *
- * Note that transpositions are ignored as the order of a transpose with
- * respect to the flips would have to be defined, and sensors are not expected
- * to support transposition.
- *
  * \return The transformed Bayer format
  */
 BayerFormat BayerFormat::transform(Transform t) const
@@ -292,6 +288,11 @@ BayerFormat BayerFormat::transform(Transform t) const
 	if (!!(t & Transform::VFlip))
 		result.order = static_cast<Order>(result.order ^ 2);
 
+	if (!!(t & Transform::Transpose) && result.order == 1)
+		result.order = static_cast<Order>(2);
+	else if (!!(t & Transform::Transpose) && result.order == 2)
+		result.order = static_cast<Order>(1);
+
 	return result;
 }
 
-- 
2.25.1



More information about the libcamera-devel mailing list