13 #include <type_traits> 34 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
35 void appendPOD(std::vector<uint8_t> &vec, T val)
37 constexpr
size_t byteWidth =
sizeof(val);
38 vec.resize(vec.size() + byteWidth);
39 memcpy(&*(vec.end() - byteWidth), &val, byteWidth);
43 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
44 T readPOD(std::vector<uint8_t>::const_iterator it,
size_t pos,
45 std::vector<uint8_t>::const_iterator end)
50 memcpy(&ret, &(*(it + pos)),
sizeof(ret));
56 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
57 T readPOD(std::vector<uint8_t> &vec,
size_t pos)
59 return readPOD<T>(vec.cbegin(), pos, vec.end());
68 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
71 static T
deserialize(
const std::vector<uint8_t> &data,
73 static T
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
74 std::vector<uint8_t>::const_iterator dataEnd,
77 static T
deserialize(
const std::vector<uint8_t> &data,
78 const std::vector<SharedFD> &fds,
80 static T
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
81 std::vector<uint8_t>::const_iterator dataEnd,
82 std::vector<SharedFD>::const_iterator fdsBegin,
83 std::vector<SharedFD>::const_iterator fdsEnd,
106 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
109 std::vector<uint8_t> dataVec;
110 std::vector<SharedFD> fdsVec;
113 uint32_t vecLen = data.size();
114 appendPOD<uint32_t>(dataVec, vecLen);
117 for (
auto const &it : data) {
118 std::vector<uint8_t> dvec;
119 std::vector<SharedFD> fvec;
121 std::tie(dvec, fvec) =
124 appendPOD<uint32_t>(dataVec, dvec.size());
125 appendPOD<uint32_t>(dataVec, fvec.size());
127 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
128 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
131 return { dataVec, fdsVec };
136 return deserialize(data.cbegin(), data.cend(), cs);
139 static std::vector<V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
140 std::vector<uint8_t>::const_iterator dataEnd,
143 std::vector<SharedFD> fds;
144 return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.cend(), cs);
147 static std::vector<V>
deserialize(std::vector<uint8_t> &data, std::vector<SharedFD> &fds,
150 return deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);
153 static std::vector<V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
154 std::vector<uint8_t>::const_iterator dataEnd,
155 std::vector<SharedFD>::const_iterator fdsBegin,
156 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
159 uint32_t vecLen = readPOD<uint32_t>(dataBegin, 0, dataEnd);
160 std::vector<V> ret(vecLen);
162 std::vector<uint8_t>::const_iterator dataIter = dataBegin + 4;
163 std::vector<SharedFD>::const_iterator fdIter = fdsBegin;
164 for (uint32_t i = 0; i < vecLen; i++) {
165 uint32_t sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
166 uint32_t sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
170 dataIter + sizeofData,
175 dataIter += sizeofData;
199 template<
typename K,
typename V>
203 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
206 std::vector<uint8_t> dataVec;
207 std::vector<SharedFD> fdsVec;
210 uint32_t mapLen = data.size();
211 appendPOD<uint32_t>(dataVec, mapLen);
214 for (
auto const &it : data) {
215 std::vector<uint8_t> dvec;
216 std::vector<SharedFD> fvec;
218 std::tie(dvec, fvec) =
221 appendPOD<uint32_t>(dataVec, dvec.size());
222 appendPOD<uint32_t>(dataVec, fvec.size());
224 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
225 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
227 std::tie(dvec, fvec) =
230 appendPOD<uint32_t>(dataVec, dvec.size());
231 appendPOD<uint32_t>(dataVec, fvec.size());
233 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
234 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
237 return { dataVec, fdsVec };
242 return deserialize(data.cbegin(), data.cend(), cs);
245 static std::map<K, V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
246 std::vector<uint8_t>::const_iterator dataEnd,
249 std::vector<SharedFD> fds;
250 return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.cend(), cs);
253 static std::map<K, V>
deserialize(std::vector<uint8_t> &data, std::vector<SharedFD> &fds,
256 return deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);
259 static std::map<K, V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
260 std::vector<uint8_t>::const_iterator dataEnd,
261 std::vector<SharedFD>::const_iterator fdsBegin,
262 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
267 uint32_t mapLen = readPOD<uint32_t>(dataBegin, 0, dataEnd);
269 std::vector<uint8_t>::const_iterator dataIter = dataBegin + 4;
270 std::vector<SharedFD>::const_iterator fdIter = fdsBegin;
271 for (uint32_t i = 0; i < mapLen; i++) {
272 uint32_t sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
273 uint32_t sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
277 dataIter + sizeofData,
282 dataIter += sizeofData;
284 sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
285 sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
289 dataIter + sizeofData,
293 ret.insert({ key, value });
295 dataIter += sizeofData;
308 static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
311 std::vector<uint8_t> dataVec;
313 appendPOD<uint32_t>(dataVec,
static_cast<typename
Flags<E>::Type>(data));
315 return { dataVec, {} };
325 std::vector<uint8_t>::const_iterator dataEnd,
328 return Flags<E>{
static_cast<E
>(readPOD<uint32_t>(dataBegin, 0, dataEnd)) };
332 [[maybe_unused]] std::vector<SharedFD> &fds,
339 std::vector<uint8_t>::const_iterator dataEnd,
340 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsBegin,
341 [[maybe_unused]] std::vector<SharedFD>::const_iterator fdsEnd,
Camera controls identifiers.
Image Processing Algorithm interface.
Top-level libcamera namespace.
Definition: backtrace.h:17
#define ASSERT(condition)
Abort program execution if assertion fails.
#define LOG_DECLARE_CATEGORY(name)
Declare a category of log messages.
Serializer and deserializer for control-related classes.
Definition: control_serializer.h:20
std::underlying_type_t< E > Type
The underlying data type of the enum.
Definition: flags.h:21
static T deserialize(const std::vector< uint8_t > &data, ControlSerializer *cs=nullptr)
Deserialize byte vector into an object.
IPA Data Serializer.
Definition: ipa_data_serializer.h:65
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.
Type-safe container for enum-based bitfields.
Definition: flags.h:15
Data structures related to geometric objects.
Serialization and deserialization helpers for controls.