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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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