[libcamera-devel] [PATCH 4/6] libcamera: v4l2_device: Add single/multiplane formats
Jacopo Mondi
jacopo at jmondi.org
Mon Jan 21 18:27:03 CET 2019
Add a class hierarchy internal to V4L2Device to handle set/get format
operations in the single/multi plane use case.
Provide stubs only for get/setFormat methods at the moment.
---
src/libcamera/include/v4l2_device.h | 34 +++++++++++++++++
src/libcamera/v4l2_device.cpp | 59 +++++++++++++++++++++++++++++
2 files changed, 93 insertions(+)
diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h
index 0101a4b..81992dc 100644
--- a/src/libcamera/include/v4l2_device.h
+++ b/src/libcamera/include/v4l2_device.h
@@ -7,6 +7,7 @@
#ifndef __LIBCAMERA_V4L2_DEVICE_H__
#define __LIBCAMERA_V4L2_DEVICE_H__
+#include <memory>
#include <string>
#include <linux/videodev2.h>
@@ -54,11 +55,44 @@ public:
const char *busName() const { return caps_.bus_info(); }
int setControl(unsigned int control, int value);
+ int getFormat();
+ int setFormat();
private:
+ class V4L2Format
+ {
+ public:
+ virtual ~V4L2Format() { }
+ virtual int setFormat() = 0;
+ virtual int getFormat() = 0;
+
+ protected:
+ V4L2Format() { }
+ V4L2Format(V4L2Format &) = delete;
+ };
+
+ class V4L2FormatSPlane : public V4L2Format
+ {
+ public:
+ V4L2FormatSPlane() { }
+ ~V4L2FormatSPlane() { }
+ int setFormat();
+ int getFormat();
+ };
+
+ class V4L2FormatMPlane : public V4L2Format
+ {
+ public:
+ V4L2FormatMPlane() { }
+ ~V4L2FormatMPlane() { }
+ int setFormat();
+ int getFormat();
+ };
+
std::string devnode_;
int fd_;
V4L2Capability caps_;
+ std::unique_ptr<V4L2Format> format_;
};
} /* namespace libcamera */
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 7cd89d7..126f6f2 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -5,6 +5,8 @@
* v4l2_device.cpp - V4L2 Device
*/
+#include <memory>
+
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
@@ -13,6 +15,7 @@
#include "log.h"
#include "media_object.h"
+#include "utils.h"
#include "v4l2_device.h"
/**
@@ -182,6 +185,12 @@ int V4L2Device::open()
return -EINVAL;
}
+ /* Create single/multi plane format handler. */
+ if (caps_.isSinglePlane())
+ format_ = utils::make_unique<V4L2FormatSPlane>();
+ else
+ format_ = utils::make_unique<V4L2FormatMPlane>();
+
return 0;
}
@@ -262,4 +271,54 @@ int V4L2Device::setControl(unsigned int control, int value)
return v4l2_ctrl.value;
}
+/**
+ * \brief Retrieve the image format set on the V4L2 device
+ *
+ * TODO: define how the image format is encoded
+ * FIXME: this function is a stub at the moment
+ *
+ * \return 0 for success, a negative error code otherwise
+ */
+int V4L2Device::getFormat()
+{
+ return format_->getFormat();
+}
+
+/**
+ * \brief Program an image format on the V4L2 device
+ *
+ * TODO: define how the image format is encoded
+ * FIXME: this function is a stub at the moment
+ *
+ * \return 0 for success, a negative error code otherwise
+ */
+int V4L2Device::setFormat()
+{
+ return format_->setFormat();
+}
+
+/* FIXME: this function is a stub at the moment. */
+int V4L2Device::V4L2FormatSPlane::getFormat()
+{
+ return 0;
+}
+
+/* FIXME: this function is a stub at the moment. */
+int V4L2Device::V4L2FormatSPlane::setFormat()
+{
+ return 0;
+}
+
+/* FIXME: this function is a stub at the moment. */
+int V4L2Device::V4L2FormatMPlane::getFormat()
+{
+ return 0;
+}
+
+/* FIXME: this function is a stub at the moment. */
+int V4L2Device::V4L2FormatMPlane::setFormat()
+{
+ return 0;
+}
+
} /* namespace libcamera */
--
2.20.1
More information about the libcamera-devel
mailing list