@@ -124,7 +124,7 @@ public:
const std::string &id() const;
- Signal<Request *, FrameBuffer *> bufferCompleted;
+ Signal<Request *, const Stream *, FrameBuffer *> bufferCompleted;
Signal<Request *> requestCompleted;
Signal<> disconnected;
@@ -800,12 +800,14 @@ Camera::Private::acquireBuffer(const Stream *stream)
*/
void Camera::Private::rejectBuffer(FrameBuffer *buffer)
{
+ const Stream *stream = buffer->_d()->stream_;
+
ASSERT(!buffer->_d()->request());
- ASSERT(buffer->_d()->stream_);
+ ASSERT(stream);
LOG(Camera, Debug)
<< "Camera:" << LIBCAMERA_O_PTR() << " rejects buffer:"
- << buffer << " for stream:" << buffer->_d()->stream_;
+ << buffer << " for stream:" << stream;
/*
* \todo Not `FrameError` because that requires `timestamp` and
@@ -814,8 +816,8 @@ void Camera::Private::rejectBuffer(FrameBuffer *buffer)
buffer->_d()->cancel();
buffer->_d()->stream_ = nullptr;
- // \todo separate event (with stream) ?
- LIBCAMERA_O_PTR()->bufferCompleted.emit(nullptr, buffer);
+ // \todo separate event?
+ LIBCAMERA_O_PTR()->bufferCompleted.emit(nullptr, stream, buffer);
}
/**
@@ -421,20 +421,20 @@ void PipelineHandler::stop(Camera *camera)
doQueueRequest(request);
}
- const auto returnBuffer = [&](FrameBuffer *buffer) {
+ const auto returnBuffer = [&](const Stream *stream, FrameBuffer *buffer) {
ASSERT(!buffer->_d()->stream_);
buffer->_d()->cancel();
- camera->bufferCompleted.emit(nullptr, buffer);
+ camera->bufferCompleted.emit(nullptr, stream, buffer);
};
for (auto &pf : data->pendingFences_)
- returnBuffer(pf.buffer);
+ returnBuffer(pf.stream, pf.buffer);
data->pendingFences_.clear();
for (auto &[stream, streamData] : data->streamData_) {
for (FrameBuffer *buffer : streamData.buffers)
- returnBuffer(buffer);
+ returnBuffer(stream, buffer);
streamData.buffers.clear();
}
@@ -108,7 +108,8 @@ bool Request::Private::completeBuffer(FrameBuffer *buffer)
LIBCAMERA_TRACEPOINT(request_complete_buffer, this, buffer);
Request *request = LIBCAMERA_O_PTR();
- auto it = request->bufferMap_.find(buffer->_d()->stream_);
+ const Stream *stream = buffer->_d()->stream_;
+ auto it = request->bufferMap_.find(stream);
ASSERT(it != request->bufferMap_.end());
ASSERT(it->second == buffer || !it->second);
@@ -122,7 +123,7 @@ bool Request::Private::completeBuffer(FrameBuffer *buffer)
if (buffer->metadata().status == FrameMetadata::FrameCancelled)
cancelled_ = true;
- camera_->bufferCompleted.emit(request, buffer);
+ camera_->bufferCompleted.emit(request, stream, buffer);
return !hasPendingBuffers();
}
@@ -39,6 +39,7 @@ public:
protected:
void bufferComplete([[maybe_unused]] Request *request,
+ [[maybe_unused]] const Stream *stream,
FrameBuffer *buffer)
{
if (buffer->metadata().status != FrameMetadata::FrameSuccess)
@@ -35,6 +35,7 @@ protected:
unsigned int completeRequestsCount_;
void bufferComplete([[maybe_unused]] Request *request,
+ [[maybe_unused]] const Stream *stream,
FrameBuffer *buffer)
{
if (buffer->metadata().status != FrameMetadata::FrameSuccess)
Provide information about which stream the just completed buffer belongs to. This makes it easier for applications to know how to process the request, since they do not need to have a buffer -> stream mapping or a series of `request->findBuffer(stream) == buffer` conditions. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> --- include/libcamera/camera.h | 2 +- src/libcamera/camera.cpp | 10 ++++++---- src/libcamera/pipeline_handler.cpp | 8 ++++---- src/libcamera/request.cpp | 5 +++-- test/camera/buffer_import.cpp | 1 + test/camera/capture.cpp | 1 + 6 files changed, 16 insertions(+), 11 deletions(-)