ipa: vimc: Map and unmap buffers

VIMC pipeline handler has dmabuf-backed mock FrameBuffers which are
specifically targetted mimicking IPA buffers (parameter and statistics).
Map these mock buffers to the VIMC IPA that would enable exercising IPA
IPC code paths. This will provide leverage to our test suite to test
IPA IPC code paths, which are common to various platforms.

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Umang Jain 2021-08-14 10:39:11 +05:30
parent aad68099e5
commit 3c5732d04a
3 changed files with 44 additions and 0 deletions

View file

@ -26,6 +26,9 @@ interface IPAVimcInterface {
start() => (int32 ret); start() => (int32 ret);
stop(); stop();
mapBuffers(array<libcamera.IPABuffer> buffers);
unmapBuffers(array<uint32> ids);
}; };
interface IPAVimcEventInterface { interface IPAVimcEventInterface {

View file

@ -19,6 +19,8 @@
#include <libcamera/ipa/ipa_interface.h> #include <libcamera/ipa/ipa_interface.h>
#include <libcamera/ipa/ipa_module_info.h> #include <libcamera/ipa/ipa_module_info.h>
#include "libcamera/internal/mapped_framebuffer.h"
namespace libcamera { namespace libcamera {
LOG_DEFINE_CATEGORY(IPAVimc) LOG_DEFINE_CATEGORY(IPAVimc)
@ -38,11 +40,15 @@ public:
const std::map<unsigned int, IPAStream> &streamConfig, const std::map<unsigned int, IPAStream> &streamConfig,
const std::map<unsigned int, ControlInfoMap> &entityControls) override; const std::map<unsigned int, ControlInfoMap> &entityControls) override;
void mapBuffers(const std::vector<IPABuffer> &buffers) override;
void unmapBuffers(const std::vector<unsigned int> &ids) override;
private: private:
void initTrace(); void initTrace();
void trace(enum ipa::vimc::IPAOperationCode operation); void trace(enum ipa::vimc::IPAOperationCode operation);
int fd_; int fd_;
std::map<unsigned int, MappedFrameBuffer> buffers_;
}; };
IPAVimc::IPAVimc() IPAVimc::IPAVimc()
@ -99,6 +105,27 @@ int IPAVimc::configure([[maybe_unused]] const IPACameraSensorInfo &sensorInfo,
return 0; return 0;
} }
void IPAVimc::mapBuffers(const std::vector<IPABuffer> &buffers)
{
for (const IPABuffer &buffer : buffers) {
const FrameBuffer fb(buffer.planes);
buffers_.emplace(std::piecewise_construct,
std::forward_as_tuple(buffer.id),
std::forward_as_tuple(&fb, MappedFrameBuffer::MapFlag::Read));
}
}
void IPAVimc::unmapBuffers(const std::vector<unsigned int> &ids)
{
for (unsigned int id : ids) {
auto it = buffers_.find(id);
if (it == buffers_.end())
continue;
buffers_.erase(it);
}
}
void IPAVimc::initTrace() void IPAVimc::initTrace()
{ {
struct stat fifoStat; struct stat fifoStat;

View file

@ -334,6 +334,14 @@ int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlLis
if (ret < 0) if (ret < 0)
return ret; return ret;
/* Map the mock IPA buffers to VIMC IPA to exercise IPC code paths. */
std::vector<IPABuffer> ipaBuffers;
for (auto [i, buffer] : utils::enumerate(data->mockIPABufs_)) {
buffer->setCookie(i + 1);
ipaBuffers.emplace_back(buffer->cookie(), buffer->planes());
}
data->ipa_->mapBuffers(ipaBuffers);
ret = data->ipa_->start(); ret = data->ipa_->start();
if (ret) { if (ret) {
data->video_->releaseBuffers(); data->video_->releaseBuffers();
@ -354,7 +362,13 @@ void PipelineHandlerVimc::stop(Camera *camera)
{ {
VimcCameraData *data = cameraData(camera); VimcCameraData *data = cameraData(camera);
data->video_->streamOff(); data->video_->streamOff();
std::vector<unsigned int> ids;
for (const std::unique_ptr<FrameBuffer> &buffer : data->mockIPABufs_)
ids.push_back(buffer->cookie());
data->ipa_->unmapBuffers(ids);
data->ipa_->stop(); data->ipa_->stop();
data->video_->releaseBuffers(); data->video_->releaseBuffers();
} }