[libcamera-devel] [PATCH v4 06/11] libcamera: ipa: Extend to support IPA interactions
Niklas Söderlund
niklas.soderlund at ragnatech.se
Thu Oct 3 19:49:36 CEST 2019
The IPA interface needs to support interactions with the pipeline, add
interfaces to control the sensor and handling of request ISP parameters
and statistics.
Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
include/ipa/ipa_interface.h | 37 +++++++
src/ipa/ipa_dummy.cpp | 7 +-
src/libcamera/ipa_interface.cpp | 132 ++++++++++++++++++++++++
src/libcamera/proxy/ipa_proxy_linux.cpp | 14 ++-
4 files changed, 181 insertions(+), 9 deletions(-)
diff --git a/include/ipa/ipa_interface.h b/include/ipa/ipa_interface.h
index 2c5eb1fd524311cb..2c715314c7a418f0 100644
--- a/include/ipa/ipa_interface.h
+++ b/include/ipa/ipa_interface.h
@@ -7,14 +7,51 @@
#ifndef __LIBCAMERA_IPA_INTERFACE_H__
#define __LIBCAMERA_IPA_INTERFACE_H__
+#include <map>
+#include <vector>
+
+#include <libcamera/buffer.h>
+#include <libcamera/controls.h>
+#include <libcamera/geometry.h>
+#include <libcamera/signal.h>
+
+#include "v4l2_controls.h"
+
namespace libcamera {
+struct IPAStream {
+ unsigned int pixelFormat;
+ Size size;
+};
+
+struct IPABuffer {
+ unsigned int id;
+ unsigned int type;
+ BufferMemory buffer;
+};
+
+struct IPAOperationData {
+ unsigned int operation;
+ std::vector<uint32_t> data;
+ std::vector<ControlList> controls;
+ /* \todo: Add more vectors for data types used in pipa<->IPA interactions. */
+};
+
class IPAInterface
{
public:
virtual ~IPAInterface() {}
virtual int init() = 0;
+
+ virtual void configure(const std::map<unsigned int, IPAStream> &streamConfig,
+ const std::map<unsigned int, V4L2ControlInfoMap> &entityControls) = 0;
+
+ virtual void mapBuffers(const std::vector<IPABuffer> &buffers) = 0;
+ virtual void unmapBuffers(const std::vector<IPABuffer> &buffers) = 0;
+
+ virtual void processEvent(const IPAOperationData &event) = 0;
+ Signal<const IPAOperationData &> queueFrameAction;
};
} /* namespace libcamera */
diff --git a/src/ipa/ipa_dummy.cpp b/src/ipa/ipa_dummy.cpp
index 9d0cbdc8b1ad5565..08f74c4952f3923a 100644
--- a/src/ipa/ipa_dummy.cpp
+++ b/src/ipa/ipa_dummy.cpp
@@ -15,7 +15,12 @@ namespace libcamera {
class IPADummy : public IPAInterface
{
public:
- int init();
+ int init() override;
+ void configure(const std::map<unsigned int, IPAStream> &streamConfig,
+ const std::map<unsigned int, V4L2ControlInfoMap> &entityControls) override {}
+ void mapBuffers(const std::vector<IPABuffer> &buffers) override {}
+ void unmapBuffers(const std::vector<IPABuffer> &buffers) override {}
+ void processEvent(const IPAOperationData &event) override {}
};
int IPADummy::init()
diff --git a/src/libcamera/ipa_interface.cpp b/src/libcamera/ipa_interface.cpp
index d7d8ca8881efcf66..c0f2004f3ec993b2 100644
--- a/src/libcamera/ipa_interface.cpp
+++ b/src/libcamera/ipa_interface.cpp
@@ -14,6 +14,68 @@
namespace libcamera {
+
+/**
+ * \struct IPAStream
+ * \brief Hold IPA description of a stream.
+ */
+
+/**
+ * \var IPAStream::pixelFormat
+ * \brief The streams pixel format
+ */
+
+/**
+ * \var IPAStream::size
+ * \brief The streams size
+ */
+
+/**
+ * \struct IPABuffer
+ * \brief Hold IPA description of a buffer
+ */
+
+/**
+ * \var IPABuffer::id
+ * \brief The pipeline to IPA id cookie for the buffer
+ */
+
+/**
+ * \var IPABuffer::type
+ * \brief The pipeline to IPA type for the buffer
+ */
+
+/**
+ * \var IPABuffer::buffer
+ * \brief The hardware description of the buffer shared between pipeline and IPA
+ */
+
+/**
+ * \struct IPAOperationData
+ * \brief Hold data exchanged between pipeline and IPA
+ *
+ * This is the information carrier between pipeline and IPA. The is is used
+ * to transport the pipeline specific protocol between the two. Core libcamera
+ * components do not try to interpret the protocol and it's up to the pipeline
+ * handler to uses the members of this struct in any way they see fit, and to
+ * document it so multiple IPA implementations for the same pipeline may use it.
+ */
+
+/**
+ * \var IPAOperationData::operation
+ * \brief Intended as the operation code in the pipeline to IPA protocol
+ */
+
+/**
+ * \var IPAOperationData::data
+ * \brief Intended as the generic data carrier in the pipeline to IPA protocol
+ */
+
+/**
+ * \var IPAOperationData::controls
+ * \brief Intended as the ControlList carrier in the pipeline to IPA protocol
+ */
+
/**
* \class IPAInterface
* \brief Interface for IPA implementation
@@ -24,4 +86,74 @@ namespace libcamera {
* \brief Initialise the IPAInterface
*/
+/**
+ * \fn IPAInterface::configure()
+ * \brief Configure the IPA stream and sensor settings
+ * \param[in] streamConfig List of stream configuration descriptions
+ * \param[in] entityControls List of controls provided by the pipeline entities
+ *
+ * This function is called when a pipeline attaches to an IPA to inform the IPA
+ * of the streams and controls limits the entities(s) in the video pipeline
+ * supports.
+ */
+
+/**
+ * \fn IPAInterface::mapBuffers()
+ * \brief Map the buffers shared by the pipeline to the IPA
+ * \param[in] buffers List of buffers to map
+ *
+ * This function is called when a pipeline handler wants to inform the IPA of
+ * which buffers it has mapped which the IPA can make use of. All buffers shared
+ * between these two object's needs to be shared using this function prior to
+ * use.
+ *
+ * After the buffers have been initialized a specific buffer can be referenced
+ * using the numerical \a type and \a id provided when the buffers where mapped.
+ *
+ * The numerical values for type and id used to describe a buffer have no
+ * meaning in the core libcamera code and the interface is pipeline handler
+ * specific.
+ *
+ * \sa unmapBuffers()
+ * \todo Can we make this a generic function?
+ */
+
+/**
+ * \fn IPAInterface::unmapBuffers()
+ * \brief Unmap the buffers shared by the pipeline to the IPA
+ * \param[in] buffers List of buffers to unmap
+ *
+ * This function is called when a pipeline handler wants to the IPA to unmap
+ * all or some of the buffer it have mapped.
+ *
+ * \sa mapBuffers()
+ * \todo Can we make this a generic function?
+ */
+
+/**
+ * \fn IPAInterface::processEvent()
+ * \brief Process an event from the pipeline handler
+ * \param[in] event Event to process
+ *
+ * The pipeline handler can send events to the IPA to notify it of what is
+ * going on. This is the entry point on the IPA side for those messages.
+ *
+ * The protocol between pipeline and IPA are hilly specific for each pipeline
+ * and needs to be documented separately. Libcamera reserves no operation
+ * numbers and make no attempt to interpret the protocol.
+ */
+
+/**
+ * \fn IPAInterface::queueFrameAction()
+ * \brief Signal emitted when the IPA wish to queue a FrameAction
+ * \param[in] frame The frame number for the request
+ * \param[in] controls List of controls associated with the request
+ *
+ * This signal is emitted when the IPA wish to queue a FrameAction on the
+ * pipeline. The pipeline is still responsible for the scheduling of the action
+ * on its timeline.
+ *
+ * The IPA operation describing the frame action is passed as a parameter.
+ */
+
} /* namespace libcamera */
diff --git a/src/libcamera/proxy/ipa_proxy_linux.cpp b/src/libcamera/proxy/ipa_proxy_linux.cpp
index 62fcb529e1c7e4ff..14e8bb6067623fc6 100644
--- a/src/libcamera/proxy/ipa_proxy_linux.cpp
+++ b/src/libcamera/proxy/ipa_proxy_linux.cpp
@@ -26,7 +26,12 @@ public:
IPAProxyLinux(IPAModule *ipam);
~IPAProxyLinux();
- int init();
+ int init() override { return 0; }
+ void configure(const std::map<unsigned int, IPAStream> &streamConfig,
+ const std::map<unsigned int, V4L2ControlInfoMap> &entityControls) override {}
+ void mapBuffers(const std::vector<IPABuffer> &buffers) override {}
+ void unmapBuffers(const std::vector<IPABuffer> &buffers) override {}
+ void processEvent(const IPAOperationData &event) override {}
private:
void readyRead(IPCUnixSocket *ipc);
@@ -36,13 +41,6 @@ private:
IPCUnixSocket *socket_;
};
-int IPAProxyLinux::init()
-{
- LOG(IPAProxy, Debug) << "initializing IPA via dummy proxy!";
-
- return 0;
-}
-
IPAProxyLinux::IPAProxyLinux(IPAModule *ipam)
: proc_(nullptr), socket_(nullptr)
{
--
2.23.0
More information about the libcamera-devel
mailing list