/* 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 #include #include #include #include "libcamera/internal/control_serializer.h" #include "libcamera/internal/ipa_data_serializer.h" namespace libcamera { LOG_DECLARE_CATEGORY(IPADataSerializer) template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::SensorConfig &data, [[maybe_unused]] ControlSerializer *cs = nullptr) { std::vector retData; std::vector sensorMetadata; std::tie(sensorMetadata, std::ignore) = IPADataSerializer::serialize(data.sensorMetadata); retData.insert(retData.end(), sensorMetadata.begin(), sensorMetadata.end()); return {retData, {}}; } static ipa::RPi::SensorConfig deserialize(std::vector &data, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::SensorConfig deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] ControlSerializer *cs = nullptr) { ipa::RPi::SensorConfig ret; std::vector::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::deserialize(m, m + 4); return ret; } static ipa::RPi::SensorConfig deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::SensorConfig deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::InitParams &data, [[maybe_unused]] ControlSerializer *cs = nullptr) { std::vector retData; std::vector retFds; std::vector lensPresent; std::tie(lensPresent, std::ignore) = IPADataSerializer::serialize(data.lensPresent); retData.insert(retData.end(), lensPresent.begin(), lensPresent.end()); std::vector sensorInfo; std::tie(sensorInfo, std::ignore) = IPADataSerializer::serialize(data.sensorInfo, cs); appendPOD(retData, sensorInfo.size()); retData.insert(retData.end(), sensorInfo.begin(), sensorInfo.end()); std::vector controllerMinFrameDurationUs; std::tie(controllerMinFrameDurationUs, std::ignore) = IPADataSerializer::serialize(data.controllerMinFrameDurationUs); retData.insert(retData.end(), controllerMinFrameDurationUs.begin(), controllerMinFrameDurationUs.end()); std::vector fe; std::vector feFds; std::tie(fe, feFds) = IPADataSerializer::serialize(data.fe); retData.insert(retData.end(), fe.begin(), fe.end()); retFds.insert(retFds.end(), feFds.begin(), feFds.end()); std::vector be; std::vector beFds; std::tie(be, beFds) = IPADataSerializer::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 &data, std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs); } static ipa::RPi::InitParams deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, std::vector::const_iterator fdsBegin, std::vector::const_iterator fdsEnd, [[maybe_unused]] ControlSerializer *cs = nullptr) { ipa::RPi::InitParams ret; std::vector::const_iterator m = dataBegin; std::vector::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::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(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::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::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::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::deserialize(m, m + 4, n, n + 1, cs); return ret; } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::InitResult &data, ControlSerializer *cs) { std::vector retData; std::vector sensorConfig; std::tie(sensorConfig, std::ignore) = IPADataSerializer::serialize(data.sensorConfig, cs); appendPOD(retData, sensorConfig.size()); retData.insert(retData.end(), sensorConfig.begin(), sensorConfig.end()); if (data.controlInfo.size() > 0) { std::vector controlInfo; std::tie(controlInfo, std::ignore) = IPADataSerializer::serialize(data.controlInfo, cs); appendPOD(retData, controlInfo.size()); retData.insert(retData.end(), controlInfo.begin(), controlInfo.end()); } else { appendPOD(retData, 0); } return {retData, {}}; } static ipa::RPi::InitResult deserialize(std::vector &data, ControlSerializer *cs) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::InitResult deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, ControlSerializer *cs) { ipa::RPi::InitResult ret; std::vector::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(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::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(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::deserialize(m, m + controlInfoSize, cs); return ret; } static ipa::RPi::InitResult deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::InitResult deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::BufferIds &data, [[maybe_unused]] ControlSerializer *cs = nullptr) { std::vector retData; std::vector bayer; std::tie(bayer, std::ignore) = IPADataSerializer::serialize(data.bayer); retData.insert(retData.end(), bayer.begin(), bayer.end()); std::vector embedded; std::tie(embedded, std::ignore) = IPADataSerializer::serialize(data.embedded); retData.insert(retData.end(), embedded.begin(), embedded.end()); std::vector stats; std::tie(stats, std::ignore) = IPADataSerializer::serialize(data.stats); retData.insert(retData.end(), stats.begin(), stats.end()); return {retData, {}}; } static ipa::RPi::BufferIds deserialize(std::vector &data, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::BufferIds deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] ControlSerializer *cs = nullptr) { ipa::RPi::BufferIds ret; std::vector::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::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::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::deserialize(m, m + 4); return ret; } static ipa::RPi::BufferIds deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::BufferIds deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::ConfigParams &data, ControlSerializer *cs) { std::vector retData; std::vector retFds; std::vector transform; std::tie(transform, std::ignore) = IPADataSerializer::serialize(data.transform); retData.insert(retData.end(), transform.begin(), transform.end()); if (data.sensorControls.size() > 0) { std::vector sensorControls; std::tie(sensorControls, std::ignore) = IPADataSerializer::serialize(data.sensorControls, cs); appendPOD(retData, sensorControls.size()); retData.insert(retData.end(), sensorControls.begin(), sensorControls.end()); } else { appendPOD(retData, 0); } if (data.ispControls.size() > 0) { std::vector ispControls; std::tie(ispControls, std::ignore) = IPADataSerializer::serialize(data.ispControls, cs); appendPOD(retData, ispControls.size()); retData.insert(retData.end(), ispControls.begin(), ispControls.end()); } else { appendPOD(retData, 0); } if (data.lensControls.size() > 0) { std::vector lensControls; std::tie(lensControls, std::ignore) = IPADataSerializer::serialize(data.lensControls, cs); appendPOD(retData, lensControls.size()); retData.insert(retData.end(), lensControls.begin(), lensControls.end()); } else { appendPOD(retData, 0); } std::vector lsTableHandle; std::vector lsTableHandleFds; std::tie(lsTableHandle, lsTableHandleFds) = IPADataSerializer::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 &data, std::vector &fds, ControlSerializer *cs) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), fds.cbegin(), fds.cend(), cs); } static ipa::RPi::ConfigParams deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, std::vector::const_iterator fdsBegin, std::vector::const_iterator fdsEnd, ControlSerializer *cs) { ipa::RPi::ConfigParams ret; std::vector::const_iterator m = dataBegin; std::vector::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::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(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::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(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::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(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::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::deserialize(m, m + 4, n, n + 1, cs); return ret; } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::ConfigResult &data, ControlSerializer *cs) { std::vector retData; std::vector modeSensitivity; std::tie(modeSensitivity, std::ignore) = IPADataSerializer::serialize(data.modeSensitivity); retData.insert(retData.end(), modeSensitivity.begin(), modeSensitivity.end()); if (data.controlInfo.size() > 0) { std::vector controlInfo; std::tie(controlInfo, std::ignore) = IPADataSerializer::serialize(data.controlInfo, cs); appendPOD(retData, controlInfo.size()); retData.insert(retData.end(), controlInfo.begin(), controlInfo.end()); } else { appendPOD(retData, 0); } if (data.sensorControls.size() > 0) { std::vector sensorControls; std::tie(sensorControls, std::ignore) = IPADataSerializer::serialize(data.sensorControls, cs); appendPOD(retData, sensorControls.size()); retData.insert(retData.end(), sensorControls.begin(), sensorControls.end()); } else { appendPOD(retData, 0); } if (data.lensControls.size() > 0) { std::vector lensControls; std::tie(lensControls, std::ignore) = IPADataSerializer::serialize(data.lensControls, cs); appendPOD(retData, lensControls.size()); retData.insert(retData.end(), lensControls.begin(), lensControls.end()); } else { appendPOD(retData, 0); } return {retData, {}}; } static ipa::RPi::ConfigResult deserialize(std::vector &data, ControlSerializer *cs) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::ConfigResult deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, ControlSerializer *cs) { ipa::RPi::ConfigResult ret; std::vector::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::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(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::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(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::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(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::deserialize(m, m + lensControlsSize, cs); return ret; } static ipa::RPi::ConfigResult deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::ConfigResult deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::StartResult &data, ControlSerializer *cs) { std::vector retData; if (data.controls.size() > 0) { std::vector controls; std::tie(controls, std::ignore) = IPADataSerializer::serialize(data.controls, cs); appendPOD(retData, controls.size()); retData.insert(retData.end(), controls.begin(), controls.end()); } else { appendPOD(retData, 0); } std::vector startupFrameCount; std::tie(startupFrameCount, std::ignore) = IPADataSerializer::serialize(data.startupFrameCount); retData.insert(retData.end(), startupFrameCount.begin(), startupFrameCount.end()); std::vector invalidFrameCount; std::tie(invalidFrameCount, std::ignore) = IPADataSerializer::serialize(data.invalidFrameCount); retData.insert(retData.end(), invalidFrameCount.begin(), invalidFrameCount.end()); return {retData, {}}; } static ipa::RPi::StartResult deserialize(std::vector &data, ControlSerializer *cs) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::StartResult deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, ControlSerializer *cs) { ipa::RPi::StartResult ret; std::vector::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(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::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::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::deserialize(m, m + 4); return ret; } static ipa::RPi::StartResult deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::StartResult deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::PrepareParams &data, ControlSerializer *cs) { std::vector retData; std::vector buffers; std::tie(buffers, std::ignore) = IPADataSerializer::serialize(data.buffers, cs); appendPOD(retData, buffers.size()); retData.insert(retData.end(), buffers.begin(), buffers.end()); if (data.sensorControls.size() > 0) { std::vector sensorControls; std::tie(sensorControls, std::ignore) = IPADataSerializer::serialize(data.sensorControls, cs); appendPOD(retData, sensorControls.size()); retData.insert(retData.end(), sensorControls.begin(), sensorControls.end()); } else { appendPOD(retData, 0); } if (data.requestControls.size() > 0) { std::vector requestControls; std::tie(requestControls, std::ignore) = IPADataSerializer::serialize(data.requestControls, cs); appendPOD(retData, requestControls.size()); retData.insert(retData.end(), requestControls.begin(), requestControls.end()); } else { appendPOD(retData, 0); } std::vector ipaContext; std::tie(ipaContext, std::ignore) = IPADataSerializer::serialize(data.ipaContext); retData.insert(retData.end(), ipaContext.begin(), ipaContext.end()); std::vector delayContext; std::tie(delayContext, std::ignore) = IPADataSerializer::serialize(data.delayContext); retData.insert(retData.end(), delayContext.begin(), delayContext.end()); return {retData, {}}; } static ipa::RPi::PrepareParams deserialize(std::vector &data, ControlSerializer *cs) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::PrepareParams deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, ControlSerializer *cs) { ipa::RPi::PrepareParams ret; std::vector::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(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::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(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::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(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::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::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::deserialize(m, m + 4); return ret; } static ipa::RPi::PrepareParams deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::PrepareParams deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; template<> class IPADataSerializer { public: static std::tuple, std::vector> serialize(const ipa::RPi::ProcessParams &data, [[maybe_unused]] ControlSerializer *cs = nullptr) { std::vector retData; std::vector buffers; std::tie(buffers, std::ignore) = IPADataSerializer::serialize(data.buffers, cs); appendPOD(retData, buffers.size()); retData.insert(retData.end(), buffers.begin(), buffers.end()); std::vector ipaContext; std::tie(ipaContext, std::ignore) = IPADataSerializer::serialize(data.ipaContext); retData.insert(retData.end(), ipaContext.begin(), ipaContext.end()); return {retData, {}}; } static ipa::RPi::ProcessParams deserialize(std::vector &data, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::ProcessParams deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] ControlSerializer *cs = nullptr) { ipa::RPi::ProcessParams ret; std::vector::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(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::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::deserialize(m, m + 4); return ret; } static ipa::RPi::ProcessParams deserialize(std::vector &data, [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(data.cbegin(), data.cend(), cs); } static ipa::RPi::ProcessParams deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, [[maybe_unused]] std::vector::const_iterator fdsBegin, [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer::deserialize(dataBegin, dataEnd, cs); } }; } /* namespace libcamera */