mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-19 18:35:07 +03:00
cam: Move event loop execution from CameraSession to CamApp
To prepare for multiple concurrent camera sessions, move the event loop exec() call from the CameraSession class to the CamApp class. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
011b3ff288
commit
4cd0f586fb
3 changed files with 34 additions and 27 deletions
|
@ -22,11 +22,11 @@ CameraSession::CameraSession(std::shared_ptr<Camera> camera,
|
||||||
CameraConfiguration *config)
|
CameraConfiguration *config)
|
||||||
: camera_(camera), config_(config), writer_(nullptr), last_(0),
|
: camera_(camera), config_(config), writer_(nullptr), last_(0),
|
||||||
queueCount_(0), captureCount_(0), captureLimit_(0),
|
queueCount_(0), captureCount_(0), captureLimit_(0),
|
||||||
printMetadata_(false)
|
printMetadata_(false), allocator_(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int CameraSession::run(const OptionsParser::Options &options)
|
int CameraSession::start(const OptionsParser::Options &options)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -61,36 +61,39 @@ int CameraSession::run(const OptionsParser::Options &options)
|
||||||
writer_ = new BufferWriter();
|
writer_ = new BufferWriter();
|
||||||
}
|
}
|
||||||
|
|
||||||
FrameBufferAllocator *allocator = new FrameBufferAllocator(camera_);
|
allocator_ = new FrameBufferAllocator(camera_);
|
||||||
|
|
||||||
ret = capture(allocator);
|
return startCapture();
|
||||||
|
}
|
||||||
|
|
||||||
if (options.isSet(OptFile)) {
|
void CameraSession::stop()
|
||||||
delete writer_;
|
{
|
||||||
writer_ = nullptr;
|
int ret = camera_->stop();
|
||||||
}
|
if (ret)
|
||||||
|
std::cout << "Failed to stop capture" << std::endl;
|
||||||
|
|
||||||
|
delete writer_;
|
||||||
|
writer_ = nullptr;
|
||||||
|
|
||||||
requests_.clear();
|
requests_.clear();
|
||||||
|
|
||||||
delete allocator;
|
delete allocator_;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CameraSession::capture(FrameBufferAllocator *allocator)
|
int CameraSession::startCapture()
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Identify the stream with the least number of buffers. */
|
/* Identify the stream with the least number of buffers. */
|
||||||
unsigned int nbuffers = UINT_MAX;
|
unsigned int nbuffers = UINT_MAX;
|
||||||
for (StreamConfiguration &cfg : *config_) {
|
for (StreamConfiguration &cfg : *config_) {
|
||||||
ret = allocator->allocate(cfg.stream());
|
ret = allocator_->allocate(cfg.stream());
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
std::cerr << "Can't allocate buffers" << std::endl;
|
std::cerr << "Can't allocate buffers" << std::endl;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int allocated = allocator->buffers(cfg.stream()).size();
|
unsigned int allocated = allocator_->buffers(cfg.stream()).size();
|
||||||
nbuffers = std::min(nbuffers, allocated);
|
nbuffers = std::min(nbuffers, allocated);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +112,7 @@ int CameraSession::capture(FrameBufferAllocator *allocator)
|
||||||
for (StreamConfiguration &cfg : *config_) {
|
for (StreamConfiguration &cfg : *config_) {
|
||||||
Stream *stream = cfg.stream();
|
Stream *stream = cfg.stream();
|
||||||
const std::vector<std::unique_ptr<FrameBuffer>> &buffers =
|
const std::vector<std::unique_ptr<FrameBuffer>> &buffers =
|
||||||
allocator->buffers(stream);
|
allocator_->buffers(stream);
|
||||||
const std::unique_ptr<FrameBuffer> &buffer = buffers[i];
|
const std::unique_ptr<FrameBuffer> &buffer = buffers[i];
|
||||||
|
|
||||||
ret = request->addBuffer(stream, buffer.get());
|
ret = request->addBuffer(stream, buffer.get());
|
||||||
|
@ -146,15 +149,7 @@ int CameraSession::capture(FrameBufferAllocator *allocator)
|
||||||
else
|
else
|
||||||
std::cout << "Capture until user interrupts by SIGINT" << std::endl;
|
std::cout << "Capture until user interrupts by SIGINT" << std::endl;
|
||||||
|
|
||||||
ret = EventLoop::instance()->exec();
|
return 0;
|
||||||
if (ret)
|
|
||||||
std::cout << "Failed to run capture loop" << std::endl;
|
|
||||||
|
|
||||||
ret = camera_->stop();
|
|
||||||
if (ret)
|
|
||||||
std::cout << "Failed to stop capture" << std::endl;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CameraSession::queueRequest(Request *request)
|
int CameraSession::queueRequest(Request *request)
|
||||||
|
|
|
@ -28,12 +28,13 @@ public:
|
||||||
CameraSession(std::shared_ptr<libcamera::Camera> camera,
|
CameraSession(std::shared_ptr<libcamera::Camera> camera,
|
||||||
libcamera::CameraConfiguration *config);
|
libcamera::CameraConfiguration *config);
|
||||||
|
|
||||||
int run(const OptionsParser::Options &options);
|
int start(const OptionsParser::Options &options);
|
||||||
|
void stop();
|
||||||
|
|
||||||
libcamera::Signal<> captureDone;
|
libcamera::Signal<> captureDone;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int capture(libcamera::FrameBufferAllocator *allocator);
|
int startCapture();
|
||||||
|
|
||||||
int queueRequest(libcamera::Request *request);
|
int queueRequest(libcamera::Request *request);
|
||||||
void requestComplete(libcamera::Request *request);
|
void requestComplete(libcamera::Request *request);
|
||||||
|
@ -51,6 +52,7 @@ private:
|
||||||
unsigned int captureLimit_;
|
unsigned int captureLimit_;
|
||||||
bool printMetadata_;
|
bool printMetadata_;
|
||||||
|
|
||||||
|
libcamera::FrameBufferAllocator *allocator_;
|
||||||
std::vector<std::unique_ptr<libcamera::Request>> requests_;
|
std::vector<std::unique_ptr<libcamera::Request>> requests_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -371,7 +371,17 @@ int CamApp::run()
|
||||||
if (options_.isSet(OptCapture)) {
|
if (options_.isSet(OptCapture)) {
|
||||||
CameraSession session(camera_, config_.get());
|
CameraSession session(camera_, config_.get());
|
||||||
session.captureDone.connect(this, &CamApp::captureDone);
|
session.captureDone.connect(this, &CamApp::captureDone);
|
||||||
return session.run(options_);
|
|
||||||
|
ret = session.start(options_);
|
||||||
|
if (ret) {
|
||||||
|
std::cout << "Failed to start camera session" << std::endl;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
loop_.exec();
|
||||||
|
|
||||||
|
session.stop();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options_.isSet(OptMonitor)) {
|
if (options_.isSet(OptMonitor)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue