mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-19 02:15:05 +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)
|
||||
: camera_(camera), config_(config), writer_(nullptr), last_(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;
|
||||
|
||||
|
@ -61,36 +61,39 @@ int CameraSession::run(const OptionsParser::Options &options)
|
|||
writer_ = new BufferWriter();
|
||||
}
|
||||
|
||||
FrameBufferAllocator *allocator = new FrameBufferAllocator(camera_);
|
||||
allocator_ = new FrameBufferAllocator(camera_);
|
||||
|
||||
ret = capture(allocator);
|
||||
return startCapture();
|
||||
}
|
||||
|
||||
void CameraSession::stop()
|
||||
{
|
||||
int ret = camera_->stop();
|
||||
if (ret)
|
||||
std::cout << "Failed to stop capture" << std::endl;
|
||||
|
||||
if (options.isSet(OptFile)) {
|
||||
delete writer_;
|
||||
writer_ = nullptr;
|
||||
}
|
||||
|
||||
requests_.clear();
|
||||
|
||||
delete allocator;
|
||||
|
||||
return ret;
|
||||
delete allocator_;
|
||||
}
|
||||
|
||||
int CameraSession::capture(FrameBufferAllocator *allocator)
|
||||
int CameraSession::startCapture()
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Identify the stream with the least number of buffers. */
|
||||
unsigned int nbuffers = UINT_MAX;
|
||||
for (StreamConfiguration &cfg : *config_) {
|
||||
ret = allocator->allocate(cfg.stream());
|
||||
ret = allocator_->allocate(cfg.stream());
|
||||
if (ret < 0) {
|
||||
std::cerr << "Can't allocate buffers" << std::endl;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
unsigned int allocated = allocator->buffers(cfg.stream()).size();
|
||||
unsigned int allocated = allocator_->buffers(cfg.stream()).size();
|
||||
nbuffers = std::min(nbuffers, allocated);
|
||||
}
|
||||
|
||||
|
@ -109,7 +112,7 @@ int CameraSession::capture(FrameBufferAllocator *allocator)
|
|||
for (StreamConfiguration &cfg : *config_) {
|
||||
Stream *stream = cfg.stream();
|
||||
const std::vector<std::unique_ptr<FrameBuffer>> &buffers =
|
||||
allocator->buffers(stream);
|
||||
allocator_->buffers(stream);
|
||||
const std::unique_ptr<FrameBuffer> &buffer = buffers[i];
|
||||
|
||||
ret = request->addBuffer(stream, buffer.get());
|
||||
|
@ -146,15 +149,7 @@ int CameraSession::capture(FrameBufferAllocator *allocator)
|
|||
else
|
||||
std::cout << "Capture until user interrupts by SIGINT" << std::endl;
|
||||
|
||||
ret = EventLoop::instance()->exec();
|
||||
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;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CameraSession::queueRequest(Request *request)
|
||||
|
|
|
@ -28,12 +28,13 @@ public:
|
|||
CameraSession(std::shared_ptr<libcamera::Camera> camera,
|
||||
libcamera::CameraConfiguration *config);
|
||||
|
||||
int run(const OptionsParser::Options &options);
|
||||
int start(const OptionsParser::Options &options);
|
||||
void stop();
|
||||
|
||||
libcamera::Signal<> captureDone;
|
||||
|
||||
private:
|
||||
int capture(libcamera::FrameBufferAllocator *allocator);
|
||||
int startCapture();
|
||||
|
||||
int queueRequest(libcamera::Request *request);
|
||||
void requestComplete(libcamera::Request *request);
|
||||
|
@ -51,6 +52,7 @@ private:
|
|||
unsigned int captureLimit_;
|
||||
bool printMetadata_;
|
||||
|
||||
libcamera::FrameBufferAllocator *allocator_;
|
||||
std::vector<std::unique_ptr<libcamera::Request>> requests_;
|
||||
};
|
||||
|
||||
|
|
|
@ -371,7 +371,17 @@ int CamApp::run()
|
|||
if (options_.isSet(OptCapture)) {
|
||||
CameraSession session(camera_, config_.get());
|
||||
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)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue