1188 lines
36 KiB
C++
1188 lines
36 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2020, Google Inc.
|
|
*
|
|
* Image Processing Algorithm data serializer for raspberrypi
|
|
*
|
|
* This file is auto-generated. Do not edit.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <tuple>
|
|
#include <vector>
|
|
|
|
#include <libcamera/ipa/raspberrypi_ipa_interface.h>
|
|
#include <libcamera/ipa/core_ipa_serializer.h>
|
|
|
|
#include "libcamera/internal/control_serializer.h"
|
|
#include "libcamera/internal/ipa_data_serializer.h"
|
|
|
|
namespace libcamera {
|
|
|
|
LOG_DECLARE_CATEGORY(IPADataSerializer)
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::SensorConfig>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::SensorConfig &data,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
std::vector<uint8_t> sensorMetadata;
|
|
std::tie(sensorMetadata, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.sensorMetadata);
|
|
retData.insert(retData.end(), sensorMetadata.begin(), sensorMetadata.end());
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::SensorConfig
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::SensorConfig>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::SensorConfig
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
ipa::RPi::SensorConfig ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorMetadata"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.sensorMetadata = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::SensorConfig
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::SensorConfig>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::SensorConfig
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::SensorConfig>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::InitParams>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::InitParams &data,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
std::vector<SharedFD> retFds;
|
|
|
|
std::vector<uint8_t> lensPresent;
|
|
std::tie(lensPresent, std::ignore) =
|
|
IPADataSerializer<bool>::serialize(data.lensPresent);
|
|
retData.insert(retData.end(), lensPresent.begin(), lensPresent.end());
|
|
|
|
std::vector<uint8_t> sensorInfo;
|
|
std::tie(sensorInfo, std::ignore) =
|
|
IPADataSerializer<libcamera::IPACameraSensorInfo>::serialize(data.sensorInfo, cs);
|
|
appendPOD<uint32_t>(retData, sensorInfo.size());
|
|
retData.insert(retData.end(), sensorInfo.begin(), sensorInfo.end());
|
|
|
|
std::vector<uint8_t> controllerMinFrameDurationUs;
|
|
std::tie(controllerMinFrameDurationUs, std::ignore) =
|
|
IPADataSerializer<float>::serialize(data.controllerMinFrameDurationUs);
|
|
retData.insert(retData.end(), controllerMinFrameDurationUs.begin(), controllerMinFrameDurationUs.end());
|
|
|
|
std::vector<uint8_t> fe;
|
|
std::vector<SharedFD> feFds;
|
|
std::tie(fe, feFds) =
|
|
IPADataSerializer<SharedFD>::serialize(data.fe);
|
|
retData.insert(retData.end(), fe.begin(), fe.end());
|
|
retFds.insert(retFds.end(), feFds.begin(), feFds.end());
|
|
|
|
std::vector<uint8_t> be;
|
|
std::vector<SharedFD> beFds;
|
|
std::tie(be, beFds) =
|
|
IPADataSerializer<SharedFD>::serialize(data.be);
|
|
retData.insert(retData.end(), be.begin(), be.end());
|
|
retFds.insert(retFds.end(), beFds.begin(), beFds.end());
|
|
|
|
return {retData, retFds};
|
|
}
|
|
|
|
static ipa::RPi::InitParams
|
|
deserialize(std::vector<uint8_t> &data,
|
|
std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::InitParams>::deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::InitParams
|
|
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,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
ipa::RPi::InitParams ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
std::vector<SharedFD>::const_iterator n = fdsBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
[[maybe_unused]] size_t fdsSize = std::distance(fdsBegin, fdsEnd);
|
|
|
|
if (dataSize < 1) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "lensPresent"
|
|
<< ": not enough data, expected "
|
|
<< (1) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.lensPresent = IPADataSerializer<bool>::deserialize(m, m + 1);
|
|
m += 1;
|
|
dataSize -= 1;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorInfoSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t sensorInfoSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < sensorInfoSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorInfo"
|
|
<< ": not enough data, expected "
|
|
<< (sensorInfoSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.sensorInfo =
|
|
IPADataSerializer<libcamera::IPACameraSensorInfo>::deserialize(m, m + sensorInfoSize, cs);
|
|
m += sensorInfoSize;
|
|
dataSize -= sensorInfoSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controllerMinFrameDurationUs"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.controllerMinFrameDurationUs = IPADataSerializer<float>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "fe"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.fe = IPADataSerializer<SharedFD>::deserialize(m, m + 4, n, n + 1, cs);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
n += ret.fe.isValid() ? 1 : 0;
|
|
fdsSize -= ret.fe.isValid() ? 1 : 0;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "be"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.be = IPADataSerializer<SharedFD>::deserialize(m, m + 4, n, n + 1, cs);
|
|
|
|
return ret;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::InitResult>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::InitResult &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
std::vector<uint8_t> sensorConfig;
|
|
std::tie(sensorConfig, std::ignore) =
|
|
IPADataSerializer<ipa::RPi::SensorConfig>::serialize(data.sensorConfig, cs);
|
|
appendPOD<uint32_t>(retData, sensorConfig.size());
|
|
retData.insert(retData.end(), sensorConfig.begin(), sensorConfig.end());
|
|
|
|
if (data.controlInfo.size() > 0) {
|
|
std::vector<uint8_t> controlInfo;
|
|
std::tie(controlInfo, std::ignore) =
|
|
IPADataSerializer<ControlInfoMap>::serialize(data.controlInfo, cs);
|
|
appendPOD<uint32_t>(retData, controlInfo.size());
|
|
retData.insert(retData.end(), controlInfo.begin(), controlInfo.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::InitResult
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::InitResult>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::InitResult
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
ControlSerializer *cs)
|
|
{
|
|
ipa::RPi::InitResult ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorConfigSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t sensorConfigSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < sensorConfigSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorConfig"
|
|
<< ": not enough data, expected "
|
|
<< (sensorConfigSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.sensorConfig =
|
|
IPADataSerializer<ipa::RPi::SensorConfig>::deserialize(m, m + sensorConfigSize, cs);
|
|
m += sensorConfigSize;
|
|
dataSize -= sensorConfigSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controlInfoSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t controlInfoSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < controlInfoSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controlInfo"
|
|
<< ": not enough data, expected "
|
|
<< (controlInfoSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (controlInfoSize > 0)
|
|
ret.controlInfo =
|
|
IPADataSerializer<ControlInfoMap>::deserialize(m, m + controlInfoSize, cs);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::InitResult
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::InitResult>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::InitResult
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::InitResult>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::BufferIds>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::BufferIds &data,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
std::vector<uint8_t> bayer;
|
|
std::tie(bayer, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.bayer);
|
|
retData.insert(retData.end(), bayer.begin(), bayer.end());
|
|
|
|
std::vector<uint8_t> embedded;
|
|
std::tie(embedded, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.embedded);
|
|
retData.insert(retData.end(), embedded.begin(), embedded.end());
|
|
|
|
std::vector<uint8_t> stats;
|
|
std::tie(stats, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.stats);
|
|
retData.insert(retData.end(), stats.begin(), stats.end());
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::BufferIds
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::BufferIds>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::BufferIds
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
ipa::RPi::BufferIds ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "bayer"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.bayer = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "embedded"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.embedded = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "stats"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.stats = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::BufferIds
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::BufferIds>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::BufferIds
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::BufferIds>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::ConfigParams>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::ConfigParams &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
std::vector<SharedFD> retFds;
|
|
|
|
std::vector<uint8_t> transform;
|
|
std::tie(transform, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.transform);
|
|
retData.insert(retData.end(), transform.begin(), transform.end());
|
|
|
|
if (data.sensorControls.size() > 0) {
|
|
std::vector<uint8_t> sensorControls;
|
|
std::tie(sensorControls, std::ignore) =
|
|
IPADataSerializer<ControlInfoMap>::serialize(data.sensorControls, cs);
|
|
appendPOD<uint32_t>(retData, sensorControls.size());
|
|
retData.insert(retData.end(), sensorControls.begin(), sensorControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
if (data.ispControls.size() > 0) {
|
|
std::vector<uint8_t> ispControls;
|
|
std::tie(ispControls, std::ignore) =
|
|
IPADataSerializer<ControlInfoMap>::serialize(data.ispControls, cs);
|
|
appendPOD<uint32_t>(retData, ispControls.size());
|
|
retData.insert(retData.end(), ispControls.begin(), ispControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
if (data.lensControls.size() > 0) {
|
|
std::vector<uint8_t> lensControls;
|
|
std::tie(lensControls, std::ignore) =
|
|
IPADataSerializer<ControlInfoMap>::serialize(data.lensControls, cs);
|
|
appendPOD<uint32_t>(retData, lensControls.size());
|
|
retData.insert(retData.end(), lensControls.begin(), lensControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
std::vector<uint8_t> lsTableHandle;
|
|
std::vector<SharedFD> lsTableHandleFds;
|
|
std::tie(lsTableHandle, lsTableHandleFds) =
|
|
IPADataSerializer<SharedFD>::serialize(data.lsTableHandle);
|
|
retData.insert(retData.end(), lsTableHandle.begin(), lsTableHandle.end());
|
|
retFds.insert(retFds.end(), lsTableHandleFds.begin(), lsTableHandleFds.end());
|
|
|
|
return {retData, retFds};
|
|
}
|
|
|
|
static ipa::RPi::ConfigParams
|
|
deserialize(std::vector<uint8_t> &data,
|
|
std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ConfigParams>::deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::ConfigParams
|
|
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)
|
|
{
|
|
ipa::RPi::ConfigParams ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
std::vector<SharedFD>::const_iterator n = fdsBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
[[maybe_unused]] size_t fdsSize = std::distance(fdsBegin, fdsEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "transform"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.transform = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t sensorControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < sensorControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorControls"
|
|
<< ": not enough data, expected "
|
|
<< (sensorControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (sensorControlsSize > 0)
|
|
ret.sensorControls =
|
|
IPADataSerializer<ControlInfoMap>::deserialize(m, m + sensorControlsSize, cs);
|
|
m += sensorControlsSize;
|
|
dataSize -= sensorControlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "ispControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t ispControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < ispControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "ispControls"
|
|
<< ": not enough data, expected "
|
|
<< (ispControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (ispControlsSize > 0)
|
|
ret.ispControls =
|
|
IPADataSerializer<ControlInfoMap>::deserialize(m, m + ispControlsSize, cs);
|
|
m += ispControlsSize;
|
|
dataSize -= ispControlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "lensControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t lensControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < lensControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "lensControls"
|
|
<< ": not enough data, expected "
|
|
<< (lensControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (lensControlsSize > 0)
|
|
ret.lensControls =
|
|
IPADataSerializer<ControlInfoMap>::deserialize(m, m + lensControlsSize, cs);
|
|
m += lensControlsSize;
|
|
dataSize -= lensControlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "lsTableHandle"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.lsTableHandle = IPADataSerializer<SharedFD>::deserialize(m, m + 4, n, n + 1, cs);
|
|
|
|
return ret;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::ConfigResult>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::ConfigResult &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
std::vector<uint8_t> modeSensitivity;
|
|
std::tie(modeSensitivity, std::ignore) =
|
|
IPADataSerializer<float>::serialize(data.modeSensitivity);
|
|
retData.insert(retData.end(), modeSensitivity.begin(), modeSensitivity.end());
|
|
|
|
if (data.controlInfo.size() > 0) {
|
|
std::vector<uint8_t> controlInfo;
|
|
std::tie(controlInfo, std::ignore) =
|
|
IPADataSerializer<ControlInfoMap>::serialize(data.controlInfo, cs);
|
|
appendPOD<uint32_t>(retData, controlInfo.size());
|
|
retData.insert(retData.end(), controlInfo.begin(), controlInfo.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
if (data.sensorControls.size() > 0) {
|
|
std::vector<uint8_t> sensorControls;
|
|
std::tie(sensorControls, std::ignore) =
|
|
IPADataSerializer<ControlList>::serialize(data.sensorControls, cs);
|
|
appendPOD<uint32_t>(retData, sensorControls.size());
|
|
retData.insert(retData.end(), sensorControls.begin(), sensorControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
if (data.lensControls.size() > 0) {
|
|
std::vector<uint8_t> lensControls;
|
|
std::tie(lensControls, std::ignore) =
|
|
IPADataSerializer<ControlList>::serialize(data.lensControls, cs);
|
|
appendPOD<uint32_t>(retData, lensControls.size());
|
|
retData.insert(retData.end(), lensControls.begin(), lensControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::ConfigResult
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ConfigResult>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::ConfigResult
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
ControlSerializer *cs)
|
|
{
|
|
ipa::RPi::ConfigResult ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "modeSensitivity"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.modeSensitivity = IPADataSerializer<float>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controlInfoSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t controlInfoSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < controlInfoSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controlInfo"
|
|
<< ": not enough data, expected "
|
|
<< (controlInfoSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (controlInfoSize > 0)
|
|
ret.controlInfo =
|
|
IPADataSerializer<ControlInfoMap>::deserialize(m, m + controlInfoSize, cs);
|
|
m += controlInfoSize;
|
|
dataSize -= controlInfoSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t sensorControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < sensorControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorControls"
|
|
<< ": not enough data, expected "
|
|
<< (sensorControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (sensorControlsSize > 0)
|
|
ret.sensorControls =
|
|
IPADataSerializer<ControlList>::deserialize(m, m + sensorControlsSize, cs);
|
|
m += sensorControlsSize;
|
|
dataSize -= sensorControlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "lensControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t lensControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < lensControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "lensControls"
|
|
<< ": not enough data, expected "
|
|
<< (lensControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (lensControlsSize > 0)
|
|
ret.lensControls =
|
|
IPADataSerializer<ControlList>::deserialize(m, m + lensControlsSize, cs);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::ConfigResult
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ConfigResult>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::ConfigResult
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ConfigResult>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::StartResult>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::StartResult &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
if (data.controls.size() > 0) {
|
|
std::vector<uint8_t> controls;
|
|
std::tie(controls, std::ignore) =
|
|
IPADataSerializer<ControlList>::serialize(data.controls, cs);
|
|
appendPOD<uint32_t>(retData, controls.size());
|
|
retData.insert(retData.end(), controls.begin(), controls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
std::vector<uint8_t> startupFrameCount;
|
|
std::tie(startupFrameCount, std::ignore) =
|
|
IPADataSerializer<int32_t>::serialize(data.startupFrameCount);
|
|
retData.insert(retData.end(), startupFrameCount.begin(), startupFrameCount.end());
|
|
|
|
std::vector<uint8_t> invalidFrameCount;
|
|
std::tie(invalidFrameCount, std::ignore) =
|
|
IPADataSerializer<int32_t>::serialize(data.invalidFrameCount);
|
|
retData.insert(retData.end(), invalidFrameCount.begin(), invalidFrameCount.end());
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::StartResult
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::StartResult>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::StartResult
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
ControlSerializer *cs)
|
|
{
|
|
ipa::RPi::StartResult ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t controlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < controlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "controls"
|
|
<< ": not enough data, expected "
|
|
<< (controlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (controlsSize > 0)
|
|
ret.controls =
|
|
IPADataSerializer<ControlList>::deserialize(m, m + controlsSize, cs);
|
|
m += controlsSize;
|
|
dataSize -= controlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "startupFrameCount"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.startupFrameCount = IPADataSerializer<int32_t>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "invalidFrameCount"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.invalidFrameCount = IPADataSerializer<int32_t>::deserialize(m, m + 4);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::StartResult
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::StartResult>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::StartResult
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::StartResult>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::PrepareParams>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::PrepareParams &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
std::vector<uint8_t> buffers;
|
|
std::tie(buffers, std::ignore) =
|
|
IPADataSerializer<ipa::RPi::BufferIds>::serialize(data.buffers, cs);
|
|
appendPOD<uint32_t>(retData, buffers.size());
|
|
retData.insert(retData.end(), buffers.begin(), buffers.end());
|
|
|
|
if (data.sensorControls.size() > 0) {
|
|
std::vector<uint8_t> sensorControls;
|
|
std::tie(sensorControls, std::ignore) =
|
|
IPADataSerializer<ControlList>::serialize(data.sensorControls, cs);
|
|
appendPOD<uint32_t>(retData, sensorControls.size());
|
|
retData.insert(retData.end(), sensorControls.begin(), sensorControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
if (data.requestControls.size() > 0) {
|
|
std::vector<uint8_t> requestControls;
|
|
std::tie(requestControls, std::ignore) =
|
|
IPADataSerializer<ControlList>::serialize(data.requestControls, cs);
|
|
appendPOD<uint32_t>(retData, requestControls.size());
|
|
retData.insert(retData.end(), requestControls.begin(), requestControls.end());
|
|
} else {
|
|
appendPOD<uint32_t>(retData, 0);
|
|
}
|
|
|
|
std::vector<uint8_t> ipaContext;
|
|
std::tie(ipaContext, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.ipaContext);
|
|
retData.insert(retData.end(), ipaContext.begin(), ipaContext.end());
|
|
|
|
std::vector<uint8_t> delayContext;
|
|
std::tie(delayContext, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.delayContext);
|
|
retData.insert(retData.end(), delayContext.begin(), delayContext.end());
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::PrepareParams
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::PrepareParams>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::PrepareParams
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
ControlSerializer *cs)
|
|
{
|
|
ipa::RPi::PrepareParams ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "buffersSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t buffersSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < buffersSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "buffers"
|
|
<< ": not enough data, expected "
|
|
<< (buffersSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.buffers =
|
|
IPADataSerializer<ipa::RPi::BufferIds>::deserialize(m, m + buffersSize, cs);
|
|
m += buffersSize;
|
|
dataSize -= buffersSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t sensorControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < sensorControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "sensorControls"
|
|
<< ": not enough data, expected "
|
|
<< (sensorControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (sensorControlsSize > 0)
|
|
ret.sensorControls =
|
|
IPADataSerializer<ControlList>::deserialize(m, m + sensorControlsSize, cs);
|
|
m += sensorControlsSize;
|
|
dataSize -= sensorControlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "requestControlsSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t requestControlsSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < requestControlsSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "requestControls"
|
|
<< ": not enough data, expected "
|
|
<< (requestControlsSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
if (requestControlsSize > 0)
|
|
ret.requestControls =
|
|
IPADataSerializer<ControlList>::deserialize(m, m + requestControlsSize, cs);
|
|
m += requestControlsSize;
|
|
dataSize -= requestControlsSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "ipaContext"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.ipaContext = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "delayContext"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.delayContext = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::PrepareParams
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::PrepareParams>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::PrepareParams
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::PrepareParams>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
template<>
|
|
class IPADataSerializer<ipa::RPi::ProcessParams>
|
|
{
|
|
public:
|
|
static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>
|
|
serialize(const ipa::RPi::ProcessParams &data,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
std::vector<uint8_t> retData;
|
|
|
|
std::vector<uint8_t> buffers;
|
|
std::tie(buffers, std::ignore) =
|
|
IPADataSerializer<ipa::RPi::BufferIds>::serialize(data.buffers, cs);
|
|
appendPOD<uint32_t>(retData, buffers.size());
|
|
retData.insert(retData.end(), buffers.begin(), buffers.end());
|
|
|
|
std::vector<uint8_t> ipaContext;
|
|
std::tie(ipaContext, std::ignore) =
|
|
IPADataSerializer<uint32_t>::serialize(data.ipaContext);
|
|
retData.insert(retData.end(), ipaContext.begin(), ipaContext.end());
|
|
|
|
return {retData, {}};
|
|
}
|
|
|
|
static ipa::RPi::ProcessParams
|
|
deserialize(std::vector<uint8_t> &data,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ProcessParams>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
|
|
static ipa::RPi::ProcessParams
|
|
deserialize(std::vector<uint8_t>::const_iterator dataBegin,
|
|
std::vector<uint8_t>::const_iterator dataEnd,
|
|
[[maybe_unused]] ControlSerializer *cs = nullptr)
|
|
{
|
|
ipa::RPi::ProcessParams ret;
|
|
std::vector<uint8_t>::const_iterator m = dataBegin;
|
|
|
|
size_t dataSize = std::distance(dataBegin, dataEnd);
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "buffersSize"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
const size_t buffersSize = readPOD<uint32_t>(m, 0, dataEnd);
|
|
m += 4;
|
|
dataSize -= 4;
|
|
if (dataSize < buffersSize) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "buffers"
|
|
<< ": not enough data, expected "
|
|
<< (buffersSize) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.buffers =
|
|
IPADataSerializer<ipa::RPi::BufferIds>::deserialize(m, m + buffersSize, cs);
|
|
m += buffersSize;
|
|
dataSize -= buffersSize;
|
|
|
|
|
|
if (dataSize < 4) {
|
|
LOG(IPADataSerializer, Error)
|
|
<< "Failed to deserialize " << "ipaContext"
|
|
<< ": not enough data, expected "
|
|
<< (4) << ", got " << (dataSize);
|
|
return ret;
|
|
}
|
|
ret.ipaContext = IPADataSerializer<uint32_t>::deserialize(m, m + 4);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ipa::RPi::ProcessParams
|
|
deserialize(std::vector<uint8_t> &data,
|
|
[[maybe_unused]] std::vector<SharedFD> &fds,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ProcessParams>::deserialize(data.cbegin(), data.cend(), cs);
|
|
}
|
|
|
|
static ipa::RPi::ProcessParams
|
|
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,
|
|
ControlSerializer *cs = nullptr)
|
|
{
|
|
return IPADataSerializer<ipa::RPi::ProcessParams>::deserialize(dataBegin, dataEnd, cs);
|
|
}
|
|
};
|
|
|
|
|
|
} /* namespace libcamera */ |