[libcamera-devel] [PATCH v1.1 3/3] libcamera: camera_sensor: Prepare for multi-subdev camera sensors
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sun May 3 03:31:08 CEST 2020
Hi Laurent,
Thanks for your patch.
On 2020-05-03 01:45:40 +0300, Laurent Pinchart wrote:
> While most camera sensors are exposed to userspace as a single subdev,
> this is not always the case. A notable exception is the smiapp driver,
> which exposes two or three subdevs. The subdev at the output of the
> camera sensor will thus have more than one pad. Prepare for this by
> removing the single-pad restriction, and locating the source pad
> dynamically.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
:-O
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> Changes since v1:
>
> - Correctly test pad direction in init()
> ---
> src/libcamera/camera_sensor.cpp | 23 ++++++++++++++---------
> src/libcamera/include/camera_sensor.h | 2 ++
> 2 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index d6a823f4d7cd..4154700a19b5 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -131,7 +131,7 @@ LOG_DEFINE_CATEGORY(CameraSensor);
> * Once constructed the instance must be initialized with init().
> */
> CameraSensor::CameraSensor(const MediaEntity *entity)
> - : entity_(entity), properties_(properties::properties)
> + : entity_(entity), pad_(UINT_MAX), properties_(properties::properties)
> {
> }
>
> @@ -152,9 +152,14 @@ CameraSensor::~CameraSensor()
> */
> int CameraSensor::init()
> {
> - int ret;
> + for (const MediaPad *pad : entity_->pads()) {
> + if (pad->flags() & MEDIA_PAD_FL_SOURCE) {
> + pad_ = pad->index();
> + break;
> + }
> + }
>
> - if (entity_->pads().size() != 1) {
> + if (pad_ == UINT_MAX) {
> LOG(CameraSensor, Error)
> << "Sensors with more than one pad are not supported";
> return -EINVAL;
> @@ -197,7 +202,7 @@ int CameraSensor::init()
>
> /* Create and open the subdev. */
> subdev_ = std::make_unique<V4L2Subdevice>(entity_);
> - ret = subdev_->open();
> + int ret = subdev_->open();
> if (ret < 0)
> return ret;
>
> @@ -241,7 +246,7 @@ int CameraSensor::init()
> properties_.set(properties::Rotation, propertyValue);
>
> /* Enumerate and cache media bus codes and sizes. */
> - const ImageFormats formats = subdev_->formats(0);
> + const ImageFormats formats = subdev_->formats(pad_);
> if (formats.isEmpty()) {
> LOG(CameraSensor, Error) << "No image format found";
> return -EINVAL;
> @@ -405,7 +410,7 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
> */
> int CameraSensor::setFormat(V4L2SubdeviceFormat *format)
> {
> - return subdev_->setFormat(0, format);
> + return subdev_->setFormat(pad_, format);
> }
>
> /**
> @@ -489,7 +494,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
>
> /* Get the active area size. */
> Rectangle rect = {};
> - int ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
> + int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
> if (ret) {
> LOG(CameraSensor, Error)
> << "Failed to construct camera sensor info: "
> @@ -500,7 +505,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
> info->activeAreaSize = { rect.width, rect.height };
>
> /* It's mandatory for the subdevice to report its crop rectangle. */
> - ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP, &info->analogCrop);
> + ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &info->analogCrop);
> if (ret) {
> LOG(CameraSensor, Error)
> << "Failed to construct camera sensor info: "
> @@ -510,7 +515,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
>
> /* The bit depth and image size depend on the currently applied format. */
> V4L2SubdeviceFormat format{};
> - ret = subdev_->getFormat(0, &format);
> + ret = subdev_->getFormat(pad_, &format);
> if (ret)
> return ret;
> info->bitsPerPixel = format.bitsPerPixel();
> diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
> index 92cd90353e72..24993b74148f 100644
> --- a/src/libcamera/include/camera_sensor.h
> +++ b/src/libcamera/include/camera_sensor.h
> @@ -70,6 +70,8 @@ protected:
> private:
> const MediaEntity *entity_;
> std::unique_ptr<V4L2Subdevice> subdev_;
> + unsigned int pad_;
> +
> std::string model_;
>
> std::vector<unsigned int> mbusCodes_;
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list