summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libcamera/internal/camera_sensor.h3
-rw-r--r--src/libcamera/camera_sensor.cpp43
-rw-r--r--test/ipa/ipa_wrappers_test.cpp2
3 files changed, 44 insertions, 4 deletions
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index bf83d531..3e07fcae 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -33,6 +33,9 @@ struct CameraSensorInfo {
uint64_t pixelRate;
uint32_t lineLength;
+
+ uint32_t minFrameLength;
+ uint32_t maxFrameLength;
};
class CameraSensor : protected Loggable
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index e008efd9..9d60b39f 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -114,6 +114,36 @@ LOG_DEFINE_CATEGORY(CameraSensor)
*/
/**
+ * \var CameraSensorInfo::minFrameLength
+ * \brief The minimum allowable frame length in units of lines
+ *
+ * The sensor frame length comprises of active output lines and blanking lines
+ * in a frame. The minimum frame length value dictates the minimum allowable
+ * frame duration of the sensor mode.
+ *
+ * To obtain the minimum frame duration:
+ *
+ * \verbatim
+ frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
+ \endverbatim
+ */
+
+/**
+ * \var CameraSensorInfo::maxFrameLength
+ * \brief The maximum allowable frame length in units of lines
+ *
+ * The sensor frame length comprises of active output lines and blanking lines
+ * in a frame. The maximum frame length value dictates the maximum allowable
+ * frame duration of the sensor mode.
+ *
+ * To obtain the maximum frame duration:
+ *
+ * \verbatim
+ frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
+ \endverbatim
+ */
+
+/**
* \class CameraSensor
* \brief A camera sensor based on V4L2 subdevices
*
@@ -706,12 +736,13 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
info->outputSize = format.size;
/*
- * Retrieve the pixel rate and the line length through V4L2 controls.
- * Support for the V4L2_CID_PIXEL_RATE and V4L2_CID_HBLANK controls is
- * mandatory.
+ * Retrieve the pixel rate, line length and minimum/maximum frame
+ * duration through V4L2 controls. Support for the V4L2_CID_PIXEL_RATE,
+ * V4L2_CID_HBLANK and V4L2_CID_VBLANK controls is mandatory.
*/
ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE,
- V4L2_CID_HBLANK });
+ V4L2_CID_HBLANK,
+ V4L2_CID_VBLANK });
if (ctrls.empty()) {
LOG(CameraSensor, Error)
<< "Failed to retrieve camera info controls";
@@ -722,6 +753,10 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
info->lineLength = info->outputSize.width + hblank;
info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get<int64_t>();
+ const ControlInfo vblank = ctrls.infoMap()->at(V4L2_CID_VBLANK);
+ info->minFrameLength = info->outputSize.height + vblank.min().get<int32_t>();
+ info->maxFrameLength = info->outputSize.height + vblank.max().get<int32_t>();
+
return 0;
}
diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp
index 47533d10..eb6d783e 100644
--- a/test/ipa/ipa_wrappers_test.cpp
+++ b/test/ipa/ipa_wrappers_test.cpp
@@ -313,6 +313,8 @@ protected:
.outputSize = { 2560, 1940 },
.pixelRate = 96000000,
.lineLength = 2918,
+ .minFrameLength = 1940,
+ .maxFrameLength = 2880
};
std::map<unsigned int, IPAStream> config{
{ 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } },