summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/ipu3
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-12-30 00:49:14 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-12 16:10:37 +0100
commite9e6135d97d0afd3191e59578a71d51db14d6ad4 (patch)
treed939f671cbce33540814fe16e4999a4f2a024eac /src/libcamera/pipeline/ipu3
parent6c69bf982e607db555d1c3d96aa356c1c933de0b (diff)
libcamera: pipeline: Add FrameBuffer handlers
Extend the pipeline handlers to support the FrameBuffer API with three new methods to handle allocation, importing and freeing of buffers. The new methods will replace allocateBuffers() and freeBuffers(). The FrameBuffer API will use the methods on a stream level and either allocate or import buffers for each active stream controlled from the Camera class and an upcoming FrameBufferAllocator helper. With this new API the implementation in pipeline handlers can be made simpler as all streams don't need to be handled in allocateBuffers(). Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/pipeline/ipu3')
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 7c4539d4..b73f0f07 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -210,6 +210,11 @@ public:
const StreamRoles &roles) override;
int configure(Camera *camera, CameraConfiguration *config) override;
+ int exportFrameBuffers(Camera *camera, Stream *stream,
+ std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
+ int importFrameBuffers(Camera *camera, Stream *stream) override;
+ void freeFrameBuffers(Camera *camera, Stream *stream) override;
+
int allocateBuffers(Camera *camera,
const std::set<Stream *> &streams) override;
int freeBuffers(Camera *camera,
@@ -616,6 +621,33 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
return 0;
}
+int PipelineHandlerIPU3::exportFrameBuffers(Camera *camera, Stream *stream,
+ std::vector<std::unique_ptr<FrameBuffer>> *buffers)
+{
+ IPU3Stream *ipu3stream = static_cast<IPU3Stream *>(stream);
+ V4L2VideoDevice *video = ipu3stream->device_->dev;
+ unsigned int count = stream->configuration().bufferCount;
+
+ return video->exportBuffers(count, buffers);
+}
+
+int PipelineHandlerIPU3::importFrameBuffers(Camera *camera, Stream *stream)
+{
+ IPU3Stream *ipu3stream = static_cast<IPU3Stream *>(stream);
+ V4L2VideoDevice *video = ipu3stream->device_->dev;
+ unsigned int count = stream->configuration().bufferCount;
+
+ return video->importBuffers(count);
+}
+
+void PipelineHandlerIPU3::freeFrameBuffers(Camera *camera, Stream *stream)
+{
+ IPU3Stream *ipu3stream = static_cast<IPU3Stream *>(stream);
+ V4L2VideoDevice *video = ipu3stream->device_->dev;
+
+ video->releaseBuffers();
+}
+
/**
* \todo Clarify if 'viewfinder' and 'stat' nodes have to be set up and
* started even if not in use. As of now, if not properly configured and