diff options
-rw-r--r-- | include/libcamera/buffer.h | 3 | ||||
-rw-r--r-- | include/libcamera/stream.h | 1 | ||||
-rw-r--r-- | src/libcamera/buffer.cpp | 13 | ||||
-rw-r--r-- | src/libcamera/request.cpp | 5 | ||||
-rw-r--r-- | src/libcamera/stream.cpp | 47 |
5 files changed, 67 insertions, 2 deletions
diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h index f5ba6207..f8569a6b 100644 --- a/include/libcamera/buffer.h +++ b/include/libcamera/buffer.h @@ -7,6 +7,7 @@ #ifndef __LIBCAMERA_BUFFER_H__ #define __LIBCAMERA_BUFFER_H__ +#include <array> #include <stdint.h> #include <vector> @@ -75,6 +76,7 @@ public: Buffer &operator=(const Buffer &) = delete; unsigned int index() const { return index_; } + const std::array<int, 3> &dmabufs() const { return dmabuf_; } unsigned int bytesused() const { return bytesused_; } uint64_t timestamp() const { return timestamp_; } @@ -95,6 +97,7 @@ private: void setRequest(Request *request) { request_ = request; } unsigned int index_; + std::array<int, 3> dmabuf_; unsigned int bytesused_; uint64_t timestamp_; diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h index 08eb8cc7..1883d9e9 100644 --- a/include/libcamera/stream.h +++ b/include/libcamera/stream.h @@ -75,6 +75,7 @@ public: Stream(); std::unique_ptr<Buffer> createBuffer(unsigned int index); + std::unique_ptr<Buffer> createBuffer(const std::array<int, 3> &fds); BufferPool &bufferPool() { return bufferPool_; } std::vector<BufferMemory> &buffers() { return bufferPool_.buffers(); } diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp index ecbf2524..99358633 100644 --- a/src/libcamera/buffer.cpp +++ b/src/libcamera/buffer.cpp @@ -269,7 +269,8 @@ void BufferPool::destroyBuffers() * for a stream with Stream::createBuffer(). */ Buffer::Buffer(unsigned int index, const Buffer *metadata) - : index_(index), status_(Buffer::BufferSuccess), request_(nullptr), + : index_(index), dmabuf_({ -1, -1, -1 }), + status_(Buffer::BufferSuccess), request_(nullptr), stream_(nullptr) { if (metadata) { @@ -290,6 +291,16 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata) */ /** + * \fn Buffer::dmabufs() + * \brief Retrieve the dmabuf file descriptors for all buffer planes + * + * The dmabufs array contains one dmabuf file descriptor per plane. Unused + * entries are set to -1. + * + * \return The dmabuf file descriptors + */ + +/** * \fn Buffer::bytesused() * \brief Retrieve the number of bytes occupied by the data in the buffer * \return Number of bytes occupied in the buffer diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp index 19131472..ee2158fc 100644 --- a/src/libcamera/request.cpp +++ b/src/libcamera/request.cpp @@ -106,10 +106,15 @@ Request::~Request() * * \return 0 on success or a negative error code otherwise * \retval -EEXIST The request already contains a buffer for the stream + * \retval -EINVAL The buffer does not reference a valid Stream */ int Request::addBuffer(std::unique_ptr<Buffer> buffer) { Stream *stream = buffer->stream(); + if (!stream) { + LOG(Request, Error) << "Invalid stream reference"; + return -EINVAL; + } auto it = bufferMap_.find(stream); if (it != bufferMap_.end()) { diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp index 37a9bc0a..98178e06 100644 --- a/src/libcamera/stream.cpp +++ b/src/libcamera/stream.cpp @@ -424,17 +424,26 @@ Stream::Stream() } /** - * \brief Create a Buffer instance + * \brief Create a Buffer instance referencing the memory buffer \a index * \param[in] index The desired buffer index * * This method creates a Buffer instance that references a BufferMemory from * the stream's buffers pool by its \a index. The index shall be lower than the * number of buffers in the pool. * + * This method is only valid for streams that use the InternalMemory type. It + * will return a null pointer when called on streams using the ExternalMemory + * type. + * * \return A newly created Buffer on success or nullptr otherwise */ std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index) { + if (memoryType_ != InternalMemory) { + LOG(Stream, Error) << "Invalid stream memory type"; + return nullptr; + } + if (index >= bufferPool_.count()) { LOG(Stream, Error) << "Invalid buffer index " << index; return nullptr; @@ -448,6 +457,42 @@ std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index) } /** + * \brief Create a Buffer instance that represents a memory area identified by + * dmabuf file descriptors + * \param[in] fds The dmabuf file descriptors for each plane + * + * This method creates a Buffer instance that references buffer memory + * allocated outside of libcamera through dmabuf file descriptors. The \a + * dmabuf array shall contain a file descriptor for each plane in the buffer, + * and unused entries shall be set to -1. + * + * The buffer is created without a valid index, as it does not yet map to any of + * the stream's BufferMemory instances. An index will be assigned at the time + * the buffer is queued to the camera in a request. Applications may thus + * create any number of Buffer instances, providing that no more than the + * number of buffers allocated for the stream are queued at any given time. + * + * This method is only valid for streams that use the ExternalMemory type. It + * will return a null pointer when called on streams using the InternalMemory + * type. + * + * \return A newly created Buffer on success or nullptr otherwise + */ +std::unique_ptr<Buffer> Stream::createBuffer(const std::array<int, 3> &fds) +{ + if (memoryType_ != ExternalMemory) { + LOG(Stream, Error) << "Invalid stream memory type"; + return nullptr; + } + + Buffer *buffer = new Buffer(); + buffer->dmabuf_ = fds; + buffer->stream_ = this; + + return std::unique_ptr<Buffer>(buffer); +} + +/** * \fn Stream::bufferPool() * \brief Retrieve the buffer pool for the stream * |