libcamera: pipeline: ipa: raspberrypi: Remove use of FrameBuffer cookie

The FrameBuffer cookie may be set by the application, so this cannot
be set by the pipeline handler as well. Revert to using a simple index
into the buffer list to identify buffers passing to and from the IPA.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Naushir Patuck
2020-09-18 10:42:30 +01:00
committed by Niklas Söderlund
parent b752c57c33
commit f22ffc0ebe
3 changed files with 40 additions and 36 deletions

View File

@@ -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.
* 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;
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.
*/
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);
}

View File

@@ -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);

View File

@@ -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);