@@ -336,6 +336,24 @@ Debayer::~Debayer()
* debayer processing.
*/
+/**
+ * \fn int Debayer::start()
+ * \brief Execute a start signal in the debayer object from workerthread context.
+ *
+ * In the DebayerCPU case this is an empty stub function but
+ * for the GPU case this does something useful. The stub here is to
+ * ensure the right version of the virtual gets called.
+ */
+
+/**
+ * \fn void Debayer::stop()
+ * \brief Stop the debayering process and perform cleanup
+ *
+ * In the DebayerCPU case this is an empty stub function but
+ * for the GPU case this does something useful. The stub here is to
+ * ensure the right version of the virtual gets called.
+ */
+
/**
* \fn void Debayer::setParams(DebayerParams ¶ms)
* \brief Select the bayer params to use for the next frame debayer
@@ -48,6 +48,8 @@ public:
strideAndFrameSize(const PixelFormat &outputFormat, const Size &size) = 0;
virtual void process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, DebayerParams params) = 0;
+ virtual int start() { return 0; }
+ virtual void stop() { }
virtual SizeRange sizes(PixelFormat inputFormat, const Size &inputSize) = 0;
@@ -347,7 +347,9 @@ int SoftwareIsp::start()
return ret;
ispWorkerThread_.start();
- return 0;
+
+ return debayer_->invokeMethod(&DebayerCpu::start,
+ ConnectionTypeBlocking);
}
/**
@@ -358,9 +360,11 @@ int SoftwareIsp::start()
*/
void SoftwareIsp::stop()
{
+ debayer_->invokeMethod(&DebayerCpu::stop,
+ ConnectionTypeBlocking);
+
ispWorkerThread_.exit();
ispWorkerThread_.wait();
- ispWorkerThread_.removeMessages(debayer_.get());
Thread::current()->dispatchMessages(Message::Type::InvokeMessage, this);
In order to initialise and deinitialise gpuisp we need to be able to setup EGL in the same thread as Debayer::process() happens in. In order to do this we need to extend the Debayer object to provide start and stop methods which are triggered through invokeMethod in the same way as process() is. Introduce start() and stop() methods to the debayer class. Trigger those methods as described above via invokeMethod. The debayer_egl class will take care of initialising and de-initialising as necessary. Debayer CPU sees no functional change. [bod: Made method blocking not queued per Robert's bugfixes] Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> --- src/libcamera/software_isp/debayer.cpp | 18 ++++++++++++++++++ src/libcamera/software_isp/debayer.h | 2 ++ src/libcamera/software_isp/software_isp.cpp | 8 ++++++-- 3 files changed, 26 insertions(+), 2 deletions(-)