libcamera: v4l2_controls: Move V4L2ControlId out of V4L2ControlInfo

In order to reconcile the libcamera and V4L2 control info maps, we need
to move the V4L2ControlId embedded in V4L2ControlInfo map out of the
class. Store the V4L2ControlId instances in the V4L2Device that creates
them, and only reference them from V4L2ControlInfo.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Jacopo Mondi 2019-10-12 11:35:51 +02:00 committed by Laurent Pinchart
parent 35e6319b35
commit 75e7452fc5
4 changed files with 13 additions and 7 deletions

View file

@ -28,13 +28,14 @@ public:
class V4L2ControlInfo
{
public:
V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl);
V4L2ControlInfo(const V4L2ControlId &id,
const struct v4l2_query_ext_ctrl &ctrl);
const ControlId &id() const { return id_; }
const ControlId &id() const { return *id_; }
const ControlRange &range() const { return range_; }
private:
V4L2ControlId id_;
const V4L2ControlId *id_;
ControlRange range_;
};

View file

@ -8,7 +8,8 @@
#define __LIBCAMERA_V4L2_DEVICE_H__
#include <map>
#include <string>
#include <memory>
#include <vector>
#include <linux/videodev2.h>
@ -48,6 +49,7 @@ private:
const struct v4l2_ext_control *v4l2Ctrls,
unsigned int count);
std::vector<std::unique_ptr<V4L2ControlId>> controlIds_;
V4L2ControlInfoMap controls_;
std::string deviceNode_;
int fd_;

View file

@ -122,10 +122,12 @@ V4L2ControlId::V4L2ControlId(const struct v4l2_query_ext_ctrl &ctrl)
/**
* \brief Construct a V4L2ControlInfo from a struct v4l2_query_ext_ctrl
* \param[in] id The V4L2 control ID
* \param[in] ctrl The struct v4l2_query_ext_ctrl as returned by the kernel
*/
V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
: id_(ctrl)
V4L2ControlInfo::V4L2ControlInfo(const V4L2ControlId &id,
const struct v4l2_query_ext_ctrl &ctrl)
: id_(&id)
{
if (ctrl.type == V4L2_CTRL_TYPE_INTEGER64)
range_ = ControlRange(static_cast<int64_t>(ctrl.minimum),

View file

@ -386,9 +386,10 @@ void V4L2Device::listControls()
continue;
}
controlIds_.emplace_back(utils::make_unique<V4L2ControlId>(ctrl));
ctrls.emplace(std::piecewise_construct,
std::forward_as_tuple(ctrl.id),
std::forward_as_tuple(ctrl));
std::forward_as_tuple(*controlIds_.back().get(), ctrl));
}
controls_ = std::move(ctrls);