summaryrefslogtreecommitdiff
path: root/src/qcam/main.cpp
blob: f60d3cef0ecba8c78be2431d178d655a75454f79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * main.cpp - cam - The libcamera swiss army knife
 */

#include <signal.h>
#include <string.h>

#include <QApplication>
#include <QtDebug>

#include <libcamera/camera_manager.h>

#include "../cam/options.h"
#include "../cam/stream_options.h"
#include "main_window.h"

void signalHandler([[maybe_unused]] int signal)
{
	qInfo() << "Exiting";
	qApp->quit();
}

OptionsParser::Options parseOptions(int argc, char *argv[])
{
	StreamKeyValueParser streamKeyValue;

	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(OptRenderer, OptionString,
			 "Choose the renderer type {qt,gles} (default: qt)",
			 "renderer", ArgumentRequired, "renderer");
	parser.addOption(OptStream, &streamKeyValue,
			 "Set configuration of a camera stream", "stream", 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) {
		qInfo() << "Failed to start camera manager:"
			<< strerror(-ret);
		return EXIT_FAILURE;
	}

	MainWindow *mainWindow = new MainWindow(cm, options);
	mainWindow->show();
	ret = app.exec();
	delete mainWindow;

	cm->stop();
	delete cm;

	return ret;
}
ic accessor for the custom message type. * * \code{.cpp} * class MyCustomMessage : public Message * { * public: * MyCustomMessage() : Message(type()) {} * * static Message::Type type() * { * static MessageType type = registerMessageType(); * return type; * } * }; * \endcode * * \return A new unique message type */ Message::Type Message::registerMessageType() { return static_cast<Message::Type>(nextUserType_++); } /** * \class InvokeMessage * \brief A message carrying a method invocation across threads */ /** * \brief Construct an InvokeMessage for method invocation on an Object * \param[in] method The bound method * \param[in] pack The packed method arguments * \param[in] semaphore The semaphore used to signal message delivery * \param[in] deleteMethod True to delete the \a method when the message is * destroyed */ InvokeMessage::InvokeMessage(BoundMethodBase *method, std::shared_ptr<BoundMethodPackBase> pack, Semaphore *semaphore, bool deleteMethod) : Message(Message::InvokeMessage), method_(method), pack_(pack), semaphore_(semaphore), deleteMethod_(deleteMethod) { } InvokeMessage::~InvokeMessage() { if (deleteMethod_) delete method_; } /** * \fn InvokeMessage::semaphore() * \brief Retrieve the message semaphore passed to the constructor * \return The message semaphore */ /** * \brief Invoke the method bound to InvokeMessage::method_ with arguments * InvokeMessage::pack_ */ void InvokeMessage::invoke() { method_->invokePack(pack_.get()); } /** * \var InvokeMessage::method_ * \brief The method to be invoked */ /** * \var InvokeMessage::pack_ * \brief The packed method invocation arguments */ } /* namespace libcamera */