libcamera: ipa: raspberrypi: Allow SwitchMode method to return camera settings
This commit adds a Metadata parameter to the SwitchMode method enabling it to return camera and other settings to the caller (usually the configure method, just after the camera mode has been selected). In future this will allow the Raspberry Pi IPAs to take those settings (such as exposure and analogue gain) and program them directly into the camera or ISP before the camera is even started. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
1023107b64
commit
ff291b3c15
11 changed files with 20 additions and 12 deletions
|
@ -16,9 +16,10 @@ void Algorithm::Read(boost::property_tree::ptree const ¶ms)
|
||||||
|
|
||||||
void Algorithm::Initialise() {}
|
void Algorithm::Initialise() {}
|
||||||
|
|
||||||
void Algorithm::SwitchMode(CameraMode const &camera_mode)
|
void Algorithm::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
|
||||||
{
|
{
|
||||||
(void)camera_mode;
|
(void)camera_mode;
|
||||||
|
(void)metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Algorithm::Prepare(Metadata *image_metadata)
|
void Algorithm::Prepare(Metadata *image_metadata)
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
virtual void Resume() { paused_ = false; }
|
virtual void Resume() { paused_ = false; }
|
||||||
virtual void Read(boost::property_tree::ptree const ¶ms);
|
virtual void Read(boost::property_tree::ptree const ¶ms);
|
||||||
virtual void Initialise();
|
virtual void Initialise();
|
||||||
virtual void SwitchMode(CameraMode const &camera_mode);
|
virtual void SwitchMode(CameraMode const &camera_mode, Metadata *metadata);
|
||||||
virtual void Prepare(Metadata *image_metadata);
|
virtual void Prepare(Metadata *image_metadata);
|
||||||
virtual void Process(StatisticsPtr &stats, Metadata *image_metadata);
|
virtual void Process(StatisticsPtr &stats, Metadata *image_metadata);
|
||||||
Metadata &GetGlobalMetadata() const
|
Metadata &GetGlobalMetadata() const
|
||||||
|
|
|
@ -56,11 +56,11 @@ void Controller::Initialise()
|
||||||
RPI_LOG("Controller finished");
|
RPI_LOG("Controller finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller::SwitchMode(CameraMode const &camera_mode)
|
void Controller::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
|
||||||
{
|
{
|
||||||
RPI_LOG("Controller starting");
|
RPI_LOG("Controller starting");
|
||||||
for (auto &algo : algorithms_)
|
for (auto &algo : algorithms_)
|
||||||
algo->SwitchMode(camera_mode);
|
algo->SwitchMode(camera_mode, metadata);
|
||||||
switch_mode_called_ = true;
|
switch_mode_called_ = true;
|
||||||
RPI_LOG("Controller finished");
|
RPI_LOG("Controller finished");
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ public:
|
||||||
Algorithm *CreateAlgorithm(char const *name);
|
Algorithm *CreateAlgorithm(char const *name);
|
||||||
void Read(char const *filename);
|
void Read(char const *filename);
|
||||||
void Initialise();
|
void Initialise();
|
||||||
void SwitchMode(CameraMode const &camera_mode);
|
void SwitchMode(CameraMode const &camera_mode, Metadata *metadata);
|
||||||
void Prepare(Metadata *image_metadata);
|
void Prepare(Metadata *image_metadata);
|
||||||
void Process(StatisticsPtr stats, Metadata *image_metadata);
|
void Process(StatisticsPtr stats, Metadata *image_metadata);
|
||||||
Metadata &GetGlobalMetadata();
|
Metadata &GetGlobalMetadata();
|
||||||
|
|
|
@ -173,8 +173,10 @@ void Alsc::Initialise()
|
||||||
lambda_r_[i] = lambda_b_[i] = 1.0;
|
lambda_r_[i] = lambda_b_[i] = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Alsc::SwitchMode(CameraMode const &camera_mode)
|
void Alsc::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
|
||||||
{
|
{
|
||||||
|
(void)metadata;
|
||||||
|
|
||||||
// There's a bit of a question what we should do if the "crop" of the
|
// There's a bit of a question what we should do if the "crop" of the
|
||||||
// camera mode has changed. Any calculation currently in flight would
|
// camera mode has changed. Any calculation currently in flight would
|
||||||
// not be useful to the new mode, so arguably we should abort it, and
|
// not be useful to the new mode, so arguably we should abort it, and
|
||||||
|
|
|
@ -50,7 +50,7 @@ public:
|
||||||
~Alsc();
|
~Alsc();
|
||||||
char const *Name() const override;
|
char const *Name() const override;
|
||||||
void Initialise() override;
|
void Initialise() override;
|
||||||
void SwitchMode(CameraMode const &camera_mode) override;
|
void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
|
||||||
void Read(boost::property_tree::ptree const ¶ms) override;
|
void Read(boost::property_tree::ptree const ¶ms) override;
|
||||||
void Prepare(Metadata *image_metadata) override;
|
void Prepare(Metadata *image_metadata) override;
|
||||||
void Process(StatisticsPtr &stats, Metadata *image_metadata) override;
|
void Process(StatisticsPtr &stats, Metadata *image_metadata) override;
|
||||||
|
|
|
@ -27,8 +27,10 @@ char const *Noise::Name() const
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Noise::SwitchMode(CameraMode const &camera_mode)
|
void Noise::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
|
||||||
{
|
{
|
||||||
|
(void)metadata;
|
||||||
|
|
||||||
// For example, we would expect a 2x2 binned mode to have a "noise
|
// For example, we would expect a 2x2 binned mode to have a "noise
|
||||||
// factor" of sqrt(2x2) = 2. (can't be less than one, right?)
|
// factor" of sqrt(2x2) = 2. (can't be less than one, right?)
|
||||||
mode_factor_ = std::max(1.0, camera_mode.noise_factor);
|
mode_factor_ = std::max(1.0, camera_mode.noise_factor);
|
||||||
|
|
|
@ -18,7 +18,7 @@ class Noise : public Algorithm
|
||||||
public:
|
public:
|
||||||
Noise(Controller *controller);
|
Noise(Controller *controller);
|
||||||
char const *Name() const override;
|
char const *Name() const override;
|
||||||
void SwitchMode(CameraMode const &camera_mode) override;
|
void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
|
||||||
void Read(boost::property_tree::ptree const ¶ms) override;
|
void Read(boost::property_tree::ptree const ¶ms) override;
|
||||||
void Prepare(Metadata *image_metadata) override;
|
void Prepare(Metadata *image_metadata) override;
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,10 @@ char const *Sharpen::Name() const
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sharpen::SwitchMode(CameraMode const &camera_mode)
|
void Sharpen::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
|
||||||
{
|
{
|
||||||
|
(void)metadata;
|
||||||
|
|
||||||
// can't be less than one, right?
|
// can't be less than one, right?
|
||||||
mode_factor_ = std::max(1.0, camera_mode.noise_factor);
|
mode_factor_ = std::max(1.0, camera_mode.noise_factor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ class Sharpen : public Algorithm
|
||||||
public:
|
public:
|
||||||
Sharpen(Controller *controller);
|
Sharpen(Controller *controller);
|
||||||
char const *Name() const override;
|
char const *Name() const override;
|
||||||
void SwitchMode(CameraMode const &camera_mode) override;
|
void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
|
||||||
void Read(boost::property_tree::ptree const ¶ms) override;
|
void Read(boost::property_tree::ptree const ¶ms) override;
|
||||||
void Prepare(Metadata *image_metadata) override;
|
void Prepare(Metadata *image_metadata) override;
|
||||||
|
|
||||||
|
|
|
@ -267,7 +267,8 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
|
||||||
queueFrameAction.emit(0, op);
|
queueFrameAction.emit(0, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
controller_.SwitchMode(mode_);
|
RPi::Metadata metadata;
|
||||||
|
controller_.SwitchMode(mode_, &metadata);
|
||||||
|
|
||||||
lastMode_ = mode_;
|
lastMode_ = mode_;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue