@@ -94,7 +94,8 @@ private:
std::unique_ptr<DebayerCpu> debayer_;
Thread ispWorkerThread_;
- SharedMemObject<DebayerParams> sharedParams_;
+ static constexpr unsigned int kParamStatBufferCount = 1;
+ std::map<uint32_t, SharedMemObject<DebayerParams>> sharedParams_;
DebayerParams debayerParams_;
std::queue<uint32_t> availableParams_;
bool allocateParamsBuffers();
@@ -57,6 +57,11 @@ LOG_DEFINE_CATEGORY(SoftwareIsp)
* ready
*/
+/**
+ * \var SoftwareIsp::kParamStatBufferCount
+ * \brief The number of stats and params buffers (each of them)
+ */
+
/**
* \brief Constructs SoftwareIsp object
* \param[in] pipe The pipeline handler in use
@@ -104,7 +109,7 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor)
int ret = ipa_->init(IPASettings{ ipaTuningFile, sensor->model() },
debayer_->getStatsFD(),
- sharedParams_.fd(),
+ sharedParams_.begin()->second.fd(),
sensor->controls());
if (ret) {
LOG(SoftwareIsp, Error) << "IPA init failed";
@@ -126,32 +131,36 @@ SoftwareIsp::~SoftwareIsp()
bool SoftwareIsp::allocateParamsBuffers()
{
- /*
- * DebayerParams must be initialized because the initial value is used for
- * the first two frames, i.e. until stats processing starts providing its
- * own parameters.
- *
- * \todo This should be handled in the same place as the related
- * operations, in the IPA module.
- */
std::array<uint8_t, 256> gammaTable;
for (unsigned int i = 0; i < 256; i++)
gammaTable[i] = UINT8_MAX * std::pow(i / 256.0, 0.5);
- for (unsigned int j = 0; j < DebayerParams::kRGBLookupSize; j++) {
- debayerParams_.red[j] = gammaTable[j];
- debayerParams_.green[j] = gammaTable[j];
- debayerParams_.blue[j] = gammaTable[j];
- }
- sharedParams_ = SharedMemObject<DebayerParams>("softIsp_params");
- if (!sharedParams_) {
- LOG(SoftwareIsp, Error) << "Failed to create shared memory for parameters";
- return false;
- }
+ for (unsigned int i = 0; i < kParamStatBufferCount; i++) {
+ auto params = SharedMemObject<DebayerParams>("softIsp_params");
+ if (!params) {
+ LOG(SoftwareIsp, Error) << "Failed to create shared memory for parameters";
+ return false;
+ }
- ASSERT(sharedParams_.fd().get() >= 0);
- const uint32_t bufferId = sharedParams_.fd().get();
- availableParams_.push(bufferId);
+ /*
+ * DebayerParams must be initialized because the initial value is used for
+ * the first two frames, i.e. until stats processing starts providing its
+ * own parameters.
+ *
+ * \todo This should be handled in the same place as the related
+ * operations, in the IPA module.
+ */
+ for (unsigned int j = 0; j < DebayerParams::kRGBLookupSize; j++) {
+ params->red[j] = gammaTable[j];
+ params->green[j] = gammaTable[j];
+ params->blue[j] = gammaTable[j];
+ }
+
+ ASSERT(params.fd().get() >= 0);
+ const uint32_t bufferId = params.fd().get();
+ availableParams_.push(bufferId);
+ sharedParams_.emplace(bufferId, std::move(params));
+ }
return true;
}
@@ -380,7 +389,7 @@ void SoftwareIsp::process(uint32_t frame, FrameBuffer *input, FrameBuffer *outpu
void SoftwareIsp::saveIspParams([[maybe_unused]] uint32_t paramsBufferId)
{
- debayerParams_ = *sharedParams_;
+ debayerParams_ = *sharedParams_.begin()->second;
}
void SoftwareIsp::releaseIspParams(uint32_t paramsBufferId)
SoftwareIsp::sharedParams_ is changed from a single buffer to a map of multiple buffer ids and the corresponding buffers. This requires some code rearranging within SoftwareIsp::allocateBuffers to keep the right sequence of actions. Currently, only a single buffer is allocated, this will be changed in a followup patch. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> --- .../internal/software_isp/software_isp.h | 3 +- src/libcamera/software_isp/software_isp.cpp | 55 +++++++++++-------- 2 files changed, 34 insertions(+), 24 deletions(-)