@@ -1400,12 +1400,18 @@ code-base.
void VividCameraData::bufferReady(FrameBuffer *buffer)
{
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
pipe_->completeBuffer(request, buffer);
pipe_->completeRequest(request);
}
+The following new include statements are needed for the above:
+
+.. code-block:: cpp
+
+ #include "libcamera/internal/framebuffer.h"
+
Testing a pipeline handler
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -63,7 +63,6 @@ public:
virtual ~FrameBuffer() {}
Span<const Plane> planes() const;
- Request *request() const;
const FrameMetadata &metadata() const;
uint64_t cookie() const;
@@ -27,7 +27,9 @@ public:
Private(Span<const Plane> planes, uint64_t cookie = 0);
virtual ~Private();
+ Request *request() const { return request_; }
void setRequest(Request *request) { request_ = request; }
+
bool isContiguous() const { return isContiguous_; }
Fence *fence() const { return fence_.get(); }
@@ -144,6 +144,21 @@ FrameBuffer::Private::~Private()
{
}
+/**
+ * \fn FrameBuffer::Private::request()
+ * \brief Retrieve the request this buffer belongs to
+ *
+ * The intended callers of this function are buffer completion handlers that
+ * need to associate a buffer to the request it belongs to.
+ *
+ * A FrameBuffer is associated to a request by Request::addBuffer() and the
+ * association is valid until the buffer completes. The returned request
+ * pointer is valid only during that interval.
+ *
+ * \return The Request the FrameBuffer belongs to, or nullptr if the buffer is
+ * not associated with a request
+ */
+
/**
* \fn FrameBuffer::Private::setRequest()
* \brief Set the request this buffer belongs to
@@ -364,24 +379,6 @@ Span<const FrameBuffer::Plane> FrameBuffer::planes() const
return _d()->planes_;
}
-/**
- * \brief Retrieve the request this buffer belongs to
- *
- * The intended callers of this function are buffer completion handlers that
- * need to associate a buffer to the request it belongs to.
- *
- * A FrameBuffer is associated to a request by Request::addBuffer() and the
- * association is valid until the buffer completes. The returned request
- * pointer is valid only during that interval.
- *
- * \return The Request the FrameBuffer belongs to, or nullptr if the buffer is
- * not associated with a request
- */
-Request *FrameBuffer::request() const
-{
- return _d()->request_;
-}
-
/**
* \brief Retrieve the dynamic metadata
* \return Dynamic metadata for the frame contained in the buffer
@@ -24,6 +24,7 @@
#include "libcamera/internal/camera.h"
#include "libcamera/internal/camera_sensor.h"
#include "libcamera/internal/device_enumerator.h"
+#include "libcamera/internal/framebuffer.h"
#include "libcamera/internal/media_device.h"
#include "libcamera/internal/media_pipeline.h"
#include "libcamera/internal/pipeline_handler.h"
@@ -1124,7 +1125,7 @@ PipelineHandlerISI::Pipe *PipelineHandlerISI::pipeFromStream(ISICameraData *data
void PipelineHandlerISI::bufferReady(FrameBuffer *buffer)
{
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
/* Record the sensor's timestamp in the request metadata. */
ControlList &metadata = request->_d()->metadata();
@@ -1649,7 +1649,7 @@ void PipelineHandlerMaliC55::tryComplete(MaliC55FrameInfo *info, bool cancelled)
void PipelineHandlerMaliC55::imageBufferReady(FrameBuffer *buffer)
{
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
MaliC55FrameInfo *info = findFrameInfo(request);
ASSERT(info);
@@ -1695,9 +1695,9 @@ void PipelineHandlerRkISP1::dewarpBufferReady(FrameBuffer *buffer)
{
ASSERT(activeCamera_);
RkISP1CameraData *data = cameraData(activeCamera_);
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
- RkISP1FrameInfo *info = data->frameInfo_.find(buffer->request());
+ RkISP1FrameInfo *info = data->frameInfo_.find(request);
if (!info)
return;
@@ -40,6 +40,7 @@
#include "libcamera/internal/delayed_controls.h"
#include "libcamera/internal/device_enumerator.h"
#include "libcamera/internal/formats.h"
+#include "libcamera/internal/framebuffer.h"
#include "libcamera/internal/global_configuration.h"
#include "libcamera/internal/media_device.h"
#include "libcamera/internal/pipeline_handler.h"
@@ -887,7 +888,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
if (buffer->metadata().status != FrameMetadata::FrameSuccess) {
if (!useConversion_ || rawStream_) {
/* No conversion, just complete the request. */
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
pipe->completeBuffer(request, buffer);
SimpleFrameInfo *info = frameInfo_.find(request->sequence());
if (info)
@@ -927,7 +928,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
* \todo The sensor timestamp should be better estimated by connecting
* to the V4L2Device::frameStart signal if the platform provides it.
*/
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
if (useConversion_ && !conversionQueue_.empty()) {
const std::map<const Stream *, FrameBuffer *> &outputs =
@@ -935,7 +936,7 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
if (!outputs.empty()) {
FrameBuffer *outputBuffer = outputs.begin()->second;
if (outputBuffer)
- request = outputBuffer->request();
+ request = outputBuffer->_d()->request();
}
}
@@ -960,8 +961,8 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
else
/*
* request->sequence() cannot be retrieved from `buffer' inside
- * queueBuffers because unique_ptr's make buffer->request() invalid
- * already here.
+ * queueBuffers because unique_ptr's make buffer->_d()->request()
+ * invalid already here.
*/
swIsp_->queueBuffers(request->sequence(), buffer,
conversionQueue_.front().outputs);
@@ -1005,7 +1006,7 @@ void SimpleCameraData::conversionInputDone(FrameBuffer *buffer)
{
if (rawStream_) {
/* Complete the input buffer as with raw-only processing. */
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
if (pipe()->completeBuffer(request, buffer))
tryCompleteRequest(request);
} else {
@@ -1019,7 +1020,7 @@ void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)
SimplePipelineHandler *pipe = SimpleCameraData::pipe();
/* Complete the buffer and the request. */
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
if (pipe->completeBuffer(request, buffer))
tryCompleteRequest(request);
}
@@ -28,6 +28,7 @@
#include "libcamera/internal/camera.h"
#include "libcamera/internal/device_enumerator.h"
+#include "libcamera/internal/framebuffer.h"
#include "libcamera/internal/media_device.h"
#include "libcamera/internal/pipeline_handler.h"
#include "libcamera/internal/request.h"
@@ -892,7 +893,7 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
void UVCCameraData::imageBufferReady(FrameBuffer *buffer)
{
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
/* \todo Use the UVC metadata to calculate a more precise timestamp */
request->_d()->metadata().set(controls::SensorTimestamp,
@@ -601,7 +601,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer)
{
PipelineHandlerVimc *pipe =
static_cast<PipelineHandlerVimc *>(this->pipe());
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
/* If the buffer is cancelled force a complete of the whole request. */
if (buffer->metadata().status == FrameMetadata::FrameCancelled) {
@@ -452,7 +452,7 @@ bool PipelineHandlerVirtual::initFrameGenerator(Camera *camera)
void PipelineHandlerVirtual::bufferCompleted(FrameBuffer *buffer)
{
- Request *request = buffer->request();
+ Request *request = buffer->_d()->request();
if (completeBuffer(request, buffer))
completeRequest(request);
The `request()` is of not much interest to normal applications, mainly because the request-buffer association is removed when the buffer completes. Therefore the only place where this can actually be used is in the `bufferCompleted` signal, but the request is already provided there by other means. So move the function into the associated `Private` type. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> --- Documentation/guides/pipeline-handler.rst | 8 ++++- include/libcamera/framebuffer.h | 1 - include/libcamera/internal/framebuffer.h | 2 ++ src/libcamera/framebuffer.cpp | 33 +++++++++----------- src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 3 +- src/libcamera/pipeline/mali-c55/mali-c55.cpp | 2 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 +-- src/libcamera/pipeline/simple/simple.cpp | 15 ++++----- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 3 +- src/libcamera/pipeline/vimc/vimc.cpp | 2 +- src/libcamera/pipeline/virtual/virtual.cpp | 2 +- 11 files changed, 41 insertions(+), 34 deletions(-)