spa: libcamera: source: persistent requests <-> buffer association

Currently only a single stream is used. This makes it easy to associate
each request with the appropriate frame buffer when it is created. In
turn, this makes reusing requests a bit simpler and a bit more efficient.

So do that: add buffers to requests when they are allocated in `allocBuffers()`.
This commit is contained in:
Barnabás Pőcze 2025-08-07 15:22:42 +02:00
parent 29b0c87d71
commit 475665d615

View file

@ -257,13 +257,6 @@ int spa_libcamera_buffer_recycle(struct impl *impl, struct port *port, uint32_t
return -EINVAL; return -EINVAL;
} }
Request *request = impl->requestPool[buffer_id].get(); Request *request = impl->requestPool[buffer_id].get();
Stream *stream = port->streamConfig.stream();
FrameBuffer *buffer = impl->allocator->buffers(stream)[buffer_id].get();
if ((res = request->addBuffer(stream, buffer)) < 0) {
spa_log_warn(impl->log, "can't add buffer %u for request: %s",
buffer_id, spa_strerror(res));
return -ENOMEM;
}
if (!impl->active) { if (!impl->active) {
impl->pendingRequests.push_back(request); impl->pendingRequests.push_back(request);
return 0; return 0;
@ -325,6 +318,11 @@ int allocBuffers(struct impl *impl, struct port *port, unsigned int count)
res = -ENOMEM; res = -ENOMEM;
goto err; goto err;
} }
res = request->addBuffer(stream, bufs[i].get());
if (res < 0)
goto err;
impl->requestPool.push_back(std::move(request)); impl->requestPool.push_back(std::move(request));
} }
@ -1252,7 +1250,7 @@ void impl::requestComplete(libcamera::Request *request)
if ((request->status() == Request::RequestCancelled)) { if ((request->status() == Request::RequestCancelled)) {
spa_log_debug(impl->log, "Request was cancelled"); spa_log_debug(impl->log, "Request was cancelled");
request->reuse(); request->reuse(libcamera::Request::ReuseFlag::ReuseBuffers);
SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUTSTANDING); SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUTSTANDING);
spa_libcamera_buffer_recycle(impl, port, b->id); spa_libcamera_buffer_recycle(impl, port, b->id);
return; return;
@ -1299,7 +1297,7 @@ void impl::requestComplete(libcamera::Request *request)
b->h->pts = fmd.timestamp; b->h->pts = fmd.timestamp;
b->h->dts_offset = 0; b->h->dts_offset = 0;
} }
request->reuse(); request->reuse(libcamera::Request::ReuseFlag::ReuseBuffers);
spa_ringbuffer_get_write_index(&port->ring, &index); spa_ringbuffer_get_write_index(&port->ring, &index);
port->ring_ids[index & MASK_BUFFERS] = buffer_id; port->ring_ids[index & MASK_BUFFERS] = buffer_id;
@ -1384,7 +1382,7 @@ int spa_libcamera_stream_off(struct impl *impl)
if (!impl->active) { if (!impl->active) {
for (std::unique_ptr<Request> &req : impl->requestPool) for (std::unique_ptr<Request> &req : impl->requestPool)
req->reuse(); req->reuse(libcamera::Request::ReuseFlag::ReuseBuffers);
return 0; return 0;
} }