libcamera: bayer_format: Add the transpose transformation

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 after the flips.  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@posteo.net>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Sebastian Fricke 2021-01-26 19:48:53 +01:00 committed by Laurent Pinchart
parent c440c828bc
commit d121f6c83f

View file

@ -272,9 +272,7 @@ 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.
* Horizontal and vertical flips are applied before transpose.
*
* \return The transformed Bayer format
*/
@ -292,6 +290,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;
}