cam: Add optional argument to --capture to specify how many frames to capture
Extend the '--capture' option with and optional numerical argument to be able to specify how many frames to capture before exiting. If the optional argument is not provided the old behavior of running until the user interrupts with a SIGINT is retained. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
ed73469335
commit
30e0ea843e
3 changed files with 21 additions and 4 deletions
|
@ -18,7 +18,8 @@ using namespace libcamera;
|
|||
|
||||
Capture::Capture(std::shared_ptr<Camera> camera, CameraConfiguration *config,
|
||||
EventLoop *loop)
|
||||
: camera_(camera), config_(config), writer_(nullptr), loop_(loop)
|
||||
: camera_(camera), config_(config), writer_(nullptr), loop_(loop),
|
||||
captureCount_(0), captureLimit_(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -26,6 +27,9 @@ int Capture::run(const OptionsParser::Options &options)
|
|||
{
|
||||
int ret;
|
||||
|
||||
captureCount_ = 0;
|
||||
captureLimit_ = options[OptCapture].toInteger();
|
||||
|
||||
if (!camera_) {
|
||||
std::cout << "Can't capture without a camera" << std::endl;
|
||||
return -ENODEV;
|
||||
|
@ -132,7 +136,11 @@ int Capture::capture(FrameBufferAllocator *allocator)
|
|||
}
|
||||
}
|
||||
|
||||
std::cout << "Capture until user interrupts by SIGINT" << std::endl;
|
||||
if (captureLimit_)
|
||||
std::cout << "Capture " << captureLimit_ << " frames" << std::endl;
|
||||
else
|
||||
std::cout << "Capture until user interrupts by SIGINT" << std::endl;
|
||||
|
||||
ret = loop_->exec();
|
||||
if (ret)
|
||||
std::cout << "Failed to run capture loop" << std::endl;
|
||||
|
@ -184,6 +192,12 @@ void Capture::requestComplete(Request *request)
|
|||
|
||||
std::cout << info.str() << std::endl;
|
||||
|
||||
captureCount_++;
|
||||
if (captureLimit_ && captureCount_ >= captureLimit_) {
|
||||
loop_->exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new request and populate it with one buffer for each
|
||||
* stream.
|
||||
|
|
|
@ -41,6 +41,8 @@ private:
|
|||
std::chrono::steady_clock::time_point last_;
|
||||
|
||||
EventLoop *loop_;
|
||||
unsigned int captureCount_;
|
||||
unsigned int captureLimit_;
|
||||
};
|
||||
|
||||
#endif /* __CAM_CAPTURE_H__ */
|
||||
|
|
|
@ -167,8 +167,9 @@ int CamApp::parseOptions(int argc, char *argv[])
|
|||
parser.addOption(OptCamera, OptionString,
|
||||
"Specify which camera to operate on, by name or by index", "camera",
|
||||
ArgumentRequired, "camera");
|
||||
parser.addOption(OptCapture, OptionNone,
|
||||
"Capture until interrupted by user", "capture");
|
||||
parser.addOption(OptCapture, OptionInteger,
|
||||
"Capture until interrupted by user or until <count> frames captured",
|
||||
"capture", ArgumentOptional, "count");
|
||||
parser.addOption(OptFile, OptionString,
|
||||
"Write captured frames to disk\n"
|
||||
"The first '#' character in the file name is expanded to the stream name and frame sequence number.\n"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue