7#ifndef __LIBCAMERA_INTERNAL_IPA_DATA_SERIALIZER_H__
8#define __LIBCAMERA_INTERNAL_IPA_DATA_SERIALIZER_H__
35 typename std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
36void appendPOD(std::vector<uint8_t> &vec, T val)
38 constexpr size_t byteWidth =
sizeof(val);
39 vec.resize(vec.size() + byteWidth);
40 memcpy(&*(vec.end() - byteWidth), &val, byteWidth);
44 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
45T readPOD(std::vector<uint8_t>::const_iterator it,
size_t pos,
46 std::vector<uint8_t>::const_iterator end)
51 memcpy(&ret, &(*(it + pos)),
sizeof(ret));
57 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
58T readPOD(std::vector<uint8_t> &vec,
size_t pos)
60 return readPOD<T>(vec.cbegin(), pos, vec.end());
69 static std::tuple<std::vector<uint8_t>, std::vector<FileDescriptor>>
74 static T
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
75 std::vector<uint8_t>::const_iterator dataEnd,
79 const std::vector<FileDescriptor> &fds,
81 static T
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
82 std::vector<uint8_t>::const_iterator dataEnd,
83 std::vector<FileDescriptor>::const_iterator fdsBegin,
84 std::vector<FileDescriptor>::const_iterator fdsEnd,
107 static std::tuple<std::vector<uint8_t>, std::vector<FileDescriptor>>
110 std::vector<uint8_t> dataVec;
111 std::vector<FileDescriptor> fdsVec;
114 uint32_t vecLen = data.size();
115 appendPOD<uint32_t>(dataVec, vecLen);
118 for (
auto const &it : data) {
119 std::vector<uint8_t> dvec;
120 std::vector<FileDescriptor> fvec;
122 std::tie(dvec, fvec) =
125 appendPOD<uint32_t>(dataVec, dvec.size());
126 appendPOD<uint32_t>(dataVec, fvec.size());
128 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
129 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
132 return { dataVec, fdsVec };
135 static std::vector<V>
deserialize(std::vector<uint8_t> &data, ControlSerializer *cs =
nullptr)
140 static std::vector<V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
141 std::vector<uint8_t>::const_iterator dataEnd,
142 ControlSerializer *cs =
nullptr)
144 std::vector<FileDescriptor> fds;
145 return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.end(), cs);
148 static std::vector<V>
deserialize(std::vector<uint8_t> &data, std::vector<FileDescriptor> &fds,
149 ControlSerializer *cs =
nullptr)
151 return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs);
154 static std::vector<V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
155 std::vector<uint8_t>::const_iterator dataEnd,
156 std::vector<FileDescriptor>::const_iterator fdsBegin,
157 [[maybe_unused]] std::vector<FileDescriptor>::const_iterator fdsEnd,
158 ControlSerializer *cs =
nullptr)
160 uint32_t vecLen = readPOD<uint32_t>(dataBegin, 0, dataEnd);
161 std::vector<V> ret(vecLen);
163 std::vector<uint8_t>::const_iterator dataIter = dataBegin + 4;
164 std::vector<FileDescriptor>::const_iterator fdIter = fdsBegin;
165 for (uint32_t i = 0; i < vecLen; i++) {
166 uint32_t sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
167 uint32_t sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
171 dataIter + sizeofData,
176 dataIter += sizeofData;
200template<
typename K,
typename V>
201class IPADataSerializer<std::map<K, V>>
204 static std::tuple<std::vector<uint8_t>, std::vector<FileDescriptor>>
205 serialize(
const std::map<K, V> &data, ControlSerializer *cs =
nullptr)
207 std::vector<uint8_t> dataVec;
208 std::vector<FileDescriptor> fdsVec;
211 uint32_t mapLen = data.size();
212 appendPOD<uint32_t>(dataVec, mapLen);
215 for (
auto const &it : data) {
216 std::vector<uint8_t> dvec;
217 std::vector<FileDescriptor> fvec;
219 std::tie(dvec, fvec) =
222 appendPOD<uint32_t>(dataVec, dvec.size());
223 appendPOD<uint32_t>(dataVec, fvec.size());
225 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
226 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
228 std::tie(dvec, fvec) =
231 appendPOD<uint32_t>(dataVec, dvec.size());
232 appendPOD<uint32_t>(dataVec, fvec.size());
234 dataVec.insert(dataVec.end(), dvec.begin(), dvec.end());
235 fdsVec.insert(fdsVec.end(), fvec.begin(), fvec.end());
238 return { dataVec, fdsVec };
241 static std::map<K, V>
deserialize(std::vector<uint8_t> &data, ControlSerializer *cs =
nullptr)
246 static std::map<K, V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
247 std::vector<uint8_t>::const_iterator dataEnd,
248 ControlSerializer *cs =
nullptr)
250 std::vector<FileDescriptor> fds;
251 return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.end(), cs);
254 static std::map<K, V>
deserialize(std::vector<uint8_t> &data, std::vector<FileDescriptor> &fds,
255 ControlSerializer *cs =
nullptr)
257 return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs);
260 static std::map<K, V>
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
261 std::vector<uint8_t>::const_iterator dataEnd,
262 std::vector<FileDescriptor>::const_iterator fdsBegin,
263 [[maybe_unused]] std::vector<FileDescriptor>::const_iterator fdsEnd,
264 ControlSerializer *cs =
nullptr)
268 uint32_t mapLen = readPOD<uint32_t>(dataBegin, 0, dataEnd);
270 std::vector<uint8_t>::const_iterator dataIter = dataBegin + 4;
271 std::vector<FileDescriptor>::const_iterator fdIter = fdsBegin;
272 for (uint32_t i = 0; i < mapLen; i++) {
273 uint32_t sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
274 uint32_t sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
278 dataIter + sizeofData,
283 dataIter += sizeofData;
285 sizeofData = readPOD<uint32_t>(dataIter, 0, dataEnd);
286 sizeofFds = readPOD<uint32_t>(dataIter, 4, dataEnd);
290 dataIter + sizeofData,
294 ret.insert({ key, value });
296 dataIter += sizeofData;
Managed memory container for serialized data.
Serializer and deserializer for control-related classes.
Definition: control_serializer.h:21
IPA Data Serializer.
Definition: ipa_data_serializer.h:67
static T deserialize(std::vector< uint8_t >::const_iterator dataBegin, std::vector< uint8_t >::const_iterator dataEnd, std::vector< FileDescriptor >::const_iterator fdsBegin, std::vector< FileDescriptor >::const_iterator fdsEnd, ControlSerializer *cs=nullptr)
Deserialize byte vector and fd vector into an object.
static T deserialize(const std::vector< uint8_t > &data, const std::vector< FileDescriptor > &fds, ControlSerializer *cs=nullptr)
Deserialize byte vector and fd vector into an object.
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, ControlSerializer *cs=nullptr)
Deserialize byte vector into an object.
static std::tuple< std::vector< uint8_t >, std::vector< FileDescriptor > > serialize(const T &data, ControlSerializer *cs=nullptr)
Serialize an object into byte vector and fd vector.
Camera control 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.
#define ASSERT(condition)
Abort program execution if assertion fails.
Top-level libcamera namespace.
Definition: bound_method.h:15