summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libcamera/internal/camera_sensor.h6
-rw-r--r--include/libcamera/internal/v4l2_subdevice.h2
-rw-r--r--src/libcamera/camera_sensor.cpp12
-rw-r--r--src/libcamera/pipeline/ipu3/cio2.cpp3
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp11
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1.cpp6
-rw-r--r--src/libcamera/v4l2_subdevice.cpp7
7 files changed, 19 insertions, 28 deletions
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index bea52bad..928c61af 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -17,6 +17,7 @@
#include <libcamera/control_ids.h>
#include <libcamera/controls.h>
#include <libcamera/geometry.h>
+#include <libcamera/transform.h>
#include <libcamera/ipa/core_ipa_interface.h>
@@ -29,8 +30,6 @@ class BayerFormat;
class CameraLens;
class MediaEntity;
-enum class Transform;
-
struct CameraSensorProperties;
class CameraSensor : protected Loggable
@@ -55,7 +54,8 @@ public:
V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes,
const Size &size) const;
- int setFormat(V4L2SubdeviceFormat *format);
+ int setFormat(V4L2SubdeviceFormat *format,
+ Transform transform = Transform::Identity);
const ControlInfoMap &controls() const;
ControlList getControls(const std::vector<uint32_t> &ids);
diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
index 576faf97..69862de0 100644
--- a/include/libcamera/internal/v4l2_subdevice.h
+++ b/include/libcamera/internal/v4l2_subdevice.h
@@ -20,7 +20,6 @@
#include <libcamera/color_space.h>
#include <libcamera/geometry.h>
-#include <libcamera/transform.h>
#include "libcamera/internal/formats.h"
#include "libcamera/internal/media_object.h"
@@ -45,7 +44,6 @@ struct V4L2SubdeviceFormat {
uint32_t mbus_code;
Size size;
std::optional<ColorSpace> colorSpace;
- Transform transform = Transform::Identity;
const std::string toString() const;
uint8_t bitsPerPixel() const;
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 274ed419..e442b89d 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -16,7 +16,6 @@
#include <string.h>
#include <libcamera/property_ids.h>
-#include <libcamera/transform.h>
#include <libcamera/base/utils.h>
@@ -751,7 +750,6 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
.mbus_code = bestCode,
.size = *bestSize,
.colorSpace = ColorSpace::Raw,
- .transform = Transform::Identity,
};
return format;
@@ -760,6 +758,8 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
/**
* \brief Set the sensor output format
* \param[in] format The desired sensor output format
+ * \param[in] transform The transform to be applied on the sensor.
+ * Defaults to Identity.
*
* If flips are writable they are configured according to the desired Transform.
* Transform::Identity always corresponds to H/V flip being disabled if the
@@ -770,18 +770,16 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
*
* \return 0 on success or a negative error code otherwise
*/
-int CameraSensor::setFormat(V4L2SubdeviceFormat *format)
+int CameraSensor::setFormat(V4L2SubdeviceFormat *format, Transform transform)
{
/* Configure flips if the sensor supports that. */
if (supportFlips_) {
ControlList flipCtrls(subdev_->controls());
flipCtrls.set(V4L2_CID_HFLIP,
- static_cast<int32_t>(!!(format->transform &
- Transform::HFlip)));
+ static_cast<int32_t>(!!(transform & Transform::HFlip)));
flipCtrls.set(V4L2_CID_VFLIP,
- static_cast<int32_t>(!!(format->transform &
- Transform::VFlip)));
+ static_cast<int32_t>(!!(transform & Transform::VFlip)));
int ret = subdev_->setControls(&flipCtrls);
if (ret)
diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
index a819884f..7400cb0b 100644
--- a/src/libcamera/pipeline/ipu3/cio2.cpp
+++ b/src/libcamera/pipeline/ipu3/cio2.cpp
@@ -194,8 +194,7 @@ int CIO2Device::configure(const Size &size, const Transform &transform,
*/
std::vector<unsigned int> mbusCodes = utils::map_keys(mbusCodesToPixelFormat);
sensorFormat = getSensorFormat(mbusCodes, size);
- sensorFormat.transform = transform;
- ret = sensor_->setFormat(&sensorFormat);
+ ret = sensor_->setFormat(&sensorFormat, transform);
if (ret)
return ret;
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 77e860ab..c0dd9551 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -832,13 +832,14 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
}
}
- /* First calculate the best sensor mode we can use based on the user request. */
+ /*
+ * Calculate the best sensor mode we can use based on the user's
+ * request, and apply it to the sensor with the cached transform, if
+ * any.
+ */
V4L2SubdeviceFormat sensorFormat = findBestFormat(data->sensorFormats_, rawStream ? sensorSize : maxSize, bitDepth);
- /* Apply any cached transform. */
const RPiCameraConfiguration *rpiConfig = static_cast<const RPiCameraConfiguration *>(config);
- sensorFormat.transform = rpiConfig->combinedTransform_;
- /* Finally apply the format on the sensor. */
- ret = data->sensor_->setFormat(&sensorFormat);
+ ret = data->sensor_->setFormat(&sensorFormat, rpiConfig->combinedTransform_);
if (ret)
return ret;
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 5f22a29d..8a30fe06 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -125,6 +125,7 @@ public:
Status validate() override;
const V4L2SubdeviceFormat &sensorFormat() { return sensorFormat_; }
+ const Transform &combinedTransform() { return combinedTransform_; }
private:
bool fitsAllPaths(const StreamConfiguration &cfg);
@@ -138,6 +139,7 @@ private:
const RkISP1CameraData *data_;
V4L2SubdeviceFormat sensorFormat_;
+ Transform combinedTransform_;
};
class PipelineHandlerRkISP1 : public PipelineHandler
@@ -591,7 +593,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
if (sensorFormat_.size.isNull())
sensorFormat_.size = sensor->resolution();
- sensorFormat_.transform = combined;
+ combinedTransform_ = combined;
return status;
}
@@ -720,7 +722,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
V4L2SubdeviceFormat format = config->sensorFormat();
LOG(RkISP1, Debug) << "Configuring sensor with " << format;
- ret = sensor->setFormat(&format);
+ ret = sensor->setFormat(&format, config->combinedTransform());
if (ret < 0)
return ret;
diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index 38ff8b0c..15e8206a 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -217,13 +217,6 @@ const std::map<uint32_t, V4L2SubdeviceFormatInfo> formatInfoMap = {
*/
/**
- * \var V4L2SubdeviceFormat::transform
- * \brief The transform (vertical/horizontal flips) to be applied on the subdev
- *
- * Default initialized to Identity (no transform).
- */
-
-/**
* \brief Assemble and return a string describing the format
* \return A string describing the V4L2SubdeviceFormat
*/