[PATCH v2 6/6] libcamera: camera_sensor: Add support for embedded data
Kieran Bingham
kieran.bingham at ideasonboard.com
Wed Jan 8 00:44:52 CET 2025
Quoting Jacopo Mondi (2024-11-08 10:51:16)
> From: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> Some sensors support producing and transmitting embedded data over a
> stream separate from the image stream. Add support for this feature in
> the CameraSensor interface, and implement it for the CameraSensorRaw
> class. The CameraSensorLegacy uses the default stub implementation, as
> the corresponding kernel drivers don't support embedded data.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Nothing I can particularly comment on in this one so just a :
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> include/libcamera/internal/camera_sensor.h | 5 ++
> src/libcamera/sensor/camera_sensor.cpp | 67 ++++++++++++++++++++
> src/libcamera/sensor/camera_sensor_raw.cpp | 72 ++++++++++++++++++++++
> 3 files changed, 144 insertions(+)
>
> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
> index 8aafd82e6547..61bf1d7ca6de 100644
> --- a/include/libcamera/internal/camera_sensor.h
> +++ b/include/libcamera/internal/camera_sensor.h
> @@ -61,6 +61,11 @@ public:
> Transform transform = Transform::Identity,
> V4L2SubdeviceFormat *sensorFormat = nullptr) = 0;
>
> + virtual V4L2Subdevice::Stream imageStream() const;
> + virtual std::optional<V4L2Subdevice::Stream> embeddedDataStream() const;
> + virtual V4L2SubdeviceFormat embeddedDataFormat() const;
> + virtual int setEmbeddedDataEnabled(bool enable);
> +
> virtual const ControlList &properties() const = 0;
> virtual int sensorInfo(IPACameraSensorInfo *info) const = 0;
> virtual Transform computeTransform(Orientation *orientation) const = 0;
> diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp
> index 54cf98b203fd..1217365b2a55 100644
> --- a/src/libcamera/sensor/camera_sensor.cpp
> +++ b/src/libcamera/sensor/camera_sensor.cpp
> @@ -196,6 +196,73 @@ CameraSensor::~CameraSensor() = default;
> * error code otherwise
> */
>
> +/**
> + * \brief Retrieve the image source stream
> + *
> + * Sensors that produce multiple streams do not guarantee that the image stream
> + * is always assigned number 0. This function allows callers to retrieve the
> + * image stream on the sensor's source pad, in order to configure the receiving
> + * side accordingly.
> + *
> + * \return The image source stream
> + */
> +V4L2Subdevice::Stream CameraSensor::imageStream() const
> +{
> + return { 0, 0 };
> +}
> +
> +/**
> + * \brief Retrieve the embedded data source stream
> + *
> + * Some sensors produce embedded data in a stream separate from the image
> + * stream. This function indicates if the sensor supports this feature by
> + * returning the embedded data stream on the sensor's source pad if available,
> + * or an std::optional<> without a value otheriwse.
> + *
> + * \return The embedded data source stream
> + */
> +std::optional<V4L2Subdevice::Stream> CameraSensor::embeddedDataStream() const
> +{
> + return {};
> +}
> +
> +/**
> + * \brief Retrieve the format on the embedded data stream
> + *
> + * When an embedded data stream is available, this function returns the
> + * corresponding format on the sensor's source pad. The format may vary with
> + * the image stream format, and should therefore be retrieved after configuring
> + * the image stream.
> + *
> + * If the sensor doesn't support embedded data, this function returns a
> + * default-constructed format.
> + *
> + * \return The format on the embedded data stream
> + */
> +V4L2SubdeviceFormat CameraSensor::embeddedDataFormat() const
> +{
> + return {};
> +}
> +
> +/**
> + * \brief Enable or disable the embedded data stream
> + * \param[in] enable True to enable the embedded data stream, false to disable it
> + *
> + * For sensors that support embedded data, this function enables or disables
> + * generation of embedded data. Some of such sensors always produce embedded
> + * data, in which case this function return -EISCONN if the caller attempts to
> + * disable embedded data.
> + *
> + * If the sensor doesn't support embedded data, this function returns 0 when \a
> + * enable is false, and -ENOSTR otherwise.
> + *
> + * \return 0 on success, or a negative error code otherwise
> + */
> +int CameraSensor::setEmbeddedDataEnabled(bool enable)
> +{
> + return enable ? -ENOSTR : 0;
> +}
> +
> /**
> * \fn CameraSensor::properties()
> * \brief Retrieve the camera sensor properties
> diff --git a/src/libcamera/sensor/camera_sensor_raw.cpp b/src/libcamera/sensor/camera_sensor_raw.cpp
> index 4c653121d547..9380ec7129f6 100644
> --- a/src/libcamera/sensor/camera_sensor_raw.cpp
> +++ b/src/libcamera/sensor/camera_sensor_raw.cpp
> @@ -84,6 +84,11 @@ public:
> Transform transform = Transform::Identity,
> V4L2SubdeviceFormat *sensorFormat = nullptr) override;
>
> + V4L2Subdevice::Stream imageStream() const override;
> + std::optional<V4L2Subdevice::Stream> embeddedDataStream() const override;
> + V4L2SubdeviceFormat embeddedDataFormat() const override;
> + int setEmbeddedDataEnabled(bool enable) override;
> +
> const ControlList &properties() const override { return properties_; }
> int sensorInfo(IPACameraSensorInfo *info) const override;
> Transform computeTransform(Orientation *orientation) const override;
> @@ -878,6 +883,73 @@ int CameraSensorRaw::applyConfiguration(const SensorConfiguration &config,
> return 0;
> }
>
> +V4L2Subdevice::Stream CameraSensorRaw::imageStream() const
> +{
> + return streams_.image.source;
> +}
> +
> +std::optional<V4L2Subdevice::Stream> CameraSensorRaw::embeddedDataStream() const
> +{
> + if (!streams_.edata)
> + return {};
> +
> + return { streams_.edata->source };
> +}
> +
> +V4L2SubdeviceFormat CameraSensorRaw::embeddedDataFormat() const
> +{
> + if (!streams_.edata)
> + return {};
> +
> + V4L2SubdeviceFormat format;
> + int ret = subdev_->getFormat(streams_.edata->source, &format);
> + if (ret)
> + return {};
> +
> + return format;
> +}
> +
> +int CameraSensorRaw::setEmbeddedDataEnabled(bool enable)
> +{
> + if (!streams_.edata)
> + return enable ? -ENOSTR : 0;
> +
> + V4L2Subdevice::Routing routing{ 2 };
> +
> + routing[0].sink = streams_.image.sink;
> + routing[0].source = streams_.image.source;
> + routing[0].flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE;
> +
> + routing[1].sink = streams_.edata->sink;
> + routing[1].source = streams_.edata->source;
> + routing[1].flags = enable ? V4L2_SUBDEV_ROUTE_FL_ACTIVE : 0;
> +
> + int ret = subdev_->setRouting(&routing);
> + if (ret)
> + return ret;
> +
> + /*
> + * Check if the embedded data stream has been enabled or disabled
> + * correctly. Assume at least one route will match the embedded data
> + * source stream, as there would be something seriously wrong
> + * otherwise.
> + */
> + bool enabled = false;
> +
> + for (const V4L2Subdevice::Route &route : routing) {
> + if (route.source != streams_.edata->source)
> + continue;
> +
> + enabled = route.flags & V4L2_SUBDEV_ROUTE_FL_ACTIVE;
> + break;
> + }
> +
> + if (enabled != enable)
> + return enabled ? -EISCONN : -ENOSTR;
> +
> + return 0;
> +}
> +
> int CameraSensorRaw::sensorInfo(IPACameraSensorInfo *info) const
> {
> info->model = model();
> --
> 2.47.0
>
More information about the libcamera-devel
mailing list