libcamera: stream: Add Stream memory type

Define the memory type a Stream uses and allow application to set it
through the associated StreamConfiguration.

A Stream can use either internal or external memory allocation methods,
depending on where the data produced by the stream is actually saved.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Jacopo Mondi 2019-06-28 09:13:34 +02:00 committed by Laurent Pinchart
parent be3e3ebc92
commit 99e1e786b4
3 changed files with 42 additions and 5 deletions

View file

@ -35,6 +35,11 @@ private:
std::map<unsigned int, std::vector<SizeRange>> formats_;
};
enum MemoryType {
InternalMemory,
ExternalMemory,
};
struct StreamConfiguration {
StreamConfiguration();
StreamConfiguration(const StreamFormats &formats);
@ -42,6 +47,7 @@ struct StreamConfiguration {
unsigned int pixelFormat;
Size size;
MemoryType memoryType;
unsigned int bufferCount;
Stream *stream() const { return stream_; }
@ -73,15 +79,17 @@ public:
BufferPool &bufferPool() { return bufferPool_; }
std::vector<BufferMemory> &buffers() { return bufferPool_.buffers(); }
const StreamConfiguration &configuration() const { return configuration_; }
MemoryType memoryType() const { return memoryType_; }
protected:
friend class Camera;
void createBuffers(unsigned int count);
void createBuffers(MemoryType memory, unsigned int count);
void destroyBuffers();
BufferPool bufferPool_;
StreamConfiguration configuration_;
MemoryType memoryType_;
};
} /* namespace libcamera */

View file

@ -683,7 +683,7 @@ int Camera::configure(CameraConfiguration *config)
* Allocate buffer objects in the pool.
* Memory will be allocated and assigned later.
*/
stream->createBuffers(cfg.bufferCount);
stream->createBuffers(cfg.memoryType, cfg.bufferCount);
}
state_ = CameraConfigured;

View file

@ -263,6 +263,17 @@ SizeRange StreamFormats::range(unsigned int pixelformat) const
return range;
}
/**
* \enum MemoryType
* \brief Define the memory type used by a Stream
* \var MemoryType::InternalMemory
* The Stream uses memory allocated internally by the library and exported to
* applications.
* \var MemoryType::ExternalMemory
* The Stream uses memory allocated externally by application and imported in
* the library.
*/
/**
* \struct StreamConfiguration
* \brief Configuration parameters for a stream
@ -276,7 +287,7 @@ SizeRange StreamFormats::range(unsigned int pixelformat) const
* handlers provied StreamFormats.
*/
StreamConfiguration::StreamConfiguration()
: stream_(nullptr)
: memoryType(InternalMemory), stream_(nullptr)
{
}
@ -284,7 +295,7 @@ StreamConfiguration::StreamConfiguration()
* \brief Construct a configuration with stream formats
*/
StreamConfiguration::StreamConfiguration(const StreamFormats &formats)
: stream_(nullptr), formats_(formats)
: memoryType(InternalMemory), stream_(nullptr), formats_(formats)
{
}
@ -301,6 +312,11 @@ StreamConfiguration::StreamConfiguration(const StreamFormats &formats)
* format described in V4L2 using the V4L2_PIX_FMT_* definitions.
*/
/**
* \var StreamConfiguration::memoryType
* \brief The memory type the stream shall use
*/
/**
* \var StreamConfiguration::bufferCount
* \brief Requested number of buffers to allocate for the stream
@ -454,18 +470,26 @@ std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index)
* \return The active configuration of the stream
*/
/**
* \fn Stream::memoryType()
* \brief Retrieve the stream memory type
* \return The memory type used by the stream
*/
/**
* \brief Create buffers for the stream
* \param[in] count The number of buffers to create
* \param[in] memory The stream memory type
*
* Create \a count empty buffers in the Stream's buffer pool.
*/
void Stream::createBuffers(unsigned int count)
void Stream::createBuffers(MemoryType memory, unsigned int count)
{
destroyBuffers();
if (count == 0)
return;
memoryType_ = memory;
bufferPool_.createBuffers(count);
}
@ -497,4 +521,9 @@ void Stream::destroyBuffers()
* next call to Camera::configure() regardless of if it includes the stream.
*/
/**
* \var Stream::memoryType_
* \brief The stream memory type
*/
} /* namespace libcamera */