33 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
34void appendPOD(std::vector<uint8_t> &vec, T val)
36 constexpr size_t byteWidth =
sizeof(val);
37 vec.resize(vec.size() + byteWidth);
38 memcpy(&*(vec.end() - byteWidth), &val, byteWidth);
42 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
43T readPOD(std::vector<uint8_t>::const_iterator it,
size_t pos,
44 std::vector<uint8_t>::const_iterator end)
49 memcpy(&ret, &(*(it + pos)),
sizeof(ret));
55 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
56T readPOD(std::vector<uint8_t> &vec,
size_t pos)
58 return readPOD<T>(vec.cbegin(), pos, vec.end());
67 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
72 static T
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
73 std::vector<uint8_t>::const_iterator dataEnd,
77 const std::vector<SharedFD> &fds,
79 static T
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
80 std::vector<uint8_t>::const_iterator dataEnd,
81 std::vector<SharedFD>::const_iterator fdsBegin,
82 std::vector<SharedFD>::const_iterator fdsEnd,
105 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
108 std::vector<uint8_t> dataVec;
109 std::vector<SharedFD> fdsVec;
112 uint32_t vecLen = data.size();
113 appendPOD<uint32_t>(dataVec, vecLen);
116 for (
auto const &it : data) {
117 std::vector<uint8_t> dvec;
118 std::vector<SharedFD> fvec;
120 std::tie(dvec, fvec) =
123 appendPOD<uint32_t>(dataVec, dvec.size());
124 appendPOD<uint32_t>(dataVec, fvec.size());
126 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
127 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
130 return { dataVec, fdsVec };
133 static std::vector<V>
deserialize(std::vector<uint8_t> &data, ControlSerializer *cs =
nullptr)
135 return deserialize(data.cbegin(), data.cend(), cs);
138 static std::vector<V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
139 std::vector<uint8_t>::const_iterator dataEnd,
140 ControlSerializer *cs =
nullptr)
142 std::vector<SharedFD> fds;
143 return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.cend(), cs);
146 static std::vector<V>
deserialize(std::vector<uint8_t> &data, std::vector<SharedFD> &fds,
147 ControlSerializer *cs =
nullptr)
149 return deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);
152 static std::vector<V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
153 std::vector<uint8_t>::const_iterator dataEnd,
154 std::vector<SharedFD>::const_iterator fdsBegin,
155 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
156 ControlSerializer *cs =
nullptr)
158 uint32_t vecLen = readPOD<uint32_t>(dataBegin, 0, dataEnd);
159 std::vector<V> ret(vecLen);
161 std::vector<uint8_t>::const_iterator dataIter = dataBegin + 4;
162 std::vector<SharedFD>::const_iterator fdIter = fdsBegin;
163 for (uint32_t i = 0; i < vecLen; i++) {
164 uint32_t sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
165 uint32_t sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
169 dataIter + sizeofData,
174 dataIter += sizeofData;
198template<
typename K,
typename V>
202 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
203 serialize(
const std::map<K, V> &data, ControlSerializer *cs =
nullptr)
205 std::vector<uint8_t> dataVec;
206 std::vector<SharedFD> fdsVec;
209 uint32_t mapLen = data.size();
210 appendPOD<uint32_t>(dataVec, mapLen);
213 for (
auto const &it : data) {
214 std::vector<uint8_t> dvec;
215 std::vector<SharedFD> fvec;
217 std::tie(dvec, fvec) =
220 appendPOD<uint32_t>(dataVec, dvec.size());
221 appendPOD<uint32_t>(dataVec, fvec.size());
223 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
224 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
226 std::tie(dvec, fvec) =
229 appendPOD<uint32_t>(dataVec, dvec.size());
230 appendPOD<uint32_t>(dataVec, fvec.size());
232 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
233 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
236 return { dataVec, fdsVec };
239 static std::map<K, V>
deserialize(std::vector<uint8_t> &data, ControlSerializer *cs =
nullptr)
241 return deserialize(data.cbegin(), data.cend(), cs);
244 static std::map<K, V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
245 std::vector<uint8_t>::const_iterator dataEnd,
246 ControlSerializer *cs =
nullptr)
248 std::vector<SharedFD> fds;
249 return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.cend(), cs);
252 static std::map<K, V>
deserialize(std::vector<uint8_t> &data, std::vector<SharedFD> &fds,
253 ControlSerializer *cs =
nullptr)
255 return deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);
258 static std::map<K, V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
259 std::vector<uint8_t>::const_iterator dataEnd,
260 std::vector<SharedFD>::const_iterator fdsBegin,
261 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
262 ControlSerializer *cs =
nullptr)
266 uint32_t mapLen = readPOD<uint32_t>(dataBegin, 0, dataEnd);
268 std::vector<uint8_t>::const_iterator dataIter = dataBegin + 4;
269 std::vector<SharedFD>::const_iterator fdIter = fdsBegin;
270 for (uint32_t i = 0; i < mapLen; i++) {
271 uint32_t sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
272 uint32_t sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
276 dataIter + sizeofData,
281 dataIter += sizeofData;
283 sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
284 sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
288 dataIter + sizeofData,
292 ret.insert({ key, value });
294 dataIter += sizeofData;
307 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
308 serialize(
const Flags<E> &data, [[maybe_unused]] ControlSerializer *cs =
nullptr)
310 std::vector<uint8_t> dataVec;
311 dataVec.reserve(
sizeof(Flags<E>));
312 appendPOD<uint32_t>(dataVec,
static_cast<typename
Flags<E>::Type>(data));
314 return { dataVec, {} };
317 static Flags<E>
deserialize(std::vector<uint8_t> &data,
318 [[maybe_unused]] ControlSerializer *cs =
nullptr)
323 static Flags<E>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
324 std::vector<uint8_t>::const_iterator dataEnd,
325 [[maybe_unused]] ControlSerializer *cs =
nullptr)
327 return Flags<E>{
static_cast<E
>(readPOD<uint32_t>(dataBegin, 0, dataEnd)) };
330 static Flags<E>
deserialize(std::vector<uint8_t> &data,
331 [[maybe_unused]] std::vector<SharedFD> &fds,
332 [[maybe_unused]] ControlSerializer *cs =
nullptr)
337 static Flags<E>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
338 std::vector<uint8_t>::const_iterator dataEnd,
339 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsBegin,
340 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
341 [[maybe_unused]] ControlSerializer *cs =
nullptr)
Serializer and deserializer for control-related classes.
Definition control_serializer.h:21
Type-safe container for enum-based bitfields.
Definition flags.h:16
std::underlying_type_t< E > Type
The underlying data type of the enum.
Definition flags.h:21
IPA Data Serializer.
Definition ipa_data_serializer.h:65
static T deserialize(std::vector< uint8_t >::const_iterator dataBegin, std::vector< uint8_t >::const_iterator dataEnd, std::vector< SharedFD >::const_iterator fdsBegin, std::vector< SharedFD >::const_iterator fdsEnd, ControlSerializer *cs=nullptr)
Deserialize byte vector and fd vector into an object.
static std::tuple< std::vector< uint8_t >, std::vector< SharedFD > > serialize(const T &data, ControlSerializer *cs=nullptr)
Serialize an object into byte vector and fd vector.
static T deserialize(std::vector< uint8_t >::const_iterator dataBegin, std::vector< uint8_t >::const_iterator dataEnd, ControlSerializer *cs=nullptr)
Deserialize byte vector into an object.
static T deserialize(const std::vector< uint8_t > &data, const std::vector< SharedFD > &fds, ControlSerializer *cs=nullptr)
Deserialize byte vector and fd vector into an object.
static T deserialize(const std::vector< uint8_t > &data, ControlSerializer *cs=nullptr)
Deserialize byte vector into an object.
Camera controls identifiers.
Serialization and deserialization helpers for controls.
Data structures related to geometric objects.
Image Processing Algorithm interface.
#define LOG_DECLARE_CATEGORY(name)
Declare a category of log messages.
Definition log.h:46
#define ASSERT(condition)
Abort program execution if assertion fails.
Definition log.h:126
Top-level libcamera namespace.
Definition backtrace.h:17