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:
parent
6c71ee1f15
commit
0fbf6b57a7
4 changed files with 60 additions and 38 deletions
|
@ -31,6 +31,8 @@ using namespace RPi;
|
|||
|
||||
LOG_DEFINE_CATEGORY(RPI)
|
||||
|
||||
using StreamFlag = RPi::Stream::StreamFlag;
|
||||
|
||||
namespace {
|
||||
|
||||
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. */
|
||||
data->freeBuffers();
|
||||
for (auto const stream : data->streams_)
|
||||
stream->setExternal(false);
|
||||
stream->clearFlags(StreamFlag::External);
|
||||
|
||||
std::vector<CameraData::StreamParams> rawStreams, ispStreams;
|
||||
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. */
|
||||
for (auto stream : data->streams_) {
|
||||
if (!stream->isExternal())
|
||||
if (!(stream->getFlags() & StreamFlag::External))
|
||||
continue;
|
||||
|
||||
FrameBuffer *buffer = request->findBuffer(stream);
|
||||
|
@ -932,7 +934,7 @@ int PipelineHandlerBase::queueAllBuffers(Camera *camera)
|
|||
int ret;
|
||||
|
||||
for (auto const stream : data->streams_) {
|
||||
if (!stream->isExternal()) {
|
||||
if (!(stream->getFlags() & StreamFlag::External)) {
|
||||
ret = stream->queueAllBuffers();
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -14,6 +14,24 @@ LOG_DEFINE_CATEGORY(RPISTREAM)
|
|||
|
||||
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
|
||||
{
|
||||
return dev_.get();
|
||||
|
@ -32,18 +50,6 @@ void Stream::resetBuffers()
|
|||
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)
|
||||
{
|
||||
for (auto const &buffer : *buffers)
|
||||
|
@ -57,7 +63,7 @@ const BufferMap &Stream::getBuffers() const
|
|||
|
||||
unsigned int Stream::getBufferId(FrameBuffer *buffer) const
|
||||
{
|
||||
if (importOnly_)
|
||||
if (flags_ & StreamFlag::ImportOnly)
|
||||
return 0;
|
||||
|
||||
/* Find the buffer in the map, and return the buffer id. */
|
||||
|
@ -88,7 +94,7 @@ int Stream::prepareBuffers(unsigned int count)
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (!importOnly_) {
|
||||
if (!(flags_ & StreamFlag::ImportOnly)) {
|
||||
if (count) {
|
||||
/* Export some frame buffers for internal use. */
|
||||
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
|
||||
* this issue.
|
||||
*/
|
||||
if (isExternal() || importOnly_)
|
||||
if ((flags_ & StreamFlag::External) || (flags_ & StreamFlag::ImportOnly))
|
||||
count = count * 2;
|
||||
|
||||
return dev_->importBuffers(count);
|
||||
|
@ -160,7 +166,7 @@ int Stream::queueBuffer(FrameBuffer *buffer)
|
|||
|
||||
void Stream::returnBuffer(FrameBuffer *buffer)
|
||||
{
|
||||
if (!external_) {
|
||||
if (!(flags_ & StreamFlag::External)) {
|
||||
/* For internal buffers, simply requeue back to the device. */
|
||||
queueToDevice(buffer);
|
||||
return;
|
||||
|
@ -204,7 +210,7 @@ int Stream::queueAllBuffers()
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (external_)
|
||||
if (flags_ & StreamFlag::External)
|
||||
return 0;
|
||||
|
||||
while (!availableBuffers_.empty()) {
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include <libcamera/base/flags.h>
|
||||
#include <libcamera/stream.h>
|
||||
|
||||
#include "libcamera/internal/v4l2_videodevice.h"
|
||||
|
@ -37,25 +38,41 @@ enum BufferMask {
|
|||
class Stream : public libcamera::Stream
|
||||
{
|
||||
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()
|
||||
: id_(BufferMask::MaskID)
|
||||
: flags_(StreamFlag::None), id_(BufferMask::MaskID)
|
||||
{
|
||||
}
|
||||
|
||||
Stream(const char *name, MediaEntity *dev, bool importOnly = false)
|
||||
: external_(false), importOnly_(importOnly), name_(name),
|
||||
Stream(const char *name, MediaEntity *dev, StreamFlags flags = StreamFlag::None)
|
||||
: flags_(flags), name_(name),
|
||||
dev_(std::make_unique<V4L2VideoDevice>(dev)), id_(BufferMask::MaskID)
|
||||
{
|
||||
}
|
||||
|
||||
void setFlags(StreamFlags flags);
|
||||
void clearFlags(StreamFlags flags);
|
||||
StreamFlags getFlags() const;
|
||||
|
||||
V4L2VideoDevice *dev() const;
|
||||
const std::string &name() const;
|
||||
bool isImporter() const;
|
||||
void resetBuffers();
|
||||
|
||||
void setExternal(bool external);
|
||||
bool isExternal() const;
|
||||
|
||||
void setExportedBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers);
|
||||
const BufferMap &getBuffers() const;
|
||||
unsigned int getBufferId(FrameBuffer *buffer) const;
|
||||
|
@ -112,14 +129,7 @@ private:
|
|||
void clearBuffers();
|
||||
int queueToDevice(FrameBuffer *buffer);
|
||||
|
||||
/*
|
||||
* 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_;
|
||||
StreamFlags flags_;
|
||||
|
||||
/* Stream name identifier. */
|
||||
std::string name_;
|
||||
|
@ -182,4 +192,6 @@ public:
|
|||
|
||||
} /* namespace RPi */
|
||||
|
||||
LIBCAMERA_FLAGS_ENABLE_OPERATORS(RPi::Stream::StreamFlag)
|
||||
|
||||
} /* namespace libcamera */
|
||||
|
|
|
@ -24,6 +24,8 @@ namespace libcamera {
|
|||
|
||||
LOG_DECLARE_CATEGORY(RPI)
|
||||
|
||||
using StreamFlag = RPi::Stream::StreamFlag;
|
||||
|
||||
namespace {
|
||||
|
||||
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. */
|
||||
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::Output1] = RPi::Stream("ISP Output1", ispCapture2);
|
||||
data->isp_[Isp::Stats] = RPi::Stream("ISP Stats", ispCapture3);
|
||||
|
@ -500,7 +502,7 @@ int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
|
|||
*/
|
||||
if (!rawStreams.empty()) {
|
||||
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);
|
||||
|
@ -545,7 +547,7 @@ int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
|
|||
<< ColorSpace::toString(cfg->colorSpace);
|
||||
|
||||
cfg->setStream(stream);
|
||||
stream->setExternal(true);
|
||||
stream->setFlags(StreamFlag::External);
|
||||
}
|
||||
|
||||
ispOutputTotal_ = outStreams.size();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue