diff options
author | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2020-05-27 02:16:01 +0200 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2020-06-26 13:32:29 +0200 |
commit | d2c94456d98126ab1aa4c7672b86226c50cb869f (patch) | |
tree | 40c8fff9294b5ce7b3a87cac362ff7c140b4c203 /src/libcamera/pipeline/ipu3/ipu3.cpp | |
parent | 906ff25ef8da8d73890a353662731831fd8fe9e9 (diff) |
libcamera: ipu3: cio2: Add function to generate configuration
Collect the code used to generate configurations for the CIO2 block in
the CIO2Device class. This allows simplifying the code and allow further
changes to only happen at one code location.
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/pipeline/ipu3/ipu3.cpp')
-rw-r--r-- | src/libcamera/pipeline/ipu3/ipu3.cpp | 56 |
1 files changed, 14 insertions, 42 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 6e5eb560..c0e727e5 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -36,13 +36,6 @@ LOG_DEFINE_CATEGORY(IPU3) class IPU3CameraData; -static const std::map<uint32_t, PixelFormat> sensorMbusToPixel = { - { MEDIA_BUS_FMT_SBGGR10_1X10, formats::SBGGR10_IPU3 }, - { MEDIA_BUS_FMT_SGBRG10_1X10, formats::SGBRG10_IPU3 }, - { MEDIA_BUS_FMT_SGRBG10_1X10, formats::SGRBG10_IPU3 }, - { MEDIA_BUS_FMT_SRGGB10_1X10, formats::SRGGB10_IPU3 }, -}; - class ImgUDevice { public: @@ -147,7 +140,7 @@ public: Status validate() override; - const V4L2SubdeviceFormat &sensorFormat() { return sensorFormat_; } + const StreamConfiguration &cio2Format() const { return cio2Configuration_; }; const std::vector<const IPU3Stream *> &streams() { return streams_; } private: @@ -165,7 +158,7 @@ private: std::shared_ptr<Camera> camera_; const IPU3CameraData *data_; - V4L2SubdeviceFormat sensorFormat_; + StreamConfiguration cio2Configuration_; std::vector<const IPU3Stream *> streams_; }; @@ -252,7 +245,7 @@ void IPU3CameraConfiguration::assignStreams() if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW) stream = &data_->rawStream_; - else if (cfg.size == sensorFormat_.size) + else if (cfg.size == cio2Configuration_.size) stream = &data_->outStream_; else stream = &data_->vfStream_; @@ -277,8 +270,8 @@ void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale) */ if (!cfg.size.width || !cfg.size.height) { cfg.size.width = 1280; - cfg.size.height = 1280 * sensorFormat_.size.height - / sensorFormat_.size.width; + cfg.size.height = 1280 * cio2Configuration_.size.height + / cio2Configuration_.size.width; } /* @@ -297,7 +290,7 @@ void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale) * \todo: Properly support cropping when the ImgU driver * interface will be cleaned up. */ - cfg.size = sensorFormat_.size; + cfg.size = cio2Configuration_.size; } /* @@ -313,7 +306,6 @@ void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale) CameraConfiguration::Status IPU3CameraConfiguration::validate() { - const CameraSensor *sensor = data_->cio2_.sensor_; Status status = Valid; if (config_.empty()) @@ -340,16 +332,10 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate() size.height = cfg.size.height; } - if (!size.width || !size.height) - size = sensor->resolution(); - - sensorFormat_ = sensor->getFormat({ MEDIA_BUS_FMT_SBGGR10_1X10, - MEDIA_BUS_FMT_SGBRG10_1X10, - MEDIA_BUS_FMT_SGRBG10_1X10, - MEDIA_BUS_FMT_SRGGB10_1X10 }, - size); - if (!sensorFormat_.size.width || !sensorFormat_.size.height) - sensorFormat_.size = sensor->resolution(); + /* Generate raw configuration from CIO2. */ + cio2Configuration_ = data_->cio2_.generateConfiguration(size); + if (!cio2Configuration_.pixelFormat.isValid()) + return Invalid; /* Assign streams to each configuration entry. */ assignStreams(); @@ -361,20 +347,13 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate() const IPU3Stream *stream = streams_[i]; if (stream->raw_) { - const auto &itFormat = - sensorMbusToPixel.find(sensorFormat_.mbus_code); - if (itFormat == sensorMbusToPixel.end()) - return Invalid; - - cfg.pixelFormat = itFormat->second; - cfg.size = sensorFormat_.size; + cfg = cio2Configuration_; } else { bool scale = stream == &data_->vfStream_; adjustStream(config_[i], scale); + cfg.bufferCount = IPU3_BUFFER_COUNT; } - cfg.bufferCount = IPU3_BUFFER_COUNT; - if (cfg.pixelFormat != oldCfg.pixelFormat || cfg.size != oldCfg.size) { LOG(IPU3, Debug) @@ -454,14 +433,7 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera, cfg.size = data->cio2_.sensor_->resolution(); - V4L2SubdeviceFormat sensorFormat = - data->cio2_.sensor_->getFormat({ MEDIA_BUS_FMT_SBGGR10_1X10, - MEDIA_BUS_FMT_SGBRG10_1X10, - MEDIA_BUS_FMT_SGRBG10_1X10, - MEDIA_BUS_FMT_SRGGB10_1X10 }, - cfg.size); - cfg.pixelFormat = - sensorMbusToPixel.at(sensorFormat.mbus_code); + cfg = data->cio2_.generateConfiguration(cfg.size); break; } @@ -575,7 +547,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c) * Pass the requested stream size to the CIO2 unit and get back the * adjusted format to be propagated to the ImgU output devices. */ - const Size &sensorSize = config->sensorFormat().size; + const Size &sensorSize = config->cio2Format().size; V4L2DeviceFormat cio2Format = {}; ret = cio2->configure(sensorSize, &cio2Format); if (ret) |