summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libcamera/camera_sensor.cpp49
-rw-r--r--src/libcamera/include/camera_sensor.h7
2 files changed, 53 insertions, 3 deletions
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 86f0c772..2219a430 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -13,6 +13,8 @@
#include <limits.h>
#include <math.h>
+#include <libcamera/property_ids.h>
+
#include "formats.h"
#include "utils.h"
#include "v4l2_subdevice.h"
@@ -47,7 +49,7 @@ LOG_DEFINE_CATEGORY(CameraSensor);
* Once constructed the instance must be initialized with init().
*/
CameraSensor::CameraSensor(const MediaEntity *entity)
- : entity_(entity)
+ : entity_(entity), properties_(properties::properties)
{
subdev_ = new V4L2Subdevice(entity);
}
@@ -89,6 +91,45 @@ int CameraSensor::init()
if (ret < 0)
return ret;
+ /* Retrieve and store the camera sensor properties. */
+ const ControlInfoMap &controls = subdev_->controls();
+ int32_t propertyValue;
+
+ /* Camera Location: default is front location. */
+ const auto &locationControl = controls.find(V4L2_CID_CAMERA_SENSOR_LOCATION);
+ if (locationControl != controls.end()) {
+ int32_t v4l2Location =
+ locationControl->second.def().get<int32_t>();
+
+ switch (v4l2Location) {
+ default:
+ LOG(CameraSensor, Warning)
+ << "Unsupported camera location "
+ << v4l2Location << ", setting to Front";
+ /* Fall-through */
+ case V4L2_LOCATION_FRONT:
+ propertyValue = properties::CameraLocationFront;
+ break;
+ case V4L2_LOCATION_BACK:
+ propertyValue = properties::CameraLocationBack;
+ break;
+ case V4L2_LOCATION_EXTERNAL:
+ propertyValue = properties::CameraLocationExternal;
+ break;
+ }
+ } else {
+ propertyValue = properties::CameraLocationFront;
+ }
+ properties_.set(properties::Location, propertyValue);
+
+ /* Camera Rotation: default is 0 degrees. */
+ const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION);
+ if (rotationControl != controls.end())
+ propertyValue = rotationControl->second.def().get<int32_t>();
+ else
+ propertyValue = 0;
+ properties_.set(properties::Rotation, propertyValue);
+
/* Enumerate and cache media bus codes and sizes. */
const ImageFormats formats = subdev_->formats(0);
if (formats.isEmpty()) {
@@ -285,6 +326,12 @@ int CameraSensor::getControls(ControlList *ctrls)
}
/**
+ * \fn CameraSensor::properties()
+ * \brief Retrieve the camera sensor properties
+ * \return The list of camera sensor properties
+ */
+
+/**
* \brief Write controls to the sensor
* \param[in] ctrls The list of controls to write
*
diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
index 1fb36a4f..99cff981 100644
--- a/src/libcamera/include/camera_sensor.h
+++ b/src/libcamera/include/camera_sensor.h
@@ -10,14 +10,13 @@
#include <string>
#include <vector>
+#include <libcamera/controls.h>
#include <libcamera/geometry.h>
#include "log.h"
namespace libcamera {
-class ControlInfoMap;
-class ControlList;
class MediaEntity;
class V4L2Subdevice;
@@ -47,6 +46,8 @@ public:
int getControls(ControlList *ctrls);
int setControls(ControlList *ctrls);
+ const ControlList &properties() const { return properties_; }
+
protected:
std::string logPrefix() const;
@@ -56,6 +57,8 @@ private:
std::vector<unsigned int> mbusCodes_;
std::vector<Size> sizes_;
+
+ ControlList properties_;
};
} /* namespace libcamera */