pipeline: raspberrypi: Add stream flags to RPi::Stream

Add a flags_ field to indicate stream state information in RPi::Stream.
This replaces the existing external_ and importOnly_ boolean flags.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-05-03 13:20:35 +01:00 committed by Laurent Pinchart
parent 6c71ee1f15
commit 0fbf6b57a7
4 changed files with 60 additions and 38 deletions

View file

@ -31,6 +31,8 @@ using namespace RPi;
LOG_DEFINE_CATEGORY(RPI) LOG_DEFINE_CATEGORY(RPI)
using StreamFlag = RPi::Stream::StreamFlag;
namespace { namespace {
constexpr unsigned int defaultRawBitDepth = 12; constexpr unsigned int defaultRawBitDepth = 12;
@ -504,7 +506,7 @@ int PipelineHandlerBase::configure(Camera *camera, CameraConfiguration *config)
/* Start by freeing all buffers and reset the stream states. */ /* Start by freeing all buffers and reset the stream states. */
data->freeBuffers(); data->freeBuffers();
for (auto const stream : data->streams_) for (auto const stream : data->streams_)
stream->setExternal(false); stream->clearFlags(StreamFlag::External);
std::vector<CameraData::StreamParams> rawStreams, ispStreams; std::vector<CameraData::StreamParams> rawStreams, ispStreams;
std::optional<BayerFormat::Packing> packing; std::optional<BayerFormat::Packing> packing;
@ -752,7 +754,7 @@ int PipelineHandlerBase::queueRequestDevice(Camera *camera, Request *request)
/* Push all buffers supplied in the Request to the respective streams. */ /* Push all buffers supplied in the Request to the respective streams. */
for (auto stream : data->streams_) { for (auto stream : data->streams_) {
if (!stream->isExternal()) if (!(stream->getFlags() & StreamFlag::External))
continue; continue;
FrameBuffer *buffer = request->findBuffer(stream); FrameBuffer *buffer = request->findBuffer(stream);
@ -932,7 +934,7 @@ int PipelineHandlerBase::queueAllBuffers(Camera *camera)
int ret; int ret;
for (auto const stream : data->streams_) { for (auto const stream : data->streams_) {
if (!stream->isExternal()) { if (!(stream->getFlags() & StreamFlag::External)) {
ret = stream->queueAllBuffers(); ret = stream->queueAllBuffers();
if (ret < 0) if (ret < 0)
return ret; return ret;

View file

@ -14,6 +14,24 @@ LOG_DEFINE_CATEGORY(RPISTREAM)
namespace RPi { namespace RPi {
void Stream::setFlags(StreamFlags flags)
{
flags_ |= flags;
/* Import streams cannot be external. */
ASSERT(!(flags_ & StreamFlag::External) || !(flags_ & StreamFlag::ImportOnly));
}
void Stream::clearFlags(StreamFlags flags)
{
flags_ &= ~flags;
}
RPi::Stream::StreamFlags Stream::getFlags() const
{
return flags_;
}
V4L2VideoDevice *Stream::dev() const V4L2VideoDevice *Stream::dev() const
{ {
return dev_.get(); return dev_.get();
@ -32,18 +50,6 @@ void Stream::resetBuffers()
availableBuffers_.push(buffer.get()); availableBuffers_.push(buffer.get());
} }
void Stream::setExternal(bool external)
{
/* Import streams cannot be external. */
ASSERT(!external || !importOnly_);
external_ = external;
}
bool Stream::isExternal() const
{
return external_;
}
void Stream::setExportedBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers) void Stream::setExportedBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers)
{ {
for (auto const &buffer : *buffers) for (auto const &buffer : *buffers)
@ -57,7 +63,7 @@ const BufferMap &Stream::getBuffers() const
unsigned int Stream::getBufferId(FrameBuffer *buffer) const unsigned int Stream::getBufferId(FrameBuffer *buffer) const
{ {
if (importOnly_) if (flags_ & StreamFlag::ImportOnly)
return 0; return 0;
/* Find the buffer in the map, and return the buffer id. */ /* Find the buffer in the map, and return the buffer id. */
@ -88,7 +94,7 @@ int Stream::prepareBuffers(unsigned int count)
{ {
int ret; int ret;
if (!importOnly_) { if (!(flags_ & StreamFlag::ImportOnly)) {
if (count) { if (count) {
/* Export some frame buffers for internal use. */ /* Export some frame buffers for internal use. */
ret = dev_->exportBuffers(count, &internalBuffers_); ret = dev_->exportBuffers(count, &internalBuffers_);
@ -113,7 +119,7 @@ int Stream::prepareBuffers(unsigned int count)
* \todo Find a better heuristic, or, even better, an exact solution to * \todo Find a better heuristic, or, even better, an exact solution to
* this issue. * this issue.
*/ */
if (isExternal() || importOnly_) if ((flags_ & StreamFlag::External) || (flags_ & StreamFlag::ImportOnly))
count = count * 2; count = count * 2;
return dev_->importBuffers(count); return dev_->importBuffers(count);
@ -160,7 +166,7 @@ int Stream::queueBuffer(FrameBuffer *buffer)
void Stream::returnBuffer(FrameBuffer *buffer) void Stream::returnBuffer(FrameBuffer *buffer)
{ {
if (!external_) { if (!(flags_ & StreamFlag::External)) {
/* For internal buffers, simply requeue back to the device. */ /* For internal buffers, simply requeue back to the device. */
queueToDevice(buffer); queueToDevice(buffer);
return; return;
@ -204,7 +210,7 @@ int Stream::queueAllBuffers()
{ {
int ret; int ret;
if (external_) if (flags_ & StreamFlag::External)
return 0; return 0;
while (!availableBuffers_.empty()) { while (!availableBuffers_.empty()) {

View file

@ -12,6 +12,7 @@
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
#include <libcamera/base/flags.h>
#include <libcamera/stream.h> #include <libcamera/stream.h>
#include "libcamera/internal/v4l2_videodevice.h" #include "libcamera/internal/v4l2_videodevice.h"
@ -37,25 +38,41 @@ enum BufferMask {
class Stream : public libcamera::Stream class Stream : public libcamera::Stream
{ {
public: public:
enum class StreamFlag {
None = 0,
/*
* Indicates that this stream only imports buffers, e.g. the ISP
* input stream.
*/
ImportOnly = (1 << 0),
/*
* Indicates that this stream is active externally, i.e. the
* buffers might be provided by (and returned to) the application.
*/
External = (1 << 1),
};
using StreamFlags = Flags<StreamFlag>;
Stream() Stream()
: id_(BufferMask::MaskID) : flags_(StreamFlag::None), id_(BufferMask::MaskID)
{ {
} }
Stream(const char *name, MediaEntity *dev, bool importOnly = false) Stream(const char *name, MediaEntity *dev, StreamFlags flags = StreamFlag::None)
: external_(false), importOnly_(importOnly), name_(name), : flags_(flags), name_(name),
dev_(std::make_unique<V4L2VideoDevice>(dev)), id_(BufferMask::MaskID) dev_(std::make_unique<V4L2VideoDevice>(dev)), id_(BufferMask::MaskID)
{ {
} }
void setFlags(StreamFlags flags);
void clearFlags(StreamFlags flags);
StreamFlags getFlags() const;
V4L2VideoDevice *dev() const; V4L2VideoDevice *dev() const;
const std::string &name() const; const std::string &name() const;
bool isImporter() const;
void resetBuffers(); void resetBuffers();
void setExternal(bool external);
bool isExternal() const;
void setExportedBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers); void setExportedBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers);
const BufferMap &getBuffers() const; const BufferMap &getBuffers() const;
unsigned int getBufferId(FrameBuffer *buffer) const; unsigned int getBufferId(FrameBuffer *buffer) const;
@ -112,14 +129,7 @@ private:
void clearBuffers(); void clearBuffers();
int queueToDevice(FrameBuffer *buffer); int queueToDevice(FrameBuffer *buffer);
/* StreamFlags flags_;
* Indicates that this stream is active externally, i.e. the buffers
* might be provided by (and returned to) the application.
*/
bool external_;
/* Indicates that this stream only imports buffers, e.g. ISP input. */
bool importOnly_;
/* Stream name identifier. */ /* Stream name identifier. */
std::string name_; std::string name_;
@ -182,4 +192,6 @@ public:
} /* namespace RPi */ } /* namespace RPi */
LIBCAMERA_FLAGS_ENABLE_OPERATORS(RPi::Stream::StreamFlag)
} /* namespace libcamera */ } /* namespace libcamera */

View file

@ -24,6 +24,8 @@ namespace libcamera {
LOG_DECLARE_CATEGORY(RPI) LOG_DECLARE_CATEGORY(RPI)
using StreamFlag = RPi::Stream::StreamFlag;
namespace { namespace {
enum class Unicam : unsigned int { Image, Embedded }; enum class Unicam : unsigned int { Image, Embedded };
@ -318,7 +320,7 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr<RPi::CameraData> &camer
} }
/* Tag the ISP input stream as an import stream. */ /* Tag the ISP input stream as an import stream. */
data->isp_[Isp::Input] = RPi::Stream("ISP Input", ispOutput0, true); data->isp_[Isp::Input] = RPi::Stream("ISP Input", ispOutput0, StreamFlag::ImportOnly);
data->isp_[Isp::Output0] = RPi::Stream("ISP Output0", ispCapture1); data->isp_[Isp::Output0] = RPi::Stream("ISP Output0", ispCapture1);
data->isp_[Isp::Output1] = RPi::Stream("ISP Output1", ispCapture2); data->isp_[Isp::Output1] = RPi::Stream("ISP Output1", ispCapture2);
data->isp_[Isp::Stats] = RPi::Stream("ISP Stats", ispCapture3); data->isp_[Isp::Stats] = RPi::Stream("ISP Stats", ispCapture3);
@ -500,7 +502,7 @@ int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
*/ */
if (!rawStreams.empty()) { if (!rawStreams.empty()) {
rawStreams[0].cfg->setStream(&unicam_[Unicam::Image]); rawStreams[0].cfg->setStream(&unicam_[Unicam::Image]);
unicam_[Unicam::Image].setExternal(true); unicam_[Unicam::Image].setFlags(StreamFlag::External);
} }
ret = isp_[Isp::Input].dev()->setFormat(&unicamFormat); ret = isp_[Isp::Input].dev()->setFormat(&unicamFormat);
@ -545,7 +547,7 @@ int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
<< ColorSpace::toString(cfg->colorSpace); << ColorSpace::toString(cfg->colorSpace);
cfg->setStream(stream); cfg->setStream(stream);
stream->setExternal(true); stream->setFlags(StreamFlag::External);
} }
ispOutputTotal_ = outStreams.size(); ispOutputTotal_ = outStreams.size();