libcamera: controls: Use explicit 32-bit integer types

Make the control API more explicit when dealing with integer controls by
specifying the size. We already do so for 64-bit integers, using int64_t
and ControlTypeInteger64, do the same for 32-bit integers.

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 00:27:33 +03:00
parent 224ef9776a
commit dd37ef784e
7 changed files with 46 additions and 44 deletions

View file

@ -21,7 +21,7 @@ class Camera;
enum ControlType {
ControlTypeNone,
ControlTypeBool,
ControlTypeInteger,
ControlTypeInteger32,
ControlTypeInteger64,
};
@ -30,7 +30,7 @@ class ControlValue
public:
ControlValue();
ControlValue(bool value);
ControlValue(int value);
ControlValue(int32_t value);
ControlValue(int64_t value);
ControlType type() const { return type_; };
@ -48,7 +48,7 @@ private:
union {
bool bool_;
int integer_;
int32_t integer32_;
int64_t integer64_;
};
};

View file

@ -31,8 +31,8 @@ LOG_DEFINE_CATEGORY(Controls)
* Invalid type, for empty values
* \var ControlTypeBool
* The control stores a boolean value
* \var ControlTypeInteger
* The control stores an integer value
* \var ControlTypeInteger32
* The control stores a 32-bit integer value
* \var ControlTypeInteger64
* The control stores a 64-bit integer value
*/
@ -63,8 +63,8 @@ ControlValue::ControlValue(bool value)
* \brief Construct an integer ControlValue
* \param[in] value Integer value to store
*/
ControlValue::ControlValue(int value)
: type_(ControlTypeInteger), integer_(value)
ControlValue::ControlValue(int32_t value)
: type_(ControlTypeInteger32), integer32_(value)
{
}
@ -115,17 +115,17 @@ const bool &ControlValue::get<bool>() const
}
template<>
const int &ControlValue::get<int>() const
const int32_t &ControlValue::get<int32_t>() const
{
ASSERT(type_ == ControlTypeInteger || type_ == ControlTypeInteger64);
ASSERT(type_ == ControlTypeInteger32 || type_ == ControlTypeInteger64);
return integer_;
return integer32_;
}
template<>
const int64_t &ControlValue::get<int64_t>() const
{
ASSERT(type_ == ControlTypeInteger || type_ == ControlTypeInteger64);
ASSERT(type_ == ControlTypeInteger32 || type_ == ControlTypeInteger64);
return integer64_;
}
@ -138,10 +138,10 @@ void ControlValue::set<bool>(const bool &value)
}
template<>
void ControlValue::set<int>(const int &value)
void ControlValue::set<int32_t>(const int32_t &value)
{
type_ = ControlTypeInteger;
integer_ = value;
type_ = ControlTypeInteger32;
integer32_ = value;
}
template<>
@ -163,8 +163,8 @@ std::string ControlValue::toString() const
return "<None>";
case ControlTypeBool:
return bool_ ? "True" : "False";
case ControlTypeInteger:
return std::to_string(integer_);
case ControlTypeInteger32:
return std::to_string(integer32_);
case ControlTypeInteger64:
return std::to_string(integer64_);
}
@ -186,35 +186,35 @@ std::string ControlValue::toString() const
/**
* \var Brightness
* ControlType: Integer
* ControlType: Integer32
*
* Specify a fixed brightness parameter.
*/
/**
* \var Contrast
* ControlType: Integer
* ControlType: Integer32
*
* Specify a fixed contrast parameter.
*/
/**
* \var Saturation
* ControlType: Integer
* ControlType: Integer32
*
* Specify a fixed saturation parameter.
*/
/**
* \var ManualExposure
* ControlType: Integer
* ControlType: Integer32
*
* Specify a fixed exposure time in milli-seconds
*/
/**
* \var ManualGain
* ControlType: Integer
* ControlType: Integer32
*
* Specify a fixed gain parameter
*/

View file

@ -235,24 +235,24 @@ int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)
switch (ci->id()) {
case Brightness:
controls.add(V4L2_CID_BRIGHTNESS, value.get<int>());
controls.add(V4L2_CID_BRIGHTNESS, value.get<int32_t>());
break;
case Contrast:
controls.add(V4L2_CID_CONTRAST, value.get<int>());
controls.add(V4L2_CID_CONTRAST, value.get<int32_t>());
break;
case Saturation:
controls.add(V4L2_CID_SATURATION, value.get<int>());
controls.add(V4L2_CID_SATURATION, value.get<int32_t>());
break;
case ManualExposure:
controls.add(V4L2_CID_EXPOSURE_AUTO, 1);
controls.add(V4L2_CID_EXPOSURE_ABSOLUTE, value.get<int>());
controls.add(V4L2_CID_EXPOSURE_ABSOLUTE, value.get<int32_t>());
break;
case ManualGain:
controls.add(V4L2_CID_GAIN, value.get<int>());
controls.add(V4L2_CID_GAIN, value.get<int32_t>());
break;
default:

View file

@ -288,15 +288,15 @@ int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)
switch (ci->id()) {
case Brightness:
controls.add(V4L2_CID_BRIGHTNESS, value.get<int>());
controls.add(V4L2_CID_BRIGHTNESS, value.get<int32_t>());
break;
case Contrast:
controls.add(V4L2_CID_CONTRAST, value.get<int>());
controls.add(V4L2_CID_CONTRAST, value.get<int32_t>());
break;
case Saturation:
controls.add(V4L2_CID_SATURATION, value.get<int>());
controls.add(V4L2_CID_SATURATION, value.get<int32_t>());
break;
default:

View file

@ -26,13 +26,14 @@ protected:
ControlInfo info(Brightness);
if (info.id() != Brightness ||
info.type() != ControlTypeInteger ||
info.type() != ControlTypeInteger32 ||
info.name() != std::string("Brightness")) {
cout << "Invalid control identification for Brightness" << endl;
return TestFail;
}
if (info.min().get<int>() != 0 || info.max().get<int>() != 0) {
if (info.min().get<int32_t>() != 0 ||
info.max().get<int32_t>() != 0) {
cout << "Invalid control range for Brightness" << endl;
return TestFail;
}
@ -44,13 +45,14 @@ protected:
info = ControlInfo(Contrast, 10, 200);
if (info.id() != Contrast ||
info.type() != ControlTypeInteger ||
info.type() != ControlTypeInteger32 ||
info.name() != std::string("Contrast")) {
cout << "Invalid control identification for Contrast" << endl;
return TestFail;
}
if (info.min().get<int>() != 10 || info.max().get<int>() != 200) {
if (info.min().get<int32_t>() != 10 ||
info.max().get<int32_t>() != 200) {
cout << "Invalid control range for Contrast" << endl;
return TestFail;
}

View file

@ -96,7 +96,7 @@ protected:
return TestFail;
}
if (list[Brightness].get<int>() != 255) {
if (list[Brightness].get<int32_t>() != 255) {
cout << "Incorrest Brightness control value" << endl;
return TestFail;
}
@ -125,8 +125,8 @@ protected:
/*
* Test control value retrieval and update through ControlInfo.
*/
if (list[brightness].get<int>() != 64 ||
list[contrast].get<int>() != 128) {
if (list[brightness].get<int32_t>() != 64 ||
list[contrast].get<int32_t>() != 128) {
cout << "Failed to retrieve control value" << endl;
return TestFail;
}
@ -134,8 +134,8 @@ protected:
list[brightness] = 10;
list[contrast] = 20;
if (list[brightness].get<int>() != 10 ||
list[contrast].get<int>() != 20) {
if (list[brightness].get<int32_t>() != 10 ||
list[contrast].get<int32_t>() != 20) {
cout << "Failed to update control value" << endl;
return TestFail;
}
@ -185,9 +185,9 @@ protected:
return TestFail;
}
if (newList[Brightness].get<int>() != 10 ||
newList[Contrast].get<int>() != 20 ||
newList[Saturation].get<int>() != 255) {
if (newList[Brightness].get<int32_t>() != 10 ||
newList[Contrast].get<int32_t>() != 20 ||
newList[Saturation].get<int32_t>() != 255) {
cout << "New list contains incorrect values" << endl;
return TestFail;
}

View file

@ -27,7 +27,7 @@ protected:
<< " Bool: " << boolean.toString()
<< endl;
if (integer.get<int>() != 1234) {
if (integer.get<int32_t>() != 1234) {
cerr << "Failed to get Integer" << endl;
return TestFail;
}
@ -56,8 +56,8 @@ protected:
return TestFail;
}
value.set<int>(10);
if (value.get<int>() != 10) {
value.set<int32_t>(10);
if (value.get<int32_t>() != 10) {
cerr << "Failed to get Integer" << endl;
return TestFail;
}