01590c3f78
The qcam application installs a custom event dispatcher based on the Qt event loop. As the camera manager now creates an internal thread, it doesn't use that event dispatcher of the application thread at all. Furthermore, the custom event dispatcher is buggy, as it doesn't dispatch messages posted to the main thread's event loop. This isn't an issue as no messages are posted there in the first place, but would cause incorrect behaviour if we were to use that feature (for instance to deliver signals from the camera manager thread to the application thread). Fixing the event dispatcher requires a change in the libcamera public API, as there's currently no way to dispatch messages using the public API (Thread::dispatchMessages() is not exposed). This isn't worth it at the moment, so just remove the custom event dispatcher. If qcam later needs the libcamera request and buffer completion signals to be delivered in the application thread, it will need to handle that internally, using Qt's cross-thread signal delivery. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
83 lines
1.8 KiB
C++
83 lines
1.8 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* main.cpp - cam - The libcamera swiss army knife
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <signal.h>
|
|
#include <string.h>
|
|
|
|
#include <QApplication>
|
|
|
|
#include <libcamera/camera_manager.h>
|
|
|
|
#include "main_window.h"
|
|
#include "../cam/options.h"
|
|
|
|
void signalHandler(int signal)
|
|
{
|
|
std::cout << "Exiting" << std::endl;
|
|
qApp->quit();
|
|
}
|
|
|
|
OptionsParser::Options parseOptions(int argc, char *argv[])
|
|
{
|
|
KeyValueParser sizeParser;
|
|
sizeParser.addOption("width", OptionInteger, "Width in pixels",
|
|
ArgumentRequired);
|
|
sizeParser.addOption("height", OptionInteger, "Height in pixels",
|
|
ArgumentRequired);
|
|
|
|
OptionsParser parser;
|
|
parser.addOption(OptCamera, OptionString,
|
|
"Specify which camera to operate on", "camera",
|
|
ArgumentRequired, "camera");
|
|
parser.addOption(OptHelp, OptionNone, "Display this help message",
|
|
"help");
|
|
parser.addOption(OptSize, &sizeParser, "Set the stream size",
|
|
"size", true);
|
|
|
|
OptionsParser::Options options = parser.parse(argc, argv);
|
|
if (options.isSet(OptHelp))
|
|
parser.usage();
|
|
|
|
return options;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
QApplication app(argc, argv);
|
|
int ret;
|
|
|
|
OptionsParser::Options options = parseOptions(argc, argv);
|
|
if (!options.valid())
|
|
return EXIT_FAILURE;
|
|
if (options.isSet(OptHelp))
|
|
return 0;
|
|
|
|
struct sigaction sa = {};
|
|
sa.sa_handler = &signalHandler;
|
|
sigaction(SIGINT, &sa, nullptr);
|
|
|
|
CameraManager *cm = new CameraManager();
|
|
|
|
ret = cm->start();
|
|
if (ret) {
|
|
std::cout << "Failed to start camera manager: "
|
|
<< strerror(-ret) << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
MainWindow *mainWindow = new MainWindow(cm, options);
|
|
mainWindow->show();
|
|
ret = app.exec();
|
|
delete mainWindow;
|
|
|
|
cm->stop();
|
|
delete cm;
|
|
|
|
return ret;
|
|
}
|