summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp60
-rw-r--r--src/libcamera/pipeline/raspberrypi/rpi_stream.cpp14
-rw-r--r--src/libcamera/pipeline/raspberrypi/rpi_stream.h2
3 files changed, 40 insertions, 36 deletions
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 3caf3655..7d91188c 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -890,7 +890,8 @@ int PipelineHandlerRPi::queueAllBuffers(Camera *camera)
int PipelineHandlerRPi::prepareBuffers(Camera *camera)
{
RPiCameraData *data = cameraData(camera);
- int count, ret;
+ unsigned int index;
+ int ret;
/*
* Decide how many internal buffers to allocate. For now, simply look
@@ -910,30 +911,24 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
}
/*
- * Add cookies to the ISP Input buffers so that we can link them with
- * the IPA and RPI_IPA_EVENT_SIGNAL_ISP_PREPARE event.
- */
- count = 0;
- for (auto const &b : data->unicam_[Unicam::Image].getBuffers()) {
- b->setCookie(count++);
- }
-
- /*
- * Add cookies to the stats and embedded data buffers and link them with
- * the IPA.
+ * Link the FrameBuffers with the index of their position in the vector
+ * stored in the RPi stream object.
+ *
+ * This will allow us to identify buffers passed between the pipeline
+ * handler and the IPA.
*/
- count = 0;
+ index = 0;
for (auto const &b : data->isp_[Isp::Stats].getBuffers()) {
- b->setCookie(count++);
- data->ipaBuffers_.push_back({ .id = RPiIpaMask::STATS | b->cookie(),
+ data->ipaBuffers_.push_back({ .id = RPiIpaMask::STATS | index,
.planes = b->planes() });
+ index++;
}
- count = 0;
+ index = 0;
for (auto const &b : data->unicam_[Unicam::Embedded].getBuffers()) {
- b->setCookie(count++);
- data->ipaBuffers_.push_back({ .id = RPiIpaMask::EMBEDDED_DATA | b->cookie(),
+ data->ipaBuffers_.push_back({ .id = RPiIpaMask::EMBEDDED_DATA | index,
.planes = b->planes() });
+ index++;
}
data->ipa_->mapBuffers(data->ipaBuffers_);
@@ -1106,7 +1101,7 @@ void RPiCameraData::queueFrameAction([[maybe_unused]] unsigned int frame,
unsigned int bufferId = action.data[0];
FrameBuffer *buffer = unicam_[Unicam::Image].getBuffers().at(bufferId);
- LOG(RPI, Debug) << "Input re-queue to ISP, buffer id " << buffer->cookie()
+ LOG(RPI, Debug) << "Input re-queue to ISP, buffer id " << bufferId
<< ", timestamp: " << buffer->metadata().timestamp;
isp_[Isp::Input].queueBuffer(buffer);
@@ -1126,12 +1121,14 @@ done:
void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
{
RPi::RPiStream *stream = nullptr;
+ int index;
if (state_ == State::Stopped)
return;
for (RPi::RPiStream &s : unicam_) {
- if (s.findFrameBuffer(buffer)) {
+ index = s.getBufferIndex(buffer);
+ if (index != -1) {
stream = &s;
break;
}
@@ -1141,7 +1138,7 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
ASSERT(stream);
LOG(RPI, Debug) << "Stream " << stream->name() << " buffer dequeue"
- << ", buffer id " << buffer->cookie()
+ << ", buffer id " << index
<< ", timestamp: " << buffer->metadata().timestamp;
if (stream == &unicam_[Unicam::Image]) {
@@ -1181,7 +1178,7 @@ void RPiCameraData::ispInputDequeue(FrameBuffer *buffer)
return;
LOG(RPI, Debug) << "Stream ISP Input buffer complete"
- << ", buffer id " << buffer->cookie()
+ << ", buffer id " << unicam_[Unicam::Image].getBufferIndex(buffer)
<< ", timestamp: " << buffer->metadata().timestamp;
/* The ISP input buffer gets re-queued into Unicam. */
@@ -1192,12 +1189,14 @@ void RPiCameraData::ispInputDequeue(FrameBuffer *buffer)
void RPiCameraData::ispOutputDequeue(FrameBuffer *buffer)
{
RPi::RPiStream *stream = nullptr;
+ int index;
if (state_ == State::Stopped)
return;
for (RPi::RPiStream &s : isp_) {
- if (s.findFrameBuffer(buffer)) {
+ index = s.getBufferIndex(buffer);
+ if (index != -1) {
stream = &s;
break;
}
@@ -1207,7 +1206,7 @@ void RPiCameraData::ispOutputDequeue(FrameBuffer *buffer)
ASSERT(stream);
LOG(RPI, Debug) << "Stream " << stream->name() << " buffer complete"
- << ", buffer id " << buffer->cookie()
+ << ", buffer id " << index
<< ", timestamp: " << buffer->metadata().timestamp;
/*
@@ -1217,7 +1216,7 @@ void RPiCameraData::ispOutputDequeue(FrameBuffer *buffer)
if (stream == &isp_[Isp::Stats]) {
IPAOperationData op;
op.operation = RPI_IPA_EVENT_SIGNAL_STAT_READY;
- op.data = { RPiIpaMask::STATS | buffer->cookie() };
+ op.data = { RPiIpaMask::STATS | static_cast<unsigned int>(index) };
ipa_->processEvent(op);
} else {
/* Any other ISP output can be handed back to the application now. */
@@ -1437,13 +1436,16 @@ void RPiCameraData::tryRunPipeline()
/* Set our state to say the pipeline is active. */
state_ = State::Busy;
+ unsigned int bayerIndex = unicam_[Unicam::Image].getBufferIndex(bayerBuffer);
+ unsigned int embeddedIndex = unicam_[Unicam::Embedded].getBufferIndex(embeddedBuffer);
+
LOG(RPI, Debug) << "Signalling RPI_IPA_EVENT_SIGNAL_ISP_PREPARE:"
- << " Bayer buffer id: " << bayerBuffer->cookie()
- << " Embedded buffer id: " << embeddedBuffer->cookie();
+ << " Bayer buffer id: " << bayerIndex
+ << " Embedded buffer id: " << embeddedIndex;
op.operation = RPI_IPA_EVENT_SIGNAL_ISP_PREPARE;
- op.data = { RPiIpaMask::EMBEDDED_DATA | embeddedBuffer->cookie(),
- RPiIpaMask::BAYER_DATA | bayerBuffer->cookie() };
+ op.data = { RPiIpaMask::EMBEDDED_DATA | embeddedIndex,
+ RPiIpaMask::BAYER_DATA | bayerIndex };
ipa_->processEvent(op);
}
diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
index b2a5dfa7..80170d64 100644
--- a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
+++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp
@@ -53,15 +53,17 @@ const std::vector<FrameBuffer *> &RPiStream::getBuffers() const
return bufferList_;
}
-bool RPiStream::findFrameBuffer(FrameBuffer *buffer) const
+int RPiStream::getBufferIndex(FrameBuffer *buffer) const
{
if (importOnly_)
- return false;
+ return -1;
- if (std::find(bufferList_.begin(), bufferList_.end(), buffer) != bufferList_.end())
- return true;
+ /* Find the buffer in the list, and return the index position. */
+ auto it = std::find(bufferList_.begin(), bufferList_.end(), buffer);
+ if (it != bufferList_.end())
+ return std::distance(bufferList_.begin(), it);
- return false;
+ return -1;
}
int RPiStream::prepareBuffers(unsigned int count)
@@ -199,7 +201,7 @@ void RPiStream::clearBuffers()
int RPiStream::queueToDevice(FrameBuffer *buffer)
{
- LOG(RPISTREAM, Debug) << "Queuing buffer " << buffer->cookie()
+ LOG(RPISTREAM, Debug) << "Queuing buffer " << getBufferIndex(buffer)
<< " for " << name_;
int ret = dev_->queueBuffer(buffer);
diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.h b/src/libcamera/pipeline/raspberrypi/rpi_stream.h
index f42e25b9..959e9147 100644
--- a/src/libcamera/pipeline/raspberrypi/rpi_stream.h
+++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.h
@@ -46,7 +46,7 @@ public:
void setExportedBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers);
const std::vector<FrameBuffer *> &getBuffers() const;
- bool findFrameBuffer(FrameBuffer *buffer) const;
+ int getBufferIndex(FrameBuffer *buffer) const;
int prepareBuffers(unsigned int count);
int queueBuffer(FrameBuffer *buffer);