mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-25 17:45:06 +03:00
cam: Only queue the exact number of requests asked for
The cam option --capture=N is suppose to only capture N requests. But if the processing done for each request is large (such as writing it to a slow disk) the current implementation could queue more than N requests before the exit condition is detected and capturing stopped. Solve this by only queueing N requests while still waiting for N requests to complete before exiting. 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:
parent
5b60b689c1
commit
a3c75bba84
2 changed files with 16 additions and 3 deletions
|
@ -18,7 +18,7 @@ using namespace libcamera;
|
||||||
Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config,
|
Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config,
|
||||||
EventLoop *loop)
|
EventLoop *loop)
|
||||||
: camera_(camera), config_(config), writer_(nullptr), last_(0), loop_(loop),
|
: camera_(camera), config_(config), writer_(nullptr), last_(0), loop_(loop),
|
||||||
captureCount_(0), captureLimit_(0)
|
queueCount_(0), captureCount_(0), captureLimit_(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ int Capture::run(const OptionsParser::Options &options)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
queueCount_ = 0;
|
||||||
captureCount_ = 0;
|
captureCount_ = 0;
|
||||||
captureLimit_ = options[OptCapture].toInteger();
|
captureLimit_ = options[OptCapture].toInteger();
|
||||||
|
|
||||||
|
@ -128,7 +129,7 @@ int Capture::capture(FrameBufferAllocator *allocator)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::unique_ptr<Request> &request : requests_) {
|
for (std::unique_ptr<Request> &request : requests_) {
|
||||||
ret = camera_->queueRequest(request.get());
|
ret = queueRequest(request.get());
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
std::cerr << "Can't queue request" << std::endl;
|
std::cerr << "Can't queue request" << std::endl;
|
||||||
camera_->stop();
|
camera_->stop();
|
||||||
|
@ -152,6 +153,16 @@ int Capture::capture(FrameBufferAllocator *allocator)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Capture::queueRequest(Request *request)
|
||||||
|
{
|
||||||
|
if (captureLimit_ && queueCount_ >= captureLimit_)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
queueCount_++;
|
||||||
|
|
||||||
|
return camera_->queueRequest(request);
|
||||||
|
}
|
||||||
|
|
||||||
void Capture::requestComplete(Request *request)
|
void Capture::requestComplete(Request *request)
|
||||||
{
|
{
|
||||||
if (request->status() == Request::RequestCancelled)
|
if (request->status() == Request::RequestCancelled)
|
||||||
|
@ -213,5 +224,5 @@ void Capture::processRequest(Request *request)
|
||||||
}
|
}
|
||||||
|
|
||||||
request->reuse(Request::ReuseBuffers);
|
request->reuse(Request::ReuseBuffers);
|
||||||
camera_->queueRequest(request);
|
queueRequest(request);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ public:
|
||||||
private:
|
private:
|
||||||
int capture(libcamera::FrameBufferAllocator *allocator);
|
int capture(libcamera::FrameBufferAllocator *allocator);
|
||||||
|
|
||||||
|
int queueRequest(libcamera::Request *request);
|
||||||
void requestComplete(libcamera::Request *request);
|
void requestComplete(libcamera::Request *request);
|
||||||
void processRequest(libcamera::Request *request);
|
void processRequest(libcamera::Request *request);
|
||||||
|
|
||||||
|
@ -43,6 +44,7 @@ private:
|
||||||
uint64_t last_;
|
uint64_t last_;
|
||||||
|
|
||||||
EventLoop *loop_;
|
EventLoop *loop_;
|
||||||
|
unsigned int queueCount_;
|
||||||
unsigned int captureCount_;
|
unsigned int captureCount_;
|
||||||
unsigned int captureLimit_;
|
unsigned int captureLimit_;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue