[libcamera-devel,v3,1/5] libcamera: Add the fromV4L2PixelFormat function
diff mbox series

Message ID 20210126184854.46156-2-sebastian.fricke@posteo.net
State Accepted
Headers show
Series
  • Improve BayerFormat class
Related show

Commit Message

Sebastian Fricke Jan. 26, 2021, 6:48 p.m. UTC
Add a static member function to get the corresponding BayerFormat
from a given V4L2PixelFormat.
The motivation behind this patch is to align the overall structure
of the BayerFormat class with other parts of the code base, such as
the V4L2PixelFormat class.

The downside of this change is a slightly worse time complexity, but
the upside is a smaller codebase and lower memory consumption. As the
function is probably not used very frequently, I tend to favor the
mentioned upsides.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sebastian Fricke <sebastian.fricke@posteo.net>
---
 include/libcamera/internal/bayer_format.h      |  1 +
 src/libcamera/bayer_format.cpp                 | 18 ++++++++++++++++++
 .../pipeline/raspberrypi/raspberrypi.cpp       |  4 ++--
 3 files changed, 21 insertions(+), 2 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/internal/bayer_format.h b/include/libcamera/internal/bayer_format.h
index dc86f6ee..4f338bd7 100644
--- a/include/libcamera/internal/bayer_format.h
+++ b/include/libcamera/internal/bayer_format.h
@@ -49,6 +49,7 @@  public:
 	std::string toString() const;
 
 	V4L2PixelFormat toV4L2PixelFormat() const;
+	static BayerFormat fromV4L2PixelFormat(V4L2PixelFormat v4l2Format);
 	BayerFormat transform(Transform t) const;
 
 	Order order;
diff --git a/src/libcamera/bayer_format.cpp b/src/libcamera/bayer_format.cpp
index a6a40be0..9eb83898 100644
--- a/src/libcamera/bayer_format.cpp
+++ b/src/libcamera/bayer_format.cpp
@@ -7,6 +7,7 @@ 
 
 #include "libcamera/internal/bayer_format.h"
 
+#include <algorithm>
 #include <map>
 #include <unordered_map>
 
@@ -272,6 +273,23 @@  V4L2PixelFormat BayerFormat::toV4L2PixelFormat() const
 	return V4L2PixelFormat();
 }
 
+/**
+ * \brief Convert \a v4l2Format to the corresponding BayerFormat
+ * \param[in] v4l2Format The raw format to convert into a BayerFormat
+ * \return The BayerFormat corresponding to \a v4l2Format
+ */
+BayerFormat BayerFormat::fromV4L2PixelFormat(V4L2PixelFormat v4l2Format)
+{
+	auto it = std::find_if(bayerToV4l2.begin(), bayerToV4l2.end(),
+			       [v4l2Format](const auto &i) {
+				       return i.second == v4l2Format;
+			       });
+	if (it != bayerToV4l2.end())
+		return it->first;
+
+	return BayerFormat();
+}
+
 /**
  * \brief Apply a transform to this BayerFormat
  * \param[in] t The transform to apply
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 524cc960..236aa107 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -358,7 +358,7 @@  CameraConfiguration::Status RPiCameraConfiguration::validate()
 			 */
 			V4L2PixelFormat fourcc = sensorFormat.fourcc;
 			if (data_->flipsAlterBayerOrder_) {
-				BayerFormat bayer(fourcc);
+				BayerFormat bayer = BayerFormat::fromV4L2PixelFormat(fourcc);
 				bayer.order = data_->nativeBayerOrder_;
 				bayer = bayer.transform(combined);
 				fourcc = bayer.toV4L2PixelFormat();
@@ -1007,7 +1007,7 @@  bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)
 	BayerFormat bayerFormat;
 	for (const auto &iter : dev->formats()) {
 		V4L2PixelFormat v4l2Format = iter.first;
-		bayerFormat = BayerFormat(v4l2Format);
+		bayerFormat = BayerFormat::fromV4L2PixelFormat(v4l2Format);
 		if (bayerFormat.isValid())
 			break;
 	}