summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-03-26 14:28:56 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-04-14 00:28:28 +0200
commit0e577cee9def15d95ad5bd7fce3815a46dad8e81 (patch)
treeb446bdda32f9b0fe63d21e27e6fa497615cc0ce4 /src
parent72278369b30af757c8ab756cc6c9cadcf15684d5 (diff)
ipa: Add start() and stop() operations
Add two new operations to the IPA interface to start and stop it. The intention is that these functions shall be used by the IPA to perform actions when the camera is started and stopped. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/ipa/libipa/ipa_interface_wrapper.cpp16
-rw-r--r--src/ipa/libipa/ipa_interface_wrapper.h2
-rw-r--r--src/ipa/rkisp1/rkisp1.cpp2
-rw-r--r--src/ipa/vimc/vimc.cpp20
-rw-r--r--src/libcamera/include/ipa_context_wrapper.h2
-rw-r--r--src/libcamera/ipa_context_wrapper.cpp22
-rw-r--r--src/libcamera/ipa_interface.cpp32
-rw-r--r--src/libcamera/proxy/ipa_proxy_linux.cpp2
8 files changed, 98 insertions, 0 deletions
diff --git a/src/ipa/libipa/ipa_interface_wrapper.cpp b/src/ipa/libipa/ipa_interface_wrapper.cpp
index b93c1c1f..f50f93a0 100644
--- a/src/ipa/libipa/ipa_interface_wrapper.cpp
+++ b/src/ipa/libipa/ipa_interface_wrapper.cpp
@@ -86,6 +86,20 @@ void IPAInterfaceWrapper::init(struct ipa_context *_ctx)
ctx->ipa_->init();
}
+int IPAInterfaceWrapper::start(struct ipa_context *_ctx)
+{
+ IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
+
+ return ctx->ipa_->start();
+}
+
+void IPAInterfaceWrapper::stop(struct ipa_context *_ctx)
+{
+ IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
+
+ ctx->ipa_->stop();
+}
+
void IPAInterfaceWrapper::register_callbacks(struct ipa_context *_ctx,
const struct ipa_callback_ops *callbacks,
void *cb_ctx)
@@ -234,6 +248,8 @@ const struct ipa_context_ops IPAInterfaceWrapper::operations_ = {
.destroy = &IPAInterfaceWrapper::destroy,
.get_interface = &IPAInterfaceWrapper::get_interface,
.init = &IPAInterfaceWrapper::init,
+ .start = &IPAInterfaceWrapper::start,
+ .stop = &IPAInterfaceWrapper::stop,
.register_callbacks = &IPAInterfaceWrapper::register_callbacks,
.configure = &IPAInterfaceWrapper::configure,
.map_buffers = &IPAInterfaceWrapper::map_buffers,
diff --git a/src/ipa/libipa/ipa_interface_wrapper.h b/src/ipa/libipa/ipa_interface_wrapper.h
index 3fb7b447..e4bc6dd4 100644
--- a/src/ipa/libipa/ipa_interface_wrapper.h
+++ b/src/ipa/libipa/ipa_interface_wrapper.h
@@ -24,6 +24,8 @@ private:
static void destroy(struct ipa_context *ctx);
static void *get_interface(struct ipa_context *ctx);
static void init(struct ipa_context *ctx);
+ static int start(struct ipa_context *ctx);
+ static void stop(struct ipa_context *ctx);
static void register_callbacks(struct ipa_context *ctx,
const struct ipa_callback_ops *callbacks,
void *cb_ctx);
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 438b3c66..af38e329 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -33,6 +33,8 @@ class IPARkISP1 : public IPAInterface
{
public:
int init() override { return 0; }
+ int start() override { return 0; }
+ void stop() override {}
void configure(const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, const ControlInfoMap &> &entityControls) override;
diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp
index 6e2095b5..566a66e4 100644
--- a/src/ipa/vimc/vimc.cpp
+++ b/src/ipa/vimc/vimc.cpp
@@ -32,6 +32,10 @@ public:
~IPAVimc();
int init() override;
+
+ int start() override;
+ void stop() override;
+
void configure(const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, const ControlInfoMap &> &entityControls) override {}
void mapBuffers(const std::vector<IPABuffer> &buffers) override {}
@@ -66,6 +70,22 @@ int IPAVimc::init()
return 0;
}
+int IPAVimc::start()
+{
+ trace(IPAOperationStart);
+
+ LOG(IPAVimc, Debug) << "start vimc IPA!";
+
+ return 0;
+}
+
+void IPAVimc::stop()
+{
+ trace(IPAOperationStop);
+
+ LOG(IPAVimc, Debug) << "stop vimc IPA!";
+}
+
void IPAVimc::initTrace()
{
struct stat fifoStat;
diff --git a/src/libcamera/include/ipa_context_wrapper.h b/src/libcamera/include/ipa_context_wrapper.h
index c9e19412..0a48bfe7 100644
--- a/src/libcamera/include/ipa_context_wrapper.h
+++ b/src/libcamera/include/ipa_context_wrapper.h
@@ -20,6 +20,8 @@ public:
~IPAContextWrapper();
int init() override;
+ int start() override;
+ void stop() override;
void configure(const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, const ControlInfoMap &> &entityControls) override;
diff --git a/src/libcamera/ipa_context_wrapper.cpp b/src/libcamera/ipa_context_wrapper.cpp
index 946a2fd8..ab6ce396 100644
--- a/src/libcamera/ipa_context_wrapper.cpp
+++ b/src/libcamera/ipa_context_wrapper.cpp
@@ -82,6 +82,28 @@ int IPAContextWrapper::init()
return 0;
}
+int IPAContextWrapper::start()
+{
+ if (intf_)
+ return intf_->start();
+
+ if (!ctx_)
+ return 0;
+
+ return ctx_->ops->start(ctx_);
+}
+
+void IPAContextWrapper::stop()
+{
+ if (intf_)
+ return intf_->stop();
+
+ if (!ctx_)
+ return;
+
+ ctx_->ops->stop(ctx_);
+}
+
void IPAContextWrapper::configure(const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, const ControlInfoMap &> &entityControls)
{
diff --git a/src/libcamera/ipa_interface.cpp b/src/libcamera/ipa_interface.cpp
index 5959e7de..0b785bdf 100644
--- a/src/libcamera/ipa_interface.cpp
+++ b/src/libcamera/ipa_interface.cpp
@@ -236,6 +236,20 @@
*/
/**
+ * \var ipa_context_ops::start
+ * \brief Start the IPA context
+ *
+ * \sa libcamera::IPAInterface::start()
+ */
+
+/**
+ * \var ipa_context_ops::stop
+ * \brief Stop the IPA context
+ *
+ * \sa libcamera::IPAInterface::stop()
+ */
+
+/**
* \var ipa_context_ops::register_callbacks
* \brief Register callback operation from the IPA to the pipeline handler
* \param[in] ctx The IPA context
@@ -413,6 +427,24 @@ namespace libcamera {
*/
/**
+ * \fn IPAInterface::start()
+ * \brief Start the IPA
+ *
+ * This method informs the IPA module that the camera is about to be started.
+ * The IPA module shall prepare any resources it needs to operate.
+ *
+ * \return 0 on success or a negative error code otherwise
+ */
+
+/**
+ * \fn IPAInterface::stop()
+ * \brief Stop the IPA
+ *
+ * This method informs the IPA module that the camera is stopped. The IPA module
+ * shall release resources prepared in start().
+ */
+
+/**
* \fn IPAInterface::configure()
* \brief Configure the IPA stream and sensor settings
* \param[in] streamConfig Configuration of all active streams
diff --git a/src/libcamera/proxy/ipa_proxy_linux.cpp b/src/libcamera/proxy/ipa_proxy_linux.cpp
index c7218fb4..2aa80b94 100644
--- a/src/libcamera/proxy/ipa_proxy_linux.cpp
+++ b/src/libcamera/proxy/ipa_proxy_linux.cpp
@@ -27,6 +27,8 @@ public:
~IPAProxyLinux();
int init() override { return 0; }
+ int start() override { return 0; }
+ void stop() override {}
void configure(const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, const ControlInfoMap &> &entityControls) override {}
void mapBuffers(const std::vector<IPABuffer> &buffers) override {}