summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libcamera/camera_sensor.cpp23
-rw-r--r--src/libcamera/include/camera_sensor.h2
2 files changed, 16 insertions, 9 deletions
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index d6a823f4..4154700a 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -131,7 +131,7 @@ LOG_DEFINE_CATEGORY(CameraSensor);
* Once constructed the instance must be initialized with init().
*/
CameraSensor::CameraSensor(const MediaEntity *entity)
- : entity_(entity), properties_(properties::properties)
+ : entity_(entity), pad_(UINT_MAX), properties_(properties::properties)
{
}
@@ -152,9 +152,14 @@ CameraSensor::~CameraSensor()
*/
int CameraSensor::init()
{
- int ret;
+ for (const MediaPad *pad : entity_->pads()) {
+ if (pad->flags() & MEDIA_PAD_FL_SOURCE) {
+ pad_ = pad->index();
+ break;
+ }
+ }
- if (entity_->pads().size() != 1) {
+ if (pad_ == UINT_MAX) {
LOG(CameraSensor, Error)
<< "Sensors with more than one pad are not supported";
return -EINVAL;
@@ -197,7 +202,7 @@ int CameraSensor::init()
/* Create and open the subdev. */
subdev_ = std::make_unique<V4L2Subdevice>(entity_);
- ret = subdev_->open();
+ int ret = subdev_->open();
if (ret < 0)
return ret;
@@ -241,7 +246,7 @@ int CameraSensor::init()
properties_.set(properties::Rotation, propertyValue);
/* Enumerate and cache media bus codes and sizes. */
- const ImageFormats formats = subdev_->formats(0);
+ const ImageFormats formats = subdev_->formats(pad_);
if (formats.isEmpty()) {
LOG(CameraSensor, Error) << "No image format found";
return -EINVAL;
@@ -405,7 +410,7 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
*/
int CameraSensor::setFormat(V4L2SubdeviceFormat *format)
{
- return subdev_->setFormat(0, format);
+ return subdev_->setFormat(pad_, format);
}
/**
@@ -489,7 +494,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
/* Get the active area size. */
Rectangle rect = {};
- int ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
+ int ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP_DEFAULT, &rect);
if (ret) {
LOG(CameraSensor, Error)
<< "Failed to construct camera sensor info: "
@@ -500,7 +505,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
info->activeAreaSize = { rect.width, rect.height };
/* It's mandatory for the subdevice to report its crop rectangle. */
- ret = subdev_->getSelection(0, V4L2_SEL_TGT_CROP, &info->analogCrop);
+ ret = subdev_->getSelection(pad_, V4L2_SEL_TGT_CROP, &info->analogCrop);
if (ret) {
LOG(CameraSensor, Error)
<< "Failed to construct camera sensor info: "
@@ -510,7 +515,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
/* The bit depth and image size depend on the currently applied format. */
V4L2SubdeviceFormat format{};
- ret = subdev_->getFormat(0, &format);
+ ret = subdev_->getFormat(pad_, &format);
if (ret)
return ret;
info->bitsPerPixel = format.bitsPerPixel();
diff --git a/src/libcamera/include/camera_sensor.h b/src/libcamera/include/camera_sensor.h
index 92cd9035..24993b74 100644
--- a/src/libcamera/include/camera_sensor.h
+++ b/src/libcamera/include/camera_sensor.h
@@ -70,6 +70,8 @@ protected:
private:
const MediaEntity *entity_;
std::unique_ptr<V4L2Subdevice> subdev_;
+ unsigned int pad_;
+
std::string model_;
std::vector<unsigned int> mbusCodes_;