[libcamera-devel,v2,3/7] libcamera: ipa_data_serializer: Add serializer for Flags
diff mbox series

Message ID 20220818064923.2573060-4-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • utils: ipc: Add support for enums and Flags
Related show

Commit Message

Paul Elder Aug. 18, 2022, 6:49 a.m. UTC
Implement an IPADataSerializer for Flags.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

---
Changes in v2:
- use Flags's Type cast to avoid friend class
---
 .../libcamera/internal/ipa_data_serializer.h  | 46 +++++++++++++++++++
 1 file changed, 46 insertions(+)

Patch
diff mbox series

diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h
index 30bdaebc..981d2f5c 100644
--- a/include/libcamera/internal/ipa_data_serializer.h
+++ b/include/libcamera/internal/ipa_data_serializer.h
@@ -14,6 +14,7 @@ 
 #include <type_traits>
 #include <vector>
 
+#include <libcamera/base/flags.h>
 #include <libcamera/base/log.h>
 
 #include <libcamera/control_ids.h>
@@ -301,6 +302,51 @@  public:
 	}
 };
 
+/* Serialization format for Flags is same as for PODs */
+template<typename E>
+class IPADataSerializer<Flags<E>>
+{
+public:
+	static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
+	serialize(const Flags<E> &data, [[maybe_unused]] ControlSerializer *cs = nullptr)
+	{
+		std::vector<uint8_t> dataVec;
+		dataVec.reserve(sizeof(Flags<E>));
+		appendPOD<uint32_t>(dataVec, static_cast<typename Flags<E>::Type>(data));
+
+		return { dataVec, {} };
+	}
+
+	static Flags<E> deserialize(std::vector<uint8_t> &data,
+				    [[maybe_unused]] ControlSerializer *cs = nullptr)
+	{
+		return deserialize(data.cbegin(), data.end());
+	}
+
+	static Flags<E> deserialize(std::vector<uint8_t>::const_iterator dataBegin,
+				    std::vector<uint8_t>::const_iterator dataEnd,
+				    [[maybe_unused]] ControlSerializer *cs = nullptr)
+	{
+		return Flags<E>{ static_cast<E>(readPOD<uint32_t>(dataBegin, 0, dataEnd)) };
+	}
+
+	static Flags<E> deserialize(std::vector<uint8_t> &data,
+				    [[maybe_unused]] std::vector<SharedFD> &fds,
+				    [[maybe_unused]] ControlSerializer *cs = nullptr)
+	{
+		return deserialize(data.cbegin(), data.end());
+	}
+
+	static Flags<E> deserialize(std::vector<uint8_t>::const_iterator dataBegin,
+				    std::vector<uint8_t>::const_iterator dataEnd,
+				    [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsBegin,
+				    [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
+				    [[maybe_unused]] ControlSerializer *cs = nullptr)
+	{
+		return deserialize(dataBegin, dataEnd);
+	}
+};
+
 #endif /* __DOXYGEN__ */
 
 } /* namespace libcamera */