@@ -57,6 +57,9 @@ file structure:
software_isp: # true/false
software_isp:
copy_input_buffer: # true/false
+ measure:
+ skip: # non-negative integer, frames to skip initially
+ number: # non-negative integer, frames to measure
Configuration file example
--------------------------
@@ -92,6 +95,9 @@ Configuration file example
software_isp: true
software_isp:
copy_input_buffer: false
+ measure:
+ skip: 50
+ number: 30
List of variables and configuration options
-------------------------------------------
@@ -167,6 +173,18 @@ software_isp.copy_input_buffer
Example value: ``false``
+software_isp.measure.skip, software_isp.measure.number
+ Define per-frame time measurement parameters in software ISP. `skip`
+ defines how many initial frames are skipped before starting the
+ measurement; `number` defines how many frames then participate in the
+ measurement.
+
+ Set `software_isp.measure.number` to 0 to disable the measurement.
+
+ Example `skip` value: ``50``
+
+ Example `number` value: ``30``
+
Further details
---------------
@@ -71,31 +71,6 @@ per-frame buffers like we do for hardware ISPs.
---
-7. Performance measurement configuration
-
-> void DebayerCpu::process(FrameBuffer *input, FrameBuffer *output, DebayerParams params)
-> /* Measure before emitting signals */
-> if (measuredFrames_ < DebayerCpu::kLastFrameToMeasure &&
-> ++measuredFrames_ > DebayerCpu::kFramesToSkip) {
-> timespec frameEndTime = {};
-> clock_gettime(CLOCK_MONOTONIC_RAW, &frameEndTime);
-> frameProcessTime_ += timeDiff(frameEndTime, frameStartTime);
-> if (measuredFrames_ == DebayerCpu::kLastFrameToMeasure) {
-> const unsigned int measuredFrames = DebayerCpu::kLastFrameToMeasure -
-> DebayerCpu::kFramesToSkip;
-> LOG(Debayer, Info)
-> << "Processed " << measuredFrames
-> << " frames in " << frameProcessTime_ / 1000 << "us, "
-> << frameProcessTime_ / (1000 * measuredFrames)
-> << " us/frame";
-> }
-> }
-
-I wonder if there would be a way to control at runtime when/how to
-perform those measurements. Maybe that's a bit overkill.
-
----
-
8. DebayerCpu cleanups
> >> class DebayerCpu : public Debayer, public Object
@@ -55,6 +55,13 @@ DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats, const GlobalConfigurat
enableInputMemcpy_ =
configuration.option<bool>({ "software_isp", "copy_input_buffer" }).value_or(true);
+ skipBeforeMeasure_ = configuration.option<unsigned int>(
+ { "software_isp", "measure", "skip" })
+ .value_or(skipBeforeMeasure_);
+ framesToMeasure_ = configuration.option<unsigned int>(
+ { "software_isp", "measure", "number" })
+ .value_or(framesToMeasure_);
+
/* Initialize color lookup tables */
for (unsigned int i = 0; i < DebayerParams::kRGBLookupSize; i++) {
red_[i] = green_[i] = blue_[i] = i;
@@ -557,7 +564,7 @@ int DebayerCpu::configure(const StreamConfiguration &inputCfg,
lineBuffers_[i].resize(lineBufferLength_);
}
- measuredFrames_ = 0;
+ encounteredFrames_ = 0;
frameProcessTime_ = 0;
return 0;
@@ -763,7 +770,10 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output
{
timespec frameStartTime;
- if (measuredFrames_ < DebayerCpu::kLastFrameToMeasure) {
+ bool measure = framesToMeasure_ > 0 &&
+ encounteredFrames_ < skipBeforeMeasure_ + framesToMeasure_ &&
+ ++encounteredFrames_ > skipBeforeMeasure_;
+ if (measure) {
frameStartTime = {};
clock_gettime(CLOCK_MONOTONIC_RAW, &frameStartTime);
}
@@ -820,18 +830,15 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output
dmaSyncers.clear();
/* Measure before emitting signals */
- if (measuredFrames_ < DebayerCpu::kLastFrameToMeasure &&
- ++measuredFrames_ > DebayerCpu::kFramesToSkip) {
+ if (measure) {
timespec frameEndTime = {};
clock_gettime(CLOCK_MONOTONIC_RAW, &frameEndTime);
frameProcessTime_ += timeDiff(frameEndTime, frameStartTime);
- if (measuredFrames_ == DebayerCpu::kLastFrameToMeasure) {
- const unsigned int measuredFrames = DebayerCpu::kLastFrameToMeasure -
- DebayerCpu::kFramesToSkip;
+ if (encounteredFrames_ == skipBeforeMeasure_ + framesToMeasure_) {
LOG(Debayer, Info)
- << "Processed " << measuredFrames
+ << "Processed " << framesToMeasure_
<< " frames in " << frameProcessTime_ / 1000 << "us, "
- << frameProcessTime_ / (1000 * measuredFrames)
+ << frameProcessTime_ / (1000 * framesToMeasure_)
<< " us/frame";
}
}
@@ -161,11 +161,10 @@ private:
unsigned int xShift_; /* Offset of 0/1 applied to window_.x */
bool enableInputMemcpy_;
bool swapRedBlueGains_;
- unsigned int measuredFrames_;
+ unsigned int encounteredFrames_;
int64_t frameProcessTime_;
- /* Skip 30 frames for things to stabilize then measure 30 frames */
- static constexpr unsigned int kFramesToSkip = 30;
- static constexpr unsigned int kLastFrameToMeasure = 60;
+ unsigned int skipBeforeMeasure_ = 30;
+ unsigned int framesToMeasure_ = 30;
};
} /* namespace libcamera */