libcamera: v4l2_controls: Use the ControlValue class for data storage

Use the ControlValue class to replace the manually crafted data storage
in V4L2Control. This will help sharing code when more data types will be
supported.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-09-28 05:16:26 +03:00
parent ace50f75a4
commit 186ae04c0c
5 changed files with 25 additions and 21 deletions

View file

@ -16,6 +16,8 @@
#include <linux/v4l2-controls.h>
#include <linux/videodev2.h>
#include <libcamera/controls.h>
namespace libcamera {
class V4L2ControlInfo
@ -46,17 +48,18 @@ using V4L2ControlInfoMap = std::map<unsigned int, V4L2ControlInfo>;
class V4L2Control
{
public:
V4L2Control(unsigned int id, int value = 0)
: id_(id), value_(value) {}
int64_t value() const { return value_; }
void setValue(int64_t value) { value_ = value; }
V4L2Control(unsigned int id, const ControlValue &value = ControlValue())
: id_(id), value_(value)
{
}
unsigned int id() const { return id_; }
const ControlValue &value() const { return value_; }
ControlValue &value() { return value_; }
private:
unsigned int id_;
int64_t value_;
ControlValue value_;
};
class V4L2ControlList

View file

@ -252,7 +252,7 @@ int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)
LOG(UVC, Debug)
<< "Setting control 0x"
<< std::hex << std::setw(8) << ctrl.id() << std::dec
<< " to " << ctrl.value();
<< " to " << ctrl.value().toString();
int ret = data->video_->setControls(&controls);
if (ret) {

View file

@ -300,7 +300,7 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)
LOG(VIMC, Debug)
<< "Setting control 0x"
<< std::hex << std::setw(8) << ctrl.id() << std::dec
<< " to " << ctrl.value();
<< " to " << ctrl.value().toString();
int ret = data->sensor_->setControls(&controls);
if (ret) {

View file

@ -143,6 +143,16 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
* \param value The control value
*/
/**
* \fn V4L2Control::value() const
* \brief Retrieve the value of the control
*
* This method is a const version of V4L2Control::value(), returning a const
* reference to the value.
*
* \return The V4L2 control value
*/
/**
* \fn V4L2Control::value()
* \brief Retrieve the value of the control
@ -154,15 +164,6 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
* \return The V4L2 control value
*/
/**
* \fn V4L2Control::setValue()
* \brief Set the value of the control
* \param value The new V4L2 control value
*
* This method stores the control value, which will be applied to the
* device when calling V4L2Device::setControls().
*/
/**
* \fn V4L2Control::id()
* \brief Retrieve the control ID this instance refers to

View file

@ -264,14 +264,14 @@ int V4L2Device::setControls(V4L2ControlList *ctrls)
/* Set the v4l2_ext_control value for the write operation. */
switch (info->type()) {
case V4L2_CTRL_TYPE_INTEGER64:
v4l2Ctrls[i].value64 = ctrl->value();
v4l2Ctrls[i].value64 = ctrl->value().get<int64_t>();
break;
default:
/*
* \todo To be changed when support for string and
* compound controls will be added.
*/
v4l2Ctrls[i].value = ctrl->value();
v4l2Ctrls[i].value = ctrl->value().get<int32_t>();
break;
}
}
@ -393,14 +393,14 @@ void V4L2Device::updateControls(V4L2ControlList *ctrls,
switch (info->type()) {
case V4L2_CTRL_TYPE_INTEGER64:
ctrl->setValue(v4l2Ctrl->value64);
ctrl->value().set<int64_t>(v4l2Ctrl->value64);
break;
default:
/*
* \todo To be changed when support for string and
* compound controls will be added.
*/
ctrl->setValue(v4l2Ctrl->value);
ctrl->value().set<int32_t>(v4l2Ctrl->value);
break;
}
}