@@ -175,19 +175,21 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
if (transform != requestedTransform)
status = Adjusted;
- std::vector<CameraData::StreamParams> rawStreams, outStreams;
+ rawStreams_.clear();
+ outStreams_.clear();
+
for (const auto &[index, cfg] : utils::enumerate(config_)) {
if (PipelineHandlerBase::isRaw(cfg.pixelFormat))
- rawStreams.emplace_back(index, &cfg);
+ rawStreams_.emplace_back(index, &cfg);
else
- outStreams.emplace_back(index, &cfg);
+ outStreams_.emplace_back(index, &cfg);
}
/* Sort the streams so the highest resolution is first. */
- std::sort(rawStreams.begin(), rawStreams.end(),
+ std::sort(rawStreams_.begin(), rawStreams_.end(),
[](auto &l, auto &r) { return l.cfg->size > r.cfg->size; });
- std::sort(outStreams.begin(), outStreams.end(),
+ std::sort(outStreams_.begin(), outStreams_.end(),
[](auto &l, auto &r) { return l.cfg->size > r.cfg->size; });
/* Compute the sensor's format then do any platform specific fixups. */
@@ -198,14 +200,14 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
/* Use the application provided sensor configuration. */
bitDepth = sensorConfig.bitDepth;
sensorSize = sensorConfig.outputSize;
- } else if (!rawStreams.empty()) {
+ } else if (!rawStreams_.empty()) {
/* Use the RAW stream format and size. */
- BayerFormat bayerFormat = BayerFormat::fromPixelFormat(rawStreams[0].cfg->pixelFormat);
+ BayerFormat bayerFormat = BayerFormat::fromPixelFormat(rawStreams_[0].cfg->pixelFormat);
bitDepth = bayerFormat.bitDepth;
- sensorSize = rawStreams[0].cfg->size;
+ sensorSize = rawStreams_[0].cfg->size;
} else {
bitDepth = defaultRawBitDepth;
- sensorSize = outStreams[0].cfg->size;
+ sensorSize = outStreams_[0].cfg->size;
}
sensorFormat_ = data_->findBestFormat(sensorSize, bitDepth);
@@ -226,12 +228,12 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
}
/* Do any platform specific fixups. */
- status = data_->platformValidate(this, rawStreams, outStreams);
+ status = data_->platformValidate(this);
if (status == Invalid)
return Invalid;
/* Further fixups on the RAW streams. */
- for (auto &raw : rawStreams) {
+ for (auto &raw : rawStreams_) {
StreamConfiguration &cfg = config_.at(raw.index);
V4L2DeviceFormat rawFormat;
@@ -269,7 +271,7 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
}
/* Further fixups on the ISP output streams. */
- for (auto &out : outStreams) {
+ for (auto &out : outStreams_) {
StreamConfiguration &cfg = config_.at(out.index);
PixelFormat &cfgPixFmt = cfg.pixelFormat;
V4L2VideoDevice::Formats fmts = out.dev->formats();
@@ -489,24 +491,6 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config)
for (auto const stream : data->streams_)
stream->clearFlags(StreamFlag::External);
- std::vector<CameraData::StreamParams> rawStreams, ispStreams;
-
- for (unsigned i = 0; i < config->size(); i++) {
- StreamConfiguration *cfg = &config->at(i);
-
- if (isRaw(cfg->pixelFormat))
- rawStreams.emplace_back(i, cfg);
- else
- ispStreams.emplace_back(i, cfg);
- }
-
- /* Sort the streams so the highest resolution is first. */
- std::sort(rawStreams.begin(), rawStreams.end(),
- [](auto &l, auto &r) { return l.cfg->size > r.cfg->size; });
-
- std::sort(ispStreams.begin(), ispStreams.end(),
- [](auto &l, auto &r) { return l.cfg->size > r.cfg->size; });
-
/*
* Apply the format on the sensor with any cached transform.
*
@@ -531,9 +515,9 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config)
/* Use the user requested packing/bit-depth. */
std::optional<BayerFormat::Packing> packing;
- if (!rawStreams.empty()) {
+ if (!rpiConfig->rawStreams_.empty()) {
BayerFormat bayerFormat =
- BayerFormat::fromPixelFormat(rawStreams[0].cfg->pixelFormat);
+ BayerFormat::fromPixelFormat(rpiConfig->rawStreams_[0].cfg->pixelFormat);
packing = bayerFormat.packing;
}
@@ -541,7 +525,7 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config)
* Platform specific internal stream configuration. This also assigns
* external streams which get configured below.
*/
- ret = data->platformConfigure(sensorFormat, packing, rawStreams, ispStreams);
+ ret = data->platformConfigure(sensorFormat, packing, rpiConfig);
if (ret)
return ret;
@@ -57,29 +57,10 @@ public:
{
}
- struct StreamParams {
- StreamParams()
- : index(0), cfg(nullptr), dev(nullptr)
- {
- }
-
- StreamParams(unsigned int index_, StreamConfiguration *cfg_)
- : index(index_), cfg(cfg_), dev(nullptr)
- {
- }
-
- unsigned int index;
- StreamConfiguration *cfg;
- V4L2VideoDevice *dev;
- };
-
- virtual CameraConfiguration::Status platformValidate(RPiCameraConfiguration *rpiConfig,
- std::vector<StreamParams> &rawStreams,
- std::vector<StreamParams> &outStreams) const = 0;
+ virtual CameraConfiguration::Status platformValidate(RPiCameraConfiguration *rpiConfig) const = 0;
virtual int platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
std::optional<BayerFormat::Packing> packing,
- std::vector<StreamParams> &rawStreams,
- std::vector<StreamParams> &outStreams) = 0;
+ const RPiCameraConfiguration *rpiConfig) = 0;
virtual void platformStart() = 0;
virtual void platformStop() = 0;
@@ -270,6 +251,25 @@ public:
/* The sensor format computed in validate() */
V4L2SubdeviceFormat sensorFormat_;
+ struct StreamParams {
+ StreamParams()
+ : index(0), cfg(nullptr), dev(nullptr)
+ {
+ }
+
+ StreamParams(unsigned int index_, StreamConfiguration *cfg_)
+ : index(index_), cfg(cfg_), dev(nullptr)
+ {
+ }
+
+ unsigned int index;
+ StreamConfiguration *cfg;
+ V4L2VideoDevice *dev;
+ };
+
+ std::vector<StreamParams> rawStreams_;
+ std::vector<StreamParams> outStreams_;
+
private:
const CameraData *data_;
@@ -25,6 +25,7 @@ namespace libcamera {
LOG_DECLARE_CATEGORY(RPI)
using StreamFlag = RPi::Stream::StreamFlag;
+using StreamParams = RPi::RPiCameraConfiguration::StreamParams;
namespace {
@@ -65,9 +66,7 @@ public:
{
}
- CameraConfiguration::Status platformValidate(RPi::RPiCameraConfiguration *rpiConfig,
- std::vector<StreamParams> &rawStreams,
- std::vector<StreamParams> &outStreams) const override;
+ CameraConfiguration::Status platformValidate(RPi::RPiCameraConfiguration *rpiConfig) const override;
int platformPipelineConfigure(const std::unique_ptr<YamlObject> &root) override;
@@ -118,8 +117,7 @@ private:
int platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
std::optional<BayerFormat::Packing> packing,
- std::vector<StreamParams> &rawStreams,
- std::vector<StreamParams> &outStreams) override;
+ const RPi::RPiCameraConfiguration *rpiConfig) override;
int platformConfigureIpa(ipa::RPi::ConfigParams ¶ms) override;
int platformInitIpa([[maybe_unused]] ipa::RPi::InitParams ¶ms) override
@@ -395,10 +393,11 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr<RPi::CameraData> &camer
return 0;
}
-CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfiguration *rpiConfig,
- std::vector<StreamParams> &rawStreams,
- std::vector<StreamParams> &outStreams) const
+CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfiguration *rpiConfig) const
{
+ std::vector<StreamParams> &rawStreams = rpiConfig->rawStreams_;
+ std::vector<StreamParams> &outStreams = rpiConfig->outStreams_;
+
CameraConfiguration::Status status = CameraConfiguration::Status::Valid;
/* Can only output 1 RAW stream, or 2 YUV/RGB streams. */
@@ -503,9 +502,10 @@ int Vc4CameraData::platformPipelineConfigure(const std::unique_ptr<YamlObject> &
int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
std::optional<BayerFormat::Packing> packing,
- std::vector<StreamParams> &rawStreams,
- std::vector<StreamParams> &outStreams)
+ const RPi::RPiCameraConfiguration *rpiConfig)
{
+ const std::vector<StreamParams> &rawStreams = rpiConfig->rawStreams_;
+ const std::vector<StreamParams> &outStreams = rpiConfig->outStreams_;
int ret;
if (!packing)