libcamera: request: In addBuffer() do not fetch stream from Buffer

In the FrameBuffer interface the stream will not be available from the
buffer object as the buffer might be allocated externally. The
application needs to explicitly state which stream the buffer is being
added for to the request.

Extend the addBuffer() function to get this information explicitly from
the caller.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2019-11-22 17:31:08 +01:00
parent 13724144f9
commit dea689e1f2
9 changed files with 13 additions and 13 deletions

View file

@ -39,7 +39,7 @@ public:
ControlList &controls() { return *controls_; }
ControlList &metadata() { return *metadata_; }
const std::map<Stream *, Buffer *> &buffers() const { return bufferMap_; }
int addBuffer(std::unique_ptr<Buffer> buffer);
int addBuffer(Stream *stream, std::unique_ptr<Buffer> buffer);
Buffer *findBuffer(Stream *stream) const;
uint64_t cookie() const { return cookie_; }

View file

@ -754,7 +754,7 @@ void CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reque
Request *request =
camera_->createRequest(reinterpret_cast<uint64_t>(descriptor));
request->addBuffer(std::move(buffer));
request->addBuffer(stream, std::move(buffer));
int ret = camera_->queueRequest(request);
if (ret) {

View file

@ -95,7 +95,7 @@ int Capture::capture(EventLoop *loop)
Stream *stream = cfg.stream();
std::unique_ptr<Buffer> buffer = stream->createBuffer(i);
ret = request->addBuffer(std::move(buffer));
ret = request->addBuffer(stream, std::move(buffer));
if (ret < 0) {
std::cerr << "Can't set buffer for request"
<< std::endl;
@ -185,7 +185,7 @@ void Capture::requestComplete(Request *request)
return;
}
request->addBuffer(std::move(newBuffer));
request->addBuffer(stream, std::move(newBuffer));
}
camera_->queueRequest(request);

View file

@ -113,6 +113,7 @@ Request::~Request()
/**
* \brief Store a Buffer with its associated Stream in the Request
* \param[in] stream The stream the buffer belongs to
* \param[in] buffer The Buffer to store in the request
*
* Ownership of the buffer is passed to the request. It will be deleted when
@ -125,9 +126,8 @@ Request::~Request()
* \retval -EEXIST The request already contains a buffer for the stream
* \retval -EINVAL The buffer does not reference a valid Stream
*/
int Request::addBuffer(std::unique_ptr<Buffer> buffer)
int Request::addBuffer(Stream *stream, std::unique_ptr<Buffer> buffer)
{
Stream *stream = buffer->stream();
if (!stream) {
LOG(Request, Error) << "Invalid stream reference";
return -EINVAL;

View file

@ -191,7 +191,7 @@ int MainWindow::startCapture()
goto error;
}
ret = request->addBuffer(std::move(buffer));
ret = request->addBuffer(stream, std::move(buffer));
if (ret < 0) {
std::cerr << "Can't set buffer for request" << std::endl;
goto error;
@ -289,7 +289,7 @@ void MainWindow::requestComplete(Request *request)
return;
}
request->addBuffer(std::move(newBuffer));
request->addBuffer(stream, std::move(newBuffer));
}
camera_->queueRequest(request);

View file

@ -192,7 +192,7 @@ int V4L2Camera::qbuf(unsigned int index)
return -ENOMEM;
}
int ret = request->addBuffer(std::move(buffer));
int ret = request->addBuffer(stream, std::move(buffer));
if (ret < 0) {
LOG(V4L2Compat, Error) << "Can't set buffer for request";
return -ENOMEM;

View file

@ -268,7 +268,7 @@ public:
Request *request = camera_->createRequest(cookie);
std::unique_ptr<Buffer> buffer = stream_->createBuffer({ dmabuf, -1, -1 });
request->addBuffer(move(buffer));
request->addBuffer(stream_, move(buffer));
camera_->queueRequest(request);
}

View file

@ -49,7 +49,7 @@ protected:
std::unique_ptr<Buffer> newBuffer = stream->createBuffer(buffer->index());
request = camera_->createRequest();
request->addBuffer(std::move(newBuffer));
request->addBuffer(stream, std::move(newBuffer));
camera_->queueRequest(request);
}
@ -101,7 +101,7 @@ protected:
return TestFail;
}
if (request->addBuffer(std::move(buffer))) {
if (request->addBuffer(stream, std::move(buffer))) {
cout << "Failed to associating buffer with request" << endl;
return TestFail;
}

View file

@ -219,7 +219,7 @@ protected:
Stream *stream = *camera_->streams().begin();
std::unique_ptr<Buffer> buffer = stream->createBuffer(0);
if (request->addBuffer(std::move(buffer)))
if (request->addBuffer(stream, std::move(buffer)))
return TestFail;
if (camera_->queueRequest(request))