@@ -55,6 +55,8 @@ file structure:
supported_devices:
- driver: # driver name, e.g. `mxc-isi`
software_isp: # true/false
+ software_isp:
+ copy_input_buffer: # true/false
Configuration file example
--------------------------
@@ -88,6 +90,8 @@ Configuration file example
supported_devices:
- driver: mxc-isi
software_isp: true
+ software_isp:
+ copy_input_buffer: false
List of variables and configuration options
-------------------------------------------
@@ -154,6 +158,15 @@ pipelines.simple.supported_devices.driver, pipelines.simple.supported_devices.so
Example `software_isp` value: ``true``
+software_isp.copy_input_buffer
+ Define whether input buffers should be copied into standard (cached)
+ memory in software ISP. This is done by default to prevent very slow
+ processing on platforms with non-cached buffers. It can be set to
+ false on platforms with cached buffers to avoid an unnecessary
+ overhead.
+
+ Example value: ``false``
+
Further details
---------------
@@ -71,17 +71,6 @@ per-frame buffers like we do for hardware ISPs.
---
-6. Input buffer copying configuration
-
-> DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats)
-> : stats_(std::move(stats)), gammaCorrection_(1.0)
-> {
-> enableInputMemcpy_ = true;
-
-Set this appropriately and/or make it configurable.
-
----
-
7. Performance measurement configuration
> void DebayerCpu::process(FrameBuffer *input, FrameBuffer *output, DebayerParams params)
@@ -24,6 +24,7 @@
#include "libcamera/internal/bayer_format.h"
#include "libcamera/internal/dma_buf_allocator.h"
#include "libcamera/internal/framebuffer.h"
+#include "libcamera/internal/global_configuration.h"
#include "libcamera/internal/mapped_framebuffer.h"
namespace libcamera {
@@ -38,8 +39,9 @@ namespace libcamera {
/**
* \brief Constructs a DebayerCpu object
* \param[in] stats Pointer to the stats object to use
+ * \param[in] configuration The global configuration
*/
-DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats)
+DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats, const GlobalConfiguration &configuration)
: stats_(std::move(stats))
{
/*
@@ -50,7 +52,8 @@ DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats)
* always set it to true as the safer choice but this should be changed in
* future.
*/
- enableInputMemcpy_ = true;
+ enableInputMemcpy_ =
+ configuration.option<bool>({ "software_isp", "copy_input_buffer" }).value_or(true);
/* Initialize color lookup tables */
for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {
@@ -18,6 +18,7 @@
#include <libcamera/base/object.h>
#include "libcamera/internal/bayer_format.h"
+#include "libcamera/internal/global_configuration.h"
#include "debayer.h"
#include "swstats_cpu.h"
@@ -27,7 +28,7 @@ namespace libcamera {
class DebayerCpu : public Debayer, public Object
{
public:
- DebayerCpu(std::unique_ptr<SwStatsCpu> stats);
+ DebayerCpu(std::unique_ptr<SwStatsCpu> stats, const GlobalConfiguration &configuration);
~DebayerCpu();
int configure(const StreamConfiguration &inputCfg,
@@ -114,7 +114,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,
}
stats->statsReady.connect(this, &SoftwareIsp::statsReady);
- debayer_ = std::make_unique<DebayerCpu>(std::move(stats));
+ const GlobalConfiguration &configuration = pipe->cameraManager()->_d()->configuration();
+ debayer_ = std::make_unique<DebayerCpu>(std::move(stats), configuration);
debayer_->inputBufferReady.connect(this, &SoftwareIsp::inputReady);
debayer_->outputBufferReady.connect(this, &SoftwareIsp::outputReady);