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,
|
||||
EventLoop *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;
|
||||
|
||||
queueCount_ = 0;
|
||||
captureCount_ = 0;
|
||||
captureLimit_ = options[OptCapture].toInteger();
|
||||
|
||||
|
@ -128,7 +129,7 @@ int Capture::capture(FrameBufferAllocator *allocator)
|
|||
}
|
||||
|
||||
for (std::unique_ptr<Request> &request : requests_) {
|
||||
ret = camera_->queueRequest(request.get());
|
||||
ret = queueRequest(request.get());
|
||||
if (ret < 0) {
|
||||
std::cerr << "Can't queue request" << std::endl;
|
||||
camera_->stop();
|
||||
|
@ -152,6 +153,16 @@ int Capture::capture(FrameBufferAllocator *allocator)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int Capture::queueRequest(Request *request)
|
||||
{
|
||||
if (captureLimit_ && queueCount_ >= captureLimit_)
|
||||
return 0;
|
||||
|
||||
queueCount_++;
|
||||
|
||||
return camera_->queueRequest(request);
|
||||
}
|
||||
|
||||
void Capture::requestComplete(Request *request)
|
||||
{
|
||||
if (request->status() == Request::RequestCancelled)
|
||||
|
@ -213,5 +224,5 @@ void Capture::processRequest(Request *request)
|
|||
}
|
||||
|
||||
request->reuse(Request::ReuseBuffers);
|
||||
camera_->queueRequest(request);
|
||||
queueRequest(request);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue