diff options
Diffstat (limited to 'include/libcamera/internal/ipa_data_serializer.h')
-rw-r--r-- | include/libcamera/internal/ipa_data_serializer.h | 60 |
1 files changed, 53 insertions, 7 deletions
diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h index a87449c9..085f1fed 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> @@ -32,7 +33,7 @@ LOG_DECLARE_CATEGORY(IPADataSerializer) namespace { template<typename T, - typename std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr> + std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr> void appendPOD(std::vector<uint8_t> &vec, T val) { constexpr size_t byteWidth = sizeof(val); @@ -134,7 +135,7 @@ public: static std::vector<V> deserialize(std::vector<uint8_t> &data, ControlSerializer *cs = nullptr) { - return deserialize(data.cbegin(), data.end(), cs); + return deserialize(data.cbegin(), data.cend(), cs); } static std::vector<V> deserialize(std::vector<uint8_t>::const_iterator dataBegin, @@ -142,13 +143,13 @@ public: ControlSerializer *cs = nullptr) { std::vector<SharedFD> fds; - return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.end(), cs); + return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.cend(), cs); } static std::vector<V> deserialize(std::vector<uint8_t> &data, std::vector<SharedFD> &fds, ControlSerializer *cs = nullptr) { - return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs); + return deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs); } static std::vector<V> deserialize(std::vector<uint8_t>::const_iterator dataBegin, @@ -240,7 +241,7 @@ public: static std::map<K, V> deserialize(std::vector<uint8_t> &data, ControlSerializer *cs = nullptr) { - return deserialize(data.cbegin(), data.end(), cs); + return deserialize(data.cbegin(), data.cend(), cs); } static std::map<K, V> deserialize(std::vector<uint8_t>::const_iterator dataBegin, @@ -248,13 +249,13 @@ public: ControlSerializer *cs = nullptr) { std::vector<SharedFD> fds; - return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.end(), cs); + return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.cend(), cs); } static std::map<K, V> deserialize(std::vector<uint8_t> &data, std::vector<SharedFD> &fds, ControlSerializer *cs = nullptr) { - return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs); + return deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs); } static std::map<K, V> deserialize(std::vector<uint8_t>::const_iterator dataBegin, @@ -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.cend()); + } + + 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.cend()); + } + + 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 */ |